ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggMzBlZTdjNC4uN2VmYzZkNyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTkxLDE2ICs5MSwzNSBAQAogCiBDYW1lcmE6On5DYW1lcmEoKQogewotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhbGwgZGlzY29ubmVjdCgpIGhlcmUgYmVjYXVzZSBpZiB0aGUgQ2FtZXJhU2VydmljZQorICAgIC8vIHRoaW5rcyB3ZSBhcmUgdGhlIG93bmVyIG9mIHRoZSBoYXJkd2FyZSwgaXQgd2lsbCBob2xkIGEgKHN0cm9uZykKKyAgICAvLyByZWZlcmVuY2UgdG8gdXMsIGFuZCB3ZSBjYW4ndCBwb3NzaWJseSBiZSBoZXJlLiBXZSBhbHNvIGRvbid0IHdhbnQgdG8KKyAgICAvLyBjYWxsIGRpc2Nvbm5lY3QoKSBoZXJlIGlmIHdlIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIG1lZGlhc2VydmVyLAorICAgIC8vIGJlY2F1c2Ugd2UgbWF5IGJlIGludm9rZWQgYnkgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpjb25uZWN0KCkgYW5kIHdpbGwKKyAgICAvLyBkZWFkbG9jayBpZiB3ZSBjYWxsIGFueSBtZXRob2Qgb2YgSUNhbWVyYSBoZXJlLgogfQogCi1zcDxDYW1lcmE+IENhbWVyYTo6Y29ubmVjdCgpCitpbnQzMl90IENhbWVyYTo6Z2V0TnVtYmVyT2ZDYW1lcmFzKCkKK3sKKyAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZT4mIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gY3MtPmdldE51bWJlck9mQ2FtZXJhcygpOworfQorCitzdGF0dXNfdCBDYW1lcmE6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSB7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIGNzLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCBjYW1lcmFJbmZvKTsKK30KKworc3A8Q2FtZXJhPiBDYW1lcmE6OmNvbm5lY3QoaW50IGNhbWVyYUlkKQogewogICAgIExPR1YoImNvbm5lY3QiKTsKICAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKCk7CiAgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICBpZiAoY3MgIT0gMCkgewotICAgICAgICBjLT5tQ2FtZXJhID0gY3MtPmNvbm5lY3QoYyk7CisgICAgICAgIGMtPm1DYW1lcmEgPSBjcy0+Y29ubmVjdChjLCBjYW1lcmFJZCk7CiAgICAgfQogICAgIGlmIChjLT5tQ2FtZXJhICE9IDApIHsKICAgICAgICAgYy0+bUNhbWVyYS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoYyk7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggNjVmZDdhYy4uODNlNWU1NyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtMzAsNiArMzAsOCBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRk9STUFUU1tdID0gInByZXZpZXctZm9ybWF0LXZhbHVlcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZSQU1FX1JBVEVbXSA9ICJwcmV2aWV3LWZyYW1lLXJhdGUiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlJBTUVfUkFURVNbXSA9ICJwcmV2aWV3LWZyYW1lLXJhdGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFW10gPSAicHJldmlldy1mcHMtcmFuZ2UiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlBTX1JBTkdFW10gPSAicHJldmlldy1mcHMtcmFuZ2UtdmFsdWVzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BJQ1RVUkVfU0laRVtdID0gInBpY3R1cmUtc2l6ZSI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFU1tdID0gInBpY3R1cmUtc2l6ZS12YWx1ZXMiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUElDVFVSRV9GT1JNQVRbXSA9ICJwaWN0dXJlLWZvcm1hdCI7CkBAIC02OSw4ICs3MSwxMSBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9SQVRJT1NbXSA9ICJ6b29tLXJhdGlvcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRFtdID0gInpvb20tc3VwcG9ydGVkIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NNT09USF9aT09NX1NVUFBPUlRFRFtdID0gInNtb290aC16b29tLXN1cHBvcnRlZCI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19ESVNUQU5DRVNbXSA9ICJmb2N1cy1kaXN0YW5jZXMiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fRlJBTUVfRk9STUFUW10gPSAidmlkZW8tZnJhbWUtZm9ybWF0IjsKIAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFW10gPSAidHJ1ZSI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX0RJU1RBTkNFX0lORklOSVRZW10gPSAiSW5maW5pdHkiOwogCiAvLyBWYWx1ZXMgZm9yIHdoaXRlIGJhbGFuY2Ugc2V0dGluZ3MuCiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OldISVRFX0JBTEFOQ0VfQVVUT1tdID0gImF1dG8iOwpAQCAtMTM3LDYgKzE0Miw3IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfTUFDUk9bXSA9ICJtYWNybyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfRklYRURbXSA9ICJmaXhlZCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfRURPRltdID0gImVkb2YiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU9bXSA9ICJjb250aW51b3VzLXZpZGVvIjsKIAogQ2FtZXJhUGFyYW1ldGVyczo6Q2FtZXJhUGFyYW1ldGVycygpCiAgICAgICAgICAgICAgICAgOiBtTWFwKCkKQEAgLTI1OCwyNCArMjY0LDU3IEBACiAgICAgbU1hcC5yZW1vdmVJdGVtKFN0cmluZzgoa2V5KSk7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2Vfc2l6ZShjb25zdCBjaGFyICpzdHIsIGludCAmd2lkdGgsIGludCAmaGVpZ2h0KQorLy8gUGFyc2Ugc3RyaW5nIGxpa2UgIjY0MHg0ODAiIG9yICIxMDAwMCwyMDAwMCIKK3N0YXRpYyBpbnQgcGFyc2VfcGFpcihjb25zdCBjaGFyICpzdHIsIGludCAqZmlyc3QsIGludCAqc2Vjb25kLCBjaGFyIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIgPSBOVUxMKQogewotICAgIC8vIEZpbmQgdGhlIHdpZHRoLgorICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludGVnZXIuCiAgICAgY2hhciAqZW5kOwogICAgIGludCB3ID0gKGludClzdHJ0b2woc3RyLCAmZW5kLCAxMCk7Ci0gICAgLy8gSWYgYW4gJ3gnIGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdywgZ2l2ZSB1cC4KLSAgICBpZiAoKmVuZCAhPSAneCcpCisgICAgLy8gSWYgYSBkZWxpbWV0ZXIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93LCBnaXZlIHVwLgorICAgIGlmICgqZW5kICE9IGRlbGltKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIGRlbGltZXRlciAoJWMpIGluIHN0cj0lcyIsIGRlbGltLCBzdHIpOwogICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gICAgLy8gRmluZCB0aGUgaGVpZ2h0LCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJ3gnLgotICAgIGludCBoID0gKGludClzdHJ0b2woZW5kKzEsIDAsIDEwKTsKKyAgICAvLyBGaW5kIHRoZSBzZWNvbmQgaW50ZWdlciwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRlbGltZXRlci4KKyAgICBpbnQgaCA9IChpbnQpc3RydG9sKGVuZCsxLCAmZW5kLCAxMCk7CiAKLSAgICB3aWR0aCA9IHc7Ci0gICAgaGVpZ2h0ID0gaDsKKyAgICAqZmlyc3QgPSB3OworICAgICpzZWNvbmQgPSBoOworCisgICAgaWYgKGVuZHB0cikgeworICAgICAgICAqZW5kcHRyID0gZW5kOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBwYXJzZVNpemVzTGlzdChjb25zdCBjaGFyICpzaXplc1N0ciwgVmVjdG9yPFNpemU+ICZzaXplcykKK3sKKyAgICBpZiAoc2l6ZXNTdHIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhciAqc2l6ZVN0YXJ0UHRyID0gKGNoYXIgKilzaXplc1N0cjsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpbnQgc3VjY2VzcyA9IHBhcnNlX3BhaXIoc2l6ZVN0YXJ0UHRyLCAmd2lkdGgsICZoZWlnaHQsICd4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplU3RhcnRQdHIpOworICAgICAgICBpZiAoc3VjY2VzcyA9PSAtMSB8fCAoKnNpemVTdGFydFB0ciAhPSAnLCcgJiYgKnNpemVTdGFydFB0ciAhPSAnXDAnKSkgeworICAgICAgICAgICAgTE9HRSgiUGljdHVyZSBzaXplcyBzdHJpbmcgXCIlc1wiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLiIsIHNpemVzU3RyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplcy5wdXNoKFNpemUod2lkdGgsIGhlaWdodCkpOworCisgICAgICAgIGlmICgqc2l6ZVN0YXJ0UHRyID09ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplU3RhcnRQdHIrKzsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIGNoYXIgc3RyWzMyXTsKQEAgLTI4NSwxOSArMzI0LDE3IEBACiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UHJldmlld1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0CiB7Ci0gICAgKndpZHRoID0gLTE7Ci0gICAgKmhlaWdodCA9IC0xOwotCisgICAgKndpZHRoID0gKmhlaWdodCA9IC0xOwogICAgIC8vIEdldCB0aGUgY3VycmVudCBzdHJpbmcsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGxlYXZlIHRoZSAtMXgtMQogICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoS0VZX1BSRVZJRVdfU0laRSk7Ci0gICAgaWYgKHAgPT0gMCkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChwID09IDApICByZXR1cm47CisgICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOworfQogCi0gICAgaW50IHcsIGg7Ci0gICAgaWYgKHBhcnNlX3NpemUocCwgdywgaCkgPT0gMCkgewotICAgICAgICAqd2lkdGggPSB3OwotICAgICAgICAqaGVpZ2h0ID0gaDsKLSAgICB9Cit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFN1cHBvcnRlZFByZXZpZXdTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdAoreworICAgIGNvbnN0IGNoYXIgKnByZXZpZXdTaXplc1N0ciA9IGdldChLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMpOworICAgIHBhcnNlU2l6ZXNMaXN0KHByZXZpZXdTaXplc1N0ciwgc2l6ZXMpOwogfQogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdGcmFtZVJhdGUoaW50IGZwcykKQEAgLTMxMCw2ICszNDcsMTQgQEAKICAgICByZXR1cm4gZ2V0SW50KEtFWV9QUkVWSUVXX0ZSQU1FX1JBVEUpOwogfQogCit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFByZXZpZXdGcHNSYW5nZShpbnQgKm1pbl9mcHMsIGludCAqbWF4X2ZwcykgY29uc3QKK3sKKyAgICAqbWluX2ZwcyA9ICptYXhfZnBzID0gLTE7CisgICAgY29uc3QgY2hhciAqcCA9IGdldChLRVlfUFJFVklFV19GUFNfUkFOR0UpOworICAgIGlmIChwID09IDApIHJldHVybjsKKyAgICBwYXJzZV9wYWlyKHAsIG1pbl9mcHMsIG1heF9mcHMsICcsJyk7Cit9CisKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld0Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCiB7CiAgICAgc2V0KEtFWV9QUkVWSUVXX0ZPUk1BVCwgZm9ybWF0KTsKQEAgLTMyOSwxOSArMzc0LDE3IEBACiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UGljdHVyZVNpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0CiB7Ci0gICAgKndpZHRoID0gLTE7Ci0gICAgKmhlaWdodCA9IC0xOwotCisgICAgKndpZHRoID0gKmhlaWdodCA9IC0xOwogICAgIC8vIEdldCB0aGUgY3VycmVudCBzdHJpbmcsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGxlYXZlIHRoZSAtMXgtMQogICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoS0VZX1BJQ1RVUkVfU0laRSk7Ci0gICAgaWYgKHAgPT0gMCkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChwID09IDApIHJldHVybjsKKyAgICBwYXJzZV9wYWlyKHAsIHdpZHRoLCBoZWlnaHQsICd4Jyk7Cit9CiAKLSAgICBpbnQgdywgaDsKLSAgICBpZiAocGFyc2Vfc2l6ZShwLCB3LCBoKSA9PSAwKSB7Ci0gICAgICAgICp3aWR0aCA9IHc7Ci0gICAgICAgICpoZWlnaHQgPSBoOwotICAgIH0KK3ZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0Cit7CisgICAgY29uc3QgY2hhciAqcGljdHVyZVNpemVzU3RyID0gZ2V0KEtFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFUyk7CisgICAgcGFyc2VTaXplc0xpc3QocGljdHVyZVNpemVzU3RyLCBzaXplcyk7CiB9CiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UGljdHVyZUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA0NmI1NDc4Li44NWYxYTI5IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTM0LDEyICszNCwzNCBAQAogICAgIHsKICAgICB9CiAKKyAgICAvLyBnZXQgbnVtYmVyIG9mIGNhbWVyYXMgYXZhaWxhYmxlCisgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQ2FtZXJhcygpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6R0VUX05VTUJFUl9PRl9DQU1FUkFTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgLy8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2FtZXJhCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfSU5GTywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNhbWVyYUluZm8tPm9yaWVudGF0aW9uID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzcDxJQ2FtZXJhPiBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQpCisgICAgdmlydHVhbCBzcDxJQ2FtZXJhPiBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KQEAgLTUzLDEwICs3NSwyNSBAQAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBHRVRfTlVNQkVSX09GX0NBTUVSQVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0TnVtYmVyT2ZDYW1lcmFzKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9DQU1FUkFfSU5GTzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBDYW1lcmFJbmZvIGNhbWVyYUluZm87CisgICAgICAgICAgICBtZW1zZXQoJmNhbWVyYUluZm8sIDAsIHNpemVvZihjYW1lcmFJbmZvKSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRDYW1lcmFJbmZvKGRhdGEucmVhZEludDMyKCksICZjYW1lcmFJbmZvKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNhbWVyYUluZm8uZmFjaW5nKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNhbWVyYUluZm8ub3JpZW50YXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYSA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50KTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYSA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmEtPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDM0NjQ4YjUuLjViNzQwMDcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEsNSArMSwzIEBACi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOSwxMiArNywxMyBAQAogCVNpbmVTb3VyY2UuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlcgorCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKQEAgLTM4LDcgKzM3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtNjIsNyArNjEsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC03MSw1ICs3MCwzIEBACiBMT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggODQ1Yzg1NC4uYjcxODI5OSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMzIsMjIgKzMyLDM0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCitzdGF0aWMgY29uc3QgaW50MzJfdCBrRnJhbWVyYXRlID0gMjQ7ICAvLyBmcHMKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtJRnJhbWVzSW50ZXJ2YWxTZWMgPSAxOworc3RhdGljIGNvbnN0IGludDMyX3Qga1ZpZGVvQml0UmF0ZSA9IDUxMiAqIDEwMjQ7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrQXVkaW9CaXRSYXRlID0gMTIyMDA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrRHVyYXRpb25VcyA9IDEwMDAwMDAwTEw7ICAvLyAxMCBzZWNvbmRzCisKICNpZiAxCiBjbGFzcyBEdW1teVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZyYW1lcmF0ZSA9IDI0OyAgLy8gZnBzCiAKIHB1YmxpYzoKLSAgICBEdW1teVNvdXJjZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgRHVtbXlTb3VyY2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY29sb3JGb3JtYXQpCiAgICAgICAgIDogbVdpZHRoKHdpZHRoKSwKICAgICAgICAgICBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKICAgICAgICAgICBtU2l6ZSgod2lkdGggKiBoZWlnaHQgKiAzKSAvIDIpIHsKICAgICAgICAgbUdyb3VwLmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1TaXplKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbG9yIGZvcm1hdCB0byBtYWtlIHN1cmUKKyAgICAgICAgLy8gdGhhdCB0aGUgYnVmZmVyIHNpemUgbVNpemUgaXQgc2V0IGNvcnJlY3RseSBhYm92ZS4KKyAgICAgICAgQ0hFQ0soY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwKKyAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CiAgICAgfQogCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwogICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBtQ29sb3JGb3JtYXQpOwogICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKIAogICAgICAgICByZXR1cm4gbWV0YTsKQEAgLTk0LDYgKzEwNiw3IEBACiBwcml2YXRlOgogICAgIE1lZGlhQnVmZmVyR3JvdXAgbUdyb3VwOwogICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50IG1Db2xvckZvcm1hdDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OzsKIApAQCAtMTMzLDIxICsxNDYsNDggQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitlbnVtIHsKKyAgICBrWVVWNDIwU1AgPSAwLAorICAgIGtZVVY0MjBQICA9IDEsCit9OworCisvLyByZXR1cm5zIC0xIGlmIG1hcHBpbmcgb2YgdGhlIGdpdmVuIGNvbG9yIGlzIHVuc3VjY2Vzc2Z1bAorLy8gcmV0dXJucyBhbiBvbXggY29sb3IgZW51bSB2YWx1ZSBvdGhlcndpc2UKK3N0YXRpYyBpbnQgdHJhbnNsYXRlQ29sb3JUb09teEVudW1WYWx1ZShpbnQgY29sb3IpIHsKKyAgICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgICAgIGNhc2Uga1lVVjQyMFNQOgorICAgICAgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICBjYXNlIGtZVVY0MjBQOgorICAgICAgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuc3VwcG9ydGVkIGNvbG9yOiAlZFxuIiwgY29sb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKIAogI2lmIDEKLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIGZpbGVuYW1lXG4iLCBhcmd2WzBdKTsKKyAgICBpZiAoYXJnYyAhPSAzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIDxmaWxlbmFtZT4gPGlucHV0X2NvbG9yX2Zvcm1hdD5cbiIsIGFyZ3ZbMF0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICA8aW5wdXRfY29sb3JfZm9ybWF0PjogIDAgKFlVVjQyMFNQKSBvciAxIChZVVY0MjBQKVxuIik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAorICAgIGludCBjb2xvckZvcm1hdCA9IHRyYW5zbGF0ZUNvbG9yVG9PbXhFbnVtVmFsdWUoYXRvaShhcmd2WzJdKSk7CisgICAgaWYgKGNvbG9yRm9ybWF0ID09IC0xKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5wdXQgY29sb3IgZm9ybWF0IG11c3QgYmUgMCAoWVVWNDIwU1ApIG9yIDEgKFlVVjQyMFApXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgT0spOwogCi0jaWYgMQorICAgIHN0YXR1c190IGVyciA9IE9LOworCisjaWYgMAogICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBjcmVhdGVTb3VyY2UoYXJndlsxXSk7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKQEAgLTE2NSwxNiArMjA1LDIzIEBACiAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogI2Vsc2UKLSAgICBpbnQgd2lkdGggPSA4MDA7CisgICAgaW50IHdpZHRoID0gNzIwOwogICAgIGludCBoZWlnaHQgPSA0ODA7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBuZXcgRHVtbXlTb3VyY2Uod2lkdGgsIGhlaWdodCk7CisgICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBuZXcgRHVtbXlTb3VyY2Uod2lkdGgsIGhlaWdodCwgY29sb3JGb3JtYXQpOwogI2VuZGlmCiAKICAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgLy8gZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAvLyBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0ZyYW1lcmF0ZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBrVmlkZW9CaXRSYXRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIGhlaWdodCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIGtJRnJhbWVzSW50ZXJ2YWxTZWMpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKIAogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KICAgICAgICAgT01YQ29kZWM6OkNyZWF0ZSgKQEAgLTE4MywxNiArMjMwLDIwIEBACiAjaWYgMQogICAgIHNwPE1QRUc0V3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoIi9zZGNhcmQvb3V0cHV0Lm1wNCIpOwogICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwotICAgIHdyaXRlci0+c3RhcnQoKTsKKyAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihrRHVyYXRpb25Vcyk7CisgICAgQ0hFQ0tfRVEoT0ssIHdyaXRlci0+c3RhcnQoKSk7CiAgICAgd2hpbGUgKCF3cml0ZXItPnJlYWNoZWRFT1MoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi4iKTsKICAgICAgICAgdXNsZWVwKDEwMDAwMCk7CiAgICAgfQotICAgIHdyaXRlci0+c3RvcCgpOworICAgIGVyciA9IHdyaXRlci0+c3RvcCgpOwogI2Vsc2UKLSAgICBlbmNvZGVyLT5zdGFydCgpOworICAgIENIRUNLX0VRKE9LLCBlbmNvZGVyLT5zdGFydCgpKTsKIAogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CiAgICAgd2hpbGUgKGVuY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgcHJpbnRmKCIuIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICBpbnQzMl90IGlzU3luYzsKICAgICAgICAgaWYgKCFidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSkgewogICAgICAgICAgICAgaXNTeW5jID0gZmFsc2U7CkBAIC0yMDUsMTQgKzI1NiwxNyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIGVuY29kZXItPnN0b3AoKTsKKyAgICBlcnIgPSBlbmNvZGVyLT5zdG9wKCk7CiAjZW5kaWYKIAorICAgIHByaW50ZigiJFxuIik7CiAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKICNlbmRpZgogCiAjaWYgMAogICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGUoKTsKKyAgICBzb3VyY2UtPnN0YXJ0KCk7CisKICAgICBwcmludGYoInNvdXJjZSA9ICVwXG4iLCBzb3VyY2UpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMjI3LDEwICsyODEsMTYgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICB9CiAKKyAgICBlcnIgPSBzb3VyY2UtPnN0b3AoKTsKKwogICAgIGRlbGV0ZSBzb3VyY2U7CiAgICAgc291cmNlID0gTlVMTDsKICNlbmRpZgogCisgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlY29yZCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtMjYyLDYgKzMyMiw3IEBACiAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtTYW1wbGVSYXRlKTsKICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBrTnVtQ2hhbm5lbHMpOwogICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIDgxOTIpOworICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBrQXVkaW9CaXRSYXRlKTsKIAogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KICAgICAgICAgT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIGVuY01ldGEsIHRydWUsIGF1ZGlvU291cmNlKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggYjgzOGYzMi4uZjU1Yjc0NiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YWdlZnJpZ2h0IgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yNSwxMyArMjksMTUgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlICJpbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTGl2ZVNvdXJjZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC0zOSw2ICs0NSwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIGxvbmcgZ051bVJlcGV0aXRpb25zOwpAQCAtNDYsNiArNTgsOCBAQAogc3RhdGljIGxvbmcgZ1JlcHJvZHVjZUJ1ZzsgIC8vIGlmIG5vdCAtMS4KIHN0YXRpYyBib29sIGdQcmVmZXJTb2Z0d2FyZUNvZGVjOwogc3RhdGljIGJvb2wgZ1BsYXliYWNrQXVkaW87CitzdGF0aWMgYm9vbCBnV3JpdGVNUDQ7CitzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIAogc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKSB7CiAgICAgc3RydWN0IHRpbWV2YWwgdHY7CkBAIC01NCw3ICs2OCw3IEBACiAgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwbGw7CiB9CiAKLXN0YXRpYyB2b2lkIHBsYXlTb3VyY2UoT01YQ2xpZW50ICpjbGllbnQsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CitzdGF0aWMgdm9pZCBwbGF5U291cmNlKE9NWENsaWVudCAqY2xpZW50LCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC03NSw2ICs4OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzb3VyY2UuY2xlYXIoKTsKKwogICAgIHN0YXR1c190IGVyciA9IHJhd1NvdXJjZS0+c3RhcnQoKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTg1LDYgKzEwMSw3IEBACiAgICAgaWYgKGdQbGF5YmFja0F1ZGlvKSB7CiAgICAgICAgIEF1ZGlvUGxheWVyICpwbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoTlVMTCk7CiAgICAgICAgIHBsYXllci0+c2V0U291cmNlKHJhd1NvdXJjZSk7CisgICAgICAgIHJhd1NvdXJjZS5jbGVhcigpOwogCiAgICAgICAgIHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKQEAgLTk1LDYgKzExMiw4IEBACiAKICAgICAgICAgZGVsZXRlIHBsYXllcjsKICAgICAgICAgcGxheWVyID0gTlVMTDsKKworICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIGlmIChnUmVwcm9kdWNlQnVnID49IDMgJiYgZ1JlcHJvZHVjZUJ1ZyA8PSA1KSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKTsKQEAgLTEwOSw3ICsxMjgsNyBAQAogCiAgICAgICAgICAgICBib29sIHNob3VsZFNlZWsgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJ1ZmZlciwgTlVMTCk7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyID09IE5VTEwpOwogCiAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3JtYXQgY2hhbmdlZC5cbiIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTk1LDcgKzIxNCw3IEBACiAgICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShidWZmZXIsIE5VTEwpOworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBOVUxMKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvcm1hdCBjaGFuZ2VkLlxuIik7CkBAIC0yNTYsNiArMjc1LDE4MyBAQAogICAgIH0KIH0KIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IERldGVjdFN5bmNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIERldGVjdFN5bmNTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcml2YXRlOgorICAgIGVudW0gU3RyZWFtVHlwZSB7CisgICAgICAgIEFWQywKKyAgICAgICAgTVBFRzQsCisgICAgICAgIEgyNjMsCisgICAgICAgIE9USEVSLAorICAgIH07CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBTdHJlYW1UeXBlIG1TdHJlYW1UeXBlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGV0ZWN0U3luY1NvdXJjZSk7Cit9OworCitEZXRlY3RTeW5jU291cmNlOjpEZXRlY3RTeW5jU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVN0cmVhbVR5cGUoT1RIRVIpIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IEFWQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IE1QRUc0OworICAgICAgICBDSEVDSyghInN5bmMgZnJhbWUgZGV0ZWN0aW9uIG5vdCBpbXBsZW1lbnRlZCB5ZXQgZm9yIE1QRUc0Iik7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKSkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IEgyNjM7CisgICAgICAgIENIRUNLKCEic3luYyBmcmFtZSBkZXRlY3Rpb24gbm90IGltcGxlbWVudGVkIHlldCBmb3IgSC4yNjMiKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldGVjdFN5bmNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKK30KKworc3RhdHVzX3QgRGV0ZWN0U3luY1NvdXJjZTo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gRGV0ZWN0U3luY1NvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworc3RhdGljIGJvb2wgaXNJRFJGcmFtZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSArIDMgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZkYXRhW2ldLCAzKSkgeworICAgICAgICAgICAgdWludDhfdCBuYWxUeXBlID0gZGF0YVtpICsgM10gJiAweDFmOworICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBEZXRlY3RTeW5jU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1UeXBlID09IEFWQyAmJiBpc0lEUkZyYW1lKCpidWZmZXIpKSB7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHdyaXRlU291cmNlc1RvTVA0KAorICAgICAgICBWZWN0b3I8c3A8TWVkaWFTb3VyY2U+ID4gJnNvdXJjZXMsIGJvb2wgc3luY0luZm9QcmVzZW50KSB7CisjaWYgMAorICAgIHNwPE1QRUc0V3JpdGVyPiB3cml0ZXIgPQorICAgICAgICBuZXcgTVBFRzRXcml0ZXIoZ1dyaXRlTVA0RmlsZW5hbWUuc3RyaW5nKCkpOworI2Vsc2UKKyAgICBzcDxNUEVHMlRTV3JpdGVyPiB3cml0ZXIgPQorICAgICAgICBuZXcgTVBFRzJUU1dyaXRlcihnV3JpdGVNUDRGaWxlbmFtZS5zdHJpbmcoKSk7CisjZW5kaWYKKworICAgIC8vIGF0IG1vc3Qgb25lIG1pbnV0ZS4KKyAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbig2MDAwMDAwMGxsKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gc291cmNlcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIENIRUNLX0VRKHdyaXRlci0+YWRkU291cmNlKAorICAgICAgICAgICAgICAgICAgICBzeW5jSW5mb1ByZXNlbnQgPyBzb3VyY2UgOiBuZXcgRGV0ZWN0U3luY1NvdXJjZShzb3VyY2UpKSwKKyAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBwYXJhbXMgPSBuZXcgTWV0YURhdGE7CisgICAgcGFyYW1zLT5zZXRJbnQzMihrS2V5Tm90UmVhbFRpbWUsIHRydWUpOworICAgIENIRUNLX0VRKHdyaXRlci0+c3RhcnQocGFyYW1zLmdldCgpKSwgKHN0YXR1c190KU9LKTsKKworICAgIHdoaWxlICghd3JpdGVyLT5yZWFjaGVkRU9TKCkpIHsKKyAgICAgICAgdXNsZWVwKDEwMDAwMCk7CisgICAgfQorICAgIHdyaXRlci0+c3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtU2Vla1Rlc3QoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHNvdXJjZS0+c3RhcnQoKSk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgQ0hFQ0soc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKTsKKworICAgIGZvciAoaW50NjRfdCBzZWVrVGltZVVzID0gMDsgc2Vla1RpbWVVcyA8PSBkdXJhdGlvblVzOworICAgICAgICAgICAgc2Vla1RpbWVVcyArPSA2MDAwMGxsKSB7CisgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpOworCisgICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCIlbGxkXHQlbGxkXHQlbGxkXG4iLCBzZWVrVGltZVVzLCB0aW1lVXMsIHNlZWtUaW1lVXMgLSB0aW1lVXMpOworCisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzb3VyY2UtPnN0b3AoKSk7Cit9CisKIHN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXNcbiIsIG1lKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKQEAgLTI2OCw2ICs0NjQsOCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1zKG9mdHdhcmUpIHByZWZlciBzb2Z0d2FyZSBjb2RlY1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW8gcGxheWJhY2sgYXVkaW9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC13KHJpdGUpIGZpbGVuYW1lICh3cml0ZSB0byAubXA0IGZpbGUpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtayBzZWVrIHRlc3RcbiIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKQEAgLTI3NywxNCArNDc1LDE5IEBACiAgICAgYm9vbCBsaXN0Q29tcG9uZW50cyA9IGZhbHNlOwogICAgIGJvb2wgZHVtcFByb2ZpbGVzID0gZmFsc2U7CiAgICAgYm9vbCBleHRyYWN0VGh1bWJuYWlsID0gZmFsc2U7CisgICAgYm9vbCBzZWVrVGVzdCA9IGZhbHNlOwogICAgIGdOdW1SZXBldGl0aW9ucyA9IDE7CiAgICAgZ01heE51bUZyYW1lcyA9IDA7CiAgICAgZ1JlcHJvZHVjZUJ1ZyA9IC0xOwogICAgIGdQcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAgICAgZ1BsYXliYWNrQXVkaW8gPSBmYWxzZTsKKyAgICBnV3JpdGVNUDQgPSBmYWxzZTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxBUlRTUENvbnRyb2xsZXI+IHJ0c3BDb250cm9sbGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFuOmxtOmI6cHRzbyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c293OmsiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC0zMjAsNiArNTIzLDEzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdXcml0ZU1QNCA9IHRydWU7CisgICAgICAgICAgICAgICAgZ1dyaXRlTVA0RmlsZW5hbWUuc2V0VG8ob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZHVtcFByb2ZpbGVzID0gdHJ1ZTsKQEAgLTM0NCw2ICs1NTQsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnayc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vla1Rlc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTM3OSwxMCArNTk1LDEwIEBACiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgICAgIENIRUNLX0VRKHJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShmaWxlbmFtZSksIE9LKTsKKyAgICAgICAgICAgIENIRUNLX0VRKHJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShmaWxlbmFtZSksIChzdGF0dXNfdClPSyk7CiAgICAgICAgICAgICBDSEVDS19FUShyZXRyaWV2ZXItPnNldE1vZGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRBREFUQV9NT0RFX0ZSQU1FX0NBUFRVUkVfQU5EX01FVEFEQVRBX1JFVFJJRVZBTCksCi0gICAgICAgICAgICAgICAgICAgICBPSyk7CisgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwogCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSByZXRyaWV2ZXItPmNhcHR1cmVGcmFtZSgpOwogCkBAIC00MjgsNyArNjQ0LDcgQEAKICAgICAgICAgICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gcmVzdWx0czsKICAgICAgICAgICAgIENIRUNLX0VRKFF1ZXJ5Q29kZWNzKG9teCwga01pbWVUeXBlc1trXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIHF1ZXJ5RGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzKSwgT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdHMpLCAoc3RhdHVzX3QpT0spOwogCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIiAgZGVjb2RlciAnJXMnIHN1cHBvcnRzICIsCkBAIC00NzcsMjEgKzY5MywxNiBAQAogICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7CiAKICAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgeworICAgICAgICBib29sIHN5bmNJbmZvUHJlc2VudCA9IHRydWU7CisKICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOwogCi0gICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7Ci0gICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBmaWxlbmFtZSwgNykpIHsKLSAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgSFRUUERhdGFTb3VyY2UoZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKCgoSFRUUERhdGFTb3VyY2UgKilkYXRhU291cmNlLmdldCgpKS0+Y29ubmVjdCgpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY29ubmVjdCB0byBIVFRQIHNlcnZlci5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgQ2FjaGluZ0RhdGFTb3VyY2UoZGF0YVNvdXJjZSwgMzIgKiAxMDI0LCAyMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpOwotICAgICAgICB9CisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGZpbGVuYW1lKTsKIAotICAgICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkKKyAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcChmaWxlbmFtZSwgInJ0c3A6Ly8iLCA3KQorICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKGZpbGVuYW1lLCAiaHR0cGxpdmU6Ly8iLCAxMSkKKyAgICAgICAgICAgICAgICAmJiBkYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KQEAgLTUwMywxMCArNzE0LDE0IEBACiAgICAgICAgICAgICBpc0pQRUcgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgVmVjdG9yPHNwPE1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogCiAgICAgICAgIGlmIChpc0pQRUcpIHsKICAgICAgICAgICAgIG1lZGlhU291cmNlID0gbmV3IEpQRUdTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgICAgICAgICBpZiAoZ1dyaXRlTVA0KSB7CisgICAgICAgICAgICAgICAgbWVkaWFTb3VyY2VzLnB1c2gobWVkaWFTb3VyY2UpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgic2luZToiLCBmaWxlbmFtZSwgNSkpIHsKICAgICAgICAgICAgIGNoYXIgKmVuZDsKICAgICAgICAgICAgIGxvbmcgc2FtcGxlUmF0ZSA9IHN0cnRvbChmaWxlbmFtZSArIDUsICZlbmQsIDEwKTsKQEAgLTUxNSw1NCArNzMwLDEzMSBAQAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lZGlhU291cmNlID0gbmV3IFNpbmVTb3VyY2Uoc2FtcGxlUmF0ZSwgMSk7CisgICAgICAgICAgICBpZiAoZ1dyaXRlTVA0KSB7CisgICAgICAgICAgICAgICAgbWVkaWFTb3VyY2VzLnB1c2gobWVkaWFTb3VyY2UpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZXh0cmFjdG9yLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcjsKKworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgicnRzcDovLyIsIGZpbGVuYW1lLCA3KSkgeworICAgICAgICAgICAgICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgICAgICAgICAgbG9vcGVyLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJ0c3BDb250cm9sbGVyID0gbmV3IEFSVFNQQ29udHJvbGxlcihsb29wZXIpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHJ0c3BDb250cm9sbGVyLT5jb25uZWN0KGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNvbm5lY3QgdG8gcnRzcCBzZXJ2ZXIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV4dHJhY3RvciA9IHJ0c3BDb250cm9sbGVyLmdldCgpOworCisgICAgICAgICAgICAgICAgc3luY0luZm9QcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cGxpdmU6Ly8iLCBmaWxlbmFtZSwgMTEpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB1cmkoImh0dHA6Ly8iKTsKKyAgICAgICAgICAgICAgICB1cmkuYXBwZW5kKGZpbGVuYW1lICsgMTEpOworCisgICAgICAgICAgICAgICAgZGF0YVNvdXJjZSA9IG5ldyBMaXZlU291cmNlKHVyaS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGF0YVNvdXJjZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoZGF0YVNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICBleHRyYWN0b3IgPQorICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKworICAgICAgICAgICAgICAgIHN5bmNJbmZvUHJlc2VudCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZXh0cmFjdG9yLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhOwotICAgICAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgTWVkaWFFeHRyYWN0b3I6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworICAgICAgICAgICAgaWYgKGdXcml0ZU1QNCkgeworICAgICAgICAgICAgICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOwogCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICAgICAgICAgIGlmIChhdWRpb09ubHkgJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXZlVmlkZW8gJiYgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZVRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VUcmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFTb3VyY2VzLnB1c2goc291cmNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgTWVkaWFFeHRyYWN0b3I6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb09ubHkgJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvT25seSAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBOVUxMOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghYXVkaW9Pbmx5ICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc3VpdGFibGUgJXMgdHJhY2sgZm91bmQuIFRoZSAnLWEnIG9wdGlvbiB3aWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0IGF1ZGlvIHRyYWNrcyBvbmx5LCB0aGUgZGVmYXVsdCBpcyB0byB0YXJnZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlbyB0cmFja3Mgb25seS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Pbmx5ID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWV0YSA9IE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aHVtYlRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmdGh1bWJUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidGh1bWJuYWlsVGltZTogJWxsZCB1cyAoJS4yZiBzZWNzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1iVGltZVVzLCB0aHVtYlRpbWVVcyAvIDFFNik7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm8gc3VpdGFibGUgJXMgdHJhY2sgZm91bmQuIFRoZSAnLWEnIG9wdGlvbiB3aWxsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQgYXVkaW8gdHJhY2tzIG9ubHksIHRoZSBkZWZhdWx0IGlzIHRvIHRhcmdldCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8gdHJhY2tzIG9ubHkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Pbmx5ID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBtZWRpYVNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdGh1bWJUaW1lVXM7Ci0gICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmdGh1bWJUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJ0aHVtYm5haWxUaW1lOiAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICB0aHVtYlRpbWVVcywgdGh1bWJUaW1lVXMgLyAxRTYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZWRpYVNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CiAgICAgICAgIH0KIAotICAgICAgICBwbGF5U291cmNlKCZjbGllbnQsIG1lZGlhU291cmNlKTsKKyAgICAgICAgaWYgKGdXcml0ZU1QNCkgeworICAgICAgICAgICAgd3JpdGVTb3VyY2VzVG9NUDQobWVkaWFTb3VyY2VzLCBzeW5jSW5mb1ByZXNlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHNlZWtUZXN0KSB7CisgICAgICAgICAgICBwZXJmb3JtU2Vla1Rlc3QobWVkaWFTb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxheVNvdXJjZSgmY2xpZW50LCBtZWRpYVNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocnRzcENvbnRyb2xsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcnRzcENvbnRyb2xsZXItPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHJ0c3BDb250cm9sbGVyLmNsZWFyKCk7CisKKyAgICAgICAgICAgIHNsZWVwKDMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKaW5kZXggNTc5NjhlMy4uZTczNGMzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKQEAgLTgzLDYgKzgzLDE4IEBACiBlbnVtIHsKICAgICBDQU1FUkFfQ01EX1NUQVJUX1NNT09USF9aT09NICAgICA9IDEsCiAgICAgQ0FNRVJBX0NNRF9TVE9QX1NNT09USF9aT09NICAgICAgPSAyLAorICAgIC8vIFNldCB0aGUgY2xvY2t3aXNlIHJvdGF0aW9uIG9mIHByZXZpZXcgZGlzcGxheSAoc2V0UHJldmlld0Rpc3BsYXkpIGluCisgICAgLy8gZGVncmVlcy4gVGhpcyBhZmZlY3RzIHRoZSBwcmV2aWV3IGZyYW1lcyBhbmQgdGhlIHBpY3R1cmUgZGlzcGxheWVkIGFmdGVyCisgICAgLy8gc25hcHNob3QuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgcG9ydHJhaXQgbW9kZSBhcHBsaWNhdGlvbnMuIE5vdGUgdGhhdAorICAgIC8vIHByZXZpZXcgZGlzcGxheSBvZiBmcm9udC1mYWNpbmcgY2FtZXJhcyBpcyBmbGlwcGVkIGhvcml6b250YWxseSBiZWZvcmUKKyAgICAvLyB0aGUgcm90YXRpb24sIHRoYXQgaXMsIHRoZSBpbWFnZSBpcyByZWZsZWN0ZWQgYWxvbmcgdGhlIGNlbnRyYWwgdmVydGljYWwKKyAgICAvLyBheGlzIG9mIHRoZSBjYW1lcmEgc2Vuc29yLiBTbyB0aGUgdXNlcnMgY2FuIHNlZSB0aGVtc2VsdmVzIGFzIGxvb2tpbmcKKyAgICAvLyBpbnRvIGEgbWlycm9yLgorICAgIC8vCisgICAgLy8gVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIG9yZGVyIG9mIGJ5dGUgYXJyYXkgb2YgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLAorICAgIC8vIENBTUVSQV9NU0dfVklERU9fRlJBTUUsIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUsIENBTUVSQV9NU0dfUkFXX0lNQUdFLAorICAgIC8vIG9yIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRS4gVGhpcyBpcyBub3QgYWxsb3dlZCB0byBiZSBzZXQgZHVyaW5nCisgICAgLy8gcHJldmlldy4KICAgICBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OID0gMywKIH07CiAKQEAgLTkyLDYgKzEwNCwzNCBAQAogICAgIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCA9IDEwMAogfTsKIAorZW51bSB7CisgICAgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMCwgLyogVGhlIGZhY2luZyBvZiB0aGUgY2FtZXJhIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YgdGhlIHNjcmVlbi4gKi8KKyAgICBDQU1FUkFfRkFDSU5HX0ZST05UID0gMSAvKiBUaGUgZmFjaW5nIG9mIHRoZSBjYW1lcmEgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgc2NyZWVuLiAqLworfTsKKworc3RydWN0IENhbWVyYUluZm8geworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBjYW1lcmEgZmFjZXMgdG8uIEl0IHNob3VsZCBiZQorICAgICAqIENBTUVSQV9GQUNJTkdfQkFDSyBvciBDQU1FUkFfRkFDSU5HX0ZST05ULgorICAgICAqLworICAgIGludCBmYWNpbmc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBpbWFnZS4gVGhlIHZhbHVlIGlzIHRoZSBhbmdsZSB0aGF0IHRoZQorICAgICAqIGNhbWVyYSBpbWFnZSBuZWVkcyB0byBiZSByb3RhdGVkIGNsb2Nrd2lzZSBzbyBpdCBzaG93cyBjb3JyZWN0bHkgb24KKyAgICAgKiB0aGUgZGlzcGxheSBpbiBpdHMgbmF0dXJhbCBvcmllbnRhdGlvbi4gSXQgc2hvdWxkIGJlIDAsIDkwLCAxODAsIG9yIDI3MC4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlLCBzdXBwb3NlIGEgZGV2aWNlIGhhcyBhIG5hdHVyYWxseSB0YWxsIHNjcmVlbi4gVGhlCisgICAgICogYmFjay1mYWNpbmcgY2FtZXJhIHNlbnNvciBpcyBtb3VudGVkIGluIGxhbmRzY2FwZS4gWW91IGFyZSBsb29raW5nIGF0CisgICAgICogdGhlIHNjcmVlbi4gSWYgdGhlIHRvcCBzaWRlIG9mIHRoZSBjYW1lcmEgc2Vuc29yIGlzIGFsaWduZWQgd2l0aCB0aGUKKyAgICAgKiByaWdodCBlZGdlIG9mIHRoZSBzY3JlZW4gaW4gbmF0dXJhbCBvcmllbnRhdGlvbiwgdGhlIHZhbHVlIHNob3VsZCBiZQorICAgICAqIDkwLiBJZiB0aGUgdG9wIHNpZGUgb2YgYSBmcm9udC1mYWNpbmcgY2FtZXJhIHNlbnNvciBpcyBhbGlnbmVkIHdpdGgKKyAgICAgKiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbiwgdGhlIHZhbHVlIHNob3VsZCBiZSAyNzAuCisgICAgICovCisgICAgaW50IG9yaWVudGF0aW9uOworfTsKKwogY2xhc3MgSUNhbWVyYVNlcnZpY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgU3VyZmFjZTsKQEAgLTExMiw3ICsxNTIsMTAgQEAKIHB1YmxpYzoKICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhIGNhbWVyYSBjbGllbnQgZnJvbSBhbiBleGlzdGluZyByZW1vdGUKICAgICBzdGF0aWMgIHNwPENhbWVyYT4gIGNyZWF0ZShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICBzdGF0aWMgIHNwPENhbWVyYT4gIGNvbm5lY3QoKTsKKyAgICBzdGF0aWMgIGludDMyX3QgICAgIGdldE51bWJlck9mQ2FtZXJhcygpOworICAgIHN0YXRpYyAgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKTsKKyAgICBzdGF0aWMgIHNwPENhbWVyYT4gIGNvbm5lY3QoaW50IGNhbWVyYUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH5DYW1lcmEoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGluaXQoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggZDg3N2M3NC4uMzVjNWFhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0xOTAsNyArMTkwLDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNhbmNlbFBpY3R1cmUoKSA9IDA7CiAKLSAgICAvKiogU2V0IHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gKi8KKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiBUaGlzIHJldHVybnMgQkFEX1ZBTFVFIGlmIGFueSBwYXJhbWV0ZXIgaXMKKyAgICAgKiBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykgPSAwOwogCiAgICAgLyoqIFJldHVybiB0aGUgY2FtZXJhIHBhcmFtZXRlcnMuICovCkBAIC0yMTMsOCArMjE1LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgPSAwOwogfTsKIAotLyoqIGZhY3RvcnkgZnVuY3Rpb24gdG8gaW5zdGFudGlhdGUgYSBjYW1lcmEgaGFyZHdhcmUgb2JqZWN0ICovCi1leHRlcm4gIkMiIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBvcGVuQ2FtZXJhSGFyZHdhcmUoKTsKKy8qKgorICogVGhlIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYW1lcmEgSEFMLgorICoKKyAqIElmIGdldE51bWJlck9mQ2FtZXJhcygpIHJldHVybnMgTiwgdGhlIHZhbGlkIGNhbWVyYUlkIGZvciBnZXRDYW1lcmFJbmZvKCkKKyAqIGFuZCBvcGVuQ2FtZXJhSGFyZHdhcmUoKSBpcyAwIHRvIE4tMS4KKyAqLworZXh0ZXJuICJDIiBpbnQgSEFMX2dldE51bWJlck9mQ2FtZXJhcygpOworZXh0ZXJuICJDIiB2b2lkIEhBTF9nZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOworLyogSEFMIHNob3VsZCByZXR1cm4gTlVMTCBpZiBpdCBmYWlscyB0byBvcGVuIGNhbWVyYSBoYXJkd2FyZS4gKi8KK2V4dGVybiAiQyIgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IEhBTF9vcGVuQ2FtZXJhSGFyZHdhcmUoaW50IGNhbWVyYUlkKTsKIAogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCA1ZWE4M2E1Li40ZTc3MGZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0yMiw2ICsyMiwyMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBTaXplIHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKworICAgIFNpemUoKSB7CisgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgaGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBTaXplKGludCB3LCBpbnQgaCkgeworICAgICAgICB3aWR0aCA9IHc7CisgICAgICAgIGhlaWdodCA9IGg7CisgICAgfQorfTsKKwogY2xhc3MgQ2FtZXJhUGFyYW1ldGVycwogewogcHVibGljOgpAQCAtNDMsMTIgKzU4LDE1IEBACiAKICAgICB2b2lkIHNldFByZXZpZXdTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdm9pZCBnZXRQcmV2aWV3U2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7CiAgICAgdm9pZCBzZXRQcmV2aWV3RnJhbWVSYXRlKGludCBmcHMpOwogICAgIGludCBnZXRQcmV2aWV3RnJhbWVSYXRlKCkgY29uc3Q7CisgICAgdm9pZCBnZXRQcmV2aWV3RnBzUmFuZ2UoaW50ICptaW5fZnBzLCBpbnQgKm1heF9mcHMpIGNvbnN0OwogICAgIHZvaWQgc2V0UHJldmlld0Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpOwogICAgIGNvbnN0IGNoYXIgKmdldFByZXZpZXdGb3JtYXQoKSBjb25zdDsKICAgICB2b2lkIHNldFBpY3R1cmVTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdm9pZCBnZXRQaWN0dXJlU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7CiAgICAgdm9pZCBzZXRQaWN0dXJlRm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCk7CiAgICAgY29uc3QgY2hhciAqZ2V0UGljdHVyZUZvcm1hdCgpIGNvbnN0OwogCkBAIC02NSwxMyArODMsMjkgQEAKICAgICAvLyBTdXBwb3J0ZWQgcHJldmlldyBmcmFtZSBzaXplcyBpbiBwaXhlbHMuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjgwMHg2MDAsNDgweDMyMCIuIFJlYWQgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVNbXTsKLSAgICAvLyBUaGUgaW1hZ2UgZm9ybWF0IGZvciBwcmV2aWV3IGZyYW1lcy4KKyAgICAvLyBUaGUgY3VycmVudCBtaW5pbXVtIGFuZCBtYXhpbXVtIHByZXZpZXcgZnBzLiBUaGlzIGNvbnRyb2xzIHRoZSByYXRlIG9mCisgICAgLy8gcHJldmlldyBmcmFtZXMgcmVjZWl2ZWQgKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkuIFRoZSBtaW5pbXVtIGFuZAorICAgIC8vIG1heGltdW0gZnBzIG11c3QgYmUgb25lIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgLy8gS0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZQU19SQU5HRSBwYXJhbWV0ZXIuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjEwNTAwLDI2NjIzIgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9QUkVWSUVXX0ZQU19SQU5HRVtdOworICAgIC8vIFRoZSBzdXBwb3J0ZWQgcHJldmlldyBmcHMgKGZyYW1lLXBlci1zZWNvbmQpIHJhbmdlcy4gRWFjaCByYW5nZSBjb250YWlucworICAgIC8vIGEgbWluaW11bSBmcHMgYW5kIG1heGltdW0gZnBzLiBJZiBtaW5pbXVtIGZwcyBlcXVhbHMgdG8gbWF4aW11bSBmcHMsIHRoZQorICAgIC8vIGNhbWVyYSBvdXRwdXRzIGZyYW1lcyBpbiBmaXhlZCBmcmFtZSByYXRlLiBJZiBub3QsIHRoZSBjYW1lcmEgb3V0cHV0cworICAgIC8vIGZyYW1lcyBpbiBhdXRvIGZyYW1lIHJhdGUuIFRoZSBhY3R1YWwgZnJhbWUgcmF0ZSBmbHVjdHVhdGVzIGJldHdlZW4gdGhlCisgICAgLy8gbWluaW11bSBhbmQgdGhlIG1heGltdW0uIFRoZSBsaXN0IGhhcyBhdCBsZWFzdCBvbmUgZWxlbWVudC4gVGhlIGxpc3QgaXMKKyAgICAvLyBzb3J0ZWQgZnJvbSBzbWFsbCB0byBsYXJnZSAoZmlyc3QgYnkgbWF4aW11bSBmcHMgYW5kIHRoZW4gbWluaW11bSBmcHMpLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIoMTA1MDAsMjY2MjMpLCgxNTAwMCwyNjYyMyksKDMwMDAwLDMwMDAwKSIKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlBTX1JBTkdFW107CisgICAgLy8gVGhlIGltYWdlIGZvcm1hdCBmb3IgcHJldmlldyBmcmFtZXMuIFNlZSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUFJFVklFV19GT1JNQVRbXTsKICAgICAvLyBTdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyBmb3IgcHJldmlldyBmcmFtZXMuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwLHl1djQyMmkteXV5diIuIFJlYWQgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRk9STUFUU1tdOwotICAgIC8vIE51bWJlciBvZiBwcmV2aWV3IGZyYW1lcyBwZXIgc2Vjb25kLgorICAgIC8vIE51bWJlciBvZiBwcmV2aWV3IGZyYW1lcyBwZXIgc2Vjb25kLiBUaGlzIGlzIHRoZSB0YXJnZXQgZnJhbWUgcmF0ZS4gVGhlCisgICAgLy8gYWN0dWFsIGZyYW1lIHJhdGUgZGVwZW5kcyBvbiB0aGUgZHJpdmVyLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIxNSIuIFJlYWQvd3JpdGUuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1BSRVZJRVdfRlJBTUVfUkFURVtdOwogICAgIC8vIFN1cHBvcnRlZCBudW1iZXIgb2YgcHJldmlldyBmcmFtZXMgcGVyIHNlY29uZC4KQEAgLTgzLDcgKzExNyw4IEBACiAgICAgLy8gU3VwcG9ydGVkIGRpbWVuc2lvbnMgZm9yIGNhcHR1cmVkIHBpY3R1cmVzIGluIHBpeGVscy4KICAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjA0OHgxNTM2LDEwMjR4NzY4Ii4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFU1tdOwotICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIGNhcHR1cmVkIHBpY3R1cmVzLgorICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIGNhcHR1cmVkIHBpY3R1cmVzLiBTZWUgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFCisgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICJqcGVnIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUElDVFVSRV9GT1JNQVRbXTsKICAgICAvLyBTdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0cyBmb3IgY2FwdHVyZWQgcGljdHVyZXMuCkBAIC0xMDcsMjYgKzE0MiwzNiBAQAogICAgIC8vIHRoZSBiZXN0LgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICI5MCIuIFJlYWQvd3JpdGUuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0pQRUdfUVVBTElUWVtdOwotICAgIC8vIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIGluIGRlZ3JlZXMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZQotICAgIC8vIG5hdHVyYWwgcG9zaXRpb24gb2YgdGhlIGRldmljZSBpcyBsYW5kc2NhcGUuIElmIHRoZSB1c2VyIHRha2VzIGEgcGljdHVyZQotICAgIC8vIGluIGxhbmRzY2FwZSBtb2RlIGluIDIwNDh4MTUzNiByZXNvbHV0aW9uLCB0aGUgcm90YXRpb24gd2lsbCBiZSBzZXQgdG8KLSAgICAvLyAiMCIuIElmIHRoZSB1c2VyIHJvdGF0ZXMgdGhlIHBob25lIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLCB0aGUgcm90YXRpb24KLSAgICAvLyBzaG91bGQgYmUgc2V0IHRvICI5MCIuCi0gICAgLy8gVGhlIGNhbWVyYSBkcml2ZXIgY2FuIHNldCBvcmllbnRhdGlvbiBpbiB0aGUgRVhJRiBoZWFkZXIgd2l0aG91dCByb3RhdGluZwotICAgIC8vIHRoZSBwaWN0dXJlLiBPciB0aGUgZHJpdmVyIGNhbiByb3RhdGUgdGhlIHBpY3R1cmUgYW5kIHRoZSBFWElGIHRodW1ibmFpbC4KLSAgICAvLyBJZiB0aGUgSnBlZyBwaWN0dXJlIGlzIHJvdGF0ZWQsIHRoZSBvcmllbnRhdGlvbiBpbiB0aGUgRVhJRiBoZWFkZXIgc2hvdWxkCi0gICAgLy8gYmUgbWlzc2luZyBvciAxIChyb3cgIzAgaXMgdG9wIGFuZCBjb2x1bW4gIzAgaXMgbGVmdCBzaWRlKS4gVGhlIGRyaXZlcgotICAgIC8vIHNob3VsZCBub3Qgc2V0IGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorICAgIC8vIFRoZSByb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzIHJlbGF0aXZlIHRvIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgY2FtZXJhLgorICAgIC8vIFRoaXMgYWZmZWN0cyB0aGUgcGljdHVyZXMgcmV0dXJuZWQgZnJvbSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UuIFRoZQorICAgIC8vIGNhbWVyYSBkcml2ZXIgbWF5IHNldCBvcmllbnRhdGlvbiBpbiB0aGUgRVhJRiBoZWFkZXIgd2l0aG91dCByb3RhdGluZyB0aGUKKyAgICAvLyBwaWN0dXJlLiBPciB0aGUgZHJpdmVyIG1heSByb3RhdGUgdGhlIHBpY3R1cmUgYW5kIHRoZSBFWElGIHRodW1ibmFpbC4gSWYKKyAgICAvLyB0aGUgSnBlZyBwaWN0dXJlIGlzIHJvdGF0ZWQsIHRoZSBvcmllbnRhdGlvbiBpbiB0aGUgRVhJRiBoZWFkZXIgd2lsbCBiZQorICAgIC8vIG1pc3Npbmcgb3IgMSAocm93ICMwIGlzIHRvcCBhbmQgY29sdW1uICMwIGlzIGxlZnQgc2lkZSkuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIEpQRUcgcGljdHVyZXMgb2YgZnJvbnQtZmFjaW5nIGNhbWVyYXMgYXJlIG5vdCBtaXJyb3JlZAorICAgIC8vIGFzIGluIHByZXZpZXcgZGlzcGxheS4KKyAgICAvLworICAgIC8vIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZSBuYXR1cmFsIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgaXMgcG9ydHJhaXQuCisgICAgLy8gVGhlIGRldmljZSBpcyByb3RhdGVkIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZSwgc28gdGhlIGRldmljZSBvcmllbnRhdGlvbiBpcworICAgIC8vIDI3MC4gU3VwcG9zZSBhIGJhY2stZmFjaW5nIGNhbWVyYSBzZW5zb3IgaXMgbW91bnRlZCBpbiBsYW5kc2NhcGUgYW5kIHRoZQorICAgIC8vIHRvcCBzaWRlIG9mIHRoZSBjYW1lcmEgc2Vuc29yIGlzIGFsaWduZWQgd2l0aCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUKKyAgICAvLyBkaXNwbGF5IGluIG5hdHVyYWwgb3JpZW50YXRpb24uIFNvIHRoZSBjYW1lcmEgb3JpZW50YXRpb24gaXMgOTAuIFRoZQorICAgIC8vIHJvdGF0aW9uIHNob3VsZCBiZSBzZXQgdG8gMCAoMjcwICsgOTApLgorICAgIC8vCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjAiIG9yICI5MCIgb3IgIjE4MCIgb3IgIjI3MCIuIFdyaXRlIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1JPVEFUSU9OW107Ci0gICAgLy8gR1BTIGxhdGl0dWRlIGNvb3JkaW5hdGUuIFRoaXMgd2lsbCBiZSBzdG9yZWQgaW4gSlBFRyBFWElGIGhlYWRlci4KLSAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjUuMDMyMTQ2Ii4gV3JpdGUgb25seS4KKyAgICAvLyBHUFMgbGF0aXR1ZGUgY29vcmRpbmF0ZS4gR1BTTGF0aXR1ZGUgYW5kIEdQU0xhdGl0dWRlUmVmIHdpbGwgYmUgc3RvcmVkIGluCisgICAgLy8gSlBFRyBFWElGIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjUuMDMyMTQ2IiBvciAiLTMzLjQ2MjgwOSIuIFdyaXRlIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0dQU19MQVRJVFVERVtdOwotICAgIC8vIEdQUyBsb25naXR1ZGUgY29vcmRpbmF0ZS4gVGhpcyB3aWxsIGJlIHN0b3JlZCBpbiBKUEVHIEVYSUYgaGVhZGVyLgotICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIxMjEuNTY0NDQ4Ii4gV3JpdGUgb25seS4KKyAgICAvLyBHUFMgbG9uZ2l0dWRlIGNvb3JkaW5hdGUuIEdQU0xvbmdpdHVkZSBhbmQgR1BTTG9uZ2l0dWRlUmVmIHdpbGwgYmUgc3RvcmVkCisgICAgLy8gaW4gSlBFRyBFWElGIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMTIxLjU2NDQ0OCIgb3IgIi03MC42NjAyODYiLiBXcml0ZSBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9HUFNfTE9OR0lUVURFW107Ci0gICAgLy8gR1BTIGFsdGl0dWRlLiBUaGlzIHdpbGwgYmUgc3RvcmVkIGluIEpQRUcgRVhJRiBoZWFkZXIuCi0gICAgLy8gRXhhbXBsZSB2YWx1ZTogIjIxLjAiLiBXcml0ZSBvbmx5LgorICAgIC8vIEdQUyBhbHRpdHVkZS4gR1BTQWx0aXR1ZGUgYW5kIEdQU0FsdGl0dWRlUmVmIHdpbGwgYmUgc3RvcmVkIGluIEpQRUcgRVhJRgorICAgIC8vIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjEuMCIgb3IgIi01Ii4gV3JpdGUgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfR1BTX0FMVElUVURFW107CiAgICAgLy8gR1BTIHRpbWVzdGFtcCAoVVRDIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKS4gVGhpcyBzaG91bGQgYmUKICAgICAvLyBzdG9yZWQgaW4gSlBFRyBFWElGIGhlYWRlci4KQEAgLTE2NSwxMCArMjEwLDkgQEAKICAgICAvLyBTdXBwb3J0ZWQgZmxhc2ggbW9kZXMuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImF1dG8sb24sb2ZmIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfRkxBU0hfTU9ERVNbXTsKLSAgICAvLyBDdXJyZW50IGZvY3VzIG1vZGUuIElmIHRoZSBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWZvY3VzLCB0aGUgdmFsdWUKLSAgICAvLyBzaG91bGQgYmUgRk9DVVNfTU9ERV9GSVhFRC4gSWYgdGhlIGZvY3VzIG1vZGUgaXMgbm90IEZPQ1VTX01PREVfRklYRUQgb3IKLSAgICAvLyBvciBGT0NVU19NT0RFX0lORklOSVRZLCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwKLSAgICAvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5hdXRvRm9jdXMgdG8gc3RhcnQgdGhlIGZvY3VzLgorICAgIC8vIEN1cnJlbnQgZm9jdXMgbW9kZS4gVGhpcyB3aWxsIG5vdCBiZSBlbXB0eS4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsCisgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIHRvIHN0YXJ0IHRoZSBmb2N1cyBpZiBmb2N1cyBtb2RlIGlzCisgICAgLy8gRk9DVVNfTU9ERV9BVVRPIG9yIEZPQ1VTX01PREVfTUFDUk8uCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImF1dG8iIG9yIEZPQ1VTX01PREVfWFhYIGNvbnN0YW50cy4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfRk9DVVNfTU9ERVtdOwogICAgIC8vIFN1cHBvcnRlZCBmb2N1cyBtb2Rlcy4KQEAgLTIyMSw5ICsyNjUsNDAgQEAKICAgICAvLyBFeGFtcGxlIHZhbHVlOiAidHJ1ZSIuIFJlYWQgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVEW107CiAKKyAgICAvLyBUaGUgZGlzdGFuY2VzIChpbiBtZXRlcnMpIGZyb20gdGhlIGNhbWVyYSB0byB3aGVyZSBhbiBvYmplY3QgYXBwZWFycyB0bworICAgIC8vIGJlIGluIGZvY3VzLiBUaGUgb2JqZWN0IGlzIHNoYXJwZXN0IGF0IHRoZSBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlLiBUaGUKKyAgICAvLyBkZXB0aCBvZiBmaWVsZCBpcyB0aGUgZmFyIGZvY3VzIGRpc3RhbmNlIG1pbnVzIG5lYXIgZm9jdXMgZGlzdGFuY2UuCisgICAgLy8KKyAgICAvLyBGb2N1cyBkaXN0YW5jZXMgbWF5IGNoYW5nZSBhZnRlciBzdGFydGluZyBhdXRvIGZvY3VzLCBjYW5jZWxpbmcgYXV0bworICAgIC8vIGZvY3VzLCBvciBzdGFydGluZyB0aGUgcHJldmlldy4gQXBwbGljYXRpb25zIGNhbiByZWFkIHRoaXMgYW55dGltZSB0byBnZXQKKyAgICAvLyB0aGUgbGF0ZXN0IGZvY3VzIGRpc3RhbmNlcy4gSWYgdGhlIGZvY3VzIG1vZGUgaXMgRk9DVVNfTU9ERV9DT05USU5VT1VTLAorICAgIC8vIGZvY3VzIGRpc3RhbmNlcyBtYXkgY2hhbmdlIGZyb20gdGltZSB0byB0aW1lLgorICAgIC8vCisgICAgLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBlc3RpbWF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2FtZXJhIGFuZCB0aGUKKyAgICAvLyBzdWJqZWN0LiBBZnRlciBhdXRvZm9jdXMsIHRoZSBzdWJqZWN0IGRpc3RhbmNlIG1heSBiZSB3aXRoaW4gbmVhciBhbmQgZmFyCisgICAgLy8gZm9jdXMgZGlzdGFuY2UuIEhvd2V2ZXIsIHRoZSBwcmVjaXNpb24gZGVwZW5kcyBvbiB0aGUgY2FtZXJhIGhhcmR3YXJlLAorICAgIC8vIGF1dG9mb2N1cyBhbGdvcml0aG0sIHRoZSBmb2N1cyBhcmVhLCBhbmQgdGhlIHNjZW5lLiBUaGUgZXJyb3IgY2FuIGJlCisgICAgLy8gbGFyZ2UgYW5kIGl0IHNob3VsZCBiZSBvbmx5IHVzZWQgYXMgYSByZWZlcmVuY2UuCisgICAgLy8KKyAgICAvLyBGYXIgZm9jdXMgZGlzdGFuY2UgPiBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlID4gbmVhciBmb2N1cyBkaXN0YW5jZS4gSWYKKyAgICAvLyB0aGUgZmFyIGZvY3VzIGRpc3RhbmNlIGlzIGluZmluaXR5LCB0aGUgdmFsdWUgc2hvdWxkIGJlICJJbmZpbml0eSIgKGNhc2UKKyAgICAvLyBzZW5zaXRpdmUpLiBUaGUgZm9ybWF0IGlzIHRocmVlIGZsb2F0IHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiBUaGUKKyAgICAvLyBmaXJzdCBpcyBuZWFyIGZvY3VzIGRpc3RhbmNlLiBUaGUgc2Vjb25kIGlzIG9wdGltYWwgZm9jdXMgZGlzdGFuY2UuIFRoZQorICAgIC8vIHRoaXJkIGlzIGZhciBmb2N1cyBkaXN0YW5jZS4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMC45NSwxLjksSW5maW5pdHkiIG9yICIwLjA0OSwwLjA1LDAuMDUxIi4gUmVhZCBvbmx5LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9GT0NVU19ESVNUQU5DRVNbXTsKKworICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIHZpZGVvIGZyYW1lcy4gU2VlIENBTUVSQV9NU0dfVklERU9fRlJBTUUgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZCBvbmx5LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9WSURFT19GUkFNRV9GT1JNQVRbXTsKKwogICAgIC8vIFZhbHVlIGZvciBLRVlfWk9PTV9TVVBQT1JURUQgb3IgS0VZX1NNT09USF9aT09NX1NVUFBPUlRFRC4KICAgICBzdGF0aWMgY29uc3QgY2hhciBUUlVFW107CiAKKyAgICAvLyBWYWx1ZSBmb3IgS0VZX0ZPQ1VTX0RJU1RBTkNFUy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19ESVNUQU5DRV9JTkZJTklUWVtdOworCiAgICAgLy8gVmFsdWVzIGZvciB3aGl0ZSBiYWxhbmNlIHNldHRpbmdzLgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFdISVRFX0JBTEFOQ0VfQVVUT1tdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIFdISVRFX0JBTEFOQ0VfSU5DQU5ERVNDRU5UW107CkBAIC0yOTQsMTEgKzM2OSwxNCBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9KUEVHW107CiAKICAgICAvLyBWYWx1ZXMgZm9yIGZvY3VzIG1vZGUgc2V0dGluZ3MuCi0gICAgLy8gQXV0by1mb2N1cyBtb2RlLgorICAgIC8vIEF1dG8tZm9jdXMgbW9kZS4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsCisgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIHRvIHN0YXJ0IHRoZSBmb2N1cyBpbiB0aGlzIG1vZGUuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgRk9DVVNfTU9ERV9BVVRPW107CiAgICAgLy8gRm9jdXMgaXMgc2V0IGF0IGluZmluaXR5LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsCiAgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0lORklOSVRZW107CisgICAgLy8gTWFjcm8gKGNsb3NlLXVwKSBmb2N1cyBtb2RlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwKKyAgICAvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5hdXRvRm9jdXMgdG8gc3RhcnQgdGhlIGZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX01BQ1JPW107CiAgICAgLy8gRm9jdXMgaXMgZml4ZWQuIFRoZSBjYW1lcmEgaXMgYWx3YXlzIGluIHRoaXMgbW9kZSBpZiB0aGUgZm9jdXMgaXMgbm90CiAgICAgLy8gYWRqdXN0YWJsZS4gSWYgdGhlIGNhbWVyYSBoYXMgYXV0by1mb2N1cywgdGhpcyBtb2RlIGNhbiBmaXggdGhlCkBAIC0zMDksNiArMzg3LDE0IEBACiAgICAgLy8gY29udGludW91c2x5LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsCiAgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0VET0ZbXTsKKyAgICAvLyBDb250aW51b3VzIGF1dG8gZm9jdXMgbW9kZSBpbnRlbmRlZCBmb3IgdmlkZW8gcmVjb3JkaW5nLiBUaGUgY2FtZXJhCisgICAgLy8gY29udGludW91c2x5IHRyaWVzIHRvIGZvY3VzLiBUaGlzIGlzIGlkZWFsIGZvciBzaG9vdGluZyB2aWRlby4KKyAgICAvLyBBcHBsaWNhdGlvbnMgc3RpbGwgY2FuIGNhbGwgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UudGFrZVBpY3R1cmUgaW4gdGhpcworICAgIC8vIG1vZGUgYnV0IHRoZSBzdWJqZWN0IG1heSBub3QgYmUgaW4gZm9jdXMuIEF1dG8gZm9jdXMgc3RhcnRzIHdoZW4gdGhlCisgICAgLy8gcGFyYW1ldGVyIGlzIHNldC4gQXBwbGljYXRpb25zIHNob3VsZCBub3QgY2FsbAorICAgIC8vIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmF1dG9Gb2N1cyBpbiB0aGlzIG1vZGUuIFRvIHN0b3AgY29udGludW91cyBmb2N1cywKKyAgICAvLyBhcHBsaWNhdGlvbnMgc2hvdWxkIGNoYW5nZSB0aGUgZm9jdXMgbW9kZSB0byBvdGhlciBtb2Rlcy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU9bXTsKIAogcHJpdmF0ZToKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKaW5kZXggODJiMTI4My4uN2Q3MGMxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCkBAIC0zMCwxMyArMzAsMTkgQEAKIHsKIHB1YmxpYzoKICAgICBlbnVtIHsKLSAgICAgICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIEdFVF9OVU1CRVJfT0ZfQ0FNRVJBUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIEdFVF9DQU1FUkFfSU5GTywKKyAgICAgICAgQ09OTkVDVAogICAgIH07CiAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVNlcnZpY2UpOwogCi0gICAgdmlydHVhbCBzcDxJQ2FtZXJhPiAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICB2aXJ0dWFsIHNwPElDYW1lcmE+ICAgICBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY3ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPRUZGRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT0VGRkVDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb0VmZmVjdCA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisKKyAgICAvKgorICAgICAqICBTdGF0aWMgbWV0aG9kcyBmb3IgZWZmZWN0IGxpYnJhcmllcyBtYW5hZ2VtZW50LgorICAgICAqLworCisgICAgLyoKKyAgICAgKiAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorICAgICAqICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgorICAgICAqICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KKyAgICAgKiAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlIGJ5CisgICAgICogICBmdXJ0aGVyIGNhbGwgdG8gdW5sb2FkRWZmZWN0TGlicmFyeSgpIHRvIHVubG9hZCB0aGUgbGlicmFyeS4KKyAgICAgKgorICAgICAqICAgUGFyYW1ldGVyczoKKyAgICAgKiAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgKiAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKKyAgICAgKgorICAgICAqICAgUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICAgICAgTk9fRVJST1IgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNvbmZpZ3VyZSBhdWRpbworICAgICAqICAgICAgICAgIE5PX0lOSVQgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgaW1wbGVtZW50IHJlcXVpcmVkIGZ1bmN0aW9ucworICAgICAqICAgICAgICAgIEJBRF9WQUxVRSAgIGludmFsaWQgbGliUGF0aCBzdHJpbmcgb3IgaGFuZGxlCisgICAgICoKKyAgICAgKiAgIFJldHVybmVkIHZhbHVlOgorICAgICAqICAgICAgICAgICpoYW5kbGUgdXBkYXRlZCB3aXRoIGxpYnJhcnkgaGFuZGxlCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworICAgIC8qCisgICAgICogICBVbmxvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiAgIFBhcmFtZXRlcnM6CisgICAgICogICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQorICAgICAqCisgICAgICogICBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgICAgICBOT19FUlJPUiAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2Ugb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY29uZmlndXJlIGF1ZGlvCisgICAgICogICAgICAgICAgTk9fSU5JVCAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgQkFEX1ZBTFVFICAgaW52YWxpZCBoYW5kbGUKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKTsKKworICAgIC8qCisgICAgICogIFN0YXRpYyBtZXRob2RzIGZvciBlZmZlY3RzIGVudW1lcmF0aW9uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWZmZWN0cyBhdmFpbGFibGUuIFRoaXMgbWV0aG9kIHRvZ2V0aGVyCisgICAgICogd2l0aCBxdWVyeUVmZmVjdCgpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzOgorICAgICAqIFRoZSBlbnVtZXJhdGlvbiBzZXF1ZW5jZSBpczoKKyAgICAgKiAgICAgIHF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtX2VmZmVjdHMpOworICAgICAqICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCisgICAgICogICAgICAgICAgcXVlcnlFZmZlY3QoaSwuLi4pOworICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIG51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorICAgICAqICAgICAgQkFEX1ZBTFVFICBpbnZhbGlkIG51bUVmZmVjdHMgcG9pbnRlcgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICpudW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGF2YWlsYWJsZQorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpOworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIGFuIGVmZmVjdCBkZXNjcmlwdG9yIGR1cmluZyBlZmZlY3QKKyAgICAgKiBlbnVtZXJhdGlvbi4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpbmRleDogICAgICBpbmRleCBvZiB0aGUgcXVlcmllZCBlZmZlY3QuCisgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBkZXNjcmlwdG9yIHBvaW50ZXIgb3IgaW5kZXgKKyAgICAgKiAgICAgIElOVkFMSURfT1BFUkFUSU9OICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZiBxdWVyeU51bWJlckVmZmVjdHMoKQorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICpkZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHV1aWQ6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHV1aWQuCisgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqZGVzY3JpcHRvciB1cGRhdGVkIHdpdGggZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworCisgICAgLyoKKyAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgorICAgICAqLworICAgIGVudW0gZXZlbnRfdHlwZSB7CisgICAgICAgIEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQgPSAwLAorICAgICAgICBFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQgPSAxLAorICAgICAgICBFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCA9IDIsCisgICAgICAgIEVWRU5UX0VSUk9SID0gMworICAgIH07CisKKyAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiBub3RpZnlpbmcgY2xpZW50IGFwcGxpY2F0aW9uIG9mIGEgY2hhbmdlIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIEFuIGVmZmVjdCBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucyBidXQgb25seSBvbmUgaGFzIHRoZSBjb250cm9sCisgICAgICogb2YgdGhlIGVuZ2luZSBhY3Rpdml0eSBhbmQgY29uZmlndXJhdGlvbiBhdCBhIHRpbWUuCisgICAgICogVGhlIEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBsb3NlcyBvcgorICAgICAqIHJldHJpZXZlcyB0aGUgY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZS4gTG9zcyBvZiBjb250cm9sIGhhcHBlbnMKKyAgICAgKiBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHRoZSB1c2Ugb2YgdGhlIGVuZ2luZSBieSBjcmVhdGluZyBhbiBBdWRpb0VmZmVjdCBmb3IKKyAgICAgKiB0aGUgc2FtZSBlZmZlY3QgdHlwZSBidXQgd2l0aCBhIGhpZ2hlciBwcmlvcml0eS4gQ29udHJvbCBpcyByZXR1cm5lZCB3aGVuIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBkZWxldGVzIGl0cyBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICogVGhlIEVWRU5UX0VOQUJMRV9TVEFUVVNfQ0hBTkdFRCBldmVudCBpcyByZWNlaXZlZCBieSBhbGwgYXBwbGljYXRpb25zIG5vdCBoYXZpbmcgdGhlCisgICAgICogY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZSB3aGVuIHRoZSBlZmZlY3QgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKiBUaGUgRVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQgZXZlbnQgaXMgcmVjZWl2ZWQgYnkgYWxsIGFwcGxpY2F0aW9ucyBub3QgaGF2aW5nIHRoZQorICAgICAqIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hlbiBhbiBlZmZlY3QgcGFyYW1ldGVyIGlzIGNoYW5nZWQuCisgICAgICogVGhlIEVWRU5UX0VSUk9SIGV2ZW50IGlzIHJlY2VpdmVkIHdoZW4gdGhlIG1lZGlhIHNlcnZlciBwcm9jZXNzIGRpZXMuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqCisgICAgICogZXZlbnQ6ICAgdHlwZSBvZiBldmVudCBub3RpZmllZCAoc2VlIGVudW0gQXVkaW9FZmZlY3Q6OmV2ZW50X3R5cGUpLgorICAgICAqIHVzZXI6ICAgIFBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBpbmZvOiAgICBQb2ludGVyIHRvIG9wdGlvbmFsIHBhcmFtZXRlciBhY2NvcmRpbmcgdG8gZXZlbnQgdHlwZToKKyAgICAgKiAgLSBFVkVOVF9DT05UUk9MX1NUQVRVU19DSEFOR0VEOiAgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbnRyb2wgaXMgZ3JhbnRlZCAodHJ1ZSkKKyAgICAgKiAgb3Igc3RvbGVuIChmYWxzZSkuCisgICAgICogIC0gRVZFTlRfRU5BQkxFX1NUQVRVU19DSEFOR0VEOiBib29sZWFuIGluZGljYXRpbmcgaWYgZWZmZWN0IGlzIG5vdyBlbmFibGVkICh0cnVlKQorICAgICAqICBvciBkaXNhYmxlZCAoZmFsc2UpLgorICAgICAqICAtIEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VEOiBwb2ludGVyIHRvIGEgZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlLgorICAgICAqICAtIEVWRU5UX0VSUk9SOiAgc3RhdHVzX3QgaW5kaWNhdGluZyB0aGUgZXJyb3IgKERFQURfT0JKRUNUIHdoZW4gbWVkaWEgc2VydmVyIGRpZXMpLgorICAgICAqLworCisgICAgdHlwZWRlZiB2b2lkICgqZWZmZWN0X2NhbGxiYWNrX3QpKGludDMyX3QgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCisKKyAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAgKiBBdWRpb0VmZmVjdCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5kIGNvbnRyb2xsaW5nIGFuIGVmZmVjdCBlbmdpbmUgZnJvbQorICAgICAqIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzLiBDcmVhdGluZyBhbiBBdWRpb0VmZmVjdCBvYmplY3Qgd2lsbCBjcmVhdGUgdGhlIGVmZmVjdCBlbmdpbmUKKyAgICAgKiBpbiB0aGUgQXVkaW9GbGluZ2VyIGlmIG5vIGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZXhpc3RzLiBJZiBvbmUgZXhpc3RzLCB0aGlzIGVuZ2luZQorICAgICAqIHdpbGwgYmUgdXNlZC4gVGhlIGFwcGxpY2F0aW9uIGNyZWF0aW5nIHRoZSBBdWRpb0VmZmVjdCBvYmplY3QgKG9yIGEgZGVyaXZlZCBjbGFzcyBsaWtlCisgICAgICogUmV2ZXJiIGZvciBpbnN0YW5jZSkgd2lsbCBlaXRoZXIgcmVjZWl2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIG9yIG5vdCwgZGVwZW5kaW5nCisgICAgICogb24gdGhlIHByaW9yaXR5IHBhcmFtZXRlci4gSWYgcHJpb3JpdHkgaXMgaGlnaGVyIHRoYW4gdGhlIHByaW9yaXR5IHVzZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgKiBlZmZlY3QgZW5naW5lIG93bmVyLCB0aGUgY29udHJvbCB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gdGhlIG5ldyBhcHBsaWNhdGlvbi4gT3RoZXJ3aXNlCisgICAgICogY29udHJvbCB3aWxsIHJlbWFpbiB0byB0aGUgcHJldmlvdXMgYXBwbGljYXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBhcHBsaWNhdGlvbiB3aWxsIGJlCisgICAgICogbm90aWZpZWQgb2YgY2hhbmdlcyBpbiBlZmZlY3QgZW5naW5lIHN0YXRlIG9yIGNvbnRyb2wgb3duZXJzaGlwIGJ5IHRoZSBlZmZlY3QgY2FsbGJhY2suCisgICAgICogQWZ0ZXIgY3JlYXRpbmcgdGhlIEF1ZGlvRWZmZWN0LCB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsIHRoZSBpbml0Q2hlY2soKSBtZXRob2QgYW5kCisgICAgICogY2hlY2sgdGhlIGNyZWF0aW9uIHN0YXR1cyBiZWZvcmUgdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUgKHNlZSBpbml0Q2hlY2soKSkuCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyB0byBiZSBhcHBsaWVkIHRvIGFuIEF1ZGlvVHJhY2sgb3IgTWVkaWFQbGF5ZXIgb25seSB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBtdXN0IHNwZWNpZnkgdGhlIGF1ZGlvIHNlc3Npb24gSUQgY29ycmVzcG9uZGluZyB0byB0aGlzIHBsYXllci4KKyAgICAgKi8KKworICAgIC8qIFNpbXBsZSBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBBdWRpb0VmZmVjdCgpOworCisKKyAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiB0eXBlOiAgdHlwZSBvZiBlZmZlY3QgY3JlYXRlZDogY2FuIGJlIG51bGwgaWYgdXVpZCBpcyBzcGVjaWZpZWQuIFRoaXMgY29ycmVzcG9uZHMgdG8KKyAgICAgKiAgICAgICAgdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QuCisgICAgICogdXVpZDogIFV1aWQgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLiBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8KKyAgICAgKiAgICAgICAgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqIHByaW9yaXR5OiAgICByZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZSB2YWx1ZXMKKyAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCisgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLiBJZiAwLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCisgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gSWYgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCisgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCisgICAgICogb3V0cHV0OiAgSEFMIGF1ZGlvIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBlZmZlY3QgbXVzdCBiZSBhdHRhY2hlZC4gTGVhdmUgYXQgMCBmb3IKKyAgICAgKiAgICAgIGF1dG9tYXRpYyBvdXRwdXQgc2VsZWN0aW9uIGJ5IEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKworICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IDAsCisgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gMCwKKyAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMAorICAgICAgICAgICAgICAgICAgKTsKKworICAgIC8qIENvbnN0cnVjdG9yLgorICAgICAqICAgICAgU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncworICAgICAqLworICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gMCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCisgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCisgICAgICogVGhlIGVmZmVjdCBlbmdpbmUgaXMgYWxzbyBkZXN0cm95ZWQgaWYgdGhpcyBBdWRpb0VmZmVjdCB3YXMgdGhlIGxhc3QgY29udHJvbGxpbmcKKyAgICAgKiB0aGUgZW5naW5lLgorICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvRWZmZWN0KCk7CisKKyAgICAvKiBJbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9FZmZlY3QuCisgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAqICAtIE5PX0VSUk9SIG9yIEFMUkVBRFlfRVhJU1RTOiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCisgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9FZmZlY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlcgorICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKKyAgICAqICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9FZmZlY3QuIFRoaXMgbXVzdCBiZSBjaGVja2VkCisgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb0VmZmVjdCBBUEkuCisgICAgICogaW5pdENoZWNrKCkgY2FuIHJldHVybjoKKyAgICAgKiAgLSBOT19FUlJPUjogICAgdGhlIGVmZmVjdCBlbmdpbmUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBoYXMgY29udHJvbC4KKyAgICAgKiAgLSBBTFJFQURZX0VYSVNUUzogdGhlIGVmZmVjdCBlbmdpbmUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYnV0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgICBoYXZlIGNvbnRyb2wuCisgICAgICogIC0gTk9fSU5JVDogICAgIHRoZSBlZmZlY3QgY3JlYXRpb24gZmFpbGVkLgorICAgICAqCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKKworCisgICAgLyogUmV0dXJucyB0aGUgdW5pcXVlIGVmZmVjdCBJZCBmb3IgdGhlIGNvbnRyb2xsZWQgZWZmZWN0IGVuZ2luZS4gVGhpcyBJRCBpcyB1bmlxdWUKKyAgICAgKiBzeXN0ZW0gd2lkZSBhbmQgaXMgdXNlZCBmb3IgaW5zdGFuY2UgaW4gdGhlIGNhc2Ugb2YgYXV4aWxpYXJ5IGVmZmVjdHMgdG8gYXR0YWNoCisgICAgICogdGhlIGVmZmVjdCB0byBhbiBBdWRpb1RyYWNrIG9yIE1lZGlhUGxheWVyLgorICAgICAqCisgICAgICovCisgICAgICAgICAgICBpbnQzMl90ICAgICBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgLyogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlZmZlY3QgKHNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGluIEVmZmVjdEFwaS5oKS4KKyAgICAgKi8KKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcigpIGNvbnN0OworCisgICAgLyogUmV0dXJucyBlZmZlY3QgY29udHJvbCBwcmlvcml0eSBvZiB0aGlzIEF1ZGlvRWZmZWN0IG9iamVjdC4KKyAgICAgKi8KKyAgICAgICAgICAgIGludDMyX3QgICAgIHByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gbVByaW9yaXR5OyB9CisKKworICAgIC8qIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICBlbmFibGVkOiByZXF1ZXN0ZWQgZW5hYmxlIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgb3IgdGhlCisgICAgICogIGVmZmVjdCBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICBib29sICAgICAgICBnZXRFbmFibGVkKCkgY29uc3Q7CisKKyAgICAvKiBTZXRzIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyIG9yIHZhbHVlLgorICAgICAqICAtIERFQURfT0JKRUNUOiB0aGUgZWZmZWN0IGVuZ2luZSBoYXMgYmVlbiBkZWxldGVkLgorICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSk7CisKKyAgICAvKiBQcmVwYXJlIGEgbmV3IHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdpbGwgYmUgc2V0IGJ5IG5leHQgY2FsbCB0bworICAgICAqIHNldFBhcmFtZXRlckNvbW1pdCgpLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgbXVsdGlwbGUgcGFyYW1ldGVycworICAgICAqIGluIGEgc3luY2hyb25vdXMgbWFubmVyIG9yIHRvIGF2b2lkIG11bHRpcGxlIGJpbmRlciBjYWxscyBmb3IgZWFjaAorICAgICAqIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICogIC0gTk9fTUVNT1JZOiBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSBpbiBzaGFyZWQgbWVtb3J5IHVzZWQgZm9yIGRlZmVycmVkIHBhcmFtZXRlcgorICAgICAqICBzZXR0aW5nLgorICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyRGVmZXJyZWQoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKKworICAgICAvKiBDb21taXQgYWxsIHBhcmFtZXRlciB2YWx1ZXMgcHJldmlvdXNseSBwcmVwYXJlZCBieSBzZXRQYXJhbWV0ZXJEZWZlcnJlZCgpLgorICAgICAgKgorICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgKiAgICAgbm9uZQorICAgICAgKgorICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogTm8gbmV3IHBhcmFtZXRlciB2YWx1ZXMgcmVhZHkgZm9yIGNvbW1pdC4KKyAgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyIG9yIHZhbHVlOiB0aGVyZSBpcyBubyBpbmRpY2F0aW9uCisgICAgICAqICAgICBhcyB0byB3aGljaCBvZiB0aGUgcGFyYW1ldGVycyBjYXVzZWQgdGhpcyBlcnJvci4KKyAgICAgICogIC0gREVBRF9PQkpFQ1Q6IHRoZSBlZmZlY3QgZW5naW5lIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyQ29tbWl0KCk7CisKKyAgICAvKiBHZXRzIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogdGhlIEF1ZGlvRWZmZWN0IHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLgorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgaWRlbnRpZmllci4KKyAgICAgKiAgLSBERUFEX09CSkVDVDogdGhlIGVmZmVjdCBlbmdpbmUgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgKi8KKyAgICAgdmlydHVhbCBzdGF0dXNfdCAgIGdldFBhcmFtZXRlcihlZmZlY3RfcGFyYW1fdCAqcGFyYW0pOworCisgICAgIC8qIFNlbmRzIGEgY29tbWFuZCBhbmQgcmVjZWl2ZXMgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCisgICAgICAqICAgICBTZWUgRWZmZWN0QXBpLmggZm9yIGRldGFpbHMgb24gZWZmZWN0IGNvbW1hbmQoKSBmdW5jdGlvbiwgdmFsaWQgY29tbWFuZCBjb2RlcworICAgICAgKiAgICAgYW5kIGZvcm1hdHMuCisgICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSk7CisKKworICAgICAvKgorICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9ucy4KKyAgICAgICovCisKKyAgICAgLyogQ29udmVydHMgdGhlIHN0cmluZyBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGVmZmVjdF91dWlkX3QKKyAgICAgICogcG9pbnRlZCB0byBieSBzZWNvbmQgYXJndW1lbnQKKyAgICAgICovCisgICAgIHN0YXRpYyBzdGF0dXNfdCBzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKTsKKyAgICAgLyogQ29udmVydHMgdGhlIGVmZmVjdF91dWlkX3QgcG9pbnRlZCB0byBieSBmaXJzdCBhcmd1bWVudCB0byB0aGUKKyAgICAgICogc3RyaW5nIHBhc3NlZCBhcyBzZWNvbmQgYXJndW1lbnQKKyAgICAgICovCisgICAgIHN0YXRpYyBzdGF0dXNfdCBndWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqZ3VpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKKworcHJvdGVjdGVkOgorICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtRW5hYmxlZDsgICAgICAgICAgIC8vIGVuYWJsZSBzdGF0ZQorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOyAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5OyAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKKyAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsgICAgICAgICAgICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgY2hhbmdlcyBub3RpZmljYXRpb25zCisgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsgICAgICAgICAgLy8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yOyAgICAgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkOyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAorCitwcml2YXRlOgorCisgICAgIC8vIEltcGxlbWVudHMgdGhlIElFZmZlY3RDbGllbnQgaW50ZXJmYWNlCisgICAgY2xhc3MgRWZmZWN0Q2xpZW50IDogcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0Q2xpZW50LCAgcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICBFZmZlY3RDbGllbnQoQXVkaW9FZmZlY3QgKmVmZmVjdCkgOiBtRWZmZWN0KGVmZmVjdCl7fQorCisgICAgICAgIC8vIElFZmZlY3RDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHttRWZmZWN0LT5iaW5kZXJEaWVkKCk7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9FZmZlY3QgKm1FZmZlY3Q7CisgICAgfTsKKworCisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdENsaWVudDsKKworICAgIC8vIElFZmZlY3RDbGllbnQKKyAgICB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpOworICAgIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpOworICAgIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgdm9pZCBiaW5kZXJEaWVkKCk7CisKKworICAgIHNwPElFZmZlY3Q+ICAgICAgICAgICAgIG1JRWZmZWN0OyAgICAgICAgICAgLy8gSUVmZmVjdCBiaW5kZXIgaW50ZXJmYWNlCisgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZworICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKK307CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9FRkZFQ1RfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDkyYmMxMjYuLjM4ZTNkNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTEwMCw2ICsxMDAsMTkgQEAKIAogICAgIHR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAKKyAgICAvKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZyYW1lIGNvdW50IHJlcXVpcmVkIGZvciB0aGUgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZgorICAgICAqIGFuIEF1ZGlvUmVjb3JkIG9iamVjdC4KKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCisgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICovCisKKyAgICAgc3RhdGljIHN0YXR1c190IGdldE1pbkZyYW1lQ291bnQoaW50KiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KTsKKwogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1JlY29yZC4gTm8gY29ubmVjdGlvbiB3aXRoCiAgICAgICogQXVkaW9GbGluZ2VyIHRha2VzIHBsYWNlLgogICAgICAqLwpAQCAtMTQyLDcgKzE1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvUmVjb3JkIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTE2OCw3ICsxODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtMjcwLDYgKzI4NSwxNiBAQAogICAgICAqLwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0SW5wdXQoKTsKIAorICAgIC8qIHJldHVybnMgdGhlIGF1ZGlvIHNlc3Npb24gSUQgYXNzb2NpYXRlZCB0byB0aGlzIEF1ZGlvUmVjb3JkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgbm9uZS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlOgorICAgICAqICBBdWRpb1JlY29yZCBzZXNzaW9uIElELgorICAgICAqLworICAgICAgICAgICAgaW50ICAgIGdldFNlc3Npb25JZCgpOworCiAgICAgLyogb2J0YWlucyBhIGJ1ZmZlciBvZiAiZnJhbWVDb3VudCIgZnJhbWVzLiBUaGUgYnVmZmVyIG11c3QgYmUKICAgICAgKiBmaWxsZWQgZW50aXJlbHkuIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zCiAgICAgICogU1RPUFBFRCBpbnN0ZWFkIG9mIE5PX0VSUk9SIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGJ1ZmZlcnMgYXZhaWxsYWJsZSwKQEAgLTM1Niw2ICszODEsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IGQwY2NjNTAuLjlmZDkwNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE2OCw2ICsxNjgsMTUgQEAKICAgICAgICAgVFhfRElTQUJMRSAgICA9IDAKICAgICB9OwogCisgICAgLy8gc3BlY2lhbCBhdWRpbyBzZXNzaW9uIHZhbHVlcworICAgIGVudW0gYXVkaW9fc2Vzc2lvbnMgeworICAgICAgICBTRVNTSU9OX09VVFBVVF9TVEFHRSA9IC0xLCAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhciBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAwKQorICAgICAgICBTRVNTSU9OX09VVFBVVF9NSVggPSAwLCAgICAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGFwcGxpZWQgdG8gb3V0cHV0IG1peC4gVGhlc2UgZWZmZWN0cyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW92ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIDApCisgICAgfTsKKwogICAgIC8qIFRoZXNlIGFyZSBzdGF0aWMgbWV0aG9kcyB0byBjb250cm9sIHRoZSBzeXN0ZW0td2lkZSBBdWRpb0ZsaW5nZXIKICAgICAgKiBvbmx5IHByaXZpbGVnZWQgcHJvY2Vzc2VzIGNhbiBoYXZlIGFjY2VzcyB0byB0aGVtCiAgICAgICovCkBAIC0yMzQsNiArMjQzLDggQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywgaW50IHN0cmVhbSA9IERFRkFVTFQpOwogCiAgICAgc3RhdGljIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKTsKKworICAgIHN0YXRpYyBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKTsKICAgICAvLwogICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UKICAgICAvLwpAQCAtMzUxLDggKzM2MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncyBmbGFncyA9IE9VVFBVVF9GTEFHX0lORElSRUNUKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCkBAIC0zNjgsNiArMzgzLDE2IEBACiAgICAgc3RhdGljIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgKmluZGV4KTsKIAorICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1fdHlwZSBzdHJlYW0pOworCisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisKICAgICBzdGF0aWMgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCAxNGIzMGFlLi40NDc1ZDRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMTAyLDYgKzEwMiwxNyBAQAogCiAgICAgdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKIAorICAgIC8qIFJldHVybnMgdGhlIG1pbmltdW0gZnJhbWUgY291bnQgcmVxdWlyZWQgZm9yIHRoZSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mCisgICAgICogYW4gQXVkaW9UcmFjayBvYmplY3QuCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAorICAgICAqLworCisgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KGludCogZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUgICAgICA9LTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwKTsKKwogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKICAgICAgKiBBdWRpb0ZsaW5nZXIgdGFrZXMgcGxhY2UuCiAgICAgICovCkBAIC0xMzgsNyArMTQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDApOwogCiAgICAgLyogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLiBXaXRoIHRoaXMgY29uc3RydWN0b3IsCiAgICAgICogVGhlIFBDTSBkYXRhIHRvIGJlIHJlbmRlcmVkIGJ5IEF1ZGlvVHJhY2sgaXMgcGFzc2VkIGluIGEgc2hhcmVkIG1lbW9yeSBidWZmZXIKQEAgLTE1Nyw3ICsxNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1RyYWNrIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KICAgICAgKiBBbHNvIGRlc3Ryb3lzIGFsbCByZXNvdXJjZXMgYXNzb3RpYXRlZCB3aXRoIHRoZSBBdWRpb1RyYWNrLgpAQCAtMTgyLDcgKzE5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDApOwogCiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1RyYWNrLiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtMjM5LDEwICsyNTMsMTcgQEAKIAogCiAgICAgLyogc2V0IHZvbHVtZSBmb3IgdGhpcyB0cmFjaywgbW9zdGx5IHVzZWQgZm9yIGdhbWVzJyBzb3VuZCBlZmZlY3RzCisgICAgICogbGVmdCBhbmQgcmlnaHQgdm9sdW1lcy4gTGV2ZWxzIG11c3QgYmUgPD0gMS4wLgogICAgICAqLwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBnZXRWb2x1bWUoZmxvYXQqIGxlZnQsIGZsb2F0KiByaWdodCk7CiAKKyAgICAvKiBzZXQgdGhlIHNlbmQgbGV2ZWwgZm9yIHRoaXMgdHJhY2suIEFuIGF1eGlsaWFyeSBlZmZlY3Qgc2hvdWxkIGJlIGF0dGFjaGVkCisgICAgICogdG8gdGhlIHRyYWNrIHdpdGggYXR0YWNoRWZmZWN0KCkuIExldmVsIG11c3QgYmUgPD0gMS4wLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGdldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCogbGV2ZWwpOworCiAgICAgLyogc2V0IHNhbXBsZSByYXRlIGZvciB0aGlzIHRyYWNrLCBtb3N0bHkgdXNlZCBmb3IgZ2FtZXMnIHNvdW5kIGVmZmVjdHMKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUoaW50IHNhbXBsZVJhdGUpOwpAQCAtMzQwLDYgKzM2MSwzMSBAQAogICAgICAqLwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCk7CiAKKyAgICAvKiByZXR1cm5zIHRoZSB1bmlxdWUgSUQgYXNzb2NpYXRlZCB0byB0aGlzIHRyYWNrLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgbm9uZS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlOgorICAgICAqICBBdWRpb1RyYWNrIElELgorICAgICAqLworICAgICAgICAgICAgaW50ICAgIGdldFNlc3Npb25JZCgpOworCisKKyAgICAvKiBBdHRhY2ggdHJhY2sgYXV4aWxpYXJ5IG91dHB1dCB0byBzcGVjaWZpZWQgZWZmZWN0LiBVc2VkIGVmZmVjdElkID0gMAorICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBlZmZlY3RJZDogIGVmZmVjdElkIG9idGFpbmVkIGZyb20gQXVkaW9FZmZlY3Q6OmlkKCkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogdGhlIGVmZmVjdCBpcyBub3QgYW4gYXV4aWxpYXJ5IGVmZmVjdC4KKyAgICAgKiAgLSBCQURfVkFMVUU6IFRoZSBzcGVjaWZpZWQgZWZmZWN0IElEIGlzIGludmFsaWQKKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOworCiAgICAgLyogb2J0YWlucyBhIGJ1ZmZlciBvZiAiZnJhbWVDb3VudCIgZnJhbWVzLiBUaGUgYnVmZmVyIG11c3QgYmUKICAgICAgKiBmaWxsZWQgZW50aXJlbHkuIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zCiAgICAgICogU1RPUFBFRCBpbnN0ZWFkIG9mIE5PX0VSUk9SIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGJ1ZmZlcnMgYXZhaWxsYWJsZSwKQEAgLTM5OCwxMyArNDQ0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VGcmFtZUNvdW50KTsKIAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZVsyXTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7CkBAIC00MjAsNyArNDY4LDggQEAKIAogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsgLy8gcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaCBub3RpZmljYXRpb24gY2FsbGJhY2sKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsKQEAgLTQyOSw2ICs0NzgsOCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmYjQzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKQEAgLTAsMCArMSw3OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUQVBJX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoZSBlZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBlYWNoIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24uIEl0IGNvbnNpc3RzIG9mCisvLyBhIHNldCBvZiBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbmZpZ3VyYXRpb24sIGFjdGl2YXRpb24gYW5kIHByb2Nlc3Mgb2YgdGhlIGVuZ2luZS4KKy8vIFRoZSBmdW5jdGlvbnMgYXJlIGdyb3VwZWQgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBlZmZlY3RfaW50ZXJmYWNlX3M6CisvLyAgICBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHsKKy8vICAgICAgICBlZmZlY3RfcHJvY2Vzc190IHByb2Nlc3M7CisvLyAgICAgICAgZWZmZWN0X2NvbW1hbmRfdCBjb21tYW5kOworLy8gICAgfTsKKworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3Q6IEVmZmVjdCBjb250cm9sIGludGVyZmFjZSBoYW5kbGUuCisvLyBUaGUgZWZmZWN0X2ludGVyZmFjZV90IHNlcnZlcyB0d28gcHVycG9zZXMgcmVnYXJkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWZmZWN0IGVuZ2luZToKKy8vIC0gMSBpdCBpcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gYW4gZWZmZWN0X2ludGVyZmFjZV9zIHN0cnVjdHVyZSB3aGVyZSB0aGUgZnVuY3Rpb25zCisvLyBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGZvciBhIHBhcnRpY3VsYXIgZWZmZWN0IGFyZSBsb2NhdGVkLgorLy8gLSAyIGl0IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBlZmZlY3QgaW5zdGFuY2UuCisvLyBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gaW4gdGhlIGVmZmVjdCBsaWJyYXJ5IHdvdWxkIGRlZmluZSBhIHN0cnVjdHVyZSBhcyBmb2xsb3dzOgorLy8gc3RydWN0IGVmZmVjdF9tb2R1bGVfcyB7CisvLyAgICAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKKy8vICAgICAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworLy8gICAgICAgIGVmZmVjdF9jb250ZXh0X3QgY29udGV4dDsKKy8vIH0KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFZmZlY3RDcmVhdGUoKSBmdW5jdGlvbiB3b3VsZCB0aGVuIGFsbG9jYXRlIGEgc3RydWN0dXJlIG9mIHRoaXMKKy8vIHR5cGUgYW5kIHJldHVybiBpdHMgYWRkcmVzcyBhcyBlZmZlY3RfaW50ZXJmYWNlX3QKK3R5cGVkZWYgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKmVmZmVjdF9pbnRlcmZhY2VfdDsKKworCisvLyBFZmZlY3QgQVBJIHZlcnNpb24gMS4wCisjZGVmaW5lIEVGRkVDVF9BUElfVkVSU0lPTiAweDAxMDAgLy8gRm9ybWF0IDB4TU1tbSBNTTogTWFqb3IgdmVyc2lvbiwgbW06IG1pbm9yIHZlcnNpb24KKworLy8gTWF4aW11bSBsZW5ndGggb2YgY2hhcmFjdGVyIHN0cmluZ3MgaW4gc3RydWN0dXJlcyBkZWZpbmVzIGJ5IHRoaXMgQVBJLgorI2RlZmluZSBFRkZFQ1RfU1RSSU5HX0xFTl9NQVggNjQKKworLy8KKy8vLS0tIEVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBlZmZlY3RfZGVzY3JpcHRvcl90CisvLworCisvLyBVbmlxdWUgZWZmZWN0IElEIChjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgorLy8gIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbCkKKy8vIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIGJvdGggInR5cGUiIGFuZCAidXVpZCIgZmllbGRzIG9mIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisvLyAtIFdoZW4gdXNlZCBmb3IgZWZmZWN0IHR5cGUgYW5kIHRoZSBlbmdpbmUgaXMgaW1wbGVtZW50aW5nIGFuZCBlZmZlY3QgY29ycmVzcG9uZGluZyB0byBhIHN0YW5kYXJkCisvLyBPcGVuU0wgRVMgaW50ZXJmYWNlLCB0aGlzIElEIG11c3QgYmUgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5TTEVTX0lJRC5oIGZvciB0aGF0IGludGVyZmFjZS4KKy8vIC0gV2hlbiB1c2VkIGFzIHV1aWQsIGl0IHNob3VsZCBiZSBhIHVuaXF1ZSBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfdXVpZF9zIHsKKyAgICB1aW50MzJfdCB0aW1lTG93OworICAgIHVpbnQxNl90IHRpbWVNaWQ7CisgICAgdWludDE2X3QgdGltZUhpQW5kVmVyc2lvbjsKKyAgICB1aW50MTZfdCBjbG9ja1NlcTsKKyAgICB1aW50OF90IG5vZGVbNl07Cit9IGVmZmVjdF91dWlkX3Q7CisKKy8vIE5VTEwgVVVJRCBkZWZpbml0aW9uIChtYXRjaGVzIFNMX0lJRF9OVUxMXykKKyNkZWZpbmUgRUZGRUNUX1VVSURfSU5JVElBTElaRVIgeyAweGVjNzE3OGVjLCAweGU1ZTEsIDB4NDQzMiwgMHhhM2Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDQ2LCAweDU3LCAweGU2LCAweDc5LCAweDUyLCAweDEwIH0gfQorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgRUZGRUNUX1VVSURfTlVMTF8gPSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUjsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBFRkZFQ1RfVVVJRF9OVUxMID0gJkVGRkVDVF9VVUlEX05VTExfOworY29uc3QgY2hhciAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTExfU1RSID0gImVjNzE3OGVjLWU1ZTEtNDQzMi1hM2Y0LTQ2NTdlNjc5NTIxMCI7CisKKy8vIFRoZSBlZmZlY3QgZGVzY3JpcHRvciBjb250YWlucyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZmFjaWxpdGF0ZSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGVmZmVjdAorLy8gZW5naW5lcyBwcmVzZW50IGluIGEgbGlicmFyeS4KK3R5cGVkZWYgc3RydWN0IGVmZmVjdF9kZXNjcmlwdG9yX3MgeworICAgIGVmZmVjdF91dWlkX3QgdHlwZTsgICAgIC8vIFVVSUQgb2YgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7ICAgICAvLyBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24KKyAgICB1aW50MTZfdCBhcGlWZXJzaW9uOyAgICAvLyBWZXJzaW9uIG9mIHRoZSBlZmZlY3QgQVBJIGltcGxlbWVudGVkOiBtYXRjaGVzIEVGRkVDVF9BUElfVkVSU0lPTgorICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgIC8vIGVmZmVjdCBlbmdpbmUgY2FwYWJpbGl0aWVzL3JlcXVpcmVtZW50cyBmbGFncyAoc2VlIGJlbG93KQorICAgIHVpbnQxNl90IGNwdUxvYWQ7ICAgICAgIC8vIENQVSBsb2FkIGluZGljYXRpb24gKHNlZSBiZWxvdykKKyAgICB1aW50MTZfdCBtZW1vcnlVc2FnZTsgICAvLyBEYXRhIE1lbW9yeSB1c2FnZSAoc2VlIGJlbG93KQorICAgIGNoYXIgICAgbmFtZVtFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lCisgICAgY2hhciAgICBpbXBsZW1lbnRvcltFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgICAvLyBodW1hbiByZWFkYWJsZSBlZmZlY3QgaW1wbGVtZW50b3IgbmFtZQorfSBlZmZlY3RfZGVzY3JpcHRvcl90OworCisvLyBDUFUgbG9hZCBhbmQgbWVtb3J5IHVzYWdlIGluZGljYXRpb246IGVhY2ggZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhbiBpbmRpY2F0aW9uIG9mCisvLyBpdHMgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgZm9yIHRoZSBhdWRpbyBlZmZlY3QgZnJhbWV3b3JrIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZWZmZWN0cworLy8gaW5zdGFudGlhdGVkIGF0IGEgZ2l2ZW4gdGltZSBvbiBhIGdpdmVuIHBsYXRmb3JtLgorLy8gVGhlIENQVSBsb2FkIGlzIGV4cHJlc3NlZCBpbiAwLjEgTUlQUyB1bml0cyBhcyBlc3RpbWF0ZWQgb24gYW4gQVJNOUUgY29yZSAoQVJNdjVURSkgd2l0aCAwIFdTLgorLy8gVGhlIG1lbW9yeSB1c2FnZSBpcyBleHByZXNzZWQgaW4gS0IgYW5kIGluY2x1ZGVzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeQorCisvLyBEZWZpbml0aW9ucyBmb3IgZmxhZ3MgZmllbGQgb2YgZWZmZWN0IGRlc2NyaXB0b3IuCisvLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICB8IGJpdHMgICAgICB8IHZhbHVlcworLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IGNvbm5lY3Rpb24gbW9kZSAgICAgICAgICAgfCAwLi4xICAgICAgfCAwIGluc2VydDogYWZ0ZXIgdHJhY2sgcHJvY2VzcworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgYXV4aWxpYXJ5OiBjb25uZWN0IHRvIHRyYWNrIGF1eGlsaWFyeQorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICBvdXRwdXQgYW5kIHVzZSBzZW5kIGxldmVsCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiByZXBsYWNlOiByZXBsYWNlcyB0cmFjayBwcm9jZXNzIGZ1bmN0aW9uOworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgbXVzdCBpbXBsZW1lbnQgU1JDLCB2b2x1bWUgYW5kIG1vbm8gdG8gc3RlcmVvLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKKy8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgfCBpbnNlcnRpb24gcHJlZmVyZW5jZSAgICAgIHwgMi4uNCAgICAgIHwgMCBub25lCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBmaXJzdCBvZiB0aGUgY2hhaW4KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIGxhc3Qgb2YgdGhlIGNoYWluCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBleGNsdXNpdmUgKG9ubHkgZWZmZWN0IGluIHRoZSBpbnNlcnQgY2hhaW4pCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNC4uNyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFZvbHVtZSBtYW5hZ2VtZW50ICAgICAgICAgfCA1Li42ICAgICAgfCAwIG5vbmUKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcXVpcmVzIHZvbHVtZSBpbmRpY2F0aW9uCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IERldmljZSBpbmRpY2F0aW9uICAgICAgICAgfCA3Li44ICAgICAgfCAwIG5vbmUKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGRldmljZSB1cGRhdGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFNhbXBsZSBpbnB1dCBtb2RlICAgICAgICAgfCA5Li4xMCAgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3QgaW5wdXQuCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBpbnB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFNhbXBsZSBvdXRwdXQgbW9kZSAgICAgICAgfCAxMS4uMTIgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3Qgb3V0cHV0CisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBvdXRwdXQgbW9kZXMgYXJlIHN1cHBvcnRlZAorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKKy8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgfCBIYXJkd2FyZSBhY2NlbGVyYXRpb24gICAgIHwgMTMuLjE1ICAgIHwgMCBObyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIG5vbiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHJlYWRzIHRoZSBzYW1wbGVzLCBzZW5kIHRoZW0gdG8gSFcgYWNjZWxlcmF0ZWQKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGVmZmVjdCBwcm9jZXNzb3IsIHJlYWRzIGJhY2sgdGhlIHByb2Nlc3NlZCBzYW1wbGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBhbmQgcmV0dXJucyB0aGVtIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgdHVubmVsZWQgaHcgYWNjZWxlcmF0aW9uOiB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIGlzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0cmFuc3BhcmVudC4gVGhlIGVmZmVjdCBpbnRlcmZhY2UgaXMgb25seSB1c2VkIHRvCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb250cm9sIHRoZSBlZmZlY3QgZW5naW5lLiBUaGlzIG1vZGUgaXMgcmVsZXZhbnQgZm9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBnbG9iYWwgZWZmZWN0cyBhY3R1YWxseSBhcHBsaWVkIGJ5IHRoZSBhdWRpbworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgaGFyZHdhcmUgb24gdGhlIG91dHB1dCBzdHJlYW0uCisvLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHwgQXVkaW8gTW9kZSBpbmRpY2F0aW9uICAgICB8IDE2Li4xNyAgICB8IDAgbm9uZQorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gbW9kZSB1cGRhdGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW5zZXJ0IG1vZGUKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFICAgICAgICAweDAwMDAwMDAyCisKKy8vIEluc2VydCBwcmVmZXJlbmNlCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLICAgICAgICAgMHgwMDAwMDAxQworI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFICAgIDB4MDAwMDAwMEMKKworCisvLyBWb2x1bWUgY29udHJvbAorI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSyAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKKworLy8gRGV2aWNlIGluZGljYXRpb24KKyNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0sgICAgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKKworLy8gU2FtcGxlIGlucHV0IG1vZGVzCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX01BU0sgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1QgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVIgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEggICAgICAgICAgMHgwMDAwMDQwMAorCisvLyBTYW1wbGUgb3V0cHV0IG1vZGVzCisjZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLICAgICAgICAgIDB4MDAwMDE4MDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVIgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9CT1RIICAgICAgICAgIDB4MDAwMDEwMDAKKworLy8gSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGUKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0sgICAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0lNUExFICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgICAgICAgIDB4MDAwMDQwMDAKKworLy8gQXVkaW8gbW9kZSBpbmRpY2F0aW9uCisjZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSyAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX05PTkUgICAgICAweDAwMDAwMDAwCisKKy8vIEZvcndhcmQgZGVmaW5pdGlvbiBvZiB0eXBlIGF1ZGlvX2J1ZmZlcl90Cit0eXBlZGVmIHN0cnVjdCBhdWRpb19idWZmZXJfcyBhdWRpb19idWZmZXJfdDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgcHJvY2VzcworLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4gVGFrZXMgaW5wdXQgc2FtcGxlcyBhcyBzcGVjaWZpZWQKKy8vICAgICAgICAgIChjb3VudCBhbmQgbG9jYXRpb24pIGluIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBvdXRwdXQgcHJvY2Vzc2VkCisvLyAgICAgICAgICBzYW1wbGVzIGFzIHNwZWNpZmllZCBpbiBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IuIElmIHRoZSBidWZmZXIgZGVzY3JpcHRvcgorLy8gICAgICAgICAgaXMgbm90IHNwZWNpZmllZCB0aGUgZnVuY3Rpb24gbXVzdCB1c2UgZWl0aGVyIHRoZSBidWZmZXIgb3IgdGhlCisvLyAgICAgICAgICBidWZmZXIgcHJvdmlkZXIgZnVuY3Rpb24gaW5zdGFsbGVkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgorLy8gICAgICAgICAgVGhlIGVmZmVjdCBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYWZ0ZXIgdGhlIEVGRkVDVF9DTURfRU5BQkxFCisvLyAgICAgICAgICBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCB1bnRpbCB0aGUgRUZGRUNUX0NNRF9ESVNBQkxFIGlzIHJlY2VpdmVkLiBXaGVuIHRoZSBlbmdpbmUKKy8vICAgICAgICAgIHJlY2VpdmVzIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgY29tbWFuZCBpdCBzaG91bGQgdHVybiBvZmYgdGhlIGVmZmVjdCBncmFjZWZ1bGx5CisvLyAgICAgICAgICBhbmQgd2hlbiBkb25lIGluZGljYXRlIHRoYXQgaXQgaXMgT0sgdG8gc3RvcCBjYWxsaW5nIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYnkKKy8vICAgICAgICAgIHJldHVybmluZyB0aGUgLUVOT0RBVEEgc3RhdHVzLgorLy8KKy8vICAgIE5PVEU6IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlICJyZWFsLXRpbWUgc2FmZSIgdGhhdCBpcworLy8gICAgICBpdCBzaG91bGQgbm90IHBlcmZvcm0gYmxvY2tpbmcgY2FsbHM6IG1hbGxvYy9mcmVlLCBzbGVlcCwgcmVhZC93cml0ZS9vcGVuL2Nsb3NlLAorLy8gICAgICBwdGhyZWFkX2NvbmRfd2FpdC9wdGhyZWFkX211dGV4X2xvY2suLi4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCisvLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHJlYWQgc2FtcGxlcyB0byBwcm9jZXNzLgorLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KKy8vCisvLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHdyaXRlIHByb2Nlc3NlZCBzYW1wbGVzLgorLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREFUQSB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCB0aGUgZGlzYWJsZSBwaGFzZSBhbmQgdGhlIGZyYW1ld29yaworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHN0b3AgY2FsbGluZyBwcm9jZXNzKCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBpbnB1dC9vdXRwdXQgYnVmZmVyIGRlc2NyaXB0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X3Byb2Nlc3NfdCkoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgY29tbWFuZAorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCisvLyAgICAgICAgICBjbWRDb2RlOiAgICBjb21tYW5kIGNvZGU6IHRoZSBjb21tYW5kIGNhbiBiZSBhIHN0YW5kYXJkaXplZCBjb21tYW5kIGRlZmluZWQgaW4KKy8vICAgICAgICAgICAgICBlZmZlY3RfY29tbWFuZF9lIChzZWUgYmVsb3cpIG9yIGEgcHJvcHJpZXRhcnkgY29tbWFuZC4KKy8vICAgICAgICAgIGNtZFNpemU6ICAgIHNpemUgb2YgY29tbWFuZCBpbiBieXRlcworLy8gICAgICAgICAgcENtZERhdGE6ICAgcG9pbnRlciB0byBjb21tYW5kIGRhdGEKKy8vICAgICAgICAgIHBSZXBseURhdGE6IHBvaW50ZXIgdG8gcmVwbHkgZGF0YQorLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHJlcGx5U2l6ZTogbWF4aW11bSBzaXplIG9mIHJlcGx5IGRhdGEgYXMgaW5wdXQKKy8vICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBzaXplIG9mIHJlcGx5IGRhdGEgYXMgb3V0cHV0CisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgICAgcmV0dXJuZWQgdmFsdWU6IDAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBjb21tYW5kL3JlcGx5IHNpemUgb3IgZm9ybWF0IGFjY29yZGluZyB0byBjb21tYW5kIGNvZGUKKy8vICAgICAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gaW5kaWNhdGUgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgdGhpcworLy8gICAgICAgICAgICAgIEFQSSBzcGVjaWZpY2F0aW9uLiBTdGF0dXMgcmVsYXRlZCB0byB0aGUgZXhlY3V0aW9uIG9mIGEgcGFydGljdWxhciBjb21tYW5kIHNob3VsZCBiZQorLy8gICAgICAgICAgICAgIGluZGljYXRlZCBhcyBwYXJ0IG9mIHRoZSByZXBseSBmaWVsZC4KKy8vCisvLyAgICAgICAgICAqcFJlcGx5RGF0YSB1cGRhdGVkIHdpdGggY29tbWFuZCByZXNwb25zZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfY29tbWFuZF90KShlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisKKworLy8gRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KK3N0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgeworICAgIGVmZmVjdF9wcm9jZXNzX3QgcHJvY2VzczsKKyAgICBlZmZlY3RfY29tbWFuZF90IGNvbW1hbmQ7Cit9OworCisKKy8vCisvLy0tLSBTdGFuZGFyZGl6ZWQgY29tbWFuZCBjb2RlcyBmb3IgY29tbWFuZCgpIGZ1bmN0aW9uCisvLworZW51bSBlZmZlY3RfY29tbWFuZF9lIHsKKyAgIEVGRkVDVF9DTURfSU5JVCwgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZWZmZWN0IGVuZ2luZQorICAgRUZGRUNUX0NNRF9DT05GSUdVUkUsICAgICAgICAgICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgKHNlZSBlZmZlY3RfY29uZmlnX3QpCisgICBFRkZFQ1RfQ01EX1JFU0VULCAgICAgICAgICAgICAgICAvLyByZXNldCBlZmZlY3QgZW5naW5lCisgICBFRkZFQ1RfQ01EX0VOQUJMRSwgICAgICAgICAgICAgICAvLyBlbmFibGUgZWZmZWN0IHByb2Nlc3MKKyAgIEVGRkVDVF9DTURfRElTQUJMRSwgICAgICAgICAgICAgIC8vIGRpc2FibGUgZWZmZWN0IHByb2Nlc3MKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNLCAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXIgaW1tZWRpYXRlbHkgKHNlZSBlZmZlY3RfcGFyYW1fdCkKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVELCAgIC8vIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgICAgIC8vIGNvbW1pdCBwcmV2aW91cyBzZXQgcGFyYW1ldGVyIGRlZmVycmVkCisgICBFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVyCisgICBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UsICAgICAgICAgICAvLyBzZXQgYXVkaW8gZGV2aWNlIChzZWUgYXVkaW9fZGV2aWNlX2UpCisgICBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUsICAgICAgICAgICAvLyBzZXQgdm9sdW1lCisgICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLCAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG1vZGUgKG5vcm1hbCwgcmluZywgLi4uKQorICAgRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSA9IDB4MTAwMDAgLy8gZmlyc3QgcHJvcHJpZXRhcnkgY29tbWFuZCBjb2RlCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0lOSVQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIEluaXRpYWxpemUgZWZmZWN0IGVuZ2luZTogQWxsIGNvbmZpZ3VyYXRpb25zIHJldHVybiB0byBkZWZhdWx0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGludCkKKy8vICBkYXRhOiBzdGF0dXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfQ09ORklHVVJFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBBcHBseSBuZXcgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQorLy8gIGRhdGE6IGVmZmVjdF9jb25maWdfdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1JFU0VUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBSZXNldCB0aGUgZWZmZWN0IGVuZ2luZS4gS2VlcCBjb25maWd1cmF0aW9uIGJ1dCByZXNldHMgc3RhdGUgYW5kIGJ1ZmZlciBjb250ZW50CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9FTkFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIEVuYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIHByb2Nlc3MoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0RJU0FCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIERpc2FibGUgdGhlIHByb2Nlc3MuIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIGFmdGVyIHRoZSBsYXN0IGNhbGwgdG8gcHJvY2VzcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGludCkKKy8vICBkYXRhOiBzdGF0dXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBTZXQgYSBwYXJhbWV0ZXIgYW5kIGFwcGx5IGl0IGltbWVkaWF0ZWx5CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKKy8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlcGx5IGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoaW50KQorLy8gIGRhdGE6IHN0YXR1cworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIFNldCBhIHBhcmFtZXRlciBidXQgYXBwbHkgaXQgb25seSB3aGVuIHJlY2VpdmluZyBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQgY29tbWFuZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCisvLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBBcHBseSBhbGwgcHJldmlvdXNseSByZWNlaXZlZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRCBjb21tYW5kcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgR2V0IGEgcGFyYW1ldGVyIHZhbHVlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbQorLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlcGx5IGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKKy8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0RFVklDRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IHRoZSByZW5kZXJpbmcgZGV2aWNlIHRoZSBhdWRpbyBvdXRwdXQgcGF0aCBpcyBjb25uZWN0ZWQgdG8uIFNlZSBhdWRpb19kZXZpY2VfZSBmb3IgZGV2aWNlCisvLyAgdmFsdWVzLgorLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcworLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbW1hbmQgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKKy8vICBkYXRhOiBhdWRpb19kZXZpY2VfZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IDAKKy8vICBkYXRhOiBOL0EKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1ZPTFVNRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IGFuZCBnZXQgdm9sdW1lLiBVc2VkIGJ5IGF1ZGlvIGZyYW1ld29yayB0byBkZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgZW5naW5lLgorLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCBvciBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGluCisvLyAgaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzIGNvbW1hbmQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcHJvY2VzcygpIGZ1bmN0aW9uCisvLyAgSWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgZmxhZyBpcyBzZXQgaW4gdGhlIGVmZmVjdCBkZXNjcmlwdG9yLCB0aGUgZWZmZWN0IGVuZ2luZSBtdXN0IHJldHVybgorLy8gIHRoZSB2b2x1bWUgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdGhlIGVmZmVjdCBpcyBwcm9jZXNzZWQuIFRoZSBvdmVyYWxsIHZvbHVtZSAodGhlIHZvbHVtZQorLy8gIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUgbXVsdGlwbGllZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUpIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUKKy8vICBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1hbmQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBuICogc2l6ZW9mKHVpbnQzMl90KQorLy8gIGRhdGE6IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgorLy8gICAgICA4LjI0IGZpeGVkIHBvaW50IGZvcm1hdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpIC8gMAorLy8gIGRhdGE6IC0gaWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgaXMgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgorLy8gICAgICAgICAgICAgIHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgorLy8gICAgICAgICAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0CisvLyAgICAgICAgLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBub3Qgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgorLy8gICAgICAgICAgICAgIE4vQQorLy8gIEl0IGlzIGxlZ2FsIHRvIHJlY2VpdmUgYSBudWxsIHBvaW50ZXIgYXMgcFJlcGx5RGF0YSBpbiB3aGljaCBjYXNlIHRoZSBlZmZlY3QgZnJhbWV3b3JrIGhhcworLy8gIGRlbGVnYXRlZCB2b2x1bWUgY29udHJvbCB0byBhbm90aGVyIGVmZmVjdAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IHRoZSBhdWRpbyBtb2RlLiBUaGUgZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EIGZsYWcgaW4gaXRzCisvLyAgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YodWludDMyX3QpCisvLyAgZGF0YTogYXVkaW9fbW9kZV9lCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgQWxsIHByb3ByaWV0YXJ5IGVmZmVjdCBjb21tYW5kcyBtdXN0IHVzZSBjb21tYW5kIGNvZGVzIGFib3ZlIHRoaXMgdmFsdWUuIFRoZSBzaXplIGFuZCBmb3JtYXQgb2YKKy8vICBjb21tYW5kIGFuZCByZXNwb25zZSBmaWVsZHMgaXMgZnJlZSBpbiB0aGlzIGNhc2UKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyBBdWRpbyBidWZmZXIgZGVzY3JpcHRvciB1c2VkIGJ5IHByb2Nlc3MoKSwgYnVmZmVyUHJvdmlkZXIoKSBmdW5jdGlvbnMgYW5kIGJ1ZmZlcl9jb25maWdfdAorLy8gc3RydWN0dXJlLiBNdWx0aS1jaGFubmVsIGF1ZGlvIGlzIGFsd2F5cyBpbnRlcmxlYXZlZC4gVGhlIGNoYW5uZWwgb3JkZXIgaXMgZnJvbSBMU0IgdG8gTVNCIHdpdGgKKy8vIHJlZ2FyZCB0byB0aGUgY2hhbm5lbCBtYXNrIGRlZmluaXRpb24gaW4gYXVkaW9fY2hhbm5lbHNfZSBlLmcgOgorLy8gU3RlcmVvOiBsZWZ0LCByaWdodAorLy8gNSBwb2ludCAxOiBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgZnJvbnQgY2VudGVyLCBsb3cgZnJlcXVlbmN5LCBiYWNrIGxlZnQsIGJhY2sgcmlnaHQKKy8vIFRoZSBidWZmZXIgc2l6ZSBpcyBleHByZXNzZWQgaW4gZnJhbWUgY291bnQsIGEgZnJhbWUgYmVpbmcgY29tcG9zZWQgb2Ygc2FtcGxlcyBmb3IgYWxsCisvLyBjaGFubmVscyBhdCBhIGdpdmVuIHRpbWUuIEZyYW1lIHNpemUgZm9yIHVuc3BlY2lmaWVkIGZvcm1hdCAoQVVESU9fRk9STUFUX09USEVSKSBpcyA4IGJpdCBieQorLy8gZGVmaW5pdGlvbgorc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIHsKKyAgICBzaXplX3QgICBmcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBidWZmZXIKKyAgICB1bmlvbiB7CisgICAgICAgIHZvaWQqICAgICAgIHJhdzsgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcgorICAgICAgICBpbnQzMl90KiAgICBzMzI7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAzMiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKKyAgICAgICAgaW50MTZfdCogICAgczE2OyAgICAgICAgLy8gcG9pbnRlciB0byBzaWduZWQgMTYgYml0IGRhdGEgYXQgc3RhcnQgb2YgYnVmZmVyCisgICAgICAgIHVpbnQ4X3QqICAgIHU4OyAgICAgICAgIC8vIHBvaW50ZXIgdG8gdW5zaWduZWQgOCBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKKyAgICB9OworfTsKKworLy8gVGhlIGJ1ZmZlcl9wcm92aWRlcl9zIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZAorLy8gYnkgdGhlIGVmZmVjdCBlbmdpbmUgcHJvY2VzcygpIGZ1bmN0aW9uIHRvIHF1ZXJ5IGFuZCByZWxlYXNlIGlucHV0CisvLyBvciBvdXRwdXQgYXVkaW8gYnVmZmVyLgorLy8gVGhlIGdldEJ1ZmZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSBhIGJ1ZmZlciB3aGVyZSBkYXRhCisvLyBzaG91bGQgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYnkgcHJvY2VzcygpIGZ1bmN0aW9uLgorLy8gVGhlIHJlbGVhc2VCdWZmZXIoKSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcmV0cmlldmVkCisvLyB3aXRoIGdldEJ1ZmZlcigpIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KKy8vIFRoZSBwcm9jZXNzIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlIGJ1ZmZlciBwcm92aWRlciBtZWNoYW5pc20gdG8gcmV0cmlldmUKKy8vIGlucHV0IG9yIG91dHB1dCBidWZmZXIgaWYgdGhlIGluQnVmZmVyIG9yIG91dEJ1ZmZlciBwYXNzZWQgYXMgYXJndW1lbnQgaXMgTlVMTAorLy8gYW5kIHRoZSBidWZmZXIgY29uZmlndXJhdGlvbiAoYnVmZmVyX2NvbmZpZ190KSBnaXZlbiBieSB0aGUgRUZGRUNUX0NNRF9DT05GSUdVUkUKKy8vIGNvbW1hbmQgZGlkIG5vdCBzcGVjaWZ5IGFuIGF1ZGlvIGJ1ZmZlci4KKwordHlwZWRlZiBpbnQzMl90ICgqIGJ1ZmZlcl9mdW5jdGlvbl90KSh2b2lkICpjb29raWUsIGF1ZGlvX2J1ZmZlcl90ICpidWZmZXIpOworCit0eXBlZGVmIHN0cnVjdCBidWZmZXJfcHJvdmlkZXJfcyB7CisgICAgYnVmZmVyX2Z1bmN0aW9uX3QgZ2V0QnVmZmVyOyAgICAgICAvLyByZXRyaWV2ZSBuZXh0IGJ1ZmZlcgorICAgIGJ1ZmZlcl9mdW5jdGlvbl90IHJlbGVhc2VCdWZmZXI7ICAgLy8gcmVsZWFzZSB1c2VkIGJ1ZmZlcgorICAgIHZvaWQgICAgICAgKmNvb2tpZTsgICAgICAgICAgICAgICAgLy8gZm9yIHVzZSBieSBjbGllbnQgb2YgYnVmZmVyIHByb3ZpZGVyIGZ1bmN0aW9ucworfSBidWZmZXJfcHJvdmlkZXJfdDsKKworCisvLyBUaGUgYnVmZmVyX2NvbmZpZ19zIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIGlucHV0IG9yIG91dHB1dCBhdWRpbyBmb3JtYXQKKy8vIHRvIGJlIHVzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuIEl0IGlzIHBhcnQgb2YgdGhlIGVmZmVjdF9jb25maWdfdAorLy8gc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb25zIGFuZCBpcworLy8gcGFzc2VkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgordHlwZWRlZiBzdHJ1Y3QgYnVmZmVyX2NvbmZpZ19zIHsKKyAgICBhdWRpb19idWZmZXJfdCAgYnVmZmVyOyAgICAgLy8gYnVmZmVyIGZvciB1c2UgYnkgcHJvY2VzcygpIGZ1bmN0aW9uIGlmIG5vdCBwYXNzZWQgZXhwbGljaXRseQorICAgIHVpbnQzMl90ICAgc2FtcGxpbmdSYXRlOyAgICAvLyBzYW1wbGluZyByYXRlCisgICAgdWludDMyX3QgICBjaGFubmVsczsgICAgICAgIC8vIGNoYW5uZWwgbWFzayAoc2VlIGF1ZGlvX2NoYW5uZWxzX2UpCisgICAgYnVmZmVyX3Byb3ZpZGVyX3QgYnVmZmVyUHJvdmlkZXI7ICAgLy8gYnVmZmVyIHByb3ZpZGVyCisgICAgdWludDhfdCAgICBmb3JtYXQ7ICAgICAgICAgIC8vIEF1ZGlvIGZvcm1hdCAgKHNlZSBhdWRpb19mb3JtYXRfZSkKKyAgICB1aW50OF90ICAgIGFjY2Vzc01vZGU7ICAgICAgLy8gcmVhZC93cml0ZSBvciBhY2N1bXVsYXRlIGluIGJ1ZmZlciAoZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSkKKyAgICB1aW50MTZfdCAgIG1hc2s7ICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBhYm92ZSBmaWVsZHMgaXMgdmFsaWQKK30gYnVmZmVyX2NvbmZpZ190OworCisvLyBTYW1wbGUgZm9ybWF0CitlbnVtIGF1ZGlvX2Zvcm1hdF9lIHsKKyAgICBTQU1QTEVfRk9STUFUX1BDTV9TMTUsICAgLy8gUENNIHNpZ25lZCAxNiBiaXRzCisgICAgU0FNUExFX0ZPUk1BVF9QQ01fVTgsICAgIC8vIFBDTSB1bnNpZ25lZCA4IGJpdHMKKyAgICBTQU1QTEVfRk9STUFUX1BDTV9TN18yNCwgLy8gUENNIHNpZ25lZCA3LjI0IGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uCisgICAgU0FNUExFX0ZPUk1BVF9PVEhFUiAgICAgIC8vIG90aGVyIGZvcm1hdCAoZS5nLiBjb21wcmVzc2VkKQorfTsKKworLy8gQ2hhbm5lbCBtYXNrCitlbnVtIGF1ZGlvX2NoYW5uZWxzX2UgeworICAgIENIQU5ORUxfRlJPTlRfTEVGVCA9IDB4MSwgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgbGVmdCBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9SSUdIVCA9IDB4MiwgICAgICAgICAgICAgICAgICAvLyBmcm9udCByaWdodCBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgPSAweDQsICAgICAgICAgICAgICAgIC8vIGZyb250IGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZID0gMHg4LCAgICAgICAgICAgICAgIC8vIGxvdyBmcmVxdWVuY3kgY2hhbm5lbAorICAgIENIQU5ORUxfQkFDS19MRUZUID0gMHgxMCwgICAgICAgICAgICAgICAgICAgLy8gYmFjayBsZWZ0IGNoYW5uZWwKKyAgICBDSEFOTkVMX0JBQ0tfUklHSFQgPSAweDIwLCAgICAgICAgICAgICAgICAgIC8vIGJhY2sgcmlnaHQgY2hhbm5lbAorICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgPSAweDQwLCAgICAgICAvLyBmcm9udCBsZWZ0IG9mIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwLCAgICAgIC8vIGZyb250IHJpZ2h0IG9mIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9CQUNLX0NFTlRFUiA9IDB4MTAwLCAgICAgICAgICAgICAgICAvLyBiYWNrIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9NT05PID0gQ0hBTk5FTF9GUk9OVF9MRUZULAorICAgIENIQU5ORUxfU1RFUkVPID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQpLAorICAgIENIQU5ORUxfUVVBRCA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgIENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKKyAgICBDSEFOTkVMX1NVUlJPVU5EID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX0JBQ0tfQ0VOVEVSKSwKKyAgICBDSEFOTkVMXzVQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKKyAgICBDSEFOTkVMXzdQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUIHwKKyAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBDSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiksCit9OworCisvLyBSZW5kZXIgZGV2aWNlCitlbnVtIGF1ZGlvX2RldmljZV9lIHsKKyAgICBERVZJQ0VfRUFSUElFQ0UgPSAweDEsICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcnBpZWNlCisgICAgREVWSUNFX1NQRUFLRVIgPSAweDIsICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVha2VyCisgICAgREVWSUNFX1dJUkVEX0hFQURTRVQgPSAweDQsICAgICAgICAgICAgICAgICAvLyB3aXJlZCBoZWFkc2V0LCB3aXRoIG1pY3JvcGhvbmUKKyAgICBERVZJQ0VfV0lSRURfSEVBRFBIT05FID0gMHg4LCAgICAgICAgICAgICAgIC8vIHdpcmVkIGhlYWRwaG9uZSwgd2l0aG91dCBtaWNyb3Bob25lCisgICAgREVWSUNFX0JMVUVUT09USF9TQ08gPSAweDEwLCAgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBTQ08KKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VUID0gMHgyMCwgICAgICAgIC8vIGJsdWV0b290aCBTQ08gaGVhZHNldAorICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCA9IDB4NDAsICAgICAgICAgLy8gYmx1ZXRvb3RoIFNDTyBjYXIga2l0CisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQID0gMHg4MCwgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBBMkRQCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMCwgICAvLyBibHVldG9vdGggQTJEUCBoZWFkcGhvbmVzCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMCwgICAgICAvLyBibHVldG9vdGggQTJEUCBzcGVha2VycworICAgIERFVklDRV9BVVhfRElHSVRBTCA9IDB4NDAwLCAgICAgICAgICAgICAgICAgLy8gZGlnaXRhbCBvdXRwdXQKKyAgICBERVZJQ0VfRVhURVJOQUxfU1BFQUtFUiA9IDB4ODAwICAgICAgICAgICAgIC8vIGV4dGVybmFsIHNwZWFrZXIgKHN0ZXJlbyBhbmQgSGlnaCBxdWFsaXR5KQorfTsKKworLy8gQXVkaW8gbW9kZQorZW51bSBhdWRpb19tb2RlX2UgeworICAgIEFVRElPX01PREVfTk9STUFMLCAgICAgIC8vIHBob25lIGlkbGUKKyAgICBBVURJT19NT0RFX1JJTkdUT05FLCAgICAvLyBwaG9uZSByaW5naW5nCisgICAgQVVESU9fTU9ERV9JTl9DQUxMICAgICAgLy8gcGhvbmUgY2FsbCBjb25uZWN0ZWQKK307CisKKy8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKKy8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQorZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKKyAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKKyAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAorICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKKworfTsKKworLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAorLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kCisjZGVmaW5lIEVGRkVDVF9DT05GSUdfQlVGRkVSICAgIDB4MDAwMSAgLy8gYnVmZmVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfU01QX1JBVEUgIDB4MDAwMiAgLy8gc2FtcGxpbmdSYXRlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgIDB4MDAwNCAgLy8gY2hhbm5lbHMgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19GT1JNQVQgICAgMHgwMDA4ICAvLyBmb3JtYXQgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERSAgMHgwMDEwICAvLyBhY2Nlc3NNb2RlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfUFJPVklERVIgIDB4MDAyMCAgLy8gYnVmZmVyUHJvdmlkZXIgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19BTEwgKEVGRkVDVF9DT05GSUdfQlVGRkVSIHwgRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQUNDX01PREUgfCBFRkZFQ1RfQ09ORklHX1BST1ZJREVSKQorCisKKy8vIGVmZmVjdF9jb25maWdfcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhdWRpbyBwYXJhbWV0ZXJzIGFuZCBidWZmZXJzIGZvciBlZmZlY3QgZW5naW5lIGlucHV0IGFuZCBvdXRwdXQuCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfY29uZmlnX3MgeworICAgIGJ1ZmZlcl9jb25maWdfdCAgIGlucHV0Q2ZnOworICAgIGJ1ZmZlcl9jb25maWdfdCAgIG91dHB1dENmZzs7Cit9IGVmZmVjdF9jb25maWdfdDsKKworCisvLyBlZmZlY3RfcGFyYW1fcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfU0VUX1BBUkFNCisvLyBjb21tYW5kIGFuZCBwQ21kRGF0YSBhbmQgcFJlcGx5RGF0YSBvZiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBjb21tYW5kLgorLy8gcHNpemUgYW5kIHZzaXplIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNpemUgb2YgcGFyYW1ldGVyIGFuZCB2YWx1ZS4KKy8vCisvLyBOT1RFOiB0aGUgc3RhcnQgb2YgdmFsdWUgZmllbGQgaW5zaWRlIHRoZSBkYXRhIGZpZWxkIGlzIGFsd2F5cyBvbiBhIDMyIGJpdCBib3VuZGFyeToKKy8vCisvLyAgKy0tLS0tLS0tLS0tKworLy8gIHwgc3RhdHVzICAgIHwgc2l6ZW9mKGludCkKKy8vICArLS0tLS0tLS0tLS0rCisvLyAgfCBwc2l6ZSAgICAgfCBzaXplb2YoaW50KQorLy8gICstLS0tLS0tLS0tLSsKKy8vICB8IHZzaXplICAgICB8IHNpemVvZihpbnQpCisvLyAgKy0tLS0tLS0tLS0tKworLy8gIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8CisvLyAgfiBwYXJhbWV0ZXIgfiAgID4gcHNpemUgICAgIHwKKy8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgPiAgKChwc2l6ZSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KQorLy8gICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICB8CisvLyAgfCBwYWRkaW5nICAgfCAgICAgICAgICAgICAgIHwKKy8vICArLS0tLS0tLS0tLS0rCisvLyAgfCAgICAgICAgICAgfCAgIHwKKy8vICB+IHZhbHVlICAgICB+ICAgPiB2c2l6ZQorLy8gIHwgICAgICAgICAgIHwgICB8CisvLyAgKy0tLS0tLS0tLS0tKworCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfcGFyYW1fcyB7CisgICAgaW50MzJfdCAgICAgc3RhdHVzOyAgICAgLy8gVHJhbnNhY3Rpb24gc3RhdHVzICh1bnVzZWQgZm9yIGNvbW1hbmQsIHVzZWQgZm9yIHJlcGx5KQorICAgIHVpbnQzMl90ICAgIHBzaXplOyAgICAgIC8vIFBhcmFtZXRlciBzaXplCisgICAgdWludDMyX3QgICAgdnNpemU7ICAgICAgLy8gVmFsdWUgc2l6ZQorICAgIGNoYXIgICAgICAgIGRhdGFbXTsgICAgIC8vIFN0YXJ0IG9mIFBhcmFtZXRlciArIFZhbHVlIGRhdGEKK30gZWZmZWN0X3BhcmFtX3Q7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQW4gZWZmZWN0IGxpYnJhcnkgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGFuZCBleHBvc2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKy8vIHRvIGVuYWJsZSBlZmZlY3QgZW51bWVyYXRpb24gYW5kIGluc3RhbnRpYXRpb24uIFRoZSBuYW1lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFzCisvLyBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcyB3aXRoIGRsc3ltKCk6CisvLworLy8gLSBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzOworLy8gLSBlZmZlY3RfUXVlcnlFZmZlY3RfdCBFZmZlY3RRdWVyeUVmZmVjdDsKKy8vIC0gZWZmZWN0X0NyZWF0ZUVmZmVjdF90IEVmZmVjdENyZWF0ZTsKKy8vIC0gZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCBFZmZlY3RSZWxlYXNlOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cworLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgZXhwb3NlZCBieSB0aGUKKy8vICAgICAgICAgIGxpYnJhcnkuIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIHVuaXF1ZSBlZmZlY3QgdXVpZCAoc2VlCisvLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKKy8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkuCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcE51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcE51bUVmZmVjdHMKKy8vICAgICAgICAqcE51bUVmZmVjdHM6ICAgICB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGVmZmVjdHMgaW4gbGlicmFyeQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QpKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0CisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hpY2ggaW5kZXggaXMKKy8vICAgICAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorLy8gICAgICAgICAgU2VlIGVmZmVjdF9kZXNjcmlwdG9yX3QgZm9yIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3JzLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbAorLy8gICAgICAgICAgZWZmZWN0cyBwcmVzZW50IGluIHRoZSBsaWJyYXJ5LiBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgaXM6CisvLyAgICAgICAgICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1fZWZmZWN0cyk7CisvLyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCisvLyAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0KGksLi4uKTsKKy8vCisvLyAgICBJbnB1dC9PdXRwdXQ6CisvLyAgICAgICAgICBpbmRleDogICAgICAgICAgaW5kZXggb2YgdGhlIGVmZmVjdAorLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcERlc2NyaXB0b3Igb3IgaW5kZXgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PU1lTICAgICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gbW9yZSBlZmZlY3QgYXZhaWxhYmxlCisvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KKy8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCisvLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCisvLyAgICAgICAgICBhIGhhbmRsZSBvbiB0aGUgZWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlLgorLy8KKy8vICAgIElucHV0OgorLy8gICAgICAgICAgdXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCisvLyAgICAgICAgICBzZXNzaW9uSWQ6ICBhdWRpbyBzZXNzaW9uIHRvIHdoaWNoIHRoaXMgZWZmZWN0IGluc3RhbmNlIHdpbGwgYmUgYXR0YWNoZWQuIEFsbCBlZmZlY3RzCisvLyAgICAgICAgICAgICAgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgYXJlIGNvbm5lY3RlZCBpbiBzZXJpZXMgYW5kIHByb2Nlc3MgdGhlIHNhbWUgc2lnbmFsCisvLyAgICAgICAgICAgICAgc3RyZWFtLiBLbm93aW5nIHRoYXQgdHdvIGVmZmVjdHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgZWZmZWN0IGNoYWluIGNhbiBoZWxwIHRoZQorLy8gICAgICAgICAgICAgIGxpYnJhcnkgaW1wbGVtZW50IHNvbWUga2luZCBvZiBvcHRpbWl6YXRpb25zLgorLy8gICAgICAgICAgaW9JZDogICBpZGVudGlmaWVzIHRoZSBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRoaXMgZWZmZWN0IGlzIGRpcmVjdGVkIHRvIGF0IGF1ZGlvIEhBTC4KKy8vICAgICAgICAgICAgICBGb3IgZnV0dXJlIHVzZSBlc3BlY2lhbGx5IHdpdGggdHVubmVsZWQgSFcgYWNjZWxlcmF0ZWQgZWZmZWN0cworLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHBJbnRlcmZhY2U6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwRWZmZWN0VXVpZCBvciBwSW50ZXJmYWNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCisvLyAgICAgICAgKnBJbnRlcmZhY2U6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBpbnRlcmZhY2UgaGFuZGxlLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfQ3JlYXRlRWZmZWN0X3QpKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFJlbGVhc2UKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmVsZWFzZXMgdGhlIGVmZmVjdCBlbmdpbmUgd2hvc2UgaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCisvLyAgICAgICAgICByZWxlYXNlZC4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlIG9uIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRvIGJlIHJlbGVhc2VkLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3R5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOworCisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmOGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfQkFTU0JPT1NUXyA9IHsgMHgwNjM0ZjIyMCwgMHhkZGQ0LCAweDExZGIsIDB4YTBmYywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfQkFTU0JPT1NUID0gJlNMX0lJRF9CQVNTQk9PU1RfOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBCYXNzQm9vc3QgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVELAorICAgIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSAorfSB0X2Jhc3Nib29zdF9wYXJhbXM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFjY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0xfRVNfSF8KK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXyA9IHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDYsIDB4ODMsIDB4OWUgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCID0gJlNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXzsKKyNlbmRpZiAvL09QRU5TTF9FU19IXworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgZW52aXJvbm1lbnRhbCByZXZlcmIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvLyBQYXJhbWV0ZXJzIGJlbG93IGFyZSBhcyBkZWZpbmVkIGluIE9wZW5TTCBFUyBzcGVjaWZpY2F0aW9uIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBpbnRlcmZhY2UKKyAgICBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCwgICAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC00MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSwgICAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDEwMCB0byAyMDAwMAorICAgIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMTAwIHRvIDEwMDAKKyAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVksICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKKyAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMLCAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKKyAgICBSRVZFUkJfUEFSQU1fRElGRlVTSU9OLCAgICAgICAgICAgICAvLyBpbiBwZXJtaWxsZXMsICAgIHJhbmdlIDAgdG8gMTAwMAorICAgIFJFVkVSQl9QQVJBTV9ERU5TSVRZLCAgICAgICAgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMCB0byAxMDAwCisgICAgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMsCisgICAgUkVWRVJCX1BBUkFNX0JZUEFTUworfSB0X2Vudl9yZXZlcmJfcGFyYW1zOworCisvL3RfcmV2ZXJiX3NldHRpbmdzIGlzIGVxdWFsIHRvIFNMRW52aXJvbm1lbnRhbFJldmVyYlNldHRpbmdzIGRlZmluZWQgaW4gT3BlblNMIEVTIHNwZWNpZmljYXRpb24uCit0eXBlZGVmIHN0cnVjdCBzX3JldmVyYl9zZXR0aW5ncyB7CisgICAgaW50MTZfdCAgICAgcm9vbUxldmVsOworICAgIGludDE2X3QgICAgIHJvb21IRkxldmVsOworICAgIHVpbnQzMl90ICAgIGRlY2F5VGltZTsKKyAgICBpbnQxNl90ICAgICBkZWNheUhGUmF0aW87CisgICAgaW50MTZfdCAgICAgcmVmbGVjdGlvbnNMZXZlbDsKKyAgICB1aW50MzJfdCAgICByZWZsZWN0aW9uc0RlbGF5OworICAgIGludDE2X3QgICAgIHJldmVyYkxldmVsOworICAgIHVpbnQzMl90ICAgIHJldmVyYkRlbGF5OworICAgIGludDE2X3QgICAgIGRpZmZ1c2lvbjsKKyAgICBpbnQxNl90ICAgICBkZW5zaXR5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB0X3JldmVyYl9zZXR0aW5nczsKKworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkyZWEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZm5kZWYgT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfRVFVQUxJWkVSXyA9IHsgMHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfRVFVQUxJWkVSID0gJlNMX0lJRF9FUVVBTElaRVJfOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXJzIGZvciBFcXVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBFUV9QQVJBTV9OVU1fQkFORFMsICAgICAgICAgICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgdGhhdCB0aGUgZXF1YWxpemVyIHN1cHBvcnRzLgorICAgIEVRX1BBUkFNX0xFVkVMX1JBTkdFLCAgICAgICAgICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiYW5kIGxldmVscyBzdXBwb3J0ZWQuCisgICAgRVFfUEFSQU1fQkFORF9MRVZFTCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGdhaW4gc2V0IGZvciB0aGUgZ2l2ZW4gZXF1YWxpemVyIGJhbmQuCisgICAgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEsICAgICAgICAgICAvLyBHZXRzIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbiBiYW5kLgorICAgIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSwgICAgICAgLy8gR2V0cyB0aGUgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBnaXZlbiBmcmVxdWVuY3kgYmFuZC4KKyAgICBFUV9QQVJBTV9HRVRfQkFORCwgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGJhbmQgdGhhdCBoYXMgdGhlIG1vc3QgZWZmZWN0IG9uIHRoZSBnaXZlbiBmcmVxdWVuY3kuCisgICAgRVFfUEFSQU1fQ1VSX1BSRVNFVCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcHJlc2V0LgorICAgIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUywgICAgLy8gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHByZXNldHMgdGhlIGVxdWFsaXplciBzdXBwb3J0cy4KKyAgICBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUsICAgICAgIC8vIEdldHMgdGhlIHByZXNldCBuYW1lIGJhc2VkIG9uIHRoZSBpbmRleC4KKyAgICBFUV9QQVJBTV9QUk9QRVJUSUVTICAgICAgICAgICAgIC8vIEdldHMvU2V0cyBhbGwgcGFyYW1ldGVycyBhdCBhIHRpbWUuCit9IHRfZXF1YWxpemVyX3BhcmFtczsKKworLy90X2VxdWFsaXplcl9zZXR0aW5ncyBncm91cHMgYWxsIGN1cnJlbnQgZXF1YWxpemVyIHNldHRpbmcgZm9yIGJhY2t1cCBhbmQgcmVzdG9yZS4KK3R5cGVkZWYgc3RydWN0IHNfZXF1YWxpemVyX3NldHRpbmdzIHsKKyAgICB1aW50MTZfdCBjdXJQcmVzZXQ7CisgICAgdWludDE2X3QgbnVtQmFuZHM7CisgICAgdWludDE2X3QgYmFuZExldmVsc1tdOworfSB0X2VxdWFsaXplcl9zZXR0aW5nczsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2YwOTRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFBSRVNFVFJFVkVSQkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFBSRVNFVFJFVkVSQkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0xfRVNfSF8KK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9QUkVTRVRSRVZFUkJfID0geyAweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9QUkVTRVRSRVZFUkIgPSAmU0xfSUlEX1BSRVNFVFJFVkVSQl87CisjZW5kaWYgLy9PUEVOU0xfRVNfSF8KKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIHByZXNldCByZXZlcmIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBSRVZFUkJfUEFSQU1fUFJFU0VUCit9IHRfcHJlc2V0X3JldmVyYl9wYXJhbXM7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgUkVWRVJCX1BSRVNFVF9OT05FLAorICAgIFJFVkVSQl9QUkVTRVRfU01BTExST09NLAorICAgIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX0xBUkdFUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9MQVJHRUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9QTEFURSwKKyAgICBSRVZFUkJfUFJFU0VUX0xBU1QgPSBSRVZFUkJfUFJFU0VUX1BMQVRFCit9IHRfcmV2ZXJiX3ByZXNldHM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RQUkVTRVRSRVZFUkJBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDUxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFZJUlRVQUxJWkVSQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJUlRVQUxJWkVSXyA9IHsgMHgzN2NjMmMwMCwgMHhkZGRkLCAweDExZGIsIDB4ODU3NywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfVklSVFVBTElaRVIgPSAmU0xfSUlEX1ZJUlRVQUxJWkVSXzsKKyNlbmRpZiAvL09QRU5TTF9FU19IXworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgdmlydHVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCisgICAgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEgKK30gdF92aXJ0dWFsaXplcl9wYXJhbXM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjFhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFZJU1VBTElaRVJBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJU1VBTElaQVRJT05fID0KKyAgICB7IDB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZJU1VBTElaQVRJT04gPSAmU0xfSUlEX1ZJU1VBTElaQVRJT05fOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKyNkZWZpbmUgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYIDEwMjQgIC8vIG1heGltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKyNkZWZpbmUgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOIDEyOCAgIC8vIG1pbmltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXJzIGZvciBWaXN1YWxpemVyIGVmZmVjdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUsICAgICAgICAvLyBTZXRzIHRoZSBudW1iZXIgUENNIHNhbXBsZXMgaW4gdGhlIGNhcHR1cmUuCit9IHRfdmlzdWFsaXplcl9wYXJhbXM7CisKKy8qIGNvbW1hbmRzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWSVNVX0NNRF9DQVBUVVJFID0gRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSwgLy8gR2V0cyB0aGUgbGF0ZXN0IFBDTSBjYXB0dXJlLgorfXRfdmlzdWFsaXplcl9jbWRzOworCisvLyBWSVNVX0NNRF9DQVBUVVJFIHJldHJpZXZlcyB0aGUgbGF0ZXN0IFBDTSBzbmFwc2hvdCBjYXB0dXJlZCBieSB0aGUgdmlzdWFsaXplciBlbmdpbmUuCisvLyBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBzcGVjaWZpZWQgYnkgVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUKKy8vIGluIDggYml0IHVuc2lnbmVkIGZvcm1hdCAoMCA9IDB4ODApCisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQxYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgZmFjdG9yeSBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKy8vICAgICAgICAgIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3QgdXVpZCAoc2VlCisvLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKKy8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisvLyAgICAgICAgICBFYWNoIHRpbWUgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgaXMgY2FsbGVkLCB0aGUgZmFjdG9yeSBtdXN0CisvLyAgICAgICAgICByZXNldCB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IG5leHQgY2FsbCB0bworLy8gICAgICAgICAgRWZmZWN0UXVlcnlFZmZlY3QoKSB0byByZXN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy4KKy8vCisvLyAgICBJbnB1dC9PdXRwdXQ6CisvLyAgICAgICAgICBwTnVtRWZmZWN0czogICAgYWRkcmVzcyB3aGVyZSB0aGUgbnVtYmVyIG9mIGVmZmVjdHMgc2hvdWxkIGJlIHJldHVybmVkLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBmYWN0b3J5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwTnVtRWZmZWN0cworLy8gICAgICAgICpwTnVtRWZmZWN0czogICAgIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgZWZmZWN0cyBpbiBmYWN0b3J5CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UXVlcnlFZmZlY3QKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKy8vICAgICAgICAgIFNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGZvciBhIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3IuCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHRvZ2V0aGVyIHdpdGggRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgaXMgdXNlZCB0byBlbnVtZXJhdGUgYWxsCisvLyAgICAgICAgICBlZmZlY3RzIHByZXNlbnQgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuIFRoZSBlbnVtZXJhdGlvbiBzZXF1ZW5jZSBpczoKKy8vICAgICAgICAgICAgICBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bV9lZmZlY3RzKTsKKy8vICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VmZmVjdHM7IGkrKykKKy8vICAgICAgICAgICAgICAgICAgRWZmZWN0UXVlcnlFZmZlY3QoaSwuLi4pOworLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHBEZXNjcmlwdG9yOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIG1vcmUgZWZmZWN0IGF2YWlsYWJsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBEZXNjcmlwdG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT1NZUyAgICAgZWZmZWN0IGxpc3QgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCBleGVjdXRpb24gb2YgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKKy8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KKy8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCisvLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCisvLyAgICAgICAgICBhIGhhbmRsZXIgb24gdGhlIGVmZmVjdCBjb250cm9sIGludGVyZmFjZS4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIHBFZmZlY3RVdWlkOiAgICBwb2ludGVyIHRvIHRoZSBlZmZlY3QgdXVpZC4KKy8vICAgICAgICAgIHNlc3Npb25JZDogIGF1ZGlvIHNlc3Npb24gdG8gd2hpY2ggdGhpcyBlZmZlY3QgaW5zdGFuY2Ugd2lsbCBiZSBhdHRhY2hlZC4gQWxsIGVmZmVjdHMgY3JlYXRlZAorLy8gICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBhcmUgY29ubmVjdGVkIGluIHNlcmllcyBhbmQgcHJvY2VzcyB0aGUgc2FtZSBzaWduYWwgc3RyZWFtLgorLy8gICAgICAgICAgICAgIEtub3dpbmcgdGhhdCB0d28gZWZmZWN0cyBhcmUgcGFydCBvZiB0aGUgc2FtZSBlZmZlY3QgY2hhaW4gY2FuIGhlbHAgdGhlIGxpYnJhcnkgaW1wbGVtZW50CisvLyAgICAgICAgICAgICAgc29tZSBraW5kIG9mIG9wdGltaXphdGlvbnMuCisvLyAgICAgICAgICBpb0lkOiAgIGlkZW50aWZpZXMgdGhlIG91dHB1dCBvciBpbnB1dCBzdHJlYW0gdGhpcyBlZmZlY3QgaXMgZGlyZWN0ZWQgdG8gYXQgYXVkaW8gSEFMLiBGb3IgZnV0dXJlCisvLyAgICAgICAgICAgICAgdXNlIGVzcGVjaWFsbHkgd2l0aCB0dW5uZWxlZCBIVyBhY2NlbGVyYXRlZCBlZmZlY3RzCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcEludGVyZmFjZTogICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGVmZmVjdCBpbnRlcmZhY2UuCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBFZmZlY3RVdWlkIG9yIHBJbnRlcmZhY2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKy8vICAgICAgICAqcEludGVyZmFjZTogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGludGVyZmFjZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UmVsZWFzZQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBSZWxlYXNlcyB0aGUgZWZmZWN0IGVuZ2luZSB3aG9zZSBoYW5kbGVyIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCisvLyAgICAgICAgICByZWxlYXNlZC4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZXIKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdExvYWRMaWJyYXJ5CisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorLy8gICAgICAgICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgorLy8gICAgICAgICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KKy8vICAgICAgICAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlZCBieQorLy8gICAgICAgICAgZnVydGhlciBjYWxsIHRvIEVmZmVjdFVubG9hZExpYnJhcnkoKSB0byB1bmxvYWQgdGhlIGxpYnJhcnkuCisvLworLy8gICAgSW5wdXQ6CisvLyAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vCisvLyAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBsaWJQYXRoIHN0cmluZyBvciBoYW5kbGUKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdExvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0VW5sb2FkTGlicmFyeQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgVW5sb2FkcyB0aGUgZWZmZWN0IGxpYnJhcnkgd2hpY2ggaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8KKy8vICAgIElucHV0OgorLy8gICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBpbnZhbGlkIGhhbmRsZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0VW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdEdldERlc2NyaXB0b3IKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmV0dXJucyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZWZmZWN0IHdoaWNoIHV1aWQgaXMgcG9pbnRlZAorLy8gICAgICAgICAgdG8gYnkgZmlyc3QgYXJndW1lbnQuCisvLworLy8gICAgSW5wdXQ6CisvLyAgICAgICAgICBwRWZmZWN0VXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcERlc2NyaXB0b3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKy8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RJc051bGxVdWlkCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIEhlbHBlciBmdW5jdGlvbiB0byBjb21wYXJlIGVmZmVjdCB1dWlkIHRvIEVGRkVDVF9VVUlEX05VTEwKKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIHBFZmZlY3RVdWlkOiBwb2ludGVyIHRvIGVmZmVjdCB1dWlkIHRvIGNvbXBhcmUgdG8gRUZGRUNUX1VVSURfTlVMTC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgaWYgdXVpZCBpcyBkaWZmZXJlbnQgZnJvbSBFRkZFQ1RfVVVJRF9OVUxMLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIHV1aWQgaXMgZXF1YWwgdG8gRUZGRUNUX1VVSURfTlVMTC4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdElzTnVsbFV1aWQoZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBjMTQ3NjMyLi43MGU1MDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Q2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MSw2ICs1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCkBAIC02MSw2ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAogICAgIC8qIHF1ZXJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBzdGF0ZS4gVGhpcyBzdGF0ZSBuZXZlciBjaGFuZ2VzLApAQCAtMTM0LDYgKzEzOSwzMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywgaW50IG91dHB1dCkgPSAwOwogCiAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdChpbnQgaW9IYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVVUlELCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgPSAwOworCisgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QocGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0ODA0YmJkLi40OWVlZTU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNTMsOCArNTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCkBAIC02OSw2ICs3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKaW5kZXggZGU2NDI2YS4uNDdkNTMwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApAQCAtNjIsNiArNjIsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOwogCisgICAgLyogQXR0YWNoIHRyYWNrIGF1eGlsaWFyeSBvdXRwdXQgdG8gc3BlY2lmaWVkIGVmZmVjdC4gVXNlIGVmZmVjdElkID0gMAorICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKKwogICAgIC8qIGdldCB0aGlzIHRyYWNrcyBjb250cm9sIGJsb2NrICovCiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOyAgICAKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDQ4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lFRkZFQ1RfSAorI2RlZmluZSBBTkRST0lEX0lFRkZFQ1RfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSUVmZmVjdDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZSgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzYWJsZSgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBSZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkVmZmVjdDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3Q+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JRWZmZWN0Q2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3OGM5OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRWZmZWN0Q2xpZW50OiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkVmZmVjdENsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IDI2MTk2OTEuLmFmOWE3ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtNDgsNiArNDgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN1c3BlbmQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzdW1lKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKIAogICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKICAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAzMWMwOTkxLi45NDE2Y2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNDAsMTUgKzQwLDE0IEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiAgY3JlYXRlTWVkaWFSZWNvcmRlcihwaWRfdCBwaWQpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcihwaWRfdCBwaWQpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGF1ZGlvU2Vzc2lvbklkKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKSA9IDA7Ci0KLSAgICAvLyBUYWtlIGEgcGVlayBhdCBjdXJyZW50bHkgcGxheWluZyBhdWRpbywgZm9yIHZpc3VhbGl6YXRpb24gcHVycG9zZXMuCi0gICAgLy8gVGhpcyByZXR1cm5zIGEgYnVmZmVyIG9mIDE2IGJpdCBtb25vIFBDTSBkYXRhLCBvciBOVUxMIGlmIG5vIHZpc3VhbGl6YXRpb24gYnVmZmVyIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIHNub29wKCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDczYmYyZWUuLjU0YWRjYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogY2xhc3MgSVN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwotY2xhc3MgSU1lZGlhUGxheWVyQ2xpZW50OworY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKIGNsYXNzIElNZWRpYVJlY29yZGVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNDMsNyArNDMsNyBAQAogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcikgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJZ2V0TWF4QW1wbGl0dWRlKGludCogbWF4KSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc3RhcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1OGVmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNRURJQVJFQ09SREVSQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9JTUVESUFSRUNPUkRFUkNMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyQ2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuTWVkaWFSZWNvcmRlckNsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSU1FRElBUkVDT1JERVJDTElFTlRfSAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IDJmNjFjYmUuLmY3OTQ3NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0xMTUsNyArMTE1LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgICAgIHNpemVfdCBlbmNvZGVkV2lkdGgsIHNpemVfdCBlbmNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQpID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXMpID0gMDsKIAogICAgIC8vIE5vdGU6IFRoZXNlIG1ldGhvZHMgYXJlIF9ub3RfIHZpcnR1YWwsIGl0IGV4aXN0cyBhcyBhIHdyYXBwZXIgYXJvdW5kCiAgICAgLy8gdGhlIHZpcnR1YWwgImNyZWF0ZVJlbmRlcmVyIiBtZXRob2QgYWJvdmUgZmFjaWxpdGF0aW5nIGV4dHJhY3Rpb24KQEAgLTEyNSwxNCArMTI2LDE2IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICBzaXplX3QgZW5jb2RlZFdpZHRoLCBzaXplX3QgZW5jb2RlZEhlaWdodCwKLSAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXMpOwogCiAgICAgc3A8SU9NWFJlbmRlcmVyPiBjcmVhdGVSZW5kZXJlckZyb21KYXZhU3VyZmFjZSgKICAgICAgICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IGphdmFTdXJmYWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgc2l6ZV90IGVuY29kZWRXaWR0aCwgc2l6ZV90IGVuY29kZWRIZWlnaHQsCi0gICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKTsKIH07CiAKIHN0cnVjdCBvbXhfbWVzc2FnZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggOWU2MDZkOS4uMDUyMTcwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMzksNyArMzksNiBAQAogZW51bSBwbGF5ZXJfdHlwZSB7CiAgICAgUFZfUExBWUVSID0gMSwKICAgICBTT05JVk9YX1BMQVlFUiA9IDIsCi0gICAgVk9SQklTX1BMQVlFUiA9IDMsCiAgICAgU1RBR0VGUklHSFRfUExBWUVSID0gNCwKICAgICAvLyBUZXN0IHBsYXllcnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIHRoZSAndGVzdCcgYW5kICdlbmcnIGJ1aWxkcy4KICAgICAvLyBUaGUgc2hhcmVkIGxpYnJhcnkgd2l0aCB0aGUgdGVzdCBwbGF5ZXIgaXMgcGFzc2VkIHBhc3NlZCBhcyBhbgpAQCAtNzcsNiArNzYsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBnZXRTZXNzaW9uSWQoKSA9IDA7CiAKICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB1c2UgdGhlICJ3cml0ZSIgQVBJIGJlbG93IHRvIHN1Ym1pdAogICAgICAgICAvLyBhdWRpbyBkYXRhLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCBhNGVlYTJhLi5jM2NkMzYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtNDgsOCArNDgsOCBAQAogICAgIHN0YXRpYyBNZWRpYVByb2ZpbGVzKiBnZXRJbnN0YW5jZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwYXJhbSBuYW1lIGF0IHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLAotICAgICAqIG9yIC0xIGlmIGVycm9yLgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdAorICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLCBvciAtMSBpZiBlcnJvci4KICAgICAgKgogICAgICAqIFN1cHBvcnRlZCBwYXJhbSBuYW1lIGFyZToKICAgICAgKiBkdXJhdGlvbiAtIHRoZSByZWNvcmRpbmcgZHVyYXRpb24uCkBAIC02NCw3ICs2NCw4IEBACiAgICAgICogYXVkLmh6IC0gYXVkaW8gc2FtcGxlIHJhdGUKICAgICAgKiBhdWQuY2ggLSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKICAgICAgKi8KLSAgICBpbnQgZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworICAgIGludCBnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZSBmb3JtYXRzIHN1cHBvcnRlZC4KQEAgLTEyNCwxMiArMTI1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW1hZ2UgZW5jb2RpbmcgcXVhbGl0eSBsZXZlbHMgc3VwcG9ydGVkLgogICAgICAqLwotICAgIFZlY3RvcjxpbnQ+IGdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgd2UgY2FuIHVzZSBmb3IgZGVjb2RpbmcgYSBKUEVHIGZpbGUuCi0gICAgICovCi0gICAgaW50IGdldEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoKSBjb25zdDsKKyAgICBWZWN0b3I8aW50PiBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIE1lZGlhUHJvZmlsZXMmIG9wZXJhdG9yPShjb25zdCBNZWRpYVByb2ZpbGVzJik7ICAvLyBEb24ndCBjYWxsIG1lCkBAIC0xNzEsNyArMTY3LDggQEAKIAogICAgIHN0cnVjdCBDYW1jb3JkZXJQcm9maWxlIHsKICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSgpCi0gICAgICAgICAgICA6IG1GaWxlRm9ybWF0KE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKSwKKyAgICAgICAgICAgIDogbUNhbWVyYUlkKDApLAorICAgICAgICAgICAgICBtRmlsZUZvcm1hdChPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCksCiAgICAgICAgICAgICAgIG1RdWFsaXR5KENBTUNPUkRFUl9RVUFMSVRZX0hJR0gpLAogICAgICAgICAgICAgICBtRHVyYXRpb24oMCksCiAgICAgICAgICAgICAgIG1WaWRlb0NvZGVjKDApLApAQCAtMTgyLDYgKzE3OSw3IEBACiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvQ29kZWM7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbUNhbWVyYUlkOwogICAgICAgICBvdXRwdXRfZm9ybWF0IG1GaWxlRm9ybWF0OwogICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBtUXVhbGl0eTsKICAgICAgICAgaW50IG1EdXJhdGlvbjsKQEAgLTI0OSw2ICsyNDcsMTEgQEAKICAgICAgICAgaW50IHRhZzsKICAgICB9OwogCisgICAgc3RydWN0IEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzIHsKKyAgICAgICAgaW50IG1DYW1lcmFJZDsKKyAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKKyAgICB9OworCiAgICAgLy8gRGVidWcKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvZGVjKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvZGVjKTsKQEAgLTI2Nyw5ICsyNzAsMTEgQEAKICAgICBzdGF0aWMgVmlkZW9EZWNvZGVyQ2FwKiBjcmVhdGVWaWRlb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwogICAgIHN0YXRpYyBWaWRlb0VuY29kZXJDYXAqIGNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7CiAgICAgc3RhdGljIEF1ZGlvRW5jb2RlckNhcCogY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSogY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIGludCBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgaW50IGdldEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlKiBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhSWQoY29uc3QgY2hhciAqKmF0dHMpOworCisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMqIGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0OworICAgIHZvaWQgYWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzKTsKIAogICAgIC8vIEN1c3RvbWl6ZWQgZWxlbWVudCB0YWcgaGFuZGxlciBmb3IgcGFyc2luZyB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBzdGF0aWMgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cyk7CkBAIC0zMDMsNiArMzA4LDcgQEAKICAgICBzdGF0aWMgYm9vbCBzSXNJbml0aWFsaXplZDsKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyAqc0luc3RhbmNlOwogICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBpbnQgbUN1cnJlbnRDYW1lcmFJZDsKIAogICAgIFZlY3RvcjxDYW1jb3JkZXJQcm9maWxlKj4gbUNhbWNvcmRlclByb2ZpbGVzOwogICAgIFZlY3RvcjxBdWRpb0VuY29kZXJDYXAqPiAgbUF1ZGlvRW5jb2RlcnM7CkBAIC0zMTAsOCArMzE2LDcgQEAKICAgICBWZWN0b3I8QXVkaW9EZWNvZGVyQ2FwKj4gIG1BdWRpb0RlY29kZXJzOwogICAgIFZlY3RvcjxWaWRlb0RlY29kZXJDYXAqPiAgbVZpZGVvRGVjb2RlcnM7CiAgICAgVmVjdG9yPG91dHB1dF9mb3JtYXQ+ICAgICBtRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzOwotICAgIFZlY3RvcjxpbnQ+ICAgICAgICAgICAgICAgbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgbUltYWdlRGVjb2RpbmdNYXhNZW1vcnk7CisgICAgVmVjdG9yPEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzICo+ICBtSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHM7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDViNzg3YTcuLjVlOWUzNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTQxLDEzICs0MSwxNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgbGlzdGVuZXIpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgPSAwOwogCiBwcml2YXRlOgogICAgIE1lZGlhUmVjb3JkZXJCYXNlKGNvbnN0IE1lZGlhUmVjb3JkZXJCYXNlICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZXRhZGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9NZXRhZGF0YS5oCmluZGV4IDI0MTg2OGEuLjljOTE1Y2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWV0YWRhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL01ldGFkYXRhLmgKQEAgLTkxLDYgKzkxLDcgQEAKICAgICBzdGF0aWMgY29uc3QgVHlwZSBrUGF1c2VBdmFpbGFibGUgPSAyOTsgICAgICAgIC8vIEJvb2xlYW4KICAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0JhY2t3YXJkQXZhaWxhYmxlID0gMzA7IC8vIEJvb2xlYW4KICAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0ZvcndhcmRBdmFpbGFibGUgPSAzMTsgIC8vIEJvb2xlYW4KKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0F2YWlsYWJsZSA9IDMyOyAgICAgICAgIC8vIEJvb2xlYW4KIAogICAgIC8vIEBwYXJhbSBwW2lub3V0XSBUaGUgcGFyY2VsIHRvIGFwcGVuZCB0aGUgbWV0YWRhdGEgcmVjb3JkcwogICAgIC8vIHRvLiBUaGUgZ2xvYmFsIG1ldGFkYXRhIGhlYWRlciBzaG91bGQgaGF2ZSBiZWVuIHNldCBhbHJlYWR5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggMmExMjk4YS4uYzA5MWMzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaWZuZGVmIEFORFJPSURfUFZNRURJQVJFQ09SREVSX0gKICNkZWZpbmUgQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NSwxMyArNDUsMTQgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBkb1N0b3AoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oIGIvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NDZjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogVGhlIFZpc3VhbGl6ZXIgY2xhc3MgZW5hYmxlcyBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSBwYXJ0IG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBhdWRpbyBmb3IKKyAqIHZpc3VhbGl6YXRpb24gcHVycG9zZS4gSXQgaXMgbm90IGFuIGF1ZGlvIHJlY29yZGluZyBpbnRlcmZhY2UgYW5kIG9ubHkgcmV0dXJucyBwYXJ0aWFsIGFuZCBsb3cKKyAqIHF1YWxpdHkgYXVkaW8gY29udGVudC4gSG93ZXZlciwgdG8gcHJvdGVjdCBwcml2YWN5IG9mIGNlcnRhaW4gYXVkaW8gZGF0YSAoZS5nIHZvaWNlIG1haWwpIHRoZSB1c2UKKyAqIG9mIHRoZSB2aXN1YWxpemVyIHJlcXVpcmVzIHRoZSBwZXJtaXNzaW9uIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8uCisgKiBUaGUgYXVkaW8gc2Vzc2lvbiBJRCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluZGljYXRlcyB3aGljaCBhdWRpbyBjb250ZW50IHNob3VsZCBiZQorICogdmlzdWFsaXplZDoKKyAqIC0gSWYgdGhlIHNlc3Npb24gaXMgMCwgdGhlIGF1ZGlvIG91dHB1dCBtaXggaXMgdmlzdWFsaXplZAorICogLSBJZiB0aGUgc2Vzc2lvbiBpcyBub3QgMCwgdGhlIGF1ZGlvIGZyb20gYSBwYXJ0aWN1bGFyIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sKKyAqICAgdXNpbmcgdGhpcyBhdWRpbyBzZXNzaW9uIGlzIHZpc3VhbGl6ZWQKKyAqIFR3byB0eXBlcyBvZiByZXByZXNlbnRhdGlvbiBvZiBhdWRpbyBjb250ZW50IGNhbiBiZSBjYXB0dXJlZDoKKyAqIC0gV2F2ZWZvcm0gZGF0YTogY29uc2VjdXRpdmUgOC1iaXQgKHVuc2lnbmVkKSBtb25vIHNhbXBsZXMgYnkgdXNpbmcgdGhlIGdldFdhdmVGb3JtKCkgbWV0aG9kCisgKiAtIEZyZXF1ZW5jeSBkYXRhOiA4LWJpdCBtYWduaXR1ZGUgRkZUIGJ5IHVzaW5nIHRoZSBnZXRGZnQoKSBtZXRob2QKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBjYXB0dXJlIGNhbiBiZSByZXRyaWV2ZWQgb3Igc3BlY2lmaWVkIGJ5IGNhbGxpbmcgcmVzcGVjdGl2ZWx5CisgKiBnZXRDYXB0dXJlU2l6ZSgpIGFuZCBzZXRDYXB0dXJlU2l6ZSgpIG1ldGhvZHMuIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgRkZUCisgKiBpcyBoYWxmIG9mIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBzaXplIGJ1dCBib3RoIHNpZGVzIG9mIHRoZSBzcGVjdHJ1bSBhcmUgcmV0dXJuZWQgeWllbGRpbmcgaW4gYQorICogbnVtYmVyIG9mIGJ5dGVzIGVxdWFsIHRvIHRoZSBjYXB0dXJlIHNpemUuIFRoZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlIHJhbmdlCisgKiByZXR1cm5lZCBieSBnZXRNaW5DYXB0dXJlU2l6ZSgpIGFuZCBnZXRNYXhDYXB0dXJlU2l6ZSgpLgorICogSW4gYWRkaXRpb24gdG8gdGhlIHBvbGxpbmcgY2FwdHVyZSBtb2RlLCBhIGNhbGxiYWNrIG1vZGUgaXMgYWxzbyBhdmFpbGFibGUgYnkgaW5zdGFsbGluZyBhCisgKiBjYWxsYmFjayBmdW5jdGlvbiBieSB1c2Ugb2YgdGhlIHNldENhcHR1cmVDYWxsQmFjaygpIG1ldGhvZC4gVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGNhbGxiYWNrCisgKiBpcyBjYWxsZWQgYXMgd2VsbCBhcyB0aGUgdHlwZSBvZiBkYXRhIHJldHVybmVkIGlzIHNwZWNpZmllZC4KKyAqIEJlZm9yZSBjYXB0dXJpbmcgZGF0YSwgdGhlIFZpc3VhbGl6ZXIgbXVzdCBiZSBlbmFibGVkIGJ5IGNhbGxpbmcgdGhlIHNldEVuYWJsZWQoKSBtZXRob2QuCisgKiBXaGVuIGRhdGEgY2FwdHVyZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLCB0aGUgVmlzdWFsaXplciBzaG91bGQgYmUgZGlzYWJsZWQuCisgKi8KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVmlzdWFsaXplcjogcHVibGljIEF1ZGlvRWZmZWN0IHsKK3B1YmxpYzoKKworICAgIGVudW0gY2FsbGJhY2tfZmxhZ3MgeworICAgICAgICBDQVBUVVJFX1dBVkVGT1JNID0gMHgwMDAwMDAwMSwgIC8vIGNhcHR1cmUgY2FsbGJhY2sgcmV0dXJucyBhIFBDTSB3YXZlIGZvcm0KKyAgICAgICAgQ0FQVFVSRV9GRlQgPSAweDAwMDAwMDAyLCAgICAgICAvLyBhcHR1cmUgY2FsbGJhY2sgcmV0dXJucyBhIGZyZXF1ZW5jeSByZXByZXNlbnRhdGlvbgorICAgICAgICBDQVBUVVJFX0NBTExfSkFWQSA9IDB4MDAwMDAwMDQgIC8vIHRoZSBjYWxsYmFjayB0aHJlYWQgY2FuIGNhbGwgamF2YQorICAgIH07CisKKworICAgIC8qIENvbnN0cnVjdG9yLgorICAgICAqIFNlZSBBdWRpb0VmZmVjdCBjb25zdHJ1Y3RvciBmb3IgZGV0YWlscyBvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXplcihpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgflZpc3VhbGl6ZXIoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgLy8gbWF4aW11bSBjYXB0dXJlIHNpemUgaW4gc2FtcGxlcworICAgIHN0YXRpYyB1aW50MzJfdCBnZXRNYXhDYXB0dXJlU2l6ZSgpIHsgcmV0dXJuIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWDsgfQorICAgIC8vIG1pbmltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0TWluQ2FwdHVyZVNpemUoKSB7IHJldHVybiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU47IH0KKyAgICAvLyBtYXhpbXVtIGNhcHR1cmUgcmF0ZSBpbiBtaWxsaWhlcnR6CisgICAgc3RhdGljIHVpbnQzMl90IGdldE1heENhcHR1cmVSYXRlKCkgeyByZXR1cm4gQ0FQVFVSRV9SQVRFX01BWDsgfQorCisgICAgLy8gY2FsbGJhY2sgdXNlZCB0byByZXR1cm4gcGVyaW9kaWMgUENNIG9yIEZGVCBjYXB0dXJlcyB0byB0aGUgYXBwbGljYXRpb24uIEVpdGhlciBvbmUgb3IgYm90aAorICAgIC8vIHR5cGVzIG9mIGRhdGEgYXJlIHJldHVybmVkIChQQ00gYW5kIEZGVCkgYWNjb3JkaW5nIHRvIGZsYWdzIGluZGljYXRlZCB3aGVuIGluc3RhbGxpbmcgdGhlCisgICAgLy8gY2FsbGJhY2suIFdoZW4gYSB0eXBlIG9mIGRhdGEgaXMgbm90IHByZXNlbnQsIHRoZSBjb3JyZXNwb25kaW5nIHNpemUgKHdhdmVmb3JtU2l6ZSBvcgorICAgIC8vIGZmdFNpemUpIGlzIDAuCisgICAgdHlwZWRlZiB2b2lkICgqY2FwdHVyZV9jYmtfdCkodm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdhdmVmb3JtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKndhdmVmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmZ0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmZmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5ncmF0ZSk7CisKKyAgICAvLyBpbnN0YWxsIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSBwZXJpb2RpYyBjYXB0dXJlcy4gVGhlIGNhcHR1cmUgcmF0ZSBpcyBzcGVjaWZpZWQgaW4gbWlsbGlIZXJ0egorICAgIC8vIGFuZCB0aGUgY2FwdHVyZSBmb3JtYXQgaXMgYWNjb3JkaW5nIHRvIGZsYWdzICAoc2VlIGNhbGxiYWNrX2ZsYWdzKS4KKyAgICBzdGF0dXNfdCBzZXRDYXB0dXJlQ2FsbEJhY2soY2FwdHVyZV9jYmtfdCBjYmssIHZvaWQqIHVzZXIsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCByYXRlKTsKKworICAgIC8vIHNldCB0aGUgY2FwdHVyZSBzaXplIGNhcHR1cmUgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGluIHRoZSByYW5nZQorICAgIC8vIFtWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVguIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTl0KKyAgICAvLyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIG5vdCBlbmFibGVkCisgICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZVNpemUodWludDMyX3Qgc2l6ZSk7CisgICAgdWludDMyX3QgZ2V0Q2FwdHVyZVNpemUoKSB7IHJldHVybiBtQ2FwdHVyZVNpemU7IH0KKworICAgIC8vIHJldHVybnMgdGhlIGNhcHR1cmUgcmF0ZSBpbmRpY2F0ZWQgd2hlbiBpbnN0YWxsaW5nIHRoZSBjYWxsYmFjaworICAgIHVpbnQzMl90IGdldENhcHR1cmVSYXRlKCkgeyByZXR1cm4gbUNhcHR1cmVSYXRlOyB9CisKKyAgICAvLyByZXR1cm5zIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyBiZWluZyBjYXB0dXJlZAorICAgIHVpbnQzMl90IGdldFNhbXBsaW5nUmF0ZSgpIHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9CisKKyAgICAvLyByZXR1cm4gYSBjYXB0dXJlIGluIFBDTSA4IGJpdCB1bnNpZ25lZCBmb3JtYXQuIFRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIGlzIGVxdWFsIHRvCisgICAgLy8gZ2V0Q2FwdHVyZVNpemUoKQorICAgIHN0YXR1c190IGdldFdhdmVGb3JtKHVpbnQ4X3QgKndhdmVmb3JtKTsKKworICAgIC8vIHJldHVybiBhIGNhcHR1cmUgaW4gRkZUIDggYml0IHNpZ25lZCBmb3JtYXQuIFRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIGlzIGVxdWFsIHRvCisgICAgLy8gZ2V0Q2FwdHVyZVNpemUoKSBidXQgdGhlIGxlbmd0aCBvZiB0aGUgRkZUIGlzIGhhbGYgb2YgdGhlIHNpemUgKGJvdGggcGFydHMgb2YgdGhlIHNwZWN0cnVtCisgICAgLy8gYXJlIHJldHVybmVkCisgICAgc3RhdHVzX3QgZ2V0RmZ0KHVpbnQ4X3QgKmZmdCk7CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgQ0FQVFVSRV9SQVRFX01BWCA9IDIwMDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBDQVBUVVJFX1JBVEVfREVGID0gMTAwMDA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IENBUFRVUkVfU0laRV9ERUYgPSBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVg7CisKKyAgICAvKiBpbnRlcm5hbCBjbGFzcyB0byBoYW5kbGUgdGhlIGNhbGxiYWNrICovCisgICAgY2xhc3MgQ2FwdHVyZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBDYXB0dXJlVGhyZWFkKFZpc3VhbGl6ZXImIHJlY2VpdmVyLCB1aW50MzJfdCBjYXB0dXJlUmF0ZSwgYm9vbCBiQ2FuQ2FsbEphdmEgPSBmYWxzZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgVmlzdWFsaXplcjsKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKyAgICAgICAgVmlzdWFsaXplciYgbVJlY2VpdmVyOworICAgICAgICBNdXRleCAgICAgICBtTG9jazsKKyAgICAgICAgdWludDMyX3QgbVNsZWVwVGltZVVzOworICAgIH07CisKKyAgICBzdGF0dXNfdCBkb0ZmdCh1aW50OF90ICpmZnQsIHVpbnQ4X3QgKndhdmVmb3JtKTsKKyAgICB2b2lkIHBlcmlvZGljQ2FwdHVyZSgpOworICAgIHVpbnQzMl90IGluaXRDYXB0dXJlU2l6ZSgpOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgdWludDMyX3QgbUNhcHR1cmVSYXRlOworICAgIHVpbnQzMl90IG1DYXB0dXJlU2l6ZTsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBjYXB0dXJlX2Nia190IG1DYXB0dXJlQ2FsbEJhY2s7CisgICAgdm9pZCAqbUNhcHR1cmVDYmtVc2VyOworICAgIHNwPENhcHR1cmVUaHJlYWQ+IG1DYXB0dXJlVGhyZWFkOworICAgIHVpbnQzMl90IG1DYXB0dXJlRmxhZ3M7Cit9OworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDdmYWQxYjcuLjIwNzE5MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTkzLDYgKzkzLDExIEBACiAgICAgLy8gVGhlIHZpZGVvIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgZGVjb2RlcjogaXQgY2FuJ3QgZGVjb2RlIGZyYW1lcyBmYXN0CiAgICAgLy8gZW5vdWdoLiBQb3NzaWJseSBvbmx5IHRoZSBhdWRpbyBwbGF5cyBmaW5lIGF0IHRoaXMgc3RhZ2UuCiAgICAgTUVESUFfSU5GT19WSURFT19UUkFDS19MQUdHSU5HID0gNzAwLAorICAgIC8vIE1lZGlhUGxheWVyIGlzIHRlbXBvcmFyaWx5IHBhdXNpbmcgcGxheWJhY2sgaW50ZXJuYWxseSBpbiBvcmRlciB0bworICAgIC8vIGJ1ZmZlciBtb3JlIGRhdGEuCisgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQgPSA3MDEsCisgICAgLy8gTWVkaWFQbGF5ZXIgaXMgcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgZmlsbGluZyBidWZmZXJzLgorICAgIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCA9IDcwMiwKICAgICAvLyA4eHgKICAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAogICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCkBAIC0xNjEsMTIgKzE2NiwxNSBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwogICAgIHN0YXRpYyAgc3A8SU1lbW9yeT4gICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7CiAgICAgc3RhdGljICBzcDxJTWVtb3J5PiAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpOwotICAgIHN0YXRpYyAgaW50ICAgICAgICAgICAgIHNub29wKHNob3J0ICpkYXRhLCBpbnQgbGVuLCBpbnQga2luZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdXNwZW5kKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzdW1lKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoaW50IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhcl9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2Vla1RvX2woaW50IG1zZWMpOwpAQCAtMTkzLDYgKzIwMSw4IEBACiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggOWVhNmM3Yi4uNWFiMTY0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC03Myw2ICs3MywxMiBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FESUYgPSA1LAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCisgICAgLyogU3RyZWFtIG92ZXIgYSBzb2NrZXQsIGxpbWl0ZWQgdG8gYSBzaW5nbGUgc3RyZWFtICovCisgICAgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQID0gNywKKworICAgIC8qIEguMjY0L0FBQyBkYXRhIGVuY2Fwc3VsYXRlZCBpbiBNUEVHMi9UUyAqLworICAgIE9VVFBVVF9GT1JNQVRfTVBFRzJUUyA9IDgsCisKICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKIH07CiAKQEAgLTEzNSw3ICsxNDEsMTAgQEAKIGVudW0gbWVkaWFfcmVjb3JkZXJfaW5mb190eXBlIHsKICAgICBNRURJQV9SRUNPUkRFUl9JTkZPX1VOS05PV04gICAgICAgICAgICAgICAgICAgPSAxLAogICAgIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQgICAgICA9IDgwMCwKLSAgICBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVEICAgICAgPSA4MDEKKyAgICBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVEICAgICAgPSA4MDEsCisgICAgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUyAgICAgICAgID0gODAyLAorICAgIE1FRElBX1JFQ09SREVSX0lORk9fUFJPR1JFU1NfRlJBTUVfU1RBVFVTICAgICA9IDgwMywKKyAgICBNRURJQV9SRUNPUkRFUl9JTkZPX1BST0dSRVNTX1RJTUVfU1RBVFVTICAgICAgPSA4MDQsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDYsNyArMTU1LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgPSAwOwogfTsKIAotY2xhc3MgTWVkaWFSZWNvcmRlciA6IHB1YmxpYyBCbk1lZGlhUGxheWVyQ2xpZW50LAorY2xhc3MgTWVkaWFSZWNvcmRlciA6IHB1YmxpYyBCbk1lZGlhUmVjb3JkZXJDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewogcHVibGljOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKaW5kZXggMzcyOTA5YS4uYWE5NjVlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCkBAIC0yNiw2ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK3N0cnVjdCBNZXRhRGF0YTsKIAogc3RydWN0IEFNUldyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgQU1SV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKQEAgLTM1LDI1ICszNiwzMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SV3JpdGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0KICAgICBGSUxFICptRmlsZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CiAgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKLSAgICBib29sIG1SZWFjaGVkRU9TOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CiAgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbUVzdGltYXRlZER1cmF0aW9uVXM7CiAKICAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICopOwotICAgIHZvaWQgdGhyZWFkRnVuYygpOworICAgIHN0YXR1c190IHRocmVhZEZ1bmMoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CisgICAgYm9vbCBleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKTsKIAogICAgIEFNUldyaXRlcihjb25zdCBBTVJXcml0ZXIgJik7CiAgICAgQU1SV3JpdGVyICZvcGVyYXRvcj0oY29uc3QgQU1SV3JpdGVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCmluZGV4IDlhZjU4NzEuLjM3YWYwMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogY2xhc3MgTWVkaWFTb3VyY2U7CiBjbGFzcyBBdWRpb1RyYWNrOworY2xhc3MgQXdlc29tZVBsYXllcjsKIAogY2xhc3MgQXVkaW9QbGF5ZXIgOiBwdWJsaWMgVGltZVNvdXJjZSB7CiBwdWJsaWM6CkBAIC0zNSw3ICszNiw5IEBACiAgICAgICAgIFNFRUtfQ09NUExFVEUKICAgICB9OwogCi0gICAgQXVkaW9QbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOworICAgIEF1ZGlvUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAorICAgICAgICAgICAgICAgIEF3ZXNvbWVQbGF5ZXIgKmF1ZGlvT2JzZXJ2ZXIgPSBOVUxMKTsKKwogICAgIHZpcnR1YWwgfkF1ZGlvUGxheWVyKCk7CiAKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCkBAIC00NiwxMSArNDksOSBAQAogCiAgICAgc3RhdHVzX3Qgc3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQgcGF1c2UoKTsKKyAgICB2b2lkIHBhdXNlKGJvb2wgcGxheVBlbmRpbmdTYW1wbGVzID0gZmFsc2UpOwogICAgIHZvaWQgcmVzdW1lKCk7CiAKLSAgICB2b2lkIHN0b3AoKTsKLQogICAgIC8vIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBidWZmZXIgcGxheWVkIChpbiB1cykuCiAgICAgaW50NjRfdCBnZXRNZWRpYVRpbWVVcygpOwogCkBAIC04Niw3ICs4NywxMiBAQAogCiAgICAgYm9vbCBtU3RhcnRlZDsKIAorICAgIGJvb2wgbUlzRmlyc3RCdWZmZXI7CisgICAgc3RhdHVzX3QgbUZpcnN0QnVmZmVyUmVzdWx0OworICAgIE1lZGlhQnVmZmVyICptRmlyc3RCdWZmZXI7CisKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKKyAgICBBd2Vzb21lUGxheWVyICptT2JzZXJ2ZXI7CiAKICAgICBzdGF0aWMgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbyk7CiAgICAgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7CkBAIC05OSw2ICsxMDUsOCBAQAogCiAgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzTG9ja2VkKCkgY29uc3Q7CiAKKyAgICB2b2lkIHJlc2V0KCk7CisKICAgICBBdWRpb1BsYXllcihjb25zdCBBdWRpb1BsYXllciAmKTsKICAgICBBdWRpb1BsYXllciAmb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUGxheWVyICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCBlYjAwMTQwLi5hNWNlYzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC0zOSw2ICszOSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGFtcGxpdHVkZSBzaW5jZSBsYXN0IGNhbGwuCisgICAgaW50MTZfdCBnZXRNYXhBbXBsaXR1ZGUoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCkBAIC00NiwxMyArNDksNDEgQEAKICAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIGVudW0geyBrTWF4QnVmZmVyU2l6ZSA9IDgxOTIgfTsKKyAgICBlbnVtIHsKKyAgICAgICAga01heEJ1ZmZlclNpemUgPSAyMDQ4LAorCisgICAgICAgIC8vIEFmdGVyIHRoZSBpbml0aWFsIG11dGUsIHdlIHJhaXNlIHRoZSB2b2x1bWUgbGluZWFybHkKKyAgICAgICAgLy8gb3ZlciBrQXV0b1JhbXBEdXJhdGlvblVzLgorICAgICAgICBrQXV0b1JhbXBEdXJhdGlvblVzID0gMzAwMDAwLAorCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGluaXRpYWwgbXV0ZSBkdXJhdGlvbiB0byBzdXBwcmVzcworICAgICAgICAvLyB0aGUgdmlkZW8gcmVjb3JkaW5nIHNpZ25hbCB0b25lCisgICAgICAgIGtBdXRvUmFtcFN0YXJ0VXMgPSA3MDAwMDAsCisgICAgICB9OwogCiAgICAgQXVkaW9SZWNvcmQgKm1SZWNvcmQ7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOworCisgICAgYm9vbCBtQ29sbGVjdFN0YXRzOworICAgIGJvb2wgbVRyYWNrTWF4QW1wbGl0dWRlOworICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOworICAgIGludDE2X3QgbU1heEFtcGxpdHVkZTsKKyAgICBpbnQ2NF90IG1QcmV2U2FtcGxlVGltZVVzOworICAgIGludDY0X3QgbVRvdGFsTG9zdEZyYW1lczsKKyAgICBpbnQ2NF90IG1QcmV2TG9zdEJ5dGVzOworICAgIGludDY0X3QgbUluaXRpYWxSZWFkVGltZVVzOworCiAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCisgICAgdm9pZCB0cmFja01heEFtcGxpdHVkZShpbnQxNl90ICpkYXRhLCBpbnQgblNhbXBsZXMpOworCisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIHJhaXNlIHRoZSB2b2x1bWUgZnJvbSBtdXRlIHRvIHRoZQorICAgIC8vIGFjdHVhbCBsZXZlbCBsaW5lYXJseS4KKyAgICB2b2lkIHJhbXBWb2x1bWUoCisgICAgICAgIGludDMyX3Qgc3RhcnRGcmFtZSwgaW50MzJfdCByYW1wRHVyYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQ4X3QgKmRhdGEsICAgc2l6ZV90IGJ5dGVzKTsKKwogICAgIEF1ZGlvU291cmNlKGNvbnN0IEF1ZGlvU291cmNlICYpOwogICAgIEF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgQXVkaW9Tb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ1MGU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENBQ0hJTkdfREFUQVNPVVJDRV9IXwotCi0jZGVmaW5lIENBQ0hJTkdfREFUQVNPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENhY2hpbmdEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotcHVibGljOgotICAgIENhY2hpbmdEYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHBhZ2VTaXplLCBpbnQgbnVtUGFnZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmX3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2FjaGluZ0RhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUGFnZSB7Ci0gICAgICAgIFBhZ2UgKm1QcmV2LCAqbU5leHQ7Ci0gICAgICAgIG9mZl90IG1PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBtTGVuZ3RoOwotICAgICAgICB2b2lkICptRGF0YTsKLSAgICB9OwotCi0gICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKLSAgICB2b2lkICptRGF0YTsKLSAgICBzaXplX3QgbVBhZ2VTaXplOwotICAgIFBhZ2UgKm1GaXJzdCwgKm1MYXN0OwotCi0gICAgUGFnZSAqYWxsb2NhdGVfcGFnZSgpOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBDYWNoaW5nRGF0YVNvdXJjZShjb25zdCBDYWNoaW5nRGF0YVNvdXJjZSAmKTsKLSAgICBDYWNoaW5nRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hpbmdEYXRhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDQUNISU5HX0RBVEFTT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IGVhNDM1ZGUuLjMxOTJkMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjgsMTggKzI4LDE1IEBACiAKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBJTWVtb3J5OwotY2xhc3MgSVN1cmZhY2U7CiBjbGFzcyBDYW1lcmE7CiAKLWNsYXNzIENhbWVyYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CitjbGFzcyBDYW1lcmFTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGUoKTsKLSAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGVGcm9tSUNhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmaWNhbWVyYSk7CisgICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlKCk7CiAKLSAgICB2b2lkIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKIApAQCAtNDgsMjUgKzQ1LDM5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcik7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOwogCiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPElTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKLSAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lczsKKyAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CisgICAgTGlzdDxzcDxJTWVtb3J5PiA+IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKICAgICBpbnQ2NF90IG1GaXJzdEZyYW1lVGltZVVzOwotICAgIGludDMyX3QgbU51bUZyYW1lczsKKyAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOworICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CisgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKKyAgICBib29sIG1Db2xsZWN0U3RhdHM7CiAgICAgYm9vbCBtU3RhcnRlZDsKIAogICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwogCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisgICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOworICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICBDYW1lcmFTb3VyY2UoY29uc3QgQ2FtZXJhU291cmNlICYpOwogICAgIENhbWVyYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZSAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCAxZTM0MWI5Li5iYzNmNDY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC01OCw2ICs1OCwxMSBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywgc2l6ZV90IHNyY1NraXAsCiAgICAgICAgICAgICB2b2lkICpkc3RCaXRzLCBzaXplX3QgZHN0U2tpcCk7CiAKKyAgICB2b2lkIGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywgc2l6ZV90IHNyY1NraXAsCisgICAgICAgICAgICB2b2lkICpkc3RCaXRzLCBzaXplX3QgZHN0U2tpcCk7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggY2QxOWVhZS4uZDBiOWZjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTI5LDYgKzI5LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewpAQCAtMzYsNiArMzcsNyBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKICAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCisgICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAogICAgIH07CiAKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKQEAgLTYwLDEwICs2MiwxNCBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi0gICAgYm9vbCBzbmlmZihTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgIGJvb2wgc25pZmYoU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKm1ldGEpOwogCisgICAgLy8gVGhlIHNuaWZmZXIgY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiAibWV0YSIgd2l0aCBhbiBBTWVzc2FnZSBjb250YWluaW5nCisgICAgLy8gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyB0aGF0IGhlbHBzIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplCisgICAgLy8gaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcgZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4KICAgICB0eXBlZGVmIGJvb2wgKCpTbmlmZmVyRnVuYykoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsCisgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKTsKIAogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU25pZmZlcihTbmlmZmVyRnVuYyBmdW5jKTsKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDAwYmVhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBIVFRQX0RBVEFTT1VSQ0VfSF8KLQotI2RlZmluZSBIVFRQX0RBVEFTT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEhUVFBTdHJlYW07Ci0KLWNsYXNzIEhUVFBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotcHVibGljOgotICAgIEhUVFBEYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwotCi0gICAgSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdCgpOwotICAgIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmX3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+SFRUUERhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga0J1ZmZlclNpemUgPSA2NCAqIDEwMjQsCi0KLSAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgc29ja2V0LXJlYWQgZXJyb3Igd2UnbGwgdHJ5IHJlY29ubmVjdGluZwotICAgICAgICAvLyBhbmQgcmVzdGFydGluZyB0aGUgcmVhZCBmb3IgYXQgbW9zdCB0aGlzIG1hbnkgdGltZXMuCi0gICAgICAgIGtNYXhOdW1SZXRyaWVzID0gMywKLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIERJU0NPTk5FQ1RFRCwKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVECi0gICAgfTsKLQotICAgIFN0YXRlIG1TdGF0ZTsKLSAgICBtdXRhYmxlIE11dGV4IG1TdGF0ZUxvY2s7Ci0KLSAgICBTdHJpbmc4IG1IZWFkZXJzOwotCi0gICAgU3RyaW5nOCBtU3RhcnRpbmdIb3N0OwotICAgIFN0cmluZzggbVN0YXJ0aW5nUGF0aDsKLSAgICBpbnQgbVN0YXJ0aW5nUG9ydDsKLQotICAgIEhUVFBTdHJlYW0gKm1IdHRwOwotCi0gICAgdm9pZCAqbUJ1ZmZlcjsKLSAgICBzaXplX3QgbUJ1ZmZlckxlbmd0aDsKLSAgICBvZmZfdCBtQnVmZmVyT2Zmc2V0OwotCi0gICAgYm9vbCBtQ29udGVudExlbmd0aFZhbGlkOwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtQ29udGVudExlbmd0aDsKLQotICAgIGludDMyX3QgbU51bVJldHJpZXNMZWZ0OwotCi0gICAgdm9pZCBpbml0KGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKLQotICAgIHNzaXplX3Qgc2VuZFJhbmdlUmVxdWVzdChzaXplX3Qgb2Zmc2V0KTsKLSAgICB2b2lkIGluaXRIZWFkZXJzKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFdpdGhSZWRpcmVjdHNBbmRSYW5nZShvZmZfdCByYW5nZVN0YXJ0KTsKLSAgICB2b2lkIGFwcGx5VGltZW91dFJlc3BvbnNlKCk7Ci0KLSAgICBIVFRQRGF0YVNvdXJjZShjb25zdCBIVFRQRGF0YVNvdXJjZSAmKTsKLSAgICBIVFRQRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEhUVFBEYXRhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBIVFRQX0RBVEFTT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCmluZGV4IDIyMWM2NzkuLjYzZjExZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKQEAgLTMyLDYgKzMyLDE0IEBACiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCk7CiAKK2V4dGVybiBhbmRyb2lkOjpWaWRlb1JlbmRlcmVyICpjcmVhdGVSZW5kZXJlcldpdGhSb3RhdGlvbigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCisgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0LAorICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcyk7CisKIGV4dGVybiBhbmRyb2lkOjpPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKTsKIAogI2VuZGlmICAvLyBIQVJEV0FSRV9BUElfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjNjUwNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1QRUcyVFNfV1JJVEVSX0hfCisKKyNkZWZpbmUgTVBFRzJUU19XUklURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IE1QRUcyVFNXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgeworICAgIE1QRUcyVFNXcml0ZXIoaW50IGZkKTsKKyAgICBNUEVHMlRTV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUEVHMlRTV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U291cmNlTm90aWZ5ID0gJ25vdGknCisgICAgfTsKKworICAgIHN0cnVjdCBTb3VyY2VJbmZvOworCisgICAgRklMRSAqbUZpbGU7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNUEVHMlRTV3JpdGVyPiA+IG1SZWZsZWN0b3I7CisKKyAgICBib29sIG1TdGFydGVkOworCisgICAgVmVjdG9yPHNwPFNvdXJjZUluZm8+ID4gbVNvdXJjZXM7CisgICAgc2l6ZV90IG1OdW1Tb3VyY2VzRG9uZTsKKworICAgIGludDY0X3QgbU51bVRTUGFja2V0c1dyaXR0ZW47CisgICAgaW50NjRfdCBtTnVtVFNQYWNrZXRzQmVmb3JlTWV0YTsKKworICAgIHZvaWQgaW5pdCgpOworCisgICAgdm9pZCB3cml0ZVRTKCk7CisgICAgdm9pZCB3cml0ZVByb2dyYW1Bc3NvY2lhdGlvblRhYmxlKCk7CisgICAgdm9pZCB3cml0ZVByb2dyYW1NYXAoKTsKKyAgICB2b2lkIHdyaXRlQWNjZXNzVW5pdChpbnQzMl90IHNvdXJjZUluZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNUEVHMlRTX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDZiOTNmMTkuLjdiZjA3ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTM2LDkgKzM2LDExIEBACiAgICAgTVBFRzRXcml0ZXIoaW50IGZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgdm9pZCBiZWdpbkJveChjb25zdCBjaGFyICpmb3VyY2MpOwogICAgIHZvaWQgd3JpdGVJbnQ4KGludDhfdCB4KTsKQEAgLTQ5LDYgKzUxLDkgQEAKICAgICB2b2lkIHdyaXRlRm91cmNjKGNvbnN0IGNoYXIgKmZvdXJjYyk7CiAgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgdm9pZCBlbmRCb3goKTsKKyAgICB1aW50MzJfdCBpbnRlcmxlYXZlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7IH0KKyAgICBzdGF0dXNfdCBzZXRJbnRlcmxlYXZlRHVyYXRpb24odWludDMyX3QgZHVyYXRpb24pOworICAgIGludDMyX3QgZ2V0VGltZVNjYWxlKCkgY29uc3QgeyByZXR1cm4gbVRpbWVTY2FsZTsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TVBFRzRXcml0ZXIoKTsKQEAgLTU3LDE2ICs2Miw5OSBAQAogICAgIGNsYXNzIFRyYWNrOwogCiAgICAgRklMRSAqbUZpbGU7CisgICAgYm9vbCBtVXNlNEJ5dGVOYWxMZW5ndGg7CisgICAgYm9vbCBtVXNlMzJCaXRPZmZzZXQ7CisgICAgYm9vbCBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZDsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtU3RhcnRlZDsKICAgICBvZmZfdCBtT2Zmc2V0OwogICAgIG9mZl90IG1NZGF0T2Zmc2V0OworICAgIHVpbnQ4X3QgKm1Nb292Qm94QnVmZmVyOworICAgIG9mZl90IG1Nb292Qm94QnVmZmVyT2Zmc2V0OworICAgIGJvb2wgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeTsKKyAgICBvZmZfdCBtRnJlZUJveE9mZnNldDsKKyAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKKyAgICBvZmZfdCBtRXN0aW1hdGVkTW9vdkJveFNpemU7CisgICAgdWludDMyX3QgbUludGVybGVhdmVEdXJhdGlvblVzOworICAgIGludDMyX3QgbVRpbWVTY2FsZTsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBMaXN0PFRyYWNrICo+IG1UcmFja3M7CiAKICAgICBMaXN0PG9mZl90PiBtQm94ZXM7CiAKLSAgICBvZmZfdCBhZGRTYW1wbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgb2ZmX3QgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKTsKKyAgICBpbnQ2NF90IGdldFN0YXJ0VGltZXN0YW1wVXMoKTsgIC8vIE5vdCBjb25zdAorICAgIHN0YXR1c190IHN0YXJ0VHJhY2tzKE1ldGFEYXRhICpwYXJhbXMpOworICAgIHNpemVfdCBudW1UcmFja3MoKTsKKyAgICBpbnQ2NF90IGVzdGltYXRlTW9vdkJveFNpemUoaW50MzJfdCBiaXRSYXRlKTsKKworICAgIHN0cnVjdCBDaHVuayB7CisgICAgICAgIFRyYWNrICAgICAgICAgICAgICAgKm1UcmFjazsgICAgICAgIC8vIE93bmVyCisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgbVRpbWVTdGFtcFVzOyAgIC8vIFRpbWVzdGFtcCBvZiB0aGUgMXN0IHNhbXBsZQorICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1TYW1wbGVzOyAgICAgICAvLyBTYW1wbGUgZGF0YQorCisgICAgICAgIC8vIENvbnZlbmllbnQgY29uc3RydWN0b3IKKyAgICAgICAgQ2h1bmsoVHJhY2sgKnRyYWNrLCBpbnQ2NF90IHRpbWVVcywgTGlzdDxNZWRpYUJ1ZmZlciAqPiBzYW1wbGVzKQorICAgICAgICAgICAgOiBtVHJhY2sodHJhY2spLCBtVGltZVN0YW1wVXModGltZVVzKSwgbVNhbXBsZXMoc2FtcGxlcykgeworICAgICAgICB9CisKKyAgICB9OworICAgIHN0cnVjdCBDaHVua0luZm8geworICAgICAgICBUcmFjayAgICAgICAgICAgICAgICptVHJhY2s7ICAgICAgICAvLyBPd25lcgorICAgICAgICBMaXN0PENodW5rPiAgICAgICAgIG1DaHVua3M7ICAgICAgICAvLyBSZW1haW5pbmcgY2h1bmtzIHRvIGJlIHdyaXR0ZW4KKyAgICB9OworCisgICAgYm9vbCAgICAgICAgICAgIG1Jc0ZpcnN0Q2h1bms7CisgICAgdm9sYXRpbGUgYm9vbCAgIG1Eb25lOyAgICAgICAgICAgICAgICAgIC8vIFdyaXRlciB0aHJlYWQgaXMgZG9uZT8KKyAgICBwdGhyZWFkX3QgICAgICAgbVRocmVhZDsgICAgICAgICAgICAgICAgLy8gVGhyZWFkIGlkIGZvciB0aGUgd3JpdGVyCisgICAgTGlzdDxDaHVua0luZm8+IG1DaHVua0luZm9zOyAgICAgICAgICAgIC8vIENodW5rIGluZm9zCisgICAgQ29uZGl0aW9uICAgICAgIG1DaHVua1JlYWR5Q29uZGl0aW9uOyAgIC8vIFNpZ25hbCB0aGF0IGNodW5rcyBhcmUgYXZhaWxhYmxlCisKKyAgICAvLyBXcml0ZXIgdGhyZWFkIGhhbmRsaW5nCisgICAgc3RhdHVzX3Qgc3RhcnRXcml0ZXJUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BXcml0ZXJUaHJlYWQoKTsKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICptZSk7CisgICAgdm9pZCB0aHJlYWRGdW5jKCk7CisKKyAgICAvLyBCdWZmZXIgYSBzaW5nbGUgY2h1bmsgdG8gYmUgd3JpdHRlbiBvdXQgbGF0ZXIuCisgICAgdm9pZCBidWZmZXJDaHVuayhjb25zdCBDaHVuayYgY2h1bmspOworCisgICAgLy8gV3JpdGUgYWxsIGJ1ZmZlcmVkIGNodW5rcyBmcm9tIGFsbCB0cmFja3MKKyAgICB2b2lkIHdyaXRlQ2h1bmtzKCk7CisKKyAgICAvLyBXcml0ZSBhIGNodW5rIGlmIHRoZXJlIGlzIG9uZQorICAgIHN0YXR1c190IHdyaXRlT25lQ2h1bmsoKTsKKworICAgIC8vIFdyaXRlIHRoZSBmaXJzdCBjaHVuayBmcm9tIHRoZSBnaXZlbiBDaHVua0luZm8uCisgICAgdm9pZCB3cml0ZUZpcnN0Q2h1bmsoQ2h1bmtJbmZvKiBpbmZvKTsKKworICAgIC8vIEFkanVzdCBvdGhlciB0cmFjayBtZWRpYSBjbG9jayAocHJlc3VtYWJseSB3YWxsIGNsb2NrKQorICAgIC8vIGJhc2VkIG9uIGF1ZGlvIHRyYWNrIG1lZGlhIGNsb2NrIHdpdGggdGhlIGRyaWZ0IHRpbWUuCisgICAgaW50NjRfdCBtRHJpZnRUaW1lVXM7CisgICAgdm9pZCBzZXREcmlmdFRpbWVVcyhpbnQ2NF90IGRyaWZ0VGltZVVzKTsKKyAgICBpbnQ2NF90IGdldERyaWZ0VGltZVVzKCk7CisKKyAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgbmFsIGxlbmd0aCBpcyA0IGJ5dGVzIG9yIDIgYnl0ZXMKKyAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIGZvciBILjI2NC9BVkMKKyAgICBib29sIHVzZU5hbExlbmd0aEZvdXIoKTsKKworICAgIHZvaWQgbG9jaygpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlc2UgbWV0aG9kcworICAgIG9mZl90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIG9mZl90IGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICBpbmxpbmUgc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwgRklMRSogc3RyZWFtKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CisgICAgYm9vbCB1c2UzMkJpdEZpbGVPZmZzZXQoKSBjb25zdDsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIGJvb2wgaXNGaWxlU3RyZWFtYWJsZSgpIGNvbnN0OworICAgIHZvaWQgdHJhY2tQcm9ncmVzc1N0YXR1cyhjb25zdCBUcmFjayogdHJhY2ssIGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CisgICAgdm9pZCB3cml0ZUNvbXBvc2l0aW9uTWF0cml4KGludDMyX3QgZGVncmVlcyk7CiAKICAgICBNUEVHNFdyaXRlcihjb25zdCBNUEVHNFdyaXRlciAmKTsKICAgICBNUEVHNFdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0V3JpdGVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggMjA3MTk1YS4uOTJjZTA2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHOwogCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlBYOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwpAQCAtMzMsMTEgKzM0LDE1IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0c7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggMTAyODg1Zi4uNmRmNGQ4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMzksOCArMzksOSBAQAogCiAgICAgLy8gTm90IHRlY2huaWNhbGx5IGFuIGVycm9yLgogICAgIElORk9fRk9STUFUX0NIQU5HRUQgICAgPSBNRURJQV9FUlJPUl9CQVNFIC0gMTIsCisgICAgSU5GT19ESVNDT05USU5VSVRZICAgICA9IE1FRElBX0VSUk9SX0JBU0UgLSAxMywKIAotICAgIEVSUk9SX05PX0xJQ0VOU0UgICAgICAgPSBNRURJQV9FUlJPUl9CQVNFIC0gMTMsCisgICAgRVJST1JfTk9fTElDRU5TRSAgICAgICA9IE1FRElBX0VSUk9SX0JBU0UgLSAxNCwKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKaW5kZXggMGZiYjQyMi4uYTgyMTA2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtNDUsMTMgKzQ1LDE0IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKIAogICAgIGVudW0gRmxhZ3MgewotICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLAotICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLAorICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCiAgICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCisgICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgogICAgIH07CiAKICAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCi0gICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFCisgICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKICAgICAvLyBmb3IgRFJNCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggOTZkNTdlNy4uZGFmYzYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsMjggKzYyLDU2IEBACiAgICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCiAgICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCiAgICAgc3RydWN0IFJlYWRPcHRpb25zIHsKKyAgICAgICAgZW51bSBTZWVrTW9kZSB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICB9OworCiAgICAgICAgIFJlYWRPcHRpb25zKCk7CiAKICAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgogICAgICAgICB2b2lkIHJlc2V0KCk7CiAKLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwogICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMpIGNvbnN0OworICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7CisKKyAgICAgICAgLy8gT3B0aW9uIGFsbG93cyBlbmNvZGVyIHRvIHNraXAgc29tZSBmcmFtZXMgdW50aWwgdGhlIHNwZWNpZmllZAorICAgICAgICAvLyB0aW1lIHN0YW1wLgorICAgICAgICAvLyBUbyBwcmV2ZW50IGZyb20gYmVpbmcgYWJ1c2VkLCB3aGVuIHRoZSBza2lwRnJhbWUgdGltZXN0YW1wIGlzCisgICAgICAgIC8vIGZvdW5kIHRvIGJlIG1vcmUgdGhhbiAxIHNlY29uZCBsYXRlciB0aGFuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCwKKyAgICAgICAgLy8gYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBmcm9tIHJlYWQoKS4KKyAgICAgICAgdm9pZCBjbGVhclNraXBGcmFtZSgpOworICAgICAgICBib29sIGdldFNraXBGcmFtZShpbnQ2NF90ICp0aW1lVXMpIGNvbnN0OworICAgICAgICB2b2lkIHNldFNraXBGcmFtZShpbnQ2NF90IHRpbWVVcyk7CiAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKICAgICBwcml2YXRlOgogICAgICAgICBlbnVtIE9wdGlvbnMgeworICAgICAgICAgICAgLy8gQml0IG1hcAogICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCisgICAgICAgICAgICBrU2tpcEZyYW1lX09wdGlvbiAgID0gMiwKICAgICAgICAgfTsKIAogICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKICAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOwogICAgICAgICBpbnQ2NF90IG1MYXRlbmVzc1VzOworCisgICAgICAgIGludDY0X3QgbVNraXBGcmFtZVVudGlsVGltZVVzOwogICAgIH07CiAKKyAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCisgICAgLy8gdW50aWwgYSBzdWJzZXF1ZW50IHJlYWQtd2l0aC1zZWVrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkKKyAgICAvLyBPTVhDb2RlYy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFTb3VyY2UoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCmluZGV4IGI4MjMyYzYuLjVjYzhkY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKQEAgLTE5LDIyICsxOSw0NiBAQAogI2RlZmluZSBNRURJQV9XUklURVJfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK3N0cnVjdCBNZXRhRGF0YTsKIAogc3RydWN0IE1lZGlhV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhV3JpdGVyKCkge30KKyAgICBNZWRpYVdyaXRlcigpCisgICAgICAgIDogbU1heEZpbGVTaXplTGltaXRCeXRlcygwKSwKKyAgICAgICAgICBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcygwKSB7CisgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXhGaWxlU2l6ZShpbnQ2NF90IGJ5dGVzKSB7IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPSBieXRlczsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRNYXhGaWxlRHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKSB7IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID0gZHVyYXRpb25VczsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhV3JpdGVyKCkge30KKyAgICBpbnQ2NF90IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7CisgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKKyAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogCisgICAgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnkobXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgfQorICAgIH0KIHByaXZhdGU6CiAgICAgTWVkaWFXcml0ZXIoY29uc3QgTWVkaWFXcml0ZXIgJik7CiAgICAgTWVkaWFXcml0ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYVdyaXRlciAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCBkMWI1ZjI3Li5hNjlkOWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC0zMCwxMCArMzAsMTQgQEAKIC8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgogZW51bSB7CiAgICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsCi0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLAotICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywKKyAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90CisgICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdAorICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCisgICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAorICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGFsc28gdmlkZW8gZnJhbWUgcmF0ZSkKICAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCiAgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQpAQCAtNDMsNiArNDcsMTAgQEAKICAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleU5UUFRpbWUgICAgICAgICAgID0gJ250cFQnLCAgLy8gdWludDY0X3QgKG50cC10aW1lc3RhbXApCisgICAga0tleVRhcmdldFRpbWUgICAgICAgID0gJ3RhclQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCiAgICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCiAgICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLAogICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKQEAgLTY3LDYgKzc1LDM0IEBACiAgICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZwogICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKICAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCisgICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAorCisgICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKKyAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90CisgICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAorICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKKworICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZworICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKKyAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgorICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKKworICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKKyAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCisgICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAorICAgIGtLZXlSb3RhdGlvbkRlZ3JlZSAgICA9ICdyZGdlJywgIC8vIGludDMyX3QgKGNsb2Nrd2lzZSwgaW4gZGVncmVlKQorCisgICAga0tleU5vdFJlYWxUaW1lICAgICAgID0gJ250cnQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIE9nZyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgbG9vcGluZy4uLgorICAgIGtLZXlBdXRvTG9vcCAgICAgICAgICA9ICdhdXRMJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5VmFsaWRTYW1wbGVzICAgICAgPSAndmFsRCcsICAvLyBpbnQzMl90CisKKyAgICBrS2V5SXNVbnJlYWRhYmxlICAgICAgPSAndW5yZScsICAvLyBib29sIChpbnQzMl90KQogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggMWQ3NmExYS4uZmVkNjc2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjcsMTEgKzI3LDE3IEBACiAKIGNsYXNzIE1lbW9yeURlYWxlcjsKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyOworc3RydWN0IENvZGVjUHJvZmlsZUxldmVsOwogCiBzdHJ1Y3QgT01YQ29kZWMgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCiAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CiAgICAgZW51bSBDcmVhdGlvbkZsYWdzIHsKLSAgICAgICAga1ByZWZlclNvZnR3YXJlQ29kZWNzID0gMSwKKyAgICAgICAga1ByZWZlclNvZnR3YXJlQ29kZWNzICAgID0gMSwKKyAgICAgICAga0lnbm9yZUNvZGVjU3BlY2lmaWNEYXRhID0gMiwKKworICAgICAgICAvLyBUaGUgY2xpZW50IHdhbnRzIHRvIGFjY2VzcyB0aGUgb3V0cHV0IGJ1ZmZlcidzIHZpZGVvCisgICAgICAgIC8vIGRhdGEgZm9yIGV4YW1wbGUgZm9yIHRodW1ibmFpbCBleHRyYWN0aW9uLgorICAgICAgICBrQ2xpZW50TmVlZHNGcmFtZWJ1ZmZlciAgPSA0LAogICAgIH07CiAgICAgc3RhdGljIHNwPE1lZGlhU291cmNlPiBDcmVhdGUoCiAgICAgICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LApAQCAtNTIsNiArNTgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCiAgICAgdm9pZCBvbl9tZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOwogCiAgICAgLy8gZnJvbSBNZWRpYUJ1ZmZlck9ic2VydmVyCkBAIC05OCw2ICsxMDYsMTAgQEAKICAgICAgICAga0RlY29kZXJMaWVzQWJvdXROdW1iZXJPZkNoYW5uZWxzICAgICA9IDI1NiwKICAgICAgICAga0lucHV0QnVmZmVyU2l6ZXNBcmVCb2d1cyAgICAgICAgICAgICA9IDUxMiwKICAgICAgICAga1N1cHBvcnRzTXVsdGlwbGVGcmFtZXNQZXJJbnB1dEJ1ZmZlciA9IDEwMjQsCisgICAgICAgIGtBdm9pZE1lbWNvcHlJbnB1dFJlY29yZGluZ0ZyYW1lcyAgICAgPSAyMDQ4LAorICAgICAgICBrUmVxdWlyZXNMYXJnZXJFbmNvZGVyT3V0cHV0QnVmZmVyICAgID0gNDA5NiwKKyAgICAgICAga091dHB1dEJ1ZmZlcnNBcmVVbnJlYWRhYmxlICAgICAgICAgICA9IDgxOTIsCisgICAgICAgIGtTdG9yZU1ldGFEYXRhSW5JbnB1dFZpZGVvQnVmZmVycyAgICAgPSAxNjM4NCwKICAgICB9OwogCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewpAQCAtMTM3LDEyICsxNDksMTcgQEAKICAgICBib29sIG1Ob01vcmVPdXRwdXREYXRhOwogICAgIGJvb2wgbU91dHB1dFBvcnRTZXR0aW5nc0hhdmVDaGFuZ2VkOwogICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1TZWVrTW9kZTsKKyAgICBpbnQ2NF90IG1UYXJnZXRUaW1lVXM7CisgICAgaW50NjRfdCBtU2tpcFRpbWVVczsKIAogICAgIE1lZGlhQnVmZmVyICptTGVmdE92ZXJCdWZmZXI7CiAKICAgICBNdXRleCBtTG9jazsKICAgICBDb25kaXRpb24gbUFzeW5jQ29tcGxldGlvbjsKIAorICAgIGJvb2wgbVBhdXNlZDsKKwogICAgIC8vIEEgbGlzdCBvZiBpbmRpY2VzIGludG8gbVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0gZmlsbGVkIHdpdGggZGF0YS4KICAgICBMaXN0PHNpemVfdD4gbUZpbGxlZEJ1ZmZlcnM7CiAgICAgQ29uZGl0aW9uIG1CdWZmZXJGaWxsZWQ7CkBAIC0xNTYsOCArMTczLDggQEAKIAogICAgIHZvaWQgc2V0Q29tcG9uZW50Um9sZSgpOwogCi0gICAgdm9pZCBzZXRBTVJGb3JtYXQoYm9vbCBpc1dBTVIpOwotICAgIHZvaWQgc2V0QUFDRm9ybWF0KGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgdm9pZCBzZXRBTVJGb3JtYXQoYm9vbCBpc1dBTVIsIGludDMyX3QgYml0UmF0ZSk7CisgICAgdm9pZCBzZXRBQUNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGJpdFJhdGUpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApAQCAtMTY1LDEwICsxODIsMjQgQEAKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0KTsKIAogICAgIHZvaWQgc2V0VmlkZW9JbnB1dEZvcm1hdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CiAKLSAgICBzdGF0dXNfdCBzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoKTsKLSAgICBzdGF0dXNfdCBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBIMjYzRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICBzdGF0dXNfdCBzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICBzdGF0dXNfdCBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CisgICAgc3RhdHVzX3QgZmluZFRhcmdldENvbG9yRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBPTVhfQ09MT1JfRk9STUFUVFlQRSAqY29sb3JGb3JtYXQpOworCisgICAgc3RhdHVzX3QgaXNDb2xvckZvcm1hdFN1cHBvcnRlZCgKKyAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LCBpbnQgcG9ydEluZGV4KTsKKworICAgIC8vIElmIHByb2ZpbGUvbGV2ZWwgaXMgc2V0IGluIHRoZSBtZXRhIGRhdGEsIGl0cyB2YWx1ZSBpbiB0aGUgbWV0YQorICAgIC8vIGRhdGEgd2lsbCBiZSB1c2VkOyBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC4KKyAgICBzdGF0dXNfdCBnZXRWaWRlb1Byb2ZpbGVMZXZlbChjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsCisgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCYgZGVmYXVsdFByb2ZpbGVMZXZlbCwKKyAgICAgICAgICAgIENvZGVjUHJvZmlsZUxldmVsJiBwcm9maWxlTGV2ZWwpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9PdXRwdXRGb3JtYXQoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBPTVhfVTMyIHdpZHRoLCBPTVhfVTMyIGhlaWdodCk7CkBAIC0yMjMsOSArMjU0LDEwIEBACiAKICAgICB2b2lkIGR1bXBQb3J0U3RhdHVzKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvZGVjKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisgICAgc3RhdHVzX3QgY29uZmlndXJlQ29kZWMoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICBzdGF0aWMgdWludDMyX3QgZ2V0Q29tcG9uZW50UXVpcmtzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUpOworICAgIHN0YXRpYyB1aW50MzJfdCBnZXRDb21wb25lbnRRdWlya3MoCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBib29sIGlzRW5jb2Rlcik7CiAKICAgICBzdGF0aWMgdm9pZCBmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2E2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUF0b21pemVyLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9BVE9NSVpFUl9IXworCisjZGVmaW5lIEFfQVRPTUlaRVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFBdG9taXplciB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkF0b21pemUoY29uc3QgY2hhciAqbmFtZSk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIEFBdG9taXplciBnQXRvbWl6ZXI7CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBWZWN0b3I8TGlzdDxBU3RyaW5nPiA+IG1BdG9tczsKKworICAgIEFBdG9taXplcigpOworCisgICAgY29uc3QgY2hhciAqYXRvbWl6ZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHN0YXRpYyB1aW50MzJfdCBIYXNoKGNvbnN0IGNoYXIgKnMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUF0b21pemVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9BVE9NSVpFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNlZWEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9CQVNFX0hfCisKKyNkZWZpbmUgQV9CQVNFX0hfCisKKyNkZWZpbmUgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMobmFtZSkgXAorICAgIG5hbWUoY29uc3QgbmFtZSAmKTsgXAorICAgIG5hbWUgJm9wZXJhdG9yPShjb25zdCBuYW1lICYpCisKKyNlbmRpZiAgLy8gQV9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTM1MjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX0JJVF9SRUFERVJfSF8KKworI2RlZmluZSBBX0JJVF9SRUFERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQml0UmVhZGVyIHsKKyAgICBBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHVpbnQzMl90IGdldEJpdHMoc2l6ZV90IG4pOworICAgIHZvaWQgc2tpcEJpdHMoc2l6ZV90IG4pOworCisgICAgc2l6ZV90IG51bUJpdHNMZWZ0KCkgY29uc3Q7CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3QgdWludDhfdCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworCisgICAgdWludDMyX3QgbVJlc2Vydm9pcjsgIC8vIGxlZnQtYWxpZ25lZCBiaXRzCisgICAgc2l6ZV90IG1OdW1CaXRzTGVmdDsKKworICAgIHZvaWQgZmlsbFJlc2Vydm9pcigpOworICAgIHZvaWQgcHV0Qml0cyh1aW50MzJfdCB4LCBzaXplX3Qgbik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQml0UmVhZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9CSVRfUkVBREVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGYwYWVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX0JVRkZFUl9IXworCisjZGVmaW5lIEFfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworCitzdHJ1Y3QgQUJ1ZmZlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CisgICAgQUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpOworCisgICAgdm9pZCBzZXRGYXJld2VsbE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+IG1zZyk7CisKKyAgICB1aW50OF90ICpiYXNlKCkgeyByZXR1cm4gKHVpbnQ4X3QgKiltRGF0YTsgfQorICAgIHVpbnQ4X3QgKmRhdGEoKSB7IHJldHVybiAodWludDhfdCAqKW1EYXRhICsgbVJhbmdlT2Zmc2V0OyB9CisgICAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VMZW5ndGg7IH0KKyAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbVJhbmdlT2Zmc2V0OyB9CisKKyAgICB2b2lkIHNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgc2V0SW50MzJEYXRhKGludDMyX3QgZGF0YSkgeyBtSW50MzJEYXRhID0gZGF0YTsgfQorICAgIGludDMyX3QgaW50MzJEYXRhKCkgY29uc3QgeyByZXR1cm4gbUludDMyRGF0YTsgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbUZhcmV3ZWxsOworICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKKworICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtQ2FwYWNpdHk7CisgICAgc2l6ZV90IG1SYW5nZU9mZnNldDsKKyAgICBzaXplX3QgbVJhbmdlTGVuZ3RoOworCisgICAgaW50MzJfdCBtSW50MzJEYXRhOworCisgICAgYm9vbCBtT3duc0RhdGE7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQnVmZmVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAyMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfREVCVUdfSF8KKworI2RlZmluZSBBX0RFQlVHX0hfCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIExJVEVSQUxfVE9fU1RSSU5HX0lOVEVSTkFMKHgpICAgICN4CisjZGVmaW5lIExJVEVSQUxfVE9fU1RSSU5HKHgpIExJVEVSQUxfVE9fU1RSSU5HX0lOVEVSTkFMKHgpCisKKyNkZWZpbmUgQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAhKGNvbmRpdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRklMRV9fICI6IiBMSVRFUkFMX1RPX1NUUklORyhfX0xJTkVfXykgICAgXAorICAgICAgICAgICAgIiBDSEVDSygiICNjb25kaXRpb24gIikgZmFpbGVkLiIpCisKKyNkZWZpbmUgTUFLRV9DT01QQVJBVE9SKHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTxjbGFzcyBBLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU3RyaW5nIENvbXBhcmVfIyNzdWZmaXgoY29uc3QgQSAmYSwgY29uc3QgQiAmYikgeyAgICAgIFwKKyAgICAgICAgQVN0cmluZyByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoYSBvcCBiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoIiB2cy4gIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK01BS0VfQ09NUEFSQVRPUihFUSw9PSkKK01BS0VfQ09NUEFSQVRPUihORSwhPSkKK01BS0VfQ09NUEFSQVRPUihMRSw8PSkKK01BS0VfQ09NUEFSQVRPUihHRSw+PSkKK01BS0VfQ09NUEFSQVRPUihMVCw8KQorTUFLRV9DT01QQVJBVE9SKEdULD4pCisKKyNkZWZpbmUgQ0hFQ0tfT1AoeCx5LHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVN0cmluZyBfX19yZXMgPSBDb21wYXJlXyMjc3VmZml4KHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFfX19yZXMuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIiBDSEVDS18iICNzdWZmaXggIiggIiAjeCAiLCIgI3kgIikgZmFpbGVkOiAlcyIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19fcmVzLmNfc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBDSEVDS19FUSh4LHkpICAgQ0hFQ0tfT1AoeCx5LEVRLD09KQorI2RlZmluZSBDSEVDS19ORSh4LHkpICAgQ0hFQ0tfT1AoeCx5LE5FLCE9KQorI2RlZmluZSBDSEVDS19MRSh4LHkpICAgQ0hFQ0tfT1AoeCx5LExFLDw9KQorI2RlZmluZSBDSEVDS19MVCh4LHkpICAgQ0hFQ0tfT1AoeCx5LExULDwpCisjZGVmaW5lIENIRUNLX0dFKHgseSkgICBDSEVDS19PUCh4LHksR0UsPj0pCisjZGVmaW5lIENIRUNLX0dUKHgseSkgICBDSEVDS19PUCh4LHksR1QsPikKKworI2RlZmluZSBUUkVTUEFTUygpICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkIG5vdCBiZSBoZXJlLiIpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9ERUJVR19IXworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDhiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX0hBTkRMRVJfSF8KKworI2RlZmluZSBBX0hBTkRMRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBSGFuZGxlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBSGFuZGxlcigpCisgICAgICAgIDogbUlEKDApIHsKKyAgICB9CisKKyAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlEOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlcigpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBTG9vcGVyUm9zdGVyOworCisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtSUQ7CisKKyAgICB2b2lkIHNldElEKEFMb29wZXI6OmhhbmRsZXJfaWQgaWQpIHsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUhhbmRsZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3ODY2YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgQV9IQU5ETEVSX1JFRkxFQ1RPUl9IXworCisjZGVmaW5lIEFfSEFORExFUl9SRUZMRUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RydWN0IEFIYW5kbGVyUmVmbGVjdG9yIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBBSGFuZGxlclJlZmxlY3RvcihUICp0YXJnZXQpCisgICAgICAgIDogbVRhcmdldCh0YXJnZXQpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgc3A8VD4gdGFyZ2V0ID0gbVRhcmdldC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0YXJnZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgdGFyZ2V0LT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHdwPFQ+IG1UYXJnZXQ7CisKKyAgICBBSGFuZGxlclJlZmxlY3Rvcihjb25zdCBBSGFuZGxlclJlZmxlY3RvcjxUPiAmKTsKKyAgICBBSGFuZGxlclJlZmxlY3RvcjxUPiAmb3BlcmF0b3I9KGNvbnN0IEFIYW5kbGVyUmVmbGVjdG9yPFQ+ICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0hBTkRMRVJfUkVGTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUwYzVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX0xPT1BFUl9IXworCisjZGVmaW5lIEFfTE9PUEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUhhbmRsZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBTG9vcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHR5cGVkZWYgaW50MzJfdCBldmVudF9pZDsKKyAgICB0eXBlZGVmIGludDMyX3QgaGFuZGxlcl9pZDsKKworICAgIEFMb29wZXIoKTsKKworICAgIC8vIFRha2VzIGVmZmVjdCBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byBzdGFydCgpLgorICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIGhhbmRsZXJfaWQgcmVnaXN0ZXJIYW5kbGVyKGNvbnN0IHNwPEFIYW5kbGVyPiAmaGFuZGxlcik7CisgICAgdm9pZCB1bnJlZ2lzdGVySGFuZGxlcihoYW5kbGVyX2lkIGhhbmRsZXJJRCk7CisKKyAgICBzdGF0dXNfdCBzdGFydCgKKyAgICAgICAgICAgIGJvb2wgcnVuT25DYWxsaW5nVGhyZWFkID0gZmFsc2UsCisgICAgICAgICAgICBib29sIGNhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gUFJJT1JJVFlfREVGQVVMVAorICAgICAgICAgICAgKTsKKworICAgIHN0YXR1c190IHN0b3AoKTsKKworICAgIHN0YXRpYyBpbnQ2NF90IEdldE5vd1VzKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTG9vcGVyKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBTG9vcGVyUm9zdGVyOworCisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgaW50NjRfdCBtV2hlblVzOworICAgICAgICBzcDxBTWVzc2FnZT4gbU1lc3NhZ2U7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uOworCisgICAgQVN0cmluZyBtTmFtZTsKKworICAgIExpc3Q8RXZlbnQ+IG1FdmVudFF1ZXVlOworCisgICAgc3RydWN0IExvb3BlclRocmVhZDsKKyAgICBzcDxMb29wZXJUaHJlYWQ+IG1UaHJlYWQ7CisgICAgYm9vbCBtUnVubmluZ0xvY2FsbHk7CisKKyAgICB2b2lkIHBvc3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcyk7CisgICAgYm9vbCBsb29wKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTG9vcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9MT09QRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmQ0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTE9PUEVSX1JPU1RFUl9IXworCisjZGVmaW5lIEFfTE9PUEVSX1JPU1RFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlclJvc3RlciB7CisgICAgQUxvb3BlclJvc3RlcigpOworCisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCByZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiBsb29wZXIsIGNvbnN0IHNwPEFIYW5kbGVyPiAmaGFuZGxlcik7CisKKyAgICB2b2lkIHVucmVnaXN0ZXJIYW5kbGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKTsKKworICAgIHZvaWQgcG9zdE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgZGVsaXZlck1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgc3A8QUxvb3Blcj4gZmluZExvb3BlcihBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEhhbmRsZXJJbmZvIHsKKyAgICAgICAgd3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICAgICAgd3A8QUhhbmRsZXI+IG1IYW5kbGVyOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBLZXllZFZlY3RvcjxBTG9vcGVyOjpoYW5kbGVyX2lkLCBIYW5kbGVySW5mbz4gbUhhbmRsZXJzOworICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgbU5leHRIYW5kbGVySUQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTG9vcGVyUm9zdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9MT09QRVJfUk9TVEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzRjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9NRVNTQUdFX0hfCisKKyNkZWZpbmUgQV9NRVNTQUdFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFTdHJpbmc7CisKK3N0cnVjdCBBTWVzc2FnZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTWVzc2FnZSh1aW50MzJfdCB3aGF0ID0gMCwgQUxvb3Blcjo6aGFuZGxlcl9pZCB0YXJnZXQgPSAwKTsKKworICAgIHZvaWQgc2V0V2hhdCh1aW50MzJfdCB3aGF0KTsKKyAgICB1aW50MzJfdCB3aGF0KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFRhcmdldChBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCk7CisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCB0YXJnZXQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0SW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCBzZXRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkIHNldFNpemUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHZhbHVlKTsKKyAgICB2b2lkIHNldEZsb2F0KGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0IHZhbHVlKTsKKyAgICB2b2lkIHNldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2V0UG9pbnRlcihjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSk7CisgICAgdm9pZCBzZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcywgc3NpemVfdCBsZW4gPSAtMSk7CisgICAgdm9pZCBzZXRPYmplY3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaik7CisgICAgdm9pZCBzZXRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb2JqKTsKKworICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kU2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRGbG9hdChjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRQb2ludGVyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKip2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRPYmplY3QoY29uc3QgY2hhciAqbmFtZSwgc3A8UmVmQmFzZT4gKm9iaikgY29uc3Q7CisgICAgYm9vbCBmaW5kTWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBzcDxBTWVzc2FnZT4gKm9iaikgY29uc3Q7CisKKyAgICB2b2lkIHBvc3QoaW50NjRfdCBkZWxheVVzID0gMCk7CisKKyAgICBzcDxBTWVzc2FnZT4gZHVwKCkgY29uc3Q7CisKKyAgICBBU3RyaW5nIGRlYnVnU3RyaW5nKGludDMyX3QgaW5kZW50ID0gMCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVzc2FnZSgpOworCitwcml2YXRlOgorICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtUeXBlSW50MzIsCisgICAgICAgIGtUeXBlSW50NjQsCisgICAgICAgIGtUeXBlU2l6ZSwKKyAgICAgICAga1R5cGVGbG9hdCwKKyAgICAgICAga1R5cGVEb3VibGUsCisgICAgICAgIGtUeXBlUG9pbnRlciwKKyAgICAgICAga1R5cGVTdHJpbmcsCisgICAgICAgIGtUeXBlT2JqZWN0LAorICAgICAgICBrVHlwZU1lc3NhZ2UsCisgICAgfTsKKworICAgIHVpbnQzMl90IG1XaGF0OworICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgbVRhcmdldDsKKworICAgIHN0cnVjdCBJdGVtIHsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICAgICAgc2l6ZV90IHNpemVWYWx1ZTsKKyAgICAgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgICAgICBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgICAgICAgICB2b2lkICpwdHJWYWx1ZTsKKyAgICAgICAgICAgIFJlZkJhc2UgKnJlZlZhbHVlOworICAgICAgICAgICAgQVN0cmluZyAqc3RyaW5nVmFsdWU7CisgICAgICAgIH0gdTsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIFR5cGUgbVR5cGU7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrTWF4TnVtSXRlbXMgPSAxNgorICAgIH07CisgICAgSXRlbSBtSXRlbXNba01heE51bUl0ZW1zXTsKKyAgICBzaXplX3QgbU51bUl0ZW1zOworCisgICAgdm9pZCBjbGVhcigpOworICAgIEl0ZW0gKmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKTsKKyAgICB2b2lkIGZyZWVJdGVtKEl0ZW0gKml0ZW0pOworICAgIGNvbnN0IEl0ZW0gKmZpbmRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVzc2FnZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVTU0FHRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9TVFJJTkdfSF8KKworI2RlZmluZSBBX1NUUklOR19IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFTdHJpbmcgeworICAgIEFTdHJpbmcoKTsKKyAgICBBU3RyaW5nKGNvbnN0IGNoYXIgKnMpOworICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUpOworICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSk7CisgICAgQVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgbik7CisgICAgfkFTdHJpbmcoKTsKKworICAgIEFTdHJpbmcgJm9wZXJhdG9yPShjb25zdCBBU3RyaW5nICZmcm9tKTsKKyAgICB2b2lkIHNldFRvKGNvbnN0IGNoYXIgKnMpOworICAgIHZvaWQgc2V0VG8oY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUpOworICAgIHZvaWQgc2V0VG8oY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOworCisgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpjX3N0cigpIGNvbnN0OworCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworCisgICAgdm9pZCBjbGVhcigpOworICAgIHZvaWQgdHJpbSgpOworICAgIHZvaWQgZXJhc2Uoc2l6ZV90IHN0YXJ0LCBzaXplX3Qgbik7CisKKyAgICB2b2lkIGFwcGVuZChjaGFyIGMpIHsgYXBwZW5kKCZjLCAxKTsgfQorICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIgKnMpOworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGFwcGVuZChjb25zdCBBU3RyaW5nICZmcm9tKTsKKyAgICB2b2lkIGFwcGVuZChjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgbik7CisgICAgdm9pZCBhcHBlbmQoaW50IHgpOworICAgIHZvaWQgYXBwZW5kKHVuc2lnbmVkIHgpOworICAgIHZvaWQgYXBwZW5kKGxvbmcgeCk7CisgICAgdm9pZCBhcHBlbmQodW5zaWduZWQgbG9uZyB4KTsKKyAgICB2b2lkIGFwcGVuZChsb25nIGxvbmcgeCk7CisgICAgdm9pZCBhcHBlbmQodW5zaWduZWQgbG9uZyBsb25nIHgpOworICAgIHZvaWQgYXBwZW5kKGZsb2F0IHgpOworICAgIHZvaWQgYXBwZW5kKGRvdWJsZSB4KTsKKyAgICB2b2lkIGFwcGVuZCh2b2lkICp4KTsKKworICAgIHZvaWQgaW5zZXJ0KGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBpbnNlcnRpb25Qb3MpOworICAgIHZvaWQgaW5zZXJ0KGNvbnN0IGNoYXIgKmZyb20sIHNpemVfdCBzaXplLCBzaXplX3QgaW5zZXJ0aW9uUG9zKTsKKworICAgIHNzaXplX3QgZmluZChjb25zdCBjaGFyICpzdWJzdHJpbmcsIHNpemVfdCBzdGFydCA9IDApIGNvbnN0OworCisgICAgc2l6ZV90IGhhc2goKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKworICAgIGludCBjb21wYXJlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKworICAgIGJvb2wgc3RhcnRzV2l0aChjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworCisgICAgdm9pZCB0b2xvd2VyKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtFbXB0eVN0cmluZzsKKworICAgIGNoYXIgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbUFsbG9jU2l6ZTsKKworICAgIHZvaWQgbWFrZU11dGFibGUoKTsKK307CisKK0FTdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1NUUklOR19IXworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MGI4OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBCQVNFXzY0X0hfCisKKyNkZWZpbmUgQkFTRV82NF9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFTdHJpbmc7CisKK3NwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKK3ZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEJBU0VfNjRfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDgzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEhFWERVTVBfSF8KKworI2RlZmluZSBIRVhEVU1QX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIGhleGR1bXAoY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBIRVhEVU1QX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0F1ZGlvLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Mjg0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQXVkaW8uaApAQCAtMCwwICsxLDEzMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBAZmlsZSBPTVhfQXVkaW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBBdWRpbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCisgKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVubWlsdHMuCisgKi8KKworI2lmbmRlZiBPTVhfQXVkaW9faAorI2RlZmluZSBPTVhfQXVkaW9faAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfQ29yZS5oPgorCisvKiogQGRlZmdyb3VwIG1pZGkgTUlESQorICogQGluZ3JvdXAgYXVkaW8KKyAqLworIAorLyoqIEBkZWZncm91cCBlZmZlY3RzIEF1ZGlvIGVmZmVjdHMKKyAqIEBpbmdyb3VwIGF1ZGlvCisgKi8KKworLyoqIEBkZWZncm91cCBhdWRpbyBPcGVuTUFYIElMIEF1ZGlvIERvbWFpbgorICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBBdWRpbyBkb21haW4KKyAqIEB7CisgKi8KKworLyoqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSBhdWRpbyBjb2RpbmdzLiAgCisgKiAgSWYgIk9NWF9BVURJT19Db2RpbmdVbnVzZWQiIGlzIHNlbGVjdGVkLCB0aGUgY29kaW5nIHNlbGVjdGlvbiBtdXN0IAorICogIGJlIGRvbmUgaW4gYSB2ZW5kb3Igc3BlY2lmaWMgd2F5LiAgU2luY2UgdGhpcyBpcyBmb3IgYW4gYXVkaW8gCisgKiAgcHJvY2Vzc2luZyBlbGVtZW50IHRoaXMgZW51bSBpcyByZWxldmFudC4gIEhvd2V2ZXIsIGZvciBhbm90aGVyIAorICogIHR5cGUgb2YgY29tcG9uZW50IG90aGVyIGVudW1zIHdvdWxkIGJlIGluIHRoaXMgYXJlYS4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DT0RJTkdUWVBFIHsKKyAgICBPTVhfQVVESU9fQ29kaW5nVW51c2VkID0gMCwgIC8qKjwgUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBjb2RpbmcgaXMgTi9BICAqLworICAgIE9NWF9BVURJT19Db2RpbmdBdXRvRGV0ZWN0LCAgLyoqPCBhdXRvIGRldGVjdGlvbiBvZiBhdWRpbyBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUENNLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUENNIGNvZGluZyAqLworICAgIE9NWF9BVURJT19Db2RpbmdBRFBDTSwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBRFBDTSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQU1SLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQU1SIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHU01GUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gZnVsbHJhdGUgKGkuZS4gR1NNNjEwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHU01FRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nR1NNSFIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIEhhbGZyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdQRENGUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgRnVsbHJhdGUgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1BEQ0VGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUERDSFIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEhhbGZyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdURE1BRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBURE1BIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAoVElBL0VJQS0xMzYtNDIwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdURE1BRUZSLCAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBURE1BIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAoVElBL0VJQS0xMzYtNDEwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdRQ0VMUDgsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBRQ0VMUCA4a2JwcyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUUNFTFAxMywgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgMTNrYnBzIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdFVlJDLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBFVlJDIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdTTVYsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBTTVYgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MTEsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzExIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHNzIzLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyMyBkb3QgMSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRzcyNiwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjYgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MjksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzI5IGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdBQUMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBQUMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ01QMywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1QMyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nU0JDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgU0JDIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdWT1JCSVMsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBWT1JCSVMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1dNQSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFdNQSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUkEsICAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUkEgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ01JREksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1JREkgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQ09ESU5HVFlQRTsKKworCisvKiogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiAgbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgYXVkaW8gCisgKiAgcGF0aC4gIElmIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUKKyAqICBwb3J0IChzdWNoIGFzIGZyZXF1ZW5jeSksIGFkZGl0aW9uYWwgc3RydWN0dXJlcyBtdXN0IGJlIHNlbnQgc3VjaCBhcyB0aGUKKyAqICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgc3RydWN0dXJlIHRvIHN1cHBseSB0aGUgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOyAgICAgICAgICAgIC8qKjwgTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0ICovCisgICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7IC8qKiA8IHBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gb3V0cHV0IGRldmljZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAgKi8KKyAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7ICAvKio8IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50ICovCisgICAgT01YX0FVRElPX0NPRElOR1RZUEUgZUVuY29kaW5nOyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KK30gT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRTsKKworCisvKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCisgICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KKyAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KKyAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLworfSBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEU7CisKKworLyoqIFBDTSBtb2RlIHR5cGUgICovIAordHlwZWRlZiBlbnVtIE9NWF9BVURJT19QQ01NT0RFVFlQRSB7IAorICAgIE9NWF9BVURJT19QQ01Nb2RlTGluZWFyID0gMCwgIC8qKjwgTGluZWFyIFBDTSBlbmNvZGVkIGRhdGEgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVBTGF3LCAgICAgICAgLyoqPCBBIGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVNVUxhdywgICAgICAgLyoqPCBNdSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX1BDTU1vZGVNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fUENNTU9ERVRZUEU7IAorCisKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgeworICAgIE9NWF9BVURJT19DaGFubmVsTm9uZSA9IDB4MCwgICAgLyoqPCBVbnVzZWQgb3IgZW1wdHkgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExGICAgPSAweDEsICAgIC8qKjwgTGVmdCBmcm9udCAqLworICAgIE9NWF9BVURJT19DaGFubmVsUkYgICA9IDB4MiwgICAgLyoqPCBSaWdodCBmcm9udCAqLworICAgIE9NWF9BVURJT19DaGFubmVsQ0YgICA9IDB4MywgICAgLyoqPCBDZW50ZXIgZnJvbnQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExTICAgPSAweDQsICAgIC8qKjwgTGVmdCBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsUlMgICA9IDB4NSwgICAgLyoqPCBSaWdodCBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsTEZFICA9IDB4NiwgICAgLyoqPCBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbENTICAgPSAweDcsICAgIC8qKjwgQmFjayBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsTFIgICA9IDB4OCwgICAgLyoqPCBMZWZ0IHJlYXIuICovCisgICAgT01YX0FVRElPX0NoYW5uZWxSUiAgID0gMHg5LCAgICAvKio8IFJpZ2h0IHJlYXIuICovCisgICAgT01YX0FVRElPX0NoYW5uZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NoYW5uZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19DaGFubmVsTWF4ICA9IDB4N0ZGRkZGRkYgCit9IE9NWF9BVURJT19DSEFOTkVMVFlQRTsKKworI2RlZmluZSBPTVhfQVVESU9fTUFYQ0hBTk5FTFMgMTYgIC8qKjwgbWF4aW11bSBudW1iZXIgZGlzdGluY3QgYXVkaW8gY2hhbm5lbHMgdGhhdCBhIGJ1ZmZlciBtYXkgY29udGFpbiAqLworI2RlZmluZSBPTVhfTUlOX1BDTVBBWUxPQURfTVNFQyA1IC8qKjwgTWluaW11bSBhdWRpbyBidWZmZXIgcGF5bG9hZCBzaXplIGZvciB1bmNvbXByZXNzZWQgKFBDTSkgYXVkaW8gKi8KKworLyoqIFBDTSBmb3JtYXQgZGVzY3JpcHRpb24gKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAoZS5nLiAyIGZvciBzdGVyZW8pICovIAorICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlTnVtRGF0YTsgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBzaWduZWQgb3IgdW5zaWduZWQgKi8gCisgICAgT01YX0VORElBTlRZUEUgZUVuZGlhbjsgICAgICAgICAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIGxpdHRsZSBvciBiaWcgZW5kaWFuICovIAorICAgIE9NWF9CT09MIGJJbnRlcmxlYXZlZDsgICAgICAgICAgICAvKio8IFRydWUgZm9yIG5vcm1hbCBpbnRlcmxlYXZlZCBkYXRhOyBmYWxzZSBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWludGVybGVhdmVkIGRhdGEgKGUuZy4gYmxvY2sgZGF0YSkgKi8gCisgICAgT01YX1UzMiBuQml0UGVyU2FtcGxlOyAgICAgICAgICAgIC8qKjwgQml0IHBlciBzYW1wbGUgKi8gCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKKyAgICBPTVhfQVVESU9fUENNTU9ERVRZUEUgZVBDTU1vZGU7ICAgLyoqPCBQQ00gbW9kZSBlbnVtZXJhdGlvbiAqLyAKKyAgICBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgZUNoYW5uZWxNYXBwaW5nW09NWF9BVURJT19NQVhDSEFOTkVMU107IC8qKjwgU2xvdCBpIGNvbnRhaW5zIGNoYW5uZWwgZGVmaW5lZCBieSBlQ2hhbm5lbE1hcFtpXSAqLworCit9IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRTsgCisKKworLyoqIEF1ZGlvIGNoYW5uZWwgbW9kZS4gIFRoaXMgaXMgdXNlZCBieSBib3RoIEFBQyBhbmQgTVAzLCBhbHRob3VnaCB0aGUgbmFtZXMgYXJlIG1vcmUgYXBwcm9wcmlhdGUKKyAqIGZvciB0aGUgTVAzLiAgRm9yIGV4YW1wbGUsIEpvaW50U3RlcmVvIGZvciBNUDMgaXMgQ291cGxpbmdDaGFubmVscyBmb3IgQUFDLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgeworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVN0ZXJlbyA9IDAsICAvKio8IDIgY2hhbm5lbHMsIHRoZSBiaXRyYXRlIGFsbG9jYXRpb24gYmV0d2VlbiB0aG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBjaGFubmVscyBjaGFuZ2VzIGFjY29yZGluZ2x5IHRvIGVhY2ggY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUpvaW50U3RlcmVvLCAvKio8IG1vZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2Ygd2hhdCBpcyBjb21tb24gYmV0d2VlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGNoYW5uZWxzIGZvciBoaWdoZXIgY29tcHJlc3Npb24gZ2FpbiAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUR1YWwsICAgICAgICAvKio8IDIgbW9uby1jaGFubmVscywgZWFjaCBjaGFubmVsIGlzIGVuY29kZWQgd2l0aCBoYWxmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRyYXRlIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNb25vLCAgICAgICAgLyoqPCBNb25vIGNoYW5uZWwgbW9kZSAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRTsKKworCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgeworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDFMYXllcjMgPSAwLCAvKio8IE1QMyBBdWRpbyBNUEVHIDEgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMkxheWVyMywgICAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMiBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyXzVMYXllcjMsICAgLyoqPCBNUDMgQXVkaW8gTVBFRzIuNSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFOworCisvKiogTVAzIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgZUZvcm1hdDsgIC8qKjwgTVAzIHN0cmVhbSBmb3JtYXQgKi8KK30gT01YX0FVRElPX1BBUkFNX01QM1RZUEU7CisKKwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIHsKKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVAyQURUUyA9IDAsIC8qKjwgQUFDIEF1ZGlvIERhdGEgVHJhbnNwb3J0IFN0cmVhbSAyIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRBRFRTLCAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDQgZm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExPQVMsICAgICAvKio8IEFBQyBMb3cgT3ZlcmhlYWQgQXVkaW8gU3RyZWFtIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRMQVRNLCAgICAgLyoqPCBBQUMgTG93IG92ZXJoZWFkIEF1ZGlvIFRyYW5zcG9ydCBNdWx0aXBsZXggKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0QURJRiwgICAgICAgIC8qKjwgQUFDIEF1ZGlvIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGLCAgICAgICAvKio8IEFBQyBpbnNpZGUgTVBFRy00L0lTTyBGaWxlIEZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRSQVcsICAgICAgICAgLyoqPCBBQUMgUmF3IEZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEU7CisKKworLyoqIEFBQyBtb2RlIHR5cGUuICBOb3RlIHRoYXQgdGhlIHRlcm0gcHJvZmlsZSBpcyB1c2VkIHdpdGggdGhlIE1QRUctMgorICogc3RhbmRhcmQgYW5kIHRoZSB0ZXJtIG9iamVjdCB0eXBlIGFuZCBwcm9maWxlIGlzIHVzZWQgd2l0aCBNUEVHLTQgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEV7CisgIE9NWF9BVURJT19BQUNPYmplY3ROdWxsID0gMCwgICAgICAvKio8IE51bGwsIG5vdCB1c2VkICovCisgIE9NWF9BVURJT19BQUNPYmplY3RNYWluID0gMSwgICAgICAvKio8IEFBQyBNYWluIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgICAgLyoqPCBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChBQUMgcHJvZmlsZSkgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIFNhbXBsZSBSYXRlIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgICAgLyoqPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24gb2JqZWN0ICovCisgIE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgICAvKio8IEFBQyBIaWdoIEVmZmljaWVuY3kgKG9iamVjdCB0eXBlIFNCUiwgSEUtQUFDIHByb2ZpbGUpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RTY2FsYWJsZSwgICAgICAvKio8IEFBQyBTY2FsYWJsZSBvYmplY3QgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEVSTEMgPSAxNywgICAgIC8qKjwgRVIgQUFDIExvdyBDb21wbGV4aXR5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50IEFBQy1MQykgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdExEID0gMjMsICAgICAgIC8qKjwgQUFDIExvdyBEZWxheSBvYmplY3QgKEVycm9yIFJlc2lsaWVudCkgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTID0gMjksICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSB3aXRoIFBhcmFtZXRyaWMgU3RlcmVvIGNvZGluZyAoSEUtQUFDIHYyLCBvYmplY3QgdHlwZSBQUykgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX0FBQ09iamVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19BQUNPYmplY3RNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRTsKKworCisvKiogQUFDIHRvb2wgdXNhZ2UgKGZvciBuQUFDdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KKyAqIFJlcXVpcmVkIGZvciBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQuCisgKiBGb3IgTVAzLCBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGlzIHN1ZmZpY2llbnQuICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTm9uZSAweDAwMDAwMDAwIC8qKjwgbm8gQUFDIHRvb2xzIGFsbG93ZWQgKGVuY29kZXIgY29uZmlnKSBvciBhY3RpdmUgKGRlY29kZXIgaW5mbyBvdXRwdXQpICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTVMgICAweDAwMDAwMDAxIC8qKjwgTVM6IE1pZC9zaWRlIGpvaW50IGNvZGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sSVMgICAweDAwMDAwMDAyIC8qKjwgSVM6IEludGVuc2l0eSBzdGVyZW8gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbFROUyAgMHgwMDAwMDAwNCAvKio8IFROUzogVGVtcG9yYWwgTm9pc2UgU2hhcGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sUE5TICAweDAwMDAwMDA4IC8qKjwgUE5TOiBNUEVHLTQgUGVyY2VwdHVhbCBOb2lzZSBzdWJzdGl0dXRpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbExUUCAgMHgwMDAwMDAxMCAvKio8IExUUDogTVBFRy00IExvbmcgVGVybSBQcmVkaWN0aW9uIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xBbGwgIDB4N0ZGRkZGRkYgLyoqPCBhbGwgQUFDIHRvb2xzIGFsbG93ZWQgb3IgYWN0aXZlICgqLworCisvKiogTVBFRy00IEFBQyBlcnJvciByZXNpbGllbmNlIChFUikgdG9vbCB1c2FnZSAoZm9yIG5BQUNFUnRvb2xzIGluIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSkuCisgKiBSZXF1aXJlZCBmb3IgRVIgZW5jb2RlciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25hbCBhcyBkZWNvZGVyIGluZm8gb3V0cHV0ICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUk5vbmUgIDB4MDAwMDAwMDAgIC8qKjwgbm8gQUFDIEVSIHRvb2xzIGFsbG93ZWQvdXNlZCAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJWQ0IxMSAweDAwMDAwMDAxICAvKio8IFZDQjExOiBWaXJ0dWFsIENvZGUgQm9va3MgZm9yIEFBQyBzZWN0aW9uIGRhdGEgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSUlZMQyAgMHgwMDAwMDAwMiAgLyoqPCBSVkxDOiBSZXZlcnNpYmxlIFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSSENSICAgMHgwMDAwMDAwNCAgLyoqPCBIQ1I6IEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZyAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJBbGwgICAweDdGRkZGRkZGICAvKio8IGFsbCBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCisKKworLyoqIEFBQyBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgICAgICAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KKyAgICBPTVhfVTMyIG5GcmFtZUxlbmd0aDsgICAgICAgICAgLyoqPCBGcmFtZSBsZW5ndGggKGluIGF1ZGlvIHNhbXBsZXMgcGVyIGNoYW5uZWwpIG9mIHRoZSBjb2RlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgMTAyNCBvciA5NjAgKEFBQy1MQyksIDIwNDggKEhFLUFBQyksIDQ4MCBvciA1MTIgKEFBQy1MRCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCisgICAgT01YX1UzMiBuQUFDdG9vbHM7ICAgICAgICAgICAgIC8qKjwgQUFDIHRvb2wgdXNhZ2UgKi8KKyAgICBPTVhfVTMyIG5BQUNFUnRvb2xzOyAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgdG9vbCB1c2FnZSAqLworICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQUFDUHJvZmlsZTsgICAvKio8IEFBQyBwcm9maWxlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgZUFBQ1N0cmVhbUZvcm1hdDsgLyoqPCBBQUMgc3RyZWFtIGZvcm1hdCBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCit9IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRTsKKworCisvKiogVk9SQklTIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGVuY29kZWQgZGF0YSBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMuIEVuY29kaW5nIGlzIHNldCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSBjbG9zZXN0IHRvIHNwZWNpZmllZCAgdmFsdWUgKGluIGJwcykgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtaW5pbXVtIGJpdHJhdGUgKGluIGJwcykuICovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAvKio8IFNldHMgbWF4aW11bSBiaXRyYXRlIChpbiBicHMpLiAqLworCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9TMzIgblF1YWxpdHk7CQkgIC8qKjwgU2V0cyBlbmNvZGluZyBxdWFsaXR5IHRvIG4sIGJldHdlZW4gLTEgKGxvdykgYW5kIDEwIChoaWdoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGRlZmF1bHQgbW9kZSBvZiBvcGVyYXRpb24sIHRlaCBxdWFsaXR5IGxldmVsIGlzIDMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBxdWFsaXR5IHJhbmdlIGlzIDAgLSAxMC4gKi8KKyAgICBPTVhfQk9PTCBiTWFuYWdlZDsJCSAgLyoqPCBTZXQgIGJpdHJhdGUgIG1hbmFnZW1lbnQgIG1vZGUuIFRoaXMgdHVybnMgb2ZmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgVkJSIGVuY29kaW5nLCBidXQgYWxsb3dzIGhhcmQgb3Igc29mdCBiaXRyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzIHRvIGJlIGVuZm9yY2VkIGJ5IHRoZSBlbmNvZGVyLiBUaGlzIG1vZGUgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNsb3dlciwgYW5kIG1heSBhbHNvIGJlIGxvd2VyIHF1YWxpdHkuIEl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcmlseSB1c2VmdWwgZm9yIHN0cmVhbWluZy4gKi8KKyAgICBPTVhfQk9PTCBiRG93bm1peDsJCSAgLyoqPCBEb3dubWl4IGlucHV0IGZyb20gc3RlcmVvIHRvIG1vbm8gKGhhcyBubyBlZmZlY3Qgb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGVyZW8gc3RyZWFtcykuIFVzZWZ1bCBmb3IgbG93ZXItYml0cmF0ZSBlbmNvZGluZy4gKi8gICAgIAorfSBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRTsKKworCisvKiogV01BIFZlcnNpb24gKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BRk9STUFUVFlQRSB7CisgIE9NWF9BVURJT19XTUFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IGZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICBPTVhfQVVESU9fV01BRm9ybWF0NywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA3ICovCisgIE9NWF9BVURJT19XTUFGb3JtYXQ4LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDggKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdDksICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOSAqLworICBPTVhfQVVESU9fV01BRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fV01BRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1dNQUZPUk1BVFRZUEU7CisKKworLyoqIFdNQSBQcm9maWxlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIHsKKyAgT01YX0FVRElPX1dNQVByb2ZpbGVVbnVzZWQgPSAwLCAgLyoqPCBwcm9maWxlIHVudXNlZCBvciB1bmtub3duICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTDEsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMSAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZUwyLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDIgKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVMMywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwzICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fV01BUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEU7CisKKworLyoqIFdNQSBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTE2IG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfQVVESU9fV01BRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KKwlPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgZVByb2ZpbGU7ICAvKio8IFByb2ZpbGUgb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8KKyAgICBPTVhfVTE2IG5CbG9ja0FsaWduOyAgICAgIC8qKjwgaXMgdGhlIGJsb2NrIGFsaWdubWVudCwgb3IgYmxvY2sgc2l6ZSwgaW4gYnl0ZXMgb2YgdGhlIGF1ZGlvIGNvZGVjICovCisgICAgT01YX1UxNiBuRW5jb2RlT3B0aW9uczsgICAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KKyAgICBPTVhfVTMyIG5TdXBlckJsb2NrQWxpZ247IC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLworfSBPTVhfQVVESU9fUEFSQU1fV01BVFlQRTsKKworLyoqIAorICogUmVhbEF1ZGlvIGZvcm1hdAorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1JBRk9STUFUVFlQRSB7CisgICAgT01YX0FVRElPX1JBRm9ybWF0VW51c2VkID0gMCwgLyoqPCBGb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fUkE4LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA4IGNvZGVjICovCisgICAgT01YX0FVRElPX1JBOSwgICAgICAgICAgICAgICAgLyoqPCBSZWFsQXVkaW8gOSBjb2RlYyAqLworICAgIE9NWF9BVURJT19SQTEwX0FBQywgICAgICAgICAgIC8qKjwgTVBFRy00IEFBQyBjb2RlYyBmb3IgYml0cmF0ZXMgb2YgbW9yZSB0aGFuIDEyOGticHMgKi8KKyAgICBPTVhfQVVESU9fUkExMF9DT0RFQywgICAgICAgICAvKio8IFJlYWxBdWRpbyBjb2RlYyBmb3IgYml0cmF0ZXMgbGVzcyB0aGFuIDEyOCBrYnBzICovCisgICAgT01YX0FVRElPX1JBMTBfTE9TU0xFU1MsICAgICAgLyoqPCBSZWFsQXVkaW8gTG9zc2xlc3MgKi8KKyAgICBPTVhfQVVESU9fUkExMF9NVUxUSUNIQU5ORUwsICAvKio8IFJlYWxBdWRpbyBNdWx0aWNoYW5uZWwgKi8KKyAgICBPTVhfQVVESU9fUkExMF9WT0lDRSwgICAgICAgICAvKio8IFJlYWxBdWRpbyBWb2ljZSBmb3IgYml0cmF0ZXMgYmVsb3cgMTUga2JwcyAqLworICAgIE9NWF9BVURJT19SQUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fUkFGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19SQUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1JBRk9STUFUVFlQRTsKKworLyoqIFJBIChSZWFsIEF1ZGlvKSBwYXJhbXMgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUkFUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8gCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgIC8qKjwgaXMgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhICovIAorICAgIE9NWF9VMzIgbkJpdHNQZXJGcmFtZTsgICAgICAvKio8IGlzIHRoZSB2YWx1ZSBmb3IgYml0cyBwZXIgZnJhbWUgICovIAorICAgIE9NWF9VMzIgblNhbXBsZVBlckZyYW1lOyAgICAvKio8IGlzIHRoZSB2YWx1ZSBmb3Igc2FtcGxlcyBwZXIgZnJhbWUgKi8gCisgICAgT01YX1UzMiBuQ291cGxpbmdRdWFudEJpdHM7IC8qKjwgaXMgdGhlIG51bWJlciBvZiBjb3VwbGluZyBxdWFudGl6YXRpb24gYml0cyBpbiB0aGUgc3RyZWFtICovIAorICAgIE9NWF9VMzIgbkNvdXBsaW5nU3RhcnRSZWdpb247ICAgLyoqPCBpcyB0aGUgY291cGxpbmcgc3RhcnQgcmVnaW9uIGluIHRoZSBzdHJlYW0gICovIAorICAgIE9NWF9VMzIgbk51bVJlZ2lvbnM7ICAgICAgICAvKio8IGlzIHRoZSBudW1iZXIgb2YgcmVnaW9ucyB2YWx1ZSAqLyAKKyAgICBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgaXMgdGhlIFJlYWxBdWRpbyBhdWRpbyBmb3JtYXQgKi8KK30gT01YX0FVRElPX1BBUkFNX1JBVFlQRTsgCisKKworLyoqIFNCQyBBbGxvY2F0aW9uIE1ldGhvZCBUeXBlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRSB7CisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZExvdWRuZXNzLCAvKio8IExvdWRuZXNzIGFsbG9jYXRpb24gbWV0aG9kICovCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZFNOUiwgICAgICAvKio8IFNOUiBhbGxvY2F0aW9uIG1ldGhvZCAqLworICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRTsKKworCisvKiogU0JDIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5CbG9ja3M7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBibG9ja3MgKi8KKyAgICBPTVhfVTMyIG5TdWJiYW5kczsgICAgICAgICAvKio8IE51bWJlciBvZiBzdWJiYW5kcyAqLworICAgIE9NWF9VMzIgbkJpdFBvb2w7ICAgICAgICAgIC8qKjwgQml0cG9vbCB2YWx1ZSAqLworICAgIE9NWF9CT09MIGJFbmFibGVCaXRyYXRlOyAgIC8qKjwgVXNlIGJpdHJhdGUgdmFsdWUgaW5zdGVhZCBvZiBiaXRwb29sICovCisgICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7IC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRSBlU0JDQWxsb2NUeXBlOyAgIC8qKjwgU0JDIEFsbG9jYXRpb24gbWV0aG9kIHR5cGUgKi8KK30gT01YX0FVRElPX1BBUkFNX1NCQ1RZUEU7CisKKworLyoqIEFEUENNIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgT01YX1UzMiBuQml0c1BlclNhbXBsZTsgICAgIC8qKjwgTnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBzYW1wbGUgKi8gCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovIAorfSBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFOyAKKworCisvKiogRzcyMyByYXRlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjNSQVRFIHsKKyAgICBPTVhfQVVESU9fRzcyM01vZGVVbnVzZWQgPSAwLCAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fRzcyM01vZGVMb3csICAgICAgICAgLyoqPCA1MzAwIGJwcyAqLworICAgIE9NWF9BVURJT19HNzIzTW9kZUhpZ2gsICAgICAgICAvKio8IDYzMDAgYnBzICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19HNzIzTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRzcyM1JBVEU7CisKKworLyoqIEc3MjMgLSBTYW1wbGUgcmF0ZSBtdXN0IGJlIDggS0h6ICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovIAorICAgIE9NWF9BVURJT19HNzIzUkFURSBlQml0UmF0ZTsgIC8qKjwgdG9kbzogU2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gYSBjb25maWc/ICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLyAKKyAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBQb3N0IEZpbHRlciAqLyAKK30gT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFOyAKKworCisvKiogSVRVIEc3MjYgKEFEUENNKSByYXRlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjZNT0RFIHsKKyAgICBPTVhfQVVESU9fRzcyNk1vZGVVbnVzZWQgPSAwLCAgLyoqPCBHNzI2IE1vZGUgdW51c2VkIC8gdW5rbm93biAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZTE2LCAgICAgICAgICAvKio8IDE2IGticHMgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGUyNCwgICAgICAgICAgLyoqPCAyNCBrYnBzICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlMzIsICAgICAgICAgIC8qKjwgMzIga2JwcywgbW9zdCBjb21tb24gcmF0ZSwgYWxzbyBHNzIxICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlNDAsICAgICAgICAgIC8qKjwgNDAga2JwcyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fRzcyNk1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0c3MjZNT0RFOworCisKKy8qKiBHLjcyNiBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBtdXN0IGJlIGF0IDhLSHogKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgIE9NWF9BVURJT19HNzI2TU9ERSBlRzcyNk1vZGU7Cit9IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRTsgCisKKworLyoqIEc3MjkgY29kZXIgdHlwZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzI5VFlQRSB7CisgICAgT01YX0FVRElPX0c3MjkgPSAwLCAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5QSwgICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4IEEgIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5QiwgICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IHdpdGggYW5uZXggQiBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fRzcyOUFCLCAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSBhbm5leGVzIEEgYW5kIEIgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0c3MjlLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0c3MjlWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19HNzI5TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRzcyOVRZUEU7CisKKworLyoqIEc3Mjkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzIC0gZml4ZWQgNktIeiBzYW1wbGUgcmF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQVVESU9fRzcyOVRZUEUgZUJpdFR5cGU7Cit9IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRTsKKworCisvKiogQU1SIEZyYW1lIGZvcm1hdCAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIHsgCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0Q29uZm9ybWFuY2UgPSAwLCAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIENvbmZvcm1hbmNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkKSBGb3JtYXQgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYxLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAxICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMiwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBJbnRlcmZhY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMiovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEZTRiwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBGaWxlIFN0b3JhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0UlRQUGF5bG9hZCwgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIFJlYWwtVGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCBQcm90b2NvbCBQYXlsb2FkIEZvcm1hdCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJVFUsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBJVFUgRm9ybWF0IChhZGRlZCBhdCBNb3Rvcm9sYSByZXF1ZXN0KSAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFOyAKKworCisvKiogQU1SIGJhbmQgbW9kZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgeworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVVudXNlZCA9IDAsICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIwLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDAgPSAgNDc1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjEsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMSA9ICA1MTUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMiwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAyID0gIDU5MDAgYnBzICovIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMywgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAzID0gIDY3MDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI0LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDQgPSAgNzQwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjUsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNSA9ICA3OTUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNiwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA2ID0gMTAyMDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI3LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDcgPSAxMjIwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMCA9ICA2NjAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAxID0gIDg4NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDIgPSAxMjY1MCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDMgPSAxNDI1MCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I0LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDQgPSAxNTg1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjUsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNSA9IDE4MjUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNiwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA2ID0gMTk4NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I3LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDcgPSAyMzA1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjgsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgOCA9IDIzODUwIGJwcyAqLyAgICAgIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRTsKKyAgICAgCisKKy8qKiBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gbW9kZSAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgeyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9mZiA9IDAsICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIGlzIGRpc2FibGVkICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQxLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAxIChWQUQxKSBpcyBlbmFibGVkICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQyLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAyIChWQUQyKSBpcyBlbmFibGVkICovICAgICAgIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25BdXRvLCAgICAgICAgIC8qKjwgVGhlIGNvZGVjIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgYmV0d2VlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZiwgVkFEMSBvciBWQUQyIG1vZGVzICovIAorCisgICAgT01YX0FVRElPX0FNUkRUWGFzRUZSLCAgICAgICAgICAgICAvKio8IERUWCBhcyBFRlIgaW5zdGVhZCBvZiBBTVIgc3RhbmRhcmQgKDNHUFAgMjYuMTAxLCBmcmFtZSB0eXBlID04LDksMTApICovCisKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEU7IAorIAorCisvKiogQU1SIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIHJlYWQgb25seSBmaWVsZCAqLworICAgIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgZUFNUkJhbmRNb2RlOyAvKio8IEFNUiBCYW5kIE1vZGUgZW51bWVyYXRpb24gKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1PREVUWVBFICBlQU1SRFRYTW9kZTsgIC8qKjwgQU1SIERUWCBNb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSBlQU1SRnJhbWVGb3JtYXQ7IC8qKjwgQU1SIGZyYW1lIGZvcm1hdCBlbnVtZXJhdGlvbiAqLworfSBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRTsKKworCisvKiogR1NNX0ZSIChFVFNJIDA2LjEwLCAzR1BQIDQ2LjAxMCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFOworCisKKy8qKiBHU00tSFIgKEVUU0kgMDYuMjAsIDNHUFAgNDYuMDIwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01IUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9HU01IUlRZUEU7CisKKworLyoqIEdTTS1FRlIgKEVUU0kgMDYuNjAsIDNHUFAgNDYuMDYwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRTsKKworCisvKiogVERNQSBGUiAoVElBL0VJQS0xMzYtNDIwLCBWU0VMUCA3Ljk1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEU7CisKKworLyoqIFRETUEgRUZSIChUSUEvRUlBLTEzNi00MTAsIEFDRUxQIDcuNGticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1RETUFFRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEU7CisKKworLyoqIFBEQyBGUiAoIFJDUi0yNywgVlNFTFAgNi43a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFOworCisKKy8qKiBQREMgRUZSICggUkNSLTI3LCBBQ0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRTsKKworLyoqIFBEQyBIUiAoIFJDUi0yNywgUFNJLUNFTFAgMy40NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRTsKKworCisvKiogQ0RNQSBSYXRlIHR5cGVzICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0NETUFSQVRFVFlQRSB7CisgICAgT01YX0FVRElPX0NETUFSYXRlQmxhbmsgPSAwLCAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpcyBibGFuayAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUZ1bGwsICAgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gZnVsbCByYXRlICovCisgICAgT01YX0FVRElPX0NETUFSYXRlSGFsZiwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBoYWxmIHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVRdWFydGVyLCAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIHF1YXJ0ZXIgcmF0ZSAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUVpZ2h0aCwgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gZWlnaHRoIHJhdGUgKERUWCkqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUVyYXN1cmUsICAgICAgICAgICAgLyoqPCBDRE1BIGVyYXN1cmUgZnJhbWUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NETUFSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19DRE1BUkFURVRZUEU7CisKKworLyoqIFFDRUxQOCAoVElBL0VJQS05NiwgdXAgdG8gOGticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLworfSBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRTsKKworCisvKiogUUNFTFAxMyAoIENETUEsIEVJQS9USUEtNzMzLCAxMy4za2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCit9IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRTsKKworCisvKiogRVZSQyAoIENETUEsIEVJQS9USUEtMTI3LCBSQ0VMUCB1cCB0byA4LjU1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRVZSQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBhY3R1YWwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9CT09MIGJSQVRFX1JFRFVDb247ICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KKyAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLworICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fRVZSQ1RZUEU7CisKKworLyoqIFNNViAoIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9CT09MIGJSQVRFX1JFRFVDb247ICAgICAgICAgICAvKio8IFJBVEVfUkVEVUN0aW9uIGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBmcmFtZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgPz8qLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ID8/Ki8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciA/PyovCisgICAgT01YX0JPT0wgYk5vaXNlU3VwcHJlc3NvcjsgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIG5vaXNlIHN1cHByZXNzb3IgcHJlLXByb2Nlc3NpbmcgKi8KKyAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBkZWNvZGVyJ3MgcG9zdCBGaWx0ZXIgPz8qLworfSBPTVhfQVVESU9fUEFSQU1fU01WVFlQRTsKKworCisvKiogTUlESSBGb3JtYXQgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUKK3sKKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFVua25vd24gPSAwLCAvKio8IE1JREkgRm9ybWF0IHVua25vd24gb3IgZG9uJ3QgY2FyZSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMCwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMCAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMSwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMiwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMiAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U1BNSURJLCAgICAgIC8qKjwgU1AtTUlESSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0WE1GMCwgICAgICAgIC8qKjwgZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAwICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYxLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDEgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1vYmlsZVhNRiwgICAvKio8IE1vYmlsZSBYTUYgKGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMikgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NSURJRk9STUFUVFlQRTsKKworCisvKiogTUlESSBwYXJhbXMgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuRmlsZVNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgTUlESSBmaWxlIGluIGJ5dGVzLCB3aGVyZSB0aGUgZW50aXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgZmlsZSBwYXNzZWQgaW4sIG90aGVyd2lzZSBpZiAweDAsIHRoZSBNSURJIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWVyZ2VkIGFuZCBzdHJlYW1lZCAoaW5zdGVhZCBvZiBwYXNzZWQgYXMgYW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlIE1JREkgZmlsZSkgKi8KKyAgICBPTVhfQlUzMiBzTWF4UG9seXBob255OyAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2ltdWx0YW5lb3VzIHBvbHlwaG9uaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255IG9mIHRoZSBkZXZpY2UgaXMgdXNlZCAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfQk9PTCBiTG9hZERlZmF1bHRTb3VuZDsgICAgLyoqPCBXaGV0aGVyIHRvIGxvYWQgZGVmYXVsdCBzb3VuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5rIGF0IGluaXRpYWxpemF0aW9uICovCisgICAgT01YX0FVRElPX01JRElGT1JNQVRUWVBFIGVNaWRpRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgdGhlIE1JREkgZmlsZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEU7CisKKworLyoqIFR5cGUgb2YgdGhlIE1JREkgc291bmQgYmFuayAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRSB7CisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtVbnVzZWQgPSAwLCAgICAgICAgICAgLyoqPCB1bnVzZWQvdW5rbm93biBzb3VuZGJhbmsgdHlwZSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rRExTMSwgICAgICAgICAgICAgICAgIC8qKjwgRExTIHZlcnNpb24gMSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rRExTMiwgICAgICAgICAgICAgICAgIC8qKjwgRExTIHZlcnNpb24gMiAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTQmFzZSwgICAgICAgIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIGJhc2UgZnVuY3Rpb25hbGl0eSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTUGx1c09wdGlvbnMsIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIHNwZWNpZmljYXRpb24tZGVmaW5lZCBvcHRpb25hbCBmZWF0dXJlIHNldCAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFOworCisKKy8qKiBCYW5rIExheW91dCBkZXNjcmliZXMgaG93IGJhbmsgTVNCICYgTFNCIGFyZSB1c2VkIGluIHRoZSBETFMgaW5zdHJ1bWVudCBkZWZpbml0aW9ucyBzb3VuZCBiYW5rIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFIHsKKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VW51c2VkID0gMCwgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNLCAgICAgICAgICAgLyoqPCBHUyBsYXlvdXQgKGJhc2VkIG9uIGJhbmsgTVNCIDB4MDApICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNMiwgICAgICAgICAgLyoqPCBHZW5lcmFsIE1JREkgMiBsYXlvdXQgKHVzaW5nIE1TQiAweDc4LzB4NzksIExTQiAweDAwKSAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVc2VyLCAgICAgICAgIC8qKjwgRG9lcyBub3QgY29uZm9ybSB0byBhbnkgYmFuayBudW1iZXJpbmcgc3RhbmRhcmRzICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEU7CisKKworLyoqIE1JREkgcGFyYW1zIHRvIGxvYWQvdW5sb2FkIHVzZXIgc291bmRiYW5rIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5ETFNJbmRleDsgICAgICAgIC8qKjwgRExTIGZpbGUgaW5kZXggdG8gYmUgbG9hZGVkICovCisgICAgT01YX1UzMiBuRExTU2l6ZTsgICAgICAgICAvKio8IFNpemUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfUFRSIHBETFNEYXRhOyAgICAgICAgIC8qKjwgUG9pbnRlciB0byBETFMgZmlsZSBkYXRhICovCisgICAgT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIGVNaWRpU291bmRCYW5rOyAgIC8qKjwgTWlkaSBzb3VuZCBiYW5rIHR5cGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgZU1pZGlTb3VuZEJhbmtMYXlvdXQ7IC8qKjwgTWlkaSBzb3VuZCBiYW5rIGxheW91dCBlbnVtZXJhdGlvbiAqLworfSBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFOworCisKKy8qKiBTdHJ1Y3R1cmUgZm9yIExpdmUgTUlESSBldmVudHMgYW5kIE1JUCBtZXNzYWdlcy4gCisgKiAoTUlQID0gTWF4aW11bSBJbnN0YW50YW5lb3VzIFBvbHlwaG9ueTsgcGFydCBvZiB0aGUgU1AtTUlESSBzdGFuZGFyZC4pIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbk1pZGlFdmVudFNpemU7ICAgLyoqPCBTaXplIG9mIGltbWVkaWF0ZSBNSURJIGV2ZW50cyBvciBNSVAgbWVzc2FnZSBpbiBieXRlcyAgKi8KKyAgICBPTVhfVTggbk1pZGlFdmVudHNbMV07ICAgIC8qKjwgTUlESSBldmVudCBhcnJheSB0byBiZSByZW5kZXJlZCBpbW1lZGlhdGVseSwgb3IgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgZm9yIHRoZSBNSVAgbWVzc2FnZSBidWZmZXIsIHdoZXJlIHRoZSBzaXplIGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgbk1pZGlFdmVudFNpemUgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFOworCisKKy8qKiBNSURJIHNvdW5kIGJhbmsvIHByb2dyYW0gcGFpciBpbiBhIGdpdmVuIGNoYW5uZWwgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBWYWxpZCBjaGFubmVsIHZhbHVlcyByYW5nZSBmcm9tIDEgdG8gMTYgKi8KKyAgICBPTVhfVTE2IG5JRFByb2dyYW07ICAgICAgICAgLyoqPCBWYWxpZCBwcm9ncmFtIElEIHJhbmdlIGlzIDEgdG8gMTI4ICovCisgICAgT01YX1UxNiBuSURTb3VuZEJhbms7ICAgICAgIC8qKjwgU291bmQgYmFuayBJRCAqLworICAgIE9NWF9VMzIgblVzZXJTb3VuZEJhbmtJbmRleDsvKio8IFVzZXIgc291bmRiYW5rIGluZGV4LCBlYXNpZXIgdG8gYWNjZXNzIHNvdW5kYmFua3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgaW5kZXggaWYgbXVsdGlwbGUgYmFua3MgYXJlIHByZXNlbnQgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEU7CisKKworLyoqIE1JREkgY29udHJvbCAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CUzMyIHNQaXRjaFRyYW5zcG9zaXRpb247IC8qKjwgUGl0Y2ggdHJhbnNwb3NpdGlvbiBpbiBzZW1pdG9uZXMsIHN0b3JlZCBhcyBRMjIuMTAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgYmFzZWQgb24gSkFWQSBNTUFQSSAoSlNSLTEzNSkgcmVxdWlyZW1lbnQgKi8KKyAgICBPTVhfQlUzMiBzUGxheUJhY2tSYXRlOyAgICAgICAvKio8IFJlbGF0aXZlIHBsYXliYWNrIHJhdGUsIHN0b3JlZCBhcyBRMTQuMTcgZml4ZWQtcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiYXNlZCBvbiBKU1ItMTM1IHJlcXVpcmVtZW50ICovCisgICAgT01YX0JVMzIgc1RlbXBvIDsgICAgICAgICAgICAgLyoqPCBUZW1wbyBpbiBiZWF0cyBwZXIgbWludXRlIChCUE0pLCBzdG9yZWQgYXMgUTIyLjEwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQtcG9pbnQgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KKyAgICBPTVhfVTMyIG5NYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255IG9mIHRoZSBkZXZpY2UgaXMgdXNlZCAgKi8KKyAgICBPTVhfVTMyIG5OdW1SZXBlYXQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgcGxheWJhY2sgKi8KKyAgICBPTVhfVTMyIG5TdG9wVGltZTsgICAgICAgICAgICAvKio8IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGluZGljYXRlIHdoZW4gcGxheWJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHN0b3AgYXV0b21hdGljYWxseS4gIFNldCB0byB6ZXJvIGlmIG5vdCB1c2VkICovCisgICAgT01YX1UxNiBuQ2hhbm5lbE11dGVNYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBtdXRlIHN0YXR1cyAqLworICAgIE9NWF9VMTYgbkNoYW5uZWxTb2xvTWFzazsgICAgIC8qKjwgMTYgYml0IG1hc2sgZm9yIGNoYW5uZWwgc29sbyBzdGF0dXMgKi8KKyAgICBPTVhfVTMyIG5UcmFjazAwMzFNdXRlTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBtdXRlIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KKyAgICBPTVhfVTMyIG5UcmFjazMyNjNNdXRlTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBtdXRlIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCisgICAgT01YX1UzMiBuVHJhY2swMDMxU29sb01hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgc29sbyBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAwLTMxICovCisgICAgT01YX1UzMiBuVHJhY2szMjYzU29sb01hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgc29sbyBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAzMi02MyAqLworCit9IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFOworCisKKy8qKiBNSURJIFBsYXliYWNrIFN0YXRlcyAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgeworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVVbmtub3duID0gMCwgICAgICAvKio8IFVua25vd24gc3RhdGUgb3Igc3RhdGUgZG9lcyBub3QgbWFwIHRvIAorICAJCQkJCQkJCQkJCQkJb3RoZXIgZGVmaW5lZCBzdGF0ZXMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlQ2xvc2VkRW5nYWdlZCwgICAgLyoqPCBObyBNSURJIHJlc291cmNlIGlzIGN1cnJlbnRseSBvcGVuLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBldmVudHMuICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBhcnNpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGlzIGJlaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1lZC4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVPcGVuRW5nYWdlZCwgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBwcmltZWQgYnV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwbGF5aW5nLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIGlzIG9ubHkgcG9zc2libGUgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZyBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSAncGxheWJhY2sgaGVhZCcgcmVhY2hlcyB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWVkaWEgZGF0YSBvciB0aGUgcGxheWJhY2sgc3RvcHMgZHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcCB0aW1lIHNldC4qLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nLCAgICAgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4qLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nUGFydGlhbGx5LCAvKio8IEJlc3QtZWZmb3J0IHBsYXliYWNrIGR1ZSB0byBTUC1NSURJL0RMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGNvbnN0cmFpbnRzICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdTaWxlbnRseSwgIC8qKjwgRHVlIHRvIHN5c3RlbSByZXNvdXJjZSBjb25zdHJhaW50cyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUC1NSURJIGNvbnRlbnQgY29uc3RyYWludHMsIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gYXVkaWJsZSBNSURJIGNvbnRlbnQgZHVyaW5nIHBsYXliYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5LiBUaGUgc2l0dWF0aW9uIG1heSBjaGFuZ2UgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgYXJlIGZyZWVkIGxhdGVyLiovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFOworCisKKy8qKiBNSURJIHN0YXR1cyAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UxNiBuTnVtVHJhY2tzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIE1JREkgdHJhY2tzIGluIHRoZSBmaWxlLCByZWFkIG9ubHkgZmllbGQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCisgICAgT01YX1UzMiBuRHVyYXRpb247ICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudGx5IG9wZW4gTUlESSByZXNvdXJjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovICAKKyAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgICAgLyoqPCBDdXJyZW50IFBvc2l0aW9uIG9mIHRoZSBNSURJIHJlc291cmNlIGJlaW5nIHBsYXllZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQk9PTCBiVmlicmE7ICAgICAgICAgICAgLyoqPCBEb2VzIFZpYnJhIHRyYWNrIGV4aXN0PyBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICovCisgICAgT01YX1UzMiBuTnVtTWV0YUV2ZW50czsgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIE1JREkgTWV0YSBFdmVudHMgaW4gdGhlIGN1cnJlbnRseSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCisgICAgT01YX1UzMiBuTnVtQWN0aXZlVm9pY2VzOyAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSB2b2ljZXMgaW4gdGhlIGN1cnJlbnRseSBwbGF5aW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSB1bnRpbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIGVNSURJUGxheUJhY2tTdGF0ZTsgIC8qKjwgTUlESSBwbGF5YmFjayBzdGF0ZSBlbnVtZXJhdGlvbiwgcmVhZCBvbmx5IGZpZWxkICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEU7CisKKworLyoqIE1JREkgTWV0YSBFdmVudCBzdHJ1Y3R1cmUgb25lIHBlciBNZXRhIEV2ZW50LgorICogIE1JREkgTWV0YSBFdmVudHMgYXJlIGxpa2UgYXVkaW8gbWV0YWRhdGEsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVyc3BlcnNlZCAKKyAqICB3aXRoIHRoZSBNSURJIGNvbnRlbnQgdGhyb3VnaG91dCB0aGUgZmlsZSBhbmQgYXJlIG5vdCBsb2NhbGl6ZWQgaW4gdGhlIGhlYWRlci4gCisgKiAgQXMgc3VjaCwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIE1ldGEgRXZlbnRzIGZyb20gCisgKiAgdGhlIGVuZ2luZSwgYXMgaXQgZW5jb3VudGVycyB0aGVzZSBNZXRhIEV2ZW50cyB3aXRoaW4gdGhlIE1JREkgY29udGVudC4gCisgKiAgRm9yIGV4YW1wbGUsIFNNRiBmaWxlcyBjYW4gaGF2ZSB1cCB0byAxNCB0eXBlcyBvZiBNSURJIE1ldGEgRXZlbnRzIChjb3B5cmlnaHQsIAorICogIGF1dGhvciwgZGVmYXVsdCB0ZW1wbywgZXRjLikgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIGZpbGUuIAorICogIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRXsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCisgICAgT01YX1U4IG5NZXRhRXZlbnRUeXBlOyAgICAvKio8IE1ldGEgRXZlbnQgVHlwZSwgN2JpdHMgKGkuZS4gMCAtIDEyNykgKi8gCisgICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCisgICAgT01YX1UzMiBuVHJhY2s7ICAgICAgICAgICAvKio8IHRyYWNrIG51bWJlciBmb3IgdGhlIG1ldGEgZXZlbnQgKi8KKyAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgIC8qKjwgUG9zaXRpb24gb2YgdGhlIG1ldGEtZXZlbnQgaW4gbWlsbGlzZWNvbmRzICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEU7IAorCisKKy8qKiBNSURJIE1ldGEgRXZlbnQgRGF0YSBzdHJ1Y3R1cmUgLSBvbmUgcGVyIE1ldGEgRXZlbnQuIAorICogQGluZ3JvdXAgbWlkaQorICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEV7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgLyoqPCBJbmRleCBvZiBNZXRhIEV2ZW50ICovIAorICAgIE9NWF9VMzIgbk1ldGFFdmVudFNpemU7ICAgLyoqPCBzaXplIG9mIHRoZSBNZXRhIEV2ZW50IGluIGJ5dGVzICovIAorICAgIE9NWF9VOCBuRGF0YVsxXTsgICAgICAgICAgLyoqPCBhcnJheSBvZiBvbmUgb3IgbW9yZSBieXRlcyBvZiBtZXRhIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSB0aGUgbk1ldGFFdmVudFNpemUgZmllbGQgKi8gCit9IE9NWF9BVURJT19DT05GSUdfX01JRElNRVRBRVZFTlREQVRBVFlQRTsgCisKKworLyoqIEF1ZGlvIFZvbHVtZSBhZGp1c3RtZW50IGZvciBhIHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KKyAgICBPTVhfQk9PTCBiTGluZWFyOyAgICAgICAgICAgLyoqPCBJcyB0aGUgdm9sdW1lIHRvIGJlIHNldCBpbiBsaW5lYXIgKDAuMTAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsb2dhcml0aG1pYyBzY2FsZSAobUIpICovCisgICAgT01YX0JTMzIgc1ZvbHVtZTsgICAgICAgICAgIC8qKjwgVm9sdW1lIGxpbmVhciBzZXR0aW5nIGluIHRoZSAwLi4xMDAgcmFuZ2UsIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lIGxvZ2FyaXRobWljIHNldHRpbmcgZm9yIHRoaXMgcG9ydC4gIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igdm9sdW1lIGFyZSBpbiBtQiAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBnYWluIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSB2b2x1bWUgaXMgInZvbHRhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhICJwb3dlciIsIGl0IHRha2VzIGEgc2V0dGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02MDAgbUIgdG8gZGVjcmVhc2UgdGhlIHZvbHVtZSBieSAxLzIuICBJZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29tcG9uZW50IGNhbm5vdCBhY2N1cmF0ZWx5IHNldCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHNldHRpbmcsIHRoZSBjdXJyZW50IGFjdHVhbCB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJldHVybmVkLiAqLworfSBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEU7CisKKworLyoqIEF1ZGlvIFZvbHVtZSBhZGp1c3RtZW50IGZvciBhIGNoYW5uZWwgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3Mgdm9sdW1lLiAgU2VsZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUuICovCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgT01YX0FMTCB0byBhcHBseSB2b2x1bWUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGwgY2hhbm5lbHMgKi8KKyAgICBPTVhfQk9PTCBiTGluZWFyOyAgICAgICAgICAgLyoqPCBJcyB0aGUgdm9sdW1lIHRvIGJlIHNldCBpbiBsaW5lYXIgKDAuMTAwKSBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dhcml0aG1pYyBzY2FsZSAobUIpICovCisgICAgT01YX0JTMzIgc1ZvbHVtZTsgICAgICAgICAgIC8qKjwgVm9sdW1lIGxpbmVhciBzZXR0aW5nIGluIHRoZSAwLi4xMDAgcmFuZ2UsIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lIGxvZ2FyaXRobWljIHNldHRpbmcgZm9yIHRoaXMgcG9ydC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZm9yIHZvbHVtZSBhcmUgaW4gbUIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbGxpYmVscyA9IDEvMTAwIGRCKSByZWxhdGl2ZSB0byBhIGdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGxldmVsKS4gIFZhbHVlcyBhcmUgaW4gbUIgZnJvbSBuTWF4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhpbXVtIHZvbHVtZSkgdG8gbk1pbiBtQiAodHlwaWNhbGx5IG5lZ2F0aXZlKS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSB2b2x1bWUgaXMgInZvbHRhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhICJwb3dlciIsIGl0IHRha2VzIGEgc2V0dGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02MDAgbUIgdG8gZGVjcmVhc2UgdGhlIHZvbHVtZSBieSAxLzIuICBJZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29tcG9uZW50IGNhbm5vdCBhY2N1cmF0ZWx5IHNldCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHNldHRpbmcsIHRoZSBjdXJyZW50IGFjdHVhbCB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJldHVybmVkLiAqLworICAgIE9NWF9CT09MIGJJc01JREk7ICAgICAgICAgICAvKio8IFRSVUUgaWYgbkNoYW5uZWwgcmVmZXJzIHRvIGEgTUlESSBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG90aGVyd2lzZSAqLworfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFOworCisKKy8qKiBBdWRpbyBiYWxhbmNlIHNldHRpbmcgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3MgYmFsYW5jZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZS4gKi8KKyAgICBPTVhfUzMyIG5CYWxhbmNlOyAgICAgICAgICAgLyoqPCBiYWxhbmNlIHNldHRpbmcgZm9yIHRoaXMgcG9ydCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwMCB0byAxMDAsIHdoZXJlIC0xMDAgaW5kaWNhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGxlZnQsIGFuZCBubyByaWdodCAqLworfSBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFOworCisKKy8qKiBBdWRpbyBQb3J0IG11dGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3MgbXV0ZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZS4gKi8KKyAgICBPTVhfQk9PTCBiTXV0ZTsgICAgICAgICAgICAgLyoqPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgcG9ydCAqLworfSBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFOworCisKKy8qKiBBdWRpbyBDaGFubmVsIG11dGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IG11dGUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGwgY2hhbm5lbHMgKi8KKyAgICBPTVhfQk9PTCBiTXV0ZTsgICAgICAgICAgICAgLyoqPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgIE9NWF9CT09MIGJJc01JREk7ICAgICAgICAgICAvKio8IFRSVUUgaWYgbkNoYW5uZWwgcmVmZXJzIHRvIGEgTUlESSBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG90aGVyd2lzZSAqLyAKK30gT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEU7CisKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgbG91ZG5lc3MgY29udHJvbCwgd2hpY2ggYm9vc3RzIGJhc3MgYW5kIHRvIGEgCisgKiAgc21hbGxlciBleHRlbnQgaGlnaCBlbmQgZnJlcXVlbmNpZXMgdG8gY29tcGVuc2F0ZSBmb3IgaGVhcmluZworICogIGFiaWxpdHkgYXQgdGhlIGV4dHJlbWUgZW5kcyBvZiB0aGUgYXVkaW8gc3BlY3RydW0KKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiTG91ZG5lc3M7ICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBsb3VkbmVzcyAqLworfSBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgYmFzcywgd2hpY2ggY29udHJvbHMgbG93IGZyZXF1ZW5jaWVzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBiYXNzIGNvbnRyb2wgKi8KKyAgICBPTVhfUzMyIG5CYXNzOyAgICAgICAgICAgICAvKio8IGJhc3Mgc2V0dGluZyBmb3IgdGhlIHBvcnQsIGFzIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgbWVhbnMgbm8gY2hhbmdlIGluIGJhc3MgbGV2ZWwpKi8KK30gT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgdHJlYmxlLCB3aGljaCBjb250cm9scyBoaWdoIGZyZXF1ZW5jaWVzIHRvbmVzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHRyZWJsZSBjb250cm9sICovCisgICAgT01YX1MzMiAgblRyZWJsZTsgICAgICAgICAgLyoqPCB0cmVibGUgc2V0dGluZyBmb3IgdGhlIHBvcnQsIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gdHJlYmxlIGxldmVsKSAqLworfSBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEU7CisKKworLyoqIEFuIGVxdWFsaXplciBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdHdvIHJlYXNvbnM6IHRvIGNvbXBlbnNhdGUgZm9yIGFuIAorICogIHN1Yi1vcHRpbWFsIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhIHN5c3RlbSB0byBtYWtlIGl0IHNvdW5kIG1vcmUgbmF0dXJhbCAKKyAqICBvciB0byBjcmVhdGUgaW50ZW50aW9uYWxseSBzb21lIHVubmF0dXJhbCBjb2xvcmluZyB0byB0aGUgc291bmQgdG8gY3JlYXRlCisgKiAgYW4gZWZmZWN0LgorICogIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBlcXVhbGl6ZXIgKi8KKyAgICBPTVhfQlUzMiBzQmFuZEluZGV4OyAgICAgICAvKio8IEJhbmQgbnVtYmVyIHRvIGJlIHNldC4gIFVwcGVyIExpbWl0IGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0xLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgYmFuZHMsIGxvd2VyIGxpbWl0IGlzIDAgKi8KKyAgICBPTVhfQlUzMiBzQ2VudGVyRnJlcTsgICAgICAvKio8IENlbnRlciBmcmVxdWVjaWVzIGluIEh6LiAgVGhpcyBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIG9ubHkgZWxlbWVudCBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG93ZXIsIGNlbnRlciBhbmQgdXBwZXIgZnJlcXVlbmN5IG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBiYW5kLiAgKi8KKyAgICBPTVhfQlMzMiBzQmFuZExldmVsOyAgICAgICAvKio8IGJhbmQgbGV2ZWwgaW4gbWlsbGliZWxzICovCit9IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRTsKKworCisvKiogU3RlcmVvIHdpZGVuaW5nIG1vZGUgdHlwZSAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFIHsKKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdIZWFkcGhvbmVzLCAgICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgbG91ZHNwZWFrZXJzICovCisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTG91ZHNwZWFrZXJzLCAgLyoqPCBTdGVyZW8gd2lkZW5pbmcgZm9yIGNsb3NlbHkgc3BhY2VkIGxvdWRzcGVha2VycyAqLworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRTsKKworCisvKiogQ29udHJvbCBmb3Igc3RlcmVvIHdpZGVuaW5nLCB3aGljaCBpcyBhIHNwZWNpYWwgMi1jaGFubmVsCisgKiAgY2FzZSBvZiB0aGUgYXVkaW8gdmlydHVhbGl6ZXIgZWZmZWN0LiBGb3IgZXhhbXBsZSwgZm9yIDUuMS1jaGFubmVsIAorICogIG91dHB1dCwgaXQgdHJhbnNsYXRlcyB0byB2aXJ0dWFsIHN1cnJvdW5kIHNvdW5kLiAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBzdGVyZW8gd2lkZW5pbmcgY29udHJvbCAqLworICAgIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgZVdpZGVuaW5nVHlwZTsgLyoqPCBTdGVyZW8gd2lkZW5pbmcgYWxnb3JpdGhtIHR5cGUgKi8KKyAgICBPTVhfVTMyICBuU3RlcmVvV2lkZW5pbmc7ICAvKio8IHN0ZXJlbyB3aWRlbmluZyBzZXR0aW5nIGZvciB0aGUgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgY29udGludW91cyB2YWx1ZSBmcm9tIDAgdG8gMTAwICAqLworfSBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRTsKKworCisvKiogVGhlIGNob3J1cyBlZmZlY3QgKG9yIGBgY2hvcmFsaXplcicnKSBpcyBhbnkgc2lnbmFsIHByb2Nlc3NvciB3aGljaCBtYWtlcworICogIG9uZSBzb3VuZCBzb3VyY2UgKHN1Y2ggYXMgYSB2b2ljZSkgc291bmQgbGlrZSBtYW55IHN1Y2ggc291cmNlcyBzaW5naW5nIAorICogIChvciBwbGF5aW5nKSBpbiB1bmlzb24uIFNpbmNlIHBlcmZvcm1hbmNlIGluIHVuaXNvbiBpcyBuZXZlciBleGFjdCwgY2hvcnVzIAorICogIGVmZmVjdHMgc2ltdWxhdGUgdGhpcyBieSBtYWtpbmcgaW5kZXBlbmRlbnRseSBtb2RpZmllZCBjb3BpZXMgb2YgdGhlIGlucHV0IAorICogIHNpZ25hbC4gTW9kaWZpY2F0aW9ucyBtYXkgaW5jbHVkZSAoMSkgZGVsYXksICgyKSBmcmVxdWVuY3kgc2hpZnQsIGFuZCAKKyAqICAoMykgYW1wbGl0dWRlIG1vZHVsYXRpb24uCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgY2hvcnVzICovCisgICAgT01YX0JVMzIgc0RlbGF5OyAgICAgICAgICAgLyoqPCBhdmVyYWdlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CVTMyIHNNb2R1bGF0aW9uUmF0ZTsgIC8qKjwgcmF0ZSBvZiBtb2R1bGF0aW9uIGluIG1pbGxpaGVydHogKi8KKyAgICBPTVhfVTMyIG5Nb2R1bGF0aW9uRGVwdGg7ICAvKio8IGRlcHRoIG9mIG1vZHVsYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgKGkuZS4gMCB0byAxMDApICovCisgICAgT01YX0JVMzIgbkZlZWRiYWNrOyAgICAgICAgLyoqPCBGZWVkYmFjayBmcm9tIGNob3J1cyBvdXRwdXQgdG8gaW5wdXQgaW4gcGVyY2VudGFnZSAqLworfSBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEU7CisKKworLyoqIFJldmVyYmVyYXRpb24gaXMgcGFydCBvZiB0aGUgcmVmbGVjdGVkIHNvdW5kIHRoYXQgZm9sbG93cyB0aGUgZWFybHkgCisgKiAgcmVmbGVjdGlvbnMuIEluIGEgdHlwaWNhbCByb29tLCB0aGlzIGNvbnNpc3RzIG9mIGEgZGVuc2Ugc3VjY2Vzc2lvbiBvZiAKKyAqICBlY2hvZXMgd2hvc2UgZW5lcmd5IGRlY2F5cyBleHBvbmVudGlhbGx5LiBUaGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3Qgc3RydWN0dXJlIAorICogIGFzIGRlZmluZWQgaGVyZSBpbmNsdWRlcyBib3RoIChlYXJseSkgcmVmbGVjdGlvbnMgYXMgd2VsbCBhcyAobGF0ZSkgcmV2ZXJiZXJhdGlvbnMuIAorICogQGluZ3JvdXAgZWZmZWN0cworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1JFVkVSQkVSQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciByZXZlcmJlcmF0aW9uIGNvbnRyb2wgKi8KKyAgICBPTVhfQlMzMiBzUm9vbUxldmVsOyAgICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBmb3IgdGhlIHdob2xlIHJvb20gZWZmZWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gYm90aCBlYXJseSByZWZsZWN0aW9ucyBhbmQgbGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyYmVyYXRpb24pIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CUzMyIHNSb29tSGlnaEZyZXFMZXZlbDsgIC8qKjwgQXR0ZW51YXRpb24gYXQgaGlnaCBmcmVxdWVuY2llcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGludGVuc2l0eSBhdCBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CUzMyIHNSZWZsZWN0aW9uc0xldmVsOyAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIG9mIGVhcmx5IHJlZmxlY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsYXRpdmUgdG8gcm9vbSB2YWx1ZSksIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CVTMyIHNSZWZsZWN0aW9uc0RlbGF5OyAgIC8qKjwgRGVsYXkgdGltZSBvZiB0aGUgZmlyc3QgcmVmbGVjdGlvbiByZWxhdGl2ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkaXJlY3QgcGF0aCwgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JTMzIgc1JldmVyYkxldmVsOyAgICAgICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgbGF0ZSByZXZlcmJlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byByb29tIGxldmVsLCBpbiBtaWxsaWJlbHMgKi8KKyAgICBPTVhfQlUzMiBzUmV2ZXJiRGVsYXk7ICAgICAgICAvKio8IFRpbWUgZGVsYXkgZnJvbSB0aGUgZmlyc3QgZWFybHkgcmVmbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CVTMyIHNEZWNheVRpbWU7ICAgICAgICAgIC8qKjwgTGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5IHRpbWUgYXQgbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcywgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JVMzIgbkRlY2F5SGlnaEZyZXFSYXRpbzsgLyoqPCBSYXRpbyBvZiBoaWdoIGZyZXF1ZW5jeSBkZWNheSB0aW1lIHJlbGF0aXZlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbG93IGZyZXF1ZW5jeSBkZWNheSB0aW1lIGluIHBlcmNlbnQgICovCisgICAgT01YX1UzMiBuRGVuc2l0eTsgICAgICAgICAgICAgLyoqPCBNb2RhbCBkZW5zaXR5IGluIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gZGVjYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwZXJjZW50IChpLmUuIDAgLSAxMDApICovCisgICAgT01YX1UzMiBuRGlmZnVzaW9uOyAgICAgICAgICAgLyoqPCBFY2hvIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KKyAgICBPTVhfQlUzMiBzUmVmZXJlbmNlSGlnaEZyZXE7ICAvKio8IFJlZmVyZW5jZSBoaWdoIGZyZXF1ZW5jeSBpbiBIZXJ0ei4gVGhpcyBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmVxdWVuY3kgdXNlZCBhcyB0aGUgcmVmZXJlbmNlIGZvciBhbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGlnaC1mcmVxdWVuY3kgc2V0dGluZ3MgYWJvdmUgKi8KKworfSBPTVhfQVVESU9fQ09ORklHX1JFVkVSQkVSQVRJT05UWVBFOworCisKKy8qKiBQb3NzaWJsZSBzZXR0aW5ncyBmb3IgdGhlIEVjaG8gQ2FuY2VsYXRpb24gc3RydWN0dXJlIHRvIHVzZSAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19FQ0hPQ0FOVFlQRSB7CisgICBPTVhfQVVESU9fRWNob0Nhbk9mZiA9IDAsICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gaXMgZGlzYWJsZWQgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuTm9ybWFsLCAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBub3JtYWwgb3BlcmF0aW9uIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBmcm9tIHBsYXN0aWNzIGFuZCBmYWNlICovCisgICBPTVhfQVVESU9fRWNob0NhbkhGcmVlLCAgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gb3B0aW1pemVkIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kcyBGcmVlIG9wZXJhdGlvbiAqLworICAgT01YX0FVRElPX0VjaG9DYW5DYXJLaXQsICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gb3B0aW1pemVkIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXIgS2l0IChsb25nZXIgZWNobykgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0FVRElPX0VjaG9DYW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgT01YX0FVRElPX0VjaG9DYW5NYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19FQ0hPQ0FOVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgZWNobyBjYW5jZWxhdGlvbiwgd2hpY2ggcmVtb3ZlcyB1bmRlc2lyZWQgZWNobydzCisgKiAgZnJvbSB0aGUgYXVkaW8KKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0FVRElPX0VDSE9DQU5UWVBFIGVFY2hvQ2FuY2VsYXRpb247IC8qKjwgRWNobyBjYW5jZWxhdGlvbiBzZXR0aW5ncyAqLworfSBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEU7CisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIG5vaXNlIHJlZHVjdGlvbiwgd2hpY2ggdW5kZXNpcmVkIG5vaXNlIGZyb20KKyAqIHRoZSBhdWRpbworICogQGluZ3JvdXAgZWZmZWN0cworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19OT0lTRVJFRFVDVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJOb2lzZVJlZHVjdGlvbjsgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIG5vaXNlIHJlZHVjdGlvbiAqLworfSBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRTsKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db21wb25lbnQuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNzg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29tcG9uZW50LmgKQEAgLTAsMCArMSw1OTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29tcG9uZW50LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0NvbXBvbmVudCBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKKyAqICB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhIGNvbXBvbmVudC4gIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8KKyAqICBiZSB1c2VkIGJ5IGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LgorICovCisKKyNpZm5kZWYgT01YX0NvbXBvbmVudF9oCisjZGVmaW5lIE9NWF9Db21wb25lbnRfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9JbWFnZS5oPgorI2luY2x1ZGUgPE9NWF9PdGhlci5oPgorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7IAorICAgIE9NWF9Qb3J0RG9tYWluQXVkaW8sIAorICAgIE9NWF9Qb3J0RG9tYWluVmlkZW8sIAorICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsIAorICAgIE9NWF9Qb3J0RG9tYWluT3RoZXIsCisgICAgT01YX1BvcnREb21haW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1BvcnREb21haW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Qb3J0RG9tYWluTWF4ID0gMHg3ZmZmZmZmCit9IE9NWF9QT1JURE9NQUlOVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IG51bWJlciB0aGUgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElSVFlQRSBlRGlyOyAgICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgb2YgdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRBY3R1YWw7ICAgIC8qKjwgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgb24gdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRNaW47ICAgICAgIC8qKjwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhpcyBwb3J0IHJlcXVpcmVzICovCisgICAgT01YX1UzMiBuQnVmZmVyU2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSwgaW4gYnl0ZXMsIGZvciBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAgICAgICAgICAvKio8IFBvcnRzIGRlZmF1bHQgdG8gZW5hYmxlZCBhbmQgYXJlIGVuYWJsZWQvZGlzYWJsZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUvT01YX0NvbW1hbmRQb3J0RGlzYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGVkIGEgcG9ydCBpcyB1bnBvcHVsYXRlZC4gQSBkaXNhYmxlZCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBvcHVsYXRlZCB3aXRoIGJ1ZmZlcnMgb24gYSB0cmFuc2l0aW9uIHRvIElETEUuICovCisgICAgT01YX0JPT0wgYlBvcHVsYXRlZDsgICAgICAgICAgIC8qKjwgUG9ydCBpcyBwb3B1bGF0ZWQgd2l0aCBhbGwgb2YgaXRzIGJ1ZmZlcnMgYXMgaW5kaWNhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZmZlckNvdW50QWN0dWFsLiBBIGRpc2FibGVkIHBvcnQgaXMgYWx3YXlzIHVucG9wdWxhdGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBlbmFibGVkIHBvcnQgaXMgcG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBPTVhfU3RhdGVJZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVucG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBsb2FkZWQuICovCisgICAgT01YX1BPUlRET01BSU5UWVBFIGVEb21haW47ICAgIC8qKjwgRG9tYWluIG9mIHRoZSBwb3J0LiBEZXRlcm1pbmVzIHRoZSBjb250ZW50cyBvZiBtZXRhZGF0YSBiZWxvdy4gKi8KKyAgICB1bmlvbiB7CisgICAgICAgIE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgYXVkaW87CisgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgdmlkZW87CisgICAgICAgIE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgaW1hZ2U7CisgICAgICAgIE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgb3RoZXI7CisgICAgfSBmb3JtYXQ7CisgICAgT01YX0JPT0wgYkJ1ZmZlcnNDb250aWd1b3VzOworICAgIE9NWF9VMzIgbkJ1ZmZlckFsaWdubWVudDsKK30gT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5VMzI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBVMzIgdmFsdWUgKi8KK30gT01YX1BBUkFNX1UzMlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgZW51bSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgeworICAgIE9NWF9TdXNwZW5zaW9uRGlzYWJsZWQsIC8qKjwgTm8gc3VzcGVuc2lvbjsgdjEuMCBiZWhhdmlvciAqLworICAgIE9NWF9TdXNwZW5zaW9uRW5hYmxlZCwgIC8qKjwgU3VzcGVuc2lvbiBhbGxvd2VkICovICAgCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5TWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAKKyAgICBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgZVBvbGljeTsKK30gT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05UWVBFIHsKKyAgICBPTVhfTm90U3VzcGVuZGVkLCAvKio8IGNvbXBvbmVudCBpcyBub3Qgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbmRlZCwgICAgLyoqPCBjb21wb25lbnQgaXMgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbnNpb25LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfU1VTUEVOU0lPTlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIAorICAgIE9NWF9TVVNQRU5TSU9OVFlQRSBlVHlwZTsgICAgICAgICAgICAgCit9IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSA7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAKK30gT01YX0NPTkZJR19CT09MRUFOVFlQRTsKKworLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnQgdXJpIHRvIHVzZS4gKi8KKy8qKiBAaW5ncm91cCBjcCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMsIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIFVSSSBuYW1lICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1U4IGNvbnRlbnRVUklbMV07ICAgICAgICAgICAgICAgLyoqPCBUaGUgVVJJIG5hbWUgKi8KK30gT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFOworCisvKiBQYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgcGlwZSB0byB1c2UuICovCisvKiogQGluZ3JvdXAgY3AgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX0hBTkRMRVRZUEUgaFBpcGU7ICAgICAgIC8qKjwgVGhlIHBpcGUgaGFuZGxlKi8KK30gT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9CT09MIGJSZXNvdXJjZUNvbmNlYWxtZW50Rm9yYmlkZGVuOyAvKio8IGRpc2FsbG93IHRoZSB1c2Ugb2YgcmVzb3VyY2UgY29uY2VhbG1lbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKGxpa2UgZGVncmFkaW5nIGFsZ29yaXRobSBxdWFsaXR5IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciByZXNvdXJjZSBjb25zdW1wdGlvbiBvciBmdW5jdGlvbmFsIGJ5cGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgY29tcG9uZW50IGFzIGEgcmVzb2x1dGlvbiB0byByZXNvdXJjZSBjb25mbGljdHMuICovCit9IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRTsKKworCisvKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSB7CisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVua25vd24gPSAwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRBU0NJSSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QmluYXJ5LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRDb2RlUGFnZTEyNTIsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjgsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEphdmFDb25mb3JtYW50VVRGOCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGNywKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SW1hcFVURjcsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2TEUsIAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkJFLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjEyMzQ1LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRIWkdCMjMxMiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IyMzEyLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjE4MDMwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQkssCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEJpZzUsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk0LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTYsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk3LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5OCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTksCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEzLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxNSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U2hpZnRKSVMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPMjAyMkpQMSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPRVVDSlAsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFNNUzdCaXQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VHlwZU1heD0gMHg3RkZGRkZGRgorfSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIGVudW0gT01YX01FVEFEQVRBU0NPUEVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2NvcGVBbGxMZXZlbHMsCisgICAgT01YX01ldGFkYXRhU2NvcGVUb3BMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZVBvcnRMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZU5vZGVMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTY29wZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX01ldGFkYXRhU2NvcGVUeXBlTWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfTUVUQURBVEFTQ09QRVRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2VhcmNoVmFsdWVTaXplQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hJdGVtQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hOZXh0SXRlbUJ5S2V5LAorICAgIE9NWF9NZXRhZGF0YVNlYXJjaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NZXRhZGF0YVNlYXJjaFR5cGVNYXggPSAweDdmZmZmZmZmCit9IE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFOworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRQoreworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9NRVRBREFUQVNDT1BFVFlQRSBlU2NvcGVNb2RlOworICAgIE9NWF9VMzIgblNjb3BlU3BlY2lmaWVyOworICAgIE9NWF9VMzIgbk1ldGFkYXRhSXRlbUNvdW50OworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKKyAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKKyAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1JbmRleDsgIAorICAgIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFIGVTZWFyY2hNb2RlOworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VOCBuS2V5U2l6ZVVzZWQ7CisgICAgT01YX1U4IG5LZXlbMTI4XTsKKyAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlVmFsdWVDaGFyc2V0OworICAgIE9NWF9TVFJJTkcgc0xhbmd1YWdlQ291bnRyeTsKKyAgICBPTVhfVTMyIG5WYWx1ZU1heFNpemU7CisgICAgT01YX1UzMiBuVmFsdWVTaXplVXNlZDsKKyAgICBPTVhfVTggblZhbHVlWzFdOworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEU7CisKKy8qIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTnVtTm9kZXM7Cit9IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTm9kZUluZGV4OyAKKyAgICBPTVhfVTMyIG5Ob2RlSUQ7IAorICAgIE9NWF9TVFJJTkcgY05vZGVOYW1lOworICAgIE9NWF9CT09MIGJJc0xlYWZUeXBlOworfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAKK3sgCisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsJLyogaWYgdHJ1ZSB0aGVuIHRoaXMgc3RydWN0dXJlIHJlZmVycyB0byBhbGwga2V5cyBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdGhyZWUga2V5IGZpZWxkcyBiZWxvdyBhcmUgaWdub3JlZCAqLworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VMzIgbktleVNpemVVc2VkOyAKKyAgICBPTVhfVTggICBuS2V5IFsxMjhdOyAKKyAgICBPTVhfVTMyIG5MYW5ndWFnZUNvdW50cnlTaXplVXNlZDsKKyAgICBPTVhfVTggbkxhbmd1YWdlQ291bnRyeVsxMjhdOworICAgIE9NWF9CT09MIGJFbmFibGVkOwkvKiBpZiB0cnVlIHRoZW4ga2V5IGlzIHBhcnQgb2YgZmlsdGVyIChlLmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0YWluZWQgZm9yIHF1ZXJ5IGxhdGVyKS4gSWYgZmFsc2UgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5IGlzIG5vdCBwYXJ0IG9mIGZpbHRlciAqLworfSBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFOyAKKworLyoqIFRoZSBPTVhfSEFORExFVFlQRSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29tcG9uZW50IGhhbmRsZS4gIFRoZSBjb21wb25lbnQgCisgKiAgaGFuZGxlIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY29tcG9uZW50J3MgcHVibGljIG1ldGhvZHMgYW5kIGFsc28KKyAqICBjb250YWlucyBwb2ludGVycyB0byB0aGUgY29tcG9uZW50J3MgcHJpdmF0ZSBkYXRhIGFyZWEuICBUaGUgY29tcG9uZW50CisgKiAgaGFuZGxlIGlzIGluaXRpYWxpemVkIGJ5IHRoZSBPTVggY29yZSAod2l0aCBoZWxwIGZyb20gdGhlIGNvbXBvbmVudCkKKyAqICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgY29tcG9uZW50LiAgQWZ0ZXIgdGhlIGNvbXBvbmVudCBpcworICogIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gc2FmZWx5IGFjY2VzcyBhbnkgb2YgdGhlCisgKiAgY29tcG9uZW50J3MgcHVibGljIGZ1bmN0aW9ucyAoYWx0aG91Z2ggc29tZSBtYXkgcmV0dXJuIGFuIGVycm9yIGJlY2F1c2UKKyAqICB0aGUgc3RhdGUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGFjY2VzcykuCisgKiAKKyAqICBAaW5ncm91cCBjb21wCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRUWVBFCit7CisgICAgLyoqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBieXRlcy4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQorICAgICAgICBvZiB0aGUgYWxsb2NhdG9yIG9mIHRoaXMgc3RydWN0dXJlIHRvIGZpbGwgaW4gdGhpcyB2YWx1ZS4gIFNpbmNlCisgICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLCB0aGlzCisgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGlzIHZhbHVlLiAqLworICAgIE9NWF9VMzIgblNpemU7CisKKyAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZSAKKyAgICAgICAgaXMgYnVpbHQgYWdhaW5zdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY3JlYXRvciBvZiB0aGlzIAorICAgICAgICBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFuZCBldmVyeSB1c2VyIG9mIHRoaXMgc3RydWN0dXJlIAorICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZiAKKyAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgZm91bmQgaGVyZWluLiAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKworICAgIC8qKiBwQ29tcG9uZW50UHJpdmF0ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBwcml2YXRlIGRhdGEgYXJlYS4gIAorICAgICAgICBUaGlzIG1lbWJlciBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgCisgICAgICAgIGNvbXBvbmVudCBpcyBmaXJzdCBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhY2Nlc3MgdGhpcyAKKyAgICAgICAgZGF0YSBhcmVhLiAqLworICAgIE9NWF9QVFIgcENvbXBvbmVudFByaXZhdGU7CisKKyAgICAvKiogcEFwcGxpY2F0aW9uUHJpdmF0ZSBpcyBhIHBvaW50ZXIgdGhhdCBpcyBhIHBhcmFtZXRlciB0byB0aGUgCisgICAgICAgIE9NWF9HZXRIYW5kbGUgbWV0aG9kLCBhbmQgY29udGFpbnMgYW4gYXBwbGljYXRpb24gcHJpdmF0ZSB2YWx1ZSAKKyAgICAgICAgcHJvdmlkZWQgYnkgdGhlIElMIGNsaWVudC4gIFRoaXMgYXBwbGljYXRpb24gcHJpdmF0ZSBkYXRhIGlzIAorICAgICAgICByZXR1cm5lZCB0byB0aGUgSUwgQ2xpZW50IGJ5IE9NWCBpbiBhbGwgY2FsbGJhY2tzICovCisgICAgT01YX1BUUiBwQXBwbGljYXRpb25Qcml2YXRlOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29tcG9uZW50VmVyc2lvbiBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldENvbXBvbmVudFZlcnNpb24pKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX09VVCBPTVhfU1RSSU5HIHBDb21wb25lbnROYW1lLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBDb21wb25lbnRWZXJzaW9uLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBTcGVjVmVyc2lvbiwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1VVSURUWVBFKiBwQ29tcG9uZW50VVVJRCk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX1NlbmRDb21tYW5kIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2VuZENvbW1hbmQgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZW5kQ29tbWFuZCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DT01NQU5EVFlQRSBDbWQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBhcmFtMSwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ21kRGF0YSk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFBhcmFtZXRlciBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldFBhcmFtZXRlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5QYXJhbUluZGV4LCAgCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRQYXJhbWV0ZXIgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRQYXJhbWV0ZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfU2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqU2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0RXh0ZW5zaW9uSW5kZXggbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRFeHRlbnNpb25JbmRleCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY1BhcmFtZXRlck5hbWUsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIHBJbmRleFR5cGUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0U3RhdGUgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRTdGF0ZSkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHBTdGF0ZSk7CisKKyAgICAKKyAgICAvKiogVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbm90aGVyIE9NWAorICAgICAgICBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBwb3NzaWJsZSBhbmQgdG8gc2V0dXAgdGhlCisgICAgICAgIHR1bm5lbGluZy4gIFRoZSByZXR1cm4gY29kZXMgZm9yIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBkZXRlcm1pbmUgaWYgdHVubmVsaW5nIGlzIG5vdCBwb3NzaWJsZSwgb3IgaWYgdHVubmVsaW5nIGlzIG5vdAorICAgICAgICBzdXBwb3J0ZWQuICAKKyAgICAgICAgCisgICAgICAgIEJhc2UgcHJvZmlsZSBjb21wb25lbnRzIChpLmUuIG5vbi1pbnRlcm9wKSBkbyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgIG1ldGhvZCBhbmQgc2hvdWxkIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCAKKworICAgICAgICBUaGUgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCBNVVNUIHN1cHBvcnQgdHVubmVsaW5nIHRvIGFub3RoZXIgCisgICAgICAgIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgd2l0aCBhIGNvbXBhdGlibGUgcG9ydCBwYXJhbWV0ZXJzLiAgCisgICAgICAgIEEgY29tcG9uZW50IG1heSBhbHNvIHN1cHBvcnQgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgCisgICAgICAgIElmIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIHRoZSBuZWdvdGlhdGlvbiBvZiAKKyAgICAgICAgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBkb25lIG91dHNpZGUgb2YgT01YIGluIGEgdmVuZG9yIAorICAgICAgICBzcGVjaWZpYyB3YXkuIEl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0aGUgcHJvcGVyIHJlc3VsdCBiZSAKKyAgICAgICAgcmV0dXJuZWQgYW5kIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgc2V0dXAgaXMgZG9uZSBpcyBsZWZ0IAorICAgICAgICB0byB0aGUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLiAgCisgICAgCisgICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIG91dHB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBQb3B1bGF0ZSB0aGUgcFR1bm5lbFNldHVwIHN0cnVjdHVyZSB3aXRoIHRoZSBvdXRwdXQgcG9ydCdzIAorICAgICAgICAgICAgcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIHR1bm5lbC4KKworICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBpbnB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8gCisgICAgICAgICAgICBkZXRlcm1pbmUgaWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlIGZvciB0dW5uZWxpbmcKKyAgICAgICAgMi4gIElmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSwgdGhlIGNvbXBvbmVudCBzaG91bGQgc3RvcmUKKyAgICAgICAgICAgIHRoZSB0dW5uZWwgc3RlcCBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHBvcnQKKyAgICAgICAgMy4gIERldGVybWluZSB3aGljaCBwb3J0IChlaXRoZXIgaW5wdXQgb3Igb3V0cHV0KSBpcyB0aGUgYnVmZmVyCisgICAgICAgICAgICBzdXBwbGllciwgYW5kIGNhbGwgT01YX1NldFBhcmFtZXRlciBvbiB0aGUgb3V0cHV0IHBvcnQgdG8KKyAgICAgICAgICAgIGluZGljYXRlIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAKKyAgICAgICAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgICAgICBAcGFyYW0gW2luXSBoQ29tcAorICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0CisgICAgICAgICAgICBuUG9ydCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRvIGJlIHVzZWQKKyAgICAgICAgICAgIGZvciB0dW5uZWxpbmcuCisgICAgICAgIEBwYXJhbSBbaW5dIGhUdW5uZWxlZENvbXAKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIHR1bm5lbCB3aXRoLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50IAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4gIFdoZW4KKyAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDB4MCB0aGUgY29tcG9uZW50IHNob3VsZCBzZXR1cCB0aGUgcG9ydCBmb3IKKyAgICAgICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0CisgICAgICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIGluZGljYXRlIHRoZSBwb3J0IHRoZSBjb21wb25lbnQgc2hvdWxkCisgICAgICAgICAgICB0dW5uZWwgd2l0aC4KKyAgICAgICAgQHBhcmFtIFtpbl0gcFR1bm5lbFNldHVwCisgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB0dW5uZWwgc2V0dXAgc3RydWN0dXJlLiAgV2hlbiBuUG9ydCBpcyBhbiBvdXRwdXQgcG9ydAorICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBzaG91bGQgcG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZS4gIFdoZW4KKyAgICAgICAgICAgIFdoZW4gblBvcnQgaXMgYW4gaW5wdXQgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZCByZXZpZXcgdGhlIHNldHVwCisgICAgICAgICAgICBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdpdGggdGhlIG91dHB1dCBwb3J0LgorICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICBAaW5ncm91cCB0dW4KKyAgICAqLworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFR1bm5lbFJlcXVlc3QpKAorICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wLAorICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnQsCisgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaFR1bm5lbGVkQ29tcCwKKyAgICAgICAgT01YX0lOICBPTVhfVTMyIG5UdW5uZWxlZFBvcnQsCisgICAgICAgIE9NWF9JTk9VVCAgT01YX1RVTk5FTFNFVFVQVFlQRSogcFR1bm5lbFNldHVwKTsgCisKKyAgICAvKiogcmVmZXIgdG8gT01YX1VzZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVzZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlckhkciwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMsCisgICAgICAgICAgICBPTVhfSU4gT01YX1U4KiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfQWxsb2NhdGVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBBbGxvY2F0ZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpBbGxvY2F0ZUJ1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVyLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblNpemVCeXRlcyk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0ZyZWVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGcmVlQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkZyZWVCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRW1wdHlUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRW1wdHlUaGlzQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkVtcHR5VGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRmlsbFRoaXNCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGaWxsVGhpc0J1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsVGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiBUaGUgU2V0Q2FsbGJhY2tzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBjb3JlIHRvIHNwZWNpZnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHN0cnVjdHVyZSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nCisgICAgICAgIGNhbGwuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIFtpbl0gcENhbGxiYWNrcworICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIAorICAgICAgICAgICAgY2FsbGJhY2sgaW5mb3JtYXRpb24gdG8gdGhlIGNvbXBvbmVudAorICAgICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCAKKyAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgb3IgYSAidGhpcworICAgICAgICAgICAgcG9pbnRlciIgaW4gdGhpcyBhcmVhIHRvIGFsbG93IHRoZSBjYWxsYmFjayAoaW4gdGhlIGFwcGxpY2F0aW9uKQorICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCisgICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKlNldENhbGxiYWNrcykoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsYmFja3MsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhKTsKKworICAgIC8qKiBDb21wb25lbnREZUluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBjb21wb25lbnQKKyAgICAgICAgcHJvdmlkaW5nIGEgbWVhbnMgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdCBjb21wb25lbnQKKyAgICAgICAgaW5pdGlhbGl6YXRpb24uICBOT1RFOiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb21wb25lbnQgaGFuZGxlIGlzCisgICAgICAgIG5vdCB2YWxpZCBmb3IgZnVydGhlciB1c2UuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50RGVJbml0KSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyAgICAvKiogQGluZ3JvdXAgYnVmICovCisgICAgT01YX0VSUk9SVFlQRSAoKlVzZUVHTEltYWdlKSgKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCisgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfSU4gdm9pZCogZWdsSW1hZ2UpOworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFJvbGVFbnVtKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisJCU9NWF9PVVQgT01YX1U4ICpjUm9sZSwKKwkJT01YX0lOIE9NWF9VMzIgbkluZGV4KTsKKworfSBPTVhfQ09NUE9ORU5UVFlQRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWU0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbnRlbnRQaXBlLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29udGVudFBpcGUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfQ29udGVudFBpcGUgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCisgKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIGNvbnRlbnQgcGlwbGVzLiAgVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlbmRlZCB0bworICogIGJlIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCisjaWZuZGVmIE9NWF9DT05URU5UUElQRV9ICisjZGVmaW5lIE9NWF9DT05URU5UUElQRV9ICisKKyNpZm5kZWYgS0RfRUFDQ0VTCisvKiBPcGVuS09ERSBlcnJvciBjb2Rlcy4gQ1BSZXN1bHQgdmFsdWVzIG1heSBiZSB6ZXJvIChpbmRpY2F0aW5nIHN1Y2Nlc3MKKyAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcykgKi8KKyNkZWZpbmUgS0RfRUFDQ0VTICgxKQorI2RlZmluZSBLRF9FQUREUklOVVNFICgyKQorI2RlZmluZSBLRF9FQUdBSU4gKDUpCisjZGVmaW5lIEtEX0VCQURGICg3KQorI2RlZmluZSBLRF9FQlVTWSAoOCkKKyNkZWZpbmUgS0RfRUNPTk5SRUZVU0VEICg5KQorI2RlZmluZSBLRF9FQ09OTlJFU0VUICgxMCkKKyNkZWZpbmUgS0RfRURFQURMSyAoMTEpCisjZGVmaW5lIEtEX0VERVNUQUREUlJFUSAoMTIpCisjZGVmaW5lIEtEX0VSQU5HRSAoMzUpCisjZGVmaW5lIEtEX0VFWElTVCAoMTMpCisjZGVmaW5lIEtEX0VGQklHICgxNCkKKyNkZWZpbmUgS0RfRUhPU1RVTlJFQUNIICgxNSkKKyNkZWZpbmUgS0RfRUlOVkFMICgxNykKKyNkZWZpbmUgS0RfRUlPICgxOCkKKyNkZWZpbmUgS0RfRUlTQ09OTiAoMjApCisjZGVmaW5lIEtEX0VJU0RJUiAoMjEpCisjZGVmaW5lIEtEX0VNRklMRSAoMjIpCisjZGVmaW5lIEtEX0VOQU1FVE9PTE9ORyAoMjMpCisjZGVmaW5lIEtEX0VOT0VOVCAoMjQpCisjZGVmaW5lIEtEX0VOT01FTSAoMjUpCisjZGVmaW5lIEtEX0VOT1NQQyAoMjYpCisjZGVmaW5lIEtEX0VOT1NZUyAoMjcpCisjZGVmaW5lIEtEX0VOT1RDT05OICgyOCkKKyNkZWZpbmUgS0RfRVBFUk0gKDMzKQorI2RlZmluZSBLRF9FVElNRURPVVQgKDM2KQorI2RlZmluZSBLRF9FSUxTRVEgKDE5KQorI2VuZGlmCisKKy8qKiBNYXAgdHlwZXMgZnJvbSBPTVggc3RhbmRhcmQgdHlwZXMgb25seSBoZXJlIHNvIGludGVyZmFjZSBpcyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLiAqLwordHlwZWRlZiBPTVhfVTMyICAgIENQcmVzdWx0OwordHlwZWRlZiBjaGFyICogICAgIENQc3RyaW5nOyAgCit0eXBlZGVmIHZvaWQgKiAgICAgQ1BoYW5kbGU7Cit0eXBlZGVmIE9NWF9VMzIgICAgQ1B1aW50OwordHlwZWRlZiBPTVhfUzMyICAgIENQaW50OyAgCit0eXBlZGVmIGNoYXIgICAgICAgQ1BieXRlOyAgCit0eXBlZGVmIE9NWF9CT09MICAgQ1Bib29sOworCisvKiogZW51bWVyYXRpb24gb2Ygb3JpZ2luIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgU2VlayBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9PUklHSU5UWVBFIHsKKyAgICBDUF9PcmlnaW5CZWdpbiwgICAgICAKKyAgICBDUF9PcmlnaW5DdXIsICAgICAgCisgICAgQ1BfT3JpZ2luRW5kLCAgICAgIAorICAgIENQX09yaWdpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9PcmlnaW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX09yaWdpbk1heCA9IDBYN0ZGRkZGRkYKK30gQ1BfT1JJR0lOVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRhY3QgYWNjZXNzIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgT3BlbiBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9BQ0NFU1NUWVBFIHsKKyAgICBDUF9BY2Nlc3NSZWFkLCAgICAgIAorICAgIENQX0FjY2Vzc1dyaXRlLCAgCisgICAgQ1BfQWNjZXNzUmVhZFdyaXRlICwgIAorICAgIENQX0FjY2Vzc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9BY2Nlc3NWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0FjY2Vzc01heCA9IDBYN0ZGRkZGRkYKK30gQ1BfQUNDRVNTVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIENQX1BJUEVUWVBFJ3MgQ2hlY2tBdmFpbGFibGVCeXRlcyBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRQoreworICAgIENQX0NoZWNrQnl0ZXNPaywgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlcmUgYXJlIGF0IGxlYXN0IHRoZSByZXF1ZXN0IG51bWJlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBDUF9DaGVja0J5dGVzTm90UmVhZHksICAgICAgICAgICAgICAvKio8IFRoZSBwaXBlIGlzIHN0aWxsIHJldHJpZXZpbmcgYnl0ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXNlbnRseSBsYWNrcyBzdWZmaWNpZW50IGJ5dGVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGV5IGFyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUuICovCisgICAgQ1BfQ2hlY2tCeXRlc0luc3VmZmljaWVudEJ5dGVzICAsICAgICAvKio8IFRoZSBwaXBlIGhhcyByZXRyaWV2ZWQgYWxsIGJ5dGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aG9zZSBhdmFpbGFibGUgYXJlIGxlc3MgdGhhbiB0aG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgKi8KKyAgICBDUF9DaGVja0J5dGVzQXRFbmRPZlN0cmVhbSwgICAgICAgICAvKio8IFRoZSBwaXBlIGhhcyByZWFjaGVkIHRoZSBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICBDUF9DaGVja0J5dGVzT3V0T2ZCdWZmZXJzLCAgICAgICAgICAvKio8IEFsbCByZWFkL3dyaXRlIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UuICovCisgICAgQ1BfQ2hlY2tCeXRlc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9DaGVja0J5dGVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBDUF9DaGVja0J5dGVzTWF4ID0gMFg3RkZGRkZGRgorfSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrLiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9FVkVOVFRZUEV7CisgICAgQ1BfQnl0ZXNBdmFpbGFibGUsICAgICAgCSAgICAvKiogYnl0ZXMgcmVxdWVzdGVkIGluIGEgQ2hlY2tBdmFpbGFibGVCeXRlcyBjYWxsIGFyZSBub3cgYXZhaWxhYmxlKi8KKyAgICBDUF9PdmVyZmxvdywgIAkJICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLworICAgIENQX1BpcGVEaXNjb25uZWN0ZWQgICwgIAkJICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCisgICAgQ1BfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgQ1BfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0V2ZW50TWF4ID0gMFg3RkZGRkZGRgorfSBDUF9FVkVOVFRZUEU7CisKKy8qKiBjb250ZW50IHBpcGUgZGVmaW5pdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgc3RydWN0IENQX1BJUEVUWVBFCit7CisgICAgLyoqIE9wZW4gYSBjb250ZW50IHN0cmVhbSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiAqLyAKKyAgICBDUHJlc3VsdCAoKk9wZW4pKCBDUGhhbmRsZSogaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJLCBDUF9BQ0NFU1NUWVBFIGVBY2Nlc3MgKTsKKworICAgIC8qKiBDbG9zZSBhIGNvbnRlbnQgc3RyZWFtLiAqLyAKKyAgICBDUHJlc3VsdCAoKkNsb3NlKSggQ1BoYW5kbGUgaENvbnRlbnQgKTsKKworICAgIC8qKiBDcmVhdGUgYSBjb250ZW50IHNvdXJjZSBhbmQgb3BlbiBpdCBmb3Igd3JpdGluZy4gKi8gCisgICAgQ1ByZXN1bHQgKCpDcmVhdGUpKCBDUGhhbmRsZSAqaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJICk7CisKKyAgICAvKiogQ2hlY2sgdGhlIHRoYXQgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgKGRlcGVuZGluZyBvbiBhY2Nlc3MgdHlwZSkuKi8KKyAgICBDUHJlc3VsdCAoKkNoZWNrQXZhaWxhYmxlQnl0ZXMpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1B1aW50IG5CeXRlc1JlcXVlc3RlZCwgQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEUgKmVSZXN1bHQgKTsKKworICAgIC8qKiBTZWVrIHRvIGNlcnRhaW4gcG9zaXRpb24gaW4gdGhlIGNvbnRlbnQgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW4uICovCisgICAgQ1ByZXN1bHQgKCpTZXRQb3NpdGlvbikoIENQaGFuZGxlICBoQ29udGVudCwgQ1BpbnQgbk9mZnNldCwgQ1BfT1JJR0lOVFlQRSBlT3JpZ2luKTsKKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQuICovCisgICAgQ1ByZXN1bHQgKCpHZXRQb3NpdGlvbikoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgKnBQb3NpdGlvbik7CisKKyAgICAvKiogUmV0cmlldmUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgY29udGVudCBzdHJlYW0gKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCisgICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgcmVhZHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcERhdGEsIENQdWludCBuU2l6ZSk7IAorCisgICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiAKKyAgICAgICBCdWZmZXIgY29udGFpbnMgdGhlIG5leHQgYmxvY2sgb2YgYnl0ZXMsIGFzIHNwZWNpZmllZCBieSBuU2l6ZSwgb2YgdGhlIGNvbnRlbnQuIG5TaXplIGFsc28KKyAgICAgICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBibG9jayBhY3R1YWxseSByZWFkLiBDb250ZW50IHBvaW50ZXIgYWR2YW5jZXMgdGhlIGJ5IHRoZSByZXR1cm5lZCBzaXplLiAKKyAgICAgICBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIHJlYWRzLiBUaGUgY2xpZW50IG11c3QgY2FsbCAKKyAgICAgICBSZWxlYXNlUmVhZEJ1ZmZlciB3aGVuIGRvbmUgd2l0aCBidWZmZXIuIAorCisgICAgICAgSW4gc29tZSBjYXNlcyB0aGUgcmVxdWVzdGVkIGJsb2NrIG1heSBub3QgcmVzaWRlIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHdpdGhpbiB0aGUKKyAgICAgICBwaXBlIGltcGxlbWVudGF0aW9uLiBGb3IgaW5zdGFuY2UgaWYgdGhlIHBpcGUgbGV2ZXJhZ2VzIGEgY2lyY3VsYXIgYnVmZmVyIHRoZW4gdGhlIHJlcXVlc3RlZCAKKyAgICAgICBibG9jayBtYXkgc3RyYWRkbGUgdGhlIGJvdW5kYXJ5IG9mIHRoZSBjaXJjdWxhciBidWZmZXIuIEJ5IGRlZmF1bHQgYSBwaXBlIGltcGxlbWVudGF0aW9uIAorICAgICAgIHBlcmZvcm1zIGEgY29weSBpbiB0aGlzIGNhc2UgdG8gcHJvdmlkZSB0aGUgYmxvY2sgdG8gdGhlIHBpcGUgY2xpZW50IGluIG9uZSBjb250aWd1b3VzIGJ1ZmZlci4KKyAgICAgICBJZiwgaG93ZXZlciwgdGhlIGNsaWVudCBzZXRzIGJGb3JiaWRDb3B5LCB0aGVuIHRoZSBwaXBlIHJldHVybnMgb25seSB0aG9zZSBieXRlcyBwcmVjZWRpbmcgdGhlIG1lbW9yeSAKKyAgICAgICBib3VuZGFyeS4gSGVyZSB0aGUgY2xpZW50IG1heSByZXRyaWV2ZSB0aGUgZGF0YSBpbiBzZWdtZW50cyBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgKm5TaXplLCBDUGJvb2wgYkZvcmJpZENvcHkpOworCisgICAgLyoqIFJlbGVhc2UgYSBidWZmZXIgb2J0YWluZWQgYnkgUmVhZEJ1ZmZlciBiYWNrIHRvIHRoZSBwaXBlLiAqLworICAgIENQcmVzdWx0ICgqUmVsZWFzZVJlYWRCdWZmZXIpKENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBCdWZmZXIpOworCisgICAgLyoqIFdyaXRlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRvIHRoZSBjb250ZW50IChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgorICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHdyaXRlcy4gKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqZGF0YSwgQ1B1aW50IG5TaXplKTsgCisKKyAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgY29udGVudC4gCisgICAgICAgQ2xpZW50IHdpbGwgZmlsbCBidWZmZXIgd2l0aCBvdXRwdXQgZGF0YS4gTm90ZTogcGlwZSBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlCisgICAgICAgZm9yIGxhcmdlIHdyaXRlcy4gVGhlIGNsaWVudCBtdXN0IGNhbGwgV3JpdGVCdWZmZXIgd2hlbiBkb25lIGl0IGhhcyBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRhdGEuKi8KKyAgICBDUHJlc3VsdCAoKkdldFdyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgblNpemUpOworCisgICAgLyoqIERlbGl2ZXIgYSBidWZmZXIgb2J0YWluZWQgdmlhIEdldFdyaXRlQnVmZmVyIHRvIHRoZSBwaXBlLiBQaXBlIHdpbGwgd3JpdGUgdGhlIAorICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIGNvbnRlbnQgYW5kIGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlciwgQ1B1aW50IG5GaWxsZWRTaXplKTsKKworICAgIC8qKiBSZWdpc3RlciBhIHBlci1oYW5kbGUgY2xpZW50IGNhbGxiYWNrIHdpdGggdGhlIGNvbnRlbnQgcGlwZS4gKi8KKyAgICBDUHJlc3VsdCAoKlJlZ2lzdGVyQ2FsbGJhY2spKCBDUGhhbmRsZSBoQ29udGVudCwgQ1ByZXN1bHQgKCpDbGllbnRDYWxsYmFjaykoQ1BfRVZFTlRUWVBFIGVFdmVudCwgQ1B1aW50IGlQYXJhbSkpOworCit9IENQX1BJUEVUWVBFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db3JlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIwZjZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db3JlLmgKQEAgLTAsMCArMSwxNDQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogT01YX0NvcmUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfQ29yZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSBib3RoIHRoZQorICogIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IHRvIGFjY2VzcyBjb21tb24gaXRlbXMuCisgKi8KKworI2lmbmRlZiBPTVhfQ29yZV9oCisjZGVmaW5lIE9NWF9Db3JlX2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9JbmRleC5oPgorCisKKy8qKiBUaGUgT01YX0NPTU1BTkRUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWN0aW9uIGluIHRoZQorICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4gIAorICogIEBpbmdyb3VwIGNvcmUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9DT01NQU5EVFlQRQoreworICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsICAgIC8qKjwgQ2hhbmdlIHRoZSBjb21wb25lbnQgc3RhdGUgKi8KKyAgICBPTVhfQ29tbWFuZEZsdXNoLCAgICAgICAvKio8IEZsdXNoIHRoZSBkYXRhIHF1ZXVlKHMpIG9mIGEgY29tcG9uZW50ICovCisgICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgLyoqPCBEaXNhYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KKyAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUsICAvKio8IEVuYWJsZSBhIHBvcnQgb24gYSBjb21wb25lbnQuICovCisgICAgT01YX0NvbW1hbmRNYXJrQnVmZmVyLCAgLyoqPCBNYXJrIGEgY29tcG9uZW50L2J1ZmZlciBmb3Igb2JzZXJ2YXRpb24gKi8KKyAgICBPTVhfQ29tbWFuZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQ29tbWFuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0NvbW1hbmRNYXggPSAwWDdGRkZGRkZGCit9IE9NWF9DT01NQU5EVFlQRTsKKworCisKKy8qKiBUaGUgT01YX1NUQVRFVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIG9yIGNoYW5nZSB0aGUgY29tcG9uZW50CisgKiAgc3RhdGUuICBUaGlzIGVudW1lcmF0aW9uIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21wb25lbnQgd2hlbgorICogIHVzZWQgd2l0aCB0aGUgT01YX0dldFN0YXRlIG1hY3JvIG9yIGJlY29tZXMgdGhlIHBhcmFtZXRlciBpbiBhIHN0YXRlIGNoYW5nZQorICogIGNvbW1hbmQgd2hlbiB1c2VkIHdpdGggdGhlIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4KKyAqCisgKiAgVGhlIGNvbXBvbmVudCB3aWxsIGJlIGluIHRoZSBMb2FkZWQgc3RhdGUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkKKyAqICBsb2FkZWQgaW50byBtZW1vcnkuICBJbiB0aGUgTG9hZGVkIHN0YXRlLCB0aGUgY29tcG9uZW50IGlzIG5vdCBhbGxvd2VkIHRvCisgKiAgYWxsb2NhdGUgb3IgaG9sZCByZXNvdXJjZXMgb3RoZXIgdGhhbiB0byBidWlsZCBpdCdzIGludGVybmFsIHBhcmFtZXRlcgorICogIGFuZCBjb25maWd1cmF0aW9uIHRhYmxlcy4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHNlbmQgb25lIG9yIG1vcmUKKyAqICBTZXRQYXJhbWV0ZXJzL0dldFBhcmFtZXRlcnMgYW5kIFNldENvbmZpZy9HZXRDb25maWcgY29tbWFuZHMgdG8gdGhlCisgKiAgY29tcG9uZW50IGFuZCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVyIGFuZAorICogIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgdXNlIGxhdGVyLiAgV2hlbiB0aGUgYXBwbGljYXRpb24gc2VuZHMgdGhlCisgKiAgSWRsZSBjb21tYW5kLCB0aGUgY29tcG9uZW50IHdpbGwgYWNxdWlyZSB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlCisgKiAgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgaWRsZSBzdGF0ZSBpZiB0aGUKKyAqICBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwuICBJZiB0aGUgY29tcG9uZW50IGNhbm5vdCBzdWNjZXNzZnVsbHkKKyAqICB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGZvciBhbnkgcmVhc29uLCB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudAorICogIHNoYWxsIGJlIGZ1bGx5IHJvbGxlZCBiYWNrIHRvIHRoZSBMb2FkZWQgc3RhdGUgKGUuZy4gYWxsIGFsbG9jYXRlZCAKKyAqICByZXNvdXJjZXMgc2hhbGwgYmUgcmVsZWFzZWQpLiAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBjb21tYW5kCisgKiAgdG8gZ28gdG8gdGhlIEV4ZWN1dGluZyBzdGF0ZSwgaXQgc2hhbGwgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzIGJ5CisgKiAgc2VuZGluZyBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgYXBwbGljYXRpb24uICBXaGlsZQorICogIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIElkbGUgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBzZW5kIHRoZQorICogIFBhdXNlIGNvbW1hbmQuICBJZiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kIHdoaWxlIGluIHRoZQorICogIElkbGUgc3RhdGUsIHRoZSBjb21wb25lbnQgc2hhbGwgc2VuZCBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgCisgKiAgYXBwbGljYXRpb24sIGJ1dCBzaGFsbCBub3QgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzLiAgVGhpcyB3aWxsIGFsbG93IHRoZQorICogIGFwcGxpY2F0aW9uIHRvIHByZWZpbGwgYnVmZmVycy4KKyAqIAorICogIEBpbmdyb3VwIGNvbXAKKyAqLworCit0eXBlZGVmIGVudW0gT01YX1NUQVRFVFlQRQoreworICAgIE9NWF9TdGF0ZUludmFsaWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIHRoYXQgaXQncyBpbnRlcm5hbCBkYXRhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBjb3JydXB0ZWQgdG8gdGhlIHBvaW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGRldGVybWluZSBpdCdzIHN0YXRlIHByb3Blcmx5ICovCisgICAgT01YX1N0YXRlTG9hZGVkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZCBidXQgaGFzIG5vdCBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uICBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gYXJlIHRoZSBvbmx5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIHRoaXMgc3RhdGUuICovCisgICAgT01YX1N0YXRlSWRsZSwgICAgICAgIC8qKjwgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgYW5kIHRoZSBjb21wb25lbnQgaXMgcmVhZHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQuICovCisgICAgT01YX1N0YXRlRXhlY3V0aW5nLCAgIC8qKjwgY29tcG9uZW50IGhhcyBhY2NlcHRlZCB0aGUgc3RhcnQgY29tbWFuZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJvY2Vzc2luZyBkYXRhIChpZiBkYXRhIGlzIGF2YWlsYWJsZSkgKi8KKyAgICBPTVhfU3RhdGVQYXVzZSwgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIHJlY2VpdmVkIHBhdXNlIGNvbW1hbmQgKi8KKyAgICBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzLCAvKio8IGNvbXBvbmVudCBpcyB3YWl0aW5nIGZvciByZXNvdXJjZXMsIGVpdGhlciBhZnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdGlvbiBvciBiZWZvcmUgaXQgZ2V0cyB0aGUgcmVzb3VyY2VzIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRldGFpbHMuICovCisgICAgT01YX1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9TdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1N0YXRlTWF4ID0gMFg3RkZGRkZGRgorfSBPTVhfU1RBVEVUWVBFOworCisvKiogVGhlIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgc3RhbmRhcmQgT01YIEVycm9ycy4gIFRoZXNlIAorICogIGVycm9ycyBzaG91bGQgY292ZXIgbW9zdCBvZiB0aGUgY29tbW9uIGZhaWx1cmUgY2FzZXMuICBIb3dldmVyLCAKKyAqICB2ZW5kb3JzIGFyZSBmcmVlIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2VzIG9mIHRoZWlyIG93biBhcyAKKyAqICBsb25nIGFzIHRoZXkgZm9sbG93IHRoZXNlIHJ1bGVzOgorICogIDEuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIDB4OTAwMDAwMDAgdG8KKyAqICAgICAgMHg5MDAwRkZGRi4KKyAqICAyLiAgVmVuZG9yIGVycm9yIG1lc3NhZ2VzIHNoYWxsIGJlIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBwcm92aWRlZAorICogICAgICB3aXRoIHRoZSBjb21wb25lbnQuICBObyBlcnJvciBtZXNzYWdlcyBhcmUgYWxsb3dlZCB0aGF0IGFyZQorICogICAgICBub3QgZGVmaW5lZC4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FUlJPUlRZUEUKK3sKKyAgT01YX0Vycm9yTm9uZSA9IDAsCisKKyAgLyoqIFRoZXJlIHdlcmUgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uICovCisgIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyA9IChPTVhfUzMyKSAweDgwMDAxMDAwLAorCisgIC8qKiBUaGVyZSB3YXMgYW4gZXJyb3IsIGJ1dCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICovCisgIE9NWF9FcnJvclVuZGVmaW5lZCA9IChPTVhfUzMyKSAweDgwMDAxMDAxLAorCisgIC8qKiBUaGUgY29tcG9uZW50IG5hbWUgc3RyaW5nIHdhcyBub3QgdmFsaWQgKi8KKyAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWUgPSAoT01YX1MzMikgMHg4MDAwMTAwMiwKKworICAvKiogTm8gY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHN0cmluZyB3YXMgZm91bmQgKi8KKyAgT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQgPSAoT01YX1MzMikgMHg4MDAwMTAwMywKKworICAvKiogVGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgZGlkIG5vdCBoYXZlIGEgIk9NWF9Db21wb25lbnRJbml0IiBvcgorICAgICAgIk9NWF9Db21wb25lbnREZUluaXQgZW50cnkgcG9pbnQgKi8KKyAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCA9IChPTVhfUzMyKSAweDgwMDAxMDA0LAorCisgIC8qKiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHdlcmUgbm90IHZhbGlkICovCisgIE9NWF9FcnJvckJhZFBhcmFtZXRlciA9IChPTVhfUzMyKSAweDgwMDAxMDA1LAorCisgIC8qKiBUaGUgcmVxdWVzdGVkIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAqLworICBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDA2LAorCisgIC8qKiBUaGUgYnVmZmVyIHdhcyBlbXB0aWVkIGJlZm9yZSB0aGUgbmV4dCBidWZmZXIgd2FzIHJlYWR5ICovCisgIE9NWF9FcnJvclVuZGVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA3LAorCisgIC8qKiBUaGUgYnVmZmVyIHdhcyBub3QgYXZhaWxhYmxlIHdoZW4gaXQgd2FzIG5lZWRlZCAqLworICBPTVhfRXJyb3JPdmVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA4LAorCisgIC8qKiBUaGUgaGFyZHdhcmUgZmFpbGVkIHRvIHJlc3BvbmQgYXMgZXhwZWN0ZWQgKi8KKyAgT01YX0Vycm9ySGFyZHdhcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwOSwKKworICAvKiogVGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgc3RhdGUgT01YX1N0YXRlSW52YWxpZCAqLworICBPTVhfRXJyb3JJbnZhbGlkU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAwQSwKKworICAvKiogU3RyZWFtIGlzIGZvdW5kIHRvIGJlIGNvcnJ1cHQgKi8KKyAgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCA9IChPTVhfUzMyKSAweDgwMDAxMDBCLAorCisgIC8qKiBQb3J0cyBiZWluZyBjb25uZWN0ZWQgYXJlIG5vdCBjb21wYXRpYmxlICovCisgIE9NWF9FcnJvclBvcnRzTm90Q29tcGF0aWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDBDLAorCisgIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGlkbGUgY29tcG9uZW50IGhhdmUgYmVlbgorICAgICAgbG9zdCByZXN1bHRpbmcgaW4gdGhlIGNvbXBvbmVudCByZXR1cm5pbmcgdG8gdGhlIGxvYWRlZCBzdGF0ZSAqLworICBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEQsCisKKyAgLyoqIE5vIG1vcmUgaW5kaWNpZXMgY2FuIGJlIGVudW1lcmF0ZWQgKi8KKyAgT01YX0Vycm9yTm9Nb3JlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEUsCisKKyAgLyoqIFRoZSBjb21wb25lbnQgZGV0ZWN0ZWQgYSB2ZXJzaW9uIG1pc21hdGNoICovCisgIE9NWF9FcnJvclZlcnNpb25NaXNtYXRjaCA9IChPTVhfUzMyKSAweDgwMDAxMDBGLAorCisgIC8qKiBUaGUgY29tcG9uZW50IGlzIG5vdCByZWFkeSB0byByZXR1cm4gZGF0YSBhdCB0aGlzIHRpbWUgKi8KKyAgT01YX0Vycm9yTm90UmVhZHkgPSAoT01YX1MzMikgMHg4MDAwMTAxMCwKKworICAvKiogVGhlcmUgd2FzIGEgdGltZW91dCB0aGF0IG9jY3VycmVkICovCisgIE9NWF9FcnJvclRpbWVvdXQgPSAoT01YX1MzMikgMHg4MDAwMTAxMSwKKworICAvKiogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBzdGF0ZSB5b3UgYXJlIGFscmVhZHkgaW4gKi8KKyAgT01YX0Vycm9yU2FtZVN0YXRlID0gKE9NWF9TMzIpIDB4ODAwMDEwMTIsCisKKyAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gZXhlY3V0aW5nIG9yIHBhdXNlZCBjb21wb25lbnQgaGF2ZSBiZWVuIAorICAgICAgcHJlZW1wdGVkLCBjYXVzaW5nIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIHRvIHRoZSBpZGxlIHN0YXRlICovCisgIE9NWF9FcnJvclJlc291cmNlc1ByZWVtcHRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDEzLCAKKworICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKKyAgICAgIGR1cmluZyB0aGUgYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgTE9BREVEIHRvIHRoZSBJRExFIHN0YXRlIG9yCisgICAgICBvbiBhIHBvcnQgcmVzdGFydCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAorICAgICAgdG8gc2VuZCBpdCBhbiBhbGxvY2F0ZWQgYnVmZmVyIHZpYSBhIFVzZUJ1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nQWxsb2NhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE0LAorCisgIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAorICAgICAgZHVyaW5nIHRoZSBkZWFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIHN0YXRlIG9yIAorICAgICAgb24gYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKKyAgICAgIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvbiBvZiBhIGJ1ZmZlciBoZWFkZXIgdmlhIGEgRnJlZUJ1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTUsCisKKyAgLyoqIEEgc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKKyAgICAgIGR1cmluZyB0aGUgc3RvcHBpbmcgb2YgYSBwb3J0IChlaXRoZXIgb24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIAorICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIAorICAgICAgdGhlIG5vbi1zdXBwbGllciB0byByZXR1cm4gYSBidWZmZXIgdmlhIGFuIEVtcHR5VGhpc0J1ZmZlciBvciBGaWxsVGhpc0J1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nU3RvcCA9IChPTVhfUzMyKSAweDgwMDAxMDE2LAorCisgIC8qKiBBdHRlbXB0aW5nIGEgc3RhdGUgdHJhbnN0aW9uIHRoYXQgaXMgbm90IGFsbG93ZWQgKi8KKyAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTcsCisKKyAgLyogQXR0ZW1wdGluZyBhIGNvbW1hbmQgdGhhdCBpcyBub3QgYWxsb3dlZCBkdXJpbmcgdGhlIHByZXNlbnQgc3RhdGUuICovCisgIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTgsIAorCisgIC8qKiBUaGUgdmFsdWVzIGVuY2Fwc3VsYXRlZCBpbiB0aGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBzdHJ1Y3R1cmUgYXJlIG5vdCBzdXBwb3J0ZWQuICovCisgIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyA9IChPTVhfUzMyKSAweDgwMDAxMDE5LAorCisgIC8qKiBUaGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIGluZGV4IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQSwKKworICAvKiogVGhlIHBvcnQgaW5kZXggc3VwcGxpZWQgaXMgaW5jb3JyZWN0LiAqLworICBPTVhfRXJyb3JCYWRQb3J0SW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQiwKKworICAvKiogVGhlIHBvcnQgaGFzIGxvc3Qgb25lIG9yIG1vcmUgb2YgaXRzIGJ1ZmZlcnMgYW5kIGl0IHRodXMgdW5wb3B1bGF0ZWQuICovCisgIE9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDFDLAorCisgIC8qKiBDb21wb25lbnQgc3VzcGVuZGVkIGR1ZSB0byB0ZW1wb3JhcnkgbG9zcyBvZiByZXNvdXJjZXMgKi8KKyAgT01YX0Vycm9yQ29tcG9uZW50U3VzcGVuZGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUQsCisKKyAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIGFuIGluYWJpbGl0eSB0byBhY3F1aXJlIGR5bmFtaWMgcmVzb3VyY2VzICovCisgIE9NWF9FcnJvckR5bmFtaWNSZXNvdXJjZXNVbmF2YWlsYWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDFFLAorCisgIC8qKiBXaGVuIHRoZSBtYWNyb2Jsb2NrIGVycm9yIHJlcG9ydGluZyBpcyBlbmFibGVkIHRoZSBjb21wb25lbnQgcmV0dXJucyBuZXcgZXJyb3IgCisgIGZvciBldmVyeSBmcmFtZSB0aGF0IGhhcyBlcnJvcnMgKi8KKyAgT01YX0Vycm9yTWJFcnJvcnNJbkZyYW1lID0gKE9NWF9TMzIpIDB4ODAwMDEwMUYsCisKKyAgLyoqIEEgY29tcG9uZW50IHJlcG9ydHMgdGhpcyBlcnJvciB3aGVuIGl0IGNhbm5vdCBwYXJzZSBvciBkZXRlcm1pbmUgdGhlIGZvcm1hdCBvZiBhbiBpbnB1dCBzdHJlYW0uICovCisgIE9NWF9FcnJvckZvcm1hdE5vdERldGVjdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjAsIAorCisgIC8qKiBUaGUgY29udGVudCBvcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCisgIE9NWF9FcnJvckNvbnRlbnRQaXBlT3BlbkZhaWxlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIxLAorCisgIC8qKiBUaGUgY29udGVudCBjcmVhdGlvbiBvcGVyYXRpb24gZmFpbGVkLiAqLworICBPTVhfRXJyb3JDb250ZW50UGlwZUNyZWF0aW9uRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjIsCisKKyAgLyoqIFNlcGFyYXRlIHRhYmxlIGluZm9ybWF0aW9uIGlzIGJlaW5nIHVzZWQgKi8KKyAgT01YX0Vycm9yU2VwZXJhdGVUYWJsZXNVc2VkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjMsCisKKyAgLyoqIFR1bm5lbGluZyBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50Ki8KKyAgT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyNCwKKworICBPTVhfRXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IChPTVhfUzMyKTB4OEYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkID0gKE9NWF9TMzIpMHg5MDAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9FcnJvck1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VSUk9SVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvcmUgKi8KK3R5cGVkZWYgT01YX0VSUk9SVFlQRSAoKiBPTVhfQ09NUE9ORU5USU5JVFRZUEUpKE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKy8qKiBAaW5ncm91cCBjb3JlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFCit7CisgIGNvbnN0IGNoYXIgICAgICAgICAgKiBwTmFtZTsgICAgICAgLyogQ29tcG9uZW50IG5hbWUsIDEyOCBieXRlIGxpbWl0IChpbmNsdWRpbmcgJ1wwJykgYXBwbGllcyAqLworICBPTVhfQ09NUE9ORU5USU5JVFRZUEUgcEluaXRpYWxpemU7IC8qIENvbXBvbmVudCBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLworfSBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFOworCisvKiogQGluZ3JvdXAgY29yZSAqLworZXh0ZXJuIE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUgT01YX0NvbXBvbmVudFJlZ2lzdGVyZWRbXTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BSSU9SSVRZTUdNVFRZUEUgeworIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgT01YX1UzMiBuR3JvdXBQcmlvcml0eTsgICAgICAgICAgICAvKio8IFByaW9yaXR5IG9mIHRoZSBjb21wb25lbnQgZ3JvdXAgKi8KKyBPTVhfVTMyIG5Hcm91cElEOyAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLworfSBPTVhfUFJJT1JJVFlNR01UVFlQRTsKKworLyogQ29tcG9uZW50IG5hbWUgYW5kIFJvbGUgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyAnXDAnLiAqLworI2RlZmluZSBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAxMjgKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VOCBjUm9sZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07ICAvKio8IG5hbWUgb2Ygc3RhbmRhcmQgY29tcG9uZW50IHdoaWNoIGRlZmluZXMgY29tcG9uZW50IHJvbGUgKi8KK30gT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFOworCisvKiogRW5kIG9mIFN0cmVhbSBCdWZmZXIgRmxhZzogCisgICoKKyAgKiBBIGNvbXBvbmVudCBzZXRzIEVPUyB3aGVuIGl0IGhhcyBubyBtb3JlIGRhdGEgdG8gZW1pdCBvbiBhIHBhcnRpY3VsYXIgCisgICogb3V0cHV0IHBvcnQuIFRodXMgYW4gb3V0cHV0IHBvcnQgc2hhbGwgc2V0IEVPUyBvbiB0aGUgbGFzdCBidWZmZXIgaXQgCisgICogZW1pdHMuIEEgY29tcG9uZW50J3MgZGV0ZXJtaW5hdGlvbiBvZiB3aGVuIGFuIG91dHB1dCBwb3J0IHNob3VsZCAKKyAgKiBjZWFzZSBzZW5kaW5nIGRhdGEgaXMgaW1wbGVtZW5hdGlvbiBzcGVjaWZpYy4KKyAgKiBAaW5ncm91cCBidWYKKyAgKi8KKworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FT1MgMHgwMDAwMDAwMSAKKworLyoqIFN0YXJ0IFRpbWUgQnVmZmVyIEZsYWc6IAorICoKKyAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIFNUQVJUVElNRQorICogZmxhZyBvbiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlCisgKiBzdHJlYW0uIFRoZSBzdGFydGluZyB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGRhdGEgdGhhdAorICogc2hvdWxkIGJlIGRpc3BsYXllZCBhdCBzdGFydHVwIG9yIGFmdGVyIGEgc2Vlay4KKyAqIFRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHN0cmVhbSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHN0YXJ0IHRpbWUuCisgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgc2VlayB0byBhIHBhcnRpY3VsYXIgdmlkZW8gZnJhbWUsIAorICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mIAorICogdGhlIHN0cmVhbSB3aWxsIGJlIHRoZSBpbnRyYS1mcmFtZSBwcmVjZWRpbmcgdGhlIHRhcmdldCBmcmFtZSBhbmQKKyAqIHRoZSBzdGFydHRpbWUgd2lsbCBvY2N1ciB3aXRoIHRoZSB0YXJnZXQgZnJhbWUgKHdpdGggYW55IG90aGVyCisgKiByZXF1aXJlZCBmcmFtZXMgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIHRhcmdldCBpbnRlcnZlbmluZykuCisgKgorICogVGhlIFNUQVJUVElNRSBmbGFnIGlzIGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyJ3MgCisgKiB0aW1lc3RhbXAgJyB0aHVzIGl0cyBhc3NvY2lhdGlvbiB0byBidWZmZXIgZGF0YSBhbmQgaXRzIAorICogcHJvcGFnYXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSB0aW1lc3RhbXAncy4KKyAqCisgKiBXaGVuIGEgU3luYyBDb21wb25lbnQgY2xpZW50IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGggdGhlIAorICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0IAorICogdXNpbmcgT01YX0NvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUgYW5kIHBhc3NpbmcgdGhlIGJ1ZmZlcidzCisgKiB0aW1lc3RhbXAuCisgKiAKKyAqIEBpbmdyb3VwIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIDB4MDAwMDAwMDIKKworIAorCisvKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6IAorICoKKyAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIERFQ09ERU9OTFkKKyAqIGZsYWcgb24gYW55IGJ1ZmZlciB0aGF0IHNob3VsZCBzaGFsbCBiZSBkZWNvZGVkIGJ1dCBzaG91bGQgbm90IGJlCisgKiBkaXNwbGF5ZWQuIFRoaXMgZmxhZyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsIHdoZW4gYSBzb3VyY2Ugc2Vla3MgdG8gCisgKiBhIHRhcmdldCBpbnRlcmZyYW1lIHRoYXQgcmVxdWlyZXMgdGhlIGRlY29kZSBvZiBmcmFtZXMgcHJlY2VkaW5nIHRoZSAKKyAqIHRhcmdldCB0byBmYWNpbGl0YXRlIHRoZSB0YXJnZXQncyByZWNvbnN0cnVjdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSAKKyAqIHNvdXJjZSB3b3VsZCBlbWl0IHRoZSBmcmFtZXMgcHJlY2VkaW5nIHRoZSB0YXJnZXQgZG93bnN0cmVhbSAKKyAqIGJ1dCBtYXJrIHRoZW0gYXMgZGVjb2RlIG9ubHkuCisgKgorICogVGhlIERFQ09ERU9OTFkgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciBkYXRhIGFuZCBwcm9wYWdhdGVkIGluIGEgCisgKiBtYW5uZXIgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgdGltZXN0YW1wLgorICoKKyAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBkYXRhIHNob3VsZCBpZ25vcmUgYWxsIGJ1ZmZlcnMgd2l0aCAKKyAqIHRoZSBERUNPREVPTkxZIGZsYWcgc2V0LgorICogCisgKiBAaW5ncm91cCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0RFQ09ERU9OTFkgMHgwMDAwMDAwNAorCisKKy8qIERhdGEgQ29ycnVwdCBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIElMIGNsaWVudCBiZWxpZXZlcyB0aGUgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBidWZmZXIgaXMgY29ycnVwdCAKKyAqIEBpbmdyb3VwIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREFUQUNPUlJVUFQgMHgwMDAwMDAwOAorCisvKiBFbmQgb2YgRnJhbWU6IFRoZSBidWZmZXIgY29udGFpbnMgZXhhY3RseSBvbmUgZW5kIG9mIGZyYW1lIGFuZCBubyBkYXRhCisgKiAgb2NjdXJzIGFmdGVyIHRoZSBlbmQgb2YgZnJhbWUuIFRoaXMgZmxhZyBpcyBhbiBvcHRpb25hbCBoaW50LiBUaGUgYWJzZW5jZQorICogIG9mIHRoaXMgZmxhZyBkb2VzIG5vdCBpbXBseSB0aGUgYWJzZW5jZSBvZiBhbiBlbmQgb2YgZnJhbWUgd2l0aGluIHRoZSBidWZmZXIuIAorICogQGluZ3JvdXAgYnVmCisqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIDB4MDAwMDAwMTAKKworLyogU3luYyBGcmFtZSBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGJ1ZmZlciBjb250ZW50IGNvbnRhaW5zIGEgY29kZWQgc3luYyBmcmFtZSAnIAorICogIGEgZnJhbWUgdGhhdCBoYXMgbm8gZGVwZW5kZW5jeSBvbiBhbnkgb3RoZXIgZnJhbWUgaW5mb3JtYXRpb24gCisgKiAgQGluZ3JvdXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FIDB4MDAwMDAwMjAKKworLyogRXh0cmEgZGF0YSBwcmVzZW50IGZsYWc6IHRoZXJlIGlzIGV4dHJhIGRhdGEgYXBwZW5kZWQgdG8gdGhlIGRhdGEgc3RyZWFtCisgKiByZXNpZGluZyBpbiB0aGUgYnVmZmVyIAorICogQGluZ3JvdXAgYnVmICAKKyAqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FWFRSQURBVEEgMHgwMDAwMDA0MAorCisvKiogQ29kZWMgQ29uZmlnIEJ1ZmZlciBGbGFnOiAKKyogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgaXMgYW4gb3B0aW9uYWwgZmxhZyB0aGF0IGlzIHNldCBieSBhbgorKiBvdXRwdXQgcG9ydCB3aGVuIGFsbCBieXRlcyBpbiB0aGUgYnVmZmVyIGZvcm0gcGFydCBvciBhbGwgb2YgYSBzZXQgb2YKKyogY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLiAgRXhhbXBsZXMgaW5jbHVkZSBTUFMvUFBTIG5hbCB1bml0cworKiBmb3IgT01YX1ZJREVPX0NvZGluZ0FWQyBvciBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgZm9yCisqIE9NWF9BVURJT19Db2RpbmdBQUMuICBBbnkgY29tcG9uZW50IHRoYXQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHNldHMgCisqIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNoYWxsIG5vdCBtaXggY29kZWMgY29uZmlndXJhdGlvbiBieXRlcworKiB3aXRoIGZyYW1lIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyLCBhbmQgc2hhbGwgc2VuZCBhbGwgYnVmZmVycworKiBjb250YWluaW5nIGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMgYmVmb3JlIGFueSBidWZmZXJzIGNvbnRhaW5pbmcKKyogZnJhbWUgZGF0YSB0aGF0IHRob3NlIGNvbmZpZ3VyYXRpb25zIGJ5dGVzIGRlc2NyaWJlLgorKiBJZiB0aGUgc3RyZWFtIGZvcm1hdCBmb3IgYSBwYXJ0aWN1bGFyIGNvZGVjIGhhcyBhIGZyYW1lIHNwZWNpZmljCisqIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCBmcmFtZSwgZm9yIGV4YW1wbGUgT01YX0FVRElPX0NvZGluZ01QMyBvcgorKiBPTVhfQVVESU9fQ29kaW5nQUFDIGluIEFEVFMgbW9kZSwgdGhlbiB0aGVzZSBzaGFsbCBiZSBwcmVzZW50ZWQgYXMKKyogbm9ybWFsIHdpdGhvdXQgc2V0dGluZyBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRy4KKyAqIEBpbmdyb3VwIGJ1ZgorICovCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIDB4MDAwMDAwODAKKworCisKKy8qKiBAaW5ncm91cCBidWYgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCisgICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KKyAgICBPTVhfVTMyIG5PZmZzZXQ7ICAgICAgICAgICAgLyoqPCBzdGFydCBvZmZzZXQgb2YgdmFsaWQgZGF0YSBpbiBieXRlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICBPTVhfUFRSIHBBcHBQcml2YXRlOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCisgICAgT01YX1BUUiBwUGxhdGZvcm1Qcml2YXRlOyAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgcGxhdGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLyAKKyAgICBPTVhfUFRSIHBJbnB1dFBvcnRQcml2YXRlOyAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBpbnB1dCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KKyAgICBPTVhfUFRSIHBPdXRwdXRQb3J0UHJpdmF0ZTsgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBvdXRwdXQgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCisgICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGV2ZW50IHVwb24gcHJvY2Vzc2luZyB0aGlzIGJ1ZmZlci4gKi8KKyAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLworICAgIE9NWF9VMzIgblRpY2tDb3VudDsgICAgICAgICAvKio8IE9wdGlvbmFsIGVudHJ5IHRoYXQgdGhlIGNvbXBvbmVudCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHdpdGggYSB0aWNrIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGFjY2VzcyB0aGUgY29tcG9uZW50LiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBpbiBtaWNyb3NlY29uZHMuICBTaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgYSB2YWx1ZSByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBwb2ludCwgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgdXNlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KKyBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgc2FtcGxlcyB3aXRoaW4gdGhlIGJ1ZmZlciBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmZlcnJlZCBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlciB0byB0aGUgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIuKi8KKyAgT01YX1UzMiAgICAgbkZsYWdzOyAgICAgICAgICAgLyoqPCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MgKi8KKyAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCisgIE9NWF9VMzIgbklucHV0UG9ydEluZGV4OyAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBpbnB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KK30gT01YX0JVRkZFUkhFQURFUlRZUEU7CisKKy8qKiBUaGUgT01YX0VYVFJBREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkZWZpbmUgdGhlIAorICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgorICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKKyAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAorICogT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FWFRSQURBVEFUWVBFCit7CisgICBPTVhfRXh0cmFEYXRhTm9uZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGF0IG5vIG1vcmUgZXh0cmEgZGF0YSBzZWN0aW9ucyBmb2xsb3cgKi8gICAgICAgIAorICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCisgICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVhUUkFEQVRBVFlQRTsKKworCit0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfRVhUUkFEQVRBVFlQRSBlVHlwZTsgICAgICAgLyogRXh0cmEgRGF0YSB0eXBlICovCisgICAgT01YX1UzMiBuRGF0YVNpemU7ICAgLyogU2l6ZSBvZiB0aGUgc3VwcG9ydGluZyBkYXRhIHRvIGZvbGxvdyAqLworICAgIE9NWF9VOCAgZGF0YVsxXTsgICAgIC8qIFN1cHBvcnRpbmcgZGF0YSBoaW50ICAqLworfSBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QT1JUX1BBUkFNX1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCit9IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKK3sKKyAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29tbWFuZCAqLworICAgIE9NWF9FdmVudEVycm9yLCAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBlcnJvciBjb25kaXRpb24gKi8KKyAgICBPTVhfRXZlbnRNYXJrLCAgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBidWZmZXIgbWFyayAqLworICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qKjwgY29tcG9uZW50IGlzIHJlcG9ydGVkIGEgcG9ydCBzZXR0aW5ncyBjaGFuZ2UgKi8KKyAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLCAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gRU9TICovIAorICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KKyAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLworICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KKyAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLworICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9FdmVudE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VWRU5UVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NBTExCQUNLVFlQRQoreworICAgIC8qKiBUaGUgRXZlbnRIYW5kbGVyIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gd2hlbiBhbgorICAgICAgICBldmVudCBvZiBpbnRlcmVzdCBvY2N1cnMuICBFdmVudHMgYXJlIGRlZmluZWQgaW4gdGhlIE9NWF9FVkVOVFRZUEUKKyAgICAgICAgZW51bWVyYXRpb24uICBQbGVhc2Ugc2VlIHRoYXQgZW51bWVyYXRpb24gZm9yIGRldGFpbHMgb2Ygd2hhdCB3aWxsCisgICAgICAgIGJlIHJldHVybmVkIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuIENhbGxiYWNrcyBzaG91bGQgbm90IHJldHVybgorICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgc2hhbGwgaGFuZGxlIGl0IGludGVybmFsbHkuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKworICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjIHRvIGF2b2lkCisgICAgICAgIGJsb2NraW5nIHRoZSBjb21wb25lbnQgZm9yIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCisKKyAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEBwYXJhbSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCisgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KKyAgICAgICAgQHBhcmFtIGVFdmVudAorICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCisgICAgICAgIEBwYXJhbSBuRGF0YTEKKyAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAorICAgICAgICAgICAgYW4gT01YX0NPTU1BTkRUWVBFIGZvciBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgYW5kIE9NWF9JTkRFWFRZUEUgZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCisgICAgICAgICBAcGFyYW0gbkRhdGEyCisgICAgICAgICAgICBuRGF0YTIgd2lsbCBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQuIENhbiBiZSBPTVhfU1RBVEVUWVBFIGZvcgorICAgICAgICAgICAgYSBPTVhfQ29tbWFuZFN0YXRlU2V0IGNvbW1hbmQgb3IgcG9ydCBpbmRleCBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KKyAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMCBpZiBub3QgdXNlZC4gKQorICAgICAgICBAcGFyYW0gcEV2ZW50RGF0YQorICAgICAgICAgICAgUG9pbnRlciB0byBhZGRpdGlvbmFsIGV2ZW50LXNwZWNpZmljIGRhdGEgKHNlZSBzcGVjIGZvciBtZWFuaW5nKS4KKyAgICAgICovCisKKyAgIE9NWF9FUlJPUlRZUEUgKCpFdmVudEhhbmRsZXIpKAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCisgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAorICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOworCisgICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCisgICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCisgICAgICAgIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVmaWxsIHRoZSBidWZmZXJzIGR1cmluZyB0aGlzCisgICAgICAgIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlbSBhbmQgcmVmaWxsIHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZQorICAgICAgICBpcyBubyBlcnJvciByZXR1cm4sIHNvIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQKKyAgICAgICAgaW50ZXJuYWxseS4gIAorICAgICAgICAKKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAgICAgCisgICAgICAgIEBwYXJhbSBoQ29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgICAgICBAcGFyYW0gcEFwcERhdGEKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCisgICAgICAgIEBwYXJhbSBwQnVmZmVyCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBlbXB0aWVkLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlCdWZmZXJEb25lKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAorICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOworCisgICAgLyoqIFRoZSBGaWxsQnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZmlsbGVkIGJ1ZmZlcnMgZnJvbSBhbgorICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuICAKKyAgICAgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byAKKyAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycyAKKyAgICAgICAgYW5kIGVtcHR5IHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHNvIAorICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGludGVybmFsbHkuICBUaGUgCisgICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQorICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAorCisgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIAorICAgICAgICBAcGFyYW0gaENvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIHBBcHBEYXRhCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAorICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgorICAgICAgICBAcGFyYW0gcEJ1ZmZlcgorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZmlsbGVkLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqRmlsbEJ1ZmZlckRvbmUpKAorICAgICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9PVVQgT01YX1BUUiBwQXBwRGF0YSwKKyAgICAgICAgT01YX09VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKK30gT01YX0NBTExCQUNLVFlQRTsKKworLyoqIFRoZSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGljdGF0ZSBwb3J0IHN1cHBsaWVyCisgICAgcHJlZmVyZW5jZSB3aGVuIHR1bm5lbGluZyBiZXR3ZWVuIHR3byBwb3J0cy4KKyAgICBAaW5ncm91cCB0dW4gYnVmCisqLwordHlwZWRlZiBlbnVtIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUKK3sKKyAgICBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQgPSAweDAsIC8qKjwgcG9ydCBzdXBwbHlpbmcgdGhlIGJ1ZmZlcnMgaXMgdW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLworICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCisgICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCisgICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQnVmZmVyU3VwcGx5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQnVmZmVyU3VwcGx5TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFOworCisKKy8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyIAorICogQGluZ3JvdXAgdHVuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVCdWZmZXJTdXBwbGllcjsgLyoqPCBidWZmZXIgc3VwcGxpZXIgKi8KK30gT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRTsKKworCisvKio8IGluZGljYXRlcyB0aGF0IGJ1ZmZlcnMgcmVjZWl2ZWQgYnkgYW4gaW5wdXQgcG9ydCBvZiBhIHR1bm5lbCAKKyAgICAgbWF5IG5vdCBtb2RpZnkgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcnMgCisgICAgIEBpbmdyb3VwIHR1bgorICovCisjZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAorCisKKy8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKKyAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKKyAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCisgICAgQGluZ3JvdXAgdHVuCisgKi8gICAKK3R5cGVkZWYgc3RydWN0IE9NWF9UVU5ORUxTRVRVUFRZUEUKK3sKKyAgICBPTVhfVTMyIG5UdW5uZWxGbGFnczsgICAgICAgICAgICAgLyoqPCBiaXQgZmxhZ3MgZm9yIHR1bm5lbGluZyAqLworICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZVN1cHBsaWVyOyAvKio8IHN1cHBsaWVyIHByZWZlcmVuY2UgKi8KK30gT01YX1RVTk5FTFNFVFVQVFlQRTsgCisKKy8qIE9NWCBDb21wb25lbnQgaGVhZGVycyBpcyBpbmNsdWRlZCB0byBlbmFibGUgdGhlIGNvcmUgdG8gdXNlCisgICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4gIAorICAgRGV2ZWxvcGVycyBzaG91bGQgbm90IGFjY2VzcyBhbnkgc3RydWN0dXJlcyBvciBkYXRhIGZyb20gd2l0aGluCisgICB0aGUgY29tcG9uZW50IGhlYWRlciBkaXJlY3RseSAqLworLyogVE8gQkUgUkVNT1ZFRCAtICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+ICovCisKKy8qKiBHZXRDb21wb25lbnRWZXJzaW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wb25lbnQuICAKKyAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZQorICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYSBhIGNvcmUgbWFjcm8pLiAgVGhlCisgICAgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudE5hbWUKKyAgICAgICAgcG9pbnRlciB0byBhbiBlbXB0eSBzdHJpbmcgb2YgbGVuZ3RoIDEyOCBieXRlcy4gIFRoZSBjb21wb25lbnQgCisgICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUgCisgICAgICAgIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLiAgVGhlIG5hbWUgb2YgYSBjb21wb25lbnQgd2lsbCAKKyAgICAgICAgYmUgMTI3IGJ5dGVzIG9yIGxlc3MgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4gIAorICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5BQkMuQ2hhbm5lbE1peGVyXDAiLgorICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VmVyc2lvbgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAorICAgICAgICBpbi4gIFRoZSBjb21wb25lbnQgd2lsbCBmaWxsIGluIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIAorICAgICAgICBjb21wb25lbnQgdmVyc2lvbi4gIE5PVEU6IHRoZSBjb21wb25lbnQgdmVyc2lvbiBpcyBOT1QgdGhlIHNhbWUgCisgICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUgCisgICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBvZiB0aGUgY29tcG9uZW50IGFuZCAKKyAgICAgICAgaXRzIHZhbHVlIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBjb21wb25lbnQgdmVuZG9yLgorICAgIEBwYXJhbSBbb3V0XSBwU3BlY1ZlcnNpb24KKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKKyAgICAgICAgaW4uICBUaGUgU3BlY1ZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgCisgICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdC4gIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgb3IgCisgICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlIAorICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QgdGhlIDIuMCBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiAod2hpY2ggY3JlYXRlcyB0aGUgc3RydWN0dXJlIGlzIGJ1aWx0IGFnYWluc3QgdGhlIAorICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgorICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAorICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCisgICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAorICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKKyAgICAgICAgdGhlIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX0dldENvbXBvbmVudFZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29tcG9uZW50VmVyc2lvbiggIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgY2FsbCBpcyBhIG5vbi1ibG9ja2luZyBjYWxsLgorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHF1ZXVlIHRoZSBjb21tYW5kCisgICAgdG8gdGhlIGNvbXBvbmVudCB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuICBUaGUgY29tcG9uZW50IHRocmVhZCBzaGFsbCAKKyAgICBzZW5kIHRoZSBFdmVudEhhbmRsZXIoKSBjYWxsYmFjayBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgY29tbWFuZC4gCisgICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQorICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgdGhlIGNvbXBvbmVudCB3aWxsIHF1ZXVlIGEKKyAgICBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUgaWRlbmZpZWQgaW4gblBhcmFtLgorICAgIAorICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kRmx1c2giLCB0byBmbHVzaCBhIHBvcnQncyBidWZmZXIgcXVldWVzLAorICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWSAKKyAgICBCRUlORyBQUk9DRVNTRUQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGJ1ZmZlcnMgCisgICAgd2VyZSByZWNlaXZlZC4KKyAgICAKKyAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvciAKKyAgICAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgKGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZgorICAgIG5QYXJhbSkgd2lsbCBiZSBzdG9wcGVkIG9yIHJlc3RhcnRlZC4gCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIiBpcyB1c2VkIHRvIG1hcmsgYSBidWZmZXIsIHRoZQorICAgIHBDbWREYXRhIHdpbGwgcG9pbnQgdG8gYSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAorICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGV4YW1pbmUgdGhlIGJ1ZmZlciBjaGFpbiBmb3IgdGhlIG1hcmsuICBuUGFyYW0xCisgICAgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBwb3J0IG9uIHdoaWNoIHRoZSBidWZmZXIgbWFyayBpcyBhcHBsaWVkLgorCisgICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuIAorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCisgICAgQHBhcmFtIFtpbl0gQ21kCisgICAgICAgIENvbW1hbmQgZm9yIHRoZSBjb21wb25lbnQgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSBbaW5dIG5QYXJhbQorICAgICAgICBQYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAKKyAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgdmFsdWUgaXMgYSBtZW1iZXIgb2YgT01YX1NUQVRFVFlQRS4gIFdoZW4gQ21kIGhhcyAKKyAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKSAKKyAgICAgICAgdG8gZmx1c2guIC0xIGlzIHVzZWQgdG8gZmx1c2ggYWxsIHBvcnRzIGEgc2luZ2xlIHBvcnQgaW5kZXggd2lsbCAKKyAgICAgICAgb25seSBmbHVzaCB0aGF0IHBvcnQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIgorICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkgCisgICAgICAgIHRoZSB2YWx1ZSBvZiBuUGFyYW0uICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiCisgICAgICAgIHRoZSBjb21wb25lbnRzIHBvdCBpcyBnaXZlbiBieSB0aGUgdmFsdWUgb2YgblBhcmFtLgorICAgIEBwYXJhbSBbaW5dIHBDbWREYXRhCisgICAgICAgIFBhcmFtZXRlciBwb2ludGluZyB0byB0aGUgT01YX01BUktUWVBFIHN0cnVjdHVyZSB3aGVuIENtZCBoYXMgdGhlIHZhbHVlCisgICAgICAgICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiLiAgICAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9TZW5kQ29tbWFuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZW5kQ29tbWFuZCggICAgICAgICBcCisgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIAorICAgIHNldHRpbmdzIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2Fubm90IG9ubHkgYmUgaW52b2tlZCB3aGVuIAorICAgIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUludmFsaWQgc3RhdGUuICBUaGUgblBhcmFtSW5kZXgKKyAgICBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20KKyAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSAKKyAgICBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIAorICAgIGludm9raW5nIHRoaXMgbWFjcm8uICBXaGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQsIHRoZQorICAgIGNhbGxlciBzaGFsbCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBuUG9ydEluZGV4IHZhbHVlIGluZGljYXRpbmcgdGhlCisgICAgcG9ydCBvbiB3aGljaCB0aGUgcGFyYW1ldGVyIGFwcGxpZXMuIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgCisgICAgYW55IHNldHRpbmdzIGNoYW5nZWQsIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIAorICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgCisgICAgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuUGFyYW1JbmRleAorICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KKyAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQorICAgICAgICBQb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKKyAgICAgICAgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0UGFyYW1ldGVyKCAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgc2VuZCBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCisgICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKKyAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKKyAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCisgICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCisgICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAorICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKKyAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgorICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKKyAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKKyAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gbkluZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KKyAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgorICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfU2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0UGFyYW1ldGVyKCAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAorICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAorICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKKyAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKKyAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAorICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCisgICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKKyAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAorICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gbkluZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgorICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAorICAgICAgICBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorKi8gICAgICAgIAorI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29uZmlnKCAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCisgICAgc3RydWN0dXJlcyB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKKyAgICBlYWNoIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIAorICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgCisgICAgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSAKKyAgICBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyAKKyAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciAKKyAgICB0aGUgY2FsbCBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuQ29uZmlnSW5kZXgKKyAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGFib3ZlLgorICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKKyAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCisgICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9TZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRDb25maWcoICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUgCisgICAgYSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYW4gT01YIAorICAgIHN0cnVjdHVyZSBpbmRleC4gIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgdmVuZG9yIHRvIHN1cHBvcnQgCisgICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFIAorICAgIGVudW1lcmF0aW9uICh0aGlzIGlzIGRvbmUgdG8gc2F2ZSBzcGFjZSBpbiBzbWFsbCBjb21wb25lbnRzKS4gIFRoZSAKKyAgICBjb21wb25lbnQgc2hhbGwgc3VwcG9ydCBhbGwgdmVuZG9yIHN1cHBsaWVkIGV4dGVuc2lvbiBpbmRleGVzIG5vdCBmb3VuZAorICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBjUGFyYW1ldGVyTmFtZQorICAgICAgICBPTVhfU1RSSU5HIHRoYXQgc2hhbGwgYmUgbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nCisgICAgICAgIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGdldCAKKyAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgorICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCisgICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9HZXRFeHRlbnNpb25JbmRleCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldEV4dGVuc2lvbkluZGV4KCAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQgCisgICAgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgcGxhY2UgdGhlIHN0YXRlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uCisgICAgcG9pbnRlZCB0byBieSBwU3RhdGUuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcFN0YXRlCisgICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCisgICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0U3RhdGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRTdGF0ZSggICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX1VzZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQorICAgIGEgYnVmZmVyIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKSBhbHJlYWR5IGFsbG9jYXRlZCAKKyAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nIAorICAgIGNhbGwuCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAorICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9Vc2VCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUJ1ZmZlciggICAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBCdWZmZXIpCisKKworLyoqIFRoZSBPTVhfQWxsb2NhdGVCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZSAKKyAgICBhIG5ldyBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuICBUaGUgY29tcG9uZW50IHdpbGwgYWxsb2NhdGUgdGhlIAorICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAKKyAgICBoZWFkZXIuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAorICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKKyAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAorICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKKyAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCisgICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKKyAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAorICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KKyAgICBAcGFyYW0gW2luXSBuU2l6ZUJ5dGVzCisgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZS4gIFVzZWQgd2hlbiBiQWxsb2NhdGVOZXcgaXMgdHJ1ZS4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovICAgIAorI2RlZmluZSBPTVhfQWxsb2NhdGVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5BbGxvY2F0ZUJ1ZmZlciggICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0ZyZWVCdWZmZXIgbWFjcm8gd2lsbCByZWxlYXNlIGEgYnVmZmVyIGhlYWRlciBmcm9tIHRoZSBjb21wb25lbnQKKyAgICB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBPTVhfQWxsb2NhdGVCdWZmZXIgb3IgT01YX1VzZUJ1ZmZlci4gSWYgIAorICAgIHRoZSBjb21wb25lbnQgYWxsb2NhdGVkIHRoZSBidWZmZXIgKHNlZSB0aGUgT01YX1VzZUJ1ZmZlciBtYWNybykgdGhlbiAKKyAgICB0aGUgY29tcG9uZW50IHNoYWxsIGZyZWUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gVGhpcyBpcyBhIAorICAgIGJsb2NraW5nIGNhbGwuIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CisgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKKyAgICAgICAgYmUgdXNlZCB3aXRoLgorICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0ZyZWVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RnJlZUJ1ZmZlciggICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKKyAgICBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBFbXB0eUJ1ZmZlckRvbmUgY2FsbCBiYWNrLgorICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgorICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZW1wdHkgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCisgICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKKyAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0CisgICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisjZGVmaW5lIE9NWF9FbXB0eVRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkVtcHR5VGhpc0J1ZmZlciggICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKKyAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCisgICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCisgICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAorICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCisgICAgaXMgaW4gdGhlIE9NWF9FeGVjdXRpbmdTdGF0ZS4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQKKyAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0ZpbGxUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RmlsbFRoaXNCdWZmZXIoICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisKKy8qKiBUaGUgT01YX1VzZUVHTEltYWdlIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCisgICAgYSBFR0xJbWFnZSBwcm92aWRlZCBieSBFR0wgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAorICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gdXNlZAorICAgICAgICBmb3IgdGhpcyBidWZmZXIgaXMgTk9UIHZpc2libGUgdG8gdGhlIElMIENsaWVudC4KKyAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CisgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKKyAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4CisgICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgorICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCisgICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKKyAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCisgICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKKyAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQorICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKKyAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKKyAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX1VzZUVHTEltYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZWdsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlRUdMSW1hZ2UoICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZWdsSW1hZ2UpCisKKy8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKKyAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKKyAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKworICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfSW5pdCh2b2lkKTsKKworCisvKiogVGhlIE9NWF9EZWluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIAorICAgIHRoZSBsYXN0IGNhbGwgbWFkZSBpbnRvIE9NWC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcmUgZGV0ZXJtaW5lcyB0aGF0IAorICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuIAorICAgIHdpdGggYW4gZXJyb3IgcmF0aGVyIHRoYW4gdHJ5IHRvIHVubG9hZCB0aGUgY29tcG9uZW50cy4KKyAgICAgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCh2b2lkKTsKKworCisvKiogVGhlIE9NWF9Db21wb25lbnROYW1lRW51bSBtZXRob2Qgd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgdGhlIG5hbWVzIG9mCisgICAgcmVjb2duaXNlZCB2YWxpZCBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQKKyAgICBhcyBhIG1lYW5zIHRvIGRldGVjdCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBydW4tdGltZS4gVGhlcmUgaXMKKyAgICBubyBzdHJpY3Qgb3JkZXJpbmcgdG8gdGhlIGVudW1lcmF0aW9uIG9yZGVyIG9mIGNvbXBvbmVudCBuYW1lcywgYWx0aG91Z2gKKyAgICBlYWNoIG5hbWUgd2lsbCBvbmx5IGJlIGVudW1lcmF0ZWQgb25jZS4gIElmIHRoZSBPTVggY29yZSBzdXBwb3J0cyBydW4tdGltZQorICAgIGluc3RhbGxhdGlvbiBvZiBuZXcgY29tcG9uZW50cywgaXQgaXMgb25seSByZXF1cmllZCB0byBkZXRlY3QgbmV3bHkKKyAgICBpbnN0YWxsZWQgY29tcG9uZW50cyB3aGVuIHRoZSBmaXJzdCBjYWxsIHRvIGVudW1lcmF0ZSBjb21wb25lbnQgbmFtZXMKKyAgICBpcyBtYWRlIChpLmUuIHdoZW4gbkluZGV4IGlzIDB4MCkuCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbb3V0XSBjQ29tcG9uZW50TmFtZQorICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQorICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAorICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAorICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKKyAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgorICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCisgICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKKyAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKKyAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKKyAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgorICAgIEBwYXJhbSBbaW5dIG5JbmRleAorICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAorICAgICAgICBNdWx0aXBsZSBjYWxscyB0byBPTVhfQ29tcG9uZW50TmFtZUVudW0gd2l0aCBpbmNyZWFzaW5nIHZhbHVlcworICAgICAgICBvZiBuSW5kZXggd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgY29tcG9uZW50IG5hbWVzIGluIHRoZQorICAgICAgICBzeXN0ZW0gdW50aWwgT01YX0Vycm9yTm9Nb3JlIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlIG9mIG5JbmRleAorICAgICAgICBpcyAwIHRvIChOLTEpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW5zdGFsbGVkIGNvbXBvbmVudHMKKyAgICAgICAgaW4gdGhlIHN5c3RlbS4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZiAKKyAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIG1pbnVzIDEsIE9NWF9FcnJvck5vTW9yZSB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfQ29tcG9uZW50TmFtZUVudW0oCisgICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KTsKKworCisvKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQorICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQorICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW291dF0gcEhhbmRsZQorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9IQU5ETEVUWVBFIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgbWV0aG9kLgorICAgIEBwYXJhbSBbaW5dIGNDb21wb25lbnROYW1lCisgICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCisgICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCisgICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCisgICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCisgICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAorICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCisgICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKKyAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZAorICAgICAgICBkdXJpbmcgY2FsbGJhY2tzIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSB0aGUgc291cmNlCisgICAgICAgIG9mIHRoZSBjYWxsYmFjay4KKyAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCisgICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCisgICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKKyAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsQmFja3MpOworCisKKy8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUgCisgICAgbWV0aG9kLiAgSWYgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY29tcG9uZW50IHdpbGwKKyAgICBiZSB1bmxvYWRlZCBmcm9tIG1lbW9yeS4gIAorICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMgd2hlbiB0aGUgY29tcG9uZW50IGlzIAorICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCisKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRnJlZUhhbmRsZSgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisKKworLyoqIFRoZSBPTVhfU2V0dXBUdW5uZWwgbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIGNvbXBvbmVudHMKKyAgICB0byBzZXR1cCB0aGUgc3BlY2lmaWVkIHR1bm5lbCB0aGUgdHdvIGNvbXBvbmVudHMuICBOT1RFOiBUaGlzIGlzCisgICAgYW4gYWN0dWFsIG1ldGhvZCAobm90IGEgI2RlZmluZSBtYWNybykuICBUaGlzIG1ldGhvZCB3aWxsIG1ha2UgY2FsbHMgaW50bworICAgIHRoZSBjb21wb25lbnQgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB0dW5uZWwgCisgICAgY29ubmVjdGlvbi4gIAorCisgICAgVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIG9uIGJvdGggY29tcG9uZW50cyB3aWxsIGJlIGNhbGxlZC4gCisgICAgVGhpcyBtZXRob2Qgc2hhbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgCisgICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQorICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCisgICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKKworICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaE91dHB1dAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCisgICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKKyAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKKyAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAorICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhPdXRwdXQgYmUgdGhlIHNvdXJjZSBmb3IgdGhlIGRhdGEgd2hlbgorICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRPdXRwdXQgaXMgYW4gb3V0cHV0IHBvcnQpLiAgSWYgMHgwLCB0aGUgY29tcG9uZW50CisgICAgICAgIHNwZWNpZmllZCBpbiBoSW5wdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRJbnB1dAorICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KKyAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAorICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc291cmNlIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCisgICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4gCisgICAgQHBhcmFtIFtpbl0gaElucHV0CisgICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQorICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKKyAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQorICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCisgICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaElucHV0IGJlIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgd2hlbgorICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRJbnV0IGlzIGFuIGlucHV0IHBvcnQpLiAgIElmIDB4MCwgdGhlIGNvbXBvbmVudAorICAgICAgICBzcGVjaWZpZWQgaW4gaE91dHB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydFBPdXRwdXQKKyAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCisgICAgQHBhcmFtIFtpbl0gblBvcnRJbnB1dAorICAgICAgICBuUG9ydElucHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQorICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICAgIFdoZW4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQsIG9uZSBvciBib3RoIGNvbXBvbmVudHMgaXMgCisgICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KKyAgICAgICAgCisgICAgICAgIE9uIGZhaWx1cmUsIHRoZSBwb3J0cyBvZiBib3RoIGNvbXBvbmVudHMgYXJlIHNldHVwIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgorICAgIEBpbmdyb3VwIGNvcmUgdHVuCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX1NldHVwVHVubmVsKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaE91dHB1dCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCisgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOworICAgIAorLyoqIEBpbmdyb3VwIGNwICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgICBPTVhfR2V0Q29udGVudFBpcGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgc3pVUkkpOworCisvKiogVGhlIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgorICAgIHJvbGUgYW5kIChpZiB0aGUgY29tcE5hbWVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2UgY29tcG9uZW50cy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAorICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKKyAgICBjbGllbnQgc2hvdWxkOgorICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb21wb25lbnQgbmFtZXMKKyAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gcm9sZQorICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKKyAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCisgICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCisgICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAorIAorICAgICAgICBJZiBjb21wTmFtZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IGNvbXBvbmVudHMgc3VwcG9ydAorICAgICAgICB0aGUgZ2l2ZW4gcm9sZS4KKyAgICAgCisgICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAorICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIGNvbXBOYW1lcyBwYXJhbWV0ZXIuCisgICAgQHBhcmFtIFtpbm91dF0gY29tcE5hbWVzCisgICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIHdoaWNoIGFjY2VwdHMgCisgICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4gCisgICAgICAgIEVhY2ggbmFtZSBpcyBOVUxMIHRlcm1pbmF0ZWQuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlICggCisJT01YX0lOICAgICAgT01YX1NUUklORyByb2xlLAorICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Db21wcywKKyAgICBPTVhfSU5PVVQgICBPTVhfVTggICoqY29tcE5hbWVzKTsKKworLyoqIFRoZSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiByb2xlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuCisgICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKKyAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCisgICAgY2xpZW50IHNob3VsZDoKKyAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb2xlIG5hbWVzCisgICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisKKyAgICBAcGFyYW0gW2luXSBjb21wTmFtZQorICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcXVlcmllZCBhYm91dC4KKyAgICBAcGFyYW0gW2lub3V0XSBwTnVtUm9sZXMKKyAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCisgCisgICAgICAgIElmIHJvbGVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSByb2xlcyB0aGUgY29tcG9uZW50IHN1cHBvcnRzLgorICAgICAKKyAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCisgICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KKyAgICBAcGFyYW0gW291dF0gcm9sZXMKKyAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCisgICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCisgICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgKCAKKwlPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLCAKKyAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtUm9sZXMsCisgICAgT01YX09VVCAgICAgT01YX1U4ICoqcm9sZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThiZTdiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCkBAIC0wLDAgKzEsOTM3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIAorICogQGZpbGUgT01YX0lWQ29tbW9uLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgVmlkZW8gYW5kIEltYWdlIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KKyAqLworI2lmbmRlZiBPTVhfSVZDb21tb25faAorI2RlZmluZSBPTVhfSVZDb21tb25faAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSBoZWFkZXIKKyAqIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGhlYWRlcgorICogZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0NvcmUuaD4KKworLyoqIEBkZWZncm91cCBpdiBPcGVuTUFYIElMIEltYWdpbmcgYW5kIFZpZGVvIERvbWFpbgorICogQ29tbW9uIHN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgSW1hZ2luZyBhbmQgVmlkZW8gZG9tYWlucworICogQHsKKyAqLworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHBvc3NpYmxlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXRzLiAKKyAqCisgKiBFTlVNUzoKKyAqICBVbnVzZWQgICAgICAgICAgICAgICAgIDogUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BCisgKiAgTW9ub2Nocm9tZSAgICAgICAgICAgICA6IGJsYWNrIGFuZCB3aGl0ZQorICogIDhiaXRSR0IzMzIgICAgICAgICAgICAgOiBSZWQgNzo1LCBHcmVlbiA0OjIsIEJsdWUgMTowCisgKiAgMTJiaXRSR0I0NDQgICAgICAgICAgICA6IFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCisgKiAgMTZiaXRBUkdCNDQ0NCAgICAgICAgICA6IEFscGhhIDE1OjEyLCBSZWQgMTE6OCwgR3JlZW4gNzo0LCBCbHVlIDM6MAorICogIDE2Yml0QVJHQjE1NTUgICAgICAgICAgOiBBbHBoYSAxNSwgUmVkIDE0OjEwLCBHcmVlbiA5OjUsIEJsdWUgNDowCisgKiAgMTZiaXRSR0I1NjUgICAgICAgICAgICA6IFJlZCAxNToxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKKyAqICAxNmJpdEJHUjU2NSAgICAgICAgICAgIDogQmx1ZSAxNToxMSwgR3JlZW4gMTA6NSwgUmVkIDQ6MAorICogIDE4Yml0UkdCNjY2ICAgICAgICAgICAgOiBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCisgKiAgMThiaXRBUkdCMTY2NSAgICAgICAgICA6IEFscGhhIDE3LCBSZWQgMTY6MTEsIEdyZWVuIDEwOjUsIEJsdWUgNDowCisgKiAgMTliaXRBUkdCMTY2NiAgICAgICAgICA6IEFscGhhIDE4LCBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCisgKiAgMjRiaXRSR0I4ODggICAgICAgICAgICA6IFJlZCAyNDoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKKyAqICAyNGJpdEJHUjg4OCAgICAgICAgICAgIDogQmx1ZSAyNDoxNiwgR3JlZW4gMTU6OCwgUmVkIDc6MAorICogIDI0Yml0QVJHQjE4ODcgICAgICAgICAgOiBBbHBoYSAyMywgUmVkIDIyOjE1LCBHcmVlbiAxNDo3LCBCbHVlIDY6MAorICogIDI1Yml0QVJHQjE4ODggICAgICAgICAgOiBBbHBoYSAyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAorICogIDMyYml0QkdSQTg4ODggICAgICAgICAgOiBCbHVlIDMxOjI0LCBHcmVlbiAyMzoxNiwgUmVkIDE1OjgsIEFscGhhIDc6MAorICogIDMyYml0QVJHQjg4ODggICAgICAgICAgOiBBbHBoYSAzMToyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAorICogIFlVVjQxMVBsYW5hciAgICAgICAgICAgOiBVLFkgYXJlIHN1YnNhbXBsZWQgYnkgYSBmYWN0b3Igb2YgNCBob3Jpem9udGFsbHkKKyAqICBZVVY0MTFQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKKyAqICBZVVY0MjBQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgorICogIFlVVjQyMFBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcworICogIFlVVjQyMFNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCisgKiAgWVVWNDIyUGxhbmFyICAgICAgICAgICA6IFRocmVlIGFycmF5cyBZLFUsVi4KKyAqICBZVVY0MjJQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKKyAqICBZVVY0MjJTZW1pUGxhbmFyICAgICAgIDogVHdvIGFycmF5cywgb25lIGlzIGFsbCBZLCB0aGUgb3RoZXIgaXMgVSBhbmQgVgorICogIFlDYllDciAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgWVVZViAoaS5lLiBZQ2JZQ3IpCisgKiAgWUNyWUNiICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVllVIChpLmUuIFlDcllDYikKKyAqICBDYllDclkgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFVZVlkgKGkuZS4gQ2JZQ3JZKQorICogIENyWUNiWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVllVWSAoaS5lLiBDcllDYlkpCisgKiAgWVVWNDQ0SW50ZXJsZWF2ZWQgICAgICA6IEVhY2ggcGl4ZWwgY29udGFpbnMgZXF1YWwgcGFydHMgWVVWCisgKiAgUmF3QmF5ZXI4Yml0ICAgICAgICAgICA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKKyAqICBSYXdCYXllcjEwYml0ICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAorICogIFJhd0JheWVyOGJpdGNvbXByZXNzZWQgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0CisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09MT1JfRk9STUFUVFlQRSB7CisgICAgT01YX0NPTE9SX0Zvcm1hdFVudXNlZCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TW9ub2Nocm9tZSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjYsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QVJHQjE4ODcsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlDYllDciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WUNyWUNiLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRDYllDclksCisgICAgT01YX0NPTE9SX0Zvcm1hdENyWUNiWSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDIsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMNCwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEw4LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDE2LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDI0LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDMyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9DT0xPUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9DT0xPUl9GT1JNQVRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgdGhlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIFJHQiB0byBZVVYgb3IgdmljZSB2ZXJzYS4KKyAqIGlDb2xvck1hdHJpeCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZml4ZWQgcG9pbnQgdmFsdWVzIAorICogdXNlZCBpbiBjb252ZXJ0aW5nIGJldHdlZW4gZm9ybWF0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfUzMyIHhDb2xvck1hdHJpeFszXVszXTsgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KKyAgICBPTVhfUzMyIHhDb2xvck9mZnNldFs0XTsgICAgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KK31PTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIGRlZmluaW5nIHBlcmNlbnQgdG8gc2NhbGUgZWFjaCBmcmFtZSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZTogIAorICogVG8gbWFrZSB0aGUgd2lkdGggNTAlIGxhcmdlciwgdXNlIGZXaWR0aCA9IDEuNSBhbmQgdG8gbWFrZSB0aGUgd2lkdGgKKyAqIDEvMiB0aGUgb3JpZ2luYWwgc2l6ZSwgdXNlIGZXaWR0aCA9IDAuNQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCisgICAgT01YX1MzMiB4V2lkdGg7ICAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfUzMyIHhIZWlnaHQ7ICAgICAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLworfU9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGltYWdlIGZpbHRlciB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRUZJTFRFUlRZUEUgeworICAgIE9NWF9JbWFnZUZpbHRlck5vbmUsCisgICAgT01YX0ltYWdlRmlsdGVyTm9pc2UsCisgICAgT01YX0ltYWdlRmlsdGVyRW1ib3NzLAorICAgIE9NWF9JbWFnZUZpbHRlck5lZ2F0aXZlLAorICAgIE9NWF9JbWFnZUZpbHRlclNrZXRjaCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJPaWxQYWludCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJIYXRjaCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJHcGVuLAorICAgIE9NWF9JbWFnZUZpbHRlckFudGlhbGlhcywgCisgICAgT01YX0ltYWdlRmlsdGVyRGVSaW5nLCAgICAgICAKKyAgICBPTVhfSW1hZ2VGaWx0ZXJTb2xhcml6ZSwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0ltYWdlRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSW1hZ2VGaWx0ZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRUZJTFRFUlRZUEU7CisKKworLyoqIAorICogSW1hZ2UgZmlsdGVyIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgIAorICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBlSW1hZ2VGaWx0ZXIgOiBJbWFnZSBmaWx0ZXIgdHlwZSBlbnVtZXJhdGlvbiAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRUZJTFRFUlRZUEUgZUltYWdlRmlsdGVyOworfSBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRTsKKworCisvKiogCisgKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50IAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiQ29sb3JFbmhhbmNlbWVudCA6IEVuYWJsZS9kaXNhYmxlIGNvbG9yIGVuaGFuY2VtZW50CisgKiAgbkN1c3RvbWl6ZWRVICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgIFUgY29tcG9uZW50CisgKiAgbkN1c3RvbWl6ZWRWICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgIFYgY29tcG9uZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JFTkhBTkNFTUVOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkNvbG9yRW5oYW5jZW1lbnQ7CisgICAgT01YX1U4IG5DdXN0b21pemVkVTsKKyAgICBPTVhfVTggbkN1c3RvbWl6ZWRWOworfSBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBjb2xvciBrZXkgYW5kIGNvbG9yIGtleSBtYXNrIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuQVJHQkNvbG9yIDogMzJiaXQgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgQ29sb3IKKyAqICBuQVJHQk1hc2sgIDogMzJiaXQgTWFzayBmb3IgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgY2hhbm5lbHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUktFWVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5BUkdCQ29sb3I7CisgICAgT01YX1UzMiBuQVJHQk1hc2s7Cit9IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFOworCisKKy8qKiAKKyAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcgCisgKgorICogRU5VTVM6CisgKiAgTm9uZSAgICAgICAgICA6IE5vIGNvbG9yIGJsZW5kaW5nIHByZXNlbnQKKyAqICBBbHBoYUNvbnN0YW50IDogRnVuY3Rpb24gaXMgKGFscGhhX2NvbnN0YW50ICogc3JjKSArIAorICogICAgICAgICAgICAgICAgICAoMSAtIGFscGhhX2NvbnN0YW50KSAqIGRzdCkKKyAqICBBbHBoYVBlclBpeGVsIDogRnVuY3Rpb24gaXMgKGFscGhhICogc3JjKSArICgxIC0gYWxwaGEpICogZHN0KQorICogIEFsdGVybmF0ZSAgICAgOiBGdW5jdGlvbiBpcyBhbHRlcm5hdGluZyBwaXhlbHMgZnJvbSBzcmMgYW5kIGRzdAorICogIEFuZCAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjICYgZHN0KQorICogIE9yICAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjIHwgZHN0KQorICogIEludmVydCAgICAgICAgOiBGdW5jdGlvbiBpcyB+c3JjCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09MT1JCTEVORFRZUEUgeworICAgIE9NWF9Db2xvckJsZW5kTm9uZSwKKyAgICBPTVhfQ29sb3JCbGVuZEFscGhhQ29uc3RhbnQsCisgICAgT01YX0NvbG9yQmxlbmRBbHBoYVBlclBpeGVsLAorICAgIE9NWF9Db2xvckJsZW5kQWx0ZXJuYXRlLAorICAgIE9NWF9Db2xvckJsZW5kQW5kLAorICAgIE9NWF9Db2xvckJsZW5kT3IsCisgICAgT01YX0NvbG9yQmxlbmRJbnZlcnQsCisgICAgT01YX0NvbG9yQmxlbmRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0NvbG9yQmxlbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Db2xvckJsZW5kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQ09MT1JCTEVORFRZUEU7CisKKworLyoqIAorICogQ29sb3IgYmxlbmQgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAKKyAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAgICAgICAgICAgICAgIAorICogIG5SR0JBbHBoYUNvbnN0YW50IDogQ29uc3RhbnQgZ2xvYmFsIGFscGhhIHZhbHVlcyB3aGVuIGdsb2JhbCBhbHBoYSBpcyB1c2VkCisgKiAgZUNvbG9yQmxlbmQgICAgICAgOiBDb2xvciBibGVuZCB0eXBlIGVudW1lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUkdCQWxwaGFDb25zdGFudDsKKyAgICBPTVhfQ09MT1JCTEVORFRZUEUgIGVDb2xvckJsZW5kOworfSBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFOworCisKKy8qKiAKKyAqIEhvbGQgZnJhbWUgZGltZW5zaW9uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAKKyAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzICAgICAgICAgICAgICAgICAKKyAqICBuSGVpZ2h0ICAgIDogRnJhbWUgaGVpZ2h0IGluIHBpeGVscyAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0ZSQU1FU0laRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5XaWR0aDsKKyAgICBPTVhfVTMyIG5IZWlnaHQ7Cit9IE9NWF9GUkFNRVNJWkVUWVBFOworCisKKy8qKgorICogUm90YXRpb24gY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblJvdGF0aW9uICA6ICsvLSBpbnRlZ2VyIHJvdGF0aW9uIHZhbHVlICAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuUm90YXRpb247IAorfSBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRTsKKworCisvKiogCisgKiBQb3NzaWJsZSBtaXJyb3JpbmcgZGlyZWN0aW9ucyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZyAKKyAqCisgKiBFTlVNUzoKKyAqICBOb25lICAgICAgIDogTm8gbWlycm9yaW5nICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFZlcnRpY2FsICAgOiBWZXJ0aWNhbCBtaXJyb3JpbmcsIGZsaXAgb24gWCBheGlzICAgCisgKiAgSG9yaXpvbnRhbCA6IEhvcml6b250YWwgbWlycm9yaW5nLCBmbGlwIG9uIFkgYXhpcyAgCisgKiAgQm90aCAgICAgICA6IEJvdGggdmVydGljYWwgYW5kIGhvcml6b250YWwgbWlycm9yaW5nCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUlSUk9SVFlQRSB7CisgICAgT01YX01pcnJvck5vbmUgPSAwLAorICAgIE9NWF9NaXJyb3JWZXJ0aWNhbCwKKyAgICBPTVhfTWlycm9ySG9yaXpvbnRhbCwKKyAgICBPTVhfTWlycm9yQm90aCwgCisgICAgT01YX01pcnJvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWlycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWlycm9yTWF4ID0gMHg3RkZGRkZGRiAgIAorfSBPTVhfTUlSUk9SVFlQRTsKKworCisvKiogCisgKiBNaXJyb3JpbmcgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gIAorICogIGVNaXJyb3IgICAgOiBNaXJyb3IgdHlwZSBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUlSUk9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfTUlSUk9SVFlQRSAgZU1pcnJvcjsKK30gT01YX0NPTkZJR19NSVJST1JUWVBFOworCisKKy8qKiAKKyAqIFBvc2l0aW9uIGluZm9ybWF0aW9uIG9ubHkgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblggICAgICAgICA6IFggY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50ICAgICAgICAgICAgICAgICAgICAgCisgKiAgblkgICAgICAgICA6IFkgY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50IAorICovICAgICAgICAgICAgICAgICAgICAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QT0lOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5YOworICAgIE9NWF9TMzIgblk7Cit9IE9NWF9DT05GSUdfUE9JTlRUWVBFOworCisKKy8qKiAKKyAqIEZyYW1lIHNpemUgcGx1cyBwb3NpdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAKKyAqICBuTGVmdCAgICAgIDogWCBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICogIG5Ub3AgICAgICAgOiBZIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgKiAgbldpZHRoICAgICA6IFdpZHRoIG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBuSGVpZ2h0ICAgIDogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JFQ1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgCisgICAgT01YX1MzMiBuTGVmdDsgCisgICAgT01YX1MzMiBuVG9wOworICAgIE9NWF9VMzIgbldpZHRoOworICAgIE9NWF9VMzIgbkhlaWdodDsKK30gT01YX0NPTkZJR19SRUNUVFlQRTsKKworCisvKiogCisgKiBEZWJsb2NraW5nIHN0YXRlOyBpdCBpcyByZXF1aXJlZCB0byBiZSBzZXQgdXAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb2RlYyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgYkRlYmxvY2tpbmcgOiBFbmFibGUvZGlzYWJsZSBkZWJsb2NraW5nIG1vZGUgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJEZWJsb2NraW5nOworfSBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEU7CisKKworLyoqIAorICogU3RhYmlsaXphdGlvbiBzdGF0ZSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgIAorICogIGJTdGFiICAgICAgOiBFbmFibGUvZGlzYWJsZSBmcmFtZSBzdGFiaWxpemF0aW9uIHN0YXRlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJTdGFiOworfSBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEU7CisKKworLyoqIAorICogV2hpdGUgQmFsYW5jZSBjb250cm9sIHR5cGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgU3VuTGlnaHQgOiBSZWZlcmVuY2VkIGluIEpTUi0yMzQKKyAqICBGbGFzaCAgICA6IE9wdGltYWwgZm9yIGRldmljZSdzIGludGVncmF0ZWQgZmxhc2gKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9XSElURUJBTENPTlRST0xUWVBFIHsKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sT2ZmID0gMCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sQXV0bywKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU3VuTGlnaHQsCisgICAgT01YX1doaXRlQmFsQ29udHJvbENsb3VkeSwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU2hhZGUsCisgICAgT01YX1doaXRlQmFsQ29udHJvbFR1bmdzdGVuLAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbHVvcmVzY2VudCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSW5jYW5kZXNjZW50LAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbGFzaCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSG9yaXpvbiwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xNYXggPSAweDdGRkZGRkZGCit9IE9NWF9XSElURUJBTENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgIAorICogIGVXaGl0ZUJhbENvbnRyb2wgOiBXaGl0ZSBiYWxhbmNlIGVudW1lcmF0aW9uICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9XSElURUJBTENPTlRST0xUWVBFIGVXaGl0ZUJhbENvbnRyb2w7Cit9IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBFeHBvc3VyZSBjb250cm9sIHR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRSB7CisgICAgT01YX0V4cG9zdXJlQ29udHJvbE9mZiA9IDAsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbEF1dG8sCisgICAgT01YX0V4cG9zdXJlQ29udHJvbE5pZ2h0LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xCYWNrTGlnaHQsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNwb3RMaWdodCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU3BvcnRzLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTbm93LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xCZWFjaCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sTGFyZ2VBcGVydHVyZSwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU21hbGxBcHBlcnR1cmUsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRXhwb3N1cmVDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgCisgKiAgZUV4cG9zdXJlQ29udHJvbCA6IEV4cG9zdXJlIGNvbnRyb2wgZW51bWVyYXRpb24gICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgZUV4cG9zdXJlQ29udHJvbDsKK30gT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgc2Vuc29yIHN1cHBvcnRlZCBtb2RlLiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBuRnJhbWVSYXRlIDogU2luZ2xlIHNob3QgbW9kZSBpcyBpbmRpY2F0ZWQgYnkgYSAwICAgICAKKyAqICBiT25lU2hvdCAgIDogRW5hYmxlIGZvciBzaW5nbGUgc2hvdCwgZGlzYWJsZSBmb3Igc3RyZWFtaW5nCisgKiAgc0ZyYW1lU2l6ZSA6IEZyYW1lc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5GcmFtZVJhdGU7CisgICAgT01YX0JPT0wgYk9uZVNob3Q7CisgICAgT01YX0ZSQU1FU0laRVRZUEUgc0ZyYW1lU2l6ZTsKK30gT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgY29udHJhc3QgbGV2ZWwgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgICAgICAgICAgICAgCisgKiAgbkNvbnRyYXN0ICA6IFZhbHVlcyBhbGxvd2VkIGZvciBjb250cmFzdCAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyBjaGFuZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UUkFTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5Db250cmFzdDsKK30gT01YX0NPTkZJR19DT05UUkFTVFRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBicmlnaHRuZXNzIGxldmVsIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgIAorICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAorICogIG5CcmlnaHRuZXNzIDogMC0xMDAlICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkJyaWdodG5lc3M7Cit9IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBiYWNrbGlnaHQgbGV2ZWwgY29uZmlndXJhdGlvbiBmb3IgYSB2aWRlbyBzaW5rLCBlLmcuIExDRCBwYW5lbCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkJhY2tsaWdodCA6IFZhbHVlcyBhbGxvd2VkIGZvciBiYWNrbGlnaHQgMC0xMDAlCisgKiAgblRpbWVvdXQgICA6IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGJhY2tsaWdodCBhdXRvbWF0aWNhbGx5IHR1cm5zIAorICogICAgICAgICAgICAgICBvZmYuICBBIHZhbHVlIG9mIDB4MCBkaXNhYmxlcyBiYWNraWdodCB0aW1lb3V0IAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5CYWNrbGlnaHQ7CisgICAgT01YX1UzMiBuVGltZW91dDsKK30gT01YX0NPTkZJR19CQUNLTElHSFRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5HYW1tYSAgICAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgZ2FtbWEgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfR0FNTUFUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuR2FtbWE7Cit9IE9NWF9DT05GSUdfR0FNTUFUWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBmb3Igc2V0dGluZyBzYXR1cmF0aW9uIAorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuU2F0dXJhdGlvbiA6IFZhbHVlcyBhbGxvd2VkIGZvciBzYXR1cmF0aW9uIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIAorICogICAgICAgICAgICAgICAgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5TYXR1cmF0aW9uOworfSBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBmb3Igc2V0dGluZyBMaWdodG5lc3MgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gCisgKiAgICAgICAgICAgICAgIGNoYW5nZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5MaWdodG5lc3M7Cit9IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRTsKKworCisvKiogCisgKiBQbGFuZSBibGVuZCBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogSW5kZXggb2YgaW5wdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYW5lLgorICogIG5EZXB0aCAgICAgOiBEZXB0aCBvZiB0aGUgcGxhbmUgaW4gcmVsYXRpb24gdG8gdGhlIHNjcmVlbi4gSGlnaGVyIAorICogICAgICAgICAgICAgICBudW1iZXJlZCBkZXB0aHMgYXJlICJiZWhpbmQiIGxvd2VyIG51bWJlciBkZXB0aHMuICAKKyAqICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgZGVmYXVsdHMgdG8gdGhlIFBvcnQgSW5kZXggbnVtYmVyLgorICogIG5BbHBoYSAgICAgOiBUcmFuc3BhcmVuY3kgYmxlbmRpbmcgY29tcG9uZW50IGZvciB0aGUgZW50aXJlIHBsYW5lLiAgCisgKiAgICAgICAgICAgICAgIFNlZSBibGVuZGluZyBtb2RlcyBmb3IgbW9yZSBkZXRhaWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5EZXB0aDsKKyAgICBPTVhfVTMyIG5BbHBoYTsKK30gT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRTsKKworCisvKiogCisgKiBEZWZpbmUgaW50ZXJsYWNlIHR5cGUKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgCisgKiAgblZlcnNpb24gICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZSBjb250cm9sIHZhcmlhYmxlIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBiZWxvdykKKyAqICBuSW50ZXJsZWF2ZVBvcnRJbmRleCAgOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmxlYXZlZCBwbGFuZS4gCisgKiAgcFBsYW5hclBvcnRJbmRleGVzWzRdIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBsYW5hciBwb3J0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZTsKKyAgICBPTVhfVTMyIG5JbnRlcmxlYXZlUG9ydEluZGV4OworfSBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyB0aGUgcGljdHVyZSBlZmZlY3QgdXNlZCBmb3IgYW4gaW5wdXQgcGljdHVyZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSB7CisgICAgT01YX0VmZmVjdE5vbmUsCisgICAgT01YX0VmZmVjdEZhZGVGcm9tQmxhY2ssCisgICAgT01YX0VmZmVjdEZhZGVUb0JsYWNrLAorICAgIE9NWF9FZmZlY3RVbnNwZWNpZmllZFRocm91Z2hDb25zdGFudENvbG9yLAorICAgIE9NWF9FZmZlY3REaXNzb2x2ZSwKKyAgICBPTVhfRWZmZWN0V2lwZSwKKyAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRNaXhPZlR3b1NjZW5lcywKKyAgICBPTVhfRWZmZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9FZmZlY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9FZmZlY3RNYXggPSAweDdGRkZGRkZGCit9IE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgY3VycmVudCB0cmFuc2l0aW9uIGVmZmVjdCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiBlRWZmZWN0ICAgIDogRWZmZWN0IHRvIGVuYWJsZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFIGVFZmZlY3Q7Cit9IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBwb3NzaWJsZSBkYXRhIHVuaXQgdHlwZXMgZm9yIGVuY29kZWQgdmlkZW8gZGF0YS4gVGhlIGRhdGEgdW5pdCAKKyAqIHR5cGVzIGFyZSB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIHBsYXliYWNrIGFzIHdlbGwgYXMKKyAqIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVFRZUEUgeworICAgIE9NWF9EYXRhVW5pdENvZGVkUGljdHVyZSwKKyAgICBPTVhfRGF0YVVuaXRWaWRlb1NlZ21lbnQsCisgICAgT01YX0RhdGFVbml0U2V2ZXJhbFNlZ21lbnRzLAorICAgIE9NWF9EYXRhVW5pdEFyYml0cmFyeVN0cmVhbVNlY3Rpb24sCisgICAgT01YX0RhdGFVbml0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EYXRhVW5pdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0RhdGFVbml0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfREFUQVVOSVRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgcG9zc2libGUgZW5jYXBzdWxhdGlvbiB0eXBlcyBmb3IgY29kZWQgdmlkZW8gZGF0YSB1bml0LiBUaGUgCisgKiBlbmNhcHN1bGF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IgCisgKiBwbGF5YmFjayBhcyB3ZWxsIGFzIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIHsKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25FbGVtZW50YXJ5U3RyZWFtLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkdlbmVyaWNQYXlsb2FkLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblJ0cFBheWxvYWQsCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHR5cGUgb2YgYmVpbmcgZGVjb2RlZC9lbmNvZGVkIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREFUQVVOSVRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0RBVEFVTklUVFlQRSBlVW5pdFR5cGU7CisgICAgT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEUgZUVuY2Fwc3VsYXRpb25UeXBlOworfSBPTVhfUEFSQU1fREFUQVVOSVRUWVBFOworCisKKy8qKgorICogRGVmaW5lcyBkaXRoZXIgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRElUSEVSVFlQRSB7CisgICAgT01YX0RpdGhlck5vbmUsCisgICAgT01YX0RpdGhlck9yZGVyZWQsCisgICAgT01YX0RpdGhlckVycm9yRGlmZnVzaW9uLAorICAgIE9NWF9EaXRoZXJPdGhlciwKKyAgICBPTVhfRGl0aGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EaXRoZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EaXRoZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9ESVRIRVJUWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHR5cGUgb2YgZGl0aGVyaW5nIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0RJVEhFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElUSEVSVFlQRSBlRGl0aGVyOyAgIC8qKjwgVHlwZSBvZiBkaXRoZXJpbmcgdG8gdXNlICovCit9IE9NWF9DT05GSUdfRElUSEVSVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiQ29udGludW91czsgICAvKio8IElmIHRydWUgdGhlbiBpZ25vcmUgZnJhbWUgcmF0ZSBhbmQgZW1pdCBjYXB0dXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGF0YSBhcyBmYXN0IGFzIHBvc3NpYmxlIChvdGhlcndpc2Ugb2JleSBwb3J0J3MgZnJhbWUgcmF0ZSkuICovCisgICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMgKG90aGVyd2lzZSB0aGUgcG9ydCBkb2VzIG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSB1bnRpbCBpbnN0cnVjdGVkIHRvIGRvIHNvIGJ5IHRoZSBjbGllbnQpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0byByZWFjaGluZyB0aGUgbGltaXQuICovCisgICAgT01YX1UzMiBuRnJhbWVMaW1pdDsgICAgICAvKio8IExpbWl0IG9uIG51bWJlciBvZiBmcmFtZXMgZW1pdHRlZCBkdXJpbmcgYSBjYXB0dXJlIChvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbGlkIGlmIGJGcmFtZUxpbWl0ZWQgaXMgc2V0KS4gKi8KK30gT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEU7CisKK3R5cGVkZWYgZW51bSBPTVhfTUVURVJJTkdUWVBFIHsKKyAKKyAgICBPTVhfTWV0ZXJpbmdNb2RlQXZlcmFnZSwgICAgIC8qKjwgQ2VudGVyLXdlaWdodGVkIGF2ZXJhZ2UgbWV0ZXJpbmcuICovCisgICAgT01YX01ldGVyaW5nTW9kZVNwb3QsICAJICAgICAgLyoqPCBTcG90IChwYXJ0aWFsKSBtZXRlcmluZy4gKi8KKyAgICBPTVhfTWV0ZXJpbmdNb2RlTWF0cml4LCAgICAgIC8qKjwgTWF0cml4IG9yIGV2YWx1YXRpdmUgbWV0ZXJpbmcuICovCisgCisgICAgT01YX01ldGVyaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9NZXRlcmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0VWTW9kZU1heCA9IDB4N2ZmZmZmZmYKK30gT01YX01FVEVSSU5HVFlQRTsKKyAKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfTUVURVJJTkdUWVBFIGVNZXRlcmluZzsKKyAgICBPTVhfUzMyIHhFVkNvbXBlbnNhdGlvbjsgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfVTMyIG5BcGVydHVyZUZOdW1iZXI7ICAgICAvKio8IGUuZy4gbkFwZXJ0dXJlRk51bWJlciA9IDIgaW1wbGllcyAiZi8yIiAtIFExNiBmb3JtYXQgKi8KKyAgICBPTVhfQk9PTCBiQXV0b0FwZXJ0dXJlOwkJLyoqPCBXaGV0aGVyIGFwZXJ0dXJlIG51bWJlciBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBPTVhfVTMyIG5TaHV0dGVyU3BlZWRNc2VjOyAgICAvKio8IFNodXR0ZXJzcGVlZCBpbiBtaWxsaXNlY29uZHMgKi8gCisgICAgT01YX0JPT0wgYkF1dG9TaHV0dGVyU3BlZWQ7CS8qKjwgV2hldGhlciBzaHV0dGVyIHNwZWVkIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLyAKKyAgICBPTVhfVTMyIG5TZW5zaXRpdml0eTsgICAgICAgICAvKio8IGUuZy4gblNlbnNpdGl2aXR5ID0gMTAwIGltcGxpZXMgIklTTyAxMDAiICovCisgICAgT01YX0JPT0wgYkF1dG9TZW5zaXRpdml0eTsJLyoqPCBXaGV0aGVyIHNlbnNpdGl2aXR5IGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLworfSBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFOworCisvKiogCisgKiBGb2N1cyByZWdpb24gY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiQ2VudGVyICAgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiTGVmdCAgICAgICAgICAgOiBVc2UgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlJpZ2h0ICAgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wICAgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tICAgICAgICAgOiBVc2UgYm90dG9tIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wTGVmdCAgICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BSaWdodCAgICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21MZWZ0ICAgICA6IFVzZSBib3R0b20gbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkJvdHRvbVJpZ2h0ICAgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkNlbnRlcjsKKyAgICBPTVhfQk9PTCBiTGVmdDsKKyAgICBPTVhfQk9PTCBiUmlnaHQ7CisgICAgT01YX0JPT0wgYlRvcDsKKyAgICBPTVhfQk9PTCBiQm90dG9tOworICAgIE9NWF9CT09MIGJUb3BMZWZ0OworICAgIE9NWF9CT09MIGJUb3BSaWdodDsKKyAgICBPTVhfQk9PTCBiQm90dG9tTGVmdDsKKyAgICBPTVhfQk9PTCBiQm90dG9tUmlnaHQ7Cit9IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFOworCisvKiogCisgKiBGb2N1cyBTdGF0dXMgdHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9GT0NVU1NUQVRVU1RZUEUgeworICAgIE9NWF9Gb2N1c1N0YXR1c09mZiA9IDAsCisgICAgT01YX0ZvY3VzU3RhdHVzUmVxdWVzdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNSZWFjaGVkLAorICAgIE9NWF9Gb2N1c1N0YXR1c1VuYWJsZVRvUmVhY2gsCisgICAgT01YX0ZvY3VzU3RhdHVzTG9zdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0ZvY3VzU3RhdHVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRm9jdXNTdGF0dXNNYXggPSAweDdGRkZGRkZGCit9IE9NWF9GT0NVU1NUQVRVU1RZUEU7CisKKy8qKiAKKyAqIEZvY3VzIHN0YXR1cyBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb2N1c1N0YXR1cyAgICAgICAgOiBTcGVjaWZpZXMgdGhlIGZvY3VzIHN0YXR1cworICogIGJDZW50ZXJTdGF0dXMgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiTGVmdFN0YXR1cyAgICAgICAgIDogVXNlIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJSaWdodFN0YXR1cyAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BTdGF0dXMgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tU3RhdHVzICAgICAgIDogVXNlIGJvdHRvbSByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcExlZnRTdGF0dXMgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcFJpZ2h0U3RhdHVzICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21MZWZ0U3RhdHVzICAgOiBVc2UgYm90dG9tIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21SaWdodFN0YXR1cyAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9GT0NVU1NUQVRVU1RZUEUgZUZvY3VzU3RhdHVzOworICAgIE9NWF9CT09MIGJDZW50ZXJTdGF0dXM7CisgICAgT01YX0JPT0wgYkxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYlJpZ2h0U3RhdHVzOworICAgIE9NWF9CT09MIGJUb3BTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wTGVmdFN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wUmlnaHRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbUxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVJpZ2h0U3RhdHVzOworfSBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTM5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0ltYWdlLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICovCisKKy8qKiAKKyAqIEBmaWxlIE9NWF9JbWFnZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCAKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9JbWFnZV9oCisjZGVmaW5lIE9NWF9JbWFnZV9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioKKyAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUgCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgIAorICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgorCisvKiogQGRlZmdyb3VwIGltYWdpbmcgT3Blbk1BWCBJTCBJbWFnaW5nIERvbWFpbgorICogQGluZ3JvdXAgaXYKKyAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgSW1hZ2luZyBkb21haW4KKyAqIEB7CisgKi8KKworLyoqIAorICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGltYWdlIGNvbXByZXNzaW9uIGNvZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfQ09ESU5HVFlQRSB7CisgICAgT01YX0lNQUdFX0NvZGluZ1VudXNlZCwgICAgICAvKio8IFZhbHVlIHdoZW4gZm9ybWF0IGlzIE4vQSAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdBdXRvRGV0ZWN0LCAgLyoqPCBBdXRvIGRldGVjdGlvbiBvZiBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nSlBFRywgICAgICAgIC8qKjwgSlBFRy9KRklGIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHMkssICAgICAgLyoqPCBKUEVHIDIwMDAgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0VYSUYsICAgICAgICAvKio8IEVYSUYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ1RJRkYsICAgICAgICAvKio8IFRJRkYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0dJRiwgICAgICAgICAvKio8IEdyYXBoaWNzIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdQTkcsICAgICAgICAgLyoqPCBQTkcgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0xaVywgICAgICAgICAvKio8IExaVyBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nQk1QLCAgICAgICAgIC8qKjwgV2luZG93cyBCaXRtYXAgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfQ09ESU5HVFlQRTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGFuIGltYWdlIHBhdGguIFRoZSBudW1iZXIgb2YgaW1hZ2UgcGF0aHMgCisgKiBmb3IgaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgaW1hZ2UgY29tcG9uZW50LiAgCisgKiAKKyAqICBJbnB1dCAoYWthIFNvdXJjZSkgOiBaZXJvIElucHV0cywgb25lIE91dHB1dCwKKyAqICBTcGxpdHRlciAgICAgICAgICAgOiBPbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAorICogIFByb2Nlc3NpbmcgRWxlbWVudCA6IE9uZSBJbnB1dCwgb25lIG91dHB1dCwKKyAqICBNaXhlciAgICAgICAgICAgICAgOiAyIG9yIG1vcmUgaW5wdXRzLCBvbmUgb3V0cHV0LAorICogIE91dHB1dCAoYWthIFNpbmspICA6IE9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgorICogCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0ICAKKyAqIGltYWdlIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgIAorICogYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgQ3VzdG9tQ29tbWFuZCBmdW5jdGlvbi4gICAKKyAqIENvbXBsaWFudCBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsICAKKyAqIHZhbHVlcyBkdXJpbmcgdGhlIE9NWF9HZXRQYXJhbWV0ZXIoKSBjb21tYW5kLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIGNNSU1FVHlwZSAgICAgICAgICAgICA6IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydAorICogIHBOYXRpdmVSZW5kZXIgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSBkaXNwbGF5IGlmIGEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYywgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMAorICogIG5GcmFtZVdpZHRoICAgICAgICAgICA6IFdpZHRoIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuICBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIHBvcnQgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgaW1hZ2UgaXMgYm90dG9tIHVwCisgKiAgblNsaWNlSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IHVzZWQgd2hlbiBlbmNvZGluZyBpbiBzbGljZXMKKyAqICBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQgOiBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE9NWCBjb21wb25lbnQKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgICAgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICBwTmF0aXZlV2luZG93ICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOworICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7IAorICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OworICAgIE9NWF9TMzIgblN0cmlkZTsgICAgIAorICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKKyAgICBPTVhfSU1BR0VfQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OworfSBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFOworCisKKy8qKiAgCisgKiBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgdmFyaW91cyAKKyAqIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQKKyAqICBuSW5kZXggICAgICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gCisgKiAgICAgICAgICAgICAgICAgICAgICAgMHgwIHRvIE4tMQorICogIGVDb21wcmVzc2lvbkZvcm1hdCA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzIHNwZWNpZmllZCwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgZUNvbG9yRm9ybWF0IGlzIHZhbGlkCisgKiAgZUNvbG9yRm9ybWF0ICAgICAgIDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkluZGV4OworICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Cit9IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIHR5cGUgCisgKgorICogRU5VTVMKKyAqICBUb3JjaCA6IEZsYXNoIGZvcmNlZCBjb25zdGFudGx5IG9uCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbE9uID0gMCwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT2ZmLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xBdXRvLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xSZWRFeWVSZWR1Y3Rpb24sCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEZpbGxpbiwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVG9yY2gsCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUZsYXNoQ29udHJvbCA6IEZsYXNoIGNvbnRyb2wgdHlwZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIGVGbGFzaENvbnRyb2w7Cit9IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgdHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIHsKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sT24gPSAwLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPZmYsCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG8sCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG9Mb2NrLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEU7CisKKyAKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9jdXNDb250cm9sICAgOiBGb2N1cyBjb250cm9sCisgKiAgbkZvY3VzU3RlcHMgICAgIDogRm9jdXMgY2FuIHRha2Ugb24gdmFsdWVzIGZyb20gMCBtbSB0byBpbmZpbml0eS4gCisgKiAgICAgICAgICAgICAgICAgICAgSW50ZXJlc3QgaXMgb25seSBpbiBudW1iZXIgb2Ygc3RlcHMgb3ZlciB0aGlzIHJhbmdlLgorICogIG5Gb2N1c1N0ZXBJbmRleCA6IEN1cnJlbnQgZm9jdXMgc3RlcCBpbmRleAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRSBlRm9jdXNDb250cm9sOworICAgIE9NWF9VMzIgbkZvY3VzU3RlcHM7CisgICAgT01YX1UzMiBuRm9jdXNTdGVwSW5kZXg7Cit9IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBRIEZhY3RvciBmb3IgSlBFRyBjb21wcmVzc2lvbiwgd2hpY2ggY29udHJvbHMgdGhlIHRyYWRlb2ZmIGJldHdlZW4gaW1hZ2UKKyAqIHF1YWxpdHkgYW5kIHNpemUuICBRIEZhY3RvciBwcm92aWRlcyBhIG1vcmUgc2ltcGxlIG1lYW5zIG9mIGNvbnRyb2xsaW5nCisgKiBKUEVHIGNvbXByZXNzaW9uIHF1YWxpdHksIHdpdGhvdXQgZGlyZWN0bHkgcHJvZ3JhbW1pbmcgUXVhbnRpemF0aW9uCisgKiB0YWJsZXMgZm9yIGNocm9tYSBhbmQgbHVtYSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAorICogIG5RRmFjdG9yICAgOiBKUEVHIFEgZmFjdG9yIHZhbHVlIGluIHRoZSByYW5nZSBvZiAxLTEwMC4gQSBmYWN0b3Igb2YgMSAKKyAqICAgICAgICAgICAgICAgcHJvZHVjZXMgdGhlIHNtYWxsZXN0LCB3b3JzdCBxdWFsaXR5IGltYWdlcywgYW5kIGEgZmFjdG9yIAorICogICAgICAgICAgICAgICBvZiAxMDAgcHJvZHVjZXMgdGhlIGxhcmdlc3QsIGJlc3QgcXVhbGl0eSBpbWFnZXMuICBBIAorICogICAgICAgICAgICAgICB0eXBpY2FsIGRlZmF1bHQgaXMgNzUgZm9yIHNtYWxsIGdvb2QgcXVhbGl0eSBpbWFnZXMgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfVTMyIG5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFOworCisvKiogCisgKiBRdWFudGl6YXRpb24gdGFibGUgdHlwZSAKKyAqLworCit0eXBlZGVmIGVudW0gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7CisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTHVtYSA9IDAsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNiLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNyLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKKworLyoqIAorICogSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB1c2VkIHRvIGRldGVybWluZSBEQ1QgY29tcHJlc3Npb24gZm9yCisgKiBZVVYgZGF0YSwgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyBRIGZhY3RvciwgcHJvdmlkaW5nIGV4YWN0IAorICogY29udHJvbCBvZiBjb21wcmVzc2lvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZVF1YW50aXphdGlvblRhYmxlICAgICAgOiBRdWFudGl6YXRpb24gdGFibGUgdHlwZQorICogIG5RdWFudGl6YXRpb25NYXRyaXhbNjRdIDogSlBFRyBxdWFudGl6YXRpb24gdGFibGUgb2YgY29lZmZpY2llbnRzIHN0b3JlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluY3JlYXNpbmcgY29sdW1ucyB0aGVuIGJ5IHJvd3Mgb2YgZGF0YSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyAxLCAuLi4gcm93IDgpLiBRdWFudGl6YXRpb24gdmFsdWVzIGFyZSBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSAwLTI1NSBhbmQgc3RvcmVkIGluIGxpbmVhciBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIGNvbXBvbmVudCB3aWxsIHppZy16YWcgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHRhYmxlIGRhdGEgaWYgcmVxdWlyZWQgaW50ZXJuYWxseSkgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIGVRdWFudGl6YXRpb25UYWJsZTsKKyAgICBPTVhfVTggblF1YW50aXphdGlvbk1hdHJpeFs2NF07Cit9IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEU7CisKKworLyoqIAorICogSHVmZm1hbiB0YWJsZSB0eXBlLCB0aGUgc2FtZSBIdWZmbWFuIHRhYmxlIGlzIGFwcGxpZWQgZm9yIGNocm9tYSBhbmQgCisgKiBsdW1hIGNvbXBvbmVudCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIHsKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUMgPSAwLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQywKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUNMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlRENMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFOworCisvKiogCisgKiBKUEVHIEh1ZmZtYW4gdGFibGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUh1ZmZtYW5UYWJsZSAgICAgICAgICAgICAgICAgICAgOiBIdWZmbWFuIHRhYmxlIHR5cGUKKyAqICBuTnVtYmVyT2ZIdWZmbWFuQ29kZU9mTGVuZ3RoWzE2XSA6IDAtMTYsIG51bWJlciBvZiBIdWZmbWFuIGNvZGVzIG9mIGVhY2ggCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBsZW5ndGgKKyAqICBuSHVmZm1hblRhYmxlWzI1Nl0gICAgICAgICAgICAgICA6IDAtMjU1LCB0aGUgc2l6ZSB1c2VkIGZvciBBQyBhbmQgREMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGUgYXJlIDE2IGFuZCAxNjIgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIGVIdWZmbWFuVGFibGU7CisgICAgT01YX1U4IG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdOworICAgIE9NWF9VOCBuSHVmZm1hblRhYmxlWzI1Nl07Cit9T01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFOworCisvKiogQH0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW5kZXguaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogQGZpbGUgT01YX0luZGV4LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0luZGV4IGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgYm90aCBhcHBsaWNhdGlvbnMKKyAqICBhbmQgY29tcG9uZW50cyAuCisgKi8KKworCisjaWZuZGVmIE9NWF9JbmRleF9oCisjZGVmaW5lIE9NWF9JbmRleF9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKyNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KKworCisvKiogVGhlIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYSBzdHJ1Y3R1cmUgd2hlbiBlaXRoZXIKKyAqICBnZXR0aW5nIG9yIHNldHRpbmcgcGFyYW1ldGVycyBhbmQvb3IgY29uZmlndXJhdGlvbiBkYXRhLiAgRWFjaCBlbnRyeSBpbiAKKyAqICB0aGlzIGVudW1lcmF0aW9uIG1hcHMgdG8gYW4gT01YIHNwZWNpZmllZCBzdHJ1Y3R1cmUuICBXaGVuIHRoZSAKKyAqICBPTVhfR2V0UGFyYW1ldGVyLCBPTVhfU2V0UGFyYW1ldGVyLCBPTVhfR2V0Q29uZmlnIG9yIE9NWF9TZXRDb25maWcgbWV0aG9kcworICogIGFyZSB1c2VkLCB0aGUgc2Vjb25kIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBiZSBhbiBlbnRyeSBmcm9tIHRoaXMgZW51bWVyYXRpb24KKyAqICBhbmQgdGhlIHRoaXJkIGVudHJ5IHdpbGwgYmUgdGhlIHN0cnVjdHVyZSBzaG93biBpbiB0aGUgY29tbWVudHMgZm9yIHRoZSBlbnRyeS4KKyAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZyBhIGNyb3BwaW5nIGZ1bmN0aW9uLCB0aGUgCisgKiAgT01YX1NldENvbmZpZyBjb21tYW5kIHdvdWxkIGhhdmUgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIAorICogIGFuZCB3b3VsZCBzZW5kIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBPTVhfUkVDVFRZUEUgc3RydWN0dXJlIGFzIHRoZSAKKyAqICB0aGlyZCBwYXJhbWV0ZXIuCisgKiAgCisgKiAgVGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUgT01YX0NvbmZpZyBwcmVmaXggYXJlIHNlbnQgdXNpbmcKKyAqICB0aGUgT01YX1NldENvbmZpZyBjb21tYW5kIGFuZCB0aGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZQorICogIE9NWF9QQVJBTV8gcHJlZml4IGFyZSBzZW50IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU5ERVhUWVBFIHsKKworICAgIE9NWF9JbmRleENvbXBvbmVudFN0YXJ0VW51c2VkID0gMHgwMTAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1JbWFnZUluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1PdGhlckluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1OdW1BdmFpbGFibGVTdHJlYW1zLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQWN0aXZlU3RyZWFtLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVN1c3BlbnNpb25Qb2xpY3ksICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tcG9uZW50U3VzcGVuZGVkLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyaW5nLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAorICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmVNb2RlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgKi8gCisgICAgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAorICAgIE9NWF9JbmRleFBhcmFtQ29udGVudFVSSSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFICovIAorICAgIE9NWF9JbmRleFBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW1Db3VudCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29udGFpbmVyTm9kZUNvdW50LCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW0sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvdW50ZXJOb2RlSUQsICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUZpbHRlclR5cGUsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUtleUZpbHRlciwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnUHJpb3JpdHlNZ210LCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUFJJT1JJVFlNR01UVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICovCisKKyAgICBPTVhfSW5kZXhQb3J0U3RhcnRVbnVzZWQgPSAweDAyMDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhSZXNlcnZlZFN0YXJ0VW51c2VkID0gMHgwMzAwMDAwMCwKKworICAgIC8qIEF1ZGlvIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4QXVkaW9TdGFydFVudXNlZCA9IDB4MDQwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1JhLCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUkFUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb01wMywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BZHBjbSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzIzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjksICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1dtYSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TYmMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTWlkaSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpTG9hZFVzZXJTb3VuZCwgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI2LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRUZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0hSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9GUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRUZSLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHA4LCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwMTMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRXZyYywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICovCisKKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlJbW1lZGlhdGVFdmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUNvbnRyb2wsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtLCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTdGF0dXMsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnREYXRhLCAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0JhbGFuY2UsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxNdXRlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NdXRlLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Mb3VkbmVzcywgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvRWNob0NhbmNlbGF0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Ob2lzZVJlZHVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFzcywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvVHJlYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9TdGVyZW9XaWRlbmluZywgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hvcnVzLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9FcXVhbGl6ZXIsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb1JldmVyYmVyYXRpb24sICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxWb2x1bWUsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgKi8KKworICAgIC8qIEltYWdlIHNwZWNpZmljIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4SW1hZ2VTdGFydFVudXNlZCA9IDB4MDUwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1JbWFnZVBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUZsYXNoQ29udHJvbCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnRm9jdXNDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVFGYWN0b3IsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtUXVhbnRpemF0aW9uVGFibGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtSHVmZm1hblRhYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnRmxhc2hDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSAqLworCisgICAgLyogVmlkZW8gc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBPTVhfSW5kZXhWaWRlb1N0YXJ0VW51c2VkID0gMHgwNjAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvRmFzdFVwZGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTW90aW9uVmVjdG9yLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvVkJTTUMsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzIsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvV212LCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1J2LCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUlZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFNQlJlZnJlc2gsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9NQkVycm9yUmVwb3J0aW5nLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb01hY3JvYmxvY2tzUGVyRnJhbWUsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9NYWNyb0Jsb2NrRXJyb3JNYXAsIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvU2xpY2VGTU8sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFICovCisKKyAgICAvKiBJbWFnZSAmIFZpZGVvIGNvbW1vbiBDb25maWd1cmF0aW9ucyAqLworICAgIE9NWF9JbmRleENvbW1vblN0YXJ0VW51c2VkID0gMHgwNzAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkRlYmxvY2tpbmcsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uU2Vuc29yTW9kZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21tb25JbnRlcmxlYXZlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckZvcm1hdENvbnZlcnNpb24sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW1hZ2VGaWx0ZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRW5oYW5jZW1lbnQsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yS2V5LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUktFWVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25GcmFtZVN0YWJpbGlzYXRpb24sLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ST1RBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25NaXJyb3IsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUlSUk9SVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dFBvc2l0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19QT0lOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25EaWdpdGFsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3B0aWNhbFpvb20sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uV2hpdGVCYWxhbmNlLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbnRyYXN0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UUkFTVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25CcmlnaHRuZXNzLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25CYWNrbGlnaHQsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkdhbW1hLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19HQU1NQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25TYXR1cmF0aW9uLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25MaWdodG5lc3MsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4Y2x1c2lvblJlY3QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpdGhlcmluZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ESVRIRVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUGxhbmVCbGVuZCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhwb3N1cmVWYWx1ZSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0U2l6ZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfRlJBTUVTSVpFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRXh0cmFRdWFudERhdGEsICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0VYVFJBREFUQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1JlZ2lvbiwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRm9jdXNTdGF0dXMsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uVHJhbnNpdGlvbkVmZmVjdCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFICovCisKKyAgICAvKiBSZXNlcnZlZCBDb25maWd1cmF0aW9uIHJhbmdlICovCisgICAgT01YX0luZGV4T3RoZXJTdGFydFVudXNlZCA9IDB4MDgwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1PdGhlclBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdPdGhlclBvd2VyLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnT3RoZXJTdGF0cywgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRSAqLworCisKKyAgICAvKiBSZXNlcnZlZCBUaW1lIHJhbmdlICovCisgICAgT01YX0luZGV4VGltZVN0YXJ0VW51c2VkID0gMHgwOTAwMDAwMCwKKyAgICBPTVhfSW5kZXhDb25maWdUaW1lU2NhbGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xvY2tTdGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVBY3RpdmVSZWZDbG9jaywgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIChyZWFkIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lTWVkaWFUaW1lUmVxdWVzdCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lLCAgICAgLyoqPHJlZmVyZW5jZTogIE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVQb3NpdGlvbiwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lU2Vla01vZGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgKi8KKworCisgICAgT01YX0luZGV4S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIC8qIFZlbmRvciBzcGVjaWZpYyBhcmVhICovCisgICAgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAorICAgIC8qIFZlbmRvciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg3RjAwMDAwMCAKKyAgICAgICB0byAweDdGRkZGRkZFLiAgVGhpcyByYW5nZSBpcyBub3QgYnJva2VuIG91dCBieSB2ZW5kb3IsIHNvCisgICAgICAgcHJpdmF0ZSBpbmRleGVzIGFyZSBub3QgZ3VhcmFudGVlZCB1bmlxdWUgYW5kIHRoZXJlZm9yZSBzaG91bGQKKyAgICAgICBvbmx5IGJlIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4gKi8KKworICAgIE9NWF9JbmRleE1heCA9IDB4N0ZGRkZGRkYKKworfSBPTVhfSU5ERVhUWVBFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiY2U4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfT3RoZXIuaApAQCAtMCwwICsxLDM1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIEBmaWxlIE9NWF9PdGhlci5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IE90aGVyIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KKyAqLworCisjaWZuZGVmIE9NWF9PdGhlcl9oCisjZGVmaW5lIE9NWF9PdGhlcl9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKworLyoqIAorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGF0YSB0eXBlcyB3aGljaCBtYXRjaCB0byBtdWx0aXBsZSBkb21haW5zIG9yIG5vCisgKiBkb21haW4gYXQgYWxsLiAgRm9yIHR5cGVzIHdoaWNoIGFyZSB2ZW5kb3Igc3BlY2lmaWMsIGEgdmFsdWUgYWJvdmUKKyAqIE9NWF9PVEhFUl9WRU5ET1JUU1RBUlQgc2hvdWxkIGJlIHVzZWQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfT1RIRVJfRk9STUFUVFlQRSB7CisgICAgT01YX09USEVSX0Zvcm1hdFRpbWUgPSAwLCAvKio8IFRyYW5zbWlzc2lvbiBvZiB2YXJpb3VzIHRpbWVzdGFtcHMsIGVsYXBzZWQgdGltZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsIGV0YyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRCaW5hcnksICAgLyoqPCBBcmJpdHJhcnkgYmluYXJ5IGRhdGEgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yUmVzZXJ2ZWQgPSAxMDAwLCAvKio8IFN0YXJ0aW5nIHZhbHVlIGZvciB2ZW5kb3Igc3BlY2lmaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzICovCisKKyAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9PVEhFUl9GT1JNQVRUWVBFOworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBzZWVrIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfU0VFS01PREVUWVBFIHsKKyAgICBPTVhfVElNRV9TZWVrTW9kZUZhc3QgPSAwLCAvKio8IFByZWZlciBzZWVraW5nIHRvIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlciAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NpdGlvbiBvdmVyIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gZXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGl0IHJlc3VsdHMgaW4gYSBzbG93ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVElNRV9TZWVrTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1RJTUVfU2Vla01vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1NFRUtNT0RFVFlQRTsKKworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc2Vla21vZGUgb2YgdGhlIGNvbXBvbmVudCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfU0VFS01PREVUWVBFIGVUeXBlOyAgICAvKio8IFRoZSBzZWVrIG1vZGUgKi8KK30gT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRTsKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MgCisgKiBvbiB0aGUgQ2xvY2sgQ29tcG9uZW50IChDQyk6CisgKiAKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgd2FsbCAgCisgKiAgICAgdGltZQorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgbWVkaWEKKyAqICAgICB0aW1lCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCisgKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKKyAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCisgKiAgICAgY2xpZW50IHBvcnQgd2hlbiBpdCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoCisgKiAgICAgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIHNldC4gSXQgbXVzdCB1c2UgdGhlIHRpbWVzdGFtcAorICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLiAKKyAqCisgKiBJdJJzIGFsc28gdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9uIGNvbXBvbmVudHMgaW4gZ2VuZXJhbDoKKyAqCisgKiBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb246IElMIGNsaWVudCBxdWVyeWluZyBjb21wb25lbnQgcG9zaXRpb24gCisgKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCisgKiAoU2V0Q29uZmlnKQorICovCQordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVElDS1MgblRpbWVzdGFtcDsgIAkgICAgIC8qKjwgdGltZXN0YW1wIC4qLyAKK30gT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEU7ICAKKworLyoqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJlZmVyZW5jZSBjbG9ja3MgdG8gdGhlIG1lZGlhIHRpbWUuICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfVVBEQVRFVFlQRSB7CisgICAgICBPTVhfVElNRV9VcGRhdGVSZXF1ZXN0RnVsZmlsbG1lbnQsICAgIC8qKjwgVXBkYXRlIGlzIHRoZSBmdWxmaWxsbWVudCBvZiBhIG1lZGlhIHRpbWUgcmVxdWVzdC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwJICAgICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIHNjYWxlIGNoYWduZWQuICovCisgICAgICBPTVhfVElNRV9VcGRhdGVDbG9ja1N0YXRlQ2hhbmdlZCwgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgY2xvY2sgc3RhdGUgY2hhbmdlZC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1VQREFURVRZUEU7CisKKy8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwordHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7CisgICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja1ZpZGVvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UgKi8KKyAgICAgIE9NWF9USU1FX1JlZkNsb2NrS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKKworLyoqIEVudW1lcmF0aW9uIG9mIGNsb2NrIHN0YXRlcy4gKi8KK3R5cGVkZWYgZW51bSBPTVhfVElNRV9DTE9DS1NUQVRFIHsKKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVSdW5uaW5nLCAgICAgICAgICAgICAvKio8IENsb2NrIHJ1bm5pbmcuICovCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlV2FpdGluZ0ZvclN0YXJ0VGltZSwgLyoqPCBDbG9jayB3YWl0aW5nIHVudGlsIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLworICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX0NMT0NLU1RBVEU7CisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgbWVkaWEgdGltZSByZXF1ZXN0IHRvIHRoZSBjbG9jayBjb21wb25lbnQuCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZworICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKKyAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCisgKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCisgKiAgdGltZXN0YW1wLgorICoKKyAqICBUaGUgY2xpZW50IG1heSByZXF1aXJlIGEgbWVkaWEgdGltZSByZXF1ZXN0IGJlIGZ1bGZpbGxlZCBzbGlnaHRseQorICogIGVhcmxpZXIgdGhhbiB0aGUgbWVkaWEgdGltZSBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xpZW50IHNwZWNpZmllcyAKKyAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZyAKKyAqICB0byB0aGUgcmVxdWVzdGVkIG1lZGlhIHRpbWUgYW5kIHRoZSB3YWxsIHRpbWUgd2hlbiBpdCB3aWxsIGJlIAorICogIGZ1bGZpbGxlZC4gCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KKyAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0CisgKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCisgKiAgbWVkaWEgdGltZSByZXF1ZXN0IGF0IFQgKHBlcmhhcHMgc3BlY2lmeWluZyBhbiBvZmZzZXQgdG8gZW5zdXJlIHRoZSByZXF1ZXN0IGZ1bGZpbGxtZW50CisgKiAgaXMgYSBsaXR0bGUgZWFybHkpLiBXaGVuIHRoZSBjbG9jayBjb21wb25lbnQgcGFzc2VzIHRoZSByZXN1bHRpbmcgT01YX1RJTUVfTUVESUFUSU1FVFlQRQorICogIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjbGllbnQgY29tcG9uZW50LCB0aGUgY2xpZW50IG1heSBwZXJmb3JtIG9wZXJhdGlvbiBPIChwZXJoYXBzIGhhdmluZworICogIHRvIHdhaXQgYSBzbGlnaHQgYW1vdW50IG1vcmUgdGltZSBpdHNlbGYgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWVzKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHVwZGF0ZXMuICovCisgICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgIC8qKjwgTWVkaWEgdGltZXN0YW1wIHJlcXVlc3RlZC4qLyAKKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KK30gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOworCisvKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKKyAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCisgKgorICogICBJbiB0aGUgZm9ybWVyIGNhc2UgdGhlIENsb2NrIENvbXBvbmVudCBmaWxscyB0aGlzIHN0cnVjdHVyZSBhbmQgdGltZXMgaXRzIGVtaXNzaW9uIAorICogICB0byBhIGNsaWVudCBjb21wb25lbnQgKHZpYSB0aGUgY2xpZW50IHBvcnQpIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtZWRpYSAKKyAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKKyAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKKyAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAorICoKKyAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAorICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAorICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKKyAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKKyAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKKyAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKKyAqCisgKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgc29tZSBjbG9jayBjb21wb25lbnRzIG1heSBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3RzCisgKiAgIGF0IGV4YWN0bHkgdGhlIHByZXNjcmliZWQgdGltZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNvIGxvbmcgYXMgdGhlIHJlcXVlc3QgaXMgCisgKiAgIGZ1bGZpbGxlZCBhdCBsZWFzdCBhcyBlYXJseSBhcyBkZXNjcmliZWQgYW5kIG5vdCBsYXRlci4gVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgCisgKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgorICoKKyAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAorICogICB3YWxsIHRpbWUgdW50aWwgdGhlIG5NZWRpYVRpbWVzdGFtcCBhY3R1YWxseSBvY2N1cnMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKKyAqICAgY2xpZW50IGNhbiBnZXQgYSBtb3JlIGFjY3VyYXRlIHZhbHVlIGZvciBvZmZzZXQgYnkgZ2V0dGluZyB0aGUgY3VycmVudCB3YWxsCisgKiAgIGZyb20gdGhlIGNsb2MgY29tcG9uZW50IGFuZCBzdWJ0cmFjdGluZyBpdCBmcm9tIG5XYWxsVGltZUF0TWVkaWEuIAorICovCisKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX01FRElBVElNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgbkNsaWVudFByaXZhdGU7ICAgICAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIHZhbHVlIG9mIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIHRpbWUgc2NhbGUgdXBkYXRlcy4gKi8KKyAgICBPTVhfVElNRV9VUERBVEVUWVBFIGVVcGRhdGVUeXBlOyAvKio8IFJlYXNvbiBmb3IgdGhlIHVwZGF0ZSAqLworICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAgICAgLyoqPCBNZWRpYSB0aW1lIHJlcXVlc3RlZC4gSWYgbm8gbWVkaWEgdGltZSB3YXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8gCisgICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgYnkgd2hpY2ggdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHdhcyBhY3R1YWxseSBmdWxmaWxsZWQgZWFybHkgKi8KKworICAgIE9NWF9USUNLUyBuV2FsbFRpbWVBdE1lZGlhVGltZTsgLyoqPCBXYWxsIHRpbWUgY29ycmVzcG9uZGluZyB0byBuTWVkaWFUaW1lU3RhbXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgY2xpZW50IG1heSBjb21wYXJlIHRoaXMgdmFsdWUgdG8gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBtZWRpYSB0aW1lIG9idGFpbmVkIGZyb20gdGhlIENsb2NrIENvbXBvbmVudCB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIHdhbGwgdGltZSB1bnRpbCB0aGUgbWVkaWEgdGltZXN0YW1wIGlzIHJlYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50LiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KKyAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLworfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCisgKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKKyAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAorICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLworfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOworIAorLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQwIDB4MDAwMDAwMDEKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDEgMHgwMDAwMDAwMgorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMiAweDAwMDAwMDA0CisjZGVmaW5lIE9NWF9DTE9DS1BPUlQzIDB4MDAwMDAwMDgKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDQgMHgwMDAwMDAxMAorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNSAweDAwMDAwMDIwCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQ2IDB4MDAwMDAwNDAKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDcgMHgwMDAwMDA4MAorCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBtZWRpYSBjbG9jay4gCisgKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZSAKKyAqICBtZWRpYSBjbG9jayBvZiB0aGUgY2xvY2sgY29tcG9uZW50LiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sKKyAqICBjb21wb25lbnQuIAorICogIAorICogIE9uIGEgU2V0Q29uZmlnIGlmIGVTdGF0ZSBpcyBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZyBtZWRpYSB0aW1lCisgKiAgc3RhcnRzIGltbWVkaWF0ZWx5IGF0IHRoZSBwcmVzY3JpYmVkIHN0YXJ0IHRpbWUuIElmCisgKiAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUgdGhlIENsb2NrIENvbXBvbmVudCBpZ25vcmVzCisgKiAgdGhlIGdpdmVuIG5TdGFydFRpbWUgYW5kIHdhaXRzIGZvciBhbGwgY2xpZW50cyBzcGVjaWZpZWQgaW4gdGhlIAorICogIG5XYWl0TWFzayB0byBzZW5kIHN0YXJ0dGltZXMgKHZpYSAKKyAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cyAKKyAqICB0aGUgbWVkaWEgY2xvY2sgdXNpbmcgdGhlIGVhcmxpZXN0IHN0YXJ0IHRpbWUgc3VwcGxpZWQuICovICAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIG1lZGlhIHRpbWUuICovCisgICAgT01YX1RJQ0tTIG5TdGFydFRpbWU7ICAgICAgIC8qKjwgU3RhcnQgdGltZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBUaW1lIHRvIG9mZnNldCB0aGUgbWVkaWEgdGltZSBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGUuZy4gcHJlcm9sbCkuIE1lZGlhIHRpbWUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXBvcnRlZCB0byBiZSBuT2Zmc2V0IHRpY2tzIGVhcmxpZXIuICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KK30gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOworCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCisgKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAorICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRTsKKworLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHBvd2VyIHR5cGUuCisgKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlUE07ICAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgUG93ZXIgTWFuYWdlbWVudCAqLworfSBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRTsKKworCisvKiogRGVzY3JpcHRvciBmb3Igc2V0dGluZyBzcGVjaWZpY3Mgb2Ygc3RhdHMgdHlwZS4KKyAqICBOb3RlOiB0aGlzIHN0cnVjdHVyZSBpcyBsaXN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIC8qIHdoYXQgZ29lcyBoZXJlICovCit9IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFOworCisKKy8qKgorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBvdGhlciAKKyAqIHBhdGguCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCit9IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEU7CisKKy8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKKyAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KKyAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KK30gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9UeXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZmQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1R5cGVzLmgKQEAgLTAsMCArMSwzNjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfVHlwZXMuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfVHlwZXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIHByaW1pdGl2ZSB0eXBlIGRlZmluaXRpb25zIHVzZWQgYnkgCisgKiAgdGhlIGNvcmUsIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4gIFRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZQorICogIG1vZGlmaWVkIHRvIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlICJjaGFyIiBzZXQgdG8gOCBiaXRzLCAKKyAqICAic2hvcnQiIHNldCB0byAxNiBiaXRzIGFuZCAibG9uZyIgc2V0IHRvIDMyIGJpdHMuCisgKi8KKworI2lmbmRlZiBPTVhfVHlwZXNfaAorI2RlZmluZSBPTVhfVHlwZXNfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBUaGUgT01YX0FQSSBhbmQgT01YX0FQSUVOVFJZIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucyB1c2VkCisgKiAgdG8gZGVjbGFyZSBPTVggZnVuY3Rpb24gcHJvdG90eXBlcy4gIFRoZXkgYXJlIG1vZGlmaWVkIHRvIG1lZXQgdGhlCisgKiAgcmVxdWlyZW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gKi8KKyNpZmRlZiBfX1NZTUJJQU4zMl9fICAgCisjICAgaWZkZWYgX19PTVhfRVhQT1JUUworIyAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbHNlCisjICAgICAgIGlmZGVmIF9XSU4zMgorIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpIAorIyAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2Vsc2UKKyMgICBpZmRlZiBfV0lOMzIKKyMgICAgICBpZmRlZiBfX09NWF9FWFBPUlRTCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKy8vIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNkZWZpbmUgT01YX0FQSQorIyAgICAgIGVuZGlmCisjICAgZWxzZQorIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKKyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkKKyMgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJIGV4dGVybgorIyAgICAgIGVuZGlmCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9NWF9BUElFTlRSWQorI2RlZmluZSBPTVhfQVBJRU5UUlkgCisjZW5kaWYgCisKKy8qKiBPTVhfSU4gaXMgdXNlZCB0byBpZGVudGlmeSBpbnB1dHMgdG8gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyBkZXNpZ25hdGlvbiAKKyAgICB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgCisgICAgdGhhdCBpcyB1c2VkIGFzIGFuIG91dHB1dC4gKi8KKyNpZm5kZWYgT01YX0lOCisjZGVmaW5lIE9NWF9JTgorI2VuZGlmCisKKy8qKiBPTVhfT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgb3V0cHV0cyBmcm9tIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgCisgICAgZGVzaWduYXRpb24gd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzIAorICAgIHRvIGEgcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dC4gKi8KKyNpZm5kZWYgT01YX09VVAorI2RlZmluZSBPTVhfT1VUCisjZW5kaWYKKworCisvKiogT01YX0lOT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgcGFyYW1ldGVycyB0aGF0IG1heSBiZSBlaXRoZXIgaW5wdXRzIG9yCisgICAgb3V0cHV0cyBmcm9tIGFuIE9NWCBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lLiAgVGhpcyBkZXNpZ25hdGlvbiB3aWxsIAorICAgIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCAgcG9pbnRzIHRvIGEgcGFyYW1ldGVyIHRoYXQgCisgICAgaXMgdXNlZCBib3RoIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQuICovCisjaWZuZGVmIE9NWF9JTk9VVAorI2RlZmluZSBPTVhfSU5PVVQKKyNlbmRpZgorCisvKiogT01YX0FMTCBpcyB1c2VkIHRvIGFzIGEgd2lsZGNhcmQgdG8gc2VsZWN0IGFsbCBlbnRpdGllcyBvZiB0aGUgc2FtZSB0eXBlCisgKiAgd2hlbiBzcGVjaWZ5aW5nIHRoZSBpbmRleCwgb3IgcmVmZXJyaW5nIHRvIGEgb2JqZWN0IGJ5IGFuIGluZGV4LiAgKGkuZS4KKyAqICB1c2UgT01YX0FMTCB0byBpbmRpY2F0ZSBhbGwgTiBjaGFubmVscykuIFdoZW4gdXNlZCBhcyBhIHBvcnQgaW5kZXgKKyAqICBmb3IgYSBjb25maWcgb3IgcGFyYW1ldGVyIHRoaXMgT01YX0FMTCBkZW5vdGVzIHRoYXQgdGhlIGNvbmZpZyBvcgorICogIHBhcmFtZXRlciBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY29tcG9uZW50IG5vdCBqdXN0IG9uZSBwb3J0LiAqLworI2RlZmluZSBPTVhfQUxMIDB4RkZGRkZGRkYKKworLyoqIEluIHRoZSBmb2xsb3dpbmcgd2UgZGVmaW5lIGdyb3VwcyB0aGF0IGhlbHAgYnVpbGRpbmcgZG94eWdlbiBkb2N1bWVudGF0aW9uICovCisKKy8qKiBAZGVmZ3JvdXAgY29yZSBPcGVuTUFYIElMIGNvcmUKKyAqIEZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIE9NWCBJTCBjb3JlCisgKi8KKyAKKyAvKiogQGRlZmdyb3VwIGNvbXAgT3Blbk1BWCBJTCBjb21wb25lbnQKKyAqIEZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIE9NWCBJTCBjb21wb25lbnQKKyAqLworIAorLyoqIEBkZWZncm91cCBycG0gUmVzb3VyY2UgYW5kIFBvbGljeSBNYW5hZ2VtZW50IAorICogU3RydWN0dXJlcyBmb3IgcmVzb3VyY2UgYW5kIHBvbGljeSBtYW5hZ2VtZW50IG9mIGNvbXBvbmVudHMKKyAqLworCisvKiogQGRlZmdyb3VwIGJ1ZiBCdWZmZXIgTWFuYWdlbWVudAorICogQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcworICovCisgIAorLyoqIEBkZWZncm91cCB0dW4gVHVubmVsaW5nCisgKiBAaW5ncm91cCBjb3JlIGNvbXAKKyAqIFN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdHVubmVscyBhbW9uZyBjb21wb25lbnQgcG9ydHMKKyAqLworIAorLyoqIEBkZWZncm91cCBjcCBDb250ZW50IFBpcGVzCisgKiAgQGluZ3JvdXAgY29yZQorICovCisgCisgLyoqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YSBoYW5kbGluZworICAqIAorICAqLyAKKworLyoqIE9NWF9VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKworLyoqIE9NWF9TOCBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworCisvKiogT01YX1UxNiBpcyBhIDE2IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgT01YX1UxNjsKKworLyoqIE9NWF9TMTYgaXMgYSAxNiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgc2hvcnQgT01YX1MxNjsKKworLyoqIE9NWF9VMzIgaXMgYSAzMiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgT01YX1UzMjsKKworLyoqIE9NWF9TMzIgaXMgYSAzMiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBPTVhfUzMyOworCisKKy8qIFVzZXJzIHdpdGggY29tcGlsZXJzIHRoYXQgY2Fubm90IGFjY2VwdCB0aGUgImxvbmcgbG9uZyIgZGVzaWduYXRpb24gc2hvdWxkCisgICBkZWZpbmUgdGhlIE9NWF9TS0lQNjRCSVQgbWFjcm8uICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG1heSBjYXVzZSAKKyAgIHNvbWUgY29tcG9uZW50cyB0byBmYWlsIHRvIGNvbXBpbGUgaWYgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbiB0byByZXF1aXJlCisgICA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuICBIb3dldmVyLCB0aGVzZSBjb21wb25lbnRzIHdvdWxkIE5PVCBjb21waWxlIGFueXdheQorICAgc2luY2UgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHdheSB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuLgorKi8KKyNpZm5kZWYgT01YX1NLSVA2NEJJVAorI2lmZGVmIF9fU1lNQklBTjMyX18KKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKKworLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7CisKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisKKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLyAgIAordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBPTVhfVTY0OworCisvKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCAgIF9faW50NjQgIE9NWF9TNjQ7CisKKyNlbHNlIC8qIFdJTjMyICovCisKKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKKworLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7CisKKyNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmCisKKworLyoqIFRoZSBPTVhfQk9PTCB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdHJ1ZSBvciBhIGZhbHNlIAorICAgIHZhbHVlIHdoZW4gcGFzc2luZyBwYXJhbWV0ZXJzIHRvIGFuZCBmcm9tIHRoZSBPTVggY29yZSBhbmQgY29tcG9uZW50cy4gIFRoZQorICAgIE9NWF9CT09MIGlzIGEgMzIgYml0IHF1YW50aXR5IGFuZCBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IHdvcmQgYm91bmRhcnkuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQk9PTCB7CisgICAgT01YX0ZBTFNFID0gMCwKKyAgICBPTVhfVFJVRSA9ICFPTVhfRkFMU0UsCisgICAgT01YX0JPT0xfTUFYID0gMHg3RkZGRkZGRgorfSBPTVhfQk9PTDsgCisgCisvKiogVGhlIE9NWF9QVFIgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgcG9pbnRlcnMgYmV0d2VlbiB0aGUgT01YCisgICAgYXBwbGljYXRpb25zIGFuZCB0aGUgT01YIENvcmUgYW5kIGNvbXBvbmVudHMuICBUaGlzIGlzIGEgMzIgYml0IHBvaW50ZXIgYW5kCisgICAgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4KKyAqLwordHlwZWRlZiB2b2lkKiBPTVhfUFRSOworCisvKiogVGhlIE9NWF9TVFJJTkcgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgIkMiIHR5cGUgc3RyaW5ncyBiZXR3ZWVuCisgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29yZSBhbmQgY29tcG9uZW50LiAgVGhlIE9NWF9TVFJJTkcgdHlwZSBpcyBhIDMyIAorICAgIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkIGFsaWduZWQgYW5kIAorICAgIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLiAgCisgKi8KK3R5cGVkZWYgY2hhciogT01YX1NUUklORzsKKworLyoqIFRoZSBPTVhfQllURSB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBhcnJheXMgb2YgYnl0ZXMgc3VjaCBhcworICAgIGJ1ZmZlcnMgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgYW5kIGNvcmUuICBUaGUgT01YX0JZVEUgCisgICAgdHlwZSBpcyBhIDMyIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkCisgICAgYWxpZ25lZCBhbmQgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciogT01YX0JZVEU7CisKKy8qKiBPTVhfVVVJRFRZUEUgaXMgYSB2ZXJ5IGxvbmcgdW5pcXVlIGlkZW50aWZpZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkKKyAgICBhdCBydW50aW1lLiAgVGhpcyBpZGVudGlmaWVyIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgYSBjb21wb25lbnQgaW4gYSB3YXkKKyAgICB0aGF0IGd1YXJhbnRlZXMgdGhhdCBldmVyeSBpbnN0YW5jZSBvZiB0aGUgaWRlbnRpZmllciBydW5uaW5nIG9uIHRoZSBzeXN0ZW0KKyAgICBpcyB1bmlxdWUuICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1VVSURUWVBFWzEyOF07CisKKy8qKiBUaGUgT01YX0RJUlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBhIHBvcnQgaXMgYW4gaW5wdXQgb3IKKyAgICBhbiBvdXRwdXQgcG9ydC4gIFRoaXMgZW51bWVyYXRpb24gaXMgY29tbW9uIGFjcm9zcyBhbGwgY29tcG9uZW50IHR5cGVzLiAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9ESVJUWVBFCit7CisgICAgT01YX0RpcklucHV0LCAgICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGFuIGlucHV0IHBvcnQgKi8KKyAgICBPTVhfRGlyT3V0cHV0LCAgICAgICAgICAgICAvKio8IFBvcnQgaXMgYW4gb3V0cHV0IHBvcnQgKi8KKyAgICBPTVhfRGlyTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRElSVFlQRTsKKworLyoqIFRoZSBPTVhfRU5ESUFOVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBiaXQgb3JkZXJpbmcgCisgICAgZm9yIG51bWVyaWNhbCBkYXRhIChpLmUuIGJpZyBlbmRpYW4sIG9yIGxpdHRsZSBlbmRpYW4pLiAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FTkRJQU5UWVBFCit7CisgICAgT01YX0VuZGlhbkJpZywgLyoqPCBiaWcgZW5kaWFuICovCisgICAgT01YX0VuZGlhbkxpdHRsZSwgLyoqPCBsaXR0bGUgZW5kaWFuICovCisgICAgT01YX0VuZGlhbk1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VORElBTlRZUEU7CisKKworLyoqIFRoZSBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBkYXRhIAorICAgIGlzIHNpZ25lZCBvciB1bnNpZ25lZAorICovCit0eXBlZGVmIGVudW0gT01YX05VTUVSSUNBTERBVEFUWVBFCit7CisgICAgT01YX051bWVyaWNhbERhdGFTaWduZWQsIC8qKjwgc2lnbmVkIGRhdGEgKi8KKyAgICBPTVhfTnVtZXJpY2FsRGF0YVVuc2lnbmVkLCAvKio8IHVuc2lnbmVkIGRhdGEgKi8KKyAgICBPTVhfTnVtZXJjaWFsRGF0YU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX05VTUVSSUNBTERBVEFUWVBFOworCisKKy8qKiBVbnNpZ25lZCBib3VuZGVkIHZhbHVlIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CVTMyIHsKKyAgICBPTVhfVTMyIG5WYWx1ZTsgLyoqPCBhY3R1YWwgdmFsdWUgKi8KKyAgICBPTVhfVTMyIG5NaW47ICAgLyoqPCBtaW5pbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPj0gbk1pbikgKi8KKyAgICBPTVhfVTMyIG5NYXg7ICAgLyoqPCBtYXhpbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPD0gbk1heCkgKi8KK30gT01YX0JVMzI7CisKKworLyoqIFNpZ25lZCBib3VuZGVkIHZhbHVlIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CUzMyIHsKKyAgICBPTVhfUzMyIG5WYWx1ZTsgLyoqPCBhY3R1YWwgdmFsdWUgKi8KKyAgICBPTVhfUzMyIG5NaW47ICAgLyoqPCBtaW5pbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPj0gbk1pbikgKi8KKyAgICBPTVhfUzMyIG5NYXg7ICAgLyoqPCBtYXhpbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPD0gbk1heCkgKi8KK30gT01YX0JTMzI7CisKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgc29tZSB0aW1lIG9yIGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcy4gVGhpcyBzdHJ1Y3R1cmUKKyAgKiAgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUuIFRoZSBxdWFudGl0eSBpcyBzaWduZWQgdG8gYWNjb21tb2RhdGUgCisgICogIG5lZ2F0aXZlIGRlbHRhcyBhbmQgcHJlcm9sbCBzY2VuYXJpb3MuIFRoZSBxdWFudGl0eSBpcyByZXByZXNlbnRlZCBpbiBtaWNyb3NlY29uZHMgCisgICogIHRvIGFjY29tb2RhdGUgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcHMgKGUuZy4gRFZEIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIGJhc2VkCisgICogIG9uIGEgOTBrSHogY2xvY2spIGFuZCB0byBhbGxvdyBtb3JlIGFjY3VyYXRlIGFuZCBzeW5jaHJvbml6ZWQgZGVsaXZlcnkgKGUuZy4gCisgICogIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBkZWxpdmVyZWQgYXQgMTkyIGtIeikuIFRoZSBxdWFudGl0eSBpcyA2NCBiaXQgdG8gCisgICogIGFjY29tbW9kYXRlIGEgbGFyZ2UgZHluYW1pYyByYW5nZSAoc2lnbmVkIDMyIGJpdCB2YWx1ZXMgd291bGQgYWxsb3cgb25seSBmb3IgcGx1cworICAqICBvciBtaW51cyAzNSBtaW51dGVzKS4KKyAgKgorICAqICBJbXBsZW1lbnRhdGlvbnMgd2l0aCBsaW1pdGVkIHByZWNpc2lvbiBtYXkgY29udmVydCB0aGUgc2lnbmVkIDY0IGJpdCB2YWx1ZSB0byAKKyAgKiAgYSBzaWduZWQgMzIgYml0IHZhbHVlIGludGVybmFsbHkgYnV0IHJpc2sgbG9zcyBvZiBwcmVjaXNpb24uICAKKyAgKi8KKyNpZm5kZWYgT01YX1NLSVA2NEJJVAordHlwZWRlZiBPTVhfUzY0IE9NWF9USUNLUzsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBPTVhfVElDS1MKK3sKKyAgICBPTVhfVTMyIG5Mb3dQYXJ0OyAgICAvKiogbG93IGJpdHMgb2YgdGhlIHNpZ25lZCA2NCBiaXQgdGljayB2YWx1ZSAqLworICAgIE9NWF9VMzIgbkhpZ2hQYXJ0OyAgIC8qKiBoaWdoIGJpdHMgb2YgdGhlIHNpZ25lZCA2NCBiaXQgdGljayB2YWx1ZSAqLworfSBPTVhfVElDS1M7CisjZW5kaWYKKyNkZWZpbmUgT01YX1RJQ0tTX1BFUl9TRUNPTkQgMTAwMDAwMAorCisvKiogRGVmaW5lIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciB0aGUgT01YIEhhbmRsZS4gIFRoZSBjb3JlIHdpbGwgbm90IHVzZQorICAgIHRoaXMgdmFsdWUgaW50ZXJuYWxseSwgYnV0IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgb25seSB1c2UgdGhpcyB2YWx1ZS4KKyAqLwordHlwZWRlZiB2b2lkKiBPTVhfSEFORExFVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX01BUktUWVBFCit7CisgICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7ICAgLyoqPCBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbWFyayBldmVudCB1cG9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgbWFyay4gKi8KKyAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAvKio8IEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmsgc2VudCBvbiBhIG1hcmsgZXZlbnQgdG8gZGlzYW1iaWd1YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLworfSBPTVhfTUFSS1RZUEU7CisKKworLyoqIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBpcyB1c2VkIHRvIG1hcCBhIE9NWCB2aWRlbyBwb3J0IHRvIHRoZQorICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGlzcGxheSAKKyAqICBvciBjYW4gYmUgdXNlZCBieSBhIGF1ZGlvIHBvcnQgZm9yIG5hdGl2ZSBhdWRpbyByZW5kZXJpbmcgKi8KK3R5cGVkZWYgdm9pZCogT01YX05BVElWRV9ERVZJQ0VUWVBFOworCisvKiogT01YX05BVElWRV9XSU5ET1dUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCisgKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSB3aW5kb3cgKi8KK3R5cGVkZWYgdm9pZCogT01YX05BVElWRV9XSU5ET1dUWVBFOworCisvKiogVGhlIE9NWF9WRVJTSU9OVFlQRSB1bmlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHZlcnNpb24gZm9yCisgICAgYSBzdHJ1Y3R1cmUgb3IgY29tcG9uZW50LiAgRm9yIGEgY29tcG9uZW50LCB0aGUgdmVyc2lvbiBpcyBlbnRpcmVseQorICAgIHNwZWNpZmllZCBieSB0aGUgY29tcG9uZW50IHZlbmRvci4gIENvbXBvbmVudHMgZG9pbmcgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICBmcm9tIGRpZmZlcmVudCB2ZW5kb3JzIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbWUgdmVyc2lvbi4gIEZvciAKKyAgICBzdHJ1Y3R1cmVzLCB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgYnkgdGhlIGVudGl0eSB0aGF0IGFsbG9jYXRlcyB0aGUKKyAgICBzdHJ1Y3R1cmUuICBGb3Igc3RydWN0dXJlcyBzcGVjaWZpZWQgaW4gdGhlIE9NWCAxLjEgc3BlY2lmaWNhdGlvbiwgdGhlCisgICAgdmFsdWUgb2YgdGhlIHZlcnNpb24gc2hhbGwgYmUgc2V0IHRvIDEuMS4wLjAgaW4gYWxsIGNhc2VzLiAgQWNjZXNzIHRvIHRoZQorICAgIE9NWF9WRVJTSU9OVFlQRSBjYW4gYmUgYnkgYSBzaW5nbGUgMzIgYml0IGFjY2VzcyAoZS5nLiBieSBuVmVyc2lvbikgb3IKKyAgICBieSBhY2Nlc3Npbmcgb25lIG9mIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgdG8sIGZvciBleGFtcGxlLCBjaGVjayBvbmx5CisgICAgdGhlIE1ham9yIHJldmlzaW9uLgorICovCit0eXBlZGVmIHVuaW9uIE9NWF9WRVJTSU9OVFlQRQoreworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgT01YX1U4IG5WZXJzaW9uTWFqb3I7ICAgLyoqPCBNYWpvciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5WZXJzaW9uTWlub3I7ICAgLyoqPCBNaW5vciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5SZXZpc2lvbjsgICAgICAgLyoqPCBSZXZpc2lvbiB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5TdGVwOyAgICAgICAgICAgLyoqPCBTdGVwIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLworICAgIH0gczsKKyAgICBPTVhfVTMyIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCAzMiBiaXQgdmFsdWUgdG8gbWFrZSBhY2Nlc3NpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGVhc2lseSBkb25lIGluIGEgc2luZ2xlIHdvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29weS9jb21wYXJlIG9wZXJhdGlvbiAqLworfSBPTVhfVkVSU0lPTlRZUEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM4YmRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCkBAIC0wLDAgKzEsMTA3NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiAKKyAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCisgKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9WaWRlb19oCisjZGVmaW5lIE9NWF9WaWRlb19oCisKKy8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KKyAqIEBpbmdyb3VwIGl2CisgKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgorICogQHsKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqCisgKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KKworCisvKioKKyAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCisgKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAorICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAorICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCisgKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAorICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCisgKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgeworICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLworICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCisgICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLworICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCisgICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCisgICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19DT0RJTkdUWVBFOworCisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IgCisgKiBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBWaWRlbyBjb21wb25lbnQuICAKKyAqIAorICogICAgSW5wdXQgKGFrYSBTb3VyY2UpIDogemVybyBJbnB1dHMsIG9uZSBPdXRwdXQsCisgKiAgICBTcGxpdHRlciAgICAgICAgICAgOiBvbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAorICogICAgUHJvY2Vzc2luZyBFbGVtZW50IDogb25lIElucHV0LCBvbmUgb3V0cHV0LAorICogICAgTWl4ZXIgICAgICAgICAgICAgIDogMiBvciBtb3JlIGlucHV0cywgb25lIG91dHB1dCwKKyAqICAgIE91dHB1dCAoYWthIFNpbmspICA6IG9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgorICogCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHZpZGVvIAorICogcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCBiZSAKKyAqIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uICBDb21wbGlhbnQgCisgKiBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsIHZhbHVlcyBkdXJpbmcgdGhlIAorICogR2V0RGVmYXVsdEluaXRQYXJhbXMgY29tbWFuZC4KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBjTUlNRVR5cGUgICAgICAgICAgICAgOiBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQKKyAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKKyAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIHVua25vd24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGltYWdlIGlzIGJvdHRvbSB1cAorICogIG5TbGljZUhlaWdodCAgICAgICAgICA6IEhlaWdodCB1c2VkIHdoZW4gZW5jb2RpbmcgaW4gc2xpY2VzCisgKiAgbkJpdHJhdGUgICAgICAgICAgICAgIDogQml0IHJhdGUgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciB1bmtub3duLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgeEZyYW1lcmF0ZSAgICAgICAgICAgIDogRnJhbWUgcmF0ZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgdW5jb21wcmVzc2VkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgZG9uJ3QgY2FyZSBvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIFVuaXRzIGFyZSBRMTYgZnJhbWVzIHBlciBzZWNvbmQuCisgKiAgYkZsYWdFcnJvckNvbmNlYWxtZW50IDogVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBPTVggY29tcG9uZW50CisgKiAgZUNvbXByZXNzaW9uRm9ybWF0ICAgIDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdXNlZAorICogIGVDb2xvckZvcm1hdCA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAorICogIHBOYXRpdmVXaW5kb3cgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOworICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7CisgICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7CisgICAgT01YX1MzMiBuU3RyaWRlOworICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OworICAgIE9NWF9VMzIgbkJpdHJhdGU7CisgICAgT01YX1UzMiB4RnJhbWVyYXRlOworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKKyAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OworfSBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFOworCisvKiogIAorICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCisgKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0CisgKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIAorICogICAgICAgICAgICAgICAgICAgICAgIDB4MCB0byBOLTEKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX1ZJREVPX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsIAorICogICAgICAgICAgICAgICAgICAgICAgIGVDb2xvckZvcm1hdCBpcyB1c2VkIAorICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAorICogIHhGcmFtZVJhdGUgICAgICAgICA6IEluZGljYXRlcyB0aGUgdmlkZW8gZnJhbWUgcmF0ZSBpbiBRMTYgZm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkluZGV4OworICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsgCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKK30gT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOworCisKKy8qKgorICogVGhpcyBpcyBhIHN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdmlkZW8gY29tcHJlc3Npb24gcXVhbnRpemF0aW9uIAorICogcGFyYW1ldGVyIHZhbHVlcy4gIENvZGVjcyBtYXkgc3VwcG9ydCBkaWZmZXJlbnQgUVAgdmFsdWVzIGZvciBkaWZmZXJlbnQKKyAqIGZyYW1lIHR5cGVzLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblFwSSAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgaW5kZXggZnJhbWVzCisgKiAgblFwUCAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgUCBmcmFtZXMKKyAqICBuUXBCICAgICAgIDogUVAgdmFsdWVzIHRvIHVzZSBmb3IgYmlkaXJlY3Rpb25hbCBmcmFtZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUXBJOworICAgIE9NWF9VMzIgblFwUDsKKyAgICBPTVhfVTMyIG5RcEI7Cit9IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiBvZiB2aWRlbyBmYXN0IHVwZGF0ZSBwYXJhbWV0ZXJzLiAKKyAqICAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJFbmFibGVWRlUgOiBFbmFibGUvRGlzYWJsZSB2aWRlbyBmYXN0IHVwZGF0ZQorICogIG5GaXJzdEdPQiAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayByb3cKKyAqICBuRmlyc3RNQiAgIDogc3BlY2lmaWVzIHRoZSBmaXJzdCBNQiByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGZpcnN0IEdPQgorICogIG5OdW1NQnMgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBNQnMgdG8gYmUgcmVmcmVzaGVkIGZyb20gbkZpcnN0R09CIAorICogICAgICAgICAgICAgICBhbmQgbkZpcnN0TUIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAorICAgIE9NWF9CT09MIGJFbmFibGVWRlU7ICAgICAgCisgICAgT01YX1UzMiBuRmlyc3RHT0I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbkZpcnN0TUI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbk51bU1CczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGJpdHJhdGUgY29udHJvbCB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgeworICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGUsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGUsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50U2tpcEZyYW1lcywKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19DT05UUk9MUkFURVRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBiaXRyYXRlIG1vZGUgb2YgYSBjb2RlYy4gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8KKyAqICBlQ29udHJvbFJhdGUgICA6IENvbnRyb2wgcmF0ZSB0eXBlIGVudW0KKyAqICBuVGFyZ2V0Qml0cmF0ZSA6IFRhcmdldCBiaXRyYXRlIHRvIGVuY29kZSB3aXRoCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGU7IAorICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGU7ICAgICAgICAgICAgICAgICAKK30gT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1vdGlvbiB2ZWN0b3IgKE1WKSB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIHsKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yUGl4ZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckhhbGZQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclF1YXJ0ZXJQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckVpZ2h0aFBlbCwKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyB0aGUgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIHVzZWQgYXMgd2VsbAorICogYXMgdGhlaXIgYWNjdXJhY3kuCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCAgICAgICA6IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUFjY3VyYWN5ICAgICAgICA6IEVudW1lcmF0ZWQgTVYgYWNjdXJhY3kKKyAqICBiVW5yZXN0cmljdGVkTVZzIDogQWxsb3cgdW5yZXN0cmljdGVkIE1WcworICogIGJGb3VyTVYgICAgICAgICAgOiBBbGxvdyB1c2Ugb2YgNCBNVnMKKyAqICBzWFNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIGhvcml6b250YWwgZGlyZWN0aW9uIGZvciBNVnMKKyAqICBzWVNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiBmb3IgTVZzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX01PVElPTlZFQ1RPUlRZUEUgZUFjY3VyYWN5OworICAgIE9NWF9CT09MIGJVbnJlc3RyaWN0ZWRNVnM7CisgICAgT01YX0JPT0wgYkZvdXJNVjsKKyAgICBPTVhfUzMyIHNYU2VhcmNoUmFuZ2U7CisgICAgT01YX1MzMiBzWVNlYXJjaFJhbmdlOworfSBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtZXRob2RzIHRvIHVzZSBmb3IgSW50cmEgUmVmcmVzaCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIHsKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljLAorICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hBZGFwdGl2ZSwKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQm90aCwKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBpbnRyYSByZWZyZXNoIG1vZGUgCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVSZWZyZXNoTW9kZSA6IEN5Y2xpYywgQWRhcHRpdmUsIG9yIEJvdGgKKyAqICBuQWlyTUJzICAgICAgOiBOdW1iZXIgb2YgaW50cmEgbWFjcm9ibG9ja3MgdG8gcmVmcmVzaCBpbiBhIGZyYW1lIHdoZW4gCisgKiAgICAgICAgICAgICAgICAgQUlSIGlzIGVuYWJsZWQKKyAqICBuQWlyUmVmICAgICAgOiBOdW1iZXIgb2YgdGltZXMgYSBtb3Rpb24gbWFya2VkIG1hY3JvYmxvY2sgaGFzIHRvIGJlICAKKyAqICAgICAgICAgICAgICAgICBpbnRyYSBjb2RlZAorICogIG5DaXJNQnMgICAgICA6IE51bWJlciBvZiBjb25zZWN1dGl2ZSBtYWNyb2Jsb2NrcyB0byBiZSBjb2RlZCBhcyAiaW50cmEiICAKKyAqICAgICAgICAgICAgICAgICB3aGVuIENJUiBpcyBlbmFibGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX0lOVFJBUkVGUkVTSFRZUEUgZVJlZnJlc2hNb2RlOworICAgIE9NWF9VMzIgbkFpck1CczsKKyAgICBPTVhfVTMyIG5BaXJSZWY7CisgICAgT01YX1UzMiBuQ2lyTUJzOworfSBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdmFyaW91cyBlcnJvciBjb3JyZWN0aW9uIG1ldGhvZHMgZm9yIHZpZGVvIAorICogY29tcHJlc3Npb24uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBiRW5hYmxlSEVDICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGhlYWRlciBleHRlbnNpb24gY29kZXMgKEhFQykKKyAqICBiRW5hYmxlUmVzeW5jICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJlc3luY2hyb25pemF0aW9uIG1hcmtlcnMKKyAqICBuUmVzeW5jaE1hcmtlclNwYWNpbmcgICA6IFJlc3luY2ggbWFya2VycyBpbnRlcnZhbCAoaW4gYml0cykgdG8gYmUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIGluIHRoZSBzdHJlYW0gCisgKiAgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgOiBFbmFibGUvZGlzYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAKKyAqICBiRW5hYmxlUlZMQyAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZUhFQzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUmVzeW5jOworICAgIE9NWF9VMzIgIG5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUlZMQzsKK30gT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEU7CisKKworLyoqIAorICogQ29uZmlndXJhdGlvbiBvZiB2YXJpYWJsZSBibG9jay1zaXplIG1vdGlvbiBjb21wZW5zYXRpb24gKFZCU01DKSAKKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGIxNngxNiAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDE2CisgKiAgYjE2eDggICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggMTZ4OAorICogIGI4eDE2ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDh4MTYKKyAqICBiOHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDgKKyAqICBiOHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDQKKyAqICBiNHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDgKKyAqICBiNHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAorICAgIE9NWF9CT09MIGIxNngxNjsgCisgICAgT01YX0JPT0wgYjE2eDg7IAorICAgIE9NWF9CT09MIGI4eDE2OworICAgIE9NWF9CT09MIGI4eDg7CisgICAgT01YX0JPT0wgYjh4NDsKKyAgICBPTVhfQk9PTCBiNHg4OworICAgIE9NWF9CT09MIGI0eDQ7Cit9IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEU7CisKKworLyoqIAorICogSC4yNjMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqCisgKiBFTlVNUzoKKyAqICBCYXNlbGluZSAgICAgICAgICAgOiBCYXNlbGluZSBQcm9maWxlOiBILjI2MyAoVjEpLCBubyBvcHRpb25hbCBtb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBIMzIwIENvZGluZyAgICAgICAgOiBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IAorICogICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6IEguMjYzKyAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEwuNAorICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBUCisgKiAgQmFja3dhcmRDb21wYXRpYmxlIDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBQcm9maWxlOiBILjI2MyAoVjEpLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBhbm5leCBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSVNXVjIgICAgICAgICAgICAgIDogSW50ZXJhY3RpdmUgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGU6IEguMjYzKyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEsgYW5kIFQgICAgICAgICAgICAgICAgIAorICogIElTV1YzICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysrICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAoVjMpLCBpbmNsdWRlcyBwcm9maWxlIDMgYW5kIGFubmV4ZXMgViBhbmQgVy42LjMuOCAgIAorICogIEhpZ2hDb21wcmVzc2lvbiAgICA6IENvbnZlcnNhdGlvbmFsIEhpZ2ggQ29tcHJlc3Npb24gUHJvZmlsZTogSC4yNjMrKyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZXMgMSAmIDIgYW5kIGFubmV4ZXMgRCBhbmQgVSAgIAorICogIEludGVybmV0ICAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybmV0IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAorICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggSyAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSW50ZXJsYWNlICAgICAgICAgIDogQ29udmVyc2F0aW9uYWwgSW50ZXJsYWNlIFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAorICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggVy42LjMuMTEgICAgICAgICAgICAgICAKKyAqICBIaWdoTGF0ZW5jeSAgICAgICAgOiBIaWdoIExhdGVuY3kgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCBpbmNsdWRlcyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA2IGFuZCBhbm5leGVzIE8uMSBhbmQgUC41ICAgICAgICAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lICAgICAgICAgICAgPSAweDAxLCAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZyAgICAgICAgICA9IDB4MDIsICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSAgPSAweDA0LCAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIgICAgICAgICAgICAgICA9IDB4MDgsICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjMgICAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uICAgICA9IDB4MjAsICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldCAgICAgICAgICAgID0gMHg0MCwgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2UgICAgICAgICAgID0gMHg4MCwgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hMYXRlbmN5ICAgICAgICAgPSAweDEwMCwgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVNYXggICAgICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEU7CisKKworLyoqIAorICogSC4yNjMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAorICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19IMjYzTGV2ZWwxMCAgPSAweDAxLCAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDIwICA9IDB4MDIsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDMwICA9IDB4MDQsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQwICA9IDB4MDgsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQ1ICA9IDB4MTAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDUwICA9IDB4MjAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDYwICA9IDB4NDAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDcwICA9IDB4ODAsIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fSDI2M0xFVkVMVFlQRTsKKworCisvKiogCisgKiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZS4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBPUidkIHRvIHNpZ25hbCBhbGwgCisgKiBwaWN0dXJlcyB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZC4KKyAqCisgKiBFTlVNUzoKKyAqICBHZW5lcmljIFBpY3R1cmUgVHlwZXM6ICAgICAgICAgIEksIFAgYW5kIEIKKyAqICBILjI2MyBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIFNJIGFuZCBTUAorICogIEguMjY0IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICAgRUkgYW5kIEVQCisgKiAgTVBFRy00IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICBTCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fUElDVFVSRVRZUEUgeworICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUkgICA9IDB4MDEsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCAgID0gMHgwMiwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVCICAgPSAweDA0LAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNJICA9IDB4MDgsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlU1AgID0gMHgxMCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFSSAgPSAweDExLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUVQICA9IDB4MTIsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUyAgID0gMHgxNCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19QSUNUVVJFVFlQRTsKKworCisvKiogCisgKiBILjI2MyBQYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5CRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGVQcm9maWxlICAgICAgICAgICAgICAgICA6IEguMjYzIHByb2ZpbGUocykgdG8gdXNlCisgKiAgZUxldmVsICAgICAgICAgICAgICAgICAgIDogSC4yNjMgbGV2ZWwocykgdG8gdXNlCisgKiAgYlBMVVNQVFlQRUFsbG93ZWQgICAgICAgIDogSW5kaWNhdGluZyB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gdXNlIFBMVVNQVFlQRSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlY2lmaWVkIGluIHRoZSAxOTk4IHZlcnNpb24gb2YgSC4yNjMpIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlIGN1c3RvbSBwaWN0dXJlIHNpemVzIG9yIGNsb2NrIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIAorICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqICBiRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gOiB2YWx1ZSBvZiB0aGUgUlRZUEUgYml0IChiaXQgNiBvZiBNUFBUWVBFKSBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29uc3RyYWluZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNoYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCBmb3IgZWFjaCByZWZlcmVuY2UgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiBlcnJvci1mcmVlIGNvbW11bmljYXRpb24KKyAqICBuUGljdHVyZUhlYWRlclJlcGV0aXRpb24gOiBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBvZiBwaWN0dXJlIGhlYWRlciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBldGl0aW9uCisgKiAgbkdPQkhlYWRlckludGVydmFsICAgICAgIDogU3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBvZiBub24tZW1wdHkgR09CICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIGluIHVuaXRzIG9mIEdPQnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUEZyYW1lczsKKyAgICBPTVhfVTMyIG5CRnJhbWVzOworICAgIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgZVByb2ZpbGU7CisJT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgZUxldmVsOworICAgIE9NWF9CT09MIGJQTFVTUFRZUEVBbGxvd2VkOworICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CisgICAgT01YX0JPT0wgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvOworICAgIE9NWF9VMzIgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uOworICAgIE9NWF9VMzIgbkdPQkhlYWRlckludGVydmFsOworfSBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEU7CisKKworLyoqIAorICogTVBFRy0yIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKKyAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSB7CisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSA9IDAsICAvKio8IFNpbXBsZSBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4sICAgICAgICAvKio8IE1haW4gUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGU0MjIsICAgICAgICAgLyoqPCA0OjI6MiBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiwgICAgICAgICAvKio8IFNOUiBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwsICAgICAvKio8IFNwYXRpYWwgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVIaWdoLCAgICAgICAgLyoqPCBIaWdoIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEU7CisKKworLyoqIAorICogTVBFRy0yIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIAorICogc2l6ZXMsIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19NUEVHMkxldmVsTEwgPSAwLCAgLyoqPCBMb3cgTGV2ZWwgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCwgICAgICAvKio8IE1haW4gTGV2ZWwgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQsICAgICAvKio8IEhpZ2ggMTQ0MCAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEhMLCAgICAgIC8qKjwgSGlnaCBMZXZlbCAqLyAgIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU7CisKKworLyoqIAorICogTVBFRy0yIHBhcmFtcyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuUEZyYW1lcyAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgbkJGcmFtZXMgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGVQcm9maWxlICAgOiBNUEVHLTIgcHJvZmlsZShzKSB0byB1c2UKKyAqICBlTGV2ZWwgICAgIDogTVBFRy0yIGxldmVscyhzKSB0byB1c2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgCisgICAgT01YX1UzMiBuUEZyYW1lczsgICAgICAgIAorICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKwlPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgZUxldmVsOyAgIAorfSBPTVhfVklERU9fUEFSQU1fTVBFRzJUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICogCisgKiBFTlVNUzoKKyAqICAtIFNpbXBsZSBQcm9maWxlLCBMZXZlbHMgMS0zCisgKiAgLSBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQ29yZSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBNYWluIFByb2ZpbGUsIExldmVscyAyLTQKKyAqICAtIE4tYml0IFByb2ZpbGUsIExldmVsIDIKKyAqICAtIFNjYWxhYmxlIFRleHR1cmUgUHJvZmlsZSwgTGV2ZWwgMQorICogIC0gU2ltcGxlIEZhY2UgQW5pbWF0aW9uIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIFNpbXBsZSBGYWNlIGFuZCBCb2R5IEFuaW1hdGlvbiAoRkJBKSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBCYXNpYyBBbmltYXRlZCBUZXh0dXJlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIEh5YnJpZCBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBBZHZhbmNlZCBSZWFsIFRpbWUgU2ltcGxlIFByb2ZpbGVzLCBMZXZlbHMgMS00CisgKiAgLSBDb3JlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTMKKyAqICAtIEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5IFByb2ZpbGUsIExldmVscyAxLTQKKyAqICAtIEFkdmFuY2VkIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQWR2YW5jZWQgU2NhbGFibGUgVGV4dHVyZSwgTGV2ZWxzIDItMworICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgID0gMHgwMSwgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSAgID0gMHgwMiwgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgPSAweDA0LCAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4gICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlICA9IDB4MjAsICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UgICAgICAgPSAweDQwLCAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQSAgICAgICAgPSAweDgwLCAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkICAgID0gMHgxMDAsICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkICAgICAgICAgICA9IDB4MjAwLCAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lID0gMHg0MDAsICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlICAgICA9IDB4ODAwLCAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZyAgID0gMHgxMDAwLCAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlICAgICA9IDB4MjAwMCwgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSA9IDB4NDAwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgICA9IDB4ODAwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYXggICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKKyAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgID0gMHgwMSwgICAvKio8IExldmVsIDAgKi8gICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDBiID0gMHgwMiwgICAvKio8IExldmVsIDBiICovICAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICA9IDB4MDQsICAgLyoqPCBMZXZlbCAxICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgPSAweDA4LCAgIC8qKjwgTGV2ZWwgMiAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgID0gMHgxMCwgICAvKio8IExldmVsIDMgKi8gCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICA9IDB4MjAsICAgLyoqPCBMZXZlbCA0ICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhID0gMHg0MCwgICAvKio8IExldmVsIDRhICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDUgID0gMHg4MCwgICAvKio8IExldmVsIDUgKi8gIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU7CisKKworLyoqIAorICogTVBFRy00IGNvbmZpZ3VyYXRpb24uICBUaGlzIHN0cnVjdHVyZSBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICogd2hpY2ggYXJlIHNwZWNpZmljIHRvIE1QRUc0IGFsZ29yaXRobXMKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuU2xpY2VIZWFkZXJTcGFjaW5nICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciAoSDI2MysgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBBbm5leCBLKS4gUHV0IHplcm8gaWYgbm90IHVzZWQKKyAqICBiU1ZIICAgICAgICAgICAgICAgICA6IEVuYWJsZSBTaG9ydCBWaWRlbyBIZWFkZXIgbW9kZQorICogIGJHb3YgICAgICAgICAgICAgICAgIDogRmxhZyB0byBlbmFibGUgR09WCisgKiAgblBGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUgKGFsc28gY2FsbGVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgR09WIHBlcmlvZCkKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5JRENWTENUaHJlc2hvbGQgICAgIDogVmFsdWUgb2YgaW50cmEgREMgVkxDIHRocmVzaG9sZAorICogIGJBQ1ByZWQgICAgICAgICAgICAgIDogRmxhZyB0byB1c2UgYWMgcHJlZGljdGlvbgorICogIG5NYXhQYWNrZXRTaXplICAgICAgIDogTWF4aW11bSBzaXplIG9mIHBhY2tldCBpbiBieXRlcy4KKyAqICBuVGltZUluY1JlcyAgICAgICAgICA6IFVzZWQgdG8gcGFzcyBWT1AgdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiBmb3IgTVBFRzQuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIE1QRUc0IHN0YW5kYXJkLgorICogIGVQcm9maWxlICAgICAgICAgICAgIDogTVBFRy00IHByb2ZpbGUocykgdG8gdXNlLgorICogIGVMZXZlbCAgICAgICAgICAgICAgIDogTVBFRy00IGxldmVsKHMpIHRvIHVzZS4KKyAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSBiaXRzdHJlYW0KKyAqICBuSGVhZGVyRXh0ZW5zaW9uICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZpZGVvIHBhY2tldAorICogICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRoaW4gYSBWT1AKKyAqICBiUmV2ZXJzaWJsZVZMQyAgICAgICA6IFNwZWNpZmllcyB3aGV0aGVyIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGluZyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIHVzZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOworICAgIE9NWF9CT09MIGJTVkg7CisgICAgT01YX0JPT0wgYkdvdjsKKyAgICBPTVhfVTMyIG5QRnJhbWVzOworICAgIE9NWF9VMzIgbkJGcmFtZXM7CisgICAgT01YX1UzMiBuSURDVkxDVGhyZXNob2xkOworICAgIE9NWF9CT09MIGJBQ1ByZWQ7CisgICAgT01YX1UzMiBuTWF4UGFja2V0U2l6ZTsKKyAgICBPTVhfVTMyIG5UaW1lSW5jUmVzOworICAgIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGVQcm9maWxlOworICAgIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSBlTGV2ZWw7CisgICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsKKyAgICBPTVhfVTMyIG5IZWFkZXJFeHRlbnNpb247CisgICAgT01YX0JPT0wgYlJldmVyc2libGVWTEM7Cit9IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEU7CisKKworLyoqIAorICogV01WIFZlcnNpb25zIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEUgeworICAgIE9NWF9WSURFT19XTVZGb3JtYXRVbnVzZWQgPSAweDAxLCAgIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDcgICAgICA9IDB4MDIsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA3ICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDggICAgICA9IDB4MDQsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA4ICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDkgICAgICA9IDB4MDgsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA5ICovCisgICAgT01YX1ZJREVPX1dNRkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fV01GRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fV01WRm9ybWF0TWF4ICAgID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fV01WRk9STUFUVFlQRTsKKworCisvKiogCisgKiBXTVYgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb3JtYXQgICAgOiBWZXJzaW9uIG9mIFdNViBzdHJlYW0gLyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIGVGb3JtYXQ7Cit9IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFOworCisKKy8qKiAKKyAqIFJlYWwgVmlkZW8gVmVyc2lvbiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgeworICAgIE9NWF9WSURFT19SVkZvcm1hdFVudXNlZCA9IDAsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0OCwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA4ICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0OSwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA5ICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0RzIsICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIEZvcm1hdCBHMiAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fUlZGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX1JWRk9STUFUVFlQRTsKKworCisvKiogCisgKiBSZWFsIFZpZGVvIFBhcmFtcyAKKyAqCisgKiBTVFVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9ybWF0ICAgICAgICAgICAgOiBWZXJzaW9uIG9mIFJWIHN0cmVhbSAvIGRhdGEKKyAqICBuQml0c1BlclBpeGVsICAgICAgOiBCaXRzIHBlciBwaXhlbCBjb2RlZCBpbiB0aGUgZnJhbWUKKyAqICBuUGFkZGVkV2lkdGggICAgICAgOiBQYWRkZWQgd2lkdGggaW4gcGl4ZWwgb2YgYSB2aWRlbyBmcmFtZQorICogIG5QYWRkZWRIZWlnaHQgICAgICA6IFBhZGRlZCBIZWlnaHQgaW4gcGl4ZWxzIG9mIGEgdmlkZW8gZnJhbWUKKyAqICBuRnJhbWVSYXRlICAgICAgICAgOiBSYXRlIG9mIHZpZGVvIGluIGZyYW1lcyBwZXIgc2Vjb25kCisgKiAgbkJpdHN0cmVhbUZsYWdzICAgIDogRmxhZ3Mgd2hpY2ggaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHN0cmVhbQorICogIG5CaXRzdHJlYW1WZXJzaW9uICA6IEJpdHN0cmVhbSB2ZXJzaW9uCisgKiAgbk1heEVuY29kZUZyYW1lU2l6ZTogTWF4IGVuY29kZWQgZnJhbWUgc2l6ZQorICogIGJFbmFibGVQb3N0RmlsdGVyICA6IFR1cm4gb24vb2ZmIHBvc3QgZmlsdGVyCisgKiAgYkVuYWJsZVRlbXBvcmFsSW50ZXJwb2xhdGlvbiA6IFR1cm4gb24vb2ZmIHRlbXBvcmFsIGludGVycG9sYXRpb24KKyAqICBiRW5hYmxlTGF0ZW5jeU1vZGUgOiBXaGVuIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXMgbm90IGRpc3BsYXkgYSBkZWNvZGVkIAorICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIHVudGlsIGl0IGhhcyBkZXRlY3RlZCB0aGF0IG5vIGVuaGFuY2VtZW50IGxheWVyIAorICogIAkJCQkJIGZyYW1lcyBvciBkZXBlbmRlbnQgQiBmcmFtZXMgd2lsbCBiZSBjb21pbmcuIFRoaXMgCisgKiAgCQkJCQkgZGV0ZWN0aW9uIHVzdWFsbHkgb2NjdXJzIHdoZW4gYSBzdWJzZXF1ZW50IG5vbi1CIAorICogIAkJCQkJIGZyYW1lIGlzIGVuY291bnRlcmVkIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUlZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX1JWRk9STUFUVFlQRSBlRm9ybWF0OworICAgIE9NWF9VMTYgbkJpdHNQZXJQaXhlbDsKKyAgICBPTVhfVTE2IG5QYWRkZWRXaWR0aDsKKyAgICBPTVhfVTE2IG5QYWRkZWRIZWlnaHQ7CisgICAgT01YX1UzMiBuRnJhbWVSYXRlOworICAgIE9NWF9VMzIgbkJpdHN0cmVhbUZsYWdzOworICAgIE9NWF9VMzIgbkJpdHN0cmVhbVZlcnNpb247CisgICAgT01YX1UzMiBuTWF4RW5jb2RlRnJhbWVTaXplOworICAgIE9NWF9CT09MIGJFbmFibGVQb3N0RmlsdGVyOworICAgIE9NWF9CT09MIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb247CisgICAgT01YX0JPT0wgYkVuYWJsZUxhdGVuY3lNb2RlOworfSBPTVhfVklERU9fUEFSQU1fUlZUWVBFOworCisKKy8qKiAKKyAqIEFWQyBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lID0gMHgwMSwgICAvKio8IEJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4gICAgID0gMHgwMiwgICAvKio8IE1haW4gcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQgPSAweDA0LCAgIC8qKjwgRXh0ZW5kZWQgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCAgICAgPSAweDA4LCAgIC8qKjwgSGlnaCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAgICA9IDB4MTAsICAgLyoqPCBIaWdoIDEwIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0MjIgID0gMHgyMCwgICAvKio8IEhpZ2ggNDoyOjIgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NCAgPSAweDQwLCAgIC8qKjwgSGlnaCA0OjQ6NCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlTWF4ICAgICAgPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIEFWQyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywgCisgKiBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ0xldmVsMSAgID0gMHgwMSwgICAgIC8qKjwgTGV2ZWwgMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDFiICA9IDB4MDIsICAgICAvKio8IExldmVsIDFiICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTEgID0gMHgwNCwgICAgIC8qKjwgTGV2ZWwgMS4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTIgID0gMHgwOCwgICAgIC8qKjwgTGV2ZWwgMS4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTMgID0gMHgxMCwgICAgIC8qKjwgTGV2ZWwgMS4zICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMiAgID0gMHgyMCwgICAgIC8qKjwgTGV2ZWwgMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIxICA9IDB4NDAsICAgICAvKio8IExldmVsIDIuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIyICA9IDB4ODAsICAgICAvKio8IExldmVsIDIuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDMgICA9IDB4MTAwLCAgICAvKio8IExldmVsIDMgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzMSAgPSAweDIwMCwgICAgLyoqPCBMZXZlbCAzLjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzMiAgPSAweDQwMCwgICAgLyoqPCBMZXZlbCAzLjIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWw0ICAgPSAweDgwMCwgICAgLyoqPCBMZXZlbCA0ICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNDEgID0gMHgxMDAwLCAgIC8qKjwgTGV2ZWwgNC4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNDIgID0gMHgyMDAwLCAgIC8qKjwgTGV2ZWwgNC4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgID0gMHg0MDAwLCAgIC8qKjwgTGV2ZWwgNSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDUxICA9IDB4ODAwMCwgICAvKio8IExldmVsIDUuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fQVZDTEVWRUxUWVBFOworCisKKy8qKiAKKyAqIEFWQyBsb29wIGZpbHRlciBtb2RlcyAKKyAqCisgKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlCisgKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUgICAgICAgICAgICAgIDogRGlzYWJsZQorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSA6IERpc2FibGVkIG9uIHNsaWNlIGJvdW5kYXJpZXMKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgPSAwLAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGVTbGljZUJvdW5kYXJ5LAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlck1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFOworCisKKy8qKiAKKyAqIEFWQyBwYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgICAgICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciwgcHV0ICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBpZiBub3QgdXNlZAorICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgYlVzZUhhZGFtYXJkICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIEhhZGFtYXJkIHRyYW5zZm9ybQorICogIG5SZWZGcmFtZXMgICAgICAgICAgICAgICAgOiBNYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgdG8gdXNlIGZvciBpbnRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gc2VhcmNoICgxLTE2KQorICogIG5SZWZJZHhUcmFpbGluZyAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIHRyYWlsaW5nIGZyYW1lcyBsaXN0KSwgQiBmcmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0CisgKiAgblJlZklkeEZvcndhcmQgICAgICAgICAgICA6IFBpYyBwYXJhbSBzZXQgcmVmIGZyYW1lIGluZGV4IChpbmRleCBpbnRvIHJlZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIgb2YgZm9yd2FyZCBmcmFtZXMgbGlzdCksIEIgZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAorICogIGJFbmFibGVVRVAgICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSB1bmVxdWFsIGVycm9yIHByb3RlY3Rpb24uIFRoaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdmFsaWQgb2YgZGF0YSBwYXJ0aXRpb25pbmcgaXMgZW5hYmxlZC4KKyAqICBiRW5hYmxlRk1PICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZworICogIGJFbmFibGVBU08gICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBhcmJpdHJhcnkgc2xpY2Ugb3JkZXJpbmcKKyAqICBiRW5hYmxlUlMgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc2VuZGluZyBvZiByZWR1bmRhbnQgc2xpY2VzCisgKiAgZVByb2ZpbGUgICAgICAgICAgICAgICAgICA6IEFWQyBwcm9maWxlKHMpIHRvIHVzZQorICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICAgOiBBVkMgbGV2ZWwocykgdG8gdXNlCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiAgYkZyYW1lTUJzT25seSAgICAgICAgICAgICA6IHNwZWNpZmllcyB0aGF0IGV2ZXJ5IGNvZGVkIHBpY3R1cmUgb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCB2aWRlbyBzZXF1ZW5jZSBpcyBhIGNvZGVkIGZyYW1lIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIG9ubHkgZnJhbWUgbWFjcm9ibG9ja3MKKyAqICBiTUJBRkYgICAgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc3dpdGNoaW5nIGJldHdlZW4gZnJhbWUgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYWNyb2Jsb2NrcyB3aXRoaW4gYSBwaWN0dXJlCisgKiAgYkVudHJvcHlDb2RpbmdDQUJBQyAgICAgICA6IEVudHJvcHkgZGVjb2RpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4IGVsZW1lbnRzIGZvciB3aGljaCB0d28gZGVzY3JpcHRvcnMgYXBwZWFyIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3ludGF4IHRhYmxlcworICogIGJXZWlnaHRlZFBQcmVkaWN0aW9uICAgICAgOiBFbmFibGUvZGlzYWJsZSB3ZWlnaHRlZCBwcmVkaWN0aW9uIHNoYWxsIG5vdCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0byBQIGFuZCBTUCBzbGljZXMKKyAqICBuV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlIDogRGVmYXVsdCB3ZWlnaHRlZCBwcmVkaWN0aW9uIGlzIGFwcGxpZWQgdG8gQiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIAorICogIGJjb25zdElwcmVkICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBpbnRyYSBwcmVkaWN0aW9uCisgKiAgYkRpcmVjdDh4OEluZmVyZW5jZSAgICAgICA6IFNwZWNpZmllcyB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIGRlcml2YXRpb24gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZm9yIGx1bWEgbW90aW9uIHZlY3RvcnMgZm9yIEJfU2tpcCwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfRGlyZWN0XzE2eDE2IGFuZCBCX0RpcmVjdF84eDggYXMgc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzdWJjbGF1c2UgOC40LjEuMiBvZiB0aGUgQVZDIHNwZWMgCisgKiAgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAgICA6IEZsYWcgaW5kaWNhdGluZyBzcGF0aWFsIG9yIHRlbXBvcmFsIGRpcmVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHVzZWQgaW4gQiBzbGljZSBjb2RpbmcgKHJlbGF0ZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBjb21tb24gYW5kIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KKyAqICBuQ2FiYWNJbml0SWR4ICAgICAgICAgICAgIDogSW5kZXggdXNlZCB0byBpbml0IENBQkFDIGNvbnRleHRzCisgKiAgZUxvb3BGaWx0ZXJNb2RlICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGxvb3AgZmlsdGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TbGljZUhlYWRlclNwYWNpbmc7ICAKKyAgICBPTVhfVTMyIG5QRnJhbWVzOyAgICAgCisgICAgT01YX1UzMiBuQkZyYW1lczsgICAgIAorICAgIE9NWF9CT09MIGJVc2VIYWRhbWFyZDsKKyAgICBPTVhfVTMyIG5SZWZGcmFtZXM7ICAKKwlPTVhfVTMyIG5SZWZJZHgxMEFjdGl2ZU1pbnVzMTsKKwlPTVhfVTMyIG5SZWZJZHgxMUFjdGl2ZU1pbnVzMTsKKyAgICBPTVhfQk9PTCBiRW5hYmxlVUVQOyAgCisgICAgT01YX0JPT0wgYkVuYWJsZUZNTzsgIAorICAgIE9NWF9CT09MIGJFbmFibGVBU087ICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlUlM7ICAgCisgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIGVQcm9maWxlOworCU9NWF9WSURFT19BVkNMRVZFTFRZUEUgZUxldmVsOyAKKyAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOyAgCisJT01YX0JPT0wgYkZyYW1lTUJzT25seTsgICAgICAgIAkJCQkJCQkJCQorICAgIE9NWF9CT09MIGJNQkFGRjsgICAgICAgICAgICAgICAKKyAgICBPTVhfQk9PTCBiRW50cm9weUNvZGluZ0NBQkFDOyAgCisgICAgT01YX0JPT0wgYldlaWdodGVkUFByZWRpY3Rpb247IAorICAgIE9NWF9VMzIgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZTsgCisgICAgT01YX0JPT0wgYmNvbnN0SXByZWQgOworICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7ICAKKwlPTVhfQk9PTCBiRGlyZWN0U3BhdGlhbFRlbXBvcmFsOworCU9NWF9VMzIgbkNhYmFjSW5pdElkYzsKKwlPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgZUxvb3BGaWx0ZXJNb2RlOworfSBPTVhfVklERU9fUEFSQU1fQVZDVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgeworICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAorICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAorICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIAorICAgT01YX1UzMiBlUHJvZmlsZTsgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFLCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGRlcGVuZGluZyBvbiBjb250ZXh0ICovCisgICBPTVhfVTMyIGVMZXZlbDsgICAgICAgIC8qKjwgdHlwZSBpcyBPTVhfVklERU9fQVZDTEVWRUxUWVBFLCBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLworICAgT01YX1UzMiBuUHJvZmlsZUluZGV4OyAvKio8IFVzZWQgdG8gcXVlcnkgZm9yIGluZGl2aWR1YWwgcHJvZmlsZSBzdXBwb3J0IGluZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYWxsIG90aGVyIGluZGljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gYmUgaWdub3JlZC4gKi8KK30gT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEU7CisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgZHluYW1pY2FsbHkgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KKyAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCisgKiAgbkVuY29kZUJpdHJhdGUgOiBUYXJnZXQgYXZlcmFnZSBiaXRyYXRlIHRvIGJlIGdlbmVyYXRlZCBpbiBicHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuRW5jb2RlQml0cmF0ZTsgICAgICAgICAgICAgICAgIAorfSBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFOworCisvKiogCisgKiBEZWZpbmVzIEVuY29kZXIgRnJhbWUgUmF0ZSBzZXR0aW5nCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIHhFbmNvZGVGcmFtZXJhdGUgOiBFbmNvZGluZyBmcmFtZXJhdGUgcmVwcmVzZW50ZWQgaW4gUTE2IGZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIHhFbmNvZGVGcmFtZXJhdGU7IC8qIFExNiBmb3JtYXQgKi8KK30gT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBJbnRyYVJlZnJlc2hWT1A7Cit9IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuRXJyTWFwU2l6ZTsgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIEVycm9yIE1hcCBpbiBieXRlcyAqLworICAgIE9NWF9VOCAgRXJyTWFwWzFdOyAgICAgICAgICAgICAvKiBFcnJvciBtYXAgaGludCAqLworfSBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiRW5hYmxlZDsKK30gT01YX0NPTkZJR19NQkVSUk9SUkVQT1JUSU5HVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbk1hY3JvYmxvY2tzOworfSBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFOworCisvKiogCisgKiBBVkMgU2xpY2UgTW9kZSBtb2RlcyAKKyAqCisgKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgICA6IE5vcm1hbCBmcmFtZSBlbmNvZGluZywgb25lIHNsaWNlIHBlciBmcmFtZQorICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNNQlNsaWNlICAgOiBOQUwgbW9kZSwgbnVtYmVyIG9mIE1CcyBwZXIgZnJhbWUKKyAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDQnl0ZVNsaWNlIDogTkFMIG1vZGUsIG51bWJlciBvZiBieXRlcyBwZXIgZnJhbWUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFIHsKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgPSAwLAorICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEU7CisKKy8qKiAKKyAqIEFWQyBGTU8gU2xpY2UgTW9kZSBQYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbk51bVNsaWNlR3JvdXBzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCisgKiAgblNsaWNlR3JvdXBNYXBUeXBlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlIGdyb3VwcworICogIGVTbGljZU1vZGUgOiBTcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc2xpY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VOCBuTnVtU2xpY2VHcm91cHM7CisgICAgT01YX1U4IG5TbGljZUdyb3VwTWFwVHlwZTsKKyAgICBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSBlU2xpY2VNb2RlOworfSBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU87CisKKy8qKiAKKyAqIEFWQyBJRFIgUGVyaW9kIENvbmZpZ3MKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuSURSUGVyaW9kIDogU3BlY2lmaWVzIHBlcmlvZGljaXR5IG9mIElEUiBmcmFtZXMKKyAqICBuUEZyYW1lcyA6IFNwZWNpZmllcyBpbnRlcm5hbCBvZiBjb2RpbmcgSW50cmEgZnJhbWVzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuSURSUGVyaW9kOworICAgIE9NWF9VMzIgblBGcmFtZXM7Cit9IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0Q7CisKKy8qKiAKKyAqIEFWQyBOQUwgU2l6ZSBDb25maWdzCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbk5hbHVCeXRlcyA6IFNwZWNpZmllcyB0aGUgTkFMIHVuaXQgc2l6ZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuTmFsdUJ5dGVzOworfSBPTVhfVklERU9fQ09ORklHX05BTFNJWkU7CisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9SRUFETUUgYi9pbmNsdWRlL3ByaXZhdGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ByaXZhdGUvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorVGhpcyBmb2xkZXIgY29udGFpbnMgcHJpdmF0ZSBpbmNsdWRlIGZpbGVzLgorCitUaGVzZSBpbmNsdWRlIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YKK3ZhcmlvdXMgZnJhbWV3b3JrIGNvbXBvbmVudHMuICBVc2UgYXQgeW91ciBwZXJpbC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhOTlhNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUQ0JBU0VTSEFSRURfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVENCQVNFU0hBUkVEX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2l6ZSBvZiBidWZmZXIgdXNlZCB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIG1lZGlhc2VydmVyIHByb2Nlc3Nlcy4KKyNkZWZpbmUgRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFIDEwMjQKKworCisvLyBTaGFyZWQgbWVtb3J5IGFyZWEgdXNlZCB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIG1lZGlhc2VydmVyCisvLyBwcm9jZXNzLgorc3RydWN0IGVmZmVjdF9wYXJhbV9jYmxrX3QKK3sKKyAgICAgICAgICAgICAgICBNdXRleCAgICAgICBsb2NrOworICAgIHZvbGF0aWxlICAgIHVpbnQzMl90ICAgIGNsaWVudEluZGV4OyAgICAvLyBDdXJyZW50IHJlYWQvd3JpdGUgaW5kZXggZm9yIGFwcGxpY2F0aW9uCisgICAgdm9sYXRpbGUgICAgdWludDMyX3QgICAgc2VydmVySW5kZXg7ICAgIC8vIEN1cnJlbnQgcmVhZC93cml0ZSBpbmRleCBmb3IgbWVkaWFzZXJ2ZXIKKyAgICAgICAgICAgICAgICB1aW50OF90KiAgICBidWZmZXI7ICAgICAgICAgLy8gc3RhcnQgb2YgcGFyYW1ldGVyIGJ1ZmZlcgorCisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX2NibGtfdCgpCisgICAgICAgICAgICAgICAgICAgIDogbG9jayhNdXRleDo6U0hBUkVEKSwgY2xpZW50SW5kZXgoMCksIHNlcnZlckluZGV4KDApIHt9Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfRUZGRUNUQ0JBU0VTSEFSRURfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggOGUyZGIyMC4uYzY5OTBiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC0zMiw2ICszMiwyMSBAQAogI2RlZmluZSBNQVhfUlVOX1RJTUVPVVRfTVMgICAgICAxMDAwCiAjZGVmaW5lIFdBSVRfUEVSSU9EX01TICAgICAgICAgIDEwCiAKKyNkZWZpbmUgQ0JMS19VTkRFUlJVTl9NU0sgICAgICAgMHgwMDAxCisjZGVmaW5lIENCTEtfVU5ERVJSVU5fT04gICAgICAgIDB4MDAwMSAgLy8gdW5kZXJydW4gKG91dCkgb3Igb3ZlcnJydW4gKGluKSBpbmRpY2F0aW9uCisjZGVmaW5lIENCTEtfVU5ERVJSVU5fT0ZGICAgICAgIDB4MDAwMCAgLy8gbm8gdW5kZXJydW4KKyNkZWZpbmUgQ0JMS19ESVJFQ1RJT05fTVNLICAgICAgMHgwMDAyCisjZGVmaW5lIENCTEtfRElSRUNUSU9OX09VVCAgICAgIDB4MDAwMiAgLy8gdGhpcyBjYmxrIGlzIGZvciBhbiBBdWRpb1RyYWNrCisjZGVmaW5lIENCTEtfRElSRUNUSU9OX0lOICAgICAgIDB4MDAwMCAgLy8gdGhpcyBjYmxrIGlzIGZvciBhbiBBdWRpb1JlY29yZAorI2RlZmluZSBDQkxLX0ZPUkNFUkVBRFlfTVNLICAgICAweDAwMDQKKyNkZWZpbmUgQ0JMS19GT1JDRVJFQURZX09OICAgICAgMHgwMDA0ICAvLyB0cmFjayBpcyBjb25zaWRlcmVkIHJlYWR5IGltbWVkaWF0ZWx5IGJ5IEF1ZGlvRmxpbmdlcgorI2RlZmluZSBDQkxLX0ZPUkNFUkVBRFlfT0ZGICAgICAweDAwMDAgIC8vIHRyYWNrIGlzIHJlYWR5IHdoZW4gYnVmZmVyIGZ1bGwKKyNkZWZpbmUgQ0JMS19JTlZBTElEX01TSyAgICAgICAgMHgwMDA4CisjZGVmaW5lIENCTEtfSU5WQUxJRF9PTiAgICAgICAgIDB4MDAwOCAgLy8gdHJhY2sgYnVmZmVyIGlzIGludmFsaWRhdGVkIGJ5IEF1ZGlvRmxpbmdlcjoKKyNkZWZpbmUgQ0JMS19JTlZBTElEX09GRiAgICAgICAgMHgwMDAwICAvLyBtdXN0IGJlIHJlLWNyZWF0ZWQKKyNkZWZpbmUgQ0JMS19ESVNBQkxFRF9NU0sgICAgICAgMHgwMDEwCisjZGVmaW5lIENCTEtfRElTQUJMRURfT04gICAgICAgIDB4MDAxMCAgLy8gdHJhY2sgZGlzYWJsZWQgYnkgQXVkaW9GbGluZ2VyIGR1ZSB0byB1bmRlcnJ1bjoKKyNkZWZpbmUgQ0JMS19ESVNBQkxFRF9PRkYgICAgICAgMHgwMDAwICAvLyBtdXN0IGJlIHJlLXN0YXJ0ZWQKIAogc3RydWN0IGF1ZGlvX3RyYWNrX2NibGtfdAogewpAQCAtNDQsMTIgKzU5LDEyIEBACiAgICAgdm9sYXRpbGUgICAgdWludDMyX3QgICAgc2VydmVyOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHVzZXJCYXNlOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHNlcnZlckJhc2U7Ci0gICAgdm9pZCogICAgICAgYnVmZmVyczsKLSAgICB1aW50MzJfdCAgICBmcmFtZUNvdW50OwotICAgIC8vIENhY2hlIGxpbmUgYm91bmRhcnkKLSAgICB1aW50MzJfdCAgICBsb29wU3RhcnQ7Ci0gICAgdWludDMyX3QgICAgbG9vcEVuZDsKLSAgICBpbnQgICAgICAgICBsb29wQ291bnQ7CisgICAgICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBmcmFtZUNvdW50OworICAgICAgICAgICAgICAgIC8vIENhY2hlIGxpbmUgYm91bmRhcnkKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBsb29wU3RhcnQ7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbG9vcEVuZDsKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsb29wQ291bnQ7CiAgICAgdm9sYXRpbGUgICAgdW5pb24gewogICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICB2b2x1bWVbMl07CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHZvbHVtZUxSOwpAQCAtNTgsMTUgKzczLDE3IEBACiAgICAgICAgICAgICAgICAgLy8gTk9URTogYXVkaW9fdHJhY2tfY2Jsa190OjpmcmFtZVNpemUgaXMgbm90IGVxdWFsIHRvIEF1ZGlvVHJhY2s6OmZyYW1lU2l6ZSgpIGZvcgogICAgICAgICAgICAgICAgIC8vIDggYml0IFBDTSBkYXRhOiBpbiB0aGlzIGNhc2UsICBtQ2Jsay0+ZnJhbWVTaXplIGlzIGJhc2VkIG9uIGEgc2FtcGxlIHNpemUgb2YKICAgICAgICAgICAgICAgICAvLyAxNiBiaXQgYmVjYXVzZSBkYXRhIGlzIGNvbnZlcnRlZCB0byAxNiBiaXQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiBidWZmZXIKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBmcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgZmxvd0NvbnRyb2xGbGFnOyAvLyB1bmRlcnJ1biAob3V0KSBvciBvdmVycnJ1biAoaW4pIGluZGljYXRpb24KLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBvdXQ7ICAgICAgICAvLyBvdXQgZXF1YWxzIDEgZm9yIEF1ZGlvVHJhY2sgYW5kIDAgZm9yIEF1ZGlvUmVjb3JkCi0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgZm9yY2VSZWFkeTsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgICAgZmxhZ3M7CisKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBidWZmZXJUaW1lb3V0TXM7IC8vIE1heGltdW0gY3VtdWxhdGVkIHRpbWVvdXQgYmVmb3JlIHJlc3RhcnRpbmcgYXVkaW9mbGluZ2VyCiAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgd2FpdFRpbWVNczsgICAgICAvLyBDdW11bGF0ZWQgd2FpdCB0aW1lCi0gICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeSAoMzIgYnl0ZXMpCiAKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBzZW5kTGV2ZWw7CisgICAgICAgICAgICAgICAgdWludDE2X3QgICAgcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeSAoMzIgYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc3RlcFVzZXIodWludDMyX3QgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RlcFNlcnZlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCmluZGV4IDljMzUyNzQuLjNhZmYwYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaApAQCAtMTIwLDYgKzEyMCw3IEBACiAgICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQ7CiAgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCiAgICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCisgICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgLy8gcm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKaW5kZXggOWI1YTFlMC4uZDZhZTVlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKQEAgLTQzLDI0ICs0Myw5IEBACiAgKiB1bmxlc3MgdGhleSBhcmUgaW4gdXNlIGJ5IHRoZSBzZXJ2ZXIsIHdoaWNoIGlzIG9ubHkgdGhlIGNhc2UgZm9yIHRoZSBsYXN0IAogICogZGVxdWV1ZS1hYmxlIGJ1ZmZlci4gV2hlbiB0aGVzZSB2YXJpb3VzIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSBjYWxsZXIKICAqIHdhaXRzIHVudGlsIHRoZSBjb25kaXRpb24gaXMgbWV0LgotICoKLSAqIAotICogQ0FWRUFUUzoKLSAqIAotICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhlcmUgYXJlIHNldmVyYWwgbGltaXRhdGlvbnM6Ci0gKiAtIGJ1ZmZlcnMgbXVzdCBiZSBsb2NrZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSd2ZSBiZWVuIGRlcXVldWVkCi0gKiAtIGJ1ZmZlcnMgbXVzdCBiZSBlbnF1ZXVlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGV5J3ZlIGJlZW4gbG9ja2VkCi0gKiAtIGRlcXVldWUoKSBpcyBub3QgcmVlbnRyYW50Ci0gKiAtIG5vIGVycm9yIGNoZWNrcyBhcmUgZG9uZSBvbiB0aGUgY29uZGl0aW9uIGFib3ZlCiAgKiAKICAqLwogCi0vLyBXaGVuIGNoYW5naW5nIHRoZXNlIHZhbHVlcywgdGhlIENPTVBJTEVfVElNRV9BU1NFUlQgYXQgdGhlIGVuZCBvZiB0aGlzCi0vLyBmaWxlIG5lZWQgdG8gYmUgdXBkYXRlZC4KLWNvbnN0IHVuc2lnbmVkIGludCBOVU1fTEFZRVJTX01BWCAgPSAzMTsKLWNvbnN0IHVuc2lnbmVkIGludCBOVU1fQlVGRkVSX01BWCAgPSA0OwotY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZX01BWCA9IDQ7Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgUmVnaW9uOwpAQCAtNjksNyArNTQsNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIHNob3VsZCBiZSAxMjggYnl0ZXMgKDMyIGxvbmdzKQogY2xhc3MgU2hhcmVkQnVmZmVyU3RhY2sKIHsKICAgICBmcmllbmQgY2xhc3MgU2hhcmVkQ2xpZW50OwpAQCAtNzgsMjIgKzYyLDQ0IEBACiAgICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlcjsKIAogcHVibGljOgotICAgIHN0cnVjdCBGbGF0UmVnaW9uIHsgLy8gMTIgYnl0ZXMKLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUkVDVF9NQVggPSAxOwotICAgICAgICB1aW50MzJfdCAgICBjb3VudDsKLSAgICAgICAgdWludDE2X3QgICAgcmVjdHNbNCpOVU1fUkVDVF9NQVhdOwotICAgIH07Ci0gICAgCisgICAgLy8gV2hlbiBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMsIHRoZSBDT01QSUxFX1RJTUVfQVNTRVJUIGF0IHRoZSBlbmQgb2YgdGhpcworICAgIC8vIGZpbGUgbmVlZCB0byBiZSB1cGRhdGVkLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0xBWUVSU19NQVggID0gMzE7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fQlVGRkVSX01BWCAgPSAxNjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9CVUZGRVJfTUlOICA9IDI7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fRElTUExBWV9NQVggPSA0OworCiAgICAgc3RydWN0IFN0YXRpc3RpY3MgeyAvLyA0IGxvbmdzCiAgICAgICAgIHR5cGVkZWYgaW50MzJfdCB1c2Vjc190OwogICAgICAgICB1c2Vjc190ICB0b3RhbFRpbWU7CiAgICAgICAgIHVzZWNzX3QgIHJlc2VydmVkWzNdOwogICAgIH07CisKKyAgICBzdHJ1Y3QgU21hbGxSZWN0IHsKKyAgICAgICAgdWludDE2X3QgbCwgdCwgciwgYjsKKyAgICB9OworCisgICAgc3RydWN0IEZsYXRSZWdpb24geyAvLyA1MiBieXRlcyA9IDQgKiAoMSArIDIqTikKKyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUkVDVF9NQVggPSA1OworICAgICAgICB1aW50MzJfdCAgICBjb3VudDsKKyAgICAgICAgU21hbGxSZWN0ICAgcmVjdHNbTlVNX1JFQ1RfTUFYXTsKKyAgICB9OworICAgIAorICAgIHN0cnVjdCBCdWZmZXJEYXRhIHsKKyAgICAgICAgRmxhdFJlZ2lvbiBkaXJ0eVJlZ2lvbjsKKyAgICAgICAgU21hbGxSZWN0ICBjcm9wOworICAgICAgICB1aW50OF90IHRyYW5zZm9ybTsKKyAgICAgICAgdWludDhfdCByZXNlcnZlZFszXTsKKyAgICB9OwogICAgIAogICAgIFNoYXJlZEJ1ZmZlclN0YWNrKCk7CiAgICAgdm9pZCBpbml0KGludDMyX3QgaWRlbnRpdHkpOwogICAgIHN0YXR1c190IHNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgcmVnKTsKKyAgICBzdGF0dXNfdCBzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIHJlZyk7CisgICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCBidWZmZXIsIHVpbnQ4X3QgdHJhbnNmb3JtKTsKICAgICBSZWdpb24gZ2V0RGlydHlSZWdpb24oaW50IGJ1ZmZlcikgY29uc3Q7CisgICAgUmVjdCBnZXRDcm9wKGludCBidWZmZXIpIGNvbnN0OworICAgIHVpbnQzMl90IGdldFRyYW5zZm9ybShpbnQgYnVmZmVyKSBjb25zdDsKIAogICAgIC8vIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHBhcnQgb2YgdGhlIGNvbmRpdGlvbnMvdXBkYXRlcwogICAgIHZvbGF0aWxlIGludDMyX3QgaGVhZDsgICAgICAvLyBzZXJ2ZXIncyBjdXJyZW50IGZyb250IGJ1ZmZlcgpAQCAtMTA0LDI0ICsxMTAsMjYgQEAKIAogICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBjb25kaXRpb25zCiAgICAgdm9sYXRpbGUgaW50MzJfdCByZWFsbG9jTWFzazsKKyAgICB2b2xhdGlsZSBpbnQ4X3QgaW5kZXhbTlVNX0JVRkZFUl9NQVhdOwogCiAgICAgaW50MzJfdCAgICAgaWRlbnRpdHk7ICAgICAgIC8vIHN1cmZhY2UncyBpZGVudGl0eSAoY29uc3QpCi0gICAgaW50MzJfdCAgICAgcmVzZXJ2ZWQzMls5XTsKKyAgICBpbnQzMl90ICAgICB0b2tlbjsgICAgICAgICAgLy8gc3VyZmFjZSdzIHRva2VuIChmb3IgZGVidWdnaW5nKQogICAgIFN0YXRpc3RpY3MgIHN0YXRzOwotICAgIEZsYXRSZWdpb24gIGRpcnR5UmVnaW9uW05VTV9CVUZGRVJfTUFYXTsgICAgLy8gMTIqND00OCBieXRlcworICAgIGludDhfdCAgICAgIGhlYWRCdWY7ICAgICAgICAvLyBsYXN0IHJldGlyZWQgYnVmZmVyCisgICAgdWludDhfdCAgICAgcmVzZXJ2ZWRCeXRlc1szXTsKKyAgICBpbnQzMl90ICAgICByZXNlcnZlZDsKKyAgICBCdWZmZXJEYXRhICBidWZmZXJzW05VTV9CVUZGRVJfTUFYXTsgICAgIC8vIDEwMjQgYnl0ZXMKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gNCBLQiBtYXgKKy8vIDMyIEtCIG1heAogY2xhc3MgU2hhcmVkQ2xpZW50CiB7CiBwdWJsaWM6CiAgICAgU2hhcmVkQ2xpZW50KCk7CiAgICAgflNoYXJlZENsaWVudCgpOwotCiAgICAgc3RhdHVzX3QgdmFsaWRhdGUoc2l6ZV90IHRva2VuKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRJZGVudGl0eShzaXplX3QgdG9rZW4pIGNvbnN0OwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlOwpAQCAtMTMxLDcgKzEzOSw3IEBACiAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgbG9jay1sZXNzIHByaW1pdGl2ZQogICAgIE11dGV4IGxvY2s7CiAgICAgQ29uZGl0aW9uIGN2OwotICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBOVU1fTEFZRVJTX01BWCBdOworICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0xBWUVSU19NQVggXTsKIH07CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEzOSwxOCArMTQ3LDE2IEBACiBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlCiB7CiBwdWJsaWM6Ci0gICAgU2hhcmVkQnVmZmVyQmFzZShTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsIGludCBudW0sCisgICAgU2hhcmVkQnVmZmVyQmFzZShTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsCiAgICAgICAgICAgICBpbnQzMl90IGlkZW50aXR5KTsKICAgICB+U2hhcmVkQnVmZmVyQmFzZSgpOwotICAgIHVpbnQzMl90IGdldElkZW50aXR5KCk7CiAgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEZyb250QnVmZmVyKCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRJZGVudGl0eSgpIGNvbnN0OwogICAgIFN0cmluZzggZHVtcChjaGFyIGNvbnN0KiBwcmVmaXgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgU2hhcmVkQ2xpZW50KiBjb25zdCBtU2hhcmVkQ2xpZW50OwogICAgIFNoYXJlZEJ1ZmZlclN0YWNrKiBjb25zdCBtU2hhcmVkU3RhY2s7Ci0gICAgY29uc3QgaW50IG1OdW1CdWZmZXJzOwogICAgIGNvbnN0IGludCBtSWRlbnRpdHk7CiAKICAgICBmcmllbmQgc3RydWN0IFVwZGF0ZTsKQEAgLTE2MCw2MSArMTY2LDIyIEBACiAgICAgICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjazsKICAgICAgICAgaW5saW5lIENvbmRpdGlvbkJhc2UoU2hhcmVkQnVmZmVyQmFzZSogc2JjKSAKICAgICAgICAgICAgIDogc3RhY2soKnNiYy0+bVNoYXJlZFN0YWNrKSB7IH0KKyAgICAgICAgdmlydHVhbCB+Q29uZGl0aW9uQmFzZSgpIHsgfTsKKyAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yKCkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0ID0gMDsKICAgICB9OworICAgIHN0YXR1c190IHdhaXRGb3JDb25kaXRpb24oY29uc3QgQ29uZGl0aW9uQmFzZSYgY29uZGl0aW9uKTsKIAogICAgIHN0cnVjdCBVcGRhdGVCYXNlIHsKICAgICAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrOwogICAgICAgICBpbmxpbmUgVXBkYXRlQmFzZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpIAogICAgICAgICAgICAgOiBzdGFjaygqc2JiLT5tU2hhcmVkU3RhY2spIHsgfQogICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCB3YWl0Rm9yQ29uZGl0aW9uKFQgY29uZGl0aW9uKTsKLQogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0YXR1c190IHVwZGF0ZUNvbmRpdGlvbihUIHVwZGF0ZSk7CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckJhc2U6OndhaXRGb3JDb25kaXRpb24oVCBjb25kaXRpb24pIAotewotICAgIGNvbnN0IFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIFNoYXJlZENsaWVudCYgY2xpZW50KCAqbVNoYXJlZENsaWVudCApOwotICAgIGNvbnN0IG5zZWNzX3QgVElNRU9VVCA9IHMybnMoMSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGNsaWVudC5sb2NrKTsKLSAgICB3aGlsZSAoKGNvbmRpdGlvbigpPT1mYWxzZSkgJiYKLSAgICAgICAgICAgIChzdGFjay5pZGVudGl0eSA9PSBtSWRlbnRpdHkpICYmCi0gICAgICAgICAgICAoc3RhY2suc3RhdHVzID09IE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jdi53YWl0UmVsYXRpdmUoY2xpZW50LmxvY2ssIFRJTUVPVVQpOwotICAgICAgICAKLSAgICAgICAgLy8gaGFuZGxlIGVycm9ycyBhbmQgdGltZW91dHMKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKGVyciAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAoaWRlbnRpdHk9JWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGNvbmRpdGlvbiBpcyB0cnVlISBXZSByZWNvdmVyZWQgYnV0IGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGRuJ3QgaGFwcGVuLiIgLCBUOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5pZGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1coIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKGlkZW50aXR5PSVkLCBzdGF0dXM9JWQpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIG1heSBiZSBwZWdnZWQuIHRyeWluZyBhZ2Fpbi4iLCBUOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5pZGVudGl0eSwgc3RhY2suc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR0UoIndhaXRGb3JDb25kaXRpb24oJXMpIGVycm9yICglcykgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFQ6Om5hbWUoKSwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChzdGFjay5pZGVudGl0eSAhPSBtSWRlbnRpdHkpID8gc3RhdHVzX3QoQkFEX0lOREVYKSA6IHN0YWNrLnN0YXR1czsKLX0KLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0YXR1c190IFNoYXJlZEJ1ZmZlckJhc2U6OnVwZGF0ZUNvbmRpdGlvbihUIHVwZGF0ZSkgewogICAgIFNoYXJlZENsaWVudCYgY2xpZW50KCAqbVNoYXJlZENsaWVudCApOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChjbGllbnQubG9jayk7CkBAIC0yMzUsMjQgKzIwMiwzOSBAQAogICAgIHN0YXR1c190IHVuZG9EZXF1ZXVlKGludCBidWYpOwogICAgIAogICAgIHN0YXR1c190IGxvY2soaW50IGJ1Zik7CisgICAgc3RhdHVzX3QgY2FuY2VsKGludCBidWYpOwogICAgIHN0YXR1c190IHF1ZXVlKGludCBidWYpOwogICAgIGJvb2wgbmVlZE5ld0J1ZmZlcihpbnQgYnVmZmVyKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyLCBjb25zdCBSZWdpb24mIHJlZyk7Ci0gICAgCisgICAgc3RhdHVzX3Qgc2V0Q3JvcChpbnQgYnVmZmVyLCBjb25zdCBSZWN0JiByZWcpOworICAgIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgYnVmZmVyLCB1aW50MzJfdCB0cmFuc2Zvcm0pOworCisgICAgY2xhc3MgU2V0QnVmZmVyQ291bnRDYWxsYmFjayB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQ7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlcmF0b3IoKShpbnQgYnVmZmVyQ291bnQpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgflNldEJ1ZmZlckNvdW50Q2FsbGJhY2soKSB7IH0KKyAgICB9OworICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCwgY29uc3QgU2V0QnVmZmVyQ291bnRDYWxsYmFjayYgaXBjKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IENvbmRpdGlvbjsKICAgICBmcmllbmQgc3RydWN0IERlcXVldWVDb25kaXRpb247CiAgICAgZnJpZW5kIHN0cnVjdCBMb2NrQ29uZGl0aW9uOwotICAgIAotICAgIGludDMyX3QgY29tcHV0ZVRhaWwoKSBjb25zdDsKIAogICAgIHN0cnVjdCBRdWV1ZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKICAgICAgICAgaW5saW5lIFF1ZXVlVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYik7CiAgICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKICAgICB9OwogCi0gICAgc3RydWN0IFVuZG9EZXF1ZXVlVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewotICAgICAgICBpbmxpbmUgVW5kb0RlcXVldWVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiKTsKKyAgICBzdHJ1Y3QgRGVxdWV1ZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKKyAgICAgICAgaW5saW5lIERlcXVldWVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiKTsKKyAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FuY2VsVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgeworICAgICAgICBpbnQgdGFpbCwgYnVmOworICAgICAgICBpbmxpbmUgQ2FuY2VsVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgaW50IHRhaWwsIGludCBidWYpOwogICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7CiAgICAgfTsKIApAQCAtMjYwLDI1ICsyNDIsMzMgQEAKIAogICAgIHN0cnVjdCBEZXF1ZXVlQ29uZGl0aW9uIDogcHVibGljIENvbmRpdGlvbkJhc2UgewogICAgICAgICBpbmxpbmUgRGVxdWV1ZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJDbGllbnQqIHNiYyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKTsKLSAgICAgICAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBuYW1lKCkgeyByZXR1cm4gIkRlcXVldWVDb25kaXRpb24iOyB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiRGVxdWV1ZUNvbmRpdGlvbiI7IH0KICAgICB9OwogCiAgICAgc3RydWN0IExvY2tDb25kaXRpb24gOiBwdWJsaWMgQ29uZGl0aW9uQmFzZSB7CiAgICAgICAgIGludCBidWY7CiAgICAgICAgIGlubGluZSBMb2NrQ29uZGl0aW9uKFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpOwotICAgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAiTG9ja0NvbmRpdGlvbiI7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0OworICAgICAgICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJMb2NrQ29uZGl0aW9uIjsgfQogICAgIH07CiAKKyAgICBpbnQzMl90IGNvbXB1dGVUYWlsKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIFJXTG9jayBtTG9jazsKKyAgICBpbnQgbU51bUJ1ZmZlcnM7CisKICAgICBpbnQzMl90IHRhaWw7CisgICAgaW50MzJfdCBxdWV1ZWRfaGVhZDsKICAgICAvLyBzdGF0aXN0aWNzLi4uCi0gICAgbnNlY3NfdCBtRGVxdWV1ZVRpbWVbTlVNX0JVRkZFUl9NQVhdOworICAgIG5zZWNzX3QgbURlcXVldWVUaW1lW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWF07CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlciA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlCitjbGFzcyBTaGFyZWRCdWZmZXJTZXJ2ZXIKKyAgICA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlLAorICAgICAgcHVibGljIExpZ2h0UmVmQmFzZTxTaGFyZWRCdWZmZXJTZXJ2ZXI+CiB7CiBwdWJsaWM6CiAgICAgU2hhcmVkQnVmZmVyU2VydmVyKFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LCBpbnQgc3VyZmFjZSwgaW50IG51bSwKQEAgLTI4NywxNiArMjc3LDc1IEBACiAgICAgc3NpemVfdCByZXRpcmVBbmRMb2NrKCk7CiAgICAgc3RhdHVzX3QgdW5sb2NrKGludCBidWZmZXIpOwogICAgIHZvaWQgc2V0U3RhdHVzKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgc3RhdHVzX3QgcmVhbGxvY2F0ZSgpOwotICAgIHN0YXR1c190IGFzc2VydFJlYWxsb2NhdGUoaW50IGJ1ZmZlcik7CisgICAgc3RhdHVzX3QgcmVhbGxvY2F0ZUFsbCgpOworICAgIHN0YXR1c190IHJlYWxsb2NhdGVBbGxFeGNlcHQoaW50IGJ1ZmZlcik7CiAgICAgaW50MzJfdCBnZXRRdWV1ZWRDb3VudCgpIGNvbnN0OwotICAgIAogICAgIFJlZ2lvbiBnZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyKSBjb25zdDsKKyAgICBSZWN0IGdldENyb3AoaW50IGJ1ZmZlcikgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtKGludCBidWZmZXIpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVzaXplKGludCBuZXdOdW1CdWZmZXJzKTsKIAogICAgIFNoYXJlZEJ1ZmZlclN0YWNrOjpTdGF0aXN0aWNzIGdldFN0YXRzKCkgY29uc3Q7CiAgICAgCiAKIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxTaGFyZWRCdWZmZXJTZXJ2ZXI+OworICAgIH5TaGFyZWRCdWZmZXJTZXJ2ZXIoKTsKKworICAgIC8qCisgICAgICogQnVmZmVyTGlzdCBpcyBiYXNpY2FsbHkgYSBmaXhlZC1jYXBhY2l0eSBzb3J0ZWQtdmVjdG9yIG9mCisgICAgICogdW5zaWduZWQgNS1iaXRzIGludHMgdXNpbmcgYSAzMi1iaXRzIGludCBhcyBzdG9yYWdlLgorICAgICAqIGl0IGhhcyBlZmZpY2llbnQgaXRlcmF0b3JzIHRvIGZpbmQgaXRlbXMgaW4gdGhlIGxpc3QgYW5kIG5vdCBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBjbGFzcyBCdWZmZXJMaXN0IHsKKyAgICAgICAgc2l6ZV90IG1DYXBhY2l0eTsKKyAgICAgICAgdWludDMyX3QgbUxpc3Q7CisgICAgcHVibGljOgorICAgICAgICBCdWZmZXJMaXN0KHNpemVfdCBjID0gU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYKQorICAgICAgICAgICAgOiBtQ2FwYWNpdHkoYyksIG1MaXN0KDApIHsgfQorICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHZhbHVlKTsKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlKGludCB2YWx1ZSk7CisgICAgICAgIHVpbnQzMl90IGdldE1hc2soKSBjb25zdCB7IHJldHVybiBtTGlzdDsgfQorCisgICAgICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIHsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJMaXN0OworICAgICAgICAgICAgdWludDMyX3QgbWFzaywgY3VycjsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKHVpbnQzMl90IG1hc2spIDoKKyAgICAgICAgICAgICAgICBtYXNrKG1hc2spLCBjdXJyKF9fYnVpbHRpbl9jbHoobWFzaykpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFzayA9PSByaHMubWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBjb25zdF9pdGVyYXRvciYgcmhzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hc2sgIT0gcmhzLm1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmxpbmUgaW50IG9wZXJhdG9yICooKSBjb25zdCB7IHJldHVybiBjdXJyOyB9CisgICAgICAgICAgICBpbmxpbmUgY29uc3QgY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yICsrKCkgeworICAgICAgICAgICAgICAgIG1hc2sgJj0gfigxPDwoMzEtY3VycikpOworICAgICAgICAgICAgICAgIGN1cnIgPSBfX2J1aWx0aW5fY2x6KG1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobUxpc3QpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigwKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZnJlZV9iZWdpbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAoMSA8PCAoMzItbUNhcGFjaXR5KSkgLSAxOworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCB+KG1MaXN0IHwgbWFzaykgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyB0aGlzIHByb3RlY3RzIG1OdW1CdWZmZXJzIGFuZCBtQnVmZmVyTGlzdAorICAgIG11dGFibGUgUldMb2NrIG1Mb2NrOworICAgIGludCBtTnVtQnVmZmVyczsKKyAgICBCdWZmZXJMaXN0IG1CdWZmZXJMaXN0OworCiAgICAgc3RydWN0IFVubG9ja1VwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKICAgICAgICAgY29uc3QgaW50IGxvY2tlZEJ1ZmZlcjsKICAgICAgICAgaW5saW5lIFVubG9ja1VwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIsIGludCBsb2NrZWRCdWZmZXIpOwpAQCAtMzE0LDEzICszNjMsNiBAQAogICAgICAgICBpbmxpbmUgU3RhdHVzVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgc3RhdHVzX3Qgc3RhdHVzKTsKICAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwogICAgIH07Ci0KLSAgICBzdHJ1Y3QgUmVhbGxvY2F0ZUNvbmRpdGlvbiA6IHB1YmxpYyBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgaW50IGJ1ZjsKLSAgICAgICAgaW5saW5lIFJlYWxsb2NhdGVDb25kaXRpb24oU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpOwotICAgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAiUmVhbGxvY2F0ZUNvbmRpdGlvbiI7IH0KLSAgICB9OwogfTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zNDQsMTMgKzM4NiwxMiBAQAogICAgIHVpbnQ4X3QgICAgICAgICBjb25uZWN0ZWQ7CiAgICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkWzNdOwogICAgIHVpbnQzMl90ICAgICAgICBwYWRbN107Ci0gICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW05VTV9ESVNQTEFZX01BWF07CisgICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fRElTUExBWV9NQVhdOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKFNoYXJlZENsaWVudCkgPD0gNDA5NikKLUNPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKFNoYXJlZEJ1ZmZlclN0YWNrKSA9PSAxMjgpCitDT01QSUxFX1RJTUVfQVNTRVJUKHNpemVvZihTaGFyZWRDbGllbnQpIDw9IDMyNzY4KQogQ09NUElMRV9USU1FX0FTU0VSVChzaXplb2Yoc3VyZmFjZV9mbGluZ2VyX2NibGtfdCkgPD0gNDA5NikKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZjU4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBFZmZlY3QgZmFjdG9yeSBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCUVmZmVjdHNGYWN0b3J5LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKQorTE9DQUxfTU9EVUxFOj0gbGliZWZmZWN0cworCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlhNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisKK3N0YXRpYyBsaXN0X2VsZW1fdCAqZ0VmZmVjdExpc3Q7IC8vIGxpc3Qgb2YgZWZmZWN0X2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgY3JlYXRlZCBlZmZlY3RzCitzdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorc3RhdGljIHVpbnQzMl90IGdOdW1FZmZlY3RzOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBudW1iZXIgb2YgZWZmZWN0cworc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyTGliOyAgICAvLyBjdXJyZW50IGxpYnJhcnkgaW4gZW51bWVyYXRpb24gcHJvY2Vzcworc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyRWZmZWN0OyAvLyBjdXJyZW50IGVmZmVjdCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCitzdGF0aWMgdWludDMyX3QgZ0N1ckVmZmVjdElkeDsgICAgICAgLy8gY3VycmVudCBlZmZlY3QgaW5kZXggaW4gZW51bWVyYXRpb24gcHJvY2VzcworCitjb25zdCBjaGFyICogY29uc3QgZ0VmZmVjdExpYlBhdGggPSAiL3N5c3RlbS9saWIvc291bmRmeCI7IC8vIHBhdGggdG8gYnVpbHQtaW4gZWZmZWN0IGxpYnJhcmllcworc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAorc3RhdGljIGludCBnTmV4dExpYklkOyAvLyB1c2VkIGJ5IGxvYWRMaWJyYXJ5KCkgdG8gYWxsb2NhdGUgdW5pcXVlIGxpYnJhcnkgaGFuZGxlcworc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGluaXQoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOworc3RhdGljIGludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpOworc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOworc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKK3N0YXRpYyBpbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp1dWlkLCBsaWJfZW50cnlfdCAqKmxpYiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOworc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBFZmZlY3RfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZWZmZWN0X2VudHJ5X3QgKmZ4ID0gKGVmZmVjdF9lbnRyeV90ICopc2VsZjsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBpZiAoZngtPmxpYiA9PSBOVUxMKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgICAgIHJldHVybiAtRVBJUEU7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKworICAgIHJldCA9ICgqZngtPnN1Ykl0ZmUpLT5wcm9jZXNzKGZ4LT5zdWJJdGZlLCBpbkJ1ZmZlciwgb3V0QnVmZmVyKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdF9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCit7CisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlZmZlY3RfZW50cnlfdCAqZnggPSAoZWZmZWN0X2VudHJ5X3QgKilzZWxmOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FUElQRTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworCisgICAgcmV0ID0gKCpmeC0+c3ViSXRmZSktPmNvbW1hbmQoZngtPnN1Ykl0ZmUsIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdJbnRlcmZhY2UgPSB7CisgICAgICAgIEVmZmVjdF9Qcm9jZXNzLAorICAgICAgICBFZmZlY3RfQ29tbWFuZAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgRmFjdG9yeSBJbnRlcmZhY2UgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHBOdW1FZmZlY3RzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgKnBOdW1FZmZlY3RzID0gZ051bUVmZmVjdHM7CisgICAgZ0NhblF1ZXJ5RWZmZWN0ID0gMTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgIExPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpOiAlZCIsICpwTnVtRWZmZWN0cyk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBpbnQgcmV0ID0gaW5pdCgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8CisgICAgICAgIGluZGV4ID49IGdOdW1FZmZlY3RzKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoZ0NhblF1ZXJ5RWZmZWN0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgcmV0ID0gLUVOT0VOVDsKKyAgICBpZiAoaW5kZXggPCBnQ3VyRWZmZWN0SWR4KSB7CisgICAgICAgIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKTsKKyAgICB9CisgICAgd2hpbGUgKGdDdXJMaWIpIHsKKyAgICAgICAgaWYgKGdDdXJFZmZlY3QpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBnQ3VyRWZmZWN0SWR4KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnQ3VyRWZmZWN0LT5vYmplY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ0N1ckVmZmVjdCA9IGdDdXJFZmZlY3QtPm5leHQ7CisgICAgICAgICAgICAgICAgZ0N1ckVmZmVjdElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ0N1ckxpYiA9IGdDdXJMaWItPm5leHQ7CisgICAgICAgICAgICBnQ3VyRWZmZWN0ID0gKChsaWJfZW50cnlfdCAqKWdDdXJMaWItPm9iamVjdCktPmVmZmVjdHM7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiAoTE9HX05ERUJVRyA9PSAwKQorICAgIGNoYXIgc3RyWzI1Nl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IocERlc2NyaXB0b3IsIHN0ciwgMjU2KTsKKyAgICBMT0dWKCJFZmZlY3RRdWVyeUVmZmVjdCgpIGRlc2M6JXMiLCBzdHIpOworI2VuZGlmCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisKKyAgICBpbnQgcmV0ID0gaW5pdCgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGQsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpCit7CisgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CisgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOworICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBpdGZlOworICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQ7CisKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHBJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csIHV1aWQtPnRpbWVNaWQsIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwgdXVpZC0+bm9kZVswXSwgdXVpZC0+bm9kZVsxXSx1dWlkLT5ub2RlWzJdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVszXSx1dWlkLT5ub2RlWzRdLHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0ID0gaW5pdCgpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgaW5pdCBlcnJvcjogJWQiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworCisgICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIGlmIChyZXQgPCAwKXsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIC8vIGNyZWF0ZSBlZmZlY3QgaW4gbGlicmFyeQorICAgIHJldCA9IGwtPmNyZWF0ZUZ4KHV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJml0ZmUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dXKCJFZmZlY3RDcmVhdGUoKSBsaWJyYXJ5ICVzOiBjb3VsZCBub3QgY3JlYXRlIGZ4ICVzLCBlcnJvciAlZCIsIGwtPnBhdGgsIGQtPm5hbWUsIHJldCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyBhZGQgZW50cnkgdG8gZWZmZWN0IGxpc3QKKyAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKW1hbGxvYyhzaXplb2YoZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBmeC0+c3ViSXRmZSA9IGl0ZmU7CisgICAgZngtPml0ZmUgPSAoc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKSZnSW50ZXJmYWNlOworICAgIGZ4LT5saWIgPSBsOworCisgICAgZSA9IChsaXN0X2VsZW1fdCAqKW1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBmeDsKKyAgICBlLT5uZXh0ID0gZ0VmZmVjdExpc3Q7CisgICAgZ0VmZmVjdExpc3QgPSBlOworCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KWZ4OworCisgICAgTE9HVigiRWZmZWN0Q3JlYXRlKCkgY3JlYXRlZCBlbnRyeSAlcCB3aXRoIHN1YiBpdGZlICVwIGluIGxpYnJhcnkgJXMiLCAqcEludGVyZmFjZSwgaXRmZSwgbC0+cGF0aCk7CisKK2V4aXQ6CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQoreworICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKKyAgICBsaXN0X2VsZW1fdCAqZTE7CisgICAgbGlzdF9lbGVtX3QgKmUyOworCisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIHJlbW92ZSBlZmZlY3QgZnJvbSBlZmZlY3QgbGlzdAorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGUxID0gZ0VmZmVjdExpc3Q7CisgICAgZTIgPSBOVUxMOworICAgIHdoaWxlIChlMSkgeworICAgICAgICBpZiAoZTEtPm9iamVjdCA9PSBpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgIGlmIChlMikgeworICAgICAgICAgICAgICAgIGUyLT5uZXh0ID0gZTEtPm5leHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdFZmZlY3RMaXN0ID0gZTEtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKWUxLT5vYmplY3Q7CisgICAgICAgICAgICBmcmVlKGUxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGUyID0gZTE7CisgICAgICAgIGUxID0gZTEtPm5leHQ7CisgICAgfQorICAgIGlmIChlMSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlIGVmZmVjdCBpbiBsaWJyYXJ5CisgICAgaWYgKGZ4LT5saWIgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJFZmZlY3RSZWxlYXNlKCkgZnggJXAgbGlicmFyeSBhbHJlYWR5IHVubG9hZGVkIiwgaW50ZXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmZ4LT5saWItPmxvY2spOworICAgICAgICBmeC0+bGliLT5yZWxlYXNlRngoZngtPnN1Ykl0ZmUpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgfQorICAgIGZyZWUoZngpOworCitleGl0OgorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdExvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGxpYlBhdGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXQgPSBsb2FkTGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOworICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0VW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB1bmxvYWRMaWJyYXJ5KGhhbmRsZSk7CisgICAgdXBkYXRlTnVtRWZmZWN0cygpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBFZmZlY3RJc051bGxVdWlkKGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaWYgKG1lbWNtcCh1dWlkLCBFRkZFQ1RfVVVJRF9OVUxMLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IGluaXQoKSB7CisgICAgc3RydWN0IGRpcmVudCAqZW50OworICAgIERJUiAqZGlyID0gTlVMTDsKKyAgICBjaGFyIGxpYnBhdGhbUEFUSF9NQVhdOworICAgIGludCBoZGw7CisKKyAgICBpZiAoZ0luaXREb25lKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ0xpYkxvY2ssIE5VTEwpOworCisgICAgLy8gbG9hZCBidWlsdC1pbiBsaWJyYXJpZXMKKyAgICBkaXIgPSBvcGVuZGlyKGdFZmZlY3RMaWJQYXRoKTsKKyAgICBpZiAoZGlyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHdoaWxlICgoZW50ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgIExPR1YoImluaXQoKSByZWFkaW5nIGZpbGUgJXMiLCBlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmICgoc3RybGVuKGVudC0+ZF9uYW1lKSA8IDMpIHx8CisgICAgICAgICAgICBzdHJuY21wKGVudC0+ZF9uYW1lLCAibGliIiwgMykgIT0gMCB8fAorICAgICAgICAgICAgc3RybmNtcChlbnQtPmRfbmFtZSArIHN0cmxlbihlbnQtPmRfbmFtZSkgLSAzLCAiLnNvIiwgMykgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGxpYnBhdGgsIGdFZmZlY3RMaWJQYXRoKTsKKyAgICAgICAgc3RyY2F0KGxpYnBhdGgsICIvIik7CisgICAgICAgIHN0cmNhdChsaWJwYXRoLCBlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmIChsb2FkTGlicmFyeShsaWJwYXRoLCAmaGRsKSA8IDApIHsKKyAgICAgICAgICAgIExPR1coImluaXQoKSBmYWlsZWQgdG8gbG9hZCBsaWJyYXJ5ICVzIixsaWJwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihkaXIpOworICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKKyAgICBnSW5pdERvbmUgPSAxOworICAgIExPR1YoImluaXQoKSBkb25lIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIHZvaWQgKmhkbDsKKyAgICBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgcXVlcnlOdW1GeDsKKyAgICBlZmZlY3RfUXVlcnlFZmZlY3RfdCBxdWVyeUZ4OworICAgIGVmZmVjdF9DcmVhdGVFZmZlY3RfdCBjcmVhdGVGeDsKKyAgICBlZmZlY3RfUmVsZWFzZUVmZmVjdF90IHJlbGVhc2VGeDsKKyAgICB1aW50MzJfdCBudW1GeDsKKyAgICB1aW50MzJfdCBmeDsKKyAgICBpbnQgcmV0OworICAgIGxpc3RfZWxlbV90ICplLCAqZGVzY0hlYWQgPSBOVUxMOworICAgIGxpYl9lbnRyeV90ICpsOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgICpoYW5kbGUgPSAwOworCisgICAgaGRsID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XKTsKKyAgICBpZiAoaGRsID09IDApIHsKKyAgICAgICAgTE9HVygiY291bGQgb3BlbiBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZnVuY3Rpb25zIGF2YWlsYWJpbGl0eQorICAgIHF1ZXJ5TnVtRnggPSAoZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190KWRsc3ltKGhkbCwgIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIpOworICAgIGlmIChxdWVyeU51bUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcXVlcnlGeCA9IChlZmZlY3RfUXVlcnlFZmZlY3RfdClkbHN5bShoZGwsICJFZmZlY3RRdWVyeUVmZmVjdCIpOworICAgIGlmIChxdWVyeUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeUVmZmVjdCBmcm9tIGxpYiAlcyIsIGxpYlBhdGgpOworICAgICAgICByZXQgPSAtRU5PREVWOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjcmVhdGVGeCA9IChlZmZlY3RfQ3JlYXRlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0Q3JlYXRlIik7CisgICAgaWYgKGNyZWF0ZUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RDcmVhdGUgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVsZWFzZUZ4ID0gKGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0UmVsZWFzZSIpOworICAgIGlmIChyZWxlYXNlRnggPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJjb3VsZCBub3QgZ2V0IEVmZmVjdFJlbGVhc2UgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBsb2FkIGVmZmVjdCBkZXNjcmlwdG9ycworICAgIHJldCA9IHF1ZXJ5TnVtRngoJm51bUZ4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZm9yIChmeCA9IDA7IGZ4IDwgbnVtRng7IGZ4KyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICBpZiAoZCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBxdWVyeUZ4KGZ4LCBkKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisjaWYgKExPR19OREVCVUc9PTApCisgICAgICAgICAgICBjaGFyIHNbMjU2XTsKKyAgICAgICAgICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgICAgICAgICBMT0dWKCJsb2FkTGlicmFyeSgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChkLT5hcGlWZXJzaW9uICE9IEVGRkVDVF9BUElfVkVSU0lPTikgeworICAgICAgICAgICAgICAgIExPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDR4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGxpYlBhdGgpOworICAgICAgICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZS0+b2JqZWN0ID0gZDsKKyAgICAgICAgICAgIGUtPm5leHQgPSBkZXNjSGVhZDsKKyAgICAgICAgICAgIGRlc2NIZWFkID0gZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAjICVkIG9uIGxpYiAlcyIsIGZ4LCBsaWJQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+aWQgPSArK2dOZXh0TGliSWQ7CisgICAgbC0+aGFuZGxlID0gaGRsOworICAgIHN0cm5jcHkobC0+cGF0aCwgbGliUGF0aCwgUEFUSF9NQVgpOworICAgIGwtPmNyZWF0ZUZ4ID0gY3JlYXRlRng7CisgICAgbC0+cmVsZWFzZUZ4ID0gcmVsZWFzZUZ4OworICAgIGwtPmVmZmVjdHMgPSBkZXNjSGVhZDsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOworCisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGUtPm9iamVjdCA9IGw7CisgICAgZ0xpYnJhcnlMaXN0ID0gZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAiLCBsKTsKKworICAgICpoYW5kbGUgPSBsLT5pZDsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBMT0dXKCJsb2FkTGlicmFyeSgpIGVycm9yOiAlZCBvbiBsaWI6ICVzIiwgcmV0LCBsaWJQYXRoKTsKKyAgICB3aGlsZSAoZGVzY0hlYWQpIHsKKyAgICAgICAgZnJlZShkZXNjSGVhZC0+b2JqZWN0KTsKKyAgICAgICAgZSA9IGRlc2NIZWFkLT5uZXh0OworICAgICAgICBmcmVlKGRlc2NIZWFkKTsKKyAgICAgICAgZGVzY0hlYWQgPSBlOzsKKyAgICB9CisgICAgZGxjbG9zZShoZGwpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCit7CisgICAgdm9pZCAqaGRsOworICAgIGludCByZXQ7CisgICAgbGlzdF9lbGVtX3QgKmVsMSwgKmVsMjsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBlZmZlY3RfZW50cnlfdCAqZng7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlbDEgPSBnTGlicmFyeUxpc3Q7CisgICAgZWwyID0gTlVMTDsKKyAgICB3aGlsZSAoZWwxKSB7CisgICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillbDEtPm9iamVjdDsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBsLT5pZCkgeworICAgICAgICAgICAgaWYgKGVsMikgeworICAgICAgICAgICAgICAgIGVsMi0+bmV4dCA9IGVsMS0+bmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ0xpYnJhcnlMaXN0ID0gZWwxLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShlbDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWwyID0gZWwxOworICAgICAgICBlbDEgPSBlbDEtPm5leHQ7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgaWYgKGVsMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIC8vIGNsZWFyIGVmZmVjdCBkZXNjcmlwdG9yIGxpc3QKKyAgICBlbDEgPSBsLT5lZmZlY3RzOworICAgIHdoaWxlIChlbDEpIHsKKyAgICAgICAgZnJlZShlbDEtPm9iamVjdCk7CisgICAgICAgIGVsMiA9IGVsMS0+bmV4dDsKKyAgICAgICAgZnJlZShlbDEpOworICAgICAgICBlbDEgPSBlbDI7CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBhbGwgZWZmZWN0cyBmcm9tIHRoaXMgbGlicmFyeQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbC0+bG9jayk7CisKKyAgICBlbDEgPSBnRWZmZWN0TGlzdDsKKyAgICB3aGlsZSAoZWwxKSB7CisgICAgICAgIGZ4ID0gKGVmZmVjdF9lbnRyeV90ICopZWwxLT5vYmplY3Q7CisgICAgICAgIGlmIChmeC0+bGliID09IGwpIHsKKyAgICAgICAgICAgIGZ4LT5saWIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsMSA9IGVsMS0+bmV4dDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmwtPmxvY2spOworCisgICAgZGxjbG9zZShsLT5oYW5kbGUpOworICAgIGZyZWUobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpCit7CisgICAgZ0N1ckxpYiA9IGdMaWJyYXJ5TGlzdDsKKyAgICBnQ3VyRWZmZWN0ID0gTlVMTDsKKyAgICBpZiAoZ0N1ckxpYikgeworICAgICAgICBnQ3VyRWZmZWN0ID0gKChsaWJfZW50cnlfdCAqKWdDdXJMaWItPm9iamVjdCktPmVmZmVjdHM7CisgICAgfQorICAgIGdDdXJFZmZlY3RJZHggPSAwOworfQorCit1aW50MzJfdCB1cGRhdGVOdW1FZmZlY3RzKCkgeworICAgIGxpc3RfZWxlbV90ICplOworICAgIHVpbnQzMl90IGNudCA9IDA7CisKKyAgICByZXNldEVmZmVjdEVudW1lcmF0aW9uKCk7CisKKyAgICBlID0gZ0xpYnJhcnlMaXN0OworICAgIHdoaWxlIChlKSB7CisgICAgICAgIGxpYl9lbnRyeV90ICpsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorICAgIGdOdW1FZmZlY3RzID0gY250OworICAgIGdDYW5RdWVyeUVmZmVjdCA9IDA7CisgICAgcmV0dXJuIGNudDsKK30KKworaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdXVpZCwgbGliX2VudHJ5X3QgKipsaWIsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQoreworICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OworICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKGUgJiYgIWZvdW5kKSB7CisgICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGxpc3RfZWxlbV90ICplZnggPSBsLT5lZmZlY3RzOworICAgICAgICB3aGlsZSAoZWZ4KSB7CisgICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillZngtPm9iamVjdDsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOworICAgICAgICByZXQgPSAtRU5PRU5UOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPnBhdGgpOworICAgICAgICAqbGliID0gbDsKKyAgICAgICAgKmRlc2MgPSBkOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7CisgICAgY2hhciBzWzI1Nl07CisKKyAgICBzbnByaW50ZihzdHIsIGxlbiwgIlxuRWZmZWN0IERlc2NyaXB0b3IgJXA6XG4iLCBkZXNjKTsKKyAgICBzcHJpbnRmKHMsICItIFVVSUQ6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgZGVzYy0+dXVpZC50aW1lTG93LCBkZXNjLT51dWlkLnRpbWVNaWQsIGRlc2MtPnV1aWQudGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICAgIGRlc2MtPnV1aWQuY2xvY2tTZXEsIGRlc2MtPnV1aWQubm9kZVswXSwgZGVzYy0+dXVpZC5ub2RlWzFdLGRlc2MtPnV1aWQubm9kZVsyXSwKKyAgICAgICAgICAgIGRlc2MtPnV1aWQubm9kZVszXSxkZXNjLT51dWlkLm5vZGVbNF0sZGVzYy0+dXVpZC5ub2RlWzVdKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKKyAgICBzcHJpbnRmKHMsICItIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgICAgIGRlc2MtPnR5cGUudGltZUxvdywgZGVzYy0+dHlwZS50aW1lTWlkLCBkZXNjLT50eXBlLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICAgICAgZGVzYy0+dHlwZS5jbG9ja1NlcSwgZGVzYy0+dHlwZS5ub2RlWzBdLCBkZXNjLT50eXBlLm5vZGVbMV0sZGVzYy0+dHlwZS5ub2RlWzJdLAorICAgICAgICAgICAgICAgIGRlc2MtPnR5cGUubm9kZVszXSxkZXNjLT50eXBlLm5vZGVbNF0sZGVzYy0+dHlwZS5ub2RlWzVdKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKKyAgICBzcHJpbnRmKHMsICItIGFwaVZlcnNpb246ICUwNFhcbi0gZmxhZ3M6ICUwOFhcbiIsCisgICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBkZXNjLT5mbGFncyk7CisgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CisgICAgc3ByaW50ZihzLCAiLSBuYW1lOiAlc1xuIiwgZGVzYy0+bmFtZSk7CisgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CisgICAgc3ByaW50ZihzLCAiLSBpbXBsZW1lbnRvcjogJXNcbiIsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU0M2NhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFNGQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBsaXN0X2VsZW1fcyB7CisgICAgdm9pZCAqb2JqZWN0OworICAgIHN0cnVjdCBsaXN0X2VsZW1fcyAqbmV4dDsKK30gbGlzdF9lbGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGxpYl9lbnRyeV9zIHsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBpbnQgaWQ7CisgICAgZWZmZWN0X0NyZWF0ZUVmZmVjdF90IGNyZWF0ZUZ4OworICAgIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgcmVsZWFzZUZ4OworICAgIGxpc3RfZWxlbV90ICplZmZlY3RzOyAvL2xpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3JfdAorICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOworfSBsaWJfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2VudHJ5X3MgeworICAgIHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2ludGVyZmFjZV90IHN1Ykl0ZmU7CisgICAgbGliX2VudHJ5X3QgKmxpYjsKK30gZWZmZWN0X2VudHJ5X3Q7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzQ3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3OSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgTXVzaWMgYnVuZGxlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIFwKKyAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIFwKKyAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIFwKKyAgICBCYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgXAorICAgIEJhc3Mvc3JjL0xWREJFX0luaXQuYyBcCisgICAgQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIFwKKyAgICBCYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fSW5pdC5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyBcCisgICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBcCisgICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBcCisgICAgRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBcCisgICAgRXEvc3JjL0xWRVFOQl9Jbml0LmMgXAorICAgIEVxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX1RhYmxlcy5jIFwKKyAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKKyAgICBDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuYyBcCisgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAorICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIFwKKyAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgXAorICAgIENvbW1vbi9zcmMvQWJzXzMyLmMgXAorICAgIENvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKKyAgICBDb21tb24vc3JjL211bHQzc18xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgXAorICAgIENvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jCisKK0xPQ0FMX01PRFVMRTo9IGxpYm11c2ljYnVuZGxlCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvRXEvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0VxL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9CYXNzL2xpYiBcCisgICAgJChMT0NBTF9QQVRIKS9CYXNzL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMgXAorICAgICQoTE9DQUxfUEFUSCkvQnVuZGxlL2xpYiBcCisgICAgJChMT0NBTF9QQVRIKS9CdW5kbGUvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIFJldmVyYiBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMgXAorICAgIFJldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIFwKKyAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKKyAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKKyAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKKyAgICBDb21tb24vc3JjL011bHQzc18zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgXAorICAgIENvbW1vbi9zcmMvQ29weV8xNi5jIFwKKyAgICBDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYyBcCisgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAorICAgIENvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9GT19IUEYuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgXAorICAgIENvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIFwKKyAgICBDb21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisKK0xPQ0FMX01PRFVMRTo9IGxpYnJldmVyYgorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKExPQ0FMX1BBVEgpL1JldmVyYi9saWIgXAorICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjg5NzdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgICAgICAgKi8KKy8qICBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICovCisvKiAgICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vdGU6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGFsZ29yaXRobSBhbHdheXMgcHJvY2Vzc2VzIGRhdGEgYXMgc3RlcmVvIGlucHV0LiBNb25vKi8KKy8qICBmb3JtYXQgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgQnl0ZSBPZmZzZXQgICAgICAgICBTdGVyZW8gSW5wdXQgICAgICAgICBNb25vLUluLVN0ZXJlbyBJbnB1dCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzEgICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzEgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMyICAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMyICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ubyBmb3JtYXQgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgY2FsbGluZyByb3V0aW5lIG11c3QgY29udmVydCBhIE1vbm8gc3RyZWFtICAgKi8KKy8qICAgIGluIHRvIE1vbm8tSW4tU3RlcmVvIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWREJFX0hfXworI2RlZmluZSBfX0xWREJFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lIExWREJFX05SX01FTU9SWV9SRUdJT05TICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBCYXNzIEVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCAqLworI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDNEQiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgICAgICAgICAgICA2CisjZGVmaW5lIExWREJFX0VGRkVDVF8wOURCICAgICAgICAgICAgOQorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAgICAgICAgICAgIDEyCisjZGVmaW5lIExWREJFX0VGRkVDVF8xNURCICAgICAgICAgICAgMTUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAgICAqTFZEQkVfSGFuZGxlX3Q7CisKKworLyogT3BlcmF0aW5nIG1vZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9PRkYgICAgICA9IDAsCisgICAgTFZEQkVfT04gICAgICAgPSAxLAorICAgIExWREJFX01PREVfTUFYID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9Nb2RlX2VuOworCisKKy8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWREJFX0hQRl9PRkYgPSAwLAorICAgIExWREJFX0hQRl9PTiAgPSAxLAorICAgIExWREJFX0hQRl9NQVggPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX0ZpbHRlclNlbGVjdF9lbjsKKworCisvKiBWb2x1bWUgY29udHJvbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfVk9MVU1FX09GRiA9IDAsCisgICAgTFZEQkVfVk9MVU1FX09OICA9IDEsCisgICAgTFZEQkVfVk9MVU1FX01BWCA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfVm9sdW1lX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfUEVSU0lTVEVOVCAgICAgID0gMCwKKyAgICBMVkRCRV9QRVJTSVNURU5UX0RBVEEgPSAxLAorICAgIExWREJFX1BFUlNJU1RFTlRfQ09FRiA9IDIsCisgICAgTFZEQkVfU0NSQVRDSCAgICAgICAgID0gMywKKyAgICBMVkRCRV9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCisKK30gTFZEQkVfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZEQkVfQUxJR05NRU5URVJST1IgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVkRCRV9OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZEQkVfU0laRUVSUk9SICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29ycmVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLworICAgIExWREJFX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9SZXR1cm5TdGF0dXNfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExpbmtlZCBlbnVtZXJhdGVkIHR5cGUgYW5kIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMgYXQgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXNhdGlvbiwgdGhlc2UgYXJlIGFkZGVkIHRvZ2V0aGVyIHRvIGdpdmUgdGhlIGNhcGFiaWxpdHkgd29yZC4gVGhlICAgICAgICAgICAqLworLyogIGVudW1lcmF0ZWQgdHlwZSBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbW9kZSB0aHJvdWdoIGEgY29udHJvbCBmdW5jdGlvbiBhdCBydW4gdGltZS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgY2FwYWJpbGl0eSBkZWZpbml0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIGVudW1lcmF0ZWQgdHlwZSB2YWx1ZSBieSB0aGUgZXF1YXRpb246ICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDYXBhYmlsaXR5X3ZhbHVlID0gMl5FbnVtZXJhdGVkX3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZvciBleGFtcGxlLCBhIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmQgYXQgaW5pdGlhbGlzYXRpb24gdG8gc3VwcG9ydCB0d28gc2FtcGxlICAgICovCisvKiAgcmF0ZXMgb25seSBieSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uIHdpdGggdGhlIHZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgPSBMVkRCRV9DQVBfMzIwMDAgKyBMVkNTX0RCRV80NDEwMDsgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgYW5kIGF0IHJ1biB0aW1lIGl0IHdvdWxkIGJlIHBhc3NlZCB0aGUgdmFsdWUgTFZEQkVfRlNfMzIwMDAgdGhyb3VnaCB0aGUgY29udHJvbCAgICAgKi8KKy8qICBmdW5jdGlvbiB0byBzZWxlY3Qgb3BlcmF0aW9uIGF0IDMya0h6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNTVIeiAgICAgICAxCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNjZIeiAgICAgICAyCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNzhIeiAgICAgICA0CisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfOTBIeiAgICAgICA4CisKK3R5cGVkZWYgZW51bQoreworICAgIExWREJFX0NFTlRSRV81NUhaID0gMCwKKyAgICBMVkRCRV9DRU5UUkVfNjZIWiA9IDEsCisgICAgTFZEQkVfQ0VOVFJFXzc4SFogPSAyLAorICAgIExWREJFX0NFTlRSRV85MEhaID0gMywKKyAgICBMVkRCRV9DRU5UUkVfTUFYICA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfQ2VudHJlRnJlcV9lbjsKKworCisvKgorICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKKyAqLworI2RlZmluZSBMVkRCRV9DQVBfRlNfODAwMCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExWREJFX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTYwMDAgICAgICAgICAgICAgICA4CisjZGVmaW5lIExWREJFX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfRlNfODAwMCAgPSAwLAorICAgIExWREJFX0ZTXzExMDI1ID0gMSwKKyAgICBMVkRCRV9GU18xMjAwMCA9IDIsCisgICAgTFZEQkVfRlNfMTYwMDAgPSAzLAorICAgIExWREJFX0ZTXzIyMDUwID0gNCwKKyAgICBMVkRCRV9GU18yNDAwMCA9IDUsCisgICAgTFZEQkVfRlNfMzIwMDAgPSA2LAorICAgIExWREJFX0ZTXzQ0MTAwID0gNywKKyAgICBMVkRCRV9GU180ODAwMCA9IDgsCisgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX0ZzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCisgICAgTFZEQkVfTWVtb3J5VHlwZXNfZW4gICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWREJFX01lbW9yeVJlZ2lvbl90OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZEQkVfTWVtb3J5UmVnaW9uX3QgICAgUmVnaW9uW0xWREJFX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVkRCRV9NZW1UYWJfdDsKKworCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWREJFX01vZGVfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisgICAgTFZEQkVfRnNfZW4gICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsKKyAgICBMVkRCRV9DZW50cmVGcmVxX2VuICAgICBDZW50cmVGcmVxdWVuY3k7CisgICAgTFZEQkVfRmlsdGVyU2VsZWN0X2VuICAgSFBGU2VsZWN0OworICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKworfSBMVkRCRV9QYXJhbXNfdDsKKworCisvKiBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSBjYXBhYmlsaXRpZXMgKi8KKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIENlbnRyZUZyZXF1ZW5jeTsgICAgICAgICAgLyogQ2VudHJlIGZyZXF1ZW5jeSBjYXBhYmlsaXRpZXMgKi8KKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLworfSBMVkRCRV9DYXBhYmlsaXRpZXNfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCisvKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCisvKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAqLworLyogICAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAqLworLyogICAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICovCisvKiAgICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICAgIExWREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAqLworLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCisvKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXF1ZXN0IHRoZSBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgKi8KKy8qICAgIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0Q2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmVxdWVzdCB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGNhcGFiaWxpdGllcy4gVGhlIGluaXRpYWwgY2FwYWJpbGl0aWVzIGFyZSAgICovCisvKiAgcmV0dXJuZWQgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdGl5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkRCRV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gQ2hhbmdpbmcgdGhlIHBhcmFtZXRlcnMgd2hpbGUgdGhlICAqLworLyogIG1vZHVsZSBpcyBwcm9jZXNzaW5nIHNpZ25hbHMgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWRlIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZW5lcmFsIHBhcmFtZXRlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT3BlcmF0aW5nTW9kZTogICAgICBDaGFuZ2luZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gbWF5IGNhdXNlIGEgY2hhbmdlIGluIHZvbHVtZSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlUmF0ZTogICAgICAgICBDaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcy4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVmZmVjdExldmVsOiAgICAgICAgQ2hhbmdpbmcgdGhlIGVmZmVjdCBsZXZlbCBzZXR0aW5nIHdpbGwgaGF2ZSBubyBzaWRlIGVmZmVjdHMgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDZW50cmVGcmVxdWVuY3k6ICAgIENoYW5naW5nIHRoZSBjZW50cmUgZnJlcXVlbmN5IG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSFBGU2VsZWN0OiAgICAgICAgICBTZWxlY3RpbmcvZGUtc2VsZWN0aW5nIHRoZSBoaWdoIHBhc3MgZmlsdGVyIG1heSBjYXVzZSBwb3BzIGFuZCAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGNsaWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lZEIgICAgICAgICAgICBDaGFuZ2luZyB0aGUgdm9sdW1lIHNldHRpbmcgd2lsbCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExWREJFX1RPT01BTllTQU1QTEVTICAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZEQkVfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNzg2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWREJFX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkRCRV9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZEQkVfU0NBTEVTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaWdoIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyOTU1NjMyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU4ODQ5ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDU5MTEyNjU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTE3Njk4ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDI5NTU2MzI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTg4NDkgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwODE5ODYzNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzkwMDEgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTAxODM5MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0MDgwNyAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzODIxMDgzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY2OTA5ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDc2NDIxNjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTMzODE4ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM4MjEwODMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjY5MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTk5NTA3MTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTU3MzIgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjcyMzg0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1NjY5MCAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDA3OTk0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY4NjUwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDgwMTU5ODg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTM3MzAwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQwMDc5OTQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Njg2NTAgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDM4MTE3MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTkzMjcgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzA5NDA0NzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MDEzOCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0NTM4MTk4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczNTg4ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDkwNzYzOTc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ3MTc2ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ1MzgxOTg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzM1ODggKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTQ3Mjc3OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Njk0OTQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDE0NzgxNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTk1MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0OTc2NjUyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc3NjcxICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk5NTMzMDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU1MzQzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ5NzY2NTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc2NzEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjM3MTQzODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzc4NjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTAyMzI3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3ODEwNSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDcxMTA1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4NTUxICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAxNDIyMTAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU3MTAyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUwNzExMDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzg1NTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjU2NDU0OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzk2NjIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTIxMjM1MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTg2NiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzM4NTc1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMDQyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA2NzcxNTE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYyMDg0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMzg1NzU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEwNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzExMDQ3OTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODQ3NDYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTc0ODY5NDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NDg2MSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTU5MjQ5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzMDk3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTExMTg0OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY2MTk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU1NTkyNDk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODMwOTcgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzU1OTg2NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODg5MzEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjE5MjIyNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4ODk5MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NjA2NzI3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzNTM5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTEyMTM0NTUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY3MDc5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU2MDY3Mjc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODM1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzY1NjQyOTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODk4MzEgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjI4Nzc3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4OTg4MiAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMyOTMyNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MzAxNiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMjA0NjU4NjU0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkwNjAzMiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzI5MzI3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMDE2ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDY4ODk2ODYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI2ODEwICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgOTk3OTMxMTEwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjkzOTYgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzM2MjQyMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MjYzOCAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA2NzI0ODQ1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyNTI3NSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzMzYyNDIyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyNjM4ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDkwNDQ4MDAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ2ODgxICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDE4MTgyMzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDgyNTYgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU4NTc2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDcxOCAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA3MTcxNTMyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyOTQzNSAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTg1NzY2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0NzE4ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk1MDgwMzMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUxMTk2ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDIyNTg3MTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTIzNTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIxOTc1MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MDYyMiAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA4NDM5NTA1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0MTI0NCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjE5NzUyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwNjIyICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA4MTc3OTEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYzMzk0ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MTQyNjkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQwNTIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDc0NDUxNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTUwOSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA5NDg5MDI4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MTAxOSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NzQ0NTE0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc1NTA5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTE4OTYxMDI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTczNDM2ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ1NTkzMTAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzM3ODQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYxNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjU2MyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA5NzE1MjM0OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MzEyNSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NjE3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2NTYzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTIxMjc4MjU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc1NTk0ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ3ODUyMzc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzU4ODkgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTE3ODAxMTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTU0NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwMzU2MDIzNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1OTA5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTc4MDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI3ODI5MTg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgxNjk1ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU0MjY1NjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODE4NjEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ0MjQ3MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjAxMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwODg0OTQ0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NDAxOSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDQyNDcyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyMDEwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMzMjIxNzIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2NzE4ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU5NTczOTkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODY4MDUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ5OTM4NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjU0MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwOTk4NzcwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NTA3OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDk5Mzg1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyNTQwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM0MzgwNDc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg3Nzk3ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYwNzE4MTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODc4NzEgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAxMDE2NTA0MjAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDY2OTMgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIwMzMwMDg0MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS44OTMzODcgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY1MDQyMDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NjY5MyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjA1NDYyMzM5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkxMzUxNyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDk4NDczMzg1MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTE3MTA1ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDI4NjQzNzQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc5OTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNTcyODc0ODIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MTU5OTggKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjg2NDM3NDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1Nzk5OSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4MDA4Mzc2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzNzIyOSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAwODM5MzkwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTM5MTQwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDMxMjcxMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjA0NDYgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNjI1NDIxMzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MjA4OTIgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzEyNzEwNjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MDQ0NiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4NTU1NzA0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0MjMyNiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAxMzU1MTYyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQzOTQ0ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDM4NzM0NjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjczOTcgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzc0NjkyNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzQ3OTQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzg3MzQ2MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NzM5NyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEwMTAzMzM4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1Njc0MCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAyODI3NTIyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU3NjU2ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ0OTE4NTg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzMxNTYgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODk4MzcxNjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDYzMTMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQ5MTg1ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MzE1NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExMzc3NTg1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2ODYwNyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDU1NTAwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY5MDkyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ2MjUyMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzQzOTggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTI1MDQzMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDg3OTcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDYyNTIxNjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDM5OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExNjUxNDIyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MTE1NyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzIxMjcxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxNTY4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUwMDMxMzAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc5MTggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDAwNjI2MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTU4MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTAwMzEzMDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NzkxOCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNDI1NTkwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3ODM2NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDc2MjYzOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4NTk5ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMTUyMjU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODA4MjQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDYzMDQ1MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjE2NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxNTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MDgyNCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMDYyODc0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NDMwMyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NzAxODE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg0NDI1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzODI0MDg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODE0NTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDc2NDgxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjI5MDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTM4MjQwODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTQ1MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMTk5ODE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NTU3OCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1ODM2NzIwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg1NjgxICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwOTc2MDA1MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQwNDEyICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDE5NTIwMTA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuODgwODI1ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDA5NzYwMDUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDA0MTIgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwNDAzNTcxMzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MDAyMzEgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICA5NzE3MTExMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkwNDk3NyAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzY4NzIxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMzgzICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDQ3Mzc0NDM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTA2NzY2ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDIzNjg3MjE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTMzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNjk3MjIzOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Mjc1NzkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA5OTg2OTk2MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzMDExMSAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjcwNDc1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU2MTkzICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDUzNDA5NTA4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTEyMzg3ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NzA0NzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTYxOTMgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzYwMzU5OTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzM0NTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDQ1OTU5MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzNTYwMyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTI4MzIyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0MTgzICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDcwNTY2NDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI4MzY1ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MjgzMjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQxODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTM4ODk4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTAwODcgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjE0NTMzMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MTMwMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjM5ODExNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwODA5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg0Nzk2MjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQxNjE4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQyMzk4MTE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzA4MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDg1OTEwNTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjM3NzggKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU1NDExODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDQyMyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzkzMzMwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcyMjM5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg3ODY2NjA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ0NDc3ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQzOTMzMzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzIyMzkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTE3NTA0OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjY3MjEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzg1OTM2MDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NzI2NiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODI4NTM5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2MjkyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk2NTcwNzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUyNTg0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4Mjg1MzkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzYyOTIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjA2ODI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzUwNDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDcyNzEyOTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTM0NyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTg4MTMzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NjQxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAzNzYyNjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU5MjgyICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUxODgxMzMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk2NDEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjgwMzU4MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODE4ODggKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ0Njg1MzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjA1MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MjY1NTYxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgwMzYyICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA1MzExMjM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYwNzI0ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUyNjU1NjE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODAzNjIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjk2MTU4NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODMzNTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTYwMjE0OTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzQ5NyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4NzUyNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwOTE5NyAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC05ODc1MjQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA5MTk3ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMTI1NTE5ODMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc5NTQ1ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzNzYyNjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEzOTMgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxODM5NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjY5MSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTgzOTUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2NjkxICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMxOTAxNjU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg1NDg4ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU5MjA3NTQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODY0NjQgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDY2MDM4NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjE1MCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC02NjAzODcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2MTUwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMzMjM4MDkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2NzMzICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYwMzgxMTQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODc1NTcgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5NjA1OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDYyMCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00OTYwNTkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0NjIwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM2OTQ5MDUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkwMTg5ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYzNzA1NzYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA2NTMgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MDQxMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzM1NyAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNjA0MTMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMzU3ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM5OTI5MDg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkyOTY0ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY2NDUwMDk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTMyMDkgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMTIyMDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzA4NSAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzEyMjA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMDg1ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQwNTYwNjA2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkzNTUyICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY3MDQwNzAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTM3NTkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ODYwOTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMjMxNSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNDg2MDkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAyMzE1ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQyMzI4OTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk1MTk5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY4NzEyMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUzMTYgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MDUxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMTY4MSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xODA1MTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAxNjgxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQzNzY1NzcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk2NTM3ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDcwMDg5NzcwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTY1OTkgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2ODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMTU0NSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjU4Njg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAxNTQ1ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQ0MDcyMjkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk2ODIzICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDcwMzg2MDM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTY4NzUgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNTgwMTg5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTI2NDggKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzU4MDE4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxMjY0OCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjExNzE2MTE3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MTc2MCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTA0NjI2Njk0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc0NDEyICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ODg4NTU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDkyMDkgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtOTg4ODU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwOTIwOSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNTk3MjczOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3OTk2NiAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzczNTY5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMzY4ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkxOTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDg0NjggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtOTA5MTk1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwODQ2OCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNzgxODAwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MTY4NSAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTM0NzM1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyODY5ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODMzNTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDYzNjQgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNjgzMzUyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjM2NCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMjk0MTczOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NjQ1NyAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1OTkxNjUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg3MTI0ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OTY3MzA5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQ2MjYgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNDk2NzMwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDYyNiAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNzA1NjAwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MDI4OCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MzY5MjE3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNjQxICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTY1NDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQyNTIgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNDU2NTQ0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDI1MiAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNzkyNzg0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MTEwMCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NDUwNTIwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkxMzk4ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNDI3NzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDMxOTIgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMzQyNzc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzE5MiAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0MDM2OTAwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MzM3NCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NjgwNjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzNTQxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDg5NDY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDIzMTggKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjQ4OTQ2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMjMxOCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0MjM1MjM0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NTIyMSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2ODcwNTI0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MzA5ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjg3NjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDIxMzEgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjI4NzYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMjEzMSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0Mjc3NTQzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NTYxNSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2OTExMzU4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1NjkwICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTk0MTE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE4NTcyICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk5NDExODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTg1NzIgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIxMDMxODY3NDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTg3NDUgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzMzOTc2NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MjQyNyAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxNDU0MzkzNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEzNTQ1ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTQ1NDM5MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTM1NDUgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTU5NjY2MzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzA2NDcgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQzMTcxMzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MjU5NiAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxMzM3Njk5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEyNDU4ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTMzNzY5OTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTI0NTggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTg2NTE3MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzMxNDggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDY2NzgwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDc5NSAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NDIyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MzczICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwNjQyMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDkzNzMgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjYxMjQzNDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODAxMDggKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMzODAzMDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTAzNyAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMyMTc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2ODE5ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTczMjE3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDY4MTkgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzIxNDM3NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODU3MTQgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTg5Mjg3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NjIwNCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjczMDY0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2MjY4ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTY3MzA2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDYyNjggKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzM0MjE2MDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODY5MDQgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjAxMjQ2NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NzMxOCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA1NTk2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NzA5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwNTU5NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQ3MDkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzcwMDM5NzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTAyNDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjM1MTI4MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDQ3MyAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzY3MzUxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzNDIxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2NzM1MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDM0MjEgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzk5MTkzOTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTI5NTUgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjYzMDk3MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzA3OCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM3NTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzMTQ0ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzNzU5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDMxNDQgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDA1NDE5MDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTM1MzUgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjY5MTE2NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzYzOSAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0Mzg1NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyMjc2MCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTI0NDM4NTQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDIyNzYwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDkyODAxMzQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ5MDczICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0Mjk4NzU3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTM5NTMgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4NDQzODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNjYxOSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTE3ODQ0Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDE2NjE5ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA4NjA0OTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYzNzkxICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM3NjM5Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjYzNzcgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTY0MTY3MDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNTI4OSAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NDE2NzA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDE1Mjg5ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTExOTIyOTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY2ODgyICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQwNTI4MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjkwNjcgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzNTk4ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMTUxMSAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzU5ODgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDExNTExICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTIxMTUyMTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc1NDc3ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NzM1ODE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzY3MTEgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5OTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwODM3OSAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC04OTk3MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA4Mzc5ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI4NTgwNzYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgyMzk1ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU1NTM5MTEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODMwNDcgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyNzE4MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNzcwNCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC04MjcxODE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA3NzA0ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMwMTU3MDEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgzODYzICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU3MDA2NjIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODQ0MTQgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyMTU5MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNTc4OSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC02MjE1OTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1Nzg5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM0NTc0NTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg3OTc3ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYxMTY2MDMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODgyODggKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1MTc2NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDIwNyAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTE3NjUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0MjA3ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM4MTY3OTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkxMzI0ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY0NjAxODk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTE0ODggKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxNTIwMjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzg2NyAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00MTUyMDI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzODY3ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM4OTM1MDAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkyMDM4ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY1MzQxNjIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTIxNzcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgdGltZSBjb25zdGFudHMgYW5kIGdhaW4gc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUdDIFRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3NTcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44NDEzOTUgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg5MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg4MjIyMyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTIwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODkxMjUxICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDU3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MTcyNzYgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA3NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzOTI2NyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDkzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ0MDYxICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxMzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc3NDUgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE3NTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTE1OCAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTgzOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxNjI4ICovCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwNDIgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAzMCAqLworI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDI4ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMjEgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAxNSAqLworI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDE0ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMTAgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwOCAqLworI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDA3ICovCisKKy8qIEFHQyBHYWluIHNldHRpbmdzICovCisjZGVmaW5lIEFHQ19HQUlOX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19UQVJHRVRMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMTcwMzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAwMDAwZEIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTA3Mzk3MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMjUzOCAqLworI2RlZmluZSBBR0NfR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU3MDA2MDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODQ4OTMgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI3NTQwNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEyMjAxOCAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwODkxNzc4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCisjZGVmaW5lIEFHQ19HQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5NTA0NzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNTg5MjUgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjcxNjM2OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTI2MiAqLworI2RlZmluZSBBR0NfR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDczOTcwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyNTM4ICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMyNTE2Njc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yMzg3MjEgKi8KKyNkZWZpbmUgQUdDX0dBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcwMDYwNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBBR0NfSFBGR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNTg0MzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCisjZGVmaW5lIEFHQ19HQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4OTE3Nzg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NzgyNzkgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODgxMTg0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjgxODM4MyAqLworI2RlZmluZSBBR0NfR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2NzE2MzY5MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MjYyICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgwNDMxOTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4xNjIyNzggKi8KKyNkZWZpbmUgQUdDX0dBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzI1MTY2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBBR0NfSFBGR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4NDAwOTQ4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCisjZGVmaW5lIEFHQ19HQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA1ODQzOTI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41MTE4ODYgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAyMjUzNDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjk4MTA3MiAqLworI2RlZmluZSBBR0NfR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ODExODQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuODE4MzgzICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTMwNjIxNjgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODA0MzE5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3NjkyODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCisjZGVmaW5lIEFHQ19HQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg0MDA5NDgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi41NDgxMzQgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDEwODgwNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLworI2RlZmluZSBBR0NfR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDIyNTM0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuOTgxMDcyICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI1Mjc3NzY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS4zMDk1NzMgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzA2MjE2ODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYzMTk0MjAzOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDYuMDc5NDU4ICovCisjZGVmaW5lIEFHQ19HQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDc2OTI4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NjM4MjMxNjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA2Ljk0MzI4MiAqLworI2RlZmluZSBBR0NfR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0MTA4ODA0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZvbHVtZSBjb250cm9sIGdhaW4gKi8KKyNkZWZpbmUgVk9MVU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKworLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU4ODkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyNDY5MCAqLworI2RlZmluZSBWT0xfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE3OTc3ICovCisjZGVmaW5lIFZPTF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MzMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTY1MjkgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMjQyMiAqLworI2RlZmluZSBWT0xfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ2OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MDI5ICovCisjZGVmaW5lIFZPTF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDgyOTkgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjIzMSAqLworI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NTI1ICovCisjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQxNTggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLworI2RlZmluZSBNSVhfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDIzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTIyNTQ4ICovCisjZGVmaW5lIE1JWF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Mjg0MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NTM4NyAqLworI2RlZmluZSBNSVhfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU5ODA0ICovCisjZGVmaW5lIE1JWF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI5NTYgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE4NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLworI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCisjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmE4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWREJFX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmVxdWVzdCB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgICAgICovCisvKiAgcmV0dXJuZWQgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0Q2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogRHluYW1pYyBCYXNzIEVuaG5hY2VtZW50IGNhcGFiaWxpdGllcy4gVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzIGFyZSAqLworLyogcmV0dXJuZWQgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldEZpbHRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhcnMgdGhlIGRhdGEgaGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOworCisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9DMzJfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfQzMyX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldEFHQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBBR0MgZ2FpbiBsZXZlbCBhbmQgYXR0YWNrIGFuZCBkZWNheSB0aW1lcyBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIC8qCisgICAgICogR2V0IHRoZSBhdHRhY2sgYW5kIGRlY2F5IHRpbWUgY29uc3RhbnRzCisgICAgICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0F0dGFjayA9IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBBdHRhY2sgbXVsdGlwbGllciAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19EZWNheSAgPSBMVkRCRV9BR0NfREVDQVlfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogRGVjYXkgbXVsdGlwbGVyICovCisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBib29zdCBnYWluCisgICAgICovCisgICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KKyAgICB9CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldFZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb252ZXJ0cyB0aGUgaW5wdXQgdm9sdW1lIGRlbWFuZCBmcm9tIGRCcyB0byBsaW5lYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIHZvbHVtZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERCRSAgICAgICAgIFZvbCBDb250cm9sICAgICAgICAgICBWb2x1bWUgc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA9PT0gICAgICAgICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICAgICAgSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgVm9sdW1lZEIrSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgICAgICBIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT24gICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBWb2x1bWVkQitIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIExWREJFX1NldFZvbHVtZShMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCisgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLworCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAocFBhcmFtcy0+Vm9sdW1lQ29udHJvbCA9PSBMVkRCRV9WT0xVTUVfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCisgICAgICAgICAqLworICAgICAgICBpZiAgKHBQYXJhbXMtPlZvbHVtZWRCID4gVk9MVU1FX01BWCkKKyAgICAgICAgeworICAgICAgICAgICAgVm9sdW1lID0gVk9MVU1FX01BWDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZvbHVtZWRCOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCisgICAgICovCisgICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCisKKworICAgIC8qCisgICAgICogV2hlbiBEQkUgaXMgZW5hYmxlZCB1c2UgQUdDIHZvbHVtZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9ICgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSA8PCAxNik7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID4+IGRCU2hpZnRzOworCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVNoaWZ0ID0gVk9MVU1FX1NISUZUKzE7CisKKyAgICAvKgorICAgICAqIFdoZW4gREJFIGlzIGRpc2FibGVkIHVzZSB0aGUgYnlwYXNzIHZvbHVtZSBjb250cm9sCisgICAgICovCisgICAgaWYoZEJTaGlmdHMgPiAwKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLCgoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pID4+IGRCU2hpZnRzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgfQorCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZEQkVfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIENoYW5naW5nIHRoZSBwYXJhbWV0ZXJzIHdoaWxlIHRoZSAgKi8KKy8qICBtb2R1bGUgaXMgcHJvY2Vzc2luZyBzaWduYWxzIG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgc2lkZSBlZmZlY3RzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2VuZXJhbCBwYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9wZXJhdGluZ01vZGU6ICAgICAgQ2hhbmdpbmcgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIG1heSBjYXVzZSBhIGNoYW5nZSBpbiB2b2x1bWUgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBvciBjYXVzZSBwb3BzIGFuZCBjbGlja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZVJhdGU6ICAgICAgICAgQ2hhbmdpbmcgdGhlIHNhbXBsZSByYXRlIG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFZmZlY3RMZXZlbDogICAgICAgIENoYW5naW5nIHRoZSBlZmZlY3QgbGV2ZWwgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcyAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2VudHJlRnJlcXVlbmN5OiAgICBDaGFuZ2luZyB0aGUgY2VudHJlIGZyZXF1ZW5jeSBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhQRlNlbGVjdDogICAgICAgICAgU2VsZWN0aW5nL2RlLXNlbGVjdGluZyB0aGUgaGlnaCBwYXNzIGZpbHRlciBtYXkgY2F1c2UgcG9wcyBhbmQgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBjbGlja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvbHVtZWRCICAgICAgICAgICAgQ2hhbmdpbmcgdGhlIHZvbHVtZSBzZXR0aW5nIHdpbGwgaGF2ZSBubyBzaWRlIGVmZmVjdHMgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgIT0gcFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIExWREJFX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBBR0MgaXMgdGhlIGVmZmVjdCBsZXZlbCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgIT0gcFBhcmFtcy0+RWZmZWN0TGV2ZWwpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgIT0gcFBhcmFtcy0+SFBGU2VsZWN0KSkKKyAgICB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworCisKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBWb2x1bWUgaWYgdGhlIHZvbHVtZSBkZW1hbmQgaGFzIGNoYW5nZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICE9IHBQYXJhbXMtPlZvbHVtZWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAhPSBwUGFyYW1zLT5IZWFkcm9vbWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkKKyAgICB7CisgICAgICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCk7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYpOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09OKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzA3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIgorI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLworLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLworLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0luc3RhbmNlX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWREJFX0lOU1RBTkNFX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGF0YSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9EYXRhX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29lZiBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLworLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCisvKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCisvKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KKy8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLworLyogICAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IG9uIGluY29ycmVjdCBhbGlnbm1lbnQgICAgICAgICAgICovCisvKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gICAgIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgKi8KKy8qICAgICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMi4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOworICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOworICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICBNaXhHYWluOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3M7CisgICAgfQorICAgIHBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyBhbmQgaW5jb3JyZWN0bHkgYWxpZ25lZCBkYXRhCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZEQkVfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfTlVMTEFERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgJSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5BbGlnbm1lbnQpIT0wKXsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfQUxJR05NRU5URVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICAgPSAgICBMVkRCRV9DRU5UUkVfNTVIWjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICAgICA9ICAgIDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAgICAgICAgPSAgICAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAgICAgICAgID0gICAgTFZEQkVfSFBGX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICA9ICAgIExWREJFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICA9ICAgIExWREJFX0ZTXzgwMDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAgICAgPSAgICBMVkRCRV9WT0xVTUVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICAgICAgICAgID0gICAgMDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQorICAgICAqLworICAgIHBJbnN0YW5jZS0+cERhdGEgPSBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgcEluc3RhbmNlLT5wQ29lZiA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0YXBzIGFuZCBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCisgICAgICovCisgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBiYXNzIGJvb3N0IHNldHRpbmcgKi8KKworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSB2b2x1bWUKKyAgICAgKi8KKyAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBWb2x1bWUgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLworCisgICAgcE1peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZTsKKyAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgbWl4ZXIgcHJvY2VzcyBwYXRoICovCisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDA7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGNsaWNrcyBtaW5pbWlzYXRpb24gQnlwYXNzTWl4ZXIKKyAgICAgKi8KKworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAorICAgICAqLworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MDsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwwLDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQyxwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCisgICAgICovCisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzlkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSGVhZGVyIGZpbGUgZm9yIHRoZSBwcml2YXRlIGxheWVyIGludGVyZmFjZSBvZiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZEQkVfUFJJVkFURV9IX18KKyNkZWZpbmUgX19MVkRCRV9QUklWQVRFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWREJFLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisjaW5jbHVkZSAiQUdDLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSAgICBMVkRCRV9JTlZBTElEICAgICAgICAgICAgMHhGRkZGICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAxICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAyICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLworCisjZGVmaW5lIExWREJFX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLworI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGRhdGEgKi8KKyNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBjb2VmICovCisjZGVmaW5lIExWREJFX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCisKKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisKKyNkZWZpbmUgTFZEQkVfTUlYRVJfVEMgICAgICAgICAgICAgICAgICAgNSAgICAgICAvKiBNaXhlciB0aW1lICAqLworI2RlZmluZSBMVkRCRV9CWVBBU1NfTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3Rfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworCit9IExWREJFX0RhdGFfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKworfSBMVkRCRV9Db2VmX3Q7CisKKy8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLworICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworCisgICAgLyogRGF0YSBhbmQgY29lZmZpY2llbnQgcG9pbnRlcnMgKi8KKyAgICBMVkRCRV9EYXRhX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCit9IExWREJFX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDc5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkFHQy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0YSBjYW4gYmUgcHJvY2Vzc2VkIGluIHR3byBmb3JtYXRzLCBzdGVyZW8gb3IgbW9uby1pbi1zdGVyZW8uIERhdGEgaW4gbW9ubyAgICAgICAgICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAgICAgICAgICovCisvKiAgbW9uby1pbi1zdGVyZW8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgIF9fX19fX19fICAgICAgICAgICovCisvKiAgICAgIHwgICAgICAgIHwgICAgX19fX18gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICB8ICAgfCAgICAgICAgfCAgICAgICAgICovCisvKiAgICAgIHwgMTYtYml0IHwgICB8ICAgICB8ICB8ICAgIF9fX19fX19fICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgfCAzMi1iaXQgfCAgICAgICAgICovCisvKiAtKy0tPnwgICB0byAgIHwtLT58IEhQRiB8LS18ICAgfCAgICAgICAgfCAgICBfX19fXyAgICB8IEFHQyBNaXhlciB8LS0+fCAgIHRvICAgfC0tfCAgICAgICovCisvKiAgfCAgIHwgMzItYml0IHwgICB8X19fX198ICB8ICAgfCBTdGVyZW8gfCAgIHwgICAgIHwgICB8ICAgICAgICAgICB8ICAgfCAxNi1iaXQgfCAgfCAgICAgICovCisvKiAgfCAgIHxfX19fX19fX3wgICAgICAgICAgICB8LS0+fCAgIHRvICAgfC0tPnwgQlBGIHwtLT58ICAgICAgICAgICB8ICAgfF9fX19fX19ffCAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTW9ubyAgfCAgIHxfX19fX3wgICB8X19fX19fX19fX198ICAgICAgICAgICAgICAgIFwtLT4gICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fICAgICAgICAgICAgICAgICAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IFZvbHVtZSAgfC0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRyb2wgfCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBtdXN0IGJlIDMyLWJpdCBmb3JtYXQuIFRoZSBpbnB1dCBpcyBzY2FsZWQgYnkgYSBzaGlmdCAgICAgICovCisvKiAgICAgd2hlbiBjb252ZXJ0aW5nIGZyb20gMTYtYml0IGZvcm1hdCwgdGhpcyBzY2FsaW5nIGFsbG93cyBmb3IgaW50ZXJuYWwgaGVhZHJvb20gaW4gdGhlICovCisvKiAgICAgYmFzcyBlbmhhbmNlbWVudCBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIHRoZSBjb252ZXJzdGlvbiB0byAzMi1iaXQgaXMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCAgICovCisvKiAgICAgdGhlIGhlYWRyb29tIGxvc3MuIFRoaXMgaGVhZHJvb20gbG9zcyBpcyBjb21wZW5zYXRlZCBpbiB0aGUgdm9sdW1lIGNvbnRyb2wgc28gdGhlICAgICovCisvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDMyICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwTW9ubzsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXQgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKworCisgICAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikoJnBTY3JhdGNoW051bVNhbXBsZXNdKTsKKworICAgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgICBwTW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZwU2NyYXRjaFsyKk51bVNhbXBsZXNdOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8CisgICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQorICAgICAgICAgKiAoRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIGFwcGx5IGhlYWRyb29tIGxvc3MgaGVyZSkKKyAgICAgICAgICovCisgICAgICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQorICAgICAgICB7CisgICAgICAgICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBNb25vLCAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICAgICAqLworICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAgICAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKKyAgICAgICAgICovCisgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwgICAgICAgICAgICAvKiBEZXN0LiAxNi1iaXQgZGF0YSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpLCAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgICAgfQorCisgICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpfHwKKyAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgICAqLworICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQyMjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2NvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzODAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTEwMjVfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMTAyNV9GYzU1X0ExLAorICAgICBIUEZfRnMxMTAyNV9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMiwKKyAgICAgLUhQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxMjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczEyMDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczEyMDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMjIwNTBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyMjA1MF9GYzU1X0ExLAorICAgICBIUEZfRnMyMjA1MF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMyNDAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczI0MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczI0MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczMyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzNDQxMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0NDEwMF9GYzU1X0ExLAorICAgICBIUEZfRnM0NDEwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnM0ODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczgwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczExMDI1X0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczExMDI1X0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxMjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxNjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxNjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczIyMDUwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMjQwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyNDAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMyNDAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMjQwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMzMjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMzMjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczQ0MTAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzNDgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0ODAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM3OF9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM3OF9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0hQRl9GczgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczgwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzODAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzODAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTEwMjVfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMTAyNV9GYzkwX0ExLAorICAgICBIUEZfRnMxMTAyNV9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTEwMjVfRmM5MF9CMiwKKyAgICAgLUhQRl9GczExMDI1X0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxMjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczEyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczEyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxMjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE2MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMjIwNTBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyMjA1MF9GYzkwX0ExLAorICAgICBIUEZfRnMyMjA1MF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMjIwNTBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczIyMDUwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMyNDAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczI0MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczI0MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMyNDAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczMyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczMyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzNDQxMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0NDEwMF9GYzkwX0ExLAorICAgICBIUEZfRnM0NDEwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzNDQxMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnM0ODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX19OworCisvKgorICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQorICovCitjb25zdCBCUF9DMzJfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX19OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KK2NvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW10gPSB7CisgICAgQUdDX0FUVEFDS19GczgwMDAsCisgICAgQUdDX0FUVEFDS19GczExMDI1LAorICAgIEFHQ19BVFRBQ0tfRnMxMjAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMTYwMDAsCisgICAgQUdDX0FUVEFDS19GczIyMDUwLAorICAgIEFHQ19BVFRBQ0tfRnMyNDAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMzIwMDAsCisgICAgQUdDX0FUVEFDS19GczQ0MTAwLAorICAgIEFHQ19BVFRBQ0tfRnM0ODAwMH07CisKKy8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisgICAgQUdDX0RFQ0FZX0ZzODAwMCwKKyAgICBBR0NfREVDQVlfRnMxMTAyNSwKKyAgICBBR0NfREVDQVlfRnMxMjAwMCwKKyAgICBBR0NfREVDQVlfRnMxNjAwMCwKKyAgICBBR0NfREVDQVlfRnMyMjA1MCwKKyAgICBBR0NfREVDQVlfRnMyNDAwMCwKKyAgICBBR0NfREVDQVlfRnMzMjAwMCwKKyAgICBBR0NfREVDQVlfRnM0NDEwMCwKKyAgICBBR0NfREVDQVlfRnM0ODAwMH07CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyAgICBBR0NfR0FJTl8wZEIsCisgICAgQUdDX0dBSU5fMWRCLAorICAgIEFHQ19HQUlOXzJkQiwKKyAgICBBR0NfR0FJTl8zZEIsCisgICAgQUdDX0dBSU5fNGRCLAorICAgIEFHQ19HQUlOXzVkQiwKKyAgICBBR0NfR0FJTl82ZEIsCisgICAgQUdDX0dBSU5fN2RCLAorICAgIEFHQ19HQUlOXzhkQiwKKyAgICBBR0NfR0FJTl85ZEIsCisgICAgQUdDX0dBSU5fMTBkQiwKKyAgICBBR0NfR0FJTl8xMWRCLAorICAgIEFHQ19HQUlOXzEyZEIsCisgICAgQUdDX0dBSU5fMTNkQiwKKyAgICBBR0NfR0FJTl8xNGRCLAorICAgIEFHQ19HQUlOXzE1ZEJ9OworCisvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisgICAgQUdDX0hQRkdBSU5fMGRCLAorICAgIEFHQ19IUEZHQUlOXzFkQiwKKyAgICBBR0NfSFBGR0FJTl8yZEIsCisgICAgQUdDX0hQRkdBSU5fM2RCLAorICAgIEFHQ19IUEZHQUlOXzRkQiwKKyAgICBBR0NfSFBGR0FJTl81ZEIsCisgICAgQUdDX0hQRkdBSU5fNmRCLAorICAgIEFHQ19IUEZHQUlOXzdkQiwKKyAgICBBR0NfSFBGR0FJTl84ZEIsCisgICAgQUdDX0hQRkdBSU5fOWRCLAorICAgIEFHQ19IUEZHQUlOXzEwZEIsCisgICAgQUdDX0hQRkdBSU5fMTFkQiwKKyAgICBBR0NfSFBGR0FJTl8xMmRCLAorICAgIEFHQ19IUEZHQUlOXzEzZEIsCisgICAgQUdDX0hQRkdBSU5fMTRkQiwKKyAgICBBR0NfSFBGR0FJTl8xNWRCfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdID0geworICAgIDB4NDAwMCwgICAgICAgICAgICAgLyogLTZkQiAqLworICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLworICAgIDB4NTBDMywgICAgICAgICAgICAgLyogLTRkQiAqLworICAgIDB4NUE5RSwgICAgICAgICAgICAgLyogLTNkQiAqLworICAgIDB4NjVBRCwgICAgICAgICAgICAgLyogLTJkQiAqLworICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLworICAgIDB4N0ZGRn07ICAgICAgICAgICAgLyogIDBkQiAqLworCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworICAgIFZPTF9UQ19GczgwMDAsCisgICAgVk9MX1RDX0ZzMTEwMjUsCisgICAgVk9MX1RDX0ZzMTIwMDAsCisgICAgVk9MX1RDX0ZzMTYwMDAsCisgICAgVk9MX1RDX0ZzMjIwNTAsCisgICAgVk9MX1RDX0ZzMjQwMDAsCisgICAgVk9MX1RDX0ZzMzIwMDAsCisgICAgVk9MX1RDX0ZzNDQxMDAsCisgICAgVk9MX1RDX0ZzNDgwMDB9OworCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CisgICAgTUlYX1RDX0ZzODAwMCwKKyAgICBNSVhfVENfRnMxMTAyNSwKKyAgICBNSVhfVENfRnMxMjAwMCwKKyAgICBNSVhfVENfRnMxNjAwMCwKKyAgICBNSVhfVENfRnMyMjA1MCwKKyAgICBNSVhfVENfRnMyNDAwMCwKKyAgICBNSVhfVENfRnMzMjAwMCwKKyAgICBNSVhfVENfRnM0NDEwMCwKKyAgICBNSVhfVENfRnM0ODAwMH07CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NmU2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19MVkJERV9UQUJMRVNfSF9fCisjZGVmaW5lIF9fTFZCREVfVEFCTEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUV9DMzJfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJQX0MzMl9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXTsKKworLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdOworCitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXTsKKworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZCREVfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTAsMCArMSw2MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpbnRlcmZhY2Ugb2YgQ29uY2VydCBTb3VuZCwgQmFzcyBFbmhhbmNlbWVudCwgKi8KKy8qICBFcXVhbGl6ZXIsIFBvd2VyIFNwZWN0cnVtIEFuYWx5emVyLCBUcmViYmxlIEVuaGFuY2VtZW50IGFuZCB2b2x1bWUgbWFuYWdlbWVudCAgICAgICAqLworLyogIGJ1bmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGNhbGxpbmcgbGF5ZXIuIEFsbCBvdGhlciB0eXBlcywgc3RydWN0dXJlcyBhbmQgICAgICAgICAgICovCisvKiAgZnVuY3Rpb25zIGFyZSBwcml2YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICAgKi8KKy8qICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGU6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaHJlZSBkYXRhIGZvcm1hdHMgYXJlIHN1cHBvcnQgU3RlcmVvLE1vbm8tSW4tU3RlcmVvIGFuZCBNb25vLiBUaGUgZGF0YSBpcyAgICAgICAgICAqLworLyogIGludGVybGVhdmVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXRlIE9mZnNldCAgICAgICAgIFN0ZXJlbyBJbnB1dCAgICAgICAgIE1vbm8tSW4tU3RlcmVvIElucHV0ICAgICAgIE1vbm8gSW5wdXQgICAgICAqLworLyogID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0gICAgID09PT09PT09PT09PT09ICAgICovCisvKiAgICAgIDAgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMSAgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgKi8KKy8qICAgICAgMiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMSAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAqLworLyogICAgICA0ICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzIgICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgIE1vbm8gU2FtcGxlICMzICAgICovCisvKiAgICAgIDYgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzIgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgTW9ubyBTYW1wbGUgIzQgICAgKi8KKy8qICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAqLworLyogICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX0hfXworI2RlZmluZSBfX0xWTV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUqLworI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBDb25jZXJ0IFNvdW5kIGVmZmVjdCBsZXZlbCBwcmVzZXRzICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogMCUgZWZmZWN0LCBtaW5pbXVtIHZhbHVlICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTE9XICAgICAgICAgICAgICAgICAxNjM4NCAgICAgLyogNTAlIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX01FRCAgICAgICAgICAgICAgICAgMjQ1NzYgICAgIC8qIDc1JSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9ISUdIICAgICAgICAgICAgICAgIDMyNzY3ICAgICAvKiAxMDAlIGVmZmVjdCwgbWF4aW11bSB2YWx1ZSAqLworCisvKiBUcmVibGUgZW5oYW5jZW1lbnQgKi8KKyNkZWZpbmUgTFZNX1RFX0xPV19NSVBTICAgICAgICAgICAgICAgICAgIDMyNzY3CisKKy8qIEJhc3MgZW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KKyNkZWZpbmUgTFZNX0JFXzBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwZEIgYm9vc3QsIG5vIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQkVfM0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgIC8qICszZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAvKiArNmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV85REIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgLyogKzlkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMTJEQiAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIC8qICsxMmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV8xNURCICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgLyogKzE1ZEIgYm9vc3QgKi8KKworLyogTi1CYW5kIEVxdWFsaXplciAqLworI2RlZmluZSBMVk1fRVFfTkJBTkRTICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlcXVhbGl6ZXIgKi8KKworLyogSGVhZHJvb20gbWFuYWdlbWVudCAqLworI2RlZmluZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAgICAgICAgICAgICAgIDUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5zdGFuY2UgaGFuZGxlICovCit0eXBlZGVmIHZvaWQgKkxWTV9IYW5kbGVfdDsKKworCisvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVk1fQUxJR05NRU5URVJST1IgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZNX05VTExBRERSRVNTICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgID0gNCwgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgTFZNX1dST05HQVVESU9USU1FICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCisgICAgTFZNX0FMR09SSVRITURJU0FCTEVEICA9IDYsICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KKyAgICBMVk1fQUxHT1JJVEhNUFNBICAgICAgID0gNywgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KKyAgICBMVk1fUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX1JldHVyblN0YXR1c19lbjsKKworCisvKiBCdWZmZXIgTWFuYWdlbWVudCBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fTUFOQUdFRF9CVUZGRVJTICAgPSAwLAorICAgIExWTV9VTk1BTkFHRURfQlVGRkVSUyA9IDEsCisgICAgTFZNX0JVRkZFUlNfRFVNTVkgICAgID0gTFZNX01BWEVOVU0KK30gTFZNX0J1ZmZlck1vZGVfZW47CisKKy8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAorICAgIExWTV9FWF9IRUFEUEhPTkVTICAgICAgICAgID0gMSwKKyAgICBMVk1fU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit9IExWTV9PdXRwdXREZXZpY2VUeXBlX2VuOworCisvKiBWaXJ0dWFsaXplciBtb2RlIHNlbGVjdGlvbiovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fQ09OQ0VSVFNPVU5EICAgICAgID0gMCwKKyAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuOworCisvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fRVFOQl9PRkYgICA9IDAsCisgICAgTFZNX0VRTkJfT04gICAgPSAxLAorICAgIExWTV9FUU5CX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0VRTkJfTW9kZV9lbjsKKworLyogQmFzcyBFbmhhbmNlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0JFX09GRiAgID0gMCwKKyAgICBMVk1fQkVfT04gICAgPSAxLAorICAgIExWTV9CRV9EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9CRV9Nb2RlX2VuOworCisvKiBCYXNzIEVuaGFuY2VtZW50IGNlbnRyZSBmcmVxdWVuY3kgc2VsZWN0aW9uIGNvbnRyb2wgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CRV9DRU5UUkVfNTVIeiAgPSAwLAorICAgIExWTV9CRV9DRU5UUkVfNjZIeiAgPSAxLAorICAgIExWTV9CRV9DRU5UUkVfNzhIeiAgPSAyLAorICAgIExWTV9CRV9DRU5UUkVfOTBIeiAgPSAzLAorICAgIExWTV9CRV9DRU5UUkVfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fQkVfQ2VudHJlRnJlcV9lbjsKKworLyogQmFzcyBFbmhhbmNlbWVudCBIUEYgc2VsZWN0aW9uIGNvbnRyb2wgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CRV9IUEZfT0ZGICAgPSAwLAorICAgIExWTV9CRV9IUEZfT04gICAgPSAxLAorICAgIExWTV9CRV9IUEZfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuOworCisvKiBWb2x1bWUgQ29udHJvbCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1ZDX09GRiAgID0gMCwKKyAgICBMVk1fVkNfT04gICAgPSAxLAorICAgIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9WQ19Nb2RlX2VuOworCisvKiBUcmVibGUgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9URV9PRkYgICA9IDAsCisgICAgTFZNX1RFX09OICAgID0gMSwKKyAgICBMVk1fVEVfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fVEVfTW9kZV9lbjsKKworLyogSGVhZHJvb20gbWFuYWdlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0hFQURST09NX09GRiAgID0gMCwKKyAgICBMVk1fSEVBRFJPT01fT04gICAgPSAxLAorICAgIExWTV9IZWFkcm9vbV9EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9IZWFkcm9vbV9Nb2RlX2VuOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fUFNBX1NQRUVEX1NMT1csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgc2xvdyBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfTUVESVVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVhayBkZWNheWluZyBhdCBtZWRpdW0gc3BlZWQgKi8KKyAgICBMVk1fUFNBX1NQRUVEX0ZBU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgZmFzdCBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fUFNBX0RlY2F5U3BlZWRfZW47CisKK3R5cGVkZWYgZW51bQoreworICAgIExWTV9QU0FfT0ZGICAgPSAwLAorICAgIExWTV9QU0FfT04gICAgPSAxLAorICAgIExWTV9QU0FfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fUFNBX01vZGVfZW47CisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgICpwVmVyc2lvbk51bWJlcjsgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb3JtYXQgWC5ZWS5aWiAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFBsYXRmb3JtOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBsaWJyYXJ5IHBsYXRmb3JtIHR5cGUgKi8KK30gTFZNX1ZlcnNpb25JbmZvX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWTV9NZW1UYWJfdDsKKworLyogTi1CYW5kIGVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGcmVxdWVuY3k7ICAgICAgICAgICAgICAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAoeDEwMCkgKi8KK30gTFZNX0VRTkJfQmFuZERlZl90OworCisKKy8qIEhlYWRyb29tIGJhbmQgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGltaXRfTG93OyAgICAgICAgICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMaW1pdF9IaWdoOyAgICAgICAgICAgICAvKiBIaWdoIGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBIZWFkcm9vbV9PZmZzZXQ7ICAgICAgICAvKiBIZWFkcm9vbSA9IGJpZ2dlc3QgYmFuZCBnYWluIC0gSGVhZHJvb21fT2Zmc2V0ICovCit9IExWTV9IZWFkcm9vbUJhbmREZWZfdDsKKworCisvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEJ1bmRsZSBvcGVyYXRpbmcgbW9kZSBPbi9CeXBhc3MgKi8KKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogSW5wdXQgZGF0YSBmb3JtYXQgKi8KKyAgICBMVk1fT3V0cHV0RGV2aWNlVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCisKKyAgICAvKiBDb25jZXJ0IFNvdW5kIFZpcnR1YWxpemVyIHBhcmFtZXRlcnMqLworICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBWaXJ0dWFsaXplck9wZXJhdGluZ01vZGU7IC8qIFZpcnR1YWxpemVyIG9wZXJhdGluZyBtb2RlIE9uL09mZiAqLworICAgIExWTV9WaXJ0dWFsaXplclR5cGVfZW4gICAgICBWaXJ0dWFsaXplclR5cGU7ICAgICAgICAgIC8qIFZpcnR1YWxpemVyIHR5cGU6IENvbmNlcnRTb3VuZCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBWaXJ0dWFsaXplclJldmVyYkxldmVsOyAgIC8qIFZpcnR1YWxpemVyIHJldmVyYiBsZXZlbCBpbiAlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIENTX0VmZmVjdExldmVsOyAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCBlZmZlY3QgbGV2ZWwgKi8KKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX01vZGVfZW4gICAgICAgICAgICBFUU5CX09wZXJhdGluZ01vZGU7ICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEVRTkJfTkJhbmRzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICAgICAqcEVRTkJfQmFuZERlZmluaXRpb247ICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLworCisgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0JFX01vZGVfZW4gICAgICAgICAgICAgIEJFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgQkVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KKyAgICBMVk1fQkVfQ2VudHJlRnJlcV9lbiAgICAgICAgQkVfQ2VudHJlRnJlcTsgICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0JFX0ZpbHRlclNlbGVjdF9lbiAgICAgIEJFX0hQRjsgICAgICAgICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgaGlnaCBwYXNzIGZpbHRlciBzZWxlY3RvciAqLworCisgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19FZmZlY3RMZXZlbDsgICAgICAgICAvKiBWb2x1bWUgQ29udHJvbCBzZXR0aW5nIGluIGRCcyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19CYWxhbmNlOyAgICAgICAgICAgICAvKiBMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiAoLTk2IHRvIDk2IGRCKSwgLXZlIHZhbHVlcyByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgY2hhbm5lbCB3aGlsZSArdmUgdmFsdWUgcmVkdWNlcyBMZWZ0IGNoYW5uZWwqLworCisgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fVEVfTW9kZV9lbiAgICAgICAgICAgICAgVEVfT3BlcmF0aW5nTW9kZTsgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IE9uL09mZiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBURV9FZmZlY3RMZXZlbDsgICAgICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgZ2FpbiBkQnMgKi8KKworICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIHBhcmFtZXRlcnMgQ29udHJvbCAqLworICAgIExWTV9QU0FfTW9kZV9lbiAgICAgICAgICAgICBQU0FfRW5hYmxlOworICAgIExWTV9QU0FfRGVjYXlTcGVlZF9lbiAgICAgICBQU0FfUGVha0RlY2F5UmF0ZTsgICAgICAvKiBQZWFrIHZhbHVlIGRlY2F5IHJhdGUqLworCit9IExWTV9Db250cm9sUGFyYW1zX3Q7CisKKworLyogSW5zdGFuY2UgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0J1ZmZlck1vZGVfZW4gICAgICAgICAgIEJ1ZmZlck1vZGU7ICAgICAgICAgICAgIC8qIEJ1ZmZlciBtYW5hZ2VtZW50IG1vZGUgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBwcm9jZXNzaW5nIGJsb2NrIHNpemUgKi8KKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRVFOQl9OdW1CYW5kczsgICAgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZXF1YWxpc2VyIGJhbmRzICovCisKKyAgICAvKiBQU0EgKi8KKyAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0luY2x1ZGVkOyAgICAgICAgICAgIC8qIENvbnRyb2xzIHRoZSBpbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgUFNBOiBPTi9PRkYgKi8KK30gTFZNX0luc3RQYXJhbXNfdDsKKworLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9IZWFkcm9vbV9Nb2RlX2VuICAgICAgICBIZWFkcm9vbV9PcGVyYXRpbmdNb2RlOyAvKiBIZWFkcm9vbSBDb250cm9sIE9uL09mZiAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICAgICAqcEhlYWRyb29tRGVmaW5pdGlvbjsgICAvKiBQb2ludGVyIHRvIGhlYWRyb29tIGJhbmRzIGRlZmluaXRpb24gKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkhlYWRyb29tQmFuZHM7ICAgICAgICAgLyogTnVtYmVyIG9mIGhlYWRyb29tIGJhbmRzICovCisKK30gTFZNX0hlYWRyb29tUGFyYW1zX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0VmVyc2lvbkluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpYnJhcnkncyB2ZXJzaW9uLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwVmVyc2lvbiAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIHdoZW4gcFZlcnNpb24gaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0VmVyc2lvbkluZm8oTFZNX1ZlcnNpb25JbmZvX3N0ICAqcFZlcnNpb24pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgICBXaGVuIGFueSBvZiB0aGUgSW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICpwSW5zdFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIGJ1bmRsZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIEluc3RhbmNlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgd2hlbiBhbnkgb2YgaEluc3RhbmNlIG9yIHBQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlLCBwUGFyYW1zIG9yIGFueSBjb250cm9sIHBvaW50ZXJzIGFyZSBOVUxMICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExpZmVWaWJlcyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgICAgICBBdWRpbyBUaW1lIG9mIHRoZSBjdXJyZW50IGlucHV0IGRhdGEgaW4gbWlsbGktc2Vjb25kcyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9JTlZBTElETlVNU0FNUExFUyAgV2hlbiB0aGUgTnVtU2FtcGxlcyBpcyBub3QgYSB2YWxpZWQgbXVsdGlwbGUgaW4gdW5tYW5hZ2VkICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fQUxJR05NRU5URVJST1IgICAgIFdoZW4gZWl0aGVyIHRoZSBpbnB1dCBvdXIgb3V0cHV0IGJ1ZmZlcnMgYXJlIG5vdCAzMi1iaXQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBpbiB1bm1hbmFnZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBOdW1iZXIgb2Ygc2FtcGxlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBNT05PICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE1PTk9JTlNURVJFTyAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGUgcGFpcnMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU1RFUkVPICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwYWlycyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAob3V0cHV0KSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcEhlYWRyb29tUGFyYW1zIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBTcGVjdHJhbCBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIEF1ZGlvIHRpbWUgICAgICAgICAqLworLyogZm9yIGRpc3BsYXkgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRQZWFrcyAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJyZW50cyBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgKi8KKy8qICBwUGFzdFBlYWtzICAgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHBhc3QgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICAgICAqLworLyogIHBDZW50cmVGcmVxcyAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgY2VudHJlIGZyZXF1ZW5jeSBvZiBlYWNoIGJhbmQgaXMgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2F2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgICAgICBBdWRpbyB0aW1lIGF0IHdoaWNoIHRoZSBzcGVjdHJhbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1dST05HQVVESU9USU1FICAgICAgRmFpbHVyZSBkdWUgdG8gYXVkaW8gdGltZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bSggTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwQ3VycmVudFBlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I3ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBTcGVjdHJhbCBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIEF1ZGlvIHRpbWUgICAgICAgICAqLworLyogZm9yIGRpc3BsYXkgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRQZWFrcyAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJyZW50cyBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgKi8KKy8qICBwUGFzdFBlYWtzICAgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHBhc3QgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgICAgIEF1ZGlvIHRpbWUgYXQgd2hpY2ggdGhlIHNwZWN0cmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgSWYgYW55IG9mIGlucHV0IGFkZHJlc3NlcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fV1JPTkdBVURJT1RJTUUgICAgICBGYWlsdXJlIGR1ZSB0byBhdWRpbyB0aW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFBhc3RQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICAqcEluc3RhbmNlICAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAqaFBTQUluc3RhbmNlOworICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgTFZQU0FfU3RhdHVzOworCisKKyAgICBpZihwSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCisgICAgeworICAgICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CisgICAgfQorCisgICAgaFBTQUluc3RhbmNlID0gcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CisKKyAgICBpZigocEN1cnJlbnRQZWFrcyA9PSBMVk1fTlVMTCkgfHwKKyAgICAgICAgKHBQYXN0UGVha3MgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKiBJZiBQU0EgbW9kdWxlIGlzIGRpc2FibGVkLCBkbyBub3RoaW5nICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZT09TFZNX1BTQV9PRkYpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX0FMR09SSVRITURJU0FCTEVEOworICAgIH0KKworICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZQU0FfVGltZSkgKEF1ZGlvVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBQYXN0UGVha3MgKTsKKworICAgIGlmKExWUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICB7CisgICAgICAgIGlmKExWUFNBX1N0YXR1cyA9PSBMVlBTQV9FUlJPUl9XUk9OR1RJTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX1dST05HQVVESU9USU1FOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKKworICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KKyAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9UUlVFOworICAgIHJldHVybiBFcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTAsMCArMSw4NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IGFsbG93aW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9uICAgKi8KKy8qICBhbnkgYWxpZ25tZW50IGFuZCB3aXRoIGFueSBudW1iZXIgb2Ygc2FtcGxlcy4gVGhlIGFsaWdubWVudCBpcyBjb3JyZWN0ZWQgd2l0aGluICAgICAqLworLyogIHRoZSBidWZmZXIgbWFuYWdlbWVudCBhbmQgdGhlIHNhbXBsZXMgYXJlIGdyb3VwZWQgaW4gdG8gYmxvY2tzIG9mIHRoZSBjb3JyZWN0IHNpemUgICovCisvKiAgYmVmb3JlIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICB9CisgICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLworCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIHBEZXN0ICs9IE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVzdCBvZiB0aGUgc2FtcGxlcyBmb3IgdGhpcyBjYWxsIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gMCkKKyAgICB7CisgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCArIE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCisgICAgICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNhbXBsZXMgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscypTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlciBjb2RlIGFuZCBkaXNhYmxlcyB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgd2l0aCB0aGUgKi8KKy8qICBleGNlcHRpb24gb2YgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSBwcm9jZXNzaW5nLiBUaGUgdXNlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSAgICAgICAqLworLyogIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgYW5kIGFsc28gdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gICovCisvKiAgICBwcm9jZXNzIGlzIGEgY29ycmVjdCBtdWx0aXBsZSBvZiBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFRvUHJvY2VzcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwUHJvY2Vzc2VkICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAgICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKKyAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck9wdGltaXNlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9wdGltaXNlZCBidWZmZXIgbWFuYWdlbWVudCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGRhdGEgaXMgb3V0cGxhY2UgcHJvY2Vzc2luZywgICAqLworLyogICAgdGhlIG91dHB1dCBkYXRhIGlzIDMyLWJpdCBhbGlnbmVkIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCBzYW1wbGVzIHRvIGFsbG93IHNvbWUgICovCisvKiAgICBwcm9jZXNzaW5nIGRpcmVjdGx5IGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIHNhdmVzIG9uZSBkYXRhIGNvcHkgcGVyIHNhbXBsZSAgICAgKi8KKy8qICAgIGNvbXBhcmVkIHdpdGggdGhlIHVub3B0aW1zZWQgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkSW4oTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXIgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIExWTV9JTlQxNiAgICAgICAgKnBEZXN0OworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICAgTnVtRnJhbWVzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBmb3IgdGhpcyBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOworICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgICAgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKKyAgICAgICAgcERlc3QgPSAqcFByb2Nlc3NlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc3RhcnQgb2YgdGhlIG91dHB1dCBidWZmZXIgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICB9CisgICAgICAgICpwVG9Qcm9jZXNzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IHByb2Nlc3NpbmcgKi8KKyAgICAgICAgKnBQcm9jZXNzZWQgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAodW5wcm9jZXNzZWQpIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENhbGN1bGF0ZSBob3cgbWFueSBpbnB1dCBzYW1wbGVzIHRvIHByb2Nlc3MgYW5kIGNvcHkKKyAgICAgICAgICovCisgICAgICAgIE51bVNhbXBsZXMgICAgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgTnVtRnJhbWVzICAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgU2FtcGxlQ291bnQgICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gU2FtcGxlQ291bnQpOyAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7ICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb3B5IGZyb20gdGhlIGlucHV0ICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3QgKyAoMiAqIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgLyogU2FtcGxlcyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2Vjb25kIG9yIHN1YnNlcXVlbnQgY2FsbCBpbiBvcHRpbWlzZWQgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA+PSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTW9yZSBzYW1wbGVzIGNhbiBiZSBwcm9jZXNzZWQgZGlyZWN0bHkgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgdGhhdCB3aWxsIGZpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOyAgIC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBTYW1wbGVDb3VudCk7ICAgICAgICAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgcmVtYWluaW5nIHNhbXBsZXMgY2FuIG5vdCBiZSBwcm9jZXNzZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7ICAgICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB0aGlzIGlzIHRoZSBsYXN0IGJvY2sgdG8gcHJvY2VzcyAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgICAgICAvKiBOdW1iZXIgbGVmdCB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdXBkYXRlIGNvdW50cyBhbmQgcG9pbnRlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIG1hbmFnZXMgdGhlIGRhdGEgaW5wdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgZGF0YSBpbiAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQ29waWVzIHRoZSBkYXRhIHRvIDMyLWJpdCBhbGlnbmVkIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBDb252ZXJ0cyBNb25vIGlucHV0cyB0byBNb25vLWluLVN0ZXJlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgYW55IG51bWJlciBvZiBzYW1wbGVzIGFzIGlucHV0LCBleGNlcHQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQnJlYWtzIHRoZSBpbnB1dCBzYW1wbGUgc3RyZWFtIGluIHRvIGJsb2NrcyBvZiB0aGUgY29uZmlndXJlZCBmcmFtZSBzaXplIG9yICovCisvKiAgICAgICAgICBtdWx0aXBsZXMgb2YgdGhlIGZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIExpbWl0cyB0aGUgcHJvY2Vzc2luZyBibG9jayBzaXplIHRvIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gV29ya3Mgd2l0aCBpbnBsYWNlIG9yIG91dHBsYWNlIHByb2Nlc3NpbmcgYXV0b21hdGljYWxseSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUbyBtYW5hZ2UgdGhlIGRhdGEgdGhlIGZ1bmN0aW9uIGhhcyBhIG51bWJlciBvZiBvcGVyYXRpbmcgc3RhdGVzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVENBTEwgICAgICAgIC0gVGhlIGZpcnN0IGNhbGwgZm9yIHRoaXMgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyAgICAgICAgICovCisvKiAgICAgICAgTFZNX01BWEJMT0NLQ0FMTCAgICAtIFRoZSBjdXJyZW50IGJsb2NrIGlzIHRoZSBtYXhpbXVtIHNpemUuIE9ubHkgdXNlZCBmb3IgdGhlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBibG9ja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fTEFTVENBTEwgICAgICAgIC0gVGhlIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCBzYW1wbGVzICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIGlzIG5vdCBhICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkICAgICovCisvKiAgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgaXMgc3RvcmVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgICovCisvKiAgdGhlIGZpcnN0IHRpbWUuIFRoZSB2YWx1ZSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgdG8gYmUgcHJvY2Vzc2VkICAgKi8KKy8qICBpbiBlYWNoIGNhbGwgc28gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NpbmcgYmxvY2tzIGNhbiBiZSBjb250cm9sbGVkLiBUaGUgbnVtYmVyIG9mICAqLworLyogICAgc2FtcGxlcyBhY3R1YWxseSBwcm9jZXNzZWQgZm9yIGVhY2ggYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiovCisvKiAgdGhlIGZyYW1lIHNpemUgc28gZm9yIGFueSBwYXJ0aWN1bGFyIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgICAgKi8KKy8qICBwcm9jZXNzZWQgc2FtcGxlcyBtYXkgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcywgc29tZXRpbWUgaXQgd2lsbCBiZSAgICAqLworLyogIHNvbWV0aW1lcyBsZXNzLiBUaGUgYXZlcmFnZSBpcyB0aGUgc2FtZSBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgbmV2ZXIgbW9yZSB0aGFuIHRoZSAgICovCisvKiAgZnJhbWUgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IG91dHB1dC4gVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtYW5hZ2VkIGlucHV0ICAgICAqLworLyogIHJvdXRpbmUgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHNhbXBsZXMgYXJlIGFsd2F5cyBvdXRwdXQgdG8gdGhlIG91dHB1dCAgICovCisvKiAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBPdXREYXRhICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisKKworICAgIC8qCisgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bworICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyKk51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOyAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7ICAgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCisgICAgICovCisgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBibG9jayBzaXplICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdW5tYW5hZ2VkIGlucHV0IHJvdXRpbmUgYW5kIHVwZGF0ZXMgdGhlIG51bWJlciAgICovCisvKiAgICBvZiBzYW1wbGVzIGxlZnQgdG8gYmUgcHJvY2Vzc2VkICAgIGFuZCBhZGp1c3RzIHRoZSBidWZmZXIgcG9pbnRlcnMuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KKworICAgIC8qCisgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc2VkIGlucHV0IHJvdXRpbmUgYW5kIGNvcGllcyB0aGUgbGFzdCBmZXcgICovCisvKiAgcHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnVmZmVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAqcEJ1ZmZlciAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgYmxvY2sgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICAgKnBTcmMgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBpbnB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MpKTsgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsbCB0aGUgbGFzdCBlbXB0eSBzcGFjZXMgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpKTsgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpOworICAgICAgICAgICAgcFNyYyArPSAyICogcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzY3JhdGNoIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIGFueSByZW1haW5pbmcgcHJvY2Vzc2VkIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmICgqcE51bVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMioqcE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBvdXRwdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBPdXRwdXQgZGF0YSB0byAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIFJlYWRzIGRhdGEgZnJvbSAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gUmVhZHMgZGF0YSBvbmx5IGluIGJsb2NrcyBvZiBmcmFtZSBzaXplIG9yIG11bHRpcGxlcyBvZiBmcmFtZSBzaXplICAgICAgICAgICovCisvKiAgICAgICAgLSBXcml0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGhlIExWTV9CdWZmZXJJbiBmdW5jdGlvbiByZWFkcyAgICAgICAgKi8KKy8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSBpcyBub3QgYSAgICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwT3V0RGF0YSAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3OGRiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWTV9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZNX0NPRUZGU19IX18KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBTaGVsdmluZyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjQyOTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY4NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNDQ5MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE0MjkyNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM1ODU4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTE4OTUzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk4MzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wOTIwNTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NjcyOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA2MTg3NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE2OTA3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI4MDEzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NTA3NzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1MDAyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDUxOTkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDI2MzY4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNjY1NjUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDUwMzQwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTA1MzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3NzIzOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzY3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE3NDM1ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM1MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDc0MTcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2NjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0NzYxNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQxMjc5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Nzc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODE0NzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjk0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA4OTg0OSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjYwMzUyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2NDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMTEyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MTcxOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NDMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTM1MTg3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDU2OTAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMTA2MjggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNzU3OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA4NTgwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzc3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTQyNDA2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDU3OTQzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Njg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzAyNjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjY2ODcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk3MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYwMTUxOSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDgzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzNjU4OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDc3MzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3NTkzOCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDYwNTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2MDg5OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIzMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA4NzggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4NTcyNyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMyMzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTg3MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMzU4NCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI5OTkyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDQ4NDEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTQwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTA2MiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5OTExICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDQ0MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxOTI2MCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MDgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI0NTc2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIzNzQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDg5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0OTQwNCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzA3MjAyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTU4MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzcyNjEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjMzNTA1OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUyNTY3NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAzMDIyNyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk1OTMgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIxMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNjQxNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTk3NjQ2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAyMTk2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0MDM0MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDg5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNTUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42ODgyNTAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzMTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTI3OTkgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzQyMDAyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04MDc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQ2NTUxICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQwMjEwOSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTA0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1Mzc5NSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Mjg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MzYwMjQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODc3MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc0MDc4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03Mzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1NzY0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTY3NzQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3OTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjg0NjEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg1MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU2NDY4MSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjM2OCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDI2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE4NDMzICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMTI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzcwMTIwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDAxNzggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTU3MjYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3NDA5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0OTY0MiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyMTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDI3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3Njk1ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0NDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMjI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NTI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzM2MzMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODY2MzQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDMxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjIwMDE2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NjM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMzMDE3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3MjA1OSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTM0MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4NTA2MCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MzA0NTIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEyNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDM0NTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjA4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzk1OTcwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzNDAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4OTcxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQzNTc3NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MTgxNSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NjM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NzcxMTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODMxNTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTIzNDk2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzI5NTM3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzU1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI1MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODE1ODAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMzkzMiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDQxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQzOTk3MyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NDUwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTA1NDkxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODczOTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTAxODkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQyODczOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDg2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMzMTUyOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTU2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc1MTIxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzc3OTEyICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMzc3NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTYwNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3MTA4MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzY3NzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTQwODUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjI1MDI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NTk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjYyMzM1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIyNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3OTE2NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjQ3MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43Mzk5MTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNzcyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjQ3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODA4MDY1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE0NTk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1MzcwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1MjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MzMxOCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODU3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTU0MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODYzMjEgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDQ1NDMgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM0NTcxICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTExNTYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzUyNzkzICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODg3MDggKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTMzMzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDY5MzAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0OTQ1MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTMyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ2NzY3NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzUxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzE3NjA3ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE3NTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTM1ODI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTc5ODIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDY4NzcgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDk4NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTQ2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0OTg4MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDg5MjM0ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzMDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzk4MTMwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU2NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMCwwICsxLDEwMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgV2hlbiBoSW5zdGFuY2UsIHBQYXJhbXMgb3IgYW55IGNvbnRyb2wgcG9pbnRlcnMgYXJlIE5VTEwgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICBXaGVuIGFueSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9ICpwUGFyYW1zOworCisgICAgaWYoCisgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAorICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5DU19FZmZlY3RMZXZlbCA8IExWTV9DU19NSU5fRUZGRUNUX0xFVkVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOLUJhbmQgRXF1YWxpemVyCisgICAgICovCisgICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIERlZmluaXRpb24gcG9pbnRlciAqLworICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpICYmCisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8CisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKyAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8CisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8CisgICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PRkYpICYmIChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PTikpICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCApKXx8CisgICAgICAgICgocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzU1SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgICAgICAgICAgICYmCisgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV85MEh6KSkgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA8IExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgKSB8fCAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisgICAgaWYoKHBQYXJhbXMtPlZDX0JhbGFuY2UgPCBMVk1fVkNfQkFMQU5DRV9NSU4gKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQU0EgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCAocFBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPiBMVlBTQV9TUEVFRF9ISUdIKSB8fAorICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisKKyAgICAvKgorICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKKyAgICAqCisgICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKKyAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCisgICAgKiB0aGFuIG9uY2UgYmVmb3JlIGEgY2FsbCB0byB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gSWYgdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW50ZXJydXB0cworICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KKyAgICAqLworICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICB3aGVuIGFueSBvZiBoSW5zdGFuY2Ugb3IgcFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgcG9pbnRlcgorICAgICAqLworICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5OZXdQYXJhbXM7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kcyAhPSAwKQorICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzW2ldID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmc1tpXTsKKyAgICAgICAgfQorICAgICAgICBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnM7CisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRUcmVibGVCb29zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVuYWJsZSB0aGUgdHJlYmxlIGJvb3N0IHdoZW4gdGhlIHNldHRpbmdzIGFyZSBhcHByb3ByaWF0ZSwgaS5lLiBub24temVybyBnYWluICAgICAgICovCisvKiAgYW5kIHRoZSBzYW1wbGUgcmF0ZSBpcyBoaWdoIGVub3VnaCBmb3IgdGhlIGVmZmVjdCB0byBiZSBoZWFyZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsID0gMDsKKworICAgIC8qCisgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYgKChwUGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgPj0gVHJlYmxlQm9vc3RNaW5SYXRlKSAmJgorICAgICAgICAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID4gMCkpCisgICAgeworICAgICAgICBpZigocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgorICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUyl8fAorICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSBwUGFyYW1zLT5URV9FZmZlY3RMZXZlbDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2FkQ29uc3RfMTYoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVk1fU2V0Vm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udmVydHMgdGhlIGlucHV0IHZvbHVtZSBkZW1hbmQgZnJvbSBkQnMgdG8gbGluZWFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLworICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKworICAgIC8qCisgICAgICogTGltaXQgdGhlIGdhaW4gdG8gdGhlIG1heGltdW0gYWxsb3dlZAorICAgICAqLworICAgICBpZiAgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gMCkKKyAgICAgeworICAgICAgICAgVm9sdW1lID0gMDsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZDX0VmZmVjdExldmVsOworICAgICB9CisKKyAgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLworICAgICBpZihWb2x1bWUgPiAtNjApICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KKyAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNikoLVZvbHVtZSk7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KKyAgICAgZWxzZQorICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KTYwOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHZvbHVtZSBjb250cm9sIGFuZCBBVkwgdm9sdW1lcyBhY2NvcmRpbmcgdG8gaGVhZHJvb20gYW5kIHZvbHVtZSB1c2VyIHNldHRpbmcKKyAgICAgKi8KKyAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQorICAgIHsKKyAgICAgICAgLyogRGVmYXVsdCBTaXR1YXRpb24gd2l0aCBubyBBVkwgYW5kIG5vIFJTICovCisgICAgICAgIGlmKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVm9sdW1lID4gLXBJbnN0YW5jZS0+SGVhZHJvb20pCisgICAgICAgICAgICAgICAgVm9sdW1lID0gKExWTV9JTlQxNiktcEluc3RhbmNlLT5IZWFkcm9vbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQWN0aXZhdGUgdm9sdW1lIGNvbnRyb2wgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICA9IExWTV9UUlVFOworICAgIGlmIChWb2x1bWUgIT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSBWb2x1bWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKKyAgICAgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSgoLVZvbHVtZSkgJSA2KTsgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKGRCU2hpZnRzID09IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKT4+ZEJTaGlmdHMpKTsKKyAgICB9CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZNX1NldEhlYWRyb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZpbmQgc3VpdGFibGUgaGVhZHJvb20gYmFzZWQgb24gRVEgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0SGVhZHJvb20oTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSU5UMTYgICBpaSwgamo7CisgICAgTFZNX0lOVDE2ICAgSGVhZHJvb20gPSAwOworICAgIExWTV9JTlQxNiAgIE1heEdhaW4gPSAwOworCisKKyAgICBpZiAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pICYmIChwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPT0gTFZNX0hFQURST09NX09OKSkKKyAgICB7CisgICAgICAgIC8qIEZpbmQgdHlwaWNhbCBoZWFkcm9vbSB2YWx1ZSAqLworICAgICAgICBmb3IoamogPSAwOyBqaiA8IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1heEdhaW4gPSAwOworICAgICAgICAgICAgZm9yKCBpaSA9IDA7IGlpIDwgcFBhcmFtcy0+RVFOQl9OQmFuZHM7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPj0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9Mb3cpICYmCisgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPD0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9IaWdoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluID4gTWF4R2FpbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF4R2FpbiA9IHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZigoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KSA+IEhlYWRyb29tKXsKKyAgICAgICAgICAgICAgICBIZWFkcm9vbSA9IChMVk1fSU5UMTYpKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICBpZihIZWFkcm9vbSA8IDApCisgICAgICAgICAgICBIZWFkcm9vbSA9IDA7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAoTFZNX1VJTlQxNilIZWFkcm9vbSA7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGxpZXMgY2hhbmdlcyB0byBwYXJhbWV0cmVzLiBUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgICAgICAgICovCisvKiAgZWFjaCBtb2R1bGUgbmVlZHMgZm9yIGluaXRpYWxpc2F0aW9uIGFuZCBoZW5jZSBwYXNzZXMgYWxsIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSAgICAgKi8KKy8qICB0aGUgbW9kdWxlcyBpbiB0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCAgIGhJbnN0YW5jZSkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgIExvY2FsUGFyYW1zOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgQ291bnQgPSA1OworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGJ1dCBtYWtlIHN1cmUgdGhleSBkaWRuJ3QgY2hhbmdlIHdoaWxlIGNvcHlpbmcKKyAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICAgICAgTG9jYWxQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXM7CisgICAgICAgIENvdW50LS07CisgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAgICAgIChDb3VudCA+IDApKTsKKworICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLworICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCisgICAgeworICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMocEluc3RhbmNlKTsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAhPSBMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoZWFkcm9vbSBpZiByZXF1aXJlZAorICAgICAqLworICAgICAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgeworICAgICAgICBMVk1fU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisgICAgLyogQXBwbHkgYmFsYW5jZSBjaGFuZ2VzKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5WQ19CYWxhbmNlICE9IExvY2FsUGFyYW1zLlZDX0JhbGFuY2UpCisgICAgeworICAgICAgICAvKiBDb25maWd1cmUgTWl4ZXIgbW9kdWxlIGZvciBncmFkdWFsIGNoYW5nZXMgdG8gdm9sdW1lKi8KKyAgICAgICAgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyAgICAgICAgICAgIC8qIERyb3AgaW4gbGVmdCBjaGFubmVsIHZvbHVtZSovCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBObyBkcm9wKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBiYXNzIGVuaGFuY2VtZW50CisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gICAgICAgREJFX1N0YXR1czsKKyAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAgICAgIERCRV9QYXJhbXM7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgICAgICAqaERCRUluc3RhbmNlID0gcEluc3RhbmNlLT5oREJFSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCAgICAgID0gTG9jYWxQYXJhbXMuQkVfRWZmZWN0TGV2ZWw7CisgICAgICAgIERCRV9QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ICAgICAgICA9IChMVkRCRV9GaWx0ZXJTZWxlY3RfZW4pTG9jYWxQYXJhbXMuQkVfSFBGOworICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIERCRV9TdGF0dXMgPSBMVkRCRV9Db250cm9sKGhEQkVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9QYXJhbXMpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKERCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIE4tQmFuZCBFcXVhbGlzZXIKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICAgICBFUU5CX1N0YXR1czsKKyAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgIEVRTkJfUGFyYW1zOworICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICAgKmhFUU5CSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworCisgICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZFUU5CX01vZGVfZW4pTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgRVFOQl9QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IChMVkVRTkJfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgRVFOQl9QYXJhbXMuTkJhbmRzICAgICAgICAgICA9IExvY2FsUGFyYW1zLkVRTkJfTkJhbmRzOworICAgICAgICBFUU5CX1BhcmFtcy5wQmFuZERlZmluaXRpb24gID0gKExWRVFOQl9CYW5kRGVmX3QgKilMb2NhbFBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgorICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgRVFOQl9TdGF0dXMgPSBMVkVRTkJfQ29udHJvbChoRVFOQkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgY29uY2VydCBzb3VuZAorICAgICAqLworICAgIHsKKyAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIENTX1N0YXR1czsKKyAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgICAgICAgIENTX1BhcmFtczsKKyAgICAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgICpoQ1NJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aENTSW5zdGFuY2U7CisgICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19NT05PSU5TVEVSRU87ICAgICAgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KKyAgICAgICAgfQorICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOworICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCisgICAgICAgICAqLworICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCisgICAgICAgICAgICAoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBDU19QYXJhbXMuQ29tcHJlc3Nvck1vZGU9Q29tcHJlc3Nvck1vZGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgQ1NfU3RhdHVzID0gTFZDU19Db250cm9sKGhDU0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUNTX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBQb3dlciBTcGVjdHJ1bSBBbmFseXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIFBTQV9TdGF0dXM7CisgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICBQU0FfUGFyYW1zOworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKmhQU0FJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgUFNBX1BhcmFtcy5GcyA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CisgICAgICAgIFBTQV9QYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IChMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuKUxvY2FsUGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Db250cm9sKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAmUFNBX1BhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IG5ldyBzZXR0aW5ncworICAgICAgICAgICAgICovCisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoKExWUFNBX0luc3RhbmNlUHJfdCopaFBTQUluc3RhbmNlKTsKKyAgICAgICAgICAgIGlmKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgYW5kIGNsZWFyIHRoZSBmbGFnCisgICAgICovCisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICBMb2NhbFBhcmFtczsKKworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRIZWFkcm9vbVBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGF1dG9tYXRpdWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEhlYWRyb29tUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBoZWFkcm9vbSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1N1Y2Nlc3MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgICAqcEhlYWRyb29tUGFyYW1zKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpLCBOQmFuZHM7CisKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYgKChwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzICE9IDApICYmIChwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qIENvbnNpZGVyIG9ubHkgdGhlIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIGZpcnN0IGJhbmRzKi8KKyAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKQorICAgIHsKKyAgICAgICAgTkJhbmRzID0gTFZNX0hFQURST09NX01BWF9OQkFORFM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5CYW5kcyA9IHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHM7CisgICAgfQorICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSBOQmFuZHM7CisKKyAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgTkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldID0gcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uW2lpXTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBwSGVhZHJvb21QYXJhbXMtPkhlYWRyb29tX09wZXJhdGluZ01vZGU7CisgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9UUlVFOworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAob3V0cHV0KSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcEhlYWRyb29tUGFyYW1zIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgKnBIZWFkcm9vbVBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaTsKKworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSGVhZHJvb21QYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOworCisKKyAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzW2lpXSA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXTsKKyAgICB9CisKKworICAgIHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzOworICAgIHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BbGdvQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBCdW5kbGVIYW5kbGUgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcERhdGEgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBjYWxsYmFja0lkICAgICAgICAgICAgICBJRCBvZiB0aGUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworCisgICAgKHZvaWQpIHBEYXRhOworCisgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweEZGMDApeworICAgICAgICBjYXNlIEFMR09SSVRITV9DU19JRDoKKyAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTFZDU19FVkVOVF9BTEdPRkY6CisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMR09SSVRITV9FUU5CX0lEOgorICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRVZFTlRfQUxHT0ZGOgorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1ZDQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIFZvbHVtZSBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEJ1bmRsZUhhbmRsZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwR2VuZXJhbFB1cnBvc2UgICAgICAgICBQb2ludGVyIHRvIHRoZSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrUGFyYW0gICAgICAgICAgIElEIG9mIHRoZSBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyICAgIExWTV9WQ0NhbGxCYWNrKHZvaWQqICAgcEJ1bmRsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCit7CisgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7CisgICAgTFZNX0lOVDMyICAgIFRhcmdldDsKKworICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CisgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CisKKyAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKKyAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKKworICAgIGlmKFRhcmdldCA9PSAweDdGRkYpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM3MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtMCwwICsxLDk5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLworLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMzIgICAgICAgICAgQWxnU2NyYXRjaFNpemU7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCisgICAgeworICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKKyAgICB9CisgICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLworCisgICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKKyAgICB7CisgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKKyAgICB9CisKKyAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCisgICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qCisgICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCisgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhbGdvcml0aG0gYW5kIGJ1bmRsZSBzY3JhdGNoIHJlcXVpcmVtZW50cworICAgICAqLworICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0NvZWZzX3QpKTsKKworICAgIC8qCisgICAgICogTi1CYW5kIEVxdWFsaXplciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBMb2NhbCBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCAgICAgIC8qIFVzZXIgc3RvcmFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKworICAgIC8qCisgICAgICogQ29uY2VydCBTb3VuZCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsKKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgICA9IEludGVybmFsQmxvY2tTaXplOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZDU19NZW1vcnkoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RydWN0dXJlcworICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgaWYgKENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICBEQkVfTWVtVGFiOworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCisKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworICAgICAgICBpZiAoREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7CisKKyAgICB9CisKKworICAgIC8qCisgICAgICogTi1CYW5kIGVxdWFsaXNlciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgIC8qIEZvciBOLUJhbmQgRXF1YWxpc2VyICovCisgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgIEVRTkJfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZFUU5CX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7CisgICAgICAgIGlmIChFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKworICAgIC8qCisgICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOworICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7CisgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7CisgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOworCisgICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisKKyAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCisgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisKKyAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQorICAgIHsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7CisgICAgfQorCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKKyAgICB7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOworICAgIH0KKworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKKyAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCisgICAgeworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcGhJbnN0YW5jZSwgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGFyZSBOVUxMKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICpwSW5zdFBhcmFtcykKK3sKKworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIFN0YXR1cyA9IExWTV9TVUNDRVNTOworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgKi8KKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9OVUxMQUREUkVTUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fTUFOQUdFRF9CVUZGRVJTKSAmJiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKSApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqLworICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAqLworICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOworICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7CisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAorICAgICAqLworICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplKSAmIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KKyAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCisgICAgeworICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkU7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX0lOVDE2KUludGVybmFsQmxvY2tTaXplOworCisKKyAgICAvKgorICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlZCBidWZmZXJzIHJlcXVpcmVkCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOworCisgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworCisgICAgLyoKKyAgICAgKiBTZXQgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhbGxCYWNrID0gTFZNX0FsZ29DYWxsQmFjazsKKworCisgICAgLyoKKyAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgorICAgICAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgLyoKKyAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBURV9UYXBzICA9IChMVk1fVEVfRGF0YV90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9EYXRhX3QpKTsKKworICAgIHBJbnN0YW5jZS0+cFRFX1N0YXRlID0gKExWTV9URV9Db2Vmc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkpOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSB2b2x1bWUgY29udHJvbCBhbmQgaW5pdGlhbGlzZSBDdXJyZW50IHRvIFRhcmdldAorICAgICAqLworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisKKyAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICB9CisKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgeworICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgPSAxMDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX0NhcGFiaWxpdGllcyk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICZwSW5zdGFuY2UtPkNTX0luc3RhbmNlOworICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfSW5pdCgmaENTSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuICAgTFZEQkVfU3RhdHVzOyAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxICAgID0gTFZNX0JFX0NFTlRSRV81NUh6OworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgID0gMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGICAgICAgICAgICA9IExWTV9CRV9IUEZfT0ZGOworCisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX01lbW9yeShMVk1fTlVMTCwgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyAgICAgICAgPSAmcEluc3RhbmNlLT5EQkVfSW5zdGFuY2U7CisgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaERCRUluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfSW5pdCgmaERCRUluc3RhbmNlLCAgICAgICAgICAgIC8qIEluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChMVkRCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgID0gTFZNX0VRTkJfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gTFZNX05VTEw7CisgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKKyAgICAgICAgICovCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLkNhbGxCYWNrICAgICAgICA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSAgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7CisgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKyAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9MDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQorICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOworICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07CisKKyAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuTWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAyMDQ4OworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisKKyAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLworICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKworICAgICAgICAgICAgLyogRmFzdCBDb2VmICovCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CisKKworICAgICAgICAgICAgLypJbml0aWFsaXNlIFBTQSBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuRnMgPSBMVk1fRlNfNDgwMDA7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgID0gTFZQU0FfU1BFRURfTUVESVVNOworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0luaXQgKCZoUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IGhQU0FJbnN0YW5jZTsgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlID0gTFZNX05VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGluaXRpYWwgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBhcmFtZXRlcnMgZm9yIGNvcnJlY3QgcmVhZGJhY2sgb2YKKyAgICAgKiB0aGUgc2V0dGluZ3MuCisgICAgICovCisgICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBudW1iZXIKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgPSAweDAwMDAwMDAwOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fQ1NfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0VRTkJfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0RCRV9NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fVkNfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX1BTQV9NQVNLOworCisgICAgaWYoKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgICYgTFZNX0NTX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fREJFX01BU0spIT0wKSB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9FUU5CX01BU0spIT0wKXx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1RFX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVkNfTUFTSykhPTApKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgICAgPSAxOworICAgIH0KKworICAgIHJldHVybihTdGF0dXMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcm5hbCBhdWRpbyBidWZmZXJzIG9mIHRoZSBidW5kbGUuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisgICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLworCisKKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwpeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qIFNhdmUgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KKyAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKKworICAgIC8qICBSZXRyaWV2ZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBtZW10YWIgKi8KKyAgICBMVk1fR2V0TWVtb3J5VGFibGUoaEluc3RhbmNlLCAmTWVtVGFiLCAgTFZNX05VTEwpOworCisgICAgLyogIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBJbnN0UGFyYW1zID0gcEluc3RhbmNlLT5JbnN0UGFyYW1zOworCisgICAgLyogIENhbGwgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSB0byByZS1pbml0aWFsaXNlIHRoZSBidW5kbGUgKi8KKyAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoICZoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSwgJlBhcmFtcyk7CisKKyAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgcmV0dXJuIExWTV9TVUNDRVNTOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxY2Y0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZCBidW5kbGUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZNX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlmZVZpYmVzICovCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ19NaXhlci5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCAqLworI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50ICovCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyICovCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgTFZNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAweEZGRkYgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZNX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgICAgLyogMzItYml0IGZvciBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWTV9GSVJTVENBTEwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZpcnN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTUFYQkxPQ0tDQUxMICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgY2FsbHMgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTEFTVENBTEwgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBMYXN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fRklSU1RMQVNUQ0FMTCAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaW5nbGUgY2FsbCBmb3Igc21hbGwgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKworLyogQmxvY2sgU2l6ZSAqLworI2RlZmluZSBMVk1fTUlOX01BWEJMT0NLU0laRSAgICAgICAgICAgIDE2ICAgICAgICAvKiBNaW5pbXVtIE1heEJsb2NrU2l6ZSBMaW1pdCovCisjZGVmaW5lIExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgICAgODE5MSAgICAgIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBNYW5hZ2VkIEJ1ZmZlciBNb2RlKi8KKyNkZWZpbmUgTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICA0MDk2ICAgICAgLyogTWF4aW11bSBNYXhCbG9ja1N6aWUgTGltaXQgZm9yIFVubWFuYWdlZCBCdWZmZXIgTW9kZSAqLworCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgODEyOCAgICAgIC8qIE1heGltdW0gbXVsdGlwbGUgb2YgNjQgIGJlbG93IDgxOTEqLworCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCAgICAgICAgIDQgICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgICAgICAgICAgMHhGRkYwICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCisKKyNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgICAgICAgICAgICA2MCAgICAgICAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCisjZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUICAgICAgICAgICAgICAgMTI3ICAgICAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLworCisjZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVEUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9URV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qVEUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgLTk2ICAgICAgIC8qVkMgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9WQ19NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVkMgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0ZSRVEgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAgICAgICAgICAyNDAwMCAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9HQUlOICAgICAgICAgIC0xNSAgICAgICAvKkVRTkIgTWluaW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9CQU5EX0dBSU4gICAgICAgICAgMTUgICAgICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgICAgICAgICAgICAyNSAgICAgICAgLypFUU5CIE1pbmltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfUUZBQ1RPUiAgICAgICAgICAgIDEyMDAgICAgICAvKkVRTkIgTWF4aW11bSBRIEZhY3RvciovCisjZGVmaW5lIExWTV9FUU5CX01JTl9MUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgICAgICAgICAgIDIwICAgICAgICAvKkVRTkIgTWluaW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9IUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNYXhpbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKworI2RlZmluZSBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCAgICAgICAgIDAgICAgICAgICAvKkNTIE1pbmltdW0gRWZmZWN0IExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01BWF9SRVZFUkJfTEVWRUwgICAgICAgICAxMDAgICAgICAgLypDUyBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMIDEwMCAgICAgIC8qVml0cnVhbGl6ZXIgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSVhFUl9USU1FICAgICAgICAgICAgICAxMDAgICAgICAgLypWQyBtaXhlciB0aW1lKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUFYICAgICAgICAgICAgIDk2ICAgICAgICAvKlZDIGJhbGFuY2UgbWF4IHZhbHVlKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUlOICAgICAgICAgICAgIC05NiAgICAgICAvKlZDIGJhbGFuY2UgbWluIHZhbHVlKi8KKworLyogQWxnb3JpdGhtIG1hc2tzICovCisjZGVmaW5lIExWTV9DU19NQVNLICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMVk1fRVFOQl9NQVNLICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZNX0RCRV9NQVNLICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExWTV9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFZNX1RFX01BU0sgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMVk1fUFNBX01BU0sgICAgICAgICAgICAgICAgICAgIDIwNDgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgIC8qIEJ5dGUgYWxpZ25tZW50ICovCisgICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgVHlwZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLworfSBMVk1fSW50TWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVk1fSW50TWVtVGFiX3Q7CisKKworLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNipNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyKk1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IGxpbmUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCit9IExWTV9CdWZmZXJfdDsKKworCisvKiBGaWx0ZXIgdGFwcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCit9IExWTV9URV9EYXRhX3Q7CisKKworLyogQ29lZmZpY2llbnRzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCit9IExWTV9URV9Db2Vmc190OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKworICAgIC8qIFByaXZhdGUgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIENvbnRyb2xQZW5kaW5nOyAgICAgLyogQ29udHJvbCBmbGFnIHRvIGluZGljYXRlIHVwZGF0ZSBwZW5kaW5nICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgTmV3UGFyYW1zOyAgICAgICAgICAvKiBOZXcgY29udHJvbCBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisKKyAgICAvKiBCdWZmZXIgY29udHJvbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOyAgLyogTWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplICovCisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAgICAgKnBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzOyAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisKKyAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CisKKyAgICAvKiBEQyByZW1vdmFsICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworCisgICAgLyogQ29uY2VydCBTb3VuZCAqLworICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICBDU19JbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDU19BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworCisgICAgLyogRXF1YWxpemVyICovCisgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgaEVRTkJJbnN0YW5jZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICAgIEVRTkJfSW5zdGFuY2U7ICAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpwRVFOQl9CYW5kRGVmczsgICAgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKnBFUU5CX1VzZXJEZWZzOyAgICAvKiBMb2NhbCBzdG9yYWdlIGZvciB0aGUgdXNlcidzIGRlZmluaXRpb25zICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRVFOQl9BY3RpdmU7ICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLworICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWREJFX0luc3RhbmNlX3QgICAgICAgIERCRV9JbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIFZvbHVtZSBDb250cm9sICovCisgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfVm9sdW1lZEI7ICAgICAgICAvKiBHYWluIGluIGRCICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BVkxGaXhlZFZvbHVtZTsgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCAqLworICAgIExWTV9URV9EYXRhX3QgICAgICAgICAgICpwVEVfVGFwczsgICAgICAgICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyAgICBMVk1fVEVfQ29lZnNfdCAgICAgICAgICAqcFRFX1N0YXRlOyAgICAgICAgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFRFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisKKyAgICAvKiBIZWFkcm9vbSAqLworICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIE5ld0hlYWRyb29tUGFyYW1zOyAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fQmFuZERlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBIZWFkcm9vbTsgICAgICAgICAgICAvKiBWYWx1ZSBvZiB0aGUgY3VycmVudCBoZWFkcm9vbSAqLworCisgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgKi8KKyAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgIFBTQV9JbnN0YW5jZTsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgKi8KKyAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICBQU0FfSW5pdFBhcmFtczsgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQU0FfQ29udHJvbFBhcmFtczsgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFBTQV9HYWluT2Zmc2V0OyAgICAgLyogVG9uZSBjb250cm9sIGZsYWcgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCisKK30gTFZNX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CisKK3ZvaWQgICAgTFZNX1NldFRyZWJsZUJvb3N0KCBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCitMVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CisKK3ZvaWQgICAgTFZNX1NldEhlYWRyb29tKCAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKwordm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKworTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBjYWxsYmFja0lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fUFJJVkFURV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MjcxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9Db2VmZnMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTGlmZVZpYmVzIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgICAgIEF1ZGlvIFRpbWUgb2YgdGhlIGN1cnJlbnQgaW5wdXQgYnVmZmVyIGluIG1zICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX0lOVkFMSUROVU1TQU1QTEVTICBXaGVuIHRoZSBOdW1TYW1wbGVzIGlzIG5vdCBhIHZhbGllZCBtdWx0aXBsZSBpbiB1bm1hbmFnZWQgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9BTElHTk1FTlRFUlJPUiAgICAgV2hlbiBlaXRoZXIgdGhlIGlucHV0IG91ciBvdXRwdXQgYnVmZmVycyBhcmUgbm90IDMyLWJpdCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIGluIHVubWFuYWdlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgIFdoZW4gb25lIG9mIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBpcyBOVUxMICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgorICAgICAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBhIGdvb2QgbXVsdGlwbGUgKHVubWFuYWdlZCBtb2RlIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZigoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKCgoKExWTV9VSU5UMzIpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKExWTV9VSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKworICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29udmVydCBmcm9tIE1vbm8gaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKKyAgICB7CisgICAgICAgIE1vbm9UbzJJXzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CisgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyB0aGUgZGF0YSB3aXRoIG1hbmFnZWQgYnVmZmVycworICAgICAqLworICAgIHdoaWxlIChTYW1wbGVDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKKyAgICAgICAgICovCisgICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPbmx5IHByb2Nlc3MgZGF0YSB3aGVuIFNhbXBsZUNvdW50IGlzIG5vbmUgemVybywgYSB6ZXJvIGNvdW50IGNhbiBvY2N1ciB3aGVuCisgICAgICAgICAqIHRoZSBCdWZmZXJJbiByb3V0aW5lIGlzIHdvcmtpbmcgaW4gbWFuYWdlZCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKHZvaWQpTFZDU19Qcm9jZXNzKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UsICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIE4tQmFuZCBlcXVhbGlzZXIgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyhwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UsICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5XzE2KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSYmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikgKFNhbXBsZUNvdW50KSk7CisKKyAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikgKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEQyByZW1vdmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTRmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fQ29lZmZzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJlYmxlIEJvb3N0IEZpbHRlciBDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGT19DMTZfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMl9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfU2hpZnR9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEyX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE1X1NoaWZ0fSwKKworICAgICAgICAgICAgICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW40X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW43X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xM19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9TaGlmdH0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjhfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnR9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X1NoaWZ0fX07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CisgICAgMHg3RkZGLCAgICAgICAgICAgICAvKiAgMGRCICovCisgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCisgICAgMHg2NUFELCAgICAgICAgICAgICAvKiAtMmRCICovCisgICAgMHg1QTlFLCAgICAgICAgICAgICAvKiAtM2RCICovCisgICAgMHg1MEMzLCAgICAgICAgICAgICAvKiAtNGRCICovCisgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCisgICAgMHg0MDAwfTsgICAgICAgICAgICAvKiAtNmRCICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvbHVtZSBtaXhlciB0aW1lIGNvbnN0YW50cyAoMTAwbXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWTV9NSVhfVENfRnM4MDAwICAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTEwMjUgICAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxNjAwMCAgICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMjIwNTAgICAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisKKworY29uc3QgTFZNX0lOVDE2IExWTV9NaXhlclRDVGFibGVbXSA9IHsKKyAgICBMVk1fTUlYX1RDX0ZzODAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzMTEwMjUsCisgICAgTFZNX01JWF9UQ19GczEyMDAwLAorICAgIExWTV9NSVhfVENfRnMxNjAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzMjIwNTAsCisgICAgTFZNX01JWF9UQ19GczI0MDAwLAorICAgIExWTV9NSVhfVENfRnMzMjAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzNDQxMDAsCisgICAgTFZNX01JWF9UQ19GczQ4MDAwfTsKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjAxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWTV9UQUJMRVNfSF9fCisjZGVmaW5lIF9fTFZNX1RBQkxFU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRyZWJsZSBCb29zdCBGaWx0ZXIgQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWTV9NaXhlclRDVGFibGVbXTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19MVk1fVEFCTEVTX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BR0NfSF9fCisjZGVmaW5lIF9fQUdDX0hfXworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9JTlQzMiAgQUdDX01heEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMzIgIFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDMyICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDMyICBBR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0lOVDE2ICBBR0NfQXR0YWNrOyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLworICAgIExWTV9JTlQxNiAgQUdDX0RlY2F5OyAgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLworICAgIExWTV9JTlQxNiAgQUdDX0dhaW5TaGlmdDsgICAgICAgICAgICAgICAgICAgLyogVGhlIGdhaW4gc2hpZnQgKi8KKyAgICBMVk1fSU5UMTYgIFZvbHVtZVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSBzaGlmdCBzY2FsaW5nICovCisgICAgTFZNX0lOVDE2ICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKworfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAgLyogX19BR0NfSF9fICovCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjN2ZiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CSVFVQURfSF8KKyNkZWZpbmUgX0JJUVVBRF9IXworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworCit9IEJpcXVhZF9JbnN0YW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0lOVDE2IEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0lOVDMyICBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCit9IEJRX0MzMl9Db2Vmc190OworCisvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2IEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMTsgICAvKiAtYjEhICovCit9IEZPX0MxNl9Db2Vmc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgQTE7ICAgLyogIGExICAqLworICAgIExWTV9JTlQzMiAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLworfSBGT19DMzJfQ29lZnNfdDsKKworLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgd2l0aCBTaGlmdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTE7ICAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMTYgQjE7ICAgIC8qIC1iMSEgKi8KKyAgICBMVk1fSU5UMTYgU2hpZnQ7IC8qIFNoaWZ0ICovCit9IEZPX0MxNl9MU2h4X0NvZWZzX3Q7CisKKy8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KK30gQlBfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCit9IEJQX0MzMl9Db2Vmc190OworCisvKioqIFBlYWtpbmcgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMTYgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9JTlQxNiBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfQzMyX0NvZWZzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIFRBUFMgVFlQRSBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogVHlwZXMgdXNlZCBmb3IgZmlyc3Qgb3JkZXIgYW5kIHNoZWx2aW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSoyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjFfVGFwc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMioyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdDsKKworCisvKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMl9UYXBzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKKworLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLworI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCisjZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQklRVUFEIEZJTFRFUlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAqcENvZWYpOworCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBEQyBSRU1PVkFMIEZJTFRFUlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKKwordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qKiBfQklRVUFEX0hfICoqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOGFhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9DT01QX0xJTV9ICisjZGVmaW5lIF9DT01QX0xJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAvKiBDb21wcmVzc29yIHN0YXRlICovCit7CisgICAgLyogTm9ybWFsaXNlciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fQXR0YWNrOyAgICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fRGVjYXk7ICAgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiB0aGUgTm9ybWFsaXNlciBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDMyICAgTm9ybUludDsgICAgICAgICAgICAvKiBOb3JtYWxpc2VyIGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiAgIFNoaWZ0OyAgICAgICAgICAgICAgLyogU2hpZnQgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgIFRocmVzaG9sZDsgICAgICAgICAgLyogVGFyZ2V0IHRocmVzaG9sZCAqLworCisgICAgLyogQ29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0ZW47ICAgICAgICAgLyogQXR0ZW51YXRpb24gYXBwbGllZCBiZWZvcmUgc29mdCBrbmVlIGNvbXByZXNzb3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19TOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBzbG93IGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X1M7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0YWNrX0Y7ICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfRGVjYXlfRjsgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2ICAgU29mdENsaXBHYWluOyAgICAgICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludFNsb3c7ICAgICAgICAvKiBDb21wcmVzc29yIHNsb3cgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludEZhc3Q7ICAgICAgICAvKiBDb21wcmVzc29yIGZhc3QgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisKKworfSBDb21wTGltX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmSW4sCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZPdXQsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTcwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GSUxURVJfSF8KKyNkZWZpbmUgX0ZJTFRFUl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklORVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgIFgpOworCitMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoICAgTFZNX0lOVDMyICBYKTsKKworTFZNX0lOVDMyIExWTV9GT19MUEYoICAgIExWTV9JTlQzMiAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpOworCitMVk1fSU5UMzIgTFZNX0ZPX0hQRiggICAgTFZNX0lOVDMyICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7CisKK0xWTV9JTlQzMiAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qKiBfRklMVEVSX0hfICoqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTU0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSU5TVEFMTE9DX0hfXworI2RlZmluZSBfX0lOU1RBTExPQ19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qICBUeXBlIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFRvdGFsU2l6ZTsgICAgICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KK30gICBJTlNUX0FMTE9DOworCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5CisgKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCisgKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgKnBtcywgdm9pZCAqU3RhcnRBZGRyICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19BZGRNZW1iZXIoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFNpemUgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV3IGFkZGVkIG1lbWJlcgorICogIFJldHVybnMgICAgIDogQSBwb2ludGVyIHRvIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgRGVzY3JpcHRpb24gOiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGEgbmV3IG1lbWJlciBpbiB0aGUgaW5zdGFuY2UgbWVtb3J5IGFuZCByZXR1cm5zCisgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhpcyBuZXcgbWVtYmVyLiAgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYWxsIG1lbWJlcnMgd2lsbAorICAgICAgICAgICAgICAgICAgYmUgMzIgYml0IGFsbGlnbmVkLgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkKiBJbnN0QWxsb2NfQWRkTWVtYmVyKCBJTlNUX0FMTE9DICpwbXMsIExWTV9VSU5UMzIgU2l6ZSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcyk7CisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cik7CisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSk7CisKK3ZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKTsKKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAqcG1zKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fSkJTX0lOU1RBTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNjZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCB3aXRoaW4gdGhlIGJ1bmRsZSBhbmQgaXRzIGFsZ29yaXRobXMuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZXMgaW5jbHVkZXMgYWxsIGRlZmluaXRpb25zLCB0eXBlcywgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19MVk1fQ09NTU9OX0hfXworI2RlZmluZSBfX0xWTV9DT01NT05fSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBbGdvcml0aG0gaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgQUxHT1JJVEhNX05PTkVfSUQgICAgICAweDAwMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0NTX0lEICAgICAgICAweDAxMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0VRTkJfSUQgICAgICAweDAyMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0RCRV9JRCAgICAgICAweDAzMDAKKyNkZWZpbmUgQUxHT1JJVEhNX1ZDX0lEICAgICAgICAweDA1MDAKKyNkZWZpbmUgQUxHT1JJVEhNX1RFX0lEICAgICAgICAweDA2MDAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fQ09NTU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMTNhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTFZNX01BQ1JPU19IXworI2RlZmluZSBfTFZNX01BQ1JPU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpCisgICAgICAgIEMgPSAoQSAqIEIpID4+IFNoaWZ0UgorCisgICAgICAgIEEsIEIgYW5kIEMgYXJlIGFsbCAzMiBiaXQgU0lHTkVEIG51bWJlcnMgYW5kIFNoaWZ0UiBjYW4gdmFyeSBmcm9tIDAgdG8gNjQKKworICAgICAgICBUaGUgdXNlciBoYXMgdG8gdGFrZSBjYXJlIHRoYXQgQyBkb2VzIG5vdCBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaW4gY2FzZQorICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBNVUwzMngzMklOVE8zMgorI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAorICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAorICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKChMVk1fSU5UMTYpKChBKT4+MTYpKSooKExWTV9JTlQxNikoKEIpPj4xNikpICk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ITD0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEEpPj4xNikpKSA7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MSD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEIpPj4xNikpKTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPSAoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MzJJTlRPMzJfbWFzaykqKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcD0gKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEwmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEgmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMPj4xNikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gTVVMMzJ4MzJJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw+PjE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXA+PjE2KTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPU1VTDMyeDMySU5UTzMyX0xMKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMPDwxNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEg8PDE2KTtcCisgICAgICAgIGlmKHNoaWZ0VmFsdWU8MzIpXAorICAgICAgICB7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD1NVUwzMngzMklOVE8zMl9ISDw8KDMyLXNoaWZ0VmFsdWUpO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzaz0oKExWTV9JTlQzMikxPDwoMzItc2hpZnRWYWx1ZSkpLTE7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MTD0oTVVMMzJ4MzJJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpJk1VTDMyeDMySU5UTzMyX21hc2s7XAorICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj1NVUwzMngzMklOVE8zMl9ISHxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2VcCisgICAgICAge1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDI9KExWTV9JTlQzMilNVUwzMngzMklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMzIpO1wKKyAgICAgICB9XAorICAgICAgIChDKSA9IE1VTDMyeDMySU5UTzMyX3RlbXAyO1wKKyAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikKKyAgICAgICAgQyA9IChBICogQikgPj4gU2hpZnRSCisKKyAgICAgICAgQSBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLiAgQiBpcyBhIDE2IGJpdCBTSUdORUQgbnVtYmVyLgorICAgICAgICBTaGlmdFIgY2FuIHZhcnkgZnJvbSAwIHRvIDQ4CisKKyAgICAgICAgVGhlIHVzZXIgaGFzIHRvIHRha2UgY2FyZSB0aGF0IEMgZG9lcyBub3Qgb3ZlcmZsb3cuICBUaGUgcmVzdWx0IGluIGNhc2UKKyAgICAgICAgb2Ygb3ZlcmZsb3cgaXMgdW5kZWZpbmVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTVVMMzJ4MTZJTlRPMzIKKyNkZWZpbmUgTVVMMzJ4MTZJTlRPMzIoQSxCLEMsU2hpZnRSKSAgIFwKKyAgICAgICAge0xWTV9JTlQzMiBNVUwzMngxNklOVE8zMl9tYXNrLE1VTDMyeDE2SU5UTzMyX0hILE1VTDMyeDE2SU5UTzMyX0xMO1wKKyAgICAgICAgIExWTV9JTlQzMiAgc2hpZnRWYWx1ZTtcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX21hc2s9MHgwMDAwRkZGRjtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPSAoKExWTV9JTlQzMikoQikqKChMVk1fSU5UMTYpKChBKT4+MTYpKSk7XAorICAgICAgICBNVUwzMngxNklOVE8zMl9MTD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngxNklOVE8zMl9tYXNrKSooQikpO1wKKyAgICAgICAgaWYoc2hpZnRWYWx1ZTwxNilcCisgICAgICAgIHtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPShMVk1fSU5UMzIpKChMVk1fVUlOVDMyKU1VTDMyeDE2SU5UTzMyX0hIPDwoMTYtc2hpZnRWYWx1ZSkpO1wKKyAgICAgICAgKEMpPU1VTDMyeDE2SU5UTzMyX0hIKyhMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMPj5zaGlmdFZhbHVlKTtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2UgaWYoc2hpZnRWYWx1ZTwzMikge1wKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9KExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KSk7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpO1wKKyAgICAgICAgfVwKKyAgICAgICAgZWxzZSB7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KTt9XAorICAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQorICAgICAgICBDID0gU0FUKEEgKyBCKQorCisgICAgICAgIEEsQiBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFERDJfU0FUXzMyeDMyCisjZGVmaW5lIEFERDJfU0FUXzMyeDMyKEEsQixDKSAgIFwKKyAgICAgICAgeyhDKT0oQSkrKEIpO1wKKyAgICAgICAgIGlmICgoKChDKSBeIChBKSkgJiAoKEMpIF4gKEIpKSkgPj4gMzEpXAorICAgICAgICAgICAge1wKKyAgICAgICAgICAgICAgICBpZigoQSk8MClcCisgICAgICAgICAgICAgICAgICAgIChDKT0weDgwMDAwMDAwbDtcCisgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgKEMpPTB4N0ZGRkZGRkZsO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTFZNX01BQ1JPU19IXyAqLworCisvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMjg4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVk1fVElNRVJfSF9fCisjZGVmaW5lIF9fTFZNX1RJTUVSX0hfXworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBMVk1fVGltZXIgbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uYWxpdHk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHRpbWVyIHdpbGwgY291bnQgZG93biBhIG51bWJlciBvZiBtcywgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzYW1wbGVzIGl0ICAgICAgICAgKi8KKy8qICBzZWVzIGFuZCB0aGUgY3VyZW50IHNhbXBsaW5nIHJhdGUuICBXaGVuIHRoZSB0aW1lciBleHBpcmVzLCBhIHJlZ2lzdGVyZWQgICAgICAgICAgICAqLworLyogIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIG1heGltYWwgbnVtYmVyIG9mIHNhbXBsZXNzIHRoYXQgY2FuIGJlIGNhbGxlZCBieSB0aGUgdGltZXIgaXMgMl4zMiwgd2hpY2ggICAgICAgKi8KKy8qICBjb3JyZXNwb25kcyB0byAyNC44IGhvdXJzIGF0IGEgc2FtcGxpbmcgcmF0ZSBvZiA0OCBrSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSB0aW1lciBjdXJyZW50bHkgZG9lcyBub3Qgc3Vwb3J0IGNoYW5nZXMgaW4gc2FtcGxpbmcgcmF0ZSB3aGlsZSB0aW1pbmcuICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKworfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgIFNhbXBsaW5nUmF0ZTsKKyAgICBMVk1fSU5UMTYgIFRpbWVJbk1zOworICAgIExWTV9JTlQzMiAgQ2FsbEJhY2tQYXJhbTsKKyAgICB2b2lkICAgICAgICpwQ2FsbEJhY2tQYXJhbXM7CisgICAgdm9pZCAgICAgICAqcENhbGxiYWNrSW5zdGFuY2U7CisgICAgdm9pZCAgICAgICAoKnBDYWxsQmFjaykodm9pZCosdm9pZCosTFZNX0lOVDMyKTsKKworfSBMVk1fVGltZXJfUGFyYW1zX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEZVTkNUSU9OIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApOworCisKK3ZvaWQgTFZNX1RpbWVyICAgICAgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVORCBPRiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBfX0xWTV9USU1FUl9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2NTVkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzdGFuZGFyZCBMaWZlVmliZXMgdHlwZXMgZm9yIHVzZSBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgICovCisvKiAgaW50ZXJmYWNlIG9mIGFsbCBMaWZlVmliZXMgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZNX1RZUEVTX0gKKyNkZWZpbmUgTFZNX1RZUEVTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KKworI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCisjZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCisjZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3CisjZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKKyNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NworCisjZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRCBmcm9tIGNhbGxiYWNrSWQgKi8KKyNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20gY2FsbGJhY2tJZCAqLworCisvKiBNZW1vcnkgdGFibGUqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgICAgMSAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAgIDIgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byB0ZW1wb3JhcnkgbWVtb3J5IHJlZ2lvbiAqLworCisjZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgICA0ICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCisKKy8qIE1lbW9yeSBwYXJ0aXRpb24gdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIDFzdCBtZW1vcnkgcGFydGl0aW9uICovCisjZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMSAgICAgIDEgICAgICAgICAgICAgICAgICAgLyogMm5kIG1lbW9yeSBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04yICAgICAgMiAgICAgICAgICAgICAgICAgICAvKiAzcmQgbWVtb3J5IHBhcnRpdGlvbiAqLworI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjMgICAgICAzICAgICAgICAgICAgICAgICAgIC8qIDR0aCBtZW1vcnkgcGFydGl0aW9uICovCisKKy8qIFVzZSB0eXBlICovCisjZGVmaW5lIExWTV9NRU1fUEVSU0lTVEVOVCAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogUGVyc2lzdGVudCBtZW1vcnkgdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX1NDUkFUQ0ggICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIFNjcmF0Y2ggIG1lbW9yeSB0eXBlICovCisKKy8qIEFjY2VzcyB0eXBlICovCisjZGVmaW5lIExWTV9NRU1fSU5URVJOQUwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgKGZhc3QpIGFjY2VzcyBtZW1vcnkgKi8KKyNkZWZpbmUgTFZNX01FTV9FWFRFUk5BTCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAvKiBFeHRlcm5hbCAoc2xvdykgYWNjZXNzIG1lbW9yeSAqLworCisvKiBQbGF0Zm9ybSBzcGVjaWZpYyAqLworI2RlZmluZSBMVk1fUEVSU0lTVEVOVCAgICAgICAgICBMVk1fTUVNX1BBUlRJVElPTjArTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwKKyNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfREFUQSAgICAgTFZNX01FTV9QQVJUSVRJT04xK0xWTV9NRU1fUEVSU0lTVEVOVCtMVk1fTUVNX0lOVEVSTkFMCisjZGVmaW5lIExWTV9QRVJTSVNURU5UX0NPRUYgICAgIExWTV9NRU1fUEFSVElUSU9OMitMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTAorI2RlZmluZSBMVk1fU0NSQVRDSCAgICAgICAgICAgICBMVk1fTUVNX1BBUlRJVElPTjMrTFZNX01FTV9TQ1JBVENIK0xWTV9NRU1fSU5URVJOQUwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCYXNpYyB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fQ0hBUjsgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciAqLworCit0eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCisKK3R5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLworCit0eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX01PREVfT0ZGICAgID0gMCwKKyAgICBMVk1fTU9ERV9PTiAgICAgPSAxLAorICAgIExWTV9NT0RFX0RVTU1ZICA9IExWTV9NQVhFTlVNCit9IExWTV9Nb2RlX2VuOworCisKKy8qIEZvcm1hdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCisgICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCisgICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCisgICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCit9IExWTV9Gb3JtYXRfZW47CisKKworLyogTFZNIHNhbXBsaW5nIHJhdGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fRlNfODAwMCAgPSAwLAorICAgIExWTV9GU18xMTAyNSA9IDEsCisgICAgTFZNX0ZTXzEyMDAwID0gMiwKKyAgICBMVk1fRlNfMTYwMDAgPSAzLAorICAgIExWTV9GU18yMjA1MCA9IDQsCisgICAgTFZNX0ZTXzI0MDAwID0gNSwKKyAgICBMVk1fRlNfMzIwMDAgPSA2LAorICAgIExWTV9GU180NDEwMCA9IDcsCisgICAgTFZNX0ZTXzQ4MDAwID0gOCwKKyAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCisgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0ZzX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKKyAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAorICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCisgICAgTFZNX1RFTVBPUkFSWV9GQVNUICAgICAgICAgID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKKyAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fTWVtb3J5VHlwZXNfZW47CisKKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWTV9NZW1vcnlSZWdpb25fc3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KK30gTFZNX01lbW9yeVRhYmxlX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RhbmRhcmQgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIExWTV9JTlQzMiAoKkxWTV9DYWxsYmFjaykodm9pZCAgICAgICAgICAqcENhbGxiYWNrRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGRhdGEgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLCAgIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgbmVlZGVkIGluIHRoZSBjYWxsYmFjaykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIEdlbmVyYWxQdXJwb3NlICk7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlIChlLmcuIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2sgSUQpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBMVk1fVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZWIwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NSVhFUl9IX18KKyNkZWZpbmUgX19NSVhFUl9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgQ3VycmVudDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDsgICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTWl4XzFTdF9DbGxfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgICBBbHBoYTE7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0MTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7CisKKyAgICBMVk1fSU5UMzIgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fSU5UMzIgICBUYXJnZXQyOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKKworfSBNaXhfMlN0X0NsbF90OworCisKKy8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpOworCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogX19NSVhFUl9IX18gKi8KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNjI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NDQUxBUkFSSVRITUVUSUNfSF9fCisjZGVmaW5lIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qICBFeHRlcm4gZnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIEFic29sdXRlIHZhbHVlIGluY2x1ZGluZyB0aGUgY29ybmVyIGNhc2UgZm9yIHRoZSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlICovCitMVk1fSU5UMzIgICBBYnNfMzIoTFZNX0lOVDMyICAgICBpbnB1dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBkQl90b19MaW4zMigpCisgKiAgSW5wdXQgICAgICAgOiBTaWduZWQgMTYtYml0IGludGVnZXIKKyAqICAgICAgICAgICAgICAgICAgTVNCICgxNikgPSBzaWduIGJpdAorICogICAgICAgICAgICAgICAgICAoMTUtPjA1KSA9IGludGVnZXIgcGFydAorICogICAgICAgICAgICAgICAgICAoMDQtPjAxKSA9IGRlY2ltYWwgcGFydAorICogIE91dHB1dCAgICAgIDogU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMzIpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDMxLT4xNikgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBkQl90b19MaW4zMihMVk1fSU5UMTYgIGRiX2ZpeCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc5MWJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9WRUNUT1JfQVJJVEhNRVRJQ19IXworI2RlZmluZSBfVkVDVE9SX0FSSVRITUVUSUNfSF8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBWQVJJT1VTIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTG9hZENvbnN0XzE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgTG9hZENvbnN0XzMyKCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCisgKiAgICAgICBvdmVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgZXhhbXBsZSB3aGVuICpzcmMgPSAweDgwMDAsIHZhbCA9ICoweDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIG91dHB1dCBhcyAweDgwMDAgaW5zdGVhZCBvZiAweDdmZmYgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNdWx0M3NfMTZ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKKyAqICAgICAgIG92ZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIEZvciBleGFtcGxlIHdoZW4gKnNyYyA9IDB4ODAwMDAwMCwgdmFsID0gKjB4ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIFRoZSBmdW5jdGlvbiBnaXZlcyB0aGUgb3V0cHV0IGFzIDB4ODAwMDAwMCBpbnN0ZWFkIG9mIDB4N2ZmZmZmZmYgICAgICAgICoKKyAqICAgICAgIFRoaXMgaXMgdGhlIG9ubHkgZXh0cmVtZSBjb25kaXRpb24gd2hpY2ggaXMgZ2l2aW5nIHVuZXhwZWN0ZWQgcmVzdWx0ICAgICoKKyAqICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIFZlY3Rvcl9Bcml0aG1ldGljLmRvYyBpbiAvZG9jIGZvbGRlciAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE11bHQzc18zMngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5TWl4XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIE1hYzNzX1NhdF8xNngxNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNYWMzc19TYXRfMzJ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFNISUZUIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKCAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIFNoaWZ0X1NhdF92MzJ4djMyICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vbm9UbzJJXzE2KCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNU1RvMmlfU2F0XzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgSm9pblRvMmlfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7CisKK3ZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCAgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qIF9WRUNUT1JfQVJJVEhNRVRJQ19IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwYjUxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQUdDLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdFNyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdGVyZW9JbiAgICAgICAgICAgICAgIFN0ZXJlbyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9JbiAgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RlcmVvT3V0ICAgICAgICAgICAgICBTdGVyZW8gZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fSU5UMzIgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLworICAgIExWTV9JTlQzMiAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLworICAgIExWTV9JTlQzMiAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0lOVDMyICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgSGlnaFdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHdvcmQgaW4gaW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAqLworICAgIExWTV9JTlQzMiAgICAgICBMb3dXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyB3b3JkIGluIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0lOVDMyICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0lOVDMyICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMTYgICAgICBBR0NfR2FpblNoaWZ0ID0gcEluc3RhbmNlLT5BR0NfR2FpblNoaWZ0OyAgICAvKiBHZXQgdGhlIEFHQyBzaGlmdCAqLworICAgIExWTV9JTlQxNiAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMTYgICAgICBBR0NfRGVjYXkgICAgID0gcEluc3RhbmNlLT5BR0NfRGVjYXk7ICAgICAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9JTlQzMiAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQzMiAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQxNiAgICAgIFZvbF9TaGlmdCAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVNoaWZ0OyAgICAgIC8qIFZvbHVtZSBzaGlmdCBzY2FsaW5nICovCisgICAgTFZNX0lOVDE2ICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpPTA7aTxOdW1TYW1wbGVzO2krKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0lOVDE2KShBR0NfR2FpbiA+PiAxNik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9JTlQxNikoVm9sX0N1cnJlbnQgPj4gMTYpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIEhpZ2hXb3JkID0gKEFHQ19NdWx0ICogKE1vbm8gPj4gMTYpKTsgICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKE1vbm8pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfTXVsdCkgbXVsdGlwbHkgKi8KKyAgICAgICAgTG93V29yZCA9IChBR0NfTXVsdCAqIChNb25vICYgMHhmZmZmKSk7CisgICAgICAgIE1vbm8gPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChBR0NfR2FpblNoaWZ0KTsKKyAgICAgICAgTGVmdCAgKz0gTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgIFJpZ2h0ICs9IE1vbm87CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgSGlnaFdvcmQgPSAoVm9sX011bHQgKiAoTGVmdCA+PiAxNikpOyAgICAgICAgICAgICAgICAgICAvKiBzaWduZWQgbG9uZyAoTGVmdCkgYnkgdW5zaWduZWQgc2hvcnQgKFZvbF9NdWx0KSBtdWx0aXBseSAqLworICAgICAgICBMb3dXb3JkID0gKFZvbF9NdWx0ICogKExlZnQgJiAweGZmZmYpKTsKKyAgICAgICAgTGVmdCA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgKFZvbF9TaGlmdCk7CisgICAgICAgIEhpZ2hXb3JkID0gKFZvbF9NdWx0ICogKFJpZ2h0ID4+IDE2KSk7ICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKFJpZ2h0KSBieSB1bnNpZ25lZCBzaG9ydCAoVm9sX011bHQpIG11bHRpcGx5ICovCisgICAgICAgIExvd1dvcmQgPSAoVm9sX011bHQgKiAoUmlnaHQgJiAweGZmZmYpKTsKKyAgICAgICAgUmlnaHQgPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChWb2xfU2hpZnQpOworICAgICAgICAqcERzdCsrID0gTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKyAgICAgICAgKnBEc3QrKyA9IFJpZ2h0OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgQWJzUGVhayA9IChBYnNfMzIoTGVmdCk+QWJzXzMyKFJpZ2h0KSkgPyBBYnNfMzIoTGVmdCkgOiBBYnNfMzIoUmlnaHQpOyAgLyogR2V0IHRoZSBhYnNvbHV0ZSBwZWFrICovCisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEhpZ2hXb3JkID0gKEFHQ19BdHRhY2sgKiAoQUdDX0dhaW4gPj4gMTYpKTsgICAgICAgICAvKiBzaWduZWQgbG9uZyAoQUdDX0dhaW4pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfQXR0YWNrKSBtdWx0aXBseSAqLworICAgICAgICAgICAgTG93V29yZCA9IChBR0NfQXR0YWNrICogKEFHQ19HYWluICYgMHhmZmZmKSk7CisgICAgICAgICAgICBBR0NfR2FpbiA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gVm9sX1RDICogKChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpID4+IFZPTF9UQ19TSElGVCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKKworICAgIHJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI4YjgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjaW5jbHVkZSAgICAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogQWJzXzMyKCkKKyAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogIE91dHB1dCAgICAgIDoKKyAqICBSZXR1cm5zICAgICA6IEFic29sdXRlIHZhbHVlCisgKiAgRGVzY3JpcHRpb24gOiBBYnNvbHV0ZSB2YWx1ZSB3aXRoIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgY29ybmVyIGNhc2UKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyICAgIEFic18zMihMVk1fSU5UMzIgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIGlmIChpbnB1dCA9PSAoTFZNX0lOVDMyKSgweDgwMDAwMDAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb3JuZXIgY2FzZSwgc28gc2V0IHRvIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCisgICAgICAgICAgICBpbnB1dD0oTFZNX0lOVDMyKSAweDdmZmZmZmZmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLworICAgICAgICAgICAgaW5wdXQgPSAoTFZNX0lOVDMyKSgtaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3OGZlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQUREMl9TQVRfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFkZDJfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpICpzcmMpICsgKChMVk1fSU5UMzIpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzU3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIGEsYixjOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGE9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgYj0qZHN0OworICAgICAgICBjPWErYjsKKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGE8MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqZHN0ID0gYzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM1NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorCisKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgKFExNCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApICkgIGluIFExNAorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogKCgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApICkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE0KTsgLy8geW5MIGluIFEwCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MTRhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CisgIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDUzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFhNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisKKworICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAoUTMwKSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4xNCkgIGluIFExNgorICAgICAgICAgICAgdGVtcGw9IChMVk1fSU5UMzIpICpwRGF0YUluLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0sdGVtcGwseW5MLDE0KQorCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAoUTMwKSAqIHkobi0yKUwgKFExNikgKSA+PjMwKSBpbiBRMTYKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlMIChRMTYpICkgPj4zMCkgaW4gUTE2CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNikoeW5MPj4xNik7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzMzIxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQmFuZCBwYXNzIGZpbHRlciAoQklRVUFEKSAgICAgICAgICAgICAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIFRoZSBjb2VmZmljaWVudHMgYXJlIG1vZGlmaWVkIGluIHRoZSBpbml0KCkgZnVuY3Rpb24gc3VjaCB0aGF0IGxvd2VyICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoYWxmIHdvcmQgaXMgcmlnaHQgc2hpZnRlZCBieSBvbmUgYW5kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBsb3dlciAgICAgICAgICAgICovCisvKiAgICAgICAgd29yZCBpcyBtYWRlIHRvIGJlIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFJlYXNvbjogRm9yIE1JUFMgZWZmY2llbmN5LHdlIGFyZSB1c2luZyBEU1AgMzIqMTYgbXVsdGlwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBpbnN0cnVjdGlvbi4gQnV0IHdlIGhhdmUgMzIqMzIgbXVsdGlwbGljYXRpb24uIFRoaXMgY2FuIGJlIHJlYWxpemVkIGJ5IHR3byAzMioxNiAgICAqLworLyogICAgICAgbXVsdGlwbGljYXRpb24uIEJ1dCAxNnRoIGJpdCBpbiB0aGUgMzIgYml0IHdvcmQgaXMgbm90IGEgc2lnbiBiaXQuIFNvIHRoaXMgaXMgZG9uZSAgKi8KKy8qICAgICAgIGJ5IHB1dHRpbmcgMTZ0aCBiaXQgdG8gemVybyBhbmQgbG9zc2luZyBvbmUgYml0IHByZWNpc2lvbiBieSBkaXZpc2lvbiBvZiBsb3dlciAgICAgICovCisvKiAgICAgICBoYWxmIHdvcmQgYnkgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2E2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDljMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgKFEzMCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApID4+MzApICBpbiBRMAorICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHRlbXBsLHluTCwzMCkKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgKFEzMCkgKiB5KG4tMilMIChRMCkgKSA+PjMwKSBpbiBRMAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApID4+MzApIGluIFEwCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NzkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MxY2UyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisjZGVmaW5lIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qX0JQXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAyX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmOGM2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyIChRMTUpICogeChuLTIpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAoUTE1KSAqIHgobilMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgKFExNSkgKiB5KG4tMilMIChRMCkgKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICB5bkw9eW5MPj4xNTsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMGMxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWM2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNmNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgKFExNCkgKiB4KG4tMilMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTQpICogeChuKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgKFExNCkgKiB5KG4tMilMIChRMTYpICk+PjE2KSBpbiBRMTQKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw8PDI7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpKHluTD4+MTQpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisgICAgICAgIH0KKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWExMGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZiZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIExWTV9JTlQxNiB0ZW1wOworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOworCisgIHRlbXA9cENvZWYtPkEyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJlNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAoUTE0KSAqIHgobi0yKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE0KSAqIHgobi0xKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyIChRMTQpICogeShuLTIpTCAoUTApICkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgKFExNCkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworICAgICAgICAgICAgeW5MPXluTD4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyIChRMTQpICogeChuLTIpUiAoUTApIGluIFExNAorICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgKFExNCkgKiB4KG4pUiAoUTApIGluIFExNAorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyIChRMTQpICogeShuLTIpUiAoUTApICkgaW4gUTE0CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgKFExNCkgKiB5KG4tMSlSIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworICAgICAgICAgICAgeW5SPXluUj4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUiBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwCisKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgKFExNSkgKiB4KG4tMilMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKFExNSkgKiB4KG4tMSlMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAoUTE1KSAqIHkobi0yKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxIChRMTUpICogeShuLTEpTCAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKyAgICAgICAgICAgIHluTD15bkw+PjE1OyAvLyB5bkwgaW4gUTAgZm9ybWF0CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAoUTE1KSAqIHgobi0yKVIgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExIChRMTUpICogeChuLTEpUiAoUTApIGluIFExNQorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwIChRMTUpICogeChuKVIgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAoUTE1KSAqIHkobi0yKVIgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxIChRMTUpICogeShuLTEpUiAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKyAgICAgICAgICAgIHluUj15blI+PjE1OyAvLyB5bkwgaW4gUTAgZm9ybWF0CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMAorCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGFjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDJjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgIExWTV9JTlQxNiAgICAgY29lZnNbNV07ICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGNjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTEzKSAqIHgobi0yKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTMpICogeChuLTEpTCAoUTApIGluIFExMyovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTMpICogeChuKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTEzKSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTEzKSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExMykgKiB4KG4tMilSIChRMCkgaW4gUTEzKi8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTMpICogeChuLTEpUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExMykgKiB4KG4pUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTMpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTEzKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgKFExMykgKiB5KG4tMSlSIChRMTYpICk+PjE2KSBpbiBRMTMgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwzOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw8PDM7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluTD4+MTMpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluUj4+MTMpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmUyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUix0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyIChRMTQpICogeChuLTIpTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyIChRMTQpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAoUTE0KSAqIHgobi0yKVIgKFEwKSBpbiBRMTQqLworICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAoUTE0KSAqIHgobilSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgKFExNCkgKiB5KG4tMilSIChRMTYpICk+PjE2KSBpbiBRMTQqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAoUTE0KSAqIHkobi0xKVIgKFExNikgKT4+MTYpIGluIFExNCAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI8PDI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMIGluIFExNiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5MPj4xNCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5SPj4xNCk7IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NDFlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNSovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTE1KSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTE1KSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExNSkgKiB4KG4tMilSIChRMCkgaW4gUTE1Ki8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTUpICogeChuLTEpUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExNSkgKiB4KG4pUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTUpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxIChRMTUpICogeShuLTEpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwxOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MTsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5blI+PjE1KTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwY2Y2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5MWVlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIExWTV9JTlQxNiB0ZW1wOworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOworCisgIHRlbXA9cENvZWYtPkEyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDgyMTJlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisKKworICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx5blIsdGVtcGwsdGVtcGQ7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyIChRMzApICogeChuLTIpTCAoUTApICkgPj4zMCBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx5bkwsMzApCisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgKFEzMCkgKiB4KG4tMSlMIChRMCkgKSA+PiAzMCBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgKFEzMCkgKiB4KG4pTCAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1syXSwqcERhdGFJbix0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1szXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoLUIxIChRMzApICogeShuLTEpTCAoUTApICkgPj4gMzAgaW4gUTAgKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyIChRMzApICogeChuLTIpUiAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10seW5SLDMwKQorCisgICAgICAgICAgICAvKiB5blIrPSAoIEExIChRMzApICogeChuLTEpUiAoUTApICkgPj4gMzAgIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAoUTMwKSAqIHgobilSIChRMCkgKSA+PiAzMCBpbiBRMCovCisgICAgICAgICAgICB0ZW1wZD0qKHBEYXRhSW4rMSk7CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBkLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMiAoUTMwKSAqIHkobi0yKVIgKFEwKSApID4+IDMwIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAoUTMwKSAqIHkobi0xKVIgKFEwKSApID4+IDMwIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09KExWTV9JTlQzMil5blI7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT0oTFZNX0lOVDMyKXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5SOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwOWY3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDMyIHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2FmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db21wTGltX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEyMWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ09NUF9MSU1fUFJJVkFURV8KKyNkZWZpbmUgX0NPTVBfTElNX1BSSVZBVEVfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBMaW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGU180OEsgICAgICA0ODAwMAorCisjZGVmaW5lIElOVEVHRVJfMTYgIDB4RkZGRiAvKiAgIDY1NTM1Ki8KKyNkZWZpbmUgSU5URUdFUl8xNSAgMHg3RkZGIC8qICAgMzI3NjcqLworCisjZGVmaW5lIEdBSU5fNkRCICAgIDEKKyNkZWZpbmUgR0FJTl8xMkRCICAgMgorI2RlZmluZSBHQUlOXzE4REIgICAzCisjZGVmaW5lIEdBSU5fMjREQiAgIDQKKworI2VuZGlmIC8qICNpZm5kZWYgX0NPTVBfTElNX1BSSVZBVEVfICovCisKKy8qKiogRW5kIG9mIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MDRhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBDT1BZXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3B5XzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY5ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYSEFSRF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworCisgICAgQ3VycmVudDFTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudDEgPj4gMTYpOworICAgIEN1cnJlbnQyU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQyID4+IDE2KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDE9KnNyYzErKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudDFTaG9ydCxUZW1wMywxNSkKKyAgICAgICAgVGVtcDI9KnNyYzIrKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDIsQ3VycmVudDJTaG9ydCxUZW1wMSwxNSkKKyAgICAgICAgVGVtcDI9KFRlbXAxPj4xKSsoVGVtcDM+PjEpOworICAgICAgICBpZiAoVGVtcDIgPiAweDNGRkZGRkZGKQorICAgICAgICAgICAgVGVtcDIgPSAweDdGRkZGRkZGOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0gMHg0MDAwMDAwMCkKKyAgICAgICAgICAgIFRlbXAyID0gIDB4ODAwMDAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyPShUZW1wMjw8MSk7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MWYwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0lOVDMyICAgIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiAgICAgaWksamo7CisgICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0OworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIE1VTDMyeDMySU5UTzMyKCgweDdGRkZGRkZGLXBJbnN0YW5jZS0+QWxwaGEpLHBJbnN0YW5jZS0+VGFyZ2V0LFRhcmdldFRpbWVzT25lTWluQWxwaGEsMzEpOyAvKiBRMzEgKiBRMCBpbiBRMCAqLworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpeworICAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPTI7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpOyAgICAgICAvKiBRMCAqIFEzMSBpbiBRMCAqLworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgICAgICAgIC8qIFEwICsgUTAgaW50byBRMCovCisgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAxPSpzcmMrKzsKKyAgICAgICAgVGVtcDI9KmRzdDsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAzLDE1KQorICAgICAgICBUZW1wMT0oVGVtcDI+PjEpKyhUZW1wMz4+MSk7CisKKyAgICAgICAgaWYgKFRlbXAxID4gMHgzRkZGRkZGRikKKyAgICAgICAgICAgIFRlbXAxID0gMHg3RkZGRkZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtIDB4NDAwMDAwMDApCisgICAgICAgICAgICBUZW1wMSA9ICAweDgwMDAwMDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUZW1wMT0oVGVtcDE8PDEpOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpOyAgICAgICAvKiBRMCAqIFEzMSBpbiBRMCAqLworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgICAgICAgIC8qIFEwICsgUTAgaW50byBRMCovCisgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKKyAgICAgICAgVGVtcDE9KnNyYysrOworICAgICAgICBUZW1wMj0qZHN0OworICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDMsMTUpCisgICAgICAgIFRlbXAxPShUZW1wMj4+MSkrKFRlbXAzPj4xKTsKKworICAgICAgICBpZiAoVGVtcDEgPiAweDNGRkZGRkZGKQorICAgICAgICAgICAgVGVtcDEgPSAweDdGRkZGRkZGOworICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0gMHg0MDAwMDAwMCkKKyAgICAgICAgICAgIFRlbXAxID0gIDB4ODAwMDAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAxPShUZW1wMTw8MSk7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5YzMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDI7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fSU5UMzIgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0lOVDMyICBDdXJyZW50VGltZXNBbHBoYTsKKyAgICBMVk1fSU5UMTYgQ3VycmVudFNob3J0OworICAgIExWTV9JTlQxNiBpaTsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBNVUwzMngzMklOVE8zMigoMHg3RkZGRkZGRi1wSW5zdGFuY2UtPkFscGhhKSxwSW5zdGFuY2UtPlRhcmdldCxUYXJnZXRUaW1lc09uZU1pbkFscGhhLDMxKSAvKiBRMzEgKiBRMzEgaW4gUTMxICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKKyAgICB7CisgICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9MjsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3AhPTApCisgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMihwSW5zdGFuY2UtPkN1cnJlbnQscEluc3RhbmNlLT5BbHBoYSxDdXJyZW50VGltZXNBbHBoYSwzMSkgIC8qIFEzMSAqIFEzMSBpbiBRMzEgKi8KKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOyAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpICAvKiBRMzEgKiBRMzEgaW4gUTMxICovCisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmYTE4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBMZWZ0REMsUmlnaHREQzsKKyAgICAgICAgTFZNX0lOVDMyIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTGVmdERDICA9ICAgcEJpcXVhZFN0YXRlLT5MZWZ0REM7CisgICAgICAgIFJpZ2h0REMgPSAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKKyAgICAgICAgZm9yKGo9TnJTYW1wbGVzLTE7aj49MDtqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmPSoocERhdGFJbisrKS0oTGVmdERDPj4xNik7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDMyNzY3KSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDMyNzY3OyB9CisgICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTMyNzY4KSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0zMjc2ODsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKT0oTFZNX0lOVDE2KURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRDE2X1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExlZnREQyArPSBEQ19EMTZfU1RFUDsgfQorCisKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmPSoocERhdGFJbisrKS0oUmlnaHREQz4+MTYpOworICAgICAgICAgICAgaWYgKERpZmYgPiAzMjc2NykgeworICAgICAgICAgICAgICAgIERpZmYgPSAzMjc2NzsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0zMjc2OCkgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMzI3Njg7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKyk9KExWTV9JTlQxNilEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19EMTZfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyArPSBEQ19EMTZfU1RFUDsgfQorCisgICAgICAgIH0KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgPSAgIExlZnREQzsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgPSAgIFJpZ2h0REM7CisKKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGE4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKwordm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCit7CisgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwOworICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWE0ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworI2RlZmluZSBEQ19EMTZfU1RFUCAgICAgMHgyMDA7CisKKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLworICBMVk1fSU5UMzIgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjBkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlBbGxQYXNzXzMyeDMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgICAgICAgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwQWxsUGFzc09mZnNldCwgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mICBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgQWxsUGFzc09mZnNldCA9ICpwQWxsUGFzc09mZnNldDsKKyAgICBMVk1fSU5UMzIgICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICAgYSxiLGM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKworICAgICAgICBNVUwzMngxNklOVE8zMihkZWxheVtBbGxQYXNzT2Zmc2V0XSwgY29lZmYsIHRlbXAsIDE1KQorICAgICAgICBhID0gdGVtcDsKKyAgICAgICAgYiA9IGRlbGF5W0RlbGF5T2Zmc2V0XTsKKyAgICAgICAgRGVsYXlPZmZzZXQrKzsKKworICAgICAgICBjID0gYSArIGI7CisgICAgICAgIGlmICgoKChjIF4gYSkgJiAoYyBeIGIpKSA+PiAzMSkgIT0gMCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmRzdCA9IGM7CisgICAgICAgIGRzdCsrOworCisKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoYywgLWNvZWZmLCB0ZW1wLCAxNSkKKyAgICAgICAgYSA9IHRlbXA7CisgICAgICAgIGIgPSBkZWxheVtBbGxQYXNzT2Zmc2V0XTsKKyAgICAgICAgYyA9IGEgKyBiOworICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpIT0wKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYoYSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxheVtBbGxQYXNzT2Zmc2V0XSA9IGM7CisgICAgICAgIEFsbFBhc3NPZmZzZXQrKzsKKworICAgICAgICAvKiBNYWtlIHRoZSBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKERlbGF5T2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGF5T2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBbGxQYXNzT2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsbFBhc3NPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcEFsbFBhc3NPZmZzZXQgPSBBbGxQYXNzT2Zmc2V0OworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzMTgyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0lOVDE2ICAgdGVtcDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5Y2RkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBEZWxheU1peF8xNngxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRGVsYXlXcml0ZV8zMihjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuKSAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKExWTV9JTlQxNikqcE9mZnNldDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBPZmZzZXQgPSAoTFZNX1VJTlQxNilPZmZzZXQ7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTc3MzYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNTJjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgICAgIHBUYXBzOworCisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTZjYTgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyKiAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWQ1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwsdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiAgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExIChRMzEpICogeChuLTEpTCAoUTApID4+MzEgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdLHluTCwzMSkKKworICAgICAgICAgICAgLy8geW5MKz1BMCAoUTMxKSAqIHgobilMIChRMCkgPj4gMzEgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sKnBEYXRhSW4sdGVtcGwsMzEpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTMxKSAqIHkobi0xKUwgKFEwKSApID4+IDMxIGluIFEwCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSx0ZW1wbCwzMSkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMzIpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZlNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDMyIHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpICBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9JTlQzMiAqKSAgICBwVGFwczsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhZDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg4MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FTU1VNUFRJT05TOgorQ09FRlMtCitwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5TaGlmdCAgICBpcyBTaGlmdCB2YWx1ZQorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTMwIGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDMyICAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDMyICAgTmVnU2F0VmFsdWU7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBTaGlmdDsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIE5lZ1NhdFZhbHVlID0gTFZNX01BWElOVF8xNiArMTsKKyAgICAgICAgTmVnU2F0VmFsdWUgPSAtTmVnU2F0VmFsdWU7CisKKyAgICAgICAgU2hpZnQgPSBwQmlxdWFkU3RhdGUtPlNoaWZ0OworCisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLy8geW5MID1BMSAoUTE1KSAqIHgobi0xKUwgKFExNSkgaW4gUTMwCisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICAvLyB5blIgPUExIChRMTUpICogeChuLTEpUiAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFExNSkgaW4gUTMwCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIC8vIHluUis9QTAgKFExNSkgKiB4KG4pTCAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKihwRGF0YUluKzEpKTsKKworCisgICAgICAgICAgICAvLyB5bkwgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlMIChRMzApICkgaW4gUTMwCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKKyAgICAgICAgICAgIHluTCArPVRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlSIChRMzApICkgaW4gUTMwCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKKyAgICAgICAgICAgIHluUiArPVRlbXA7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTMwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMTUKKworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXluUjsgLy8gVXBkYXRlIHkobi0xKVIgaW4gUTMwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMTUKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKkFwcGx5IHNoaWZ0OiBJbnN0ZWFkIG9mIGxlZnQgc2hpZnQgb24gMTYtYml0IHJlc3VsdCwgcmlnaHQgc2hpZnQgb2YgKDE1LXNoaWZ0KSBpcyBhcHBsaWVkCisgICAgICAgICAgICAgIGZvciBiZXR0ZXIgU05SKi8KKyAgICAgICAgICAgIHluTCA9IHluTD4+KDE1LVNoaWZ0KTsKKyAgICAgICAgICAgIHluUiA9IHluUj4+KDE1LVNoaWZ0KTsKKworICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgIGlmKHluTCA+IExWTV9NQVhJTlRfMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5MID0gTFZNX01BWElOVF8xNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeW5SID4gTFZNX01BWElOVF8xNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5blIgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsKKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5SOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5YzMyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworCisgIHRlbXA9cENvZWYtPlNoaWZ0OworICBwQmlxdWFkU3RhdGUtPlNoaWZ0ID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDA3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMTYgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgIExWTV9JTlQxNiAgICAgU2hpZnQ7ICAgICAgICAgIC8qIFNoaWZ0IHZhbHVlKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMmRmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZJTFRFUlNfSAorI2RlZmluZSBGSUxURVJTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSwgQTIsIEIxIGFuZCBCMiBjb2VmZmljaWVudHMKKyAqLworLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgICAgIExWTV9JTlQxNiAgIEEwOworICAgICAgICBMVk1fSU5UMTYgICBBMTsKKyAgICAgICAgTFZNX0lOVDE2ICAgQTI7CisgICAgICAgIExWTV9JTlQxNiAgIEIxOworICAgICAgICBMVk1fSU5UMTYgICBCMjsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisKKworLyoKKyAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEgYW5kIEIxIGNvZWZmaWNpZW50cworICovCisvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgTFZNX0lOVDE2ICAgQTA7CisgICAgICAgIExWTV9JTlQxNiAgIEExOworICAgICAgICBMVk1fSU5UMTYgICBCMTsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMUIxQ29lZnNTUF90OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIEZJTFRFUlNfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3NWU4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0OworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGxlZnQgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIHJpZ2h0ID0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOworICAgICAgICAqZHN0TSA9IChMVk1fSU5UMTYpdGVtcDE7CisgICAgICAgIGRzdE0rKzsKKworICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQtcmlnaHQpPj4xOworICAgICAgICAqZHN0UyA9IChMVk1fSU5UMTYpdGVtcDE7CisgICAgICAgIGRzdFMrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRnJvbTJpVG9Nb25vXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ICA9IChMVk1fSU5UMTYpKFRlbXAgPj4xKTsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMjkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIFRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFkZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19Jbml0KCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICBTdGFydEFkZHIgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIGluc3RhbmNlIG1lbW9yeQorICogIFJldHVybnMgICAgIDogRXJyb3IgY29kZQorICogIERlc2NyaXB0aW9uIDogSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIGRpc3RyaWJ1dGlvbiBhbmQgbWVtb3J5IHNpemUgY2FsY3VsYXRpb24gZnVuY3Rpb24KKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdCggSU5TVF9BTExPQyAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKlN0YXJ0QWRkciApCit7CisgICAgcG1zLT5Ub3RhbFNpemUgPSAzOworICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7LyogVGhpcyBjb2RlIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gYWRkcmVzcyBzcGFjZSBpcyBtb3JlIHRoYW4gMzItYml0cyovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19BZGRNZW1iZXIoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFNpemUgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV3IGFkZGVkIG1lbWJlcgorICogIFJldHVybnMgICAgIDogQSBwb2ludGVyIHRvIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgRGVzY3JpcHRpb24gOiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGEgbmV3IG1lbWJlciBpbiB0aGUgaW5zdGFuY2UgbWVtb3J5IGFuZCByZXR1cm5zCisgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhpcyBuZXcgbWVtYmVyLiAgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYWxsIG1lbWJlcnMgd2lsbAorICAgICAgICAgICAgICAgICAgYmUgMzIgYml0IGFsbGlnbmVkLgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXIoIElOU1RfQUxMT0MgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICBTaXplICkKK3sKKyAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9ICh2b2lkKilwbXMtPnBOZXh0TWVtYmVyOworCisgICAgU2l6ZSA9ICgoU2l6ZSArIDMpICYgMHhGRkZGRkZGQyk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCisKKyAgICBwbXMtPlRvdGFsU2l6ZSArPSBTaXplOworICAgIHBtcy0+cE5leHRNZW1iZXIgKz0gU2l6ZTsKKworICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcykKK3sKKyAgICBpZiAocG1zLT5Ub3RhbFNpemUgPiAzKQorICAgIHsKKyAgICAgICAgcmV0dXJuKHBtcy0+VG90YWxTaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBObyBtZW1vcnkgYWRkZWQgKi8KKyAgICB9Cit9CisKKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUpCit7CisgICAgTFZNX1VJTlQzMiBTdGFydEFkZHI7CisKKyAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKworCisgICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisKKworICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworCisKKyAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXRBbGxfTlVMTCgpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byBhcnJheSBvZiBmb3VyIElOU1RfQUxMT0MgaW5zdGFuY2VzCisgKiAgUmV0dXJucyAgICAgOiBOb3RoaW5nCisgKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9uIHJlc2VydmVzIFNpemUgb2YgMyBieXRlcyBmb3IgYWxsIG1lbW9yeSByZWdpb25zIGFuZAorICogICAgICAgICAgICAgICAgaW50aWFsaXplcyBwTmV4dE1lbWJlciBmb3IgYWxsIHJlZ2lvbnMgdG8gMAorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsX05VTEwoIElOU1RfQUxMT0MgICpwbXMpCit7CisgICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gMDsKKworCisgICAgcG1zWzFdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gMDsKKworICAgIHBtc1syXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1syXS5wTmV4dE1lbWJlciA9IDA7CisKKyAgICBwbXNbM10uVG90YWxTaXplID0gMzsKKyAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAwOworCit9CisKKwordm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICAgU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAqcE1lbW9yeVRhYmxlKQoreworICAgIHZvaWQgKk5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KKworICAgIC8qIGNvdmVyaXR5W3JldHVybmVkX3BvaW50ZXJdIElnbm9yZSBjb3Zlcml0eSB3YXJuaW5nIHRoYXQgcHRyIGlzIG5vdCB1c2VkICovCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX1NMT1dfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgICAgICAgICAgPSBMVk1fVEVNUE9SQVJZX0ZBU1Q7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgICAgICAgICA9IExWTV9OVUxMOworCisgICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOworfQorCisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cikKK3sKKyAgICBwdHJbMF0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwdHJbMV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwdHJbMl0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwdHJbM10gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKKworICAgIHJldHVybiAocHRyWzBdKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwOWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIElOVDE2TFNISUZUVE9JTlQzMl8xNlgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIHNoaWZ0ICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAoICgoTFZNX0lOVDMyKSpzcmMpIDw8IHNoaWZ0KTsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5OTgwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQzMlJTSElGVFRPSU5UMTZfU0FUXzMyWDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBJbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2KGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2hpZnQgKQoreworICAgIExWTV9JTlQzMiB0ZW1wOworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICpzcmMgPj4gc2hpZnQ7CisgICAgICAgIHNyYysrOworCisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MzhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmNMICs9IG4tMTsKKyAgICBzcmNSICs9IG4tMTsKKyAgICBkc3QgICs9ICgoMipuKS0xKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzOWI5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKworICAgIEN1cnJlbnQxU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UxLT5DdXJyZW50ID4+IDE2KTsKKyAgICBDdXJyZW50MlNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMi0+Q3VycmVudCA+PiAxNik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudDFTaG9ydCk+PjE1OworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7CisKKyAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50MlNob3J0KT4+MTU7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICB9CisKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhZjc0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDb3JlX01JWEhBUkRfMlNUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKworICAgIEN1cnJlbnQxU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UxLT5DdXJyZW50ID4+IDE2KTsKKyAgICBDdXJyZW50MlNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMi0+Q3VycmVudCA+PiAxNik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAgPSAoKChMVk1fSU5UMzIpKihzcmMxKyspICogKExWTV9JTlQzMilDdXJyZW50MVNob3J0KT4+MTUpICsKKyAgICAgICAgICAgICAgICgoKExWTV9JTlQzMikqKHNyYzIrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnQyU2hvcnQpPj4xNSk7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWEwOTUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQxNiAgIEN1cnJlbnRTaG9ydDsKKyAgICBMVk1fSU5UMzIgICBpaSxqajsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9JTlQzMiAgIERlbHRhPXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0lOVDMyICAgQ3VycmVudD1wSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0PXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9JTlQzMiAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudDxUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50LERlbHRhLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVjNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0TDsKKyAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnRSOworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlTD0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZVI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKyAgICBMVk1fSU5UMzIgICBEZWx0YUw9cEluc3RhbmNlTC0+RGVsdGE7CisgICAgTFZNX0lOVDMyICAgQ3VycmVudEw9cEluc3RhbmNlTC0+Q3VycmVudDsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRMPXBJbnN0YW5jZUwtPlRhcmdldDsKKworICAgIExWTV9JTlQzMiAgIERlbHRhUj1wSW5zdGFuY2VSLT5EZWx0YTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50Uj1wSW5zdGFuY2VSLT5DdXJyZW50OworICAgIExWTV9JTlQzMiAgIFRhcmdldFI9cEluc3RhbmNlUi0+VGFyZ2V0OworCisgICAgTFZNX0lOVDMyICAgVGVtcDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZiAoT3V0TG9vcCkKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMPFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRMLERlbHRhTCxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50TD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UjxUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50UixEZWx0YVIsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgQ3VycmVudFI9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgQ3VycmVudFNob3J0TCA9IChMVk1fSU5UMTYpKEN1cnJlbnRMPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKyAgICAgICAgQ3VycmVudFNob3J0UiA9IChMVk1fSU5UMTYpKEN1cnJlbnRSPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCoyOyBpaSAhPSAwOyBpaS09MikKKyAgICAgICAgeworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wKjI7IGlpICE9IDA7IGlpLT0yKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEw8VGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudEwsRGVsdGFMLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnRMPVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSPFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRSLERlbHRhUixUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50Uj1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBDdXJyZW50U2hvcnRMID0gKExWTV9JTlQxNikoQ3VycmVudEw+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworICAgICAgICBDdXJyZW50U2hvcnRSID0gKExWTV9JTlQxNikoQ3VycmVudFI+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgfQorICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQ9Q3VycmVudEw7CisgICAgcEluc3RhbmNlUi0+Q3VycmVudD1DdXJyZW50UjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhOWNhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnQ7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fSU5UMzIgICBEZWx0YT1wSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ9cEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9JTlQzMiAgIFRhcmdldD1wSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fSU5UMzIgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOyAgICAvKiBRMTUqUTE1Pj4xNSBpbnRvIFExNSAqLworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MmRkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDB4N0ZGRkZGRkYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7CisgICAgICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsc3JjLG4pOworICAgICAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgPT0gMHg3RkZGKXsKKyAgICAgICAgICAgICAgICBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKQorICAgICAgICAgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxzcmMsbik7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfMTZ4MTYoIHNyYywgZHN0LCBuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApCisgICAgICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLHNyYyxuKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfMTZ4MTYoc3JjLChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksZHN0LG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0M2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCl8fChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UxLT5EZWx0YSA9PSAweDdGRkZGRkZGKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEFic18zMihwSW5zdGFuY2UxLT5DdXJyZW50LXBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlMS0+VGFyZ2V0Pj4xNjsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCwgbm8gaW50ZWdlciBwYXJ0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZTItPkRlbHRhID09IDB4N0ZGRkZGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZTItPkN1cnJlbnQtcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UyLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpCisgICAgeworICAgICAgICBpZiAoKChwSW5zdGFuY2UxLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpJiYoKHBJbnN0YW5jZTItPlRhcmdldD4+MTYpID09IDB4N0ZGRikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfMTYoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZTEtPkN1cnJlbnQtcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UxLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZTItPkN1cnJlbnQtcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UyLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UyLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGNhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobjw9MCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAweDdGRkZGRkZGKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic18zMihwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApeworICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLGRzdCxuKTsKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIGRzdCwgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0XzE2KDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7CisgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxkc3Qsbik7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgIT0gMHg3RkZGKQorICAgICAgICAgICAgICAgIE11bHQzc18xNngxNiggZHN0LCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlRhcmdldD4+MTYpLCBkc3QsIG4gKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSAhPSAweDdGRkYpCisgICAgICAgICAgICAgICAgTXVsdDNzXzE2eDE2KCBzcmMsIChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksIGRzdCwgbiApOworICAgICAgICAgICAgZWxzZSBpZihzcmMhPWRzdCkKKyAgICAgICAgICAgICAgICBDb3B5XzE2KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKEFic18zMihwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MDcwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkmJihwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkmJihwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICBIQVJEIE1JWElORworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZihwSW5zdGFuY2UyLT5TaGlmdCE9MCkKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTItPlNoaWZ0LHNyYzIsc3JjMixuKTsKKyAgICAgICAgaWYocEluc3RhbmNlMS0+U2hpZnQhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTEtPlNoaWZ0LHNyYzEsZHN0LG4pOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgZHN0LCBzcmMyLCBkc3QsIG4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwYzc4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDX01JWEVSX0hfXworI2RlZmluZSBfX0xWQ19NSVhFUl9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrU2V0OyAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTFZNaXhlcjNfc3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK30gTFZNaXhlcjNfMVN0X3N0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsyXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0d28gQXVkaW8gU3RyZWFtcyAqLworfSBMVk1peGVyM18yU3Rfc3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzNdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHRocmVlIEF1ZGlvIFN0cmVhbXMgKi8KK30gTFZNaXhlcjNfM1N0X3N0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoSElHSCBMRVZFTCBGVU5DVElPTlMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gbmFtZXMgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gZmlyc3QgMTYgY2hhcmFjdGVycyAgKi8KKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCAgIExWTWl4ZXIzXzFTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQgICAgIExWTWl4ZXIzX0QxNkMzMV9TQVRfTWl4SW5Tb2Z0CisjZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfMlN0X0QxNkMzMV9TQVQgICBMVk1peGVyM18yU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisjZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfM1N0X0QxNkMzMV9TQVQgICBMVk1peGVyM18zU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisKKworLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyB0aW1lIGNvbnN0YW50IGNhbGN1bGF0aW9uIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIG1peGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggICovCisvKiBsYXJnZSBibG9jayBzaXplcy4gV2hlbiB0aGUgYmxvY2sgc2l6ZSBpcyBzbWFsbCwgZXNwZWNpYWxseSBpZiBsZXNzIHRoYW4gNCwgICAgKi8KKy8qIHRoZW4gdGhlIGNhbGN1bGF0aW9uIHdpbGwgZ2l2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yIGFscGhhLCBzZWUgdGhlIG1peGVyICAgICAqLworLyogZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2Fpbik7CisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKwordm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworCisvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1peGVyU3RyZWFtWzBdIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWl4ZXJTdHJlYW1bMV0gYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLy8jaWZuZGVmIF9fTFZDX01JWEVSX0hfXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFlMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX0dldEN1cnJlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgcmV0dXJuIEN1cnJlbnRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmY4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfR2V0VGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9JTlQzMiAgICAgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisKKyAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKworICAgIHJldHVybiBUYXJnZXRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZTdiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGludGlhbGl6YXRpb24gZnVuY3Rpb24gaW50aWFsaXplcyB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAgICAgICAgICovCisvKiAgcGFyYW10ZXJzIGZvciBhIGdpdmVuIEF1ZGlvIFN0cmVhbSBiYXNlZCBvbiBUYXJnZXRHYWluIGFuZCAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKQoreworICAgIExWTV9JTlQxNiAgICAgICBTaGlmdD0wOworICAgIExWTV9JTlQzMiAgICAgICBNYXhHYWluPVRhcmdldEdhaW47ICAgICAgICAgLy8gTWF4R2FpbiBpcyBpbiBRMTYuMTUgZm9ybWF0CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZihDdXJyZW50R2Fpbj5NYXhHYWluKQorICAgICAgICBNYXhHYWluPUN1cnJlbnRHYWluOyAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2Fpbj1tYXgoQ3VycmVudEdhaW4sVGFyZ2V0R2FpbikKKworICAgIE1heEdhaW49TWF4R2Fpbj4+MTU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpbiBRMzEuMCBmb3JtYXQgaS5lIEludGVnZXIgcGFydCBvbmx5CisgICAgd2hpbGUoTWF4R2Fpbj4wKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQgcmVxdWlyZWQgdG8gcHJvdmlkZSBpbnRlZ2VyIGdhaW4KKyAgICAgICAgU2hpZnQrKzsKKyAgICAgICAgTWF4R2Fpbj1NYXhHYWluPj4xOworICAgIH0KKyAgICBwSW5zdGFuY2UtPlRhcmdldD1UYXJnZXRHYWluPDwoMTYtU2hpZnQpOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRlMDVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXworI2RlZmluZSBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgLyogMzIgYml0IG51bWJlciBzcGVjaWZ5aW5nIGZyYWN0aW9uYWwgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQ7ICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyBmcmFjdGlvbmFsIHZhbHVkZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgZm9yIEludGVnZXIgcGFydCBvZiBHYWluICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGZyYWN0aW9uYWwgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLworfSBNaXhfUHJpdmF0ZV9zdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExWQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCAgICBMVkNvcmVfSW5Tb2Z0X0QzMkMzMV9TQVQKKyNkZWZpbmUgTFZDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEgIExWQ29yZV9Tb2Z0XzFTdF9EMzJDMzFfV1JBCisjZGVmaW5lIExWQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUICBMVkNvcmVfSGFyZF8yU3RfRDMyQzMxX1NBVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwSW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcHRySW5zdGFuY2UxIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwdHJJbnN0YW5jZTEgYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKworCisKKy8qKiogMzIgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLy8jaWZuZGVmIF9fTFZDX01JWEVSX1BSSVZBVEVfSF9fCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZhNTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX1NldFRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBwcml2YXRlIGluc3RhbmNlIHBhcmFtZXRlcnM6IFNoaWZ0LFRhcmdldCwqLworLyogIEN1cnJlbnQgZm9yIGEgZ2l2ZW4gQXVkaW8gU3RyZWFtIGJhc2VkIG9uIG5ldyB2YWx1ZSBvZiBUYXJnZXRHYWluICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYWNsdWxhdGVzIHRoZSAiU2hpZnQiIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlICAgICAgICAqLworLyogIGludGVnZXIgcGFydCBvZiBUYXJnZXRHYWluIGFuZCBmcmFjdGlvbmFsIGdhaW4gdmFsdWVzICJUYXJnZXQiIGFuZCAgKi8KKy8qICAiQ3VycmVudCIgYmFzZWQgb24gbWF4aW11bShUYXJnZXRHYWluLEN1cnJlbnRHYWluKSAgICAgICAgICAgICAgICAgICovCisvKiAgRS5nLiBDdXJyZW50R2Fpbj0xLjkgYW5kIFRhcmdldEdhaW49Mi41IHRoZW4gYmFzZWQgb24gICAgICAgICAgICAgICAqLworLyogIE1heEdhaW4gb2YgMi41LCBTaGlmdCA9IDIsIEN1cnJlbnQ9MS45LzQ9MC40NzUsIFRhcmdldD0yLjUvND0wLjYyNSAgKi8KKy8qICBUaGVyZWZvcmUgaW50ZWdlciBnYWluIG9mIDQgaXMgcHJvdmlkZWQgYnkgTGVmdCBTaGlmdCBvZiAyIGFuZCAgICAgICovCisvKiAgZnJhY3Rpb24gZ2FpbiBpcyBwcm92aWRlZCB0aHJvdWdoIEN1cnJlbnQ9MC40NzUgYW5kIFRhcmdldD0wLjYyNSAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAgICAgLSBwdHIgdG8gSW5zdGFuY2UgUGFyYW1ldGVyIFN0cnVjdHVyZSBMVk1peGVyM19zdCAgICovCisvKiAgICAgICAgICAgICAgICAgICAgZm9yIGFuIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRhcmdldEdhaW4gICAgICAtIFRhcmdldEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pCit7CisgICAgTFZNX0lOVDMyICAgICAgIFNoaWZ0PTA7CisgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOworICAgIExWTV9JTlQzMiAgICAgICBNYXhHYWluPVRhcmdldEdhaW47ICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpcyBpbiBRMTYuMTUgZm9ybWF0CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBDdXJyZW50R2Fpbj1wSW5zdGFuY2UtPkN1cnJlbnQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIEN1cnJlbnRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICBpZihDdXJyZW50R2Fpbj5NYXhHYWluKQorICAgICAgICBNYXhHYWluPUN1cnJlbnRHYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2Fpbj1tYXgoQ3VycmVudEdhaW4sVGFyZ2V0R2FpbikKKworICAgIE1heEdhaW49TWF4R2Fpbj4+MTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpbiBRMzEuMCBmb3JtYXQgaS5lIEludGVnZXIgcGFydCBvbmx5CisgICAgd2hpbGUoTWF4R2Fpbj4wKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQgcmVxdWlyZWQgdG8gcHJvdmlkZSBpbnRlZ2VyIGdhaW4KKyAgICAgICAgU2hpZnQrKzsKKyAgICAgICAgTWF4R2Fpbj1NYXhHYWluPj4xOworICAgIH0KKyAgICBwSW5zdGFuY2UtPlRhcmdldD1UYXJnZXRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWM4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDMyICAgRGVsdGFUYWJsZVs5XT17MTA3Mzc0MTgyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NzkxMzIzODksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE1ODI3ODgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNjg3MDkxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzODk1NjYxOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU3OTEzOTQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2ODQzNTQ1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ3ODMwOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4OTU2OTcxfTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIExWTV9JTlQzMiAgIERlbHRhPURlbHRhVGFibGVbRnNdOworICAgIERlbHRhPURlbHRhPj4oTnVtQ2hhbm5lbHMtMSk7CisKKyAgICBpZihUY19taWxsaXNlYz09MCkKKyAgICAgICAgRGVsdGE9MHg3RkZGRkZGRjsKKyAgICBlbHNlCisgICAgICAgIERlbHRhPURlbHRhL1RjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGE9PTApCisgICAgICAgIERlbHRhPTE7ICAgICAgICAgICAgICAgIC8vIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YQorCisgICAgcEluc3RhbmNlLT5EZWx0YT1EZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpIGluIFEgMC4zMSBmb3JtYXQKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUzMDRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworICAgIExWTV9JTlQzMiAgIERlbHRhVGFibGVbOV09ezEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzc5MTMyMzg5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNTgyNzg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5NTY2MTk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1NzkxMzk0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjg0MzU0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NzgzMDk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODk1Njk3MX07CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fSU5UMzIgICBEZWx0YT1EZWx0YVRhYmxlW0ZzXTsKKworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGE+PihOdW1DaGFubmVscy0xKTsKKworICAgIC8qICBHZXQgZ2FpbiB2YWx1ZXMgICovCisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCBwU3RyZWFtICk7CisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCggcFN0cmVhbSApOworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWMgPSBUY19taWxsaXNlYyAqIDMyNzY3IC8gKEN1cnJlbnQgLSBUYXJnZXQpOworICAgICAgICBpZiAoVGNfbWlsbGlzZWM8MCkgVGNfbWlsbGlzZWMgPSAtVGNfbWlsbGlzZWM7CisKKyAgICAgICAgaWYoVGNfbWlsbGlzZWM9PTApCisgICAgICAgICAgICBEZWx0YT0weDdGRkZGRkZGOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEZWx0YT1EZWx0YS9UY19taWxsaXNlYzsKKworICAgICAgICBpZihEZWx0YT09MCkKKyAgICAgICAgICAgIERlbHRhPTE7ICAgICAgICAgICAgLy8gSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERlbHRhID0xOyAgICAgICAgICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkKKyAgICB9CisKKworICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4ZmU0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxIC0gQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCisvKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLworLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9GT19IUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoICAgICAgICAgICAoTFZNX1VJTlQxNik5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyk7CisgICAgcENvZWZmcy0+QjE9LVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZPVk+PjE7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFk9WS0weDQwMDAwMDAwOyAgICAgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KKyAgICBNVUwzMngxNklOVE8zMihZLCBGSUxURVJfTE9TUyAscENvZWZmcy0+QTAgLDE1KSAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCisgICAgcENvZWZmcy0+QTE9LXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWM5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxICsgQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCisvKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLworLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4fTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOworICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41CisgICAgWT1ZPj4xOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZPVkrMHg0MDAwMDAwMDsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCisgICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgLy8gQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdworICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjliM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlZmluZXMgYW5kIFRhYmxlcyBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVlZETF8yUGlCeV84MDAwICAgICAgICAxNzI3MTA4ODI2ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1ICAgICAgIDEyNTMyMzA4OTQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfMTIwMDAgICAgICAgMTE1MTQwNTg4NCAgLyogSW4gUTQxIGZvcm1hdCAqLworCisjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQxICAgIDEyICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDhrSHosIDExLjAyNWtIeiBhbmQgMTJrSHogaS5lLiAxMj00MS0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMiAgICAxMyAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAxNmtIeiwgMjIuMDUwa0h6IGFuZCAyNGtIeiBpLmUuIDEzPTQyLTI5ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQzICAgIDE0ICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDMya0h6LCA0NC4xa0h6IGFuZCA0OGtIeiBpLmUuIDE0PTQzLTI5ICovCisKK2NvbnN0IExWTV9JTlQzMiAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDAgLCAvKiA4a0h6IGluIFE0MSwgMTZrSHogaW4gUTQyLCAzMmtIeiBpbiBRNDMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjUsICAvKiAxMTAyNSBIeiBpbiBRNDEsIDIyMDUwSHogaW4gUTQyLCA0NDEwMCBIeiBpbiBRNDMqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMH07IC8qIDEya0h6IGluIFE0MSwgMjRrSHogaW4gUTQyLCA0OGtIeiBpbiBRNDMgKi8KKworCitjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB3IHVzaW5nIEZjIGFuZCBGcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1VJTlQxNiAgICAgICAgICBGYyAgICAgVGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogUTE2LjAgZm9ybWF0ICAgICAqLworLyogIExWTV9Gc19lbiAgICAgICAgICAgRnMgICAgIFRoZSBTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKK3sKKyAgICBMVk1fSU5UMzIgICB3OworICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCisgICAgcmV0dXJuIHc7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWl4ZXIgbGlicmFyeSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb2VmZmljaWVudHMgYW5kIHRhYmxlIHZhbHVlcyBmb3IgdGhlIG1peGVyIGxpYnJhcnksIGdlbmVyYXRlZCBieSB0aGUgTWF0bGFiICAgICAqLworLyogU2NyaXB0OiBNaXhlcl9HZW5lcmF0ZUNvZWZmcy5tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX01JWEVSX0ZJTFRFUl9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZNX01JWEVSX0ZJTFRFUl9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbHBoYSBUaW1lIENvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQWxwaGFfVGFibGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgNTAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRhYmxlIGVudGlyZXMgKi8KKyNkZWZpbmUgQUxQSEFfMCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0ODA3NjkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk5ICovCisjZGVmaW5lIEFMUEhBXzEgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc5NTc3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OCAqLworI2RlZmluZSBBTFBIQV8yICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3Nzg5MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTcgKi8KKyNkZWZpbmUgQUxQSEFfMyAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NzU1MTAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk2ICovCisjZGVmaW5lIEFMUEhBXzQgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDcyMTQxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NSAqLworI2RlZmluZSBBTFBIQV81ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ2NzM3NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTIgKi8KKyNkZWZpbmUgQUxQSEFfNiAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NjA2NDIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTg5ICovCisjZGVmaW5lIEFMUEhBXzcgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDUxMTE4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4NSAqLworI2RlZmluZSBBTFBIQV84ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQzNzY1MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NzkgKi8KKyNkZWZpbmUgQUxQSEFfOSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0MTg2MDggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTcwICovCisjZGVmaW5lIEFMUEhBXzEwICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MzkxNjgzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk1NyAqLworI2RlZmluZSBBTFBIQV8xMSAgICAgICAgICAgICAgICAgICAgICAgMjE0NzM1MzYxMSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5MzkgKi8KKyNkZWZpbmUgQUxQSEFfMTIgICAgICAgICAgICAgICAgICAgICAgIDIxNDcyOTk3NzkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTE0ICovCisjZGVmaW5lIEFMUEhBXzEzICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MjIzNjYyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTg3OSAqLworI2RlZmluZSBBTFBIQV8xNCAgICAgICAgICAgICAgICAgICAgICAgMjE0NzExNjAzNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4MjkgKi8KKyNkZWZpbmUgQUxQSEFfMTUgICAgICAgICAgICAgICAgICAgICAgIDIxNDY5NjM4NjUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NzU4ICovCisjZGVmaW5lIEFMUEhBXzE2ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2NzQ4NzEyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTY1OCAqLworI2RlZmluZSBBTFBIQV8xNyAgICAgICAgICAgICAgICAgICAgICAgMjE0NjQ0NDUyMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk1MTYgKi8KKyNkZWZpbmUgQUxQSEFfMTggICAgICAgICAgICAgICAgICAgICAgIDIxNDYwMTQ0NzIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5MzE2ICovCisjZGVmaW5lIEFMUEhBXzE5ICAgICAgICAgICAgICAgICAgICAgICAyMTQ1NDA2NTI3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTAzMyAqLworI2RlZmluZSBBTFBIQV8yMCAgICAgICAgICAgICAgICAgICAgICAgMjE0NDU0NzE4OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTg2MzMgKi8KKyNkZWZpbmUgQUxQSEFfMjEgICAgICAgICAgICAgICAgICAgICAgIDIxNDMzMzI2NjkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4MDY3ICovCisjZGVmaW5lIEFMUEhBXzIyICAgICAgICAgICAgICAgICAgICAgICAyMTQxNjE2NTE0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NzI2OCAqLworI2RlZmluZSBBTFBIQV8yMyAgICAgICAgICAgICAgICAgICAgICAgMjEzOTE5MjIxNSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTYxMzkgKi8KKyNkZWZpbmUgQUxQSEFfMjQgICAgICAgICAgICAgICAgICAgICAgIDIxMzU3Njg5MzkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk0NTQ1ICovCisjZGVmaW5lIEFMUEhBXzI1ICAgICAgICAgICAgICAgICAgICAgICAyMTMwOTM3Nzc0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5MjI5NSAqLworI2RlZmluZSBBTFBIQV8yNiAgICAgICAgICAgICAgICAgICAgICAgMjEyNDEyNTE1MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45ODkxMjMgKi8KKyNkZWZpbmUgQUxQSEFfMjcgICAgICAgICAgICAgICAgICAgICAgIDIxMTQ1MjkyNjMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg0NjU0ICovCisjZGVmaW5lIEFMUEhBXzI4ICAgICAgICAgICAgICAgICAgICAgICAyMTAxMDM0NjEyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk3ODM3MCAqLworI2RlZmluZSBBTFBIQV8yOSAgICAgICAgICAgICAgICAgICAgICAgMjA4MjEwMDAzMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45Njk1NTMgKi8KKyNkZWZpbmUgQUxQSEFfMzAgICAgICAgICAgICAgICAgICAgICAgIDIwNTU2MTczOTggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTU3MjIxICovCisjZGVmaW5lIEFMUEhBXzMxICAgICAgICAgICAgICAgICAgICAgICAyMDE4NzQ0ODI0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk0MDA1MSAqLworI2RlZmluZSBBTFBIQV8zMiAgICAgICAgICAgICAgICAgICAgICAgMTk2NzczMzAxNSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45MTYyOTcgKi8KKyNkZWZpbmUgQUxQSEFfMzMgICAgICAgICAgICAgICAgICAgICAgIDE4OTc3OTQ1ODcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuODgzNzI5ICovCisjZGVmaW5lIEFMUEhBXzM0ICAgICAgICAgICAgICAgICAgICAgICAxODAzMTIzMjM0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjgzOTY0NSAqLworI2RlZmluZSBBTFBIQV8zNSAgICAgICAgICAgICAgICAgICAgICAgMTY3NzI2MjIyMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC43ODEwMzYgKi8KKyNkZWZpbmUgQUxQSEFfMzYgICAgICAgICAgICAgICAgICAgICAgIDE1MTQxNDI2NzUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzA1MDc4ICovCisjZGVmaW5lIEFMUEhBXzM3ICAgICAgICAgICAgICAgICAgICAgICAxMzEwMTk3ODc1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjYxMDEwOCAqLworI2RlZmluZSBBTFBIQV8zOCAgICAgICAgICAgICAgICAgICAgICAgMTA2NzgxMzQ4MCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC40OTcyMzkgKi8KKyNkZWZpbmUgQUxQSEFfMzkgICAgICAgICAgICAgICAgICAgICAgICA3OTk2MDEzNzEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMzcyMzQzICovCisjZGVmaW5lIEFMUEhBXzQwICAgICAgICAgICAgICAgICAgICAgICAgNTMxMTgzMDQ5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjI0NzM1MSAqLworI2RlZmluZSBBTFBIQV80MSAgICAgICAgICAgICAgICAgICAgICAgIDI5NzkwNDAwNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4xMzg3MjIgKi8KKyNkZWZpbmUgQUxQSEFfNDIgICAgICAgICAgICAgICAgICAgICAgICAxMzE0OTk3NjggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDYxMjM0ICovCisjZGVmaW5lIEFMUEhBXzQzICAgICAgICAgICAgICAgICAgICAgICAgIDQxMzc1MjgyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAxOTI2NyAqLworI2RlZmluZSBBTFBIQV80NCAgICAgICAgICAgICAgICAgICAgICAgICAgODA2NTg5OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDM3NTYgKi8KKyNkZWZpbmUgQUxQSEFfNDUgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTkwNzYgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMzcyICovCisjZGVmaW5lIEFMUEhBXzQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMzk4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAxNCAqLworI2RlZmluZSBBTFBIQV80NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDlkOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIk1peGVyLmgiCisjaW5jbHVkZSAiTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1fTWl4X0dldFRpbWVDb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IHVzaW5nIHRoZSBmb2xsb3dpbmcgKi8KKy8qICBlcXVhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBBbHBoYSA9IGV4cChsbigwLjEpLyAodGMgKiBVcGRhdGUgKyAxLjApKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93IGZpcnN0IG9yZGVyIGZpbHRlciwgY2FsbGVkIGF0IGEgICovCisvKiAgcmF0ZSBvZiBVcGRhdGUgdGltZXMgYSBzZWNvbmQuIHRjIGlzIHRoZSByZXF1aXJlZCB0aW1lIGNvbnN0YW50IGluICAqLworLyogIHVuaXRzIG9mIDEwMHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBPdXRwdXQobikgPSBBbHBoYSAqIE91dHB1dChuLTEpICsgKDEgLSBBbHBoYSkgKiBUYXJnZXQobikgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGUgYmxvY2sgc2l6ZSBpcyBsYXJnZSwgaS5lLiB0aGUgdXBkYXRlIHJhdGUgICovCisvKiAgaXMgYXBwcm94aW1hdGVseSBhIGZpeGVkLCBhbmQgY29ycmVjdCBmYWN0b3Igb2YgdGhlIHZhbHVlIG9mIEZzICAgICAqLworLyogIGdpdmVuIGluIHRoZSBjYWxsLiBUaGlzIGlzIGVzcGVjaWFsbHkgbm90IHRydWUgd2hlbiB0aGUgYmxvY2sgc2l6ZSAgKi8KKy8qICBpcyB2ZXJ5IHNtYWxsLCBzZWUgdGhlIG1peGVyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgaW5wdXQgICAgKi8KKy8qICB2YWx1ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIE51bUNoYW5uZWxzIGlzIGxpbWl0ZWQgdG8gdGhlIHZhbHVlcyAxIChNb25vKSBhbmQgMiAoU3RlcmVvKSAgICAgKi8KKy8qICAyLiBUaGUgcHJvZHVjdCB0YyAqIEZzIGlzIGxpbWl0ZWQgYXBwcm94aW1hdGVseSB0byB0aGUgcmFuZ2UgICAgICAgICovCisvKiAgICAgIDggPCAodGMgKiBGcykgPCAyXjM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdGMgICAgICAgICAgICAgIC0gdGhlIHRpbWUgY29uc3RhbnQgaW4gMTAwdXMgc3RlcHMsIGkuZS4gMTAgPSAxbXMgICAqLworLyogIEZzICAgICAgICAgICAgICAtIHRoZSBmaWx0ZXIgdXBkYXRlIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1DaGFubmVscyAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgMT1Nb25vLCAyPVN0ZXJlbyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBbHBoYSAgIC0gdGhlIGZpbHRlciBjb2VmZmljaWVudCBRMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQoreworCisgICAgTFZNX1VJTlQzMiAgUHJvZHVjdDsKKyAgICBMVk1fSU5UMTYgICBJbnRlcnBvbGF0ZTsKKyAgICBMVk1fVUlOVDE2ICBTaGlmdDsKKyAgICBMVk1fSU5UMzIgICBEaWZmOworICAgIExWTV9VSU5UMzIgIFRhYmxlW10gPSB7QUxQSEFfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV83LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzUwfTsKKworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0aW1lIGNvbnN0YW50IGFuZCB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICBQcm9kdWN0ID0gKCh0YyA+PiAxNikgKiAoTFZNX1VJTlQzMilGcykgPDwgMTM7ICAvKiBTdGVyZW8gdmFsdWUgKi8KKyAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CisKKyAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSB0byBnZXQgdGhlIHRhYmxlIGluZGV4IGFuZCBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLworICAgIGZvciAoU2hpZnQ9MDsgU2hpZnQ8KChBbHBoYV9UYWJsZVNpemUtMSkvMik7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOworICAgIH0KKyAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOworCisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCisgICAgeworICAgICAgICBTaGlmdCsrOworICAgIH0KKworICAgIEludGVycG9sYXRlID0gKExWTV9JTlQxNikoKFByb2R1Y3QgPj4gMTUpICYgMHgwMDAwN0ZGRik7CisKKyAgICBEaWZmID0gKExWTV9JTlQzMikoVGFibGVbU2hpZnRdIC0gVGFibGVbU2hpZnQrMV0pOworICAgIE1VTDMyeDE2SU5UTzMyKERpZmYsSW50ZXJwb2xhdGUsRGlmZiwxNSkKKyAgICAgICAgUHJvZHVjdCA9IFRhYmxlW1NoaWZ0KzFdICsgKExWTV9VSU5UMzIpRGlmZjsKKworICAgIHJldHVybiBQcm9kdWN0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkN2RiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1fUG9seW5vbWlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE4gICAgICAgICAgICAgICAgaXMgdGhlIHBvbHlub21pYWwgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ29lZmZpY2llbnRzICAgIGlzIHRoZSBwdHIgdG8gcG9seW5vbWlhbCBjb2VmZmljaWVudHMgQTAsQTEuLiBpbiBRLjMxICovCisvKiAgWCAgICAgICAgICAgICAgICBpcyB0aGUgaW5wdXQgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSByZXN1bHQgb2YgdGhlIHBvbHlub21pYWwgZXhwYW5zaW9uIGluIFExLjMxIGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgIFgpCit7CisgICAgTFZNX0lOVDMyIGk7CisgICAgTFZNX0lOVDMyIFksQSxYVGVtcCxUZW1wLHNpZ247CisKKyAgICBZPSpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZigoTFZNX1VJTlQzMilYPT0weDgwMDAwMDAwKQorICAgIHsKKyAgICAgICAgVGVtcD0tMTsKKyAgICAgICAgc2lnbj1UZW1wOworICAgICAgICBmb3IoaT0xO2k8PU47aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBZKz0oKCpwQ29lZmZpY2llbnRzKSpzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24qPVRlbXA7CisgICAgICAgIH0KKworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFhUZW1wPVg7CisgICAgICAgIGZvcihpPU4tMTtpPj0wO2ktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQT0qcENvZWZmaWNpZW50czsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoQSxYVGVtcCxUZW1wLDMxKQorICAgICAgICAgICAgWSs9VGVtcDsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoWFRlbXAsWCxUZW1wLDMxKQorICAgICAgICAgICAgWFRlbXA9VGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBPSpwQ29lZmZpY2llbnRzOworICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgIGlmKEE8MCkKKyAgICB7CisgICAgICAgIEE9QWJzXzMyKEEpOworICAgICAgICBZPVk+PkE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFkgPSBZPDxBOworICAgIH0KKyAgICByZXR1cm4gWTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhMTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9Qb3dlcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyAxMFggdXNpbmcgYW4gMTF0aCBvcmRlciBwb2x5bm9taWFsLiBJdCB1c2VzICAqLworLyogICB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIDMyLWJpdCBpbnRlZ2VyIHBvbHlub21pYWwgY29lZmZpY2llbnRzOiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvZWZmaWNpZW50ICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMCAgICAgICAgICAgICA2NzEwMjU0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEgICAgICAgICAgICAgMzA5MDMyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEyICAgICAgICAgICAgIDcxMjA5NjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMyAgICAgICAgICAgICAxMDkyNzk3MzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTQgICAgICAgICAgICAgMTI1MTYyNTEzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE1ICAgICAgICAgICAgIDExNTQ2NDk0NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNiAgICAgICAgICAgICA5MTU2NTQ4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTcgICAgICAgICAgICAgNTk3ODgzNjgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE4ICAgICAgICAgICAgIDI4NDM3ODIzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOSAgICAgICAgICAgICAxNTAyNjIwOTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEwICAgICAgICAgICAgMTI0ODk0NDcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBYICAgICAgICAgICAgICAgaXMgdGhlIGlucHV0IHZhcmlhYmxlIGluIFEyLjMwIGZvcm1hdCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHJlc3VsdCBvZiB0aGUgMTB4IGV4cGFuc2lvbiBpbiBROC4yNCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQoreworICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzcyNTgyNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzgwMjQwMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzMxOTkzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTI5MDYyODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODg2NjIzNjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjg5MTM3MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDk0NzA5MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwOTQ1NTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc1NjU1MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEyMjM2MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2MTkzMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIFgpOworICAgIHJldHVybiBZOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTVmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBUSU1FUiBGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX1RpbWVyICAgICAgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICBCbG9ja1NpemUgKXsKKworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7CisKKyAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7CisgICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKKyAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM1Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9uZU92ZXJUaG91c2FuZEluUTI0IDE2Nzc3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIElOSVQgRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApeworCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKKworICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gcFBhcmFtcy0+cENhbGxCYWNrUGFyYW1zOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbGJhY2tJbnN0YW5jZSA9IHBQYXJhbXMtPnBDYWxsYmFja0luc3RhbmNlOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2sgICAgICAgICA9IHBQYXJhbXMtPnBDYWxsQmFjazsKKyAgICBwSW5zdGFuY2VQci0+VGltZXJBcm1lZCAgICAgICAgPSAxOworCisgICAgTVVMMzJ4MTZJTlRPMzIocFBhcmFtcy0+U2FtcGxpbmdSYXRlLE9uZU92ZXJUaG91c2FuZEluUTI0LHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLDE2KTsgIC8qIChRMCAqIFEyNCkgPj4xNiBpbnRvIFE4Ki8KKyAgICBNVUwzMngxNklOVE8zMihwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyxwUGFyYW1zLT5UaW1lSW5NcyxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyw4KTsgIC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVORCBPRiBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDk0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTFZNX1RJTUVSX1BSSVZBVEVfSAorI2RlZmluZSBMVk1fVElNRVJfUFJJVkFURV9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgUmVtYWluaW5nVGltZUluU2FtcGxlczsKKyAgICBMVk1fSU5UMzIgIENhbGxCYWNrUGFyYW07CisgICAgTFZNX0lOVDMyICAqcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQgICpwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICAoKnBDYWxsQmFjaykodm9pZCosdm9pZCosTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFuLCB0cnVlIGJldHdlZW4gaW5pdCBhbmQgY2FsbGJhY2sgKi8KKworfSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhjYTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTG9hZENvbnN0XzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMb2FkQ29uc3RfMTYoY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9IHZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZTU5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTG9hZENvbnN0XzMyKGNvbnN0IExWTV9JTlQzMiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSB2YWw7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyOTdlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiAgTVNUTzJJX1NBVF8xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTVNUbzJpX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYgICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIHRlbXAsbVZhbCxzVmFsOworICAgIExWTV9JTlQxNiBpaTsKKworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBtVmFsPShMVk1fSU5UMzIpKnNyY007CisgICAgICAgIHNyY00rKzsKKworICAgICAgICBzVmFsPShMVk1fSU5UMzIpKnNyY1M7CisgICAgICAgIHNyY1MrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwNGFlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKQorICAgICAlbmFtZTogICAgICAgICAgTWFjM3NfU2F0XzE2eDE2LmMgJSAoQ00vUykKKyAgICAgJXZlcnNpb246ICAgICAgIDEgJSAoQ00vUykKKyAgICAgJWRhdGVfY3JlYXRlZDogIEZyaSBOb3YgMTMgMTI6MDc6MTMgMjAwOSAlIChDTS9TKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1hYzNTXzE2WDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNYWMzc19TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBzcmN2YWw7CisgICAgTFZNX0lOVDMyIFRlbXAsZEluVmFsOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbD0qc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wID0gKHNyY3ZhbCAqdmFsKT4+MTU7CisKKyAgICAgICAgZEluVmFsICA9IChMVk1fSU5UMzIpKmRzdDsKKworICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKKworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOworICAgICAgICB9CisKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4ZjM2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNQUMzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWFjM3NfU2F0XzMyeDE2KCAgY29uc3QgTFZNX0lOVDMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wLCBkSW5WYWwsIGRPdXRWYWw7CisKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsPSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKKworICAgICAgICAgICAgZEluVmFsICA9ICpkc3Q7CisgICAgICAgIGRPdXRWYWwgPSB0ZW1wICsgZEluVmFsOworCisKKyAgICAgICAgaWYgKCgoKGRPdXRWYWwgXiB0ZW1wKSAmIChkT3V0VmFsIF4gZEluVmFsKSkgPj4gMzEpIT0wKSAgICAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYodGVtcDwwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg4MDAwMDAwMGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZE91dFZhbD0weDdGRkZGRkZGbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpkc3QgPSBkT3V0VmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMjZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNSVhJTlNPRlRfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX3QgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCit7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPFBPSU5UX1pFUk9fT05FX0RCKSYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREIpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpCisgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIoIHNyYywgZHN0LCBuICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODhiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0XzMyKDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpID09IDB4N0ZGRil7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYqKXNyYywgKExWTV9JTlQxNiopZHN0LCAoTFZNX0lOVDE2KShuICogMikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE11bHQzc18zMngxNiggc3JjLCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KSwgZHN0LCBuICk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGEwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoIChNaXhfMVN0X0NsbF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCggKHZvaWQgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAgICAgLyogQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAodm9pZCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAoTWl4XzFTdF9DbGxfdCopIHBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDcwNzNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworI2RlZmluZSBfX01JWEVSX1BSSVZBVEVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1peGVyLmgiCisKKyNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvLyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ3OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNb25vVG8ySV8xNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobi0xKTsKKyAgICBkc3QgKz0gKChuKjIpLTEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5ZWMwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTW9ub1RvMklfMzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobi0xKTsKKyAgICBkc3QgKz0gKChuKjIpLTEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRjNTBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0ZVTkNUSU9OIE1VTFQzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTXVsdDNzXzMyeDE2KCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgc3JjdmFsLHRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbD0qc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBNVUwzMngxNklOVE8zMihzcmN2YWwsdmFsLHRlbXAsMTUpCisKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM0M2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBMaW1fcHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vbi1saW5lYXIgY29tcHJlc3Npb24gYnkgY29tcGFuZGluZy4gVGhlIGZ1bmN0aW9uIHdvcmtzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSAgICAgICovCisvKiAgYmFzaXMgYnkgaW5jcmVhc2luZyB0aGUgbGV2ZWwgbmVhciB0aGUgemVybyBjcm9zc2luZy4gVGhpcyBnaXZlcyBhIHR0cmFkZS1vZmYgICAgICAgKi8KKy8qICBiZXR3ZWVuIFRIRCBhbmQgY29tcHJlc3Npb24uIEl0IHVzZXMgdGhlIGVxdWF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgT3V0cHV0ID0gSW5wdXQgKyBLICogKElucHV0IC0gSW5wdXReMikgICAgICAgIGlmIElucHV0ID4gIDAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgPSBJbnB1dCArIEsgKiAoSW5wdXQgKyBJbnB1dF4yKSAgICAgIGlmIElucHV0IDw9IDAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgSyBjb250cm9scyB0aGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGFuZCBhcyBhIHNpZGUgZWZmZWN0IHRoZSBhbW91bnQgKi8KKy8qICBkaXN0b3J0aW9uIGludHJvZHVjZWQuIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgc2lnbmFsIGRlcGVuZGVudCBhbmQgdGhlIHZhbHVlcyAqLworLyogIGdpdmVuIGJlbG93IGFyZSBhcHByb3hpbWF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBHYWluIChmcmFjdGlvbmFsKSAgR2FpbiAoaW50ZWdlcikgICAgQ29tcHJlc3Npb24gICAgICAgICAgUGstUGsgVEhEICAgICAgICAgICAqLworLyogICAgICAgICAgICAxLjAgICAgICAgICAgICAgICAgIDMyNzY3ICAgICAgICAgICAgKzZkQiAgICAgICAgICAgIDE2ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuNzggICAgICAgICAgICAgICAgMjU1NTkgICAgICAgICAgICArNWRCICAgICAgICAgICAgMTlkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC42ICAgICAgICAgICAgICAgICAxOTY2MSAgICAgICAgICAgICs0ZEIgICAgICAgICAgICAyMWRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjQxICAgICAgICAgICAgICAgIDEzNDM1ICAgICAgICAgICAgKzNkQiAgICAgICAgICAgIDI0ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuMjYgICAgICAgICAgICAgICAgIDg1MjAgICAgICAgICAgICArMmRCICAgICAgICAgICAgMjhkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC4xMiAgICAgICAgICAgICAgICAgMzkzMiAgICAgICAgICAgICsxZEIgICAgICAgICAgICAzNGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgKzBkQiAgICAgICAgICAgIDk4ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgR2FpbiAgICAgICAgICAgIC0gICAgY29tcHJlc3Npb24gY29udHJvbCBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwRGF0YUluICAgICAgICAgLSAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBEYXRhT3V0ICAgICAgICAtICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQmxvY2tMZW5ndGggICAgIC0gICAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCit7CisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgIFRlbXA7CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObzxCbG9ja0xlbmd0aDsgU2FtcGxlTm8rKykKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOworICAgICAgICBwRGF0YUluKys7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCisgICAgICAgICAqIGdhaW4gZmFjdG9yCisgICAgICAgICAqLworICAgICAgICBpZiAoKExWTV9JTlQzMilTYW1wbGUgIT0gLTMyNzY4KQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQxNikoKFNhbXBsZSAqIFNhbXBsZSkgPj4gMTUpOworICAgICAgICAgICAgaWYoU2FtcGxlID4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChMVk1fSU5UMTYpKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgPj4gMTUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpID4+IDE1KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOworICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjMTUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgR2FpbiwgaW4gUTExIGZvcm1hdAorCisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx5blIseW5MTyx5blJPLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKEEwIChRMTQpICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjE0KSAgaW4gUTAqLworICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluTCwxNCkKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSA+PjE0KSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwxNCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxIChRMTQpICogeShuLTEpTCAoUTApICkgPj4xNCkgaW4gUTAgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDE0KQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MTz0gKChHYWluIChRMTEpICogeW5MIChRMCkpPj4xMSkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5MLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5MTywxMSkKKworICAgICAgICAgICAgLyogeW5MTz0oIHluTE8oUTApICsgeChuKUwgKFEwKSApIGluIFEwKi8KKyAgICAgICAgICAgIHluTE8rPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAoUTE0KSAqICh4KG4pUiAoUTApIC0geChuLTIpUiAoUTApICkgPj4xNCkgICBpbiBRMCovCisgICAgICAgICAgICB0ZW1wbD0oKihwRGF0YUluKzEpKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluUiwxNCkKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgKFExNCkgKiB5KG4tMilSIChRMCkgKSA+PjE0KSAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMTQpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAoUTE0KSAqIHkobi0xKVIgKFEwKSApID4+MTQpICBpbiBRMCAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sdGVtcGwsMTQpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gKFExMSkgKiB5blIgKFEwKSk+PjExKSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih5blIscEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx5blJPLDExKQorCisgICAgICAgICAgICAvKiB5blJPPSggeW5STyhRMCkgKyB4KG4pUiAoUTApICkgaW4gUTAqLworICAgICAgICAgICAgeW5STys9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgLyogVXBkYXRlIHkobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PXluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9eW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTU3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKKworCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9IChBMCAoUTMwKSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4zMCkgIGluIFEwKi8KKyAgICAgICAgICAgIHRlbXBsPSgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIodGVtcGwscEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx5bkwsMzApCisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4zMCkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApID4+MzApIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAoUTExKSAqIHluTCAoUTApKT4+MTEpIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHluTCxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHluTE8sMTEpCisgICAgICAgICAgICAvKiB5bkxPPSggeW5MTyhRMCkgKyB4KG4pTCAoUTApICkgaW4gUTAqLworICAgICAgICAgICAgeW5MTys9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKEEwIChRMzApICogKHgobilSIChRMCkgLSB4KG4tMilSIChRMCkgKSA+PjMwKSAgIGluIFEwKi8KKyAgICAgICAgICAgIHRlbXBsPSgqKHBEYXRhSW4rMSkpLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHRlbXBsLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0seW5SLDMwKQorCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMiAoUTMwKSAqIHkobi0yKVIgKFEwKSApID4+MzApICBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIxIChRMzApICogeShuLTEpUiAoUTApICkgPj4zMCkgIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUk89ICgoR2FpbiAoUTExKSAqIHluUiAoUTApKT4+MTEpIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHluUixwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHluUk8sMTEpCisKKyAgICAgICAgICAgIC8qIHluUk89KCB5blJPKFEwKSArIHgobilSIChRMCkgKSBpbiBRMCovCisgICAgICAgICAgICB5blJPKz0gKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MOyAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQ9eW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD15blJPOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDYxNDJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKwordm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmOWM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNjRlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCit2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwczsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXBDb2VmLT5BMDsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXBDb2VmLT5HOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjA1MGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2MzI3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFNoaWZ0X1NhdF92MTZ4djE2IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworICAgIExWTV9JTlQzMiAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTFZNX0lOVDE2ICAgUlNoaWZ0OworICAgIGlmKHZhbD4wKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgdGVtcCA9IHRlbXAgPDwgdmFsOworCisgICAgICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYodmFsPDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KSgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHNyYyxkc3Qsbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKK3sKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CisKKyAgICBpZih2YWw+MCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBhLGI7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBiPShhPDx2YWwpOworCisgICAgICAgICAgICBpZiggKGI+PnZhbCkgIT0gYSApIC8qIGlmIG92ZXJmbG93IG9jY3VyZWQsIHJpZ2h0IHNoaWZ0IHdpbGwgc2hvdyBkaWZmZXJlbmNlKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihhPDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4N0ZGRkZGRkZsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmRzdCA9IGI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbDwwKQorICAgIHsKKyAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilzcmMsKExWTV9JTlQxNiAqKWRzdCwoTFZNX0lOVDE2KShuPDwxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAlY3JlYXRlZF9ieTogICAgc3JhICUgKENNL1MpKi8KKy8qICAgICAlbmFtZTogICAgICAgICAgZEJfdG9fTGluMzIuYyAlIChDTS9TKSovCisvKiAgICAgJXZlcnNpb246ICAgICAgIDIgJSAoQ00vUykqLworLyogICAgICVkYXRlX2NyZWF0ZWQ6ICBXZWQgSnVuIDE4IDExOjI3OjQ2IDIwMDggJSAoQ00vUykqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQorICogIElucHV0ICAgICAgIDogU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMTYpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wNSkgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDA0LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDMyKSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgzMS0+MTYpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgUmVtYXJrcyAgICAgOiAgTWFrZXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgY29udmVyc2lvbiBieSBjb3VudGluZyB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgb2YgNmRCIHN0ZXBzIGZvciB1c2UgYXMgc2hpZnRzIGFuZCB0aGVuIGludGVycG9sYXRlcyB3aXRoIGEgcmVtYWluZGVyCisgKiAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gPSAoUmVtYWluZGVyIC8gMS41MDI5KSAtIChSZW1haW5kZXJeMiAvIDYpCisgKgorICogICAgICAgICAgICAgICAgIFRoZSB0d28gY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZnJvbSAweDQwMDAwMDAwIGluIDk2IHN0ZXBzIGFuZCBjYWxjdWxhdGVkCisgKiAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICAgICAgICAgICAgRklSU1RfQ09FRiAgPSAweDgwMDAwMDAwIC8gKDk2ICogMS41MDI5KQorICogICAgICAgICAgICAgICAgIFNFQ09ORF9DT0VGID0gMHg4MDAwMDAwMCAvICg5Nl4yICogNikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KKyNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCisjZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKKyNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLworI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCisKK0xWTV9JTlQzMiAgIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0lOVDMyIExpbl92YWxfMzI7CisgICAgTFZNX0lOVDE2IFNoaWZ0OworICAgIExWTV9JTlQzMiBSZW1haW47CisKKworICAgIC8qCisgICAgICogQ2hlY2sgc2lnbiBvZiB0aGUgaW5wdXQKKyAgICAgKi8KKyAgICBpZiAoZGJfZml4PDApCisgICAgeworICAgICAgICBpZiAoZGJfZml4ID4gLU1BWF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgU2hpZnQgID0gKExWTV9JTlQxNikoKCgoTFZNX1VJTlQzMikoLWRiX2ZpeCkgPj4gNCkgKiBGT1VSX09WRVJfU0lYKSA+PiAxNyk7ICAgICAgICAvKiBOdW1iZXIgb2YgNmRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCAqLworICAgICAgICAgICAgUmVtYWluID0gLWRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAoMHg3RkZGRkZGRiAtIChSZW1haW4gKiBGSVJTVF9DT0VGX05FRykpICsgKFJlbWFpbiAqIFJlbWFpbiAqIFNFQ09ORF9DT0VGKTsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAoTFZNX0lOVDMyKSgoTFZNX1VJTlQzMilSZW1haW4gPj4gKDE2ICsgU2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChkYl9maXggPCBNQVhfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0ICA9IChMVk1fSU5UMTYpKCgoKExWTV9VSU5UMzIpZGJfZml4ID4+IDQpICogRk9VUl9PVkVSX1NJWCkgPj4gMTcpOyAgICAgICAgLyogTnVtYmVyIG9mIDZkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQgKi8KKyAgICAgICAgICAgIFJlbWFpbiA9IGRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAweDNGRkZGRkZGICsgKFJlbWFpbiAqIEZJUlNUX0NPRUZfUE9TKSArIChSZW1haW4gKiBSZW1haW4gKiBTRUNPTkRfQ09FRik7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpUmVtYWluID4+ICgxNSAtIFNoaWZ0KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gMHg3RkZGRkZGRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIExpbl92YWxfMzI7ICAvKiBmb3JtYXQgMS4xNi4xNSAqLworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTI1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNVUxUM1NfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE11bHQzc18xNngxNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgqc3JjKSAqIChMVk1fSU5UMzIpdmFsOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ID0gKExWTV9JTlQxNikodGVtcCA+PiAxNSk7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZhYWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiB0aGUgTi1CYW5kIGVxdWFsaXNlci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBhbGdvcml0aG0gY2FuIGV4ZWN1dGUgZWl0aGVyIHdpdGggc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9yIHdpdGggICAgICovCisvKiAgYSBjb21tb24gYnVmZmVyLCBpLmUuIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBpbi1wbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHdvIGRhdGEgZm9ybWF0cyBhcmUgc3VwcG9ydCBTdGVyZW8gYW5kIE1vbm8tSW4tU3RlcmVvLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyAgKi8KKy8qICBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEJ5dGUgT2Zmc2V0ICAgICAgICAgU3RlcmVvIElucHV0ICAgICAgICAgTW9uby1Jbi1TdGVyZW8gSW5wdXQgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgPT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMxICAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMxICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMiAgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMiAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm8gZm9ybWF0IGRhdGEgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgYSBNb25vIHN0cmVhbSAgICovCisvKiAgaW4gdG8gTW9uby1Jbi1TdGVyZW8gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpbiB0aGUgZmlsdGVyIGJhbmQgZGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgYXMgZm9sbG93czogICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluICAgICAgICBpcyBpbiBpbnRlZ2VyIGRCLCByYW5nZSAtMTVkQiB0byArMTVkQiBpbmNsdXNpdmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZyZXF1ZW5jeSAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5IGluIEh6LCByYW5nZSBEQyB0byBOeXF1aXN0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUUZhY3RvciAgICAgaXMgdGhlIFEgbXVsdGlwbGllZCBieSAxMDAsIHJhbmdlIDAuMjUgKDI1KSB0byAxMiAoMTIwMCkgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiA9IDcgICAgICAgICAgICA3ZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcmVxdWVuY3kgPSAyNDY3ICAgIENlbnRyZSBmcmVxdWVuY3kgPSAyLjQ2N2tIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFFGYWN0b3IgPSAxMDg5ICAgICAgUSA9IDEwLjg5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBlcXVhbGlzZXIgZmlsdGVycyBhcmUgcGFzc2VkIGFzIGEgcG9pbnRlciB0byBhbmQgYXJyYXkgb2YgZmlsdGVyIGJhbmQgICAgICAgICAgICovCisvKiAgZGVmaW5pdGlvbnMgc3RydWN0dXJlcy4gVGhlcmUgbXVzdCBiZSBvbmUgZmlsdGVyIGRlZmluaXRpb24gZm9yIGVhY2ggYmFuZC4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0xWRVFOQl9IX18KKyNkZWZpbmUgX19MVkVRTkJfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUgKi8KKyNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAgMSAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgIDIgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KKyNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIGRhdGEgc2NyYXRjaCBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBDYWxsYmFjayBldmVudHMgKi8KKyNkZWZpbmUgTFZFUU5CX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwICAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCisjZGVmaW5lIExWRVFOQl9FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBFUU5CIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqTFZFUU5CX0hhbmRsZV90OworCisKKy8qIE9wZXJhdGluZyBtb2RlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0JZUEFTUyAgID0gMCwKKyAgICBMVkVRTkJfT04gICAgICAgPSAxLAorICAgIExWRVFOQl9NT0RFX01BWCA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX01vZGVfZW47CisKKworLyogRmlsdGVyIG1vZGUgY29udHJvbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0ZJTFRFUl9PRkYgICA9IDAsCisgICAgTFZFUU5CX0ZJTFRFUl9PTiAgICA9IDEsCisgICAgTFZFUU5CX0ZJTFRFUl9EVU1NWSA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX0ZpbHRlck1vZGVfZW47CisKKworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkVRTkJfUEVSU0lTVEVOVCAgICAgID0gMCwKKyAgICBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBID0gMSwKKyAgICBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGID0gMiwKKyAgICBMVkVRTkJfU0NSQVRDSCAgICAgICAgID0gMywKKyAgICBMVkVRTkJfTUVNT1JZX01BWCAgICAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1NVQ0NFU1MgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVkVRTkJfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZFUU5CX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTGlua2VkIGVudW1lcmF0ZWQgdHlwZSBhbmQgY2FwYWJpbGl0eSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBjYXBhYmlsaXR5IGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGF0ICAgICAgICAgICovCisvKiAgaW5pdGlhbGlzYXRpb24sIHRoZXNlIGFyZSBhZGRlZCB0b2dldGhlciB0byBnaXZlIHRoZSBjYXBhYmlsaXR5IHdvcmQuIFRoZSAgICAgICAgICAgKi8KKy8qICBlbnVtZXJhdGVkIHR5cGUgaXMgdXNlZCB0byBzZWxlY3QgdGhlIG1vZGUgdGhyb3VnaCBhIGNvbnRyb2wgZnVuY3Rpb24gYXQgcnVuIHRpbWUuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBlbnVtZXJhdGVkIHR5cGUgdmFsdWUgYnkgdGhlIGVxdWF0aW9uOiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQ2FwYWJpbGl0eV92YWx1ZSA9IDJeRW51bWVyYXRlZF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGb3IgZXhhbXBsZSwgYSBtb2R1bGUgY291bGQgYmUgY29uZmlndXJkIGF0IGluaXRpYWxpc2F0aW9uIHRvIHN1cHBvcnQgdHdvIHNhbXBsZSAgICAqLworLyogIHJhdGVzIG9ubHkgYnkgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbiB3aXRoIHRoZSB2YWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhcGFiaWxpdGllcy5TYW1wbGVSYXRlID0gTFZFUU5CX0NBUF8zMjAwMCArIExWRVFOQl9DQVBfNDQxMDA7ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGFuZCBhdCBydW4gdGltZSBpdCB3b3VsZCBiZSBwYXNzZWQgdGhlIHZhbHVlIExWRVFOQl9GU18zMjAwMCB0aHJvdWdoIHRoZSBjb250cm9sICAgICovCisvKiAgZnVuY3Rpb24gdG8gc2VsZWN0IG9wZXJhdGlvbiBhdCAzMmtIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTdXBwb3J0ZWQgc291cmNlIGRhdGEgZm9ybWF0cworICovCisjZGVmaW5lIExWRVFOQl9DQVBfU1RFUkVPICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTyAgICAgICAgICAgIDIKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1NURVJFTyAgICAgICA9IDAsCisgICAgTFZFUU5CX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZFUU5CX1NPVVJDRV9NQVggICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX1NvdXJjZUZvcm1hdF9lbjsKKworCisvKgorICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKKyAqLworI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzgwMDAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTIwMDAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE2MDAwICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzI0MDAwICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0ZTXzgwMDAgID0gMCwKKyAgICBMVkVRTkJfRlNfMTEwMjUgPSAxLAorICAgIExWRVFOQl9GU18xMjAwMCA9IDIsCisgICAgTFZFUU5CX0ZTXzE2MDAwID0gMywKKyAgICBMVkVRTkJfRlNfMjIwNTAgPSA0LAorICAgIExWRVFOQl9GU18yNDAwMCA9IDUsCisgICAgTFZFUU5CX0ZTXzMyMDAwID0gNiwKKyAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAorICAgIExWRVFOQl9GU180ODAwMCA9IDgsCisgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfRnNfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCisgICAgTFZFUU5CX01lbW9yeVR5cGVzX2VuICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KK30gTFZFUU5CX01lbW9yeVJlZ2lvbl90OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZFUU5CX01lbW9yeVJlZ2lvbl90ICAgICAgIFJlZ2lvbltMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWRVFOQl9NZW1UYWJfdDsKKworCisvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5OyAgICAgICAgICAgICAgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKi8KK30gTFZFUU5CX0JhbmREZWZfdDsKKworCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWRVFOQl9Nb2RlX2VuICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOworICAgIExWRVFOQl9Gc19lbiAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWRVFOQl9Tb3VyY2VGb3JtYXRfZW4gICAgICBTb3VyY2VGb3JtYXQ7CisKKyAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKworfSBMVkVRTkJfUGFyYW1zX3Q7CisKKworLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCYW5kczsKKworICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICAgICAgQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogQnVuZGxlIGNhbGxiYWNrICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQnVuZGxlSW5zdGFuY2U7ICAgICAgIC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KKworfSBMVkVRTkJfQ2FwYWJpbGl0aWVzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBhbnkgb2YgcE1lbW9yeVRhYmxlIGFuZCBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgYWRkcmVzcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX01lbW9yeShMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLworLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLworLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCisvKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KKy8qICBMVkVRTkJfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBlcXVhbGlzZXIgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBlcXVhbGlzZXIgbW9kdWxlIGNhcGFiaWxpdGllcy4gVGhlIGNhcGFiaWxpdGllcyBzZXQgaXMgcmV0dXJuZWQgICAgICAgICAqLworLyogIHZpYSB0aGUgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgaEluc3RhbmNlIG9yIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBlcXVhbGlzZXIgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIEluc3RhbmNlIG9yIHBQYXJhbXMgIGlzIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgTlVMTCBhZGRyZXNzIGZvciB0aGUgZXF1YWxpc2VyIGZpbHRlciBkZWZpbml0aW9ucyBhbmQgdGhlICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgYmFuZHMgaXMgbm9uLXplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExpZmVWaWJlcyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgTlVMTCAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9BTElHTk1FTlRFUlJPUiAgIFdoZW4gcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgbm90IDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1RPT01BTllTQU1QTEVTICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVkVRTkJfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRlZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkVRTkJfRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgICAgZm9yIGEgcGVha2luZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyRGVmaW5pdGlvbiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRyAgPSAxMF4oR2FpbmRCLzIwKSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEQgID0gMSAgICAgICAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxIC8gKDEgKyBHKSAgICAgICAgaWYgR2FpbmRCIDwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIEQgKiB0MCkgLyAoMlEgKyBEICogdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluZEIgICAgICBpcyB0aGUgZ2FpbiBpbiBkQnMsIHJhbmdlIC0xNWRCIHRvICsxNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9HYWluVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIExWTV9VSU5UMTYgICAgICAgICAgUUZhY3RvciAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvcjsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbisxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOSkgKyAoRHQwID4+IDIpOworICAgIEIyX051bSA9IChEdDAgPj4gMykgLSAoKExWTV9JTlQzMilRRmFjdG9yIDw8IDE4KTsKKyAgICBCMiA9IChCMl9OdW0gLyAoQjJfRGVuID4+IDE2KSkgPDwgMTU7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAorICAgICAqLworICAgIFQwID0gKFQwID4+IDYpICogMHg3ZjUzOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDU7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDb3NFcnIgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ29zRXJyID0gQ29zRXJyIDw8IChMVkVRTkJfRFBDb3NDb2VmWzBdKTsgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKDB4NDAwMDAwMDAgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKi8KKyAgICBBMCA9ICgoQjEgPj4gMTYpICogKENvc0VyciA+PiAxMCkpID4+IDY7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIvMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMi8yKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKyAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbisxNV07CisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyAgICBmb3IgYSBwZWFraW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJEZWZpbml0aW9uICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHICA9IDEwXihHYWluZEIvMjApIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxICAgICAgICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEICA9IDEgLyAoMSArIEcpICAgICAgICBpZiBHYWluZEIgPCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gRCAqIHQwKSAvICgyUSArIEQgKiB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW5kQiAgICAgIGlzIHRoZSBnYWluIGluIGRCcywgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSAoTFZNX0lOVDMyKUZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4rMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOworICAgIEIyX0RlbiA9ICgoTFZNX0lOVDMyKVFGYWN0b3IgPDwgMTkpICsgKER0MCA+PiAyKTsKKyAgICBCMl9OdW0gPSAoRHQwID4+IDMpIC0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOCk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVkVRTkJfQ29zQ29lZlswXSs2KTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisKKyAgICBCMSA9ICgoMHg0MDAwMDAwMCAtIEIyKSA+PiAxNikgKiAoQ09TX1QwID4+IDE2KTsgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKiBjb3ModDApICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyLzIpICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAoTFZNX0lOVDE2KShBMD4+MTYpOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gKExWTV9JTlQxNikoQjE+PjE1KTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IChMVk1fSU5UMTYpKEIyPj4xNik7CisgICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4rMTVdOworCisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDcxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIF9fTFZFUU5CX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkVRTkJfQ09FRkZTX0hfXworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB0YWJsZSBmb3IgKDEwXihHYWluLzIwKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODIyMTcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODAwNDc0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzc2MTI4ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzQ4ODExICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzE4MTYyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjgzNzcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjQ1MTg3ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjAxODkzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTUzMzE2ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDk4ODEzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDM3NjU5ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzY5MDQzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjkyMDU0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA1NjcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTA4NzQ5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEyMjAxOCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU4OTI1ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MTA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NDY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDUyNCAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMzkzICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAyODUgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDI2MiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl8xMDBEU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS42MjM0MTMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjAxMTg3MiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNDY2ODM2ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjU0ODEzNCAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuMTYyMjc4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjUxMTg4NiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMjM4NzIxICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc3ODI3OSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTg0ODkzICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU3ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTi1CYW5kIGVxdWFsaXNlciBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkIHZpYSAgKi8KKy8qICB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIE4tQmFuZCBlcXVhbGlzZXIgY2FwYWJpbGl0aWVzLiBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXMgYXJlIHJldHVybmVkICAgICovCisvKiAgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgaEluc3RhbmNlIG9yIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcENhcGFiaWxpdGllcyA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9TZXRGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdm9pZCAgICAgICAgICAgICAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVG8gc2VsZWN0IHRoZSBiaXF1YWQgdHlwZSB0aGUgZm9sbG93IHJ1bGVzIGFyZSBhcHBsaWVkOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZmMgPD0gZnMvMTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBTaW5nbGUgcHJlY2lzaW9uICAgIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisKKworICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOworCisgICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb247ICAgICAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoKGZjIDw8IDE1KSA8PSAoSElHSF9GUkVRICogZnMpKSAmJiAoUUZhY3RvciA+IDMwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZjID4gKGZzID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX091dE9mUmFuZ2U7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9uIHRvIHBlcnNpc3RhbnQgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0gPSBwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV07CisKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSB0eXBlIHRvIHNlbGVjdCBzaW5nbGUgb3IgZG91YmxlICAgICAqLworLyogIHByZWNpc2lvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgQmlxdWFkVHlwZTsgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzIGZvciBlYWNoIGJhbmQgYnkgdGhlIGluaXQgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHM7IGkrKykKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgYmFuZCB0eXBlIGZvciBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgcmVjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgKi8KKyAgICAgICAgQmlxdWFkVHlwZSA9IHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV07CisgICAgICAgIHN3aXRjaCAgKEJpcXVhZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEVRTkJfVGFwc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb246CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDbGVhcnMgdGhlIGZpbHRlciBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CisKKworICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwczsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpL3NpemVvZihMVk1fSU5UMTYpKTsKKworICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBOVUxMIGFkZHJlc3MgZm9yIHRoZSBlcXVhbGlzZXIgZmlsdGVyIGRlZmluaXRpb25zIGFuZCB0aGUgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiYW5kcyBpcyBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgYkNoYW5nZSAgICA9IExWTV9GQUxTRTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBpID0gMDsKKyAgICBMVkVRTkJfTW9kZV9lbiAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBpZigocFBhcmFtcy0+TkJhbmRzICE9MCkgJiYgKHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbj09TFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICAvKiBTZXQgdGhlIGFscGhhIGZhY3RvciBvZiB0aGUgbWl4ZXIgKi8KKyAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICB9CisKKworICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCisgICAgeworCisgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgaWYoYkNoYW5nZSl7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7ICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgdGhlIGZpbHRlcnMgZXhjZXB0IGlmIHRoZSBhbGdvIGlzIHN3aXRjaGVkIG9mZgorICAgICAgICAgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkVRTkJfQllQQVNTKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgIH0KKworICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOworCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrIGZ1bmN0aW9uIG9mIHRoZSBtaXhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2sgID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CisKKyAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworCisgICAgIC8qCisgICAgICAqIFNlbmQgYW4gQUxHT0ZGIGV2ZW50IGlmIHRoZSBPTi0+T0ZGIHN3aXRjaCB0cmFuc2l0aW9uIGlzIGZpbmlzaGVkCisgICAgICAqLworICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7CisgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CisKKyAgICByZXR1cm4gMTsKK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNlNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKworICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgICAgICovCisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0lOU1RBTkNFX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0YW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7ICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOyAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0RBVEFfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGFudCBjb2VmZmljaWVudCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWRVFOQl9DT0VGX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLworLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLworLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCisvKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KKy8qICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICAgICovCisvKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2U7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBNZW1TaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW07CisgICAgTFZNX0lOVDMyICAgICAgICAgICBpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycworICAgICAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZFUU5CX05VTExBRERSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKi8KKworICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCBzaXplb2YoTFZFUU5CX0luc3RhbmNlX3QpKTsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7CisKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgYW5kCisgICAgICogc2V0IHRoZSBzdHJ1Y3R1cmUgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlICAgICAgID0gKnBNZW1vcnlUYWJsZTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgY29lZmZpY2llbnQgbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOworCisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKworCisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGRhdGEgbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7CisgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSk7CisgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IChMVkVRTkJfQmlxdWFkVHlwZV9lbiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworCisKKyAgICAvKgorICAgICAqIEludGVybmFsbHkgbWFwLCBzdHJ1Y3R1cmUgYW5kIGFsbGlnbiBzY3JhdGNoIG1lbW9yeQorICAgICAqLworICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9JTlQxNiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0lOVDE2KSk7CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyAgICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5wQmFuZERlZmluaXRpb24gPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgPSBMVkVRTkJfU1RFUkVPOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZmlsdGVyIGhpc3RvcnkgKi8KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcworICAgICAqLworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9NQVhJTlRfMTYpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fRlNfODAwMCwyKTsKKworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY5ODBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZFUU5CX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZFUU5CX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSBMVkVRTkJfSU5WQUxJRCAgICAgICAgICAgICAgMHhGRkZGICAgICAgICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLworCisjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uID0gMCwKKyAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uID0gMSwKKyAgICBMVkVRTkJfT3V0T2ZSYW5nZSAgICAgID0gMiwKKyAgICBMVkVRTkJfQklRVUFEVFlQRV9NQVggID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfQmlxdWFkVHlwZV9lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCisgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCisKKyAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgICAgICpwRVFOQl9UYXBzOyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZTsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKworICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbnM7ICAvKiBGaWx0ZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCisKKyAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICAgIEJ5cGFzc01peGVyOyAgICAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHVzZWQgaW4gdHJhbnNpdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCisKK30gTFZFUU5CX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworCit2b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSk7CisKK3ZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAqcEluc3RhbmNlKTsKKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworCitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfX0xWRVFOQl9QUklWQVRFX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYzc0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIgorI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0hJRlQgICAgICAgMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBOVUxMICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SICAgV2hlbiBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBub3QgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAqcFNjcmF0Y2g7CisKKworICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCisgICAgaWYgKCgoKExWTV9JTlQzMilwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgoTFZNX0lOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOworICAgIH0KKworICAgIHBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworCisgICAgLyoKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSAxNi1iaXQgdG8gMzItYml0CisgICAgICAgICAqLworICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKworICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgICAgIGVsc2V7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAvKiBTY2FsaW5nIHNoaWZ0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJlMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfQ29lZmZzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKKyAqIGZyZXF1ZW5jeQorICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciAyICogUGkgLyBGcworICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwfTsgICAgLyogNDhrUy9zICovCisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKworCisvKgorICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQorICovCitjb25zdCBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqICsxLjAgdG8gLTEuMAorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9EUENvc0NvZWZbXSA9IHsxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzODAwMCAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMTAyNSAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczEyMDAwICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyMjA1MCAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczI0MDAwICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0NDEwMCAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ4MDAwICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCisKK2NvbnN0IExWTV9JTlQxNiBMVkVRTkJfTWl4ZXJUQ1RhYmxlW10gPSB7CisgICAgTFZFUU5CX01JWF9UQ19GczgwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczExMDI1LAorICAgIExWRVFOQl9NSVhfVENfRnMxMjAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczIyMDUwLAorICAgIExWRVFOQl9NSVhfVENfRnMyNDAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczQ0MTAwLAorICAgIExWRVFOQl9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUzMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiB0aGUgTFZSRVYgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgKi8KKy8qICByZXF1aXJlZCBieSB0aGUgY2FsbGluZyBsYXllci4gQWxsIG90aGVyIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgYXJlICAgICAgICAqLworLyogIHByaXZhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZSRVZfSF9fCisjZGVmaW5lIF9fTFZSRVZfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsICovCisjZGVmaW5lIExWUkVWX0JMT0NLU0laRV9NVUxUSVBMRSAgICAgICAgICAgICAgICAxICAgICAgIC8qIFByb2Nlc3NpbmcgYmxvY2sgc2l6ZSBtdWx0aXBsZSAqLworI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAvKiBNYXhpbXVtIGRlY2F5IHRpbWUgaXMgNzAwMG1zICovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lIExWUkVWX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICA0ICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqTFZSRVZfSGFuZGxlX3Q7CisKKworLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWUkVWX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWUkVWX05VTExBRERSRVNTICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWUkVWX09VVE9GUkFOR0UgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVlJFVl9JTlZBTElETlVNU0FNUExFUyAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIExWUkVWX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWUkVWX1JldHVyblN0YXR1c19lbjsKKworCisvKiBSZXZlcmIgZGVsYXkgbGluZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWUkVWX0RFTEFZTElORVNfMSAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmUgZGVsYXkgbGluZSAqLworICAgIExWUkVWX0RFTEFZTElORVNfMiAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUd28gZGVsYXkgbGluZXMgKi8KKyAgICBMVlJFVl9ERUxBWUxJTkVTXzQgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm91ciBkZWxheSBsaW5lcyAqLworICAgIExWUkVWX0RFTEFZTElORVNfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVlJFVl9OdW1EZWxheUxpbmVzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVlJFVl9NZW1vcnlUYWJsZV9zdDsKKworCisvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIE9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLworCisgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTFBGOyAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBIUEY7ICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEYW1waW5nOyAgICAgICAgICAgICAgICAvKiBEYW1waW5nICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFJvb21TaXplOyAgICAgICAgICAgICAgIC8qIFNpbXVsYXRlZCByb29tIHNpemUsIDEgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gc2l6ZSAqLworCit9IExWUkVWX0NvbnRyb2xQYXJhbXNfc3Q7CisKKworLyogSW5zdGFuY2UgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCisKKyAgICAvKiBSZXZlcmIgKi8KKyAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0cyB0byBzdXBwb3J0ICovCisgICAgTFZSRVZfTnVtRGVsYXlMaW5lc19lbiAgICAgIE51bURlbGF5czsgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZGVsYXkgbGluZXMsIDEsIDIgb3IgNCAqLworCit9IExWUkVWX0luc3RhbmNlUGFyYW1zX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0TWVtb3J5VGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgTFZSRVYgbW9kdWxlIG1lbW9yeSByZXF1aXJlbWVudHMgdG8gc3VwcG9ydCAgICAgKi8KKy8qICBtZW1vcnkgYWxsb2NhdGlvbi4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZXR1cm4gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcHJvdmlkZWQgICAqLworLyogIGR1cmluZyBtZW1vcnkgYWxsb2NhdGlvbiB0byBzdXBwb3J0IGZyZWVpbmcgb2YgbWVtb3J5IHdoZW4gdGhlIExWUkVWIG1vZHVsZSBpcyBubyAgICovCisvKiAgbG9uZ2VyIHJlcXVpcmVkLiBJdCBpcyBjYWxsZWQgaW4gdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhbGxvY2F0ZWQgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGhJbnN0YW5jZSA9IE5VTEwgdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgKi8KKy8qICB3aWxsIGJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlaW5nIG1lbW9yeSwgaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlIHRoZSAgICAgKi8KKy8qICBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgICAgICAgICAgICAqLworLyogIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcE1lbW9yeVRhYmxlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiByZXF1ZXN0aW5nIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHBJbnN0YW5jZVBhcmFtcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAqcEluc3RhbmNlUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBMVlJFViBtb2R1bGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgICAgICovCisvKiAgaW5zdGFuY2UgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byBpbnZhbGlkIHZhbHVlcywgdGhlICAgKi8KKy8qICBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgc2V0IG9mIHZhbGlkIGNvbnRyb2wgICAgICAqLworLyogIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgbWVtb3J5IGFsbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gYnkgZmlsbGluZyBpbiB0aGUgbWVtb3J5ICAqLworLyogIHJlZ2lvbiBiYXNlIGFkZHJlc3NlcyBpbiB0aGUgbWVtb3J5IHRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcGhJbnN0YW5jZSBvciBwTWVtb3J5VGFibGUgb3IgcEluc3RhbmNlUGFyYW1zIGlzIE5VTEwgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlhYX0dldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMVlJFViBtb2R1bGUgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwQ29udHJvbFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBMVlJFViBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTmV3UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBOZXdQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbGVhciB0aGUgaW50ZXJuYWwgYXVkaW8gYnVmZmVycyBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTFZSRVYgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIF9fTFZSRVZfSF9fICovCisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyZWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbGllcyB0aGUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByaXZhdGUgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcHJpdmF0ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBQcml2YXRlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQoreworCisgICAgTFZNX01vZGVfZW4gIE9wZXJhdGluZ01vZGU7CisgICAgTFZNX0lOVDMyICAgIE51bWJlck9mRGVsYXlMaW5lczsKKworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOworICAgIH0KKworICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisKKyAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7CisgICAgICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAgICAgKHZvaWQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfVGFwc190KS9zaXplb2YoTFZNX0lOVDMyKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisKKworICAgICAgICBDb2VmZnMuQTAgPSAweDdGRkZGRkZGOworICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKE9tZWdhPD1MVlJFVl8yXzlfSU5RMjkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwKKyAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QpL3NpemVvZihMVk1fSU5UMzIpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkvMTApOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIFQgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHRoZSBhbGwgcGFzcyBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9VSU5UMzIgIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOworICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0lOVDE2ICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBMVlJFVl9NQVhfVDJfREVMQVksIExWUkVWX01BWF9UM19ERUxBWX07CisgICAgICAgIExWTV9JTlQxNiAgIE1heEFQX0RlbGF5W10gPSB7TFZSRVZfTUFYX0FQMF9ERUxBWSwgTFZSRVZfTUFYX0FQMV9ERUxBWSwgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAqLworICAgICAgICBmb3IgKGk9MDsgaTxOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMzIgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICBMVk1fSU5UMzIgVGVtcDI7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKworICAgICAgICAgICAgICAgIFRlbXAyPShMVk1fSU5UMzIpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAyLCBTY2FsZVRhYmxlW2ldLCBUZW1wMSwgMTUpCisgICAgICAgICAgICAgICAgVGVtcD0oTFZNX1VJTlQzMilUZW1wMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUZW1wICAgICAgICAgICAgICAgICAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gNDgwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+RGVsYXlfQVBbaV0gPSBwUHJpdmF0ZS0+VFtpXSAtIFRlbXA7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byB0YXAgQiAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQiB0byB0YXAgQSAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBibG9jayBzaXplIHRvIHRoZSBzbWFsbGVzdCBkZWxheSBzaXplCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gICA9IFRlbXA7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTGltaXQgdGhlIG1heGltdW0gYmxvY2sgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuPXBQcml2YXRlLT5NYXhCbGtMZW4tMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBpZihwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9JTlQzMiAgICAgICBUZW1wOworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBpOworICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0lOVDMyICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8TnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoU2NhbGVUYWJsZVtpXSwgRGFtcGluZywgVGVtcCwgMTUpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IERhbXBpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihUZW1wIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKChMVk1fVUlOVDE2KVRlbXAsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZmZzLkEwID0gMHg3RkYwMDAwMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICAgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2ldLCAmcFByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzW2ldLCAmQ29lZmZzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgQWxsLXBhc3MgZmlsdGVyIG1peGVyIHRpbWUgY29uc3RhbnRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0lOVDMyICAgQWxwaGEgICAgPSAoTFZNX0lOVDMyKUxWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOworICAgICAgICBMVk1fSU5UMzIgICBBbHBoYVRhcCA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOworCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGZlZWQgYmFjayBnYWluCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgICAgICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgR1szXSA9IDA7CisgICAgICAgICAgICBHWzJdID0gMDsKKyAgICAgICAgICAgIEdbMV0gPSAwOworICAgICAgICAgICAgR1swXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMzIgICBUZW1wMTsKKyAgICAgICAgICAgIExWTV9JTlQzMiAgIFRlbXAyOworICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgICAgIExWTV9JTlQxNiAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAxID0gKDMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zICogU2NhbGVUYWJsZVtpXSkgLyBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDsKKyAgICAgICAgICAgICAgICBpZihUZW1wMSA+PSAoNCA8PCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIgPDwgMTUpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAyID0gTFZNX1Bvd2VyMTAoLShUZW1wMSA8PCAxNCkpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgPDwgMTQpKTsKKyAgICAgICAgICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoVGVtcDEsVGVtcDIsVGVtcDEsMjQpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSA8PCAxNSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgIFRlbXBHOworICAgICAgICAgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxPTkVfT1ZFUl9TUVJUX1RXTyxUZW1wRywxNSkKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTw8NzsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV08PDc7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdPDw3OworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTw8NzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgICAgICBMVk1fSU5UMzIgaT0wOworICAgICAgICBMVk1fSU5UMzIgR2Fpbj0wOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0lOVDMyIFQ2MDsKKyAgICAgICAgTFZNX0lOVDMyIENvZWZzWzVdOworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplPTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZT0oTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDwxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KKyAgICAgICAgZm9yKGk9MDtpPDI0O2krKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUm9vbVNpemU8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4PWk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKFJvb21TaXplPT1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGFrZSB0YWJsZSB2YWx1ZXMgaWYgdGhlIHJvb20gc2l6ZSBpcyBpbiB0YWJsZSAqLworICAgICAgICAgICAgZm9yKGk9MTtpPDU7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV09TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworICAgICAgICAgICAgR2Fpbj1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLworCisgICAgICAgICAgICBMVk1fSU5UMzIgR2FpbjEsR2FpbjI7CisgICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKKworICAgICAgICAgICAgVG90X0Rpc3Q9TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0tTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIERpc3Q9Um9vbVNpemUtTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KKyAgICAgICAgICAgIGZvcihpPTE7aTw1O2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdPUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworCisgICAgICAgICAgICBHYWluMT1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIHNlY29uZCAqLworICAgICAgICAgICAgZm9yKGk9MTtpPDU7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV09TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworCisgICAgICAgICAgICBHYWluMj1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogTGluZWFyIEludGVycG9sYXRlIHRoZSBnYWluICovCisgICAgICAgICAgICBHYWluID0gR2FpbjErICgoKEdhaW4yLUdhaW4xKSpEaXN0KS8oVG90X0Rpc3QpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnZlcnNlIG9mIGdhaW46IFEuMTUKKyAgICAgICAgICogR2FpbiBpcyBtb3N0bHkgYWJvdmUgb25lIGV4Y2VwdCBmZXcgY2FzZXMsIHRha2Ugb25seSBnYWlucyBhYm92ZSAxCisgICAgICAgICAqLworICAgICAgICBpZihHYWluIDwgMTY3NzcyMTZMKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbj0gMzI3Njc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbj0oTFZNX0lOVDE2KShMVk1fTUFYSU5UXzMyLyhHYWluPj44KSk7CisgICAgICAgIH0KKworCisgICAgICAgIEluZGV4PSgoMzI3NjcqMTAwKS8oMTAwK3BQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwpKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW49KExWTV9JTlQxNikoKHBQcml2YXRlLT5HYWluKkluZGV4KT4+MTUpOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IHBQcml2YXRlLT5HYWluKkluZGV4OworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fSU5UMzIgICBiID0gcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisKKyAgICAgICAgZm9yIChpPTA7aTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICA9IGI7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSBiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgICB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIE1PTk8gZm9ybWF0ICovCisgICAgICAgIExWTV9JTlQzMiAgICBBbHBoYTsKKworICAgICAgICBBbHBoYSA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9GRUVEQkFDS01JWEVSX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5BbHBoYT1BbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGE9QWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhPUFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5BbHBoYT1BbHBoYTsKKworICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9CWVBBU1NNSVhFUl9UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuQWxwaGEgICAgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0YXJnZXRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAmJgorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSkKKyAgICB7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKChMVk1fSU5UMzIpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKiAzMjc2NykvMTAwKTw8MTY7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUpCisgICAgeworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKChMVk1fSU5UMzIpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKiAzMjc2NykvMTAwKTw8MTY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMHgwM0ZGRkZGRjsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdAorICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAqLworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zID0gcFByaXZhdGUtPk5ld1BhcmFtczsKKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZTsKKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgZmxhZworICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CisgICAgfQorCisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnRyb2xzIHRoZSBPbiB0byBPZmYgb3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQcml2YXRlICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHByaXZhdGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwUHJpdmF0ZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrICh2b2lkICpwQ2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBHZW5lcmFsUHVycG9zZSApCit7CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopcENhbGxiYWNrRGF0YTsKKworCisgICAgLyoKKyAgICAgKiBBdm9pZCBidWlsZCB3YXJuaW5ncworICAgICAqLworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClHZW5lcmFsUHVycG9zZTsKKworCisgICAgLyoKKyAgICAgKiBUdXJuIG9mZgorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9UUlVFOworICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKChMVlJFVl9IYW5kbGVfdClwQ2FsbGJhY2tEYXRhKTsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjFlODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIG1vZHVsZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgSW5zdGFuY2UgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKExWUkVWX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisKKyAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCisgICAgICovCisKKworICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgIDIpOworICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgIDIpOworCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworCisgICAgfQorCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisKKyAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICB7CisgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMVlJFViBtb2R1bGUgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwQ29udHJvbFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpCit7CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDb250cm9sUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgKnBDb250cm9sUGFyYW1zID0gcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtczsKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNTEzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIExWUkVWIG1vZHVsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCAgICAgKi8KKy8qICBpbnN0YW5jZSBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsICAgICAgICAqLworLyogIGluYWN0aXZlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcGhJbnN0YW5jZSBvciBwTWVtb3J5VGFibGUgb3IgcEluc3RhbmNlUGFyYW1zIGlzIE5VTEwgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcykKK3sKKworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgICAqcExWUkVWX1ByaXZhdGU7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGFsbCBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQorICAgICAqLworICAgIC8qIENoZWNrIGZvciBhIG5vbi16ZXJvIGJsb2NrIHNpemUgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSYmCisgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpJiYKKyAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyk7CisKKyAgICAvKgorICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCisgICAgICovCisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgfQorICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7CisgICAgcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICB9CisgICAgZWxzZSBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7CisgICAgfQorCisgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGRhdGEsIGNvZWZmaWNpZW50IGFuZCB0ZW1wb3JhcnkgbWVtb3J5IHBvaW50ZXJzCisgICAgICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAsKExWTV9JTlQxNilMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICwoTFZNX0lOVDE2KUxWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgLChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAsKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgLyogQWxsLXBhc3MgZGVsYXkgYnVmZmVyIGFkZHJlc3NlcyBhbmQgc2l6ZXMgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFswXSAgICAgICAgID0gTFZSRVZfTUFYX1QwX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5UWzFdICAgICAgICAgPSBMVlJFVl9NQVhfVDFfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPlRbMl0gICAgICAgICA9IExWUkVWX01BWF9UMl9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFszXSAgICAgICAgID0gTFZSRVZfTUFYX1QzX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOyAgICAgICAvKiBTZWxlY3Qgc21vb3RoaW5nIEEgdG8gQiAqLworCisKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3RDb2VmICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCisgICAgTG9hZENvbnN0XzMyKDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUqMikpOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcyA9ICpwSW5zdGFuY2VQYXJhbXM7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGludmFsaWQKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlICAgID0gTFZNX0ZTX0lOVkFMSUQ7CisgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX0RVTU1ZOworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU09VUkNFX0RVTU1ZOworCisgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICAgICAgID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworCisgICAgLyoKKyAgICAgKiBTZXQgbWl4ZXIgcGFyYW1ldGVycworICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiAgICA9IHBMVlJFVl9Qcml2YXRlOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgICAgICAgICAgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgICAgICAgICAgICA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgICAgICAgICAgICAgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMSAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UxICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazEgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQxICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworCisgICAgcExWUkVWX1ByaXZhdGUtPlJvb21TaXplSW5tcyAgICAgICAgICAgICAgICAgICAgPSAxMDA7ICAvLyAxMDAgbXNlYworCisKKyAgICAvKgorICAgICAqICBTZXQgdGhlIG91dHB1dCBnYWluIG1peGVyIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAweDAzZmZmZmZmOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKKyAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTIgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxiYWNrSGFuZGxlMSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICAgICAgICA9IDA7CisgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbEJhY2sgICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkN1cnJlbnQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5UYXJnZXQgICAgICAgICAgID0gMDsKKyAgICB9CisgICAgLyogRGVsYXkgdGFwIGluZGV4ICovCisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMF0gPSBMVlJFVl9NQVhfQVAwX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzFdID0gTFZSRVZfTUFYX0FQMV9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsyXSA9IExWUkVWX01BWF9BUDJfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbM10gPSBMVlJFVl9NQVhfQVAzX0RFTEFZOworCisKKyAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygqcGhJbnN0YW5jZSk7CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTI0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYWxsb2NhdGVkICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwTWVtb3J5VGFibGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHJlcXVlc3RpbmcgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgcEluc3RhbmNlUGFyYW1zICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldE1lbW9yeVRhYmxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICpwSW5zdGFuY2VQYXJhbXMpCit7CisKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBTbG93RGF0YTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0RGF0YTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0Q29lZjsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBUZW1wb3Jhcnk7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHNvIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgICAgICBpZiAoKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMSkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpICYmCisgICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCAqKUxWTV9OVUxMKTsKKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIG51bGwgcG9pbnRlcnMKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMgPT0gTFZNX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNlbGVjdCB0aGUgbWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplCisgICAgICAgICAqLworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICB7CisgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAxX0RFTEFZOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKE1heEJsb2NrU2l6ZT5wSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTbG93IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTbG93RGF0YSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7CisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICB9CisKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICB7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFRlbXBvcmFyeSBmYXN0IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIqc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCisKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlRlbXBvcmFyeSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlCisgICAgICAgICAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlOworICAgIH0KKworCisgICAgcmV0dXJuKExWUkVWX1NVQ0NFU1MpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZmE0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVlJFVl9QUklWQVRFX0hfXworI2RlZmluZSBfX0xWUkVWX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWLmgiCisjaW5jbHVkZSAiTFZSRVZfVGFibGVzLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIk1peGVyLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsICovCisjZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgICAgMjMxNzAgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAxNzE3OTg2OSAgICAgICAgICAgLyogMC44ICogMl4zMSAqLworI2RlZmluZSBMVlJFVl9IRUFEUk9PTSAgICAgICAgICAgICAgICAgICA4MTkyICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAxNTgzNzY5MTkwTCAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgICAgIDB4NUE4MiAgICAgICAgICAgLyogLTNkQiBpbiBRMTUgZm9ybWF0ICovCisKKy8qIEludGVuYWwgY29uc3RhbnRzICovCisjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgIDMyNzY4CisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAgNDMxMjUKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgICA1Njc1NQorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfM19vbl80ICAgICAgICAgIDc0Njk0CisjZGVmaW5lIExWUkVWX1Q2MF9TQ0FMRSAgICAgICAgICAgICAgICAzMDY3NzQgICAgICAgICAgIC8qKDMyNzY3LzcwMDApPDwxNiAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgIDMyNzY3ICAgICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgICAyNDg5OCAgICAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAgMTg5MTkgICAgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgIDE0Mzc1ICAgICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX0JZUEFTU01JWEVSX1RDICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50Ki8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQyAgICAgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIHRpbWUgY29uc3RhbnQgKi8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQVBfVEMgICAgICAgICAgICAgMTAwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciBkZWx5IHRhcCBjaGFuZ2UgKi8KKyNkZWZpbmUgTFZSRVZfRkVFREJBQ0tNSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogRmVlZGJhY2sgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgICAgICAgICAgICAgIDUgICAgICAgICAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KKworLyogUGFyYW1ldGVyIGxpbWl0cyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCisjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLworI2RlZmluZSBMVlJFVl9NQVhfTFBGX0NPUk5FUiAgICAgICAgICAgIDIzOTk5CisjZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSICAgICAgICAgICAgICAgMjAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAgICAgLyogTWF4aW11bSBUNjAgdGltZSBpbiBtcyAqLworI2RlZmluZSBMVlJFVl9NQVhfREVOU0lUWSAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGRlbnNpdHksIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gcm9vbSBzaXplLCAxMDAlICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IEhQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBMUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBSZXZMUFRhcHNbNF07ICAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgdGFwcyAqLworCit9IExWUkVWX0Zhc3REYXRhX3N0OworCisKKy8qIEZhc3QgY29lZmZpY2llbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgSFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgTFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZMUENvZWZzWzRdOyAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzICovCisKK30gTFZSRVZfRmFzdENvZWZfc3Q7CisKKworLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgIE1lbW9yeVRhYmxlOyAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsIHByb2Nlc3NpbmcgKi8KKworICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisgICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwU2NyYXRjaERlbGF5TGluZVs0XTsgICAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgICAgLyogUmV2ZXJiIGJsb2NrIGlucHV0IHNhdmUgZm9yIGRyeS93ZXQgbWl4aW5nKi8KKworICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLworICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCisKKyAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBEZWxheV9BUFs0XTsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLworICAgIE1peF8yU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX0FQVGFwc1s0XTsgICAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLworICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF90ICAgICAgICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgICAgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLworCisgICAgLyogT3V0cHV0IGdhaW4gKi8KKyAgICBNaXhfMlN0X0NsbF90ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgICAgLyogRHJ5L3dldCBtaXhlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCisgICAgTWl4XzFTdF9DbGxfdCAgICAgICAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAgIC8qIEdhaW4gc21vb3RoaW5nICovCisKK30gTFZSRVZfSW5zdGFuY2Vfc3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKTsKKwordm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKworTFZNX0lOVDMyICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sodm9pZCAgICAgICAqcENhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2VuZXJhbFB1cnBvc2UgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2E4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMVlJFViBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQoreworICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKyAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fSU5UMzIgKilwSW5EYXRhOworICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisgICBMVk1fSU5UMzIgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKKyAgIExWTV9JTlQzMiAgICAgICAgICAgICBmb3JtYXQgPSAxOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucworICAgICAqLworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBuZXcgY29udHJvbHMgc2V0dGluZ3MgaWYgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZihwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgZXJyb3JDb2RlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBwZW5kaW5nIGZsYWcgYW5kIHVwZGF0ZSB0aGUgY29udHJvbCBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKworICAgICAgICBlcnJvckNvZGUgPSBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChwTFZSRVZfUHJpdmF0ZSk7CisKKyAgICAgICAgaWYoZXJyb3JDb2RlICE9IExWUkVWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyYXAgdGhlIGNhc2Ugd2hlcmUgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8uCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgT0ZGIGNvcHkgYW5kIHJlZm9ybWF0IHRoZSBkYXRhIGFzIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICB7CisgICAgICAgIGlmKHBJbnB1dCAhPSBwT3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8peworICAgICAgICAgICAgICAgIE1vbm9UbzJJXzMyKHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAyKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworICAgIH0KKworICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDMyKU51bVNhbXBsZXM7CisKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgZm9ybWF0ID0gMjsKKyAgICB9CisKKyAgICB3aGlsZSAoUmVtYWluaW5nU2FtcGxlcyE9MCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3MgdGhlIGRhdGEKKyAgICAgICAgICovCisKKyAgICAgICAgaWYoUmVtYWluaW5nU2FtcGxlcyA+ICBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW47CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQxNikoUmVtYWluaW5nU2FtcGxlcyAtIFNhbXBsZXNUb1Byb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9IFJlbWFpbmluZ1NhbXBsZXM7CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOworCisgICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisgICAgfQorCisgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMVlJFViBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBSZXZlcmJCbG9jayhMVk1fSU5UMzIgKnBJbnB1dCwgTFZNX0lOVDMyICpwT3V0cHV0LCBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKK3sKKyAgICBMVk1fSU5UMTYgICBqLCBzaXplOworICAgIExWTV9JTlQzMiAgICpwRGVsYXlMaW5lOworICAgIExWTV9JTlQzMiAgICpwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0lOVDMyICAgKnBTY3JhdGNoID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9JTlQzMiAgICpwSW47CisgICAgTFZNX0lOVDMyICAgKnBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyICAgTnVtYmVyT2ZEZWxheUxpbmVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBjYWxjdWxhdGlvbnMgd2lsbCBnbyBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwVGVtcCwgdGhpcyB3aWxsICAgICoKKyAgICAgKiB0aGVuIGJlIG1peGVkIHdpdGggdGhlIG9yaWdpbmFsIGlucHV0IHRvIGNyZWF0ZSB0aGUgZmluYWwgb3V0cHV0LiAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFdoZW4gSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkIHRoaXMgbXVzdCBiZSBhIHRlbXBvcmFyeSBidWZmZXIgYW5kICAgICoKKyAgICAgKiBoZW5jZSB0aGlzIGlzIHRoZSB3b3JzdCBjYXNlLCBzbyBmb3Igc2ltcGxpY2l0eSB0aGlzIHdpbGwgQUxXQVlTIGJlIHNvICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW50b3VjaGVkIHVudGlsIHRoZSBvdXRwdXQgb2YgdGhlIG1peGVyIGlmICAgICoKKyAgICAgKiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSB0ZW1wIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBOdW1TYW1wbGVzIGluIHNpemUgcmVnYXJkbGVzcyBvZiBNT05PIG9yICAgICoKKyAgICAgKiBTVEVSRU8gaW5wdXQuIEluIHRoZSBjYXNlIG9mIHN0ZXJlbyBpbnB1dCBhbGwgcHJvY2Vzc2luZyBpcyBkb25lIGluIE1PTk8gICAqCisgICAgICogYW5kIHRoZSBmaW5hbCBvdXRwdXQgaXMgY29udmVydGVkIHRvIFNURVJFTyBhZnRlciB0aGUgbWl4ZXIgICAgICAgICAgICAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCApCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OworICAgIH0KKyAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yICkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fMzIoIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIHBJbiA9IHBUZW1wOworICAgIH0KKworICAgIE11bHQzc18zMngxNihwSW4sCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTFZSRVZfSEVBRFJPT00sCisgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgLyoKKyAgICAgKiAgSGlnaCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgLyoKKyAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKKyAgICAgKi8KKworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKyAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIHRvIHRoZSBBUCBkZWxheSBpbiB0aGUgcHJvY2VzcyAqLworICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKikmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBQcml2YXRlLT5UW2pdLU51bVNhbXBsZXMpIDw8IDEpKTsgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICAvKiBBcHBseSB0aGUgc21vb3RoZWQgZmVlZGJhY2sgYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCisgICAgICAgIE1hYzNzX1NhdF8zMngxNigmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgLTB4N2ZmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0tTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBBcHBseSBzbW9vdGhlZCBmZWVkZm9yd2FyZCBzYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0tTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCisgICAgICAgIE1hYzNzX1NhdF8zMngxNigmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgQXBwbHkgcm90YXRpb24gbWF0cml4IGFuZCBkZWxheSBzYW1wbGVzCisgICAgICovCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworCisgICAgICAgIENvcHlfMTYoIChMVk1fSU5UMTYqKShwVGVtcCksCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKShwRGVsYXlMaW5lSW5wdXQpLAorICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgRGVsYXkgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiAgQ3JlYXRlIHN0ZXJlbyBvdXRwdXQKKyAgICAgKi8KKyAgICBzd2l0Y2gocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cykKKyAgICB7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU180OgorICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgSm9pblRvMmlfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMjoKKworICAgICAgICAgICAgIENvcHlfMTYoIChMVk1fSU5UMTYqKXBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsKKworICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMHg4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgIEpvaW5UbzJpXzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18xOgorICAgICAgICAgICAgTW9ub1RvMklfMzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIC8qCisgICAgICogIERyeS93ZXQgbWl4ZXIKKyAgICAgKi8KKworICAgIHNpemUgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpOworICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICAvKiBBcHBseSBHYWluKi8KKworICAgIFNoaWZ0X1NhdF92MzJ4djMyIChMVlJFVl9PVVRQVVRHQUlOX1NISUZULAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5HYWluTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgcmV0dXJuOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODk1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExWUkVWIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBOZXdQYXJhbXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcE5ld1BhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9PVVRPRlJBTkdFICAgICAgICBXaGVuIGFueSBvZiB0aGUgbmV3IHBhcmFtZXRlcnMgaXMgb3V0IG9mIHJhbmdlICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcE5ld1BhcmFtcykKK3sKKworICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKKyAgICB9CisKKworICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbCA+IExWUkVWX01BWF9MRVZFTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmICgocE5ld1BhcmFtcy0+TFBGIDwgTFZSRVZfTUlOX0xQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5MUEYgPiBMVlJFVl9NQVhfTFBGX0NPUk5FUikpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAoKHBOZXdQYXJhbXMtPkhQRiA8IExWUkVWX01JTl9IUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+SFBGID4gTFZSRVZfTUFYX0hQRl9DT1JORVIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPlQ2MCA+IExWUkVWX01BWF9UNjApCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAocE5ld1BhcmFtcy0+RGVuc2l0eSA+IExWUkVWX01BWF9ERU5TSVRZKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPkRhbXBpbmcgPiBMVlJFVl9NQVhfREFNUElORykKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmIChwTmV3UGFyYW1zLT5Sb29tU2l6ZSA+IExWUkVWX01BWF9ST09NU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGFuZCBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhleSBhcmUgYXZhaWxhYmxlCisgICAgICovCisgICAgcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtcyAgICAgICA9ICpwTmV3UGFyYW1zOworICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZkNDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KK2NvbnN0IExWTV9VSU5UMTYgTFZNX0ZzVGFibGVbXSA9IHsKKyAgICA4MDAwICwKKyAgICAxMTAyNSwKKyAgICAxMjAwMCwKKyAgICAxNjAwMCwKKyAgICAyMjA1MCwKKyAgICAyNDAwMCwKKyAgICAzMjAwMCwKKyAgICA0NDEwMCwKKyAgICA0ODAwMAorfTsKKworLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCitMVk1fVUlOVDE2IExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CisgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfNDgwMDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7Cit9CisKKy8qIEluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RhbnQgaW5wdXQgYW5kIG91dCBwdXQgc2lnbmFsIHN0cmVuZ3RocworICAgb3V0cHV0IGdhaW4vYXR0ZW51YXRpb24gaXMgYXBwbGllZC4gVGhpcyBnYWluIGRlcGVuZHMgb24gVDYwIGFuZCBSb29tcworICAgc2l6ZSBwYXJhbWV0ZXJzLiBUaGVzZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBhcmUgY2FsY3VsYXRlZCBleHBlcmltZW50YWxseS4KKyAgIEZpcnN0IHZhbHVlIGluIHRoZSB0YWJsZSBpcyByb29tIHNpemUKKyAgIHNlY29uZCB2YWx1ZSBpcyAgQTAKKyAgIHRoaXJkIHZhbHVlIGlzICAgQTEKKyAgIGZvdXJ0aCB2YWx1ZSBpcyAgQTIKKyAgIGZpZnRoIHZhbHVlIGlzICAgQTMKKyAgIHNpeHRoIHZhbHVlIGlzICAgQTQKKworICAgICBzaGlmdCB2YWx1ZSAgaXMgdG8gYmUgYWRkZWQgYXJyYXkgKHRvIHVzZSBMVk1fUG9seW5vbWlhbCBmdW5jdGlvbikKKworICBUaGUgZ2FpbiBpcyBjYWxjdWxhdGVkIHVzaW5nIHZhcmlhYmxlIHg9KFQ2MCozMjc2Ny83MDAwKSozMjc2ODsKKworICAgZmlyc3QgdmFsdWVzIGlzIHVzZWQgdG8gZ2V0IHBvbHlub21pYWwgc2V0IGZvciBnaXZlbiByb29tIHNpemUsCisgICBGb3Igcm9vbSBzaXplcyB3aGljaCBhcmUgbm90IGluIHRoZSB0YWJsZSwgbGluZWFyIGludGVycG9sYXRpb24gY2FuIGJlIHVzZWQuCisKKyAgKi8KKworLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLworY29uc3QgTFZNX0lOVDMyIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxNzU0NzQzNCwxMjg4Njc0MzQsLTEyMDk4ODg5Niw1MDc2MTIyOCx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxODI1Njg2OSwxNzI2NjY5MDIsLTE5MzE2OTI5Miw4ODM0NTc0NCx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywxNjU5MTMxMSwxMzkyNTAxNTEsLTE0OTY2NzIzNCw2Njc3MDA1OSx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxNzM3OTk3NywxNzA4MzUxMzEsLTE3MzU3OTMyMSw3NjI3ODE2Myx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NSwxODk2MzUxMiwyMTAzNjQ5MzQsLTIyODYyMzUxOSwxMDM0MzUwMjIsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsMTc3OTYzMTgsMTM1NzU2NDE3LC0xNDQwODQwNTMsNjQzMjc2OTgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMTc0NTQ2OTUsMTc0NTkzMjE0LC0xODc1MTMwNjQsODUxNDY1ODIsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsMTcyMjkyNTcsMTQwNzE1NTcwLC0xNDU3OTA1ODgsNjUzNjE3NDAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMTcwMDA1NDcsMTYzMTk1OTQ2LC0xNzY3MzM5NjksNzk1NjIxMzAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDE2NzExNjk5LDE0MjQ3NjMwNCwtMTMzMzM5ODg3LDU4MzY2NTQ3LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxODEwODQxOSwxNDkyMjM2OTcsLTE2MTc2MjAyMCw3NDM5NzU4OSx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTUsMTY2ODIwNDMsMTI0ODQ0ODg0LC0xMzQyODQ0ODcsNjAwODIxODAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDE2NjI3MzQ2LDEyMDkzNjQzMCwtMTIxNzY2Njc0LDUzMTQ2NDIxLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxNzMzODMyNSwxMjU0MzI2OTQsLTEyNjYxNjk4Myw1NjUzNDIzNyx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjUsMTY0ODkxNDYsOTkyMTgyMTcsLTk0NTk3NDY3LDQwNjE2NTA2LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwxNTU4MjM3Myw4NDQ3OTA0MywtNzUzNjUwMDYsMzA5NTIzNDgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDE2MDAwNjY5LDg0ODk2NjExLC03NTAzMTEyNywzMDY5NjMwNix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NTAsMTUwODcwNTQsNzE2OTUwMzEsLTU5MzQ5MjY4LDIzMjc5NjY5LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwxNTgzMDcxNCw2ODY3Mjk3MSwtNTgyMTEyMDEsMjM2NzExNTgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDE1NTM2MDYxLDY2NjU3OTcyLC01NTkwMTQzNywyMjU2MDE1Myx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzUsMTUwMTMxNDUsNDgxNzk5MTcsLTI0MTM4MzU0LDUyMzIwNzQsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDE1Njg4NzM4LDUwMTk1MDM2LC0zNDIwNjc2MCwxMTUxNTc5Mix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMTYwMDMzMjIsNDgzMjM2NjEsLTM1NjA3Mzc4LDEzMTUzODcyLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMTU5NTUyMjMsNDg1NTgyMDEsLTMzNzA2ODY1LDExNzE1NzkyLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5OTNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBfTFZSRVZfVEFCTEVTX0hfCisjZGVmaW5lIF9MVlJFVl9UQUJMRVNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qKiBfTFZSRVZfVEFCTEVTX0hfICoqLworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xWUFNBX0hfCisjZGVmaW5lIF9MVlBTQV9IXworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ09OU1RBTlRTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lICAgICBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgIDQgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRZUEVTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9QRVJTSVNURU5UICAgICAgPSBMVk1fUEVSU0lTVEVOVCwKKyAgICBMVlBTQV9QRVJTSVNURU5UX0RBVEEgPSBMVk1fUEVSU0lTVEVOVF9EQVRBLAorICAgIExWUFNBX1BFUlNJU1RFTlRfQ09FRiA9IExWTV9QRVJTSVNURU5UX0NPRUYsCisgICAgTFZQU0FfU0NSQVRDSCAgICAgICAgID0gTFZNX1NDUkFUQ0gsCisgICAgTFZQU0FfTUVNT1JZX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1vcnlUeXBlc19lbjsKKworLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZQU0FfU1BFRURfTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVkaXVtIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuOworCisvKiBGaWx0ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIENlbnRlckZyZXF1ZW5jeTsgICAgICAgICAgICAgLyogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZC1wYXNzIGZpbHRlciAoaW4gSHopICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIG9mIHRoZSBmaWx0ZXIgICAgICAgICAgICAgKGluIDEvMTAwKSAgICAgICAgICAgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgUG9zdEdhaW47ICAgICAgICAgICAgICAgICAgICAvKiBQb3N0Z2FpbiB0byBhcHBseSBhZnRlciB0aGUgZmlsdGVyaW5nICAgIChpbiBkQiBRMTYuMCkgICAgICAgICAgICAqLworCit9IExWUFNBX0ZpbHRlclBhcmFtX3Q7CisKKy8qIExWUFNBIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247ICAvKiBTcGVjdHJhbCBkYXRhIGJ1ZmZlciBkdXJhdGlvbiBpbiB0aW1lIChtcyBpbiBRMTYuMCkgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBleHBlY3RlZCBpbnB1dCBibG9jayBzaXplIChpbiBzYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gbkJhbmRzIGZpbHRlciBwYXJhbSBzdHJ1Y3R1cmVzIGZvciBmaWx0ZXJzIHNldHRpbmdzICAgICAqLworCit9IExWUFNBX0luaXRQYXJhbXNfdCwgKnBMVlBTQV9Jbml0UGFyYW1zX3Q7CisKKy8qIExWUFNBIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICBGczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbiAgTGV2ZWxEZXRlY3Rpb25TcGVlZDsgICAgICAgICAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IExWUFNBX0NvbnRyb2xQYXJhbXNfdCwgKnBMVlBTQV9Db250cm9sUGFyYW1zX3Q7CisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTWVtb3J5VHlwZXNfZW4gICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gTFZQU0FfTWVtb3J5UmVnaW9uX3Q7CisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZQU0FfTWVtb3J5UmVnaW9uX3QgICAgICAgUmVnaW9uW0xWUFNBX05SX01FTU9SWV9SRUdJT05TXTsvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1UYWJfdDsKKworLyogQXVkaW8gdGltZSB0eXBlICovCit0eXBlZGVmIExWTV9JTlQzMiBMVlBTQV9UaW1lOworCisvKiBNb2R1bGUgaW5zdGFuY2UgSGFuZGxlICovCit0eXBlZGVmIHZvaWQgKnBMVlBTQV9IYW5kbGVfdDsKKworLyogTFZQU0EgcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jdGlvbiByYW4gd2l0aG91dCBhbnkgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHBhcmFtZXRlciBpcyBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0VSUk9SX1dST05HVElNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gaW5jb3JyZWN0IEF1ZGlvVGltZSBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgcG9pbnRlciBoYXMgYSBOVUxMIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfUkVUVVJOX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9SRVRVUk47CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTlMgUFJPVE9UWVBFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluaXRQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZXMgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdCAgICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9scyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE5ld1BhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2VzcyBjYWxjdWxhdGVzIHRoZSBsZXZlbHMgb2YgdGhlIGZyZXF1ZW5jeSBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGZpcnN0IGlucHV0IHNhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgVGltZSB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogQ3VycmVudCBsZXZlbCB2YWx1ZXMgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGVha1ZhbHVlcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IFBlYWsgbGV2ZWwgdmFsdWVzIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICpwUGFyYW1zICAgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBpbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyAgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MVlBTQV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOworCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpOworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHaXZlIHNvbWUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyB0byB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTmV3UGFyYW1zICAgICAgICAgICBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgbmV3IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApCit7CisKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKHBOZXdQYXJhbXMtPkZzID49IExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorICAgIGlmKHBOZXdQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorCisgICAgcExWUFNBX0luc3QtPk5ld1BhcmFtcyA9ICpwTmV3UGFyYW1zOworICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdldCB0aGUgY3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAqcFBhcmFtcyApCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIHBQYXJhbXMtPkZzICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GczsKKyAgICBwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZDsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICpwUGFyYW1zICkKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgcFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKKyAgICBwUGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplOworICAgIHBQYXJhbXMtPm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIHBQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXM7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KKy8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCkKK3sKKyAgICBMVk1fVUlOVDE2IGlpOworICAgIExWTV9VSU5UMTYgRnJlcTsKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CisKKworICAgIGlmKHBJbnN0ID09IDApCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIFBhcmFtcyA9IHBJbnN0LT5OZXdQYXJhbXM7CisKKyAgICAvKiBNb2RpZmllcyBmaWx0ZXJzIHR5cGVzIGFuZCBjb2VmZmljaWVudHMsIGNsZWFyIHRoZSB0YXBzIGFuZAorICAgICAgIHJlLWluaXRpYWxpemVzIHBhcmFtZXRlcnMgaWYgc2FtcGxlIGZyZXF1ZW5jeSBoYXMgY2hhbmdlZCAgICAqLworICAgIGlmKFBhcmFtcy5GcyAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcykKKyAgICB7CisgICAgICAgIHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gUGFyYW1zLkZzOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNlbnRlciBmcmVxZXVuY2llcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgICAgICBGcmVxID0gKExWTV9VSU5UMTYpICgoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpIC8gKHBJbnN0LT5uQmFuZHMgKyAxKSk7CisgICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA9IChMVk1fVUlOVDE2KSAoRnJlcSAqIGlpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsZXZhbnQgZmlsdGVycy4gSWYgdGhlIGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlciBpcworICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgbnlxdWlzdCBmcmVxdWVuY3ksIHRoZW4gdGhlIGZpbHRlciBpcyBub3QgcmVsZXZhbnQgYW5kIGRvZXNuJ3QKKyAgICAgICAgICAgbmVlZCB0byBiZSB1c2VkICovCisgICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA8IChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXT4+MSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3QtPm5SZWxldmFudEZpbHRlcnMgPSBpaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0KTsKKyAgICAgICAgcEluc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gKExWTV9VSU5UMTYpTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbUGFyYW1zLkZzXTsKKyAgICAgICAgcEluc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IDA7CisgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3IgPSBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbUGFyYW1zLkZzXTsKKyAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gMDsKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCAocEluc3QtPm5CYW5kcyAqIHBJbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0W2lpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcEluc3QtPkN1cnJlbnRQYXJhbXMgPSBwSW5zdC0+TmV3UGFyYW1zOworCisgICAgcmV0dXJuIChMVlBTQV9PSyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB0aGUgQlBGaWx0ZXJUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb25pdGVyIHRvIGNvbnJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVG8gc2VsZWN0IHRoZSBiaXF1YWQgdHlwZSB0aGUgZm9sbG93IHJ1bGVzIGFyZSBhcHBsaWVkOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZmMgPD0gZnMvMTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBTaW5nbGUgcHJlY2lzaW9uICAgIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKK3sKKworICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgZmlsdGVyIHNldHRpbmdzCisgICAgICAgICAqLworICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0uQ2VudGVyRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9KExWTV9JTlQxNikgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYgKFFGYWN0b3IgPiAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgYmFuZCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMuIFRoaXMgdXNlcyB0aGUgdHlwZSB0byBzZWxlY3QgICAgICAgICAgICAqLworLyogIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQYXJhbXMgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBpaTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgorICAgICAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoICAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBxdWFzaSBwZWFrIGZpbHRlcnMgY29lZmZpY2llbnRzLiBUaGlzIHVzZXMgdGhlIGNob3NlbiAgICAgICAgICAgICAgICAgICovCisvKiAgTGV2ZWxEZXRlY3Rpb25TcGVlZCBmcm9tIHRoZSBjb250cm9sIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFBhcmFtcyAgICAgICAgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQoreworICAgIExWTV9VSU5UMTYgICAgIGlpOworICAgIExWTV9Gc19lbiAgICAgIEZzID0gcFBhcmFtcy0+RnM7CisgICAgUVBEX0MzMl9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107CisKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsY3VsYXRlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzIGZvciBhIGJhbmQgcGFzcyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyUGFyYW1zICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdDAgPSAyICogUGkgKiBGYyAvIEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIHQwKSAvICgyUSArIHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGYyAgICAgICAgICBpcyB0aGUgY2VudHJlIGZyZXF1ZW5jeSwgREMgdG8gTnlxdWlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZzICAgICAgICAgIGlzIHRoZSBzYW1wbGUgZnJlcXVlbmN5LCA4MDAwIHRvIDQ4MDAwIGluIGRlc2NyZXRlIHN0ZXBzICAgICAgICAgICAgKi8KKy8qICAgICAgUSAgICAgICAgICAgaXMgdGhlIFEgZmFjdG9yLCAwLjI1IHRvIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gVGhpcyBmdW5jdGlvbiBpcyBlbnRpcmVseSBiYXNlZCBvbiB0aGUgTFZFUU5CX1NpbmdsZVByZWNDb2VmcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9Db3NDb2VmW107CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ09TX1QwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFFGYWN0b3IgICAgID0gcEZpbHRlclBhcmFtcy0+UUZhY3RvcjsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gKExWTV9JTlQzMilGcmVxdWVuY3kgKiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKExWTV9JTlQzMikoKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTkpICsgKExWTV9VSU5UMzIpKER0MCA+PiAyKSk7CisgICAgQjJfTnVtID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpKER0MCA+PiAzKSAtICgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE4KSk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVlBTQV9Db3NDb2VmWzBdKzYpOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKworICAgIEIxID0gKCgweDQwMDAwMDAwIC0gQjIpID4+IDE2KSAqIChDT1NfVDAgPj4gMTYpOyAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IChMVk1fSU5UMTYpKEEwPj4xNik7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSAoTFZNX0lOVDE2KShCMT4+MTUpOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gKExWTV9JTlQxNikoQjI+PjE2KTsKKworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgZm9yIGEgYmFuZCBwYXNzIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gdDApIC8gKDJRICsgdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA0LiBUaGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IGJhc2VkIG9uIHRoZSBMVkVRTkJfRG91YmxlUHJlY0NvZWZzIGZ1bmN0aW9uICAgICAgICAgICAqLworLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZQU0FfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICBUMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEQ7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBBMDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIxOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBEdDA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMl9EZW47CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMl9OdW07CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDb3NFcnI7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBjb2VmOworICAgIExWTV9JTlQzMiAgICAgICAgICAgZmFjdG9yOworICAgIExWTV9JTlQxNiAgICAgICAgICAgdDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFFGYWN0b3IgICAgID0gcEZpbHRlclBhcmFtcy0+UUZhY3RvcjsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gKExWTV9JTlQzMilGcmVxdWVuY3kgKiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKExWTV9JTlQzMikoKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTkpICsgKExWTV9VSU5UMzIpKER0MCA+PiAyKSk7CisgICAgQjJfTnVtID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpKER0MCA+PiAzKSAtICgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE4KSk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBlcnJvciBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3NFcnIgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDQKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiA2KSAqIDB4N2Y1MzsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICB0MCA9IChMVk1fSU5UMTYpKFQwID4+IDE2KTsKKyAgICBmYWN0b3IgPSAweDdmZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGk9MTsgaTw1OyBpKyspCisgICAgeworICAgICAgICBjb2VmID0gTFZQU0FfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ29zRXJyICs9IChmYWN0b3IgKiBjb2VmKSA+PiA1OyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gKGZhY3RvciAqIHQwKSA+PiAxNTsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENvc0VyciA9IENvc0VyciA8PCAoTFZQU0FfRFBDb3NDb2VmWzBdKTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIxIGFuZCBBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMSA9ICgweDQwMDAwMDAwIC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gKChCMSA+PiAxNikgKiAoQ29zRXJyID4+IDEwKSkgPj4gNjsgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLworICAgIEEwID0gKDB4NDAwMDAwMDAgKyBCMikgPj4gMTsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2xlYXJzIHRoZSBmaWx0ZXJzJyBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpCit7CisgICAgTFZNX0lOVDggICAgICAgKnBUYXBBZGRyZXNzOworICAgIExWTV9VSU5UMzIgICAgICAgaTsKKworICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKworICAgIC8qIFF1YXNpLXBlYWsgZmlsdGVycyB0YXBzICovCisgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cFFQRF9UYXBzOworICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCk7IGkrKykKKyAgICB7CisgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E0YmMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRQYXJhbXMgICAgICAgICAgSW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9sUGFyYW1zICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICBNZW1vcnkgdGFibGUgdGhhdCBjb250YWlucyBtZW1vcnkgYXJlYXMgZGVmaW5pdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7CisgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBpaTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgICAgICAgICAgTFZQU0FfR2FpblRhYmxlW107CisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7CisKKyAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOworICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOworCisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgfQorICAgIH0KKworCisgICAgLypJbnN0X0FsbG9jIGluc3RhbmNlcyBpbml0aWFsaXphdGlvbiAqLworICAgIEluc3RBbGxvY19Jbml0KCAmSW5zdGFuY2UgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJlNjcmF0Y2ggICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCAmQ29lZiAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CisKKworICAgIC8qIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisgICAgfQorICAgIHBMVlBTQV9JbnN0ID0oTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKKworCisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IExWUFNBX05SX01FTU9SWV9SRUdJT05TOyBpaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25baWldID0gcE1lbW9yeVRhYmxlLT5SZWdpb25baWldOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGUncyBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCisgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICBwTFZQU0FfSW5zdC0+bkJhbmRzID0gcEluaXRQYXJhbXMtPm5CYW5kczsKKyAgICBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUgPSBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemU7CisgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gTFZNX0ZTX0RVTU1ZOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBMVlBTQV9TUEVFRF9EVU1NWTsKKworICAgIHsgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCisgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7CisgICAgICAgIExWTV9JTlQzMiBCTDsKKworICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorCisgICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKKyAgICB9CisKKyAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGg7CisgICAgfQorCisKKyAgICAvKiBBc3NpZ24gdGhlIHBvaW50ZXJzICovCisKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQxNikgKTsKKyAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKKworICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKworICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOworCisKKyAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0gPSBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldOworICAgIH0KKworICAgIC8qIFNldCBQb3N0IGZpbHRlcnMgZ2FpbnMqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9KExWTV9VSU5UMTYpIExWUFNBX0dhaW5UYWJsZVtwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICsgMTVdOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisKKworICAgIC8qIEluaXRpYWxpemUgY29udHJvbCBkZXBlbmRhbnQgaW50ZXJuYWwgcGFyYW1ldGVycyAqLworICAgIGVycm9yQ29kZSA9IExWUFNBX0NvbnRyb2wgKCpwaEluc3RhbmNlLCBwQ29udHJvbFBhcmFtcyk7CisKKyAgICBpZihlcnJvckNvZGUhPTApCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3JDb2RlOworICAgIH0KKworICAgIGVycm9yQ29kZSA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlBTQV9JbnN0KTsKKworICAgIGlmKGVycm9yQ29kZSE9MCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgfQorCisgICAgcmV0dXJuKGVycm9yQ29kZSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg0YjEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisKKyAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7CisgICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOworICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7CisKKworICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKworICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLworICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKKyAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8CisgICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzIGFzIE1VTDMyeDMySU5UTzMyIHdvcmtzIG9uIExWTV9JTlQzMiBvbmx5Ki8KKyAgICAgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICAgICAgTFZNX0lOVDMyIElSVEk9KExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OworICAgICAgICAgICAgTFZNX0lOVDMyIEJMOworCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOworICAgICAgICB9CisKKworICAgICAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJMZW5ndGgrKzsKKyAgICAgICAgfQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZJbnN0YW5jZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0lOVDE2KSApOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhiZWRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTFZQU0FfUFJJVkFURV9IXworI2RlZmluZSBfTFZQU0FfUFJJVkFURV9IXworCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDT05TVEFOVCBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVlBTQV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9DT0VGX0FMSUdOICAgICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9EQVRBX0FMSUdOICAgICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgIDAgICAgICAvKiBPZmZzZXQgdG8gaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgIDEgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEEgIDIgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCB0YXBzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgIDMgICAgICAvKiBPZmZzZXQgdG8gc2NyYXRjaCAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiAgICAgICAgICA0MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSAgICAgICAgICA1MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbW9ubyBzYW1wbGVzIG9mIHRoZSBibG9jayB0byBwcm9jZXNzICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9OQkFORFNNSU4gICAgICAgICAgICAgICAgICAxICAgICAgLyogTWluaW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9OQkFORFNNQVggICAgICAgICAgICAgICAgICAzMCAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhDRU5URVJGUkVRICAgICAgICAgICAgICAyMDAwMCAgLyogTWF4aW11bSBwb3NzaWJsZSBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NSU5QT1NUR0FJTiAgICAgICAgICAgICAgICAtMTUgICAgLyogTWluaW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhQT1NUR0FJTiAgICAgICAgICAgICAgICAxNSAgICAgLyogTWF4aW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NSU5RRkFDVE9SICAgICAgICAgICAgICAgICAyNSAgICAgLyogTWluaW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhRRkFDVE9SICAgICAgICAgICAgICAgICAxMjAwICAgLyogTWF4aW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IgICAgICAgIDB4NDExMSAvKiBEZWNheSBmYWN0b3IgZm9yIHRoZSBtYXhpbXVtIHZhbHVlcyBjYWxjdWxhdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWExFVkVMREVDQVlTSElGVCAgICAgICAgIDE0ICAgICAvKiBEZWNheSBzaGlmdCBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTFZQU0FfTUFYVU5TSUdORURDSEFSICAgICAgICAgICAgMHhGRgorCisjZGVmaW5lIExWUFNBX0ZzSW52ZXJ0U2hpZnQgICAgICAgICAgICAgIDMxCisjZGVmaW5lIExWUFNBX0dBSU5TSElGVCAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIExWUFNBX0ZSRVFTSElGVCAgICAgICAgICAgICAgICAgIDI1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBUWVBFUyBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSAgICAgICAweDAwMTQgICAgLyogMjAgbXMgKDUwSHopIGluIFExNi4wICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiAgICAweDA2NjYgICAgLyogMS8yMG1zIGxlZnQgc2hpZnRlZCBieSAxNSAgKi8KKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0ICAxNQorCisKKy8qIFByZWNpc2lvbiBvZiB0aGUgZmlsdGVyICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXIsICAgIC8qIFNpbXBsZSBwcmVjaXNpb24gKi8KKyAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXIgICAgIC8qIERvdWJsZSBwcmVjaXNpb24gKi8KK30gTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW47CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5jYXRpbmcgYSBjaGFuZ2Ugb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5CYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgQ3VycmVudFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBnaXZlbiBieSB0aGUgdXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CisKKyAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqcEJQRmlsdGVyc1ByZWNpc2lvbjsgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAqcEJQX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgKi8KKyAgICBRUERfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgKi8KKyAgICBRUERfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKworICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICAgICpwRmlsdGVyc1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSBmaWx0ZXJzIHBhcmFtZXRlcnMgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblNhbXBsZXNCdWZmZXJVcGRhdGU7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbWFrZSAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OyAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIGtub3cgd2hlbiB0byBwdXQgYSBuZXcgdmFsdWUgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblJlbGV2YW50RmlsdGVyczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJlbGV2ZW50IGZpbHRlcnMgZGVwZW5kaW5nIG9uIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgYmFuZHMgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTG9jYWxTYW1wbGVzQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEb3duU2FtcGxpbmdGYWN0b3I7ICAgICAgICAgICAgICAgICAvKiBEb3duIHNhbXBsaW5nIGZhY3RvciBkZXBlbmRpbmcgb24gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEb3duU2FtcGxpbmdDb3VudDsgICAgICAgICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgZm9yIHRoZSBkb3duc2FtcGxpbmcgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgYnVmZmVyIGluIHRpbWUgKG1zKSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7ICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXR0aW5nIHBvaW50ZXIgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfVGltZSAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTsgICAgICAgIC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VyZWQgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzcGVjdHJ1bSBkYXRhIHZhbHVlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbiAocGVyIGJhbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24vMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICAqcFByZXZpb3VzUGVha3M7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIHRvIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHByZXZpb3VzIHBlYWsgdmFsdWUgb2YgdGhlIGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLworCit9TFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTlMgUFJPVE9UWVBFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KKy8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTFZQU0FfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI5ZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisKKyNkZWZpbmUgTFZNX01JTklOVF8zMiAgIDB4ODAwMDAwMDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2VzcyBhcHBsaWVzIGJhbmQgcGFzcyBmaWx0ZXJzIHRvIHRoZSBzaWduYWwuIEVhY2ggb3V0cHV0ICAgICAgICAgICAgICAgICovCisvKiAgZmVlZHMgYSBxdWFzaSBwZWFrIGZpbHRlciBmb3IgbGV2ZWwgZGV0ZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBMVlBTQV9JbnB1dFNhbXBsZXMgUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbnB1dEJsb2NrU2l6ZSAgICAgIE51bWJlciBvZiBtb25vIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICBQbGF5YmFjayB0aW1lIG9mIHRoZSBpbnB1dCBzYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKKworeworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENIRUNLIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBTY3JhdGNoID0gKExWTV9JTlQxNiopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKKyAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQUk9DRVNTIFNBTVBMRVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCisgICAgQ29weV8xNiggcExWUFNBX0lucHV0U2FtcGxlcyxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICBTaGlmdF9TYXRfdjE2eHYxNigtMSxwU2NyYXRjaCxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKKyAgICB7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdldHMgdGhlIGxldmVscyB2YWx1ZXMgYXQgYSBjZXJ0YWluIHBvaW50IGluIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgUmV0cmlldmUgdGhlIHZhbHVlcyBhdCB0aGlzIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gbGV2ZWxzJyB2YWx1ZXMgICAgICAgKi8KKy8qICBwTWF4VmFsdWVzICAgICAgICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIG1heCBsZXZlbHMnIHZhbHVlcyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApCisKK3sKKworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBTdGF0dXNEZWx0YSwgaWk7CisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBSZWFkOworCisgICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBDdXJyZW50VmFsdWVzID09IExWTV9OVUxMIHx8IHBQZWFrVmFsdWVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBsYWNlIHdoZXJlIHRvIGxvb2sgaW4gdGhlIHN0YXR1cyBidWZmZXIgKi8KKyAgICBpZihHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8PSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSksTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludixTdGF0dXNEZWx0YSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpOworICAgICAgICBpZigoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLworICAgIGlmKAorICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgorICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKKyAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8CisKKyAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCisgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAorICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKKyAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCisgICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKKworICAgICAgICAoU3RhdHVzRGVsdGEgPiAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpIHx8CisgICAgICAgICghU3RhdHVzRGVsdGEpKQorICAgIHsKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gID0gMDsKKyAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSAgICAgID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oTFZQU0FfT0spOworICAgIH0KKyAgICAvKiBTZXQgdGhlIHJlYWRpbmcgcG9pbnRlciAqLworICAgIGlmKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgKyAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIH0KKworCisgICAgLyogUmVhZCB0aGUgc3RhdHVzIGJ1ZmZlciBhbmQgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gPSBwUmVhZFtpaV07CisgICAgICAgIGlmKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPD0gcFJlYWRbaWldKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gcFJlYWRbaWldOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMzIgdGVtcDsKKyAgICAgICAgICAgIC8qUmUtY29tcHV0ZSBtYXggdmFsdWVzIGZvciBkZWNheSAqLworICAgICAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pOworICAgICAgICAgICAgdGVtcCA9ICgodGVtcCAqIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IpPj5MVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQpOworICAgICAgICAgICAgLyogSWYgdGhlIGdhaW4gaGFzIG5vIGVmZmVjdCwgImhlbHAiIHRoZSB2YWx1ZSB0byBpbmNyZWFzZSAqLworICAgICAgICAgICAgaWYodGVtcCA9PSAoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+IExWUFNBX01BWFVOU0lHTkVEQ0hBUikgPyBMVlBTQV9NQVhVTlNJR05FRENIQVIgOiB0ZW1wOworICAgICAgICAgICAgLyogU3RvcmUgbmV3IG1heCBsZXZlbCAqLworICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9ICAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV07CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZiZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xWUFNBX1FQRF9IXworI2RlZmluZSBfTFZQU0FfUVBEX0hfCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0lOVDMyIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCisKK30gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzFdOworCit9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgZG93bnNhbXBsaW5nLCBwb3N0IGdhaW4sIHF1YXNpIHBlYWsgZmlsdGVyaW5nIGFuZCB3cml0ZSB0aGUgbGV2ZWxzIHZhbHVlcyAqLworLyogIGluIHRoZSBidWZmZXIgZXZlcnkgMjAgbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpemUgYSBxdWFzaSBwZWFrIGZpbHRlciBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyB0YXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyJ3MgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMGE4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZSBhIHF1YXNpIHBlYWsgZmlsdGVyIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFFQRF9TdGF0ZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlcidzIHRhcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfSW5pdCAoICAgcFFQRF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICkKK3sKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gcENvZWYtPktQOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9IHBDb2VmLT5LTTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxOTdjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXcml0ZSBhIGxldmVsIHZhbHVlIGluIHRoZSBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYmFuZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIExWUFNBIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcHBXcml0ZSAgICAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxOdW1iZXIgICAgICAgICAgTnVtYmVyIG9mIHRoZSBiYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBpbiAgICAgICAgICAgKi8KKy8qICBWYWx1ZSAgICAgICAgICAgICAgIFZhbHVlIHRvIHdyaXRlIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgZG93bnNhbXBsaW5nLCBwb3N0IGdhaW4sIHF1YXNpIHBlYWsgZmlsdGVyaW5nIGFuZCB3cml0ZSB0aGUgbGV2ZWxzIHZhbHVlcyAqLworLyogIGluIHRoZSBidWZmZXIgZXZlcnkgMjAgbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKK3sKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOworCisgICAgLyogUG9pbnRlciB0byB0YXBzICovCisgICAgTFZNX0lOVDMyKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7CisKKyAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fSU5UMzIgICBYMDsKKyAgICBMVk1fSU5UMzIgICB0ZW1wLHRlbXAyOworICAgIExWTV9JTlQzMiAgIGFjY3U7CisgICAgTFZNX0lOVDE2ICAgWGcwOworICAgIExWTV9JTlQxNiAgIEQwOworICAgIExWTV9JTlQxNiAgIFYwID0gKExWTV9JTlQxNikoKnBEZWxheSk7CisKKyAgICAvKiBGaWx0ZXIncyBjb2VmICovCisgICAgTFZNX0lOVDMyICAgS3AgPSBwUVBEU3RhdGUtPkNvZWZzWzBdOworICAgIExWTV9JTlQzMiAgIEttID0gcFFQRFN0YXRlLT5Db2Vmc1sxXTsKKworICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKworICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBJTklUSUFMSVpBVElPTgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLworICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKKyAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKKworICAgIHdoaWxlIChpaSA+IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KKyAgICAgICAgWDAgPSAoKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdKSA+PiAoTFZQU0FfR0FJTlNISUZULTEpOyAvKiAtIDEgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIGluIHByb2Nlc3MgZnVuY3Rpb24qLworICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCisgICAgICAgIGlmKFgwIDwgMCkKKyAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPiAweDdGRkYpCisgICAgICAgICAgICBYZzAgPSAweDdGRkY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFhnMCA9IChMVk1fSU5UMTYpKFgwKTsKKworCisgICAgICAgIC8qIFF1YXNpIHBlYWsgZmlsdGVyIGNhbGN1bGF0aW9uICovCisgICAgICAgIEQwICA9IChMVk1fSU5UMTYpKFhnMCAtIFYwKTsKKworICAgICAgICB0ZW1wMiA9IChMVk1fSU5UMzIpRDA7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKHRlbXAyLEtwLGFjY3UsMzEpOworCisgICAgICAgIEQwICAgID0gKExWTV9JTlQxNikoRDA+PjEpOworICAgICAgICBpZiAoRDAgPCAwKXsKKyAgICAgICAgICAgIEQwID0gKExWTV9JTlQxNikoLUQwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAyID0gKExWTV9JTlQzMilEMDsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKExWTV9JTlQzMilEMCxLbSx0ZW1wLDMxKTsKKyAgICAgICAgYWNjdSArPXRlbXAgKyBYZzA7CisKKyAgICAgICAgaWYgKGFjY3UgPiAweDdGRkYpCisgICAgICAgICAgICBhY2N1ID0gMHg3RkZGOworICAgICAgICBlbHNlIGlmKGFjY3UgPCAwKQorICAgICAgICAgICAgYWNjdSA9IDB4MDAwMDsKKworICAgICAgICBWMCA9IChMVk1fSU5UMTYpYWNjdTsKKworICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYwKTsKKyAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCAtPSBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGU7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgPSAoTFZNX1VJTlQxNikobnVtU2FtcGxlcyAtIGlpKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQrPURvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpLURvd25TYW1wbGluZ0ZhY3Rvcik7CisKKyAgICB9CisKKyAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCisgICAgKnBEZWxheSA9IChMVk1fSU5UMzIpKFYwKTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24gYWZ0ZXIgbGFzdCBiYW5kIHByb2Nlc3NpbmcsCisgICAgICAgdXBkYXRlIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMtMSkpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCisgICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyIGluIHRoZSBjb3JyZXNwb25kaW5nIGJhbmQuICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBMVlBTQV9JbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLworLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOworCisKKyAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLworICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlPj43KTsKKyAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQorICAgIHsKKyAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKKyAgICB9CisKKyAgICAqcHBXcml0ZSA9IHBXcml0ZTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAorICogZnJlcXVlbmN5CisgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGUgcmF0ZSBpbnZlcnNlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAorICogZnJlcXVlbmN5CisgKi8KK2NvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdID0geyAgICAyNjg0MzUsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ3ODMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4OTU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNDIxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzM5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTQ3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzEwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOX07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiBkdXJpbmcgMjBtcworICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gID0geyAgIDE2MCwgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERvd24gc2FtcGxpbmcgZmFjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgZG93biBzYW1wbGluZyBmYWN0b3IKKyAqLworY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSAgPSB7ICAgICA1LCAgICAgICAgICAgICAgICAgICAgLyogODAwMCAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgICAgICAgICAgICAgICAgICAgLyogMTEwMjUgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogMTIwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgLyogMTYwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgICAgICAgICAgICAgICAgICAgLyogMjIwNTAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMn07ICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDI2MzU0LCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTEyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NTY5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTU2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyfTsgICAgLyogNDhrUy9zICovCisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW10gPSB7ICAgMzY0LCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqICsxLjAgdG8gLTEuMAorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MENFRkQyQiwweDAwQ0I5QjE3fSwgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEQyNDJFNywweDAwQ0VEMTFEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRDk0QkFGLDB4MDBENUI3RTd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sICAvKiA0OGtTL3MgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NTg3NTEzRCwweDA1NUMyMkNGfSwgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NTlEMjk2NywweDA1NzBGMDA3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1Q0MxMDE4LDB4MDU5RDhGNjl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NUUyRUZBQywweDA1QjM0RDc5fSwgIC8qIDQ4a1MvcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEExMTVFQTdBLDB4MUNEQjNGNUN9LCAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEExODQ3NUYwLDB4MUQyQzgzQTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTExNUVBN0EsMHgxQ0RCM0Y1Q30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTI2RkY2QkQsMHgxREQ4MTUzMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfX07IC8qIDQ4a1MvcyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjIyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiBDb25jZXJ0IFNvdW5kIGFuZCBDb25jZXJ0ICAgICAgICAqLworLyogIFNvdW5kIEVYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGNhbGxpbmcgbGF5ZXIuIEFsbCBvdGhlciB0eXBlcywgc3RydWN0dXJlcyBhbmQgICAgICAgICAgICovCisvKiAgZnVuY3Rpb25zIGFyZSBwcml2YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICAgKi8KKy8qICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiBJZiB0aGUgYnVmZmVycyBhcmUgdGhlICAgICAgICAqLworLyogIHNhbWUgdGhlbiB0aGUgTUlQcyB3aWxsIGJlIHNsaWdodGx5IGhpZ2hlciBhbmQgYW4gZXh0cmEgc3RlcmVvIHNjcmF0Y2ggYnVmZmVyIGlzICAgICovCisvKiAgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHdvIGRhdGEgZm9ybWF0cyBhcmUgc3VwcG9ydCBTdGVyZW8gYW5kIE1vbm8tSW4tU3RlcmVvLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyAgKi8KKy8qICBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEJ5dGUgT2Zmc2V0ICAgICAgICAgU3RlcmVvIElucHV0ICAgICAgICAgTW9uby1Jbi1TdGVyZW8gSW5wdXQgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgPT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMxICAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMxICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMiAgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMiAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm8gZm9ybWF0IGRhdGEgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgYSBNb25vIHN0cmVhbSAgICovCisvKiAgaW4gdG8gTW9uby1Jbi1TdGVyZW8gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZDU19ICisjZGVmaW5lIExWQ1NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9Db21tb24uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUgKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgMCAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgMSAgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgIDIgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgMyAgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKworLyogRWZmZWN0IExldmVsICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgICAgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAgICAgICAgICAgICAgICAgMjQ1NzYgICAgLyogRWZmZWN0IHNjYWxpbmcgNzUlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgICAgMzI3NjcgICAgLyogRWZmZWN0IFNjYWxpbmcgMTAwJSAqLworCisvKiBDYWxsYmFjayBldmVudHMgKi8KKyNkZWZpbmUgTFZDU19FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLworI2RlZmluZSBMVkNTX0VWRU5UX0FMR09GRiAgICAgICAgICAgICAgICAgMHgwMDAxICAgIC8qIENTIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluc3RhbmNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICpMVkNTX0hhbmRsZV90OworCisKKy8qIE9wZXJhdGluZyBtb2RlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19PRkYgPSAwLAorICAgIExWQ1NfT04gID0gMTUsCisgICAgTFZDU19NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX01vZGVzX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TQ1JBVENIICAgICAgICA9IDAsCisgICAgTFZDU19EQVRBICAgICAgICAgICA9IDEsCisgICAgTFZDU19DT0VGRklDSUVOVCAgICA9IDIsCisgICAgTFZDU19QRVJTSVNURU5UICAgICA9IDMsCisgICAgTFZDU19NRU1PUllUWVBFX01BWCA9IExWTV9NQVhFTlVNCit9IExWQ1NfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVkNTX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZDU19OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkNTX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KKyAgICBMVkNTX0lOVkFMSURCVUZGRVIgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGJ1ZmZlciBwcm9jZXNzaW5nIHJlcXVlc3QgKi8KKyAgICBMVkNTX1NUQVRVU01BWCAgICAgID0gTFZNX01BWEVOVU0KK30gTFZDU19SZXR1cm5TdGF0dXNfZW47CisKKworLyoKKyAqIFNvdXJjZSBkYXRhIGZvcm1hdHMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TVEVSRU8gICAgICAgPSAwLAorICAgIExWQ1NfTU9OT0lOU1RFUkVPID0gMSwKKyAgICBMVkNTX1NPVVJDRU1BWCAgICA9IExWTV9NQVhFTlVNCit9IExWQ1NfU291cmNlRm9ybWF0X2VuOworCisKKy8qCisgKiBTdXBwb3J0ZWQgb3V0cHV0IGRldmljZXMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19IRUFEUEhPTkVTICAgICAgICAgICAgID0gMCwKKyAgICBMVkNTX0VYX0hFQURQSE9ORVMgICAgICAgICAgPSAxLAorICAgIExWQ1NfU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit9IExWQ1NfU3BlYWtlclR5cGVfZW47CisKKy8qCisgKiBTcGVha2VyIENvZWZmaWNpZW50cyBUYWJsZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZvaWQgICAgKnBUYWJsZTE7CisgICAgdm9pZCAgICAqcFRhYmxlMjsKKyAgICB2b2lkICAgICpwVGFibGUzOworICAgIHZvaWQgICAgKnBUYWJsZTQ7CisgICAgdm9pZCAgICAqcFRhYmxlNTsKKyAgICB2b2lkICAgICpwVGFibGU2OworICAgIHZvaWQgICAgKnBUYWJsZTc7CisgICAgdm9pZCAgICAqcFRhYmxlODsKK30gTFZDU19DU01TX0NvZWZfVGFibGVzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCisgICAgTFZDU19NZW1vcnlUeXBlc19lbiAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWQ1NfTWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVkNTX01lbW9yeVJlZ2lvbl90IFJlZ2lvbltMVkNTX05SX01FTU9SWV9SRUdJT05TXTsgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWQ1NfTWVtVGFiX3Q7CisKKworLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEFsZ29yaXRobSBtb2RlICovCisgICAgTFZDU19TcGVha2VyVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCisgICAgTFZDU19Tb3VyY2VGb3JtYXRfZW4gICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU7ICAgICAgICAgLyogTm9uLUxpbmVhciBDb21wcmVzc29yIE1vZGUgKi8KKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KK30gTFZDU19QYXJhbXNfdDsKKworCisvKiBDb25jZXJ0IFNvdW5kIENhcGFiaWxpdHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KKworICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsgICAgICAgICAgICAgICAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJ1bmRsZUluc3RhbmNlOyAgICAgICAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCisKK30gTFZDU19DYXBhYmlsaXRpZXNfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KKy8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLCBvZiB0aGVzZSBvbmx5IHRoZSBidWZmZXIgcHJvY2Vzc2luZyBzZXR0aW5nIGlzICAgICAqLworLyogIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gICAgICAqLworLyogIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlICAgICAgICAgICAgICAqLworLyogIGNhcGFiaWxpdGllcyBhcmUgaWdub3JlZCBhbmQgdGhlIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX01lbW9yeShMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCisvKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KKy8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KKy8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCisvKiAgTFZDU19NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19BbGlnbm1lbnRFcnJvciAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KKy8qICBMVkNTX051bGxBZGRyZXNzICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLworLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgICAgICovCisvKiAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlLiBUaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdHdvICAgICAgKi8KKy8qICB2YXJpYW50cyBvZiB0aGUgYWxnb3JpdGhtLCBvbmUgZm9yIGhlYWRwaG9uZXMgYW5kIG9uZSBmb3IgbW9iaWxlIHNwZWFrZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfVG9vTWFueVNhbXBsZXMgICAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIExWQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDhjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKCAgIExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQnlwYXNzTWl4SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSBieXBhc3MgbWl4ZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIG92ZXJhbGwgZ2FpbiBvZiB0aGUgcHJvY2Vzc2VkIHBhdGggaXMgc2V0IGJ5IHRoZSBnYWlucyBpbiB0aGUgaW5kaXZpZHVhbCAgICAqLworLyogIHByb2Nlc3NpbmcgYmxvY2tzIGFuZCBieSB0aGUgZWZmZWN0IGxldmVsIGdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHVucHJvY2Vzc2VkIHBhdGggbXVzdCBoYXZlIG1hdGNoaW5nIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aCB0byBlbnN1cmUgICAqLworLyogIGFzIHRoZXkgYXJlIG1peGVkIHRvZ2V0aGVyIHRoZSBjb3JyZWN0IGVmZmVjdCBpcyBhY2hpZXZlZCwgdGhpcyBpcyB0aGUgdmFsdWUgICAgKi8KKy8qICBVbnByb2NMb3NzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBvdmVyYWxsIGdhaW4gaXMgY29ycmVjdGVkIGJ5IGEgY29tYmluYXRpb24gb2YgYSBzaGlmdCB3aXRoIHNhdHVyYXRpb24gYW5kIGEgKi8KKy8qICBsaW5lYXIgc2NhbGVyLCBsb3NzLiBUaGUgbG9zcyBlbnN1cmVzIHRoZSBzdW0gaW4gdGhlIG1peGVyIGRvZXMgbm90IHNhdHVyYXRlICAgICovCisvKiAgYW5kIGFsc28gY29ycmVjdHMgZm9yIGFueSBleGNlc3MgZ2FpbiBpbiB0aGUgc2hpZnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OworICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGU7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50OworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgdHJhbnNpdGlvbiBnYWluCisgICAgICovCisgICAgaWYgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpCisgICAgICAgICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnN0aW9uICovCisgICAgICAgICkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSBwUGFyYW1zLT5FZmZlY3RMZXZlbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2VsZWN0IG5vIGVmZmVjdCBsZXZlbCAqLworICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGdhaW4gdGFibGUgb2Zmc2V0CisgICAgICovCisgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKSk7CisgICAgcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAorICAgICAqLworICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTE7CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKKyAgICAgKi8KKyAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDB4N0ZGRiAtIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKKyAgICBHYWluID0gKExWTV9VSU5UMzIpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2FpbiA+PiAxNSk7CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gaEluc3RhbmNlOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTE7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZDU19NaXhlckNhbGxiYWNrOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgb3V0cHV0IGdhaW4gc2hpZnQKKyAgICAgKi8KKyAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uU2hpZnQ7CisKKworICAgIC8qCisgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCisgICAgICovCisgICAgeworCisgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbkNvcnJlY3Q7CisgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjE7CisgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjI7CisKKyAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgICAgICAvKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQorICAgICAgICB7CisgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9JTlQxNikoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiAoTFZNX0lOVDMyKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pID4+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogKExWTV9JTlQzMilwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSA+PiAxNSkgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uIGFuZCBzaGlmdCwgbm90ZSB0aGUgcmVzdWx0IGlzIGluIFEzLjEzIGZvcm1hdAorICAgICAgICAgKi8KKyAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCkgPDwgNDsKKyAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCkgPDwgNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEdhaW4xID0gR2FpbjEgPDwgMTY7CisgICAgICAgICAgICBHYWluMiA9IEdhaW4yIDw8IDE2OworICAgICAgICB9CisKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZ2FpbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPk91dHB1dF9TaGlmdCA9IHBDb25maWctPk91dHB1dF9TaGlmdDsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sR2FpbjE+PjE2KTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjI+PjE2KTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0J5cGFzc01peGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBcHBseSBCeXBhc3MgTWl4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgbWl4ZXMgdGhlIHByb2Nlc3NlZCBhbmQgdW5wcm9jZXNzZWQgZGF0YSBzdHJlYW1zIHRvZ2V0aGVyIHRvIGNvcnJlY3QgdGhlICAgKi8KKy8qICBvdmVyYWxsIHN5c3RlbSBnYWluIGFuZCBhbGxvdyBwcm9ncmVzc2l2ZSBjb250cm9sIG9mIHRoZSBDb25jZXJ0IFNvdW5kIGVmZmVjdC4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGJ5cGFzcyBtaXhlciBpcyBlbmFibGVkIHRoZSBvdXRwdXQgaXMgdGhlIHByb2Nlc3NlZCBzaWduYWwgb25seSBhbmQgICAgKi8KKy8qICB3aXRob3V0IGdhaW4gY29ycmVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByb2Nlc3NlZCAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBVbnByb2Nlc3NlZCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHVucHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgICAgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgICAgICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGJ5cGFzcyBtaXhlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19CWVBBU1NNSVhTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgYnlwYXNzIG1peAorICAgICAgICAgKi8KKyAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSBwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAorICAgICAgICAgKi8KKyAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19NaXhlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworCisgICAgLyoKKyAgICAgKiBPZmYgdHJhbnNpdGlvbiBoYXMgY29tcGxldGVkIGluIEhlYWRwaG9uZSBtb2RlCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICAgICAmJgorICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMHgwMDAwKSYmICAvKiB0aGlzIGluZGljYXRlcyBhbiBvbi0+b2ZmIHRyYW5zaXRpb24gKi8KKyAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpCisgICAgeworICAgICAgICAvKiBTZXQgb3BlcmF0aW5nIG1vZGUgdG8gT0ZGICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKKworICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKworICAgICAgICAvKiBTaWduYWwgdG8gdGhlIGJ1bmRsZSAqLworICAgICAgICBpZigoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKSAhPSBMVk1fTlVMTCl7CisgICAgICAgICAgICAoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKShwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTEdPUklUSE1fQ1NfSUQgfCBMVkNTX0VWRU5UX0FMR09GRikpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKXsKKworICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWVmNzBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkNTX0JZUEFTU01JWF9IX18KKyNkZWZpbmUgX19MVkNTX0JZUEFTU01JWF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJ5cGFzcyBtaXhlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPdXRwdXRfU2hpZnQ7ICAgICAgICAgICAgICAgLyogQ29ycmVjdGluZyBnYWluIG91dHB1dCBzaGlmdCAqLworCit9IExWQ1NfQnlwYXNzTWl4X3Q7CisKKworLyogT3V0cHV0IGdhaW4gdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBPdXRwdXQgZ2FpbiBzZXR0aW5ncywgR2FpbiA9IChMb3NzLzMyNzY4KSAqIDJeU2hpZnQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KK30gR2Fpbl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqdW5Qcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBCWVBBU1NNSVhfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZDQxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIGVycjsKKyAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOworCisgICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlID0gTFZDU19TYW1wbGVSYXRlVGFibGVbcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmV2ZXJiIGxldmVsIGhhcyBjaGFuZ2VkCisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCisgICAgeworICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSxwUGFyYW1zKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIGhhcyBjaGFuZ2VkIHRoZW4gcGVyZm9ybSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24KKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPdXRwdXQgZGV2aWNlCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSA9IExWQ1NfSEVBRFBIT05FOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCisgICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKKworICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKKworICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworCisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOworCisKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOworICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBMVk1fTUFYSU5UXzE2KTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKKyAgICAgICAgICAgIEdhaW49R2Fpbj4+MTU7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbiBhbmQgc2hpZnQsIG5vdGUgdGhlIHJlc3VsdCBpcyBpbiBRMy4xMyBmb3JtYXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgR2FpbiA9IChHYWluICogcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4pID4+MTI7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwwLEdhaW4pOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworICAgICAgICB9CisKKworICAgICAgICBlcnI9TFZDU19TRW5oYW5jZXJJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisKKyAgICAgICAgZXJyPUxWQ1NfRXF1YWxpc2VySW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBlZmZlY3QgbGV2ZWwgb3Igc291cmNlIGZvcm1hdCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkKKyAgICB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSB2b2x1bWUgY29ycmVjdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KKyAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworCisgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOworCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CisKKyAgICAvKiBTdGF5IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICBpZigocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpeworCisgICAgICAgIC8qIFNldCB0aGUgcmV2ZXJiIGRlbGF5IHRpbWVvdXQgKi8KKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlRpbWVJbk1zID0KKyAgICAgICAgICAgIChMVk1fSU5UMTYpKCgocEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uLkRlbGF5U2l6ZSA8PCAyKQorICAgICAgICAgICAgL3BJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArIDEpOworICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KKyAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICAvKiBDaGFuZ2UgdHJhbnNpdGlvbiBieXBhc3MgbWl4ZXIgc2V0dGluZ3MgaWYgbmVlZGVkIGRlcGVuZGluZyBvbiB0cmFuc2l0aW9uIHR5cGUgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD1MVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlU2F2ZTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPUxWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD0wOworICAgICAgICB9CisKKworICAgICAgICAvKiBTZXQgdHJhbnNpdGlvbiBmbGFnICovCisgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1RpbWVyQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxsQmFjayBmdW5jdGlvbiBvZiB0aGUgVGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBDYWxsQmFja1BhcmFtcywgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pCit7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgLyogQXZvaWQgd2FybmluZ3MgYmVjYXVzZSBwQ2FsbEJhY2tQYXJhbXMgYW5kIENhbGxiYWNrUGFyYW0gYXJlIG5vdCB1c2VkKi8KKyAgICBpZigocENhbGxCYWNrUGFyYW1zICE9IExWTV9OVUxMKSB8fCAoQ2FsbGJhY2tQYXJhbSAhPSAwKSl7CisgICAgICAgIHBDYWxsQmFja1BhcmFtcyA9IGhJbnN0YW5jZTsKKyAgICAgICAgQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fVFJVRTsKKworCisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMGQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19FcXVhbGlzZXJJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCisvKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLworLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KKy8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRvIGF2b2lkIGV4Y2Vzc2l2ZSB0ZXN0aW5nIGR1cmluZyB0aGUgc2FtcGxlIHByb2Nlc3NpbmcgdGhlIGJpcXVhZCB0eXBlIGlzICAgICAgKi8KKy8qICBzZXQgYXMgYSBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgaW5pdCByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgIENvZWZmczsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDErTFZNX0ZTXzQ4MDAwKSkpOworICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNikgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0lOVDE2KSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fSU5UMTYpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0XzE2KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworCisgICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGx5IHRoZSBlcXVhbGlzZXIgZmlsdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5wdXRPdXRwdXQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5NmY1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDU19FUVVBTElTRVJfSF9fCisjZGVmaW5lIF9fTFZDU19FUVVBTElTRVJfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOworCit9IExWQ1NfRXF1YWxpc2VyX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIEVRVUFMSVNFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU1MjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ1NfSEVBRFBIT05FX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkNTX0hFQURQSE9ORV9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgU3RlcmVvIEVuaGFuY2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjc3MjAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTUxMjUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0zMDIwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjkyMTg5OSAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42MTE0NDEgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI0NjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODAzNDQgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTc1NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzEwOTcgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAzOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MjI0NzAgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMzA3NTkgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc1NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMDgzOCAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzI2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyMTU1OSAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMwOTAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTQzMDU2ICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyNjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU1NzM3MiAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjgyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM5MTQ5MCAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNTQzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTg4MSAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0yODg1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjg4MDYwOCAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDMyMzk3ICovCisjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMTkxICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjk5MzIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTcyNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjE0MzYgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTA1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk0NzYxNiAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Mjk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTgzOTggKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMTI4NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zOTIyMTEgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTU0NDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjYxODcgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjkyNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44OTI1NTAgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzMjg1NiAqLworI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjM3MSAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzU1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjMwNjM4ICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03MzQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI0MjMyICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzE0NzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NjA1NTAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgODE4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDk5Njk1ICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC01ODI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzU1NTQzICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMzYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQ0MTUyICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTE3MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDUwNzg4ICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNDQxMDQgKi8KKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc0OTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIyODc0OSAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzM0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDEyOCAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMxODI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTcxMjYyICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDExMiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTA5NiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjkzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3OTAxNiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0xODI5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjExNjc4NiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTgyNTA3ICovCisjZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxODgyICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzAzOTUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTc0MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjYxMTcgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTkwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk3MzU3MyAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Nzk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTQ3NzAgKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODcxODIgKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTIwOTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMjc1ODggKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjAxNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4yMjk2NDggKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MjE3NyAqLworI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDMyMiAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI4NDAwICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03MzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1MjE0ICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzIxMTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45ODAxMjYgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzY0NTc5ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA3MzU1ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTU3MjI0ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTIwODc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjc0MjMxICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMTI0OTUgKi8KKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc2NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMzU5MyAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzU3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIzMTIyNSAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMyMjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTg1NTQ1ICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4NDU3MyAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI1ODkxMCAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAyNTY2MiAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTc2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjU3MjI0OCAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgOTY0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTg4Mzk5ICovCisjZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NjgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzQ0NDUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTc2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzIyNjEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMjMzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk4NjcxMyAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNzI2MDYgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQzNzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjY5NTIgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDU2NTQgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjY0OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS42MTcxNDEgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMDQwNSAqLworI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFJldmVyYiBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIxODY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NjcyNzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMjE4NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42NjcyNzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMTg5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY2ODE3OSAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIyOTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42OTk2MzggKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjI5MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42OTk2MzggKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNDU0NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc0OTA5NiAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIzMTY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MDY5MzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMjMxNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43MDY5MzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNTE0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc2NzMyNyAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIzODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MjgyNzIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMjM4NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43MjgyNzIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNjg5MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgyMDY3OSAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDE2OTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTYzOTYgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0xNjkyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjUxNjM5NiAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xNjk5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjUxODUxMiAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAtOTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5MDk5MCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxNTcxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5NTY1ICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMTU3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40Nzk1NjUgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42Mzc3NDUgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgLTY1MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTg5MTIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTI0NjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4MDM0OSAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgLTEyNDYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzgwMzQ5ICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMxMTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTUwODczICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxNjEwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wNDkxMjcgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQ4NzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI5NzM4OSAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC00ODcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjk3Mzg5ICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTE5NjY4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjAwNDIzICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA0MjAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNTY1MjkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI3ODY2MSAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC00NTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjc4NjYxICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjU0OTkzICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA0OTcwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDMzNDcgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIEdhaW4gU2V0dGluZ3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOICAgICAgICAgICAgICAgMC44MDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gICAgICAgICAgICAgIDEuMDAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOICAgICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAgICAgICAgICAgICAxLjAwOTM0MyAgICAgICAgIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIEVxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAyMDY5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjYzMzEyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgIC05ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjAxNzQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC00NTk5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjgwNjgxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC03Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc1ODY1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIC02Njg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4MTU0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDMwOTEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDMzNTcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMTQ3MjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NDkzNDUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTY4NjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDk1OTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMTU1OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NzU4NjUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMTMzNzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDgxNTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMTgwNDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjEwMTE0NSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgMjI3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTM5MDIwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgLTE0MTYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODY0NDIzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgNDAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjQ1NDEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAtMTQ4OTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MDg5MzAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgMzE5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjA1OCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgIC0yMjc4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY5NTMyNiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMjk3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA5MDgwOSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgIC0yMDAwOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYxMDU5NCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgIC0xMDE5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxMTE0OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNQorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzMjUyMSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MTAxNyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMDkxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjc2NjYxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTE2NjcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDE3NTE5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtNzIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDQ0MTI4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTExOTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI5NjE2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0zMzUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA0NTMyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDE2NTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDcwOTUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAtMTQyODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44NzE5MTIgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAzODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyMzIzMiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgIC0xMjIyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc0NTg1NyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAtMzA5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE4OTE3MSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMDk5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjgxNjI5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTE3NjI3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDc1ODcyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtNjc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDQxMzY1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTExODgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI1MjM5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0zNjc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI0MzU4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgIDE3NzEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wODEwOTEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAtMTQyMDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44NjcxODMgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgLTExNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzAyNDcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgLTg0NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTUxMjEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgLTY5NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MjU4OTMgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMjI3NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjM4ODYwNSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgIC0yMTM5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjMwNTc5OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDY1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDM5OTIyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgLTExNzg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzE5NDk0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgIC0zOTg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQzMjQ1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDIwODU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yNzI5MTAgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMjE5NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4zNDEwMTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgIDI3NDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE2NzQ2MiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0xMDA2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYxNDIxOSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAtNTY1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0NTM4NCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMzA5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNDA5ODMyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTIzODYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuNDU2NTA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAyNDgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNTE0MTAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MDQyMDEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgLTI2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjM3ODMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgMjEyODYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI5OTE5OCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgIC0yMzc5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjQ1MjQ0NyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgMzk0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjQwNDg5ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgLTEwOTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjY5MzAzICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC00ODMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjk0OTg0ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDI1NTc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41NjA5ODggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMzA3NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS44Nzc3MjQgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDYzODYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4OTc0MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xNDg2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjkwNzQxMCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMTE1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3MDQ4OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNDYyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNzg1MDQ5ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgLTE4Mjk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTIuMjMzNDk3ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICA0MzEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MjY0MzEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgLTM2NTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NDU5MzkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgLTQyODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MjI0NDYgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMjIxNzAgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjMyODggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMTMzMDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjYyMzk5MyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xODYwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjI3MDc0MyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgNTY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjg4ODI5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgIC05MTUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMTE3MTkwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAxMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMzAyMDggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgMTY2MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjAyODMxNSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgIC0yMzYxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjg4MjQ1OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgNzQxMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTA0NTM1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgIC00ODYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTkzMzA4ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgIC0zMTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzg1ODE2ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEzNDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS42NDExNzcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMTkzNzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi4zNjQ2ODcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDYyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjc1OTkxMCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtOTU1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjE2Njc3NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMTQ1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTc4MDc0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgIDE3MjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4wOTk2NTUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAtMjUxMTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMy4wNjUyMjAgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDgyNzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAxMDQxNyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtNTE5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYzNDAyMSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMjg0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0NzMzMiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIE91dHB1dCBHYWluIENvcnJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMjc3NzkgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgICA2ODQwICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAxODYwMCAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgIDUxMDggICAgICAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KKy8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KKy8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KKy8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLworLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19JbnN0YW5jZV90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIERhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfRGF0YV90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfREFUQTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0NvZWZmaWNpZW50X3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZDU19DT0VGRklDSUVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkNTX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7ICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIExWTV9OVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICovCisvKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gKi8KKy8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogIDMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGFzIHVzZWQgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgY2FsbCB0byB0aGUgbWVtb3J5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgICAgICAgICAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIH0KKyAgICBwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgY2FwYWJpbGl0aWVzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCBhbGwgaW5pdGlhbCBwYXJhbWV0ZXJzIHRvIGludmFsaWQgdG8gZm9yY2UgYSBmdWxsIGluaXRpYWxpc2F0aW9uCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVkNTX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAgICA9IExWQ1NfU1BFQUtFUlRZUEVfTUFYOworICAgIHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlICAgICAgICAgID0gTFZDU19IRUFEUEhPTkU7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVkNTX1NPVVJDRU1BWDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICA9IExWTV9GU19JTlZBTElEOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAgICA9IChMVk1fVUlOVDE2KTB4ODAwMDsKKyAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKyAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwwLDApOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9MDsKKyAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT0wOworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5iVGltZXJEb25lICAgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrICAgICAgICAgICAgID0gTFZDU19UaW1lckNhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxiYWNrSW5zdGFuY2UgICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zICAgICAgID0gTFZNX05VTEw7CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhZGI4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZC4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZDU19QUklWQVRFX0hfXworI2RlZmluZSBfX0xWQ1NfUFJJVkFURV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIgICAgICAgICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfRXF1YWxpc2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWTV9UaW1lci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25maWd1cmF0aW9uIHN3aXRjaCBjb250cm9scyAqLworI2RlZmluZSBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0ggICAgMHgwMDAxICAgICAgLyogU3RlcmVvIGVuaGFuY2VtZW50IGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfUkVWRVJCU1dJVENIICAgICAgICAgICAweDAwMDIgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIICAgICAgICAweDAwMDQgICAgICAvKiBFcXVhbGlzZXIgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19CWVBBU1NNSVhTV0lUQ0ggICAgICAgIDB4MDAwOCAgICAgIC8qIEJ5cGFzcyBtaXhlciBlbmFibGUgY29udHJvbCAqLworI2RlZmluZSBMVkNTX0NPTVBHQUlORlJBTUUgICAgICAgICAgNjQgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHVwZGF0ZSBpbnRlcnZhbCAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSBMVkNTX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworI2RlZmluZSBMVkNTX0JZUEFTU19NSVhFUl9UQyAgICAgICAgMTAwICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KKworLyogQWNjZXNzIHRvIGV4dGVybmFsIGNvZWZmaWNpZW50cyB0YWJsZSAqLworI2RlZmluZSBMVkNTX05SX09GX0ZTICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIExWQ1NfTlJfT0ZfQ0hBTl9DRkcgICAgICAgICAgICAgIDIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBMVk1fVUlOVDE2ICBMVkNTX0NvbmZpZ3VyYXRpb25fdDsgICAgICAgLyogSW50ZXJuYWwgYWxnb3JpdGhtIGNvbmZpZ3VyYXRpb24gKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19IRUFEUEhPTkUgID0gMCwKKyAgICBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX091dHB1dERldmljZV9lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworfSBMVkNTX1ZvbENvcnJlY3RfdDsKKworLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCisgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCisKKyAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisKKyAgICAvKiBTdWItYmxvY2sgY29uZmlndXJhdGlvbnMgKi8KKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICBTdGVyZW9FbmhhbmNlcjsgICAgIC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgUmV2ZXJiZXJhdGlvbjsgICAgICAvKiBSZXZlcmJlcmF0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICAgICBFcXVhbGlzZXI7ICAgICAgICAgIC8qIEVxdWFsaXNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAgICAgQnlwYXNzTWl4OyAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgY29uZmlndXJhdGlvbiAqLworCisgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTVNUYXJnZXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zdGlvbiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE1TVGFyZ2V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc3Rpb24gKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgICAgICAgICAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiVGltZXJEb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBjb21wbGV0aW9uIGZsYWcgKi8KKyAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICBUaW1lclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBwYXJhbWV0ZXJzICovCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgVGltZXJJbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgaW5zdGFuY2UgKi8KKworfSBMVkNTX0luc3RhbmNlX3Q7CisKKy8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOworCit9IExWQ1NfQ29lZmZpY2llbnRfdDsKKworLyogRGF0YSBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworCit9IExWQ1NfRGF0YV90OworCisKK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrICggICB2b2lkKiBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENhbGxCYWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgICAgICAvKiBQUklWQVRFX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk5NDYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQ29tcExpbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3NfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICBfX19fX19fX18gICAgX19fX19fX18gICAgX19fX18gICAgX19fX19fXyAgICAgX19fICAgX19fX19fICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICB8ICAgICAgICAgfCAgfCAgICAgICAgfCAgfCAgICAgfCAgfCAgICAgICB8ICAgfCAgIHwgfCAgICAgIHwgICAgICAgICAgICovCisvKiAgICAgLS0tLS0+fCBTdGVyZW8gIHwtPnwgUmV2ZXJiIHwtPnwgRXF1IHwtPnwgQWxwaGEgfC0tPnwgKyB8LXwgR2FpbiB8LS0tLT4gICAgICAqLworLyogICAgICAgIHwgIHwgRW5oYW5jZSB8ICB8X19fX19fX198ICB8X19fX198ICB8X19fX19fX3wgICB8X19ffCB8X19fX19ffCAgICAgICAgICAgKi8KKy8qICAgICAgICB8ICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IDEgLSBBbHBoYSB8LS0tLS18ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgU3RlcmVvIEVuaGFuY2VyLCBSZXZlcmIgYW5kIEVxdWFsaXNlciBibG9ja3MgYXJlIGVhY2ggY29uZmlndXJlZCB0byBoYXZlICAgICovCisvKiAgdGhlaXIgZ2FpbiB0byBnaXZlIGEgbmVhciBwZWFrIHRvIHBlYWsgb3V0cHV0ICgtMC4xZEJGUykgd2l0aCBhIHdvcnN0IGNhc2UgICAgICAqLworLyogIGlucHV0IHNpZ25hbC4gVGhlIGdhaW5zIG9mIHRoZXNlIGJsb2NrcyBhcmUgcmUtY29tYmluZWQgaW4gdGhlIEFscGhhIG1peGVyIGFuZCAgKi8KKy8qICB0aGUgZ2FpbiBibG9jayBmb2xsb2luZyB0aGUgc3VtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBwcm9jZXNzaW5nIHVzZXMgdGhlIG91dHB1dCBidWZmZXIgZm9yIGRhdGEgc3RvcmFnZSBhZnRlciBlYWNoIHByb2Nlc3NpbmcgICAgKi8KKy8qICBibG9jay4gV2hlbiBwcm9jZXNzaW5nIGlzIGlucGxhY2UgYSBjb3B5IG9mIHRoZSBpbnB1dCBzaWduYWwgaXMgbWFkZSBpbiBzY3JhdGNoICovCisvKiAgbWVtb3J5IGZvciB0aGUgMS1BbHBoYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMTYgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIqTnVtU2FtcGxlcyk7CisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKKyAgICAgKi8KKyAgICBlcnI9TFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVycj1MVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgorICAgICAqLworICAgIGVycj1MVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICBpZihlcnIgIT1MVkNTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0d28gICovCisvKiAgdmFyaWFudHMgb2YgdGhlIGFsZ29yaXRobSwgb25lIGZvciBoZWFkcGhvbmVzIGFuZCBvbmUgZm9yIG1vYmlsZSBzcGVha2Vycy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gdHdvIGZvcm1hdHMsIHN0ZXJlbyBvciBtb25vLWluLXN0ZXJlby4gRGF0YSBpbiBtb25vICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAqLworLyogIG1vbm8taW4tc3RlcmVvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19Ub29NYW55U2FtcGxlcyAgICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAgICAgZXJyPUxWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMTYgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworICAgICAgICAgICAgTFZNX0lOVDMyIEN1cnJlbnQxOworCisgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9JTlQxNikoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpID4+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpID4+IDE1KSApOworCisgICAgICAgICAgICBpZihOdW1TYW1wbGVzIDwgTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRDE2KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIqTnVtU2FtcGxlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2FpblN0ZXA7CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOworICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKnBPdXRQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCisKKyAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fSU5UMTYpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBMVkNTX0NPTVBHQUlORlJBTUUpL051bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09MCkmJihwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA8IEdhaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09MCkmJihwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcD0tMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47CisgICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOworICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKKworICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9JTlQxNikoR2FpbiArIEdhaW5TdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPTA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPCAwKSYmIChGaW5hbEdhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0wOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNihHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMipMVkNTX0NPTVBHQUlORlJBTUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIgKz0oMipMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoU2FtcGxlVG9Qcm9jZXNzLUxWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNihHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMipTYW1wbGVUb1Byb2Nlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdG9yZSBnYWluIHZhbHVlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBMVk1fVGltZXIgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjU3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSByZXZlcmIgbW9kdWxlLiBUaGUgZGVsYXkgYnVmZmVyIHNpemUgaXMgY29uZmlndXJlZCBmb3IgdGhlICAgICAgKi8KKy8qICBzYW1wbGUgcmF0ZSBhbmQgdGhlIHNwZWFrZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSByb3V0aW5lIG1heSBhbHNvIGJlIGNhbGxlZCBmb3IgcmUtaW5pdGlhbGlzYXRpb24sIGkuZS4gd2hlbiBvbmUgb2YgdGhlICAgICAgKi8KKy8qICBjb250cm9sIHBhcmFtZXRlcnMgaGFzIGNoYW5nZWQuIEluIHRoaXMgY2FzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgYXJlIG9ubHkgICAgICovCisvKiAgcmUtaW5pdGlhbGlzZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgaXMgbWV0OiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtICAgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSAgIHRoZSBzcGVha2VyIHR5cGUgY2hhbmdlcyB0by9mcm9tIHRoZSBtb2JpbGUgc3BlYWtlciAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBJbiB0aGUgZGVsYXkgc2V0dGluZ3MgJ1NhbXBsZXMnIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB0aGUgZW5kIG9mIHRoZSAgKi8KKy8qICAgICAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgorICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAorICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBkZWxheQorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisgICAgICAgIHBSZXZlcmJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfUmV2ZXJiQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNilwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fSU5UMTYpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0lOVDE2KXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgIC8qIE51bWJlciBvZiB3b3JkcyAqLworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7CisgICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZT04Mzg4NjsgICAgICAgICAgICAgICAgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBSZXZlcmJQZXJjZW50YWdlKj1wUGFyYW1zLT5SZXZlcmJMZXZlbDsgICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBSZXZlcmIgTGV2ZWwgaW4gUSAyMyBmb3JtYXQKKyAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWw9KExWTV9JTlQxNikoUmV2ZXJiUGVyY2VudGFnZT4+OCk7ICAvLyBSZXZlcmIgTGV2ZWwgaW4gUSAxNSBmb3JtYXQKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19SZXZlcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIHJldmVyYiB1c2luZyB0aGUgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGJsb2NrICAgICAqLworLyogIGRpYWdyYW06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIF9fX19fICAgICBfX19fX19fICAgIHwgICAgICAgIHwtLS0tLS0tLS0tLT58ICAgICAgICB8ICAgIF9fX19fXyAgICAgX19fICAgICAgKi8KKy8qICAgIHwgICAgIHwgICB8ICAgICAgIHwgICB8IFN0ZXJlbyB8ICAgICAgICAgICAgfCBMICYgUiAgfCAgIHwgICAgICB8ICAgfCAgIHwgICAgICovCisvKiAtLT58IExQRiB8LS0+fCBEZWxheSB8LS0+fCAgIHRvICAgfCAgICBfX19fICAgIHwgICB0byAgIHwtLT58IEdhaW4gfC0tPnwgKyB8LS0+ICAqLworLyogIHwgfF9fX19ffCAgIHxfX19fX19ffCAgIHwgTCAmIFIgIHwgICB8ICAgIHwgICB8IFN0ZXJlbyB8ICAgfF9fX19fX3wgICB8X19ffCAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8LS0+fCAtMSB8LS0+fCAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgIHxfX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgfCAgICAgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKi8KKy8qICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBpbnB1dCBidWZmZXIgaXMgYnJva2VuIGluIHRvIHN1Yi1ibG9ja3Mgb2YgdGhlIHNpemUgb2YgdGhlIGRlbGF5IG9yIGxlc3MuICAgKi8KKy8qICBUaGlzIGFsbG93cyB0aGUgZGVsYXkgYnVmZmVyIHRvIGJlIHRyZWF0ZWQgYXMgYSBjaXJjdWxhciBidWZmZXIgYnV0IHByb2Nlc3NlZCAgICovCisvKiAgYXMgYSBsaW5lYXIgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBQcm9jZXNzIGluIGJsb2NrcyBvZiBzYW1wbGVzIHRoZSBzaXplIG9mIHRoZSBkZWxheSB3aGVyZSBwb3NzaWJsZSwgaWYgbm90ICAgKi8KKy8qICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGVzIGxlZnQgb3ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoZSBHYWluIGlzIGNvbWJpbmVkIHdpdGggdGhlIExQRiBhbmQgaW5jb3Jwb3JhdGVkIGluIHRvIHRoZSBjb2VmZmljaWVudHMgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDE2ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZworICAgICAqLworICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV2ZXJiIG5vdCByZXF1aXJlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKCgocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19IRUFEUEhPTkUpIHx8ICAgICAgICAgICAvKiBEaXNhYmxlIHdoZW4gQ1M0TVMgaW4gc3RlcmVvIG1vZGUgKi8KKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKSAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICBNdWx0M3NfMTZ4MTYoIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF8xNngxNigoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTAyNmZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkNTX1JFVkVSQkdFTkVSQVRPUl9IX18KKyNkZWZpbmUgX19MVkNTX1JFVkVSQkdFTkVSQVRPUl9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgICAgIEhFQURQSE9ORUdBSU5QUk9DICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTgorI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlVOUFJPQyAgICAgICAgIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgICAvKiBTdGVyZW8gZGVsYXkgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlTaXplOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheU9mZnNldDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUHJvY0dhaW47CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFVucHJvY0dhaW47CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIqTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisKKyAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CisKKyAgICAvKiBGaWx0ZXIgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisKK30gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7CisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBSRVZFUkJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI4YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfU3RlcmVvRW5oYW5jZXIuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19TdGVyZW9FbmhhbmNlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIHN0ZXJlbyBlbmhhbmNlbWVudCBtb2R1bGUgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCisvKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLworLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KKy8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICBDb2VmZnNTaWRlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBTRVNpZGVDb2VmczsKKworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICovCisgICAgICAgIC8qIE1pZCBmaWx0ZXIgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fSU5UMTYpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9JTlQxNikgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNNaWQuQjEgPSAoTFZNX0lOVDE2KS1MVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQjE7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpL3NpemVvZihMVk1fVUlOVDE2KSkpOyAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNNaWQpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBpZihMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uU2NhbGU9PTE1KQorICAgICAgICB7CisgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICB9CisKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUpOworICAgICAgICBwU0VTaWRlQ29lZnMgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfU0VTaWRlQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIFNpZGUgZmlsdGVyICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzU2lkZS5BMCA9IChMVk1fSU5UMTYpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNTaWRlLkExID0gKExWTV9JTlQxNikgcFNFU2lkZUNvZWZzW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc1NpZGUuQTIgPSAoTFZNX0lOVDE2KSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzU2lkZS5CMSA9IChMVk1fSU5UMTYpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnNTaWRlLkIyID0gKExWTV9JTlQxNiktcFNFU2lkZUNvZWZzW09mZnNldF0uQjI7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKS9zaXplb2YoTFZNX1VJTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBTRVNpZGVDb2Vmc1tPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFbmhhbmNlIHRoZSBzdGVyZW8gaW1hZ2UgaW4gdGhlIGlucHV0IHNhbXBsZXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8ICAgICAgICB8ICBNaWRkbGUgICB8IFRyZWJsZSB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCAgICAgICAgfC0tLS0tLS0tLS0+fCBCb29zdCAgfC0tLS0tLS0tPnwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICB8IE0gJiBTICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtLT58ICAgdG8gICB8ICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgfCAgIHRvICAgfC0tPiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCBNICYgUyAgfCAgU2lkZSAgICAgfCAgICAgICAgfCAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgICAgICAgIHwtLS0tLS0tLS0tPnwgU2lkZSAgIHwtLS0tLS0tLT58ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8X19fX19fX198ICAgICAgICAgICB8IEJvb3N0ICB8ICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJZiB0aGUgaW5wdXQgc2lnbmFsIGlzIGEgbW9ubyBzaWduYWwgdGhlcmUgd2lsbCBiZSBubyBzaWRlIHNpZ25hbCBhbmQgaGVuY2UgICAgICovCisvKiAgdGhlIHNpZGUgZmlsdGVyIHdpbGwgbm90IGJlIHJ1bi4gSW4gbW9iaWxlIHNwZWFrZXIgbW9kZSB0aGUgbWlkZGxlIGZpbHRlciBpcyAgICAqLworLyogIG5vdCByZXF1aXJlZCBhbmQgdGhlIFRyZWJibGUgYm9vc3QgZmlsdGVyIGlzIHJlcGxhY2VkIGJ5IGEgc2ltcGxlIGdhaW4gYmxvY2suICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2ggID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfU1RFUkVPRU5IQU5DRVNXSVRDSCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gc3RlcmVvIHRvIG1pZGRsZSBhbmQgc2lkZQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9NU18xNngxNihwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoK051bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSBmaWx0ZXIgdG8gdGhlIG1pZGRsZSBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQpKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNdWx0M3NfMTZ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKKyAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICovCisgICAgICAgIE1TVG8yaV9TYXRfMTZ4MTYocFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2grTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmM0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDU19TVEVSRU9FTkhBTkNFUl9IX18KKyNkZWZpbmUgX19MVkNTX1NURVJFT0VOSEFOQ0VSX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKgorICAgICAqIE1pZGRsZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKworICAgIC8qCisgICAgICogU2lkZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisKKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLworCit9IExWQ1NfU3RlcmVvRW5oYW5jZXJfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAqcFBhcmFtcyk7CisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogU1RFUkVPRU5IQU5DRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZGUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZpbHRlcnMuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgICAgICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBtaWRkbGUgZmlsdGVyICovCitjb25zdCBCaXF1YWRBMDFCMUNvZWZzU1BfdCBMVkNTX1NFTWlkQ29lZlRhYmxlW10gPSB7CisgICAge0NTX01JRERMRV84MDAwX0EwLCAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzgwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfODAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xMTAyNV9BMCwgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzExMDI1X0ExLAorICAgICBDU19NSURETEVfMTEwMjVfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTEwMjVfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTIwMDBfQTAsICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xMjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzEyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTYwMDBfQTEsCisgICAgIENTX01JRERMRV8xNjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xNjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8yMjA1MF9BMCwgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzIyMDUwX0ExLAorICAgICBDU19NSURETEVfMjIwNTBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjIwNTBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMjQwMDBfQTAsICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8yNDAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzI0MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMzIwMDBfQTEsCisgICAgIENTX01JRERMRV8zMjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8zMjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV80NDEwMF9BMCwgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLAorICAgICBDU19NSURETEVfNDQxMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDQxMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV80ODAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfX07CisKKy8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgc2lkZSBmaWx0ZXIgKi8KK2NvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXSA9IHsKKyAgICAvKiBIZWFkcGhvbmUgU2lkZSBjb2VmZmljaWVudHMgKi8KKyAgICB7Q1NfU0lERV84MDAwX0EwLCAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODAwMF9BMSwKKyAgICAgQ1NfU0lERV84MDAwX0EyLAorICAgICBDU19TSURFXzgwMDBfQjEsCisgICAgIENTX1NJREVfODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfODAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTEwMjVfQTAsICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xMTAyNV9BMSwKKyAgICAgQ1NfU0lERV8xMTAyNV9BMiwKKyAgICAgQ1NfU0lERV8xMTAyNV9CMSwKKyAgICAgQ1NfU0lERV8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTEwMjVfU0NBTEV9LAorICAgIHtDU19TSURFXzEyMDAwX0EwLCAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTIwMDBfQTEsCisgICAgIENTX1NJREVfMTIwMDBfQTIsCisgICAgIENTX1NJREVfMTIwMDBfQjEsCisgICAgIENTX1NJREVfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNjAwMF9BMCwgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzE2MDAwX0ExLAorICAgICBDU19TSURFXzE2MDAwX0EyLAorICAgICBDU19TSURFXzE2MDAwX0IxLAorICAgICBDU19TSURFXzE2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xNjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMjIwNTBfQTAsICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8yMjA1MF9BMSwKKyAgICAgQ1NfU0lERV8yMjA1MF9BMiwKKyAgICAgQ1NfU0lERV8yMjA1MF9CMSwKKyAgICAgQ1NfU0lERV8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMjIwNTBfU0NBTEV9LAorICAgIHtDU19TSURFXzI0MDAwX0EwLCAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMjQwMDBfQTEsCisgICAgIENTX1NJREVfMjQwMDBfQTIsCisgICAgIENTX1NJREVfMjQwMDBfQjEsCisgICAgIENTX1NJREVfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8zMjAwMF9BMCwgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzMyMDAwX0ExLAorICAgICBDU19TSURFXzMyMDAwX0EyLAorICAgICBDU19TSURFXzMyMDAwX0IxLAorICAgICBDU19TSURFXzMyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8zMjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfNDQxMDBfQTAsICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV80NDEwMF9BMSwKKyAgICAgQ1NfU0lERV80NDEwMF9BMiwKKyAgICAgQ1NfU0lERV80NDEwMF9CMSwKKyAgICAgQ1NfU0lERV80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDQxMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzQ4MDAwX0EwLCAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfNDgwMDBfQTEsCisgICAgIENTX1NJREVfNDgwMDBfQTIsCisgICAgIENTX1NJREVfNDgwMDBfQjEsCisgICAgIENTX1NJREVfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFcXVhbGlzZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVtdID0geworICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfODAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLAorICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE2MDAwX0EwLCAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLAorICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzMyMDAwX0EwLCAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLAorICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKworICAgIC8qIENvbmNlcnQgU291bmQgRVggSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCwgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCwgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCwgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCwgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBkZWxheSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gZGVsYXkgdGFibGUgZm9yIENvbmNlcnQgU291bmQgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZDU19TdGVyZW9EZWxheUNTW10gPSB7CisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWn07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBjb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfUmV2ZXJiQ29lZlRhYmxlW10gPSB7CisgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgIHtDU19SRVZFUkJfODAwMF9BMCwgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84MDAwX0ExLAorICAgICBDU19SRVZFUkJfODAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzgwMDBfQjEsCisgICAgIENTX1JFVkVSQl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzgwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTEwMjVfQTAsICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTEwMjVfQTEsCisgICAgIENTX1JFVkVSQl8xMTAyNV9BMiwKKyAgICAgQ1NfUkVWRVJCXzExMDI1X0IxLAorICAgICBDU19SRVZFUkJfMTEwMjVfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTEwMjVfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTIwMDBfQTAsICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xMjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzEyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTIwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTYwMDBfQTAsICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTYwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xNjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzE2MDAwX0IxLAorICAgICBDU19SRVZFUkJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMjIwNTBfQTAsICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMjIwNTBfQTEsCisgICAgIENTX1JFVkVSQl8yMjA1MF9BMiwKKyAgICAgQ1NfUkVWRVJCXzIyMDUwX0IxLAorICAgICBDU19SRVZFUkJfMjIwNTBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjIwNTBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMjQwMDBfQTAsICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMjQwMDBfQTEsCisgICAgIENTX1JFVkVSQl8yNDAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzI0MDAwX0IxLAorICAgICBDU19SRVZFUkJfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjQwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMzIwMDBfQTAsICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMzIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8zMjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzMyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMzIwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfNDQxMDBfQTAsICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfNDQxMDBfQTEsCisgICAgIENTX1JFVkVSQl80NDEwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzQ0MTAwX0IxLAorICAgICBDU19SRVZFUkJfNDQxMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDQxMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfNDgwMDBfQTAsICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfNDgwMDBfQTEsCisgICAgIENTX1JFVkVSQl80ODAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IxLAorICAgICBDU19SRVZFUkJfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDgwMDBfU0NBTEV9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEJ5cGFzcyBtaXhlciBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXSA9IHsKKyAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCisgICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAorICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCisgICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19IRUFEUEhPTkVfR0FJTn0sCisgICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lIGNvcnJlY3Rpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb2VmZmljaWVudCBvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDb21wcmVzc2lvbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAxMDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW4gMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgQ29tcHJlc3Npb24gZ2FpbiBpcyByZXByZXNlbnRlZCBieSBhIFExLjE1IG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgMGRCICAgICovCisvKiAgdG8gKzZkQiwgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAwZEIgY29tcHJlc3Npb24gKG5vIGVmZmVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDU0NjEgICAgaXMgMWRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAxMDkyMyAgIGlzIDJkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMzI3NjcgICBpcyA2ZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEdhaW4gaXMgcmVwcmVzZW50ZWQgYXMgYSBRMy4xMyBudW1iZXIgdG8gZ2l2ZSBhIHJhbmdlIG9mICs4IHRvIC1pbmZpbml0eSAgICAqLworLyogIEUuZy46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDAgICAgICAgaXMgLWluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzICsxOGRCICh4OCkgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNDA5NiAgICBpcyAwZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwMjQgICAgaXMgLTEyZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW10gPSB7CisgICAgezE0MjAwLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAsCisgICAgIDQwOTYsCisgICAgIDU3ODZ9LAorICAgIHsxNDIwMCwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLAorICAgICA0MDk2LAorICAgICA1Nzg2fSwKKyAgICB7MzI3NjcsICAgICAgICAgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMCwKKyAgICAgNDA5NiwKKyAgICAgNTc4Nn0sCisgICAgezMyNzY3LCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAsCisgICAgIDQwOTYsCisgICAgIDU3ODZ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNaXhlciB0aW1lIGNvbnN0YW50cywgMTAwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCisKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbOV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YzRjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ1NfVEFCTEVTX0hfXworI2RlZmluZSBfX0xWQ1NfVEFCTEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgbWlkZGxlIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMUIxQ29lZnNTUF90IExWQ1NfU0VNaWRDb2VmVGFibGVbXTsKKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRXF1YWxpc2VyIGNvZWZmaWNpZW50IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBkZWxheSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gZGVsYXkgdGFibGUgZm9yIENvbmNlcnQgU291bmQgKi8KK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2IExWQ1NfU3RlcmVvRGVsYXlDU1tdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXZlcmIgY29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19SZXZlcmJDb2VmVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQnlwYXNzIG1peGVyIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lIGNvcnJlY3Rpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb2VmZmljaWVudCBvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDb21wcmVzc2lvbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAxMDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW4gMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgQ29tcHJlc3Npb24gZ2FpbiBpcyByZXByZXNlbnRlZCBieSBhIFExLjE1IG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgMGRCICAgICovCisvKiAgdG8gKzZkQiwgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAwZEIgY29tcHJlc3Npb24gKG5vIGVmZmVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDU0NjEgICAgaXMgMWRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAxMDkyMyAgIGlzIDJkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMzI3NjcgICBpcyA2ZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEdhaW4gaXMgcmVwcmVzZW50ZWQgYXMgYSBRMy4xMyBudW1iZXIgdG8gZ2l2ZSBhIHJhbmdlIG9mICs4IHRvIC1pbmZpbml0eSAgICAqLworLyogIEUuZy46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDAgICAgICAgaXMgLWluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzICsxOGRCICh4OCkgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNDA5NiAgICBpcyAwZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwMjQgICAgaXMgLTEyZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVtdOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gTFZNX0lOVDMyICAgICAgICAgICAgICAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlW107CisKKworLypTcGVha2VyIGNvZWZmaWVudCB0YWJsZXMqLworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1NFTWlkZGxlR2FpblRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfUmV2ZXJiQ29lZlRhYmxlW10gOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKK2V4dGVybiBHYWluX3QgICAgICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19TbWFsbF9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9SZXZlcmJHYWluVGFibGVbXTsKKworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX1JldmVyYkNvZWZUYWJsZVtdIDsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19NZWRpdW1fVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1JldmVyYkdhaW5UYWJsZVtdOworCitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU0VNaWRkbGVHYWluVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9SZXZlcmJDb2VmVGFibGVbXSA7CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX0xhcmdlX1ZvbENvcnJlY3RUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX1JldmVyYkdhaW5UYWJsZVtdOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZDU19UQUJMRVNfSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTliOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIG11c2ljIGJ1bmRsZSB3cmFwcGVyCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCUJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisKK0xPQ0FMX01PRFVMRTo9IGxpYmJ1bmRsZXdyYXBwZXIKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJtdXNpY2J1bmRsZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgbGliY3V0aWxzIFwKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChMT0NBTF9QQVRIKS9CdW5kbGUgXAorCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKKwkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLworCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyByZXZlcmIgd3JhcHBlcgoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKworTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJid3JhcHBlcgorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnJldmVyYgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgbGliY3V0aWxzIFwKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2xpYi9Db21tb24vbGliLyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9saWIvUmV2ZXJiL2xpYi8gXAorCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUzMzAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMCwwICsxLDMxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVuZGxlIgorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxFZmZlY3RCdW5kbGUuaD4KKworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CitleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZTsKKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyl7XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWTV9OVUxMQUREUkVTUyl7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWTV9BTElHTk1FTlRFUlJPUil7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fT1VUT0ZSQU5HRSl7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgIH0KKworLy8gTmFtZXNwYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHsKKworLyogbG9jYWwgZnVuY3Rpb25zICovCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiI2NvbmQpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBGbGFnIHRvIGFsbG93IGEgb25lIHRpbWUgaW5pdCBvZiBnbG9iYWwgbWVtb3J5LCBvbmx5IGhhcHBlbnMgb24gZmlyc3QgY2FsbCBldmVyCitpbnQgTHZtSW5pdEZsYWcgPSBMVk1fRkFMU0U7CitTZXNzaW9uQ29udGV4dCBHbG9iYWxTZXNzaW9uTWVtb3J5W0xWTV9NQVhfU0VTU0lPTlNdOworCitpbnQgU2Vzc2lvbkluZGV4W0xWTV9NQVhfU0VTU0lPTlNdOworCisvLyBOWFAgU1cgQmFzc0Jvb3N0IFVVSUQKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0Jhc3NCb29zdERlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDA2MzRmMjIwLCAweGRkZDQsIDB4MTFkYiwgMHhhMGZjLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfX0sCisgICAgICAgIHsweDg2MzFmMzAwLCAweDcyZTIsIDB4MTFkZiwgMHhiNTdlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECisgICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLAorICAgICAgICAiRHluYW1pYyBCYXNzIEJvb3N0IiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vIE5YUCBTVyBWaXJ0dWFsaXplciBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXJ0dWFsaXplckRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDM3Y2MyYzAwLCAweGRkZGQsIDB4MTFkYiwgMHg4NTc3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQKKyAgICAgICAgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCisgICAgICAgIFZJUlRVQUxJWkVSX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLAorICAgICAgICAiVmlydHVhbGl6ZXIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIEVxdWFsaXplciBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0geworICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQorICAgICAgICB7MHhjZTc3MmYyMCwgMHg4NDdkLCAweDExZGYsIDB4YmIxNywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZCBFcSBOWFAKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLAorICAgICAgICAiRXF1YWxpemVyIiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vIE5YUCBTVyBWb2x1bWUgVVVJRAorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVm9sdW1lRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKKyAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwgLy91dWlkIFZPTCBOWFAKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgVk9MVU1FX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLAorICAgICAgICAiVm9sdW1lIiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK3ZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQgICAgICAodm9pZCk7CitpbnQgIEx2bUJ1bmRsZV9pbml0ICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKK2ludCAgTHZtRWZmZWN0X2VuYWJsZSAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOworaW50ICBMdm1FZmZlY3RfZGlzYWJsZSAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Cit2b2lkIEx2bUVmZmVjdF9mcmVlICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKK2ludCAgRWZmZWN0X2NvbmZpZ3VyZSAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7CitpbnQgIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBWYWx1ZSk7CitpbnQgIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBWYWx1ZSk7CitpbnQgIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7CitpbnQgIFZvbHVtZV9zZXRQYXJhbWV0ZXIgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIFZvbHVtZV9nZXRQYXJhbWV0ZXIgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7CitpbnQgRWZmZWN0X3NldEVuYWJsZWQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGJvb2wgZW5hYmxlZCk7CisKKy8qIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAqLworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyl7CisgICAgTE9HVigiXG5cdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBzdGFydCIpOworICAgICpwTnVtRWZmZWN0cyA9IDQ7CisgICAgTE9HVigiXHRFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgY3JlYXRpbmcgJWQgZWZmZWN0cyIsICpwTnVtRWZmZWN0cyk7CisgICAgTE9HVigiXHRFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgIC8qIGVuZCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgKi8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlFZmZlY3Qgc3RhcnQiKTsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgaW5kZXggJWQiLCBpbmRleCk7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UXVlcnlFZmZlY3Qgd2FzIHBhc3NlZCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChpbmRleCA+IDMpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFF1ZXJ5RWZmZWN0IGluZGV4IG91dCBvZiByYW5nZSAlZCIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIGlmKGluZGV4ID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIExWTV9CQVNTX0JPT1NUIik7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLCAgIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfWVsc2UgaWYoaW5kZXggPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnVmlydHVhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH0gZWxzZSBpZihpbmRleCA9PSBMVk1fRVFVQUxJWkVSKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIExWTV9FUVVBTElaRVIiKTsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ0VxdWFsaXplckRlc2NyaXB0b3IsICAgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9IGVsc2UgaWYoaW5kZXggPT0gTFZNX1ZPTFVNRSl7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBMVk1fVk9MVU1FIik7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdWb2x1bWVEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH0KKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IGVuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgICAvKiBlbmQgRWZmZWN0UXVlcnlFZmZlY3QgKi8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgKnBJbnRlcmZhY2UpeworICAgIGludCByZXQgPSAwOworICAgIGludCBzZXNzaW9uTm87CisgICAgaW50IGk7CisgICAgRWZmZWN0Q29udGV4dCAqcENvbnRleHQgPSBOVUxMOworICAgIGJvb2wgbmV3QnVuZGxlID0gZmFsc2U7CisgICAgU2Vzc2lvbkNvbnRleHQgKnBTZXNzaW9uQ29udGV4dDsKKworICAgIExPR1YoIlxuXHRFZmZlY3RDcmVhdGUgc3RhcnQgc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CisKKyAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZihMdm1Jbml0RmxhZyA9PSBMVk1fRkFMU0UpeworICAgICAgICBMdm1Jbml0RmxhZyA9IExWTV9UUlVFOworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEluaXRpYWxpemluZyBhbGwgZ2xvYmFsIG1lbW9yeSIpOworICAgICAgICBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpOworICAgIH0KKworICAgIC8vIEZpbmQgbmV4dCBhdmFpbGFibGUgc2Vzc2lvbk5vCisgICAgZm9yKGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspeworICAgICAgICBpZigoU2Vzc2lvbkluZGV4W2ldID09IExWTV9VTlVTRURfU0VTU0lPTil8fChTZXNzaW9uSW5kZXhbaV0gPT0gc2Vzc2lvbklkKSl7CisgICAgICAgICAgICBzZXNzaW9uTm8gICAgICAgPSBpOworICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gc2Vzc2lvbklkOworICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGU6IEFsbG9jYXRpbmcgU2Vzc2lvbk5vICVkIGZvciBTZXNzaW9uSWQgJWRcbiIsIHNlc3Npb25ObyxzZXNzaW9uSWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihpPT1MVk1fTUFYX1NFU1NJT05TKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBDYW5ub3QgZmluZCBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIGN1cnJlbnQgc2Vzc2lvbiIpOworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcENvbnRleHQgPSBuZXcgRWZmZWN0Q29udGV4dDsKKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNyZWF0ZSBpbiB0aGlzIHNlc3Npb24KKyAgICBpZihHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9PSBMVk1fRkFMU0UpeworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFRoaXMgaXMgdGhlIGZpcnN0IGVmZmVjdCBpbiBjdXJyZW50IHNlc3Npb25JZCAlZCBzZXNzaW9uTm8gJWQiLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvbk5vKTsKKworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9IExWTV9UUlVFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0ICAgICAgICA9IG5ldyBCdW5kbGVkRWZmZWN0Q29udGV4dDsKKyAgICAgICAgbmV3QnVuZGxlID0gdHJ1ZTsKKworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLnBCdW5kbGVkQ29udGV4dDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vICAgICAgICAgICAgICAgID0gc2Vzc2lvbk5vOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQgICAgICAgICAgICAgICAgPSBzZXNzaW9uSWQ7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOworCisgICAgICAgICNpZmRlZiBMVk1fUENNCisgICAgICAgIGNoYXIgZmlsZU5hbWVbMjU2XTsKKyAgICAgICAgc25wcmludGYoZmlsZU5hbWUsIDI1NiwgIi9kYXRhL3RtcC9idW5kbGVfJXBfcGNtX2luLnBjbSIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVigiY2Fubm90IG9wZW4gJXMiLCBmaWxlTmFtZSk7CisgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgc25wcmludGYoZmlsZU5hbWUsIDI1NiwgIi9kYXRhL3RtcC9idW5kbGVfJXBfcGNtX291dC5wY20iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyID0gZm9wZW4oZmlsZU5hbWUsICJ3Iik7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVigiY2Fubm90IG9wZW4gJXMiLCBmaWxlTmFtZSk7CisgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciA9IE5VTEw7CisgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUgc2V0IHRvIHRoZSBnZXQKKyAgICAgICAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsIGF2b2lkCisgICAgICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgICAgICAgKi8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ICAgICAgICAgICAgICAgID0gUFJFU0VUX0NVU1RPTTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgICAgICAgICAgICA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgICAgICAgICAgICAgICA9IC0xOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOworCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOworICAgICAgICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCk7CisKKyAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEFzc2lnbmluZyBtZW1vcnkgZm9yIHByZXZpb3VzbHkgY3JlYXRlZCBlZmZlY3Qgb24gc2Vzc2lvbk5vICVkIiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uTm8pOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0KKyAgICAgICAgICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0OworICAgIH0KKyAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIHBCdW5kbGVkQ29udGV4dCBpcyAlcCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOworCisgICAgcFNlc3Npb25Db250ZXh0ID0gJkdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXTsKKworICAgIC8vIENyZWF0ZSBlYWNoIEVmZmVjdAorICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgICAgIC8vIENyZWF0ZSBCYXNzIEJvb3N0CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9UUlVFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fQkFTU19CT09TVDsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgICAgICAvLyBDcmVhdGUgVmlydHVhbGl6ZXIKKyAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ9TFZNX1RSVUU7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworCisgICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX1ZJUlRVQUxJWkVSOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnRXF1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgICAgICAvLyBDcmVhdGUgRXF1YWxpemVyCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX0VRVUFMSVpFUiIpOworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworCisgICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0VRVUFMSVpFUjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZvbHVtZURlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICAgICAgLy8gQ3JlYXRlIFZvbHVtZQorICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9WT0xVTUUiKTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CisKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVk9MVU1FOworICAgIH0KKyAgICBlbHNleworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGludmFsaWQgVVVJRCIpOworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCitleGl0OgorICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBpZiAocENvbnRleHQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG5ld0J1bmRsZSkgeworICAgICAgICAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgIFNlc3Npb25JbmRleFtzZXNzaW9uTm9dID0gTFZNX1VOVVNFRF9TRVNTSU9OOworICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OworICAgICAgICB9CisgICAgICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICB9CisgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kLi5cblxuIik7CisgICAgcmV0dXJuIHJldDsKK30gLyogZW5kIEVmZmVjdENyZWF0ZSAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpeworICAgIExPR1YoIlxuXHRFZmZlY3RSZWxlYXNlIHN0YXJ0ICVwIiwgaW50ZXJmYWNlKTsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKWludGVyZmFjZTsKKworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBzdGFydCBpbnRlcmZhY2U6ICVwLCBjb250ZXh0ICVwIiwgaW50ZXJmYWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbnRleHQgKnBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CisKKyAgICAvLyBDbGVhciB0aGUgaW5zdGFudGlhdGVkIGZsYWcgZm9yIHRoZSBlZmZlY3QKKyAgICAvLyBwcm90ZWN0IGFnYWlucyB0aGUgY2FzZSB3aGVyZSBhbiBlZmZlY3QgaXMgdW4taW5zdGFudGlhdGVkIHdpdGhvdXQgYmVpbmcgZGlzYWJsZWQKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX0JBU1NfQk9PU1QgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJCYXNzSW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApeworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX1ZJUlRVQUxJWkVSIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9FUVVBTElaRVIgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPUxWTV9GQUxTRTsKKyAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fVk9MVU1FIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSA6IFVuc3VwcG9ydGVkIGVmZmVjdFxuXG5cblxuXG5cblxuIik7CisgICAgfQorCisgICAgLy8gRGlzYWJsZSBlZmZlY3QsIGluIHRoaXMgY2FzZSBpZ25vcmUgZXJyb3JzIChyZXR1cm4gY29kZXMpCisgICAgLy8gaWYgYW4gZWZmZWN0IGhhcyBhbHJlYWR5IGJlZW4gZGlzYWJsZWQKKyAgICBFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX0ZBTFNFKTsKKworICAgIC8vIGlmIGFsbCBlZmZlY3RzIGFyZSBubyBsb25nZXIgaW5zdGFudGlhZWQgZnJlZSB0aGUgbHZtIG1lbW9yeSBhbmQgZGVsZXRlIEJ1bmRsZWRFZmZlY3RDb250ZXh0CisgICAgaWYgKChwU2Vzc2lvbkNvbnRleHQtPmJCYXNzSW5zdGFudGlhdGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWb2x1bWVJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKKyAgICB7CisgICAgICAgICNpZmRlZiBMVk1fUENNCisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIFNlc3Npb25JbmRleAorICAgICAgICBmb3IoaW50IGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspeworICAgICAgICAgICAgaWYoU2Vzc2lvbkluZGV4W2ldID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCl7CisgICAgICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gTFZNX1VOVVNFRF9TRVNTSU9OOworICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZTogQ2xlYXJpbmcgU2Vzc2lvbkluZGV4IFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZTogQWxsIGVmZmVjdHMgYXJlIG5vIGxvbmdlciBpbnN0YW50aWF0ZWRcbiIpOworICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZTogRnJlZWluZyBMVk0gQnVuZGxlIG1lbW9yeVxuIik7CisgICAgICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBEZWxldGluZyBMVk0gQnVuZGxlIGNvbnRleHQgJXBcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CisgICAgfQorICAgIC8vIGZyZWUgdGhlIGVmZmVjdCBjb250ZXh0IGZvciBjdXJyZW50IGVmZmVjdAorICAgIGRlbGV0ZSBwQ29udGV4dDsKKworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBlbmRcbiIpOworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBFZmZlY3RSZWxlYXNlICovCisKK3ZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQoKXsKKyAgICBMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7CisgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkICAgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZvbHVtZUluc3RhbnRpYXRlZCAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgICA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLnBCdW5kbGVkQ29udGV4dCAgICAgICAgICA9IExWTV9OVUxMOworCisgICAgICAgIFNlc3Npb25JbmRleFtpXSA9IExWTV9VTlVTRURfU0VTU0lPTjsKKyAgICB9CisgICAgcmV0dXJuOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIGludCBzdGF0dXM7CisKKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CisKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CisKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpeworICAgICAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKworICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisKKyAgICAgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICB9CisKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgICAgICAgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisKKyAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICAgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSAgICAgICA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSAgICAgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyAgICA9IE1BWF9OVU1fQkFORFM7CisgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgICAgID0gTFZNX1BTQV9PTjsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0IikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CisgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOworCisgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMgdGhhdCB3ZXJlCisgICAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgorICAgICAqLworICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgICAgLyogSW5pdGlhbGlzZSAqLworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOworCisgICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgICAgICAgICAgPSBMVk1fTU9ERV9PTjsKKyAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgICAgICA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgICAgICAgICA9IExWTV9TVEVSRU87CisgICAgcGFyYW1zLlNwZWFrZXJUeXBlICAgICAgICAgICAgPSBMVk1fSEVBRFBIT05FUzsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisKKyAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7CisgICAgcGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICBwYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCAgICAgPSAxMDA7CisgICAgcGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gTFZNX0NTX0VGRkVDVF9OT05FOworCisgICAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgICAgPSBMVk1fRVFOQl9PRkY7CisgICAgcGFyYW1zLkVRTkJfTkJhbmRzICAgICAgICAgICAgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgICBwYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gICA9ICZCYW5kRGVmc1swXTsKKworICAgIGZvciAoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUzsgaSsrKQorICAgIHsKKyAgICAgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uR2FpbiAgICAgID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICAgIH0KKworICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuVkNfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7CisgICAgcGFyYW1zLlZDX0JhbGFuY2UgICAgICAgICAgICAgPSAwOworCisgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOworCisgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgICAgID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlICAgICAgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7CisKKyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9CRV9PRkY7CisgICAgcGFyYW1zLkJFX0VmZmVjdExldmVsICAgICAgICAgPSAwOworICAgIHBhcmFtcy5CRV9DZW50cmVGcmVxICAgICAgICAgID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIHBhcmFtcy5CRV9IUEYgICAgICAgICAgICAgICAgID0gTFZNX0JFX0hQRl9PTjsKKworICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuUFNBX0VuYWJsZSAgICAgICAgICAgICA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgICAgID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisKKyAgICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgLyogU2V0IHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOworICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoICAgICAgICAgPSA0OTk5OworICAgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgICAgPSAzOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoICAgICAgICAgPSAyNDAwMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ICAgID0gNDsKKyAgICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uICAgID0gJkhlYWRyb29tQmFuZERlZlswXTsKKyAgICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzICAgICAgICAgPSAyOworCisgICAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOworICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCisKKworc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCit7CisgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKKyAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTHZtQnVuZGxlX3Byb2Nlc3MoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgTFZNIEJ1bmRsZSBlZmZlY3RzCisvLworLy8gSW5wdXRzOgorLy8gIHBJbjogICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvIDE2IGJpdCBpbnB1dCBkYXRhCisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCisvLyAgZnJhbWVDb3VudDogRnJhbWVzIHRvIHByb2Nlc3MKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCisvLworLy8gIE91dHB1dHM6CisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RDb250ZXh0ICAgICpwQ29udGV4dCl7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dFRtcDsKKworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFKXsKKyAgICAgICAgcE91dFRtcCA9IHBPdXQ7CisgICAgfWVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICE9IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKiltYWxsb2MoZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMTYpICogMik7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBwT3V0VG1wID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcjsKKyAgICB9ZWxzZXsKKyAgICAgICAgTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgaW52YWxpZCBhY2Nlc3MgbW9kZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgI2VuZGlmCisKKyAgICAvL0xPR1YoIkNhbGxpbmcgTFZNX1Byb2Nlc3MiKTsKKworICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFRtcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAjZW5kaWYKKworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJhbWVDb3VudCoyOyBpKyspeworICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilwT3V0W2ldICsgKExWTV9JTlQzMilwT3V0VG1wW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTHZtRWZmZWN0X2VuYWJsZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEVuYWJsZSB0aGUgZWZmZWN0IGluIHRoZSBidW5kbGUKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEx2bUVmZmVjdF9lbmFibGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIC8vTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIHN0YXJ0Iik7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZW5hYmxlIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIC8vTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT047CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT047CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0VRVUFMSVpFUiIpOworICAgICAgICBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgICA9IExWTV9FUU5CX09OOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSA6IEVuYWJsaW5nIExWTV9WT0xVTUUiKTsKKyAgICB9CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9lbmFibGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZGlzYWJsZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IERpc2FibGUgdGhlIGVmZmVjdCBpbiB0aGUgYnVuZGxlCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIHN0YXJ0Iik7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2Rpc2FibGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy9MT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fQkFTU19CT09TVCIpOworICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9CRV9PRkY7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIDogRGlzYWJsaW5nIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT0ZGOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBEaXNhYmxpbmcgTFZNX1ZPTFVNRSIpOworICAgIH0KKworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2Rpc2FibGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIGVuZCIpOworICAgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOworCisgICAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtRWZmZWN0X2ZyZWUiKQorCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAgICAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZmZlY3RfY29uZmlndXJlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRWZmZWN0X2NvbmZpZ3VyZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKKyAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOworICAgIC8vTE9HVigiXHRFZmZlY3RfY29uZmlndXJlIHN0YXJ0Iik7CisKKyAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWcgIT0gTlVMTCk7CisKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworCisgICAgbWVtY3B5KCZwQ29udGV4dC0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisKKyAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIlx0RWZmZWN0X0NvbmZpZ3VyZSBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUpeworCisgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKKyAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CisKKyAgICAgICAgTE9HVigiXHRFZmZlY3RfY29uZmlndXJlIGNoYW5nZSBzYW1wbGluZyByYXRlIHRvICVkIiwgU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X2NvbmZpZ3VyZSIpCisgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3RfY29uZmlndXJlIikKKyAgICAgICAgTE9HVigiXHRFZmZlY3RfY29uZmlndXJlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKKworICAgIH1lbHNleworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbmZpZ3VyZSBrZWVwIHNhbXBsaW5nIHJhdGUgYXQgJWQiLCBTYW1wbGVSYXRlKTsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbmZpZ3VyZSBFbmQuLi4uIik7CisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIEVmZmVjdF9jb25maWd1cmUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNzR2V0U3RyZW5ndGgoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gZ2V0IHRoZSBlZmZlY3Qgc3RyZW5ndGggY3VycmVudGx5IGJlaW5nIHVzZWQsIHdoYXQgaXMgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHN0cmVuZ2ggdGhhdCB3YXMKKy8vIHByZXZpb3VzbHkgdXNlZCBpbiB0aGUgc2V0LCB0aGlzIGlzIGJlY2F1c2UgdGhlIGFwcCB1c2VzIGEgc3RyZW5ndGggaW4gdGhlIHJhbmdlIDAtMTAwMCB3aGlsZQorLy8gdGhlIGJhc3Nib29zdCB1c2VzIDEtMTUsIHNvIHRvIGF2b2lkIGEgcXVhbnRpc2F0aW9uIHRoZSBvcmlnaW5hbCBzZXQgdmFsdWUgaXMgdXNlZC4gSG93ZXZlciB0aGUKKy8vIGFjdHVhbCB1c2VkIHZhbHVlIGlzIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VpbnQzMl90IEJhc3NHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTEwMDApIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc0dldFN0cmVuZ3RoIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBzdHJlbmd0aCByZXR1cm5lZCBtYXRjaGVzIHRoZSBzdHJlbmd0aCB0aGF0IHdhcyBzZXQgZWFybGllciAqLworICAgIGlmKEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAhPQorICAgICAgIChMVk1fSU5UMTYpKCgxNSpwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkvMTAwMCkpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NHZXRTdHJlbmd0aCBtb2R1bGUgc3RyZW5ndGggZG9lcyBub3QgbWF0Y2ggc2F2ZWRTdHJlbmd0aCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKKyAgICAvL0xPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKHNhdmVkKSAgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkICk7CisgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkOworfSAgICAvKiBlbmQgQmFzc0dldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmFzc1NldFN0cmVuZ3RoKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBzdHJlbmd0aCB0byB0aGUgQmFzc0Jvc3N0LiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCBmcm9tIHRoZSByYW5nZSAwLTEwMDAgdG8gMS0xNQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQmFzc1NldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7CisgICAgLy9MT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7CisKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IChpbnQpc3RyZW5ndGg7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKKyAgICAvL0xPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgICA9IChMVk1fSU5UMTYpKCgxNSpzdHJlbmd0aCkvMTAwMCk7CisgICAgQWN0aXZlUGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgID0gTFZNX0JFX0NFTlRSRV85MEh6OworCisgICAgLy9MT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkJhc3NTZXRTdHJlbmd0aCIpCisgICAgLy9MT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKK30gICAgLyogZW5kIEJhc3NTZXRTdHJlbmd0aCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVyR2V0U3RyZW5ndGgoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gZ2V0IHRoZSBlZmZlY3Qgc3RyZW5ndGggY3VycmVudGx5IGJlaW5nIHVzZWQsIHdoYXQgaXMgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHN0cmVuZ2ggdGhhdCB3YXMKKy8vIHByZXZpb3VzbHkgdXNlZCBpbiB0aGUgc2V0LCB0aGlzIGlzIGJlY2F1c2UgdGhlIGFwcCB1c2VzIGEgc3RyZW5ndGggaW4gdGhlIHJhbmdlIDAtMTAwMCB3aGlsZQorLy8gdGhlIFZpcnR1YWxpemVyIHVzZXMgMS0xMDAsIHNvIHRvIGF2b2lkIGEgcXVhbnRpc2F0aW9uIHRoZSBvcmlnaW5hbCBzZXQgdmFsdWUgaXMgdXNlZC5Ib3dldmVyIHRoZQorLy8gYWN0dWFsIHVzZWQgdmFsdWUgaXMgY2hlY2tlZCB0byBtYWtlIHN1cmUgaXQgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSBiZWluZyByZXR1cm5lZAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggKDAtMTAwMCkgLT4gJWRcbiIscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQpOworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVmlydHVhbGl6ZXJHZXRTdHJlbmd0aCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpICgwLTEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwqMTApOworICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZDsKK30gICAgLyogZW5kIGdldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgc3RyZW5ndGggdG8gdGhlIFZpcnR1YWxpemVyLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCBmcm9tIHRoZSByYW5nZSAwLTEwMDAgdG8gMS0xNQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVmlydHVhbGl6ZXJTZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3Qgc3RyZW5ndGgpeworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IChpbnQpc3RyZW5ndGg7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWaXJ0dWFsaXplclNldFN0cmVuZ3RoIikKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBWaXJ0dWFsaXplciBwYXJhbWV0ZXJzICovCisgICAgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsICAgICAgICAgICAgID0gKGludCkoKHN0cmVuZ3RoKjMyNzY3KS8xMDAwKTsKKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtMTAwMCkgICAtPiAlZFxuIiwgc3RyZW5ndGggKTsKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCgpICgwLSAxMDApICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5DU19FZmZlY3RMZXZlbCApOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyU2V0U3RyZW5ndGgiKQorICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7Cit9ICAgIC8qIGVuZCBzZXRTdHJlbmd0aCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldEJhbmRMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IFJldHJpZXZlIHRoZSBnYWluIGN1cnJlbnRseSBiZWluZyB1c2VkIGZvciB0aGUgYmFuZCBwYXNzZWQgaW4KKy8vCisvLyBJbnB1dHM6CisvLyAgYmFuZDogICAgICAgYmFuZCBudW1iZXIKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCl7CisKKyAgICBpbnQzMl90IEdhaW4gPTA7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKkJhbmREZWY7CisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplckdldEJhbmRMZXZlbCIpCisKKyAgICBCYW5kRGVmID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgIEdhaW4gICAgPSAoaW50MzJfdClCYW5kRGVmW2JhbmRdLkdhaW4qMTAwOyAgICAvLyBDb252ZXJ0IHRvIG1pbGxpYmVscworCisgICAgLy9MT0dWKCJcdEVxdWFsaXplckdldEJhbmRMZXZlbCAtPiAlZFxuIiwgR2FpbiApOworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIHJldHVybiBHYWluOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplclNldEJhbmRMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyAgU2V0cyBnYWluIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYmFuZC4KKy8vCisvLyBJbnB1dHM6CisvLyAgYmFuZDogICAgICAgYmFuZCBudW1iZXIKKy8vICBHYWluOiAgICAgICBHYWluIHRvIGJlIGFwcGxpZWQgaW4gbWlsbGliZWxzCisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludCBiYW5kLCBzaG9ydCBHYWluKXsKKyAgICBpbnQgZ2FpblJvdW5kZWQ7CisgICAgaWYoR2FpbiA+IDApeworICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluKzUwKS8xMDApOworICAgIH1lbHNleworICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluLTUwKS8xMDApOworICAgIH0KKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyU2V0QmFuZExldmVsKCVkKS0+KCVkKSIsIEdhaW4sIGdhaW5Sb3VuZGVkKTsKKworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpCYW5kRGVmOworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwiKQorICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOworCisgICAgLyogU2V0IGxvY2FsIEVRIHBhcmFtZXRlcnMgKi8KKyAgICBCYW5kRGVmID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluID0gZ2FpblJvdW5kZWQ7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRXF1YWxpemVyU2V0QmFuZExldmVsIikKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyU2V0QmFuZExldmVsIGp1c3QgU2V0IC0+ICVkXG4iLEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgICAgcmV0dXJuOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3koKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBSZXRyaWV2ZSB0aGUgZnJlcXVlbmN5IGJlaW5nIHVzZWQgZm9yIHRoZSBiYW5kIHBhc3NlZCBpbgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kKXsKKyAgICBpbnQzMl90IEZyZXF1ZW5jeSA9MDsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpCYW5kRGVmOworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kiKQorCisgICAgQmFuZERlZiAgID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgIEZyZXF1ZW5jeSA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uRnJlcXVlbmN5KjEwMDA7ICAgICAvLyBDb252ZXJ0IHRvIG1pbGxpYmVscworCisgICAgLy9MT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSAtPiAlZFxuIiwgRnJlcXVlbmN5ICk7CisgICAgLy9MT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgcmV0dXJuIEZyZXF1ZW5jeTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIEdldHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgb2YgYSBiYW5kLgorLy8gRm9yIHRoZSBoaWdoIHNoZWxmLCB0aGUgbG93IGJvdW5kIGlzIHRoZSBiYW5kIGZyZXF1ZW5jeSBhbmQgdGhlIGhpZ2gKKy8vIGJvdW5kIGlzIE55cXVpc3QuCisvLyBGb3IgdGhlIHBlYWtpbmcgZmlsdGVycywgdGhleSBhcmUgdGhlIGdhaW5bZEJdLzIgcG9pbnRzLgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQorLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGJhbmQsIHVpbnQzMl90ICpwTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwSGkpeworICAgICpwTG93ID0gYmFuZEZyZXFSYW5nZVtiYW5kXVswXTsKKyAgICAqcEhpICA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMV07CisgICAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyR2V0QmFuZCgKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBSZXR1cm5zIHRoZSBiYW5kIHdpdGggdGhlIG1heGltdW0gaW5mbHVlbmNlIG9uIGEgZ2l2ZW4gZnJlcXVlbmN5LgorLy8gUmVzdWx0IGlzIHVuYWZmZWN0ZWQgYnkgd2hldGhlciBFUSBpcyBlbmFibGVkIG9yIG5vdCwgb3IgYnkgd2hldGhlcgorLy8gY2hhbmdlcyBoYXZlIGJlZW4gY29tbWl0dGVkIG9yIG5vdC4KKy8vCisvLyBJbnB1dHM6CisvLyAgdGFyZ2V0RnJlcSAgIFRoZSB0YXJnZXQgZnJlcXVlbmN5LCBpbiBtaWxsaWhlcnR6LgorLy8gIHBDb250ZXh0OiAgICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8gIHBMb3c6ICAgICAgIGxvd2VyIGJhbmQgcmFuZ2UKKy8vICBwTG93OiAgICAgICB1cHBlciBiYW5kIHJhbmdlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgdGFyZ2V0RnJlcSl7CisgICAgaW50IGJhbmQgPSAwOworCisgICAgaWYodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0peworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9ZWxzZSBpZih0YXJnZXRGcmVxID09IGJhbmRGcmVxUmFuZ2VbMF1bMF0peworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7aSsrKXsKKyAgICAgICAgaWYoKHRhcmdldEZyZXEgPiBiYW5kRnJlcVJhbmdlW2ldWzBdKSYmKHRhcmdldEZyZXEgPD0gYmFuZEZyZXFSYW5nZVtpXVsxXSkpeworICAgICAgICAgICAgYmFuZCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJhbmQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyR2V0UHJlc2V0KAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIEdldHMgdGhlIGN1cnJlbnRseSBzZXQgcHJlc2V0IElELgorLy8gV2lsbCByZXR1cm4gUFJFU0VUX0NVU1RPTSBpbiBjYXNlIHRoZSBFUSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBtb2RpZmllZAorLy8gbWFudWFsbHkgc2luY2UgYSBwcmVzZXQgd2FzIHNldC4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRQcmVzZXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIHJldHVybiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyU2V0UHJlc2V0KAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIFNldHMgdGhlIGN1cnJlbnQgcHJlc2V0IGJ5IElELgorLy8gQWxsIHRoZSBiYW5kIHBhcmFtZXRlcnMgd2lsbCBiZSBvdmVycmlkZGVuLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEVxdWFsaXplclNldFByZXNldChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50IHByZXNldCl7CisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0KCVkKSIsIHByZXNldCk7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gcHJlc2V0OworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJTZXRQcmVzZXQiKQorICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgLy9BY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisgICAgZm9yIChpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTOyBpKyspCisgICAgeworICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgICA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5HYWluCisgICAgICAgID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2kgKyBwcmVzZXQgKiBGSVZFQkFORF9OVU1CQU5EU107CisgICAgfQorICAgIC8qIEFjdGl2YXRlIHRoZSBuZXcgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclNldFByZXNldCIpCisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0IFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIHJldHVybjsKK30KKworaW50MzJfdCBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCl7CisgICAgcmV0dXJuIHNpemVvZihnRXF1YWxpemVyUHJlc2V0cykgLyBzaXplb2YoUHJlc2V0Q29uZmlnKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0cyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIGEgcHJlc2V0IElELiBXaWxsIHJldHVybiAiQ3VzdG9tIiBpZgorLy8gUFJFU0VUX0NVU1RPTSBpcyBwYXNzZWQuCisvLworLy8gSW5wdXRzOgorLy8gcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuIE11c3QgYmUgbGVzcyB0aGFuIG51bWJlciBvZiBwcmVzZXRzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY29uc3QgY2hhciAqIEVxdWFsaXplckdldFByZXNldE5hbWUoaW50MzJfdCBwcmVzZXQpeworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIHN0YXJ0KCVkKSIsIHByZXNldCk7CisgICAgaWYgKHByZXNldCA9PSBQUkVTRVRfQ1VTVE9NKSB7CisgICAgICAgIHJldHVybiAiQ3VzdG9tIjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZ0VxdWFsaXplclByZXNldHNbcHJlc2V0XS5uYW1lOworICAgIH0KKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyR2V0UHJlc2V0TmFtZSBlbmQoJWQpIiwgcHJlc2V0KTsKKyAgICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVTZXRWb2x1bWVMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGxldmVsICAgICAgIGxldmVsIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZvbHVtZVNldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBMZXZlbCB0byBiZSBzZXQgaXMgJWQgJWRcbiIsIGxldmVsLCAoTFZNX0lOVDE2KShsZXZlbC8xMDApKTsKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFZvbHVtZUxldmVsIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6ICVkXG4iLAorICAgIC8vQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsKTsKKworICAgIC8qIFZvbHVtZSBwYXJhbWV0ZXJzICovCisgICAgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICA9IChMVk1fSU5UMTYpKGxldmVsLzEwMCk7CisgICAgLy9MT0dWKCJcdFZvbHVtZVNldFZvbHVtZUxldmVsKCkgKC05NmRCIC0+IDBkQikgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFZvbHVtZUxldmVsIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdFZvbHVtZVNldFZvbHVtZUxldmVsIGp1c3Qgc2V0ICgtOTZkQiAtPiAwZEIpICAgLT4gJWRcbiIsQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgPT0gTFZNX1RSVUUpeworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRWb2x1bWVOb1Ntb290aGluZyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgICAgIExPR1YoIlx0TFZNX1ZPTFVNRTogRGlzYWJsaW5nIFNtb290aGluZyBmb3IgZmlyc3Qgdm9sdW1lIGNoYW5nZSB0byByZW1vdmUgc3Bpa2VzL2NsaWNrcyIpOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBzZXRWb2x1bWVMZXZlbCAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZUdldFZvbHVtZUxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVHZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCAqbGV2ZWwpeworCisgICAgLy9MT0dWKCJcdFZvbHVtZUdldFZvbHVtZUxldmVsIHN0YXJ0Iik7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lR2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0Vm9sdW1lTGV2ZWwoKSAoLTk2ZEIgLT4gMGRCKSAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisgICAgLy9MT0dWKCJcdFZvbHVtZUdldFZvbHVtZUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgICpsZXZlbCA9IEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCoxMDA7ICAgICAvLyBDb252ZXJ0IGRCIHRvIG1pbGxpYmVscworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRWb2x1bWVMZXZlbCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIFZvbHVtZUdldFZvbHVtZUxldmVsICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lU2V0TXV0ZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBWb2x1bWVTZXRNdXRlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBtdXRlKXsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBzdGFydCglZCkiLCBtdXRlKTsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IG11dGU7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldE11dGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFZvbHVtZVNldE11dGUgdG8gJWQsIGxldmVsIHdhcyAlZFxuIiwgbXV0ZSwgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICk7CisKKyAgICAvKiBTZXQgYXBwcm9wcmlhdGUgdm9sdW1lIGxldmVsICovCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbDsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICAgICAgICAgICA9IC05NjsKKyAgICB9ZWxzZXsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsICA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQ7CisgICAgfQorCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldE11dGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0TXV0ZSBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIHNldE11dGUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVHZXRNdXRlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3VycHV0czoKKy8vICBtdXRlOiAgICAgICBlbmFibGUvZGlzYWJsZSBmbGFnCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBWb2x1bWVHZXRNdXRlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCAqbXV0ZSl7CisgICAgLy9MT0dWKCJcdFZvbHVtZUdldE11dGUgc3RhcnQiKTsKKyAgICBpZigocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID09IExWTV9GQUxTRSl8fAorICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpKXsKKyAgICAgICAgKm11dGUgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH1lbHNleworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZUdldE11dGUgcmVhZCBhbiBpbnZhbGlkIHZhbHVlIGZyb20gY29udGV4dCAlZCIsCisgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBlbmQiKTsKK30gICAgLyogZW5kIGdldE11dGUgKi8KKworaW50MTZfdCBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24oaW50MTZfdCBwb3NpdGlvbil7CisgICAgaW50MTZfdCBjb252ZXJ0ZWRQb3NpdGlvbiA9IDA7CisKKyAgICBjb252ZXJ0ZWRQb3NpdGlvbiA9IChpbnQxNl90KSgoKGZsb2F0KXBvc2l0aW9uLzEwMDApKjk2KTsKKyAgICByZXR1cm4gY29udmVydGVkUG9zaXRpb247CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgICAgICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwb3NpdGlvbjogICAgICAgc3RlcmVvIHBvc2l0aW9uCisvLworLy8gT3V0cHV0czoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgcG9zaXRpb24peworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbGFuY2UgPSAwOworCisKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSBwb3NpdGlvbjsKKyAgICBCYWxhbmNlID0gVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworCisgICAgLy9MT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZCIsCisgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKworICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX1RSVUUpeworCisgICAgICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBQb3NpdGlvbiB0byBiZSBzZXQgaXMgJWQgJWRcbiIsIHBvc2l0aW9uLCBCYWxhbmNlKTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IHBvc2l0aW9uOworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQorICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgZ290OiIKKyAgICAgICAgLy8gICAgICIgJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKKworICAgICAgICAvKiBWb2x1bWUgcGFyYW1ldGVycyAqLworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSAgPSBCYWxhbmNlOworICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oKSAoLTk2ZEIgLT4gKzk2ZEIpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICk7CisKKyAgICAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQorICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQorICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgZ290OiAiCisgICAgICAgIC8vICAgICAiJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLy9MT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIGF0dGVtcHRpbmcgdG8gc2V0LCBidXQgbm90IGVuYWJsZWQgJWQgJWRcbiIsCisgICAgICAgIC8vcG9zaXRpb24sIEJhbGFuY2UpOworICAgIH0KKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gZW5kIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZFxuIiwKKyAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLyAgcG9zaXRpb246ICAgICAgIHN0ZXJlbyBwb3NpdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgKnBvc2l0aW9uKXsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQiKTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJhbGFuY2U7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKKyAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICBiYWxhbmNlID0gVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgIGlmKGJhbGFuY2UgIT0gQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBvc2l0aW9uID0gKExWTV9JTlQxNilwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkOyAgICAgLy8gQ29udmVydCBkQiB0byBtaWxsaWJlbHMKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gZW5kIHJldHVybmluZyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0lZFxuIiwKKyAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgZW5hYmxlZCl7CisgICAgLy9MT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHN0YXJ0KCkiKTsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBlbmFibGVkOworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHRvICVkLCBwb3NpdGlvbiB3YXMgJWRcbiIsCisgICAgLy8gICAgIGVuYWJsZWQsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICk7CisKKyAgICAvKiBTZXQgYXBwcm9wcmlhdGUgc3RlcmVvIHBvc2l0aW9uICovCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fRkFMU0UpeworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSA9IDA7CisgICAgfWVsc2V7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIH0KKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gZW5kKClcbiIpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIEJhc3NCb29zdCBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcEJhc3NCb29zdCAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaG9sZCByZXRyaWV2ZWQgdmFsdWUKKy8vICBwVmFsdWVTaXplICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKKy8vCisvLyBPdXRwdXRzOgorLy8gICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQorLy8gICpwVmFsdWVTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorLy8KKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKyAgICBpbnQzMl90IHBhcmFtMjsKKyAgICBjaGFyICpuYW1lOworCisgICAgLy9MT0dWKCJcdEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQ6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTIgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxOworCisgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBCYXNzR2V0U3RyZW5ndGgocENvbnRleHQpOworCisgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBCYXNzQm9vc3QgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBCYXNzQm9vc3QgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSl7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50MTZfdCBzdHJlbmd0aDsKKyAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisKKyAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoICgqcFBhcmFtVGVtcCl7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgc3RyZW5ndGggPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCB2YWx1ZSBpcyAlZCIsIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwQmFzc0Jvb3N0LT5CYXNzU2V0U3RyZW5ndGgiKTsKKyAgICAgICAgICAgIEJhc3NTZXRTdHJlbmd0aChwQ29udGV4dCwgKGludDMyX3Qpc3RyZW5ndGgpOworICAgICAgICAgICAgLy9MT0dWKCJcdEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcEJhc3NCb29zdC0+QmFzc1NldFN0cmVuZ3RoIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsICpwUGFyYW1UZW1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIFZpcnR1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwVmlydHVhbGl6ZXIgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorLy8gIHBWYWx1ZVNpemUgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorLy8KKy8vIE91dHB1dHM6CisvLyAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisvLyAgKnBWYWx1ZVNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAgICAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisgICAgaW50MzJfdCBwYXJhbTI7CisgICAgY2hhciAqbmFtZTsKKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTIgJWQiLCpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxOworCisgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKHBDb250ZXh0KTsKKworICAgICAgICAgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gU2V0IGEgVmlydHVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBWaXJ0dWFsaXplciAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQxNl90IHN0cmVuZ3RoOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgc3RyZW5ndGggPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggdmFsdWUgaXMgJWQiLCBzdHJlbmd0aCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CisgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIHBWaXJ0dWFsaXplci0+c2V0U3RyZW5ndGgiKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIEVxdWFsaXplciBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcEVxdWFsaXplciAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaG9sZCByZXRyaWV2ZWQgdmFsdWUKKy8vICBwVmFsdWVTaXplICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKKy8vCisvLyBPdXRwdXRzOgorLy8gICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQorLy8gICpwVmFsdWVTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorLy8KKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQgYk11dGUgPSAwOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKyAgICBpbnQzMl90IHBhcmFtMjsKKyAgICBjaGFyICpuYW1lOworCisgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6CisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9MRVZFTF9SQU5HRToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDIgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDMgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDMyX3QpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDUgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAxICAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YodWludDE2X3QpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTlVNX0JBTkRTICVkIiwgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAtMTUwMDsKKyAgICAgICAgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpID0gMTUwMDsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsCisgICAgICAgIC8vICAgICAgKihpbnQxNl90ICopcFZhbHVlLCAqKChpbnQxNl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7CisgICAgICAgIGlmIChwYXJhbTIgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIHBhcmFtMik7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsCisgICAgICAgIC8vICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW1UZW1wOworICAgICAgICBpZiAocGFyYW0yID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KHBDb250ZXh0LCBwYXJhbTIpOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsCisgICAgICAgIC8vICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtVGVtcDsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UocENvbnRleHQsIHBhcmFtMiwgKHVpbnQzMl90ICopcFZhbHVlLCAoKHVpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsCisgICAgICAgIC8vICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUsICooKGludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDoKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0QmFuZChwQ29udGV4dCwgcGFyYW0yKTsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfQkFORCBmcmVxdWVuY3kgJWQsIGJhbmQgJWQiLAorICAgICAgICAvLyAgICAgIHBhcmFtMiwgKih1aW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgorICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyAlZCIsICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW1UZW1wOworICAgICAgICBpZiAocGFyYW0yID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgeworICAgICAgICAvL2lmIChwYXJhbTIgPj0gMjApIHsgICAgIC8vIEFHTyBGSVgKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gKGNoYXIgKilwVmFsdWU7CisgICAgICAgIHN0cm5jcHkobmFtZSwgRXF1YWxpemVyR2V0UHJlc2V0TmFtZShwYXJhbTIpLCAqcFZhbHVlU2l6ZSAtIDEpOworICAgICAgICBuYW1lWypwVmFsdWVTaXplIC0gMV0gPSAwOworICAgICAgICAqcFZhbHVlU2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLAorICAgICAgICAvLyAgICAgIHBhcmFtMiwgZ0VxdWFsaXplclByZXNldHNbcGFyYW0yXS5uYW1lLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CisgICAgICAgIGludDE2X3QgKnAgPSAoaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fUFJPUEVSVElFUyIpOworICAgICAgICBwWzBdID0gKGludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgcFsxXSA9IChpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIHBbMiArIGldID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBpKTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvL0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kXG4iKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgRXF1YWxpemVyX2dldFBhcmFtZXRlciAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gU2V0IGEgRXF1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwRXF1YWxpemVyICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZQorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlciAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90IHByZXNldDsKKyAgICBpbnQzMl90IGJhbmQ7CisgICAgaW50MzJfdCBsZXZlbDsKKyAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisKKworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgcHJlc2V0ID0gKGludDMyX3QpKCoodWludDE2X3QgKilwVmFsdWUpOworCisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsIHByZXNldCk7CisgICAgICAgIGlmICgocHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSl8fChwcmVzZXQgPCAwKSkgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgcHJlc2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgICAgICBiYW5kID0gICpwUGFyYW1UZW1wOworICAgICAgICBsZXZlbCA9IChpbnQzMl90KSgqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX3NldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBiYW5kLCBsZXZlbCk7CisgICAgICAgIGlmIChiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBiYW5kLCBsZXZlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogeworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX3NldFBhcmFtZXRlcigpIEVRX1BBUkFNX1BST1BFUlRJRVMiKTsKKyAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOworICAgICAgICBpZiAoKGludClwWzBdID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwWzBdID49IDApIHsKKyAgICAgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgKGludClwWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoaW50KXBbMV0gIT0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBpLCAoaW50KXBbMiArIGldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEdldCBhIFZvbHVtZSBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcFZvbHVtZSAgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gaG9sZCByZXRyaWV2ZWQgdmFsdWUKKy8vICBwVmFsdWVTaXplICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKKy8vCisvLyBPdXRwdXRzOgorLy8gICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQorLy8gICpwVmFsdWVTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorLy8KKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludCBiTXV0ZSA9IDA7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOzsKKyAgICBjaGFyICpuYW1lOworCisgICAgLy9MT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDoKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTUFYTEVWRUw6CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgorICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDIgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTEVWRUw6CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QgKikocFZhbHVlKSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01BWExFVkVMOgorICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gMDsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX01BWExFVkVMIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgorICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0TXV0ZShwQ29udGV4dCwgKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIExPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9NVVRFIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgVm9sdW1lX2dldFBhcmFtZXRlciAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lX3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBWb2x1bWUgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBWb2x1bWUgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSl7CisgICAgaW50ICAgICAgc3RhdHVzID0gMDsKKyAgICBpbnQxNl90ICBsZXZlbDsKKyAgICBpbnQxNl90ICBwb3NpdGlvbjsKKyAgICB1aW50MzJfdCBtdXRlOworICAgIHVpbnQzMl90IHBvc2l0aW9uRW5hYmxlZDsKKyAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0xFVkVMOgorICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5zZXRWb2x1bWVMZXZlbCIpOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KWxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIHBWb2x1bWUtPnNldFZvbHVtZUxldmVsIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgorICAgICAgICAgICAgbXV0ZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+c2V0TXV0ZSwgbXV0ZSBpcyAlZCIsIG11dGUpOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIHBWb2x1bWUtPnNldE11dGUiKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldE11dGUocENvbnRleHQsIG11dGUpOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZvbHVtZS0+c2V0TXV0ZSIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICBwb3NpdGlvbkVuYWJsZWQgPSAqKHVpbnQzMl90ICopcFZhbHVlOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24ocENvbnRleHQsIHBvc2l0aW9uRW5hYmxlZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBjYWxsZWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OOgorICAgICAgICAgICAgcG9zaXRpb24gPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiB2YWx1ZSBpcyAlZCIsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5Wb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIChpbnQxNl90KXBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIHBWb2x1bWUtPlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBWb2x1bWVfc2V0UGFyYW1ldGVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lIDogTFZDX1RvREJfczMyVG9zMTYoKQorICogIElucHV0ICAgICAgIDogU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisgKiAgT3V0cHV0ICAgICAgOiBTaWduZWQgMTYtYml0IGludGVnZXIKKyAqICAgICAgICAgICAgICAgICAgTVNCICgxNikgPSBzaWduIGJpdAorICogICAgICAgICAgICAgICAgICAoMTUtPjA1KSA9IGludGVnZXIgcGFydAorICogICAgICAgICAgICAgICAgICAoMDQtPjAxKSA9IGRlY2ltYWwgcGFydAorICogIFJldHVybnMgICAgIDogRGIgdmFsdWUgd2l0aCByZXNwZWN0IHRvIGZ1bGwgc2NhbGUKKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQxNiBMVkNfVG9EQl9zMzJUb3MxNihMVk1fSU5UMzIgTGluX2ZpeCkKK3sKKyAgICBMVk1fSU5UMTYgICBkYl9maXg7CisgICAgTFZNX0lOVDE2ICAgU2hpZnQ7CisgICAgTFZNX0lOVDE2ICAgU21hbGxSZW1haW5kZXI7CisgICAgTFZNX1VJTlQzMiAgUmVtYWluZGVyID0gKExWTV9VSU5UMzIpTGluX2ZpeDsKKworICAgIC8qIENvdW50IGxlYWRpbmcgYml0cywgMSBjeWNsZSBpbiBhc3NlbWJseSovCisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0PDMyOyBTaGlmdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChSZW1haW5kZXIgJiAweDgwMDAwMDAwVSkhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFJlbWFpbmRlciA9IFJlbWFpbmRlciA8PCAxOworICAgIH0KKworICAgIC8qCisgICAgICogQmFzZWQgb24gdGhlIGFwcHJveGltYXRpb24gZXF1YXRpb24gKGZvciBRMTEuNCBmb3JtYXQpOgorICAgICAqCisgICAgICogZEIgPSAtOTYgKiBTaGlmdCArIDE2ICogKDggKiBSZW1haW5kZXIgLSAyICogUmVtYWluZGVyXjIpCisgICAgICovCisgICAgZGJfZml4ICAgID0gKExWTV9JTlQxNikoLTk2ICogU2hpZnQpOyAgICAgICAgICAgICAgIC8qIFNpeCBkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQqLworICAgIFNtYWxsUmVtYWluZGVyID0gKExWTV9JTlQxNikoKFJlbWFpbmRlciAmIDB4N2ZmZmZmZmYpID4+IDI0KTsKKyAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggKyBTbWFsbFJlbWFpbmRlciApOworICAgIFNtYWxsUmVtYWluZGVyID0gKExWTV9JTlQxNikoU21hbGxSZW1haW5kZXIgKiBTbWFsbFJlbWFpbmRlcik7CisgICAgZGJfZml4ID0gKExWTV9JTlQxNikoZGJfZml4IC0gKExWTV9JTlQxNikoKExWTV9VSU5UMTYpU21hbGxSZW1haW5kZXIgPj4gOSkpOworCisgICAgLyogQ29ycmVjdCBmb3Igc21hbGwgb2Zmc2V0ICovCisgICAgZGJfZml4ID0gKExWTV9JTlQxNikoZGJfZml4IC0gNSk7CisKKyAgICByZXR1cm4gZGJfZml4OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdF9zZXRFbmFibGVkKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEVuYWJsZSBvciBkaXNhYmxlIGVmZmVjdAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dCAgICAgIC0gcG9pbnRlciB0byBlZmZlY3QgY29udGV4dAorLy8gIGVuYWJsZWQgICAgICAgLSB0cnVlIGlmIGVuYWJsaW5nIHRoZSBlZmZlY3QsIGZhbHNlIG90aGVyd2lzZQorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgYm9vbCBlbmFibGVkKQoreworICAgIExPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSB0eXBlICVkLCBlbmFibGVkICVkIiwgcENvbnRleHQtPkVmZmVjdFR5cGUsIGVuYWJsZWQpOworCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgc3dpdGNoIChwQ29udGV4dC0+RWZmZWN0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBMVk1fQkFTU19CT09TVDoKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX0JBU1NfQk9PU1QgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCl7CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFZNX0VRVUFMSVpFUjoKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIExWTV9FUVVBTElaRVIgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA8PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPQorICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExWTV9WSVJUVUFMSVpFUjoKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZJUlRVQUxJWkVSIGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA8PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9CisgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kKjAuMSk7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMVk1fVk9MVU1FOgorICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZPTFVNRSBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIGludmFsaWQgZWZmZWN0IHR5cGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKSB7CisgICAgICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBMVk1fQkFTU19CT09TVCBpcyBhbHJlYWR5IGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExWTV9FUVVBTElaRVI6CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX0VRVUFMSVpFUiBpcyBhbHJlYWR5IGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFZNX1ZJUlRVQUxJWkVSOgorICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZJUlRVQUxJWkVSIGlzIGFscmVhZHkgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExWTV9WT0xVTUU6CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZPTFVNRSBpcyBhbHJlYWR5IGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIGludmFsaWQgZWZmZWN0IHR5cGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTFZDX0NvbnZlcnRfVm9sVG9EYigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBDb252ZXJ5IHZvbHVtZSBpbiBRMjQgdG8gZEIKKy8vCisvLyBJbnB1dHM6CisvLyAgdm9sOiAgIFEuMjQgdm9sdW1lIGRCCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IExWQ19Db252ZXJ0X1ZvbFRvRGIodWludDMyX3Qgdm9sKXsKKyAgICBpbnQxNl90ICBkQjsKKworICAgIGRCID0gTFZDX1RvREJfczMyVG9zMTYodm9sIDw8Nyk7CisgICAgZEIgPSAoZEIgKzgpPj40OworICAgIGRCID0gKGRCIDwtOTYpID8gLTk2IDogZEIgOworCisgICAgcmV0dXJuIGRCOworfQorCit9IC8vIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UKKworLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCitleHRlcm4gIkMiIGludCBFZmZlY3RfcHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3QgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKm91dEJ1ZmZlcil7CisgICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBpbnQgICAgc3RhdHVzID0gMDsKKyAgICBpbnQgICAgbHZtU3RhdHVzID0gMDsKKyAgICBMVk1fSU5UMTYgICAqaW4gID0gKExWTV9JTlQxNiAqKWluQnVmZmVyLT5yYXc7CisgICAgTFZNX0lOVDE2ICAgKm91dCA9IChMVk1fSU5UMTYgKilvdXRCdWZmZXItPnJhdzsKKworLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKKy8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKy8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiLAorLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCwKKy8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9pZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CisgICAgLy8gIExPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IEVmZmVjdCB0eXBlIGlzIEJBU1NfQk9PU1QiKTsKKyAgICAvL31lbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgIC8vICBMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBFZmZlY3QgdHlwZSBpcyBMVk1fRVFVQUxJWkVSIik7CisgICAgLy99ZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgIC8vICBMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBFZmZlY3QgdHlwZSBpcyBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAvL30KKworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMICB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgIHx8CisgICAgICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgRVJST1IgTlVMTCBJTlBVVCBQT0lOVEVSIE9SIEZSQU1FIENPVU5UIElTIFdST05HIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSl7CisgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApeworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgQkFTU19CT09TVCwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSkmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVk9MVU1FIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICB9CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEVRVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCl7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ly8gU1RFUkVPCisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIHRvIHR1cm4gb2ZmIFZJUlRVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAorICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihzdGF0dXMgIT0gLUVOT0RBVEEpeworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkKys7CisgICAgfQorCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9PQorICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzICAgICBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0ICVkIiwKKyAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKKyAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisKKyAgICAgICAgaWYoc3RhdHVzID09IC1FTk9EQVRBKXsKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBwcm9jZXNzaW5nIGxhc3QgZnJhbWUiKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMKKyAgICAgICAgICAgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCisgICAgICAgIGx2bVN0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKCAgICAoTFZNX0lOVDE2ICopaW5CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilvdXRCdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyAgICAgICAgaWYobHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKXsKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgcmV0dXJuZWQgZXJyb3IgJWQiLCBsdm1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGx2bVN0YXR1czsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgTm90IENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLAorICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAorICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgLy8gMiBpcyBmb3Igc3RlcmVvIGlucHV0CisgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9ICAgLyogZW5kIEVmZmVjdF9wcm9jZXNzICovCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLworZXh0ZXJuICJDIiBpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90ICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKXsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworCisgICAgLy9MT0dWKCJcdFxuRWZmZWN0X2NvbW1hbmQgc3RhcnQiKTsKKworICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICB9CisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVk9MVU1FIik7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisKKyAgICAvLyBJbmNhc2Ugd2UgZGlzYWJsZSBhbiBlZmZlY3QsIG5leHQgdGltZSBwcm9jZXNzIGlzCisgICAgLy8gY2FsbGVkIHRoZSBudW1iZXIgb2YgZWZmZWN0IGNhbGxlZCBjb3VsZCBiZSBncmVhdGVyCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisKKyAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgTnVtYmVyRWZmZWN0c0NhbGxlZCA9ICVkLCBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwKKyAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKyAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworCisgICAgc3dpdGNoIChjbWRDb2RlKXsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SLCBFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIGZvciBlZmZlY3QgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBzdGFydCIpOworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpCYXNzU2V0U3RyZW5ndGgocENvbnRleHQsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6RXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZPTFVNRSIpOworICAgICAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9DT05GSUdVUkUgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KXx8CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X2NvbmZpZ3VyZShwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBlbmQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkVmZmVjdF9jb25maWd1cmUocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKworICAgICAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworCisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworCisgICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCAgKikmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKKworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAiKnBSZXBseURhdGEgJTA4eCAlMDh4IiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworCisgICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBlbmQiKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAgLy8gICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgK3NpemVvZihpbnQxNl90KSl8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRuQmFzc0Jvb3N0X2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRzaXplb2YoZWZmZWN0X3BhcmFtX3QpIGlzICAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CisKKyAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAorICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICBjbWRTaXplICAgICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgK3NpemVvZihpbnQxNl90KSl8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0blZpcnR1YWxpemVyX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRzaXplb2YoZWZmZWN0X3BhcmFtX3QpIGlzICAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlxuIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CisKKyAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CisgICAgICAgICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOworCisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RXF1YWxpemVyX3NldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgK3NpemVvZihpbnQzMl90KSkpOworCisgICAgICAgICAgICAgICAgaWYgKCAgICBwQ21kRGF0YSAgID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBlbmQiKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRU5BQkxFIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldEVuYWJsZWQocENvbnRleHQsIExWTV9UUlVFKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgorICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX0ZBTFNFKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIHN0YXJ0Iik7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VfZSBkZXZpY2UgPSAqKGF1ZGlvX2RldmljZV9lICopcENtZERhdGE7CisKKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IERFVklDRV9TUEVBS0VSKXx8KGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKKyAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fQkFTU19CT09TVCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgdGVtcG9yYXJ5IGRpc2FibGUgTFZNX0JBU19CT09TVCIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IGJhc3Nib29zdCB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBtdXN0IHN0aWxsIHJlcG9ydCBpdHMgb3JpZ2luYWwgc3RhdGUgYXMgdGhpcyBjYW4gb25seSBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCisKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX0JBU1NfQk9PU1QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyB2YWxpZCBmb3IgTFZNX0JBU1NfQk9PU1QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBzdXBwb3J0cyBiYXNzYm9vc3QgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAorCisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fQkFTU19CT09TVCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9lbmFibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gREVWSUNFX1NQRUFLRVIpfHwoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAorICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgdGVtcG9yYXJ5IGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisKKyAgICAgICAgICAgICAgICAgICAgLy9JZiBhIGRldmljZSBkb2VzbnQgc3VwcG9ydCB2aXJ0dWFsaXplciB0aGUgZWZmZWN0IG11c3QgYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBtdXN0IHN0aWxsIHJlcG9ydCBpdHMgb3JpZ2luYWwgc3RhdGUgYXMgdGhpcyBjYW4gb25seSBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCisKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgdmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBzdXBwb3J0cyB2aXJ0dWFsaXplciBhbmQgdGhlIGVmZmVjdCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIGVuZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lOworICAgICAgICAgICAgaW50MTZfdCAgbGVmdGRCLCByaWdodGRCOworICAgICAgICAgICAgaW50MTZfdCAgbWF4ZEIsIHBhbmRCOworICAgICAgICAgICAgaW50MzJfdCAgdm9sX3JldFsyXSA9IHsxPDwyNCwxPDwyNH07IC8vIEFwcGx5IG5vIHZvbHVtZQorICAgICAgICAgICAgaW50ICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgICAgICAvLyBpZiBwUmVwbHlEYXRhIGlzIE5VTEwsIFZPTF9DVFJMIGlzIGRlbGVnYXRlZCB0byBhbm90aGVyIGVmZmVjdAorICAgICAgICAgICAgaWYocFJlcGx5RGF0YSA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZWZ0Vm9sdW1lICA9ICgoKih1aW50MzJfdCAqKXBDbWREYXRhKSk7CisgICAgICAgICAgICByaWdodFZvbHVtZSA9ICgoKigodWludDMyX3QgKilwQ21kRGF0YSArIDEpKSk7CisKKyAgICAgICAgICAgIGlmKGxlZnRWb2x1bWUgPT0gMHgxMDAwMDAwKXsKKyAgICAgICAgICAgICAgICBsZWZ0Vm9sdW1lIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihyaWdodFZvbHVtZSA9PSAweDEwMDAwMDApeworICAgICAgICAgICAgICAgIHJpZ2h0Vm9sdW1lIC09IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lIHRvIGRCCisgICAgICAgICAgICBsZWZ0ZEIgID0gYW5kcm9pZDo6TFZDX0NvbnZlcnRfVm9sVG9EYihsZWZ0Vm9sdW1lKTsKKyAgICAgICAgICAgIHJpZ2h0ZEIgPSBhbmRyb2lkOjpMVkNfQ29udmVydF9Wb2xUb0RiKHJpZ2h0Vm9sdW1lKTsKKworICAgICAgICAgICAgcGFuZEIgPSByaWdodGRCIC0gbGVmdGRCOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbWF4IHZvbHVtZSBpbiBkQgorICAgICAgICAgICAgbWF4ZEIgPSBsZWZ0ZEI7CisgICAgICAgICAgICBpZihyaWdodGRCID4gbWF4ZEIpeworICAgICAgICAgICAgICAgIG1heGRCID0gcmlnaHRkQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgU2Vzc2lvbjogJWQsIFNlc3Npb25JRDogJWQgVk9MVU1FIGlzICVkIGRCICglZCksICIKKyAgICAgICAgICAgIC8vICAgICAgImVmZmVjdCBpcyAlZCIsCisgICAgICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkLAorICAgICAgICAgICAgLy8oaW50MzJfdCltYXhkQiwgbWF4Vm9sPDw3LCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0IGlzICVkLCBSaWdodCBpcyAlZCIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgJWRkQiwgUmlnaHQgJWRkQiwgUG9zaXRpb24gJWRkQiIsCisgICAgICAgICAgICAvLyAgICAgICAgbGVmdGRCLCByaWdodGRCLCBwYW5kQik7CisKKyAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCB2b2xfcmV0LCBzaXplb2YoaW50MzJfdCkqMik7CisgICAgICAgICAgICBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QpKG1heGRCKjEwMCkpOworCisgICAgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIEx2bVN0YXR1cyA9TFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQorICAgICAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLyogVm9sdW1lIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9IHBhbmRCOworICAgICAgICAgICAgTE9HVigiXHRcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkgKC05NmRCIC0+ICs5NmRCKS0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSApOworCisgICAgICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgICAgICAgICAgTHZtU3RhdHVzID1MVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCZBY3RpdmVQYXJhbXMpOworICAgICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCisgICAgICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGVuZC4uLlxuXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIEVmZmVjdF9jb21tYW5kICovCisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVmZmVjdAorY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnTHZtRWZmZWN0SW50ZXJmYWNlID0geworICAgIEVmZmVjdF9wcm9jZXNzLAorICAgIEVmZmVjdF9jb21tYW5kCit9OyAgICAvKiBlbmQgZ0x2bUVmZmVjdEludGVyZmFjZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTEwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEJhc3NCb29zdEFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmg+CisjaW5jbHVkZSA8TFZNLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBGSVZFQkFORF9OVU1CQU5EUyAgICAgICAgICA1CisjZGVmaW5lIE1BWF9OVU1fQkFORFMgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUFYX0NBTExfU0laRSAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIExWTV9NQVhfU0VTU0lPTlMgICAgICAgICAgIDMyCisjZGVmaW5lIExWTV9VTlVTRURfU0VTU0lPTiAgICAgICAgIElOVF9NQVgKKyNkZWZpbmUgQkFTU19CT09TVF9DVVBfTE9BRF9BUk05RSAgMTUwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAxMjAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAgIDIyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgVk9MVU1FX0NVUF9MT0FEX0FSTTlFICAgICAgMCAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBCVU5ETEVfTUVNX1VTQUdFICAgICAgICAgICAyNSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCisvLyNkZWZpbmUgTFZNX1BDTQorCisjaWZuZGVmIE9QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZPTFVNRV8gPSB7IDB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZPTFVNRSA9ICZTTF9JSURfVk9MVU1FXzsKKyNlbmRpZiAvL09QRU5TTF9FU19IXworCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fQkFTU19CT09TVCwKKyAgICBMVk1fVklSVFVBTElaRVIsCisgICAgTFZNX0VRVUFMSVpFUiwKKyAgICBMVk1fVk9MVU1FCit9IGx2bV9lZmZlY3RfZW47CisKKy8vIFByZXNldCBjb25maWd1cmF0aW9uLgorc3RydWN0IFByZXNldENvbmZpZyB7CisgICAgLy8gSHVtYW4tcmVhZGFibGUgbmFtZS4KKyAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICAvLyBBbiBhcnJheSBvZiBzaXplIG5CYW5kcyB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIGJhbmQuCisgICAgLy9jb25zdCBCYW5kQ29uZmlnICogYmFuZENvbmZpZ3M7Cit9OworCisvKiBCdW5kbGVkRWZmZWN0Q29udGV4dCA6IE9uZSBwZXIgc2Vzc2lvbiAqLworc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0eworICAgIExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25ObzsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIG51bWJlciAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbklkOyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gaWQgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2x1bWVFbmFibGVkOyAgICAgICAgICAgLyogRmxhZyBmb3IgVm9sdW1lICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXF1YWxpemVyRW5hYmxlZDsgICAgICAgIC8qIEZsYWcgZm9yIEVRICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFzc0VuYWJsZWQ7ICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEJhc3MgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJFZmZlY3RzRW5hYmxlZDsgICAgIC8qIEVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJFZmZlY3RzQ2FsbGVkOyAgICAgIC8qIEVmZmVjdHMgY2FsbGVkIHNvIGZhciAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWb2x1bWU7ICAgICAgICAgICAgICAvKiBObyBzbW9vdGhpbmcgb24gZmlyc3QgVm9sIGNoYW5nZSAqLworICAgIC8vIFNhdmVkIHBhcmFtZXRlcnMgZm9yIGVhY2ggZWZmZWN0ICovCisgICAgLy8gQmFzcyBCb29zdAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzc1N0cmVuZ3RoU2F2ZWQ7ICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLworICAgIC8vIEVxdWFsaXplcgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUHJlc2V0OyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHByZXNldCBiZWluZyB1c2VkICovCisgICAgLy8gVmlydHVhbHplcgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlydFN0cmVuZ3RoU2F2ZWQ7ICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLworICAgIC8vIFZvbHVtZQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxTYXZlZDsgICAgIC8qIGZvciB3aGVuIG11dGUgaXMgc2V0LCBsZXZlbCBtdXN0IGJlIHNhdmVkICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblNhdmVkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk11dGVFbmFibGVkOyAgIC8qIE11c3Qgc3RvcmUgYXMgbXV0ZSA9IC05NmRCIGxldmVsICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RlcmVvUG9zaXRpb25FbmFibGVkOworICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNQZXJTZWNvbmQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRFcTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEJiOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50VmlydDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICp3b3JrQnVmZmVyOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudDsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOworICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKKyAgICAjZW5kaWYKK307CisKKy8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KK3N0cnVjdCBTZXNzaW9uQ29udGV4dHsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCdW5kbGVkRWZmZWN0c0VuYWJsZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVm9sdW1lSW5zdGFudGlhdGVkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVxdWFsaXplckluc3RhbnRpYXRlZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzSW5zdGFudGlhdGVkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVySW5zdGFudGlhdGVkOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK307CisKK3N0cnVjdCBFZmZlY3RDb250ZXh0eworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7CisgICAgbHZtX2VmZmVjdF9lbiAgICAgICAgICAgICAgICAgICBFZmZlY3RUeXBlOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK307CisKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIFZvbHVtZSBlZmZlY3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIFZPTFVNRV9QQVJBTV9MRVZFTCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fTUFYTEVWRUwsICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChnZXQpCisgICAgVk9MVU1FX1BBUkFNX01VVEUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiwgICAgICAgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04sICAgICAgICAgICAgICAvLyB0eXBlIFNMcGVybWlsbGUgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCit9IHRfdm9sdW1lX3BhcmFtczsKKworc3RhdGljIGNvbnN0IGludCBQUkVTRVRfQ1VTVE9NID0gLTE7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBiYW5kRnJlcVJhbmdlW0ZJVkVCQU5EX05VTUJBTkRTXVsyXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMDAwMCwgMTIwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMjAwMDEsIDQ2MDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDYwMDAxLCAxODAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxODAwMDAxLCA3MDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MDAwMDAxLCAxfX07CisKK3N0YXRpYyBjb25zdCBMVk1fVUlOVDE2ICBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgICAgICAgICAgIC8qIEZyZXF1ZW5jaWVzIGluIEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMDB9OworCitzdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgICAgICAgICAgICAgICAvKiBRIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTZ9OworCitzdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmROb3JtYWxQcmVzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAwLCAzLCAgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA1LCAtMywgNSwgNiwgICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgLTYsIDcsIDEzLCAxMCwgICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAtMiwgLTIsIDYsIC0zLCAgICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgLTgsIDEzLCAtMSwgLTQsICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgLTQsIDUsIDgsICAgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgNSwgLTQsIDUsIDksICAgICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsIDQsIDksIDQsIC01LCAgICAgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAtMSwgOCwgMTB9OyAgIC8qIFJvY2sgUHJlc2V0ICovCisKK3N0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZFNvZnRQcmVzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMCwgMywgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgLTIsIDQsIDQsICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMiwgNCwgMSwgICAgICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMiwgLTEsICAgICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDksIDMsIDAsICAgICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgMCwgMSwgMywgICAgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDIsIC0yLCAyLCA1LCAgICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAyLCA1LCAxLCAtMiwgICAgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAzLCAtMSwgMywgNX07ICAgIC8qIFJvY2sgUHJlc2V0ICovCisKK3N0YXRpYyBjb25zdCBQcmVzZXRDb25maWcgZ0VxdWFsaXplclByZXNldHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ik5vcm1hbCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQ2xhc3NpY2FsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJEYW5jZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRmxhdCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRm9sayJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiSGVhdnkgTWV0YWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkhpcCBIb3AifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkphenoifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlBvcCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUm9jayJ9fTsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVEJVTkRMRV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNmM1YWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMCwwICsxLDIwODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmV2ZXJiIgorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxFZmZlY3RSZXZlcmIuaD4KKyNpbmNsdWRlIDxMVlJFVi5oPgorCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKK2V4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlOworCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCisgICAgICAgIGlmIChMdm1TdGF0dXMgPT0gTFZSRVZfTlVMTEFERFJFU1Mpe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWUkVWX0lOVkFMSUROVU1TQU1QTEVTKXtcCisgICAgICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVlJFVl9PVVRPRlJBTkdFKXtcCisgICAgICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICB9CisKKy8vIE5hbWVzcGFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUHJlc2V0IGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBzdGF0aWMgdF9yZXZlcmJfc2V0dGluZ3Mgc1JldmVyYlByZXNldHNbXSA9IHsKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FOiB2YWx1ZXMgYXJlIHVudXNlZAorICAgICAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfU01BTExST09NCisgICAgICAgIHstNDAwLCAtNjAwLCAxMTAwLCA4MzAsIC00MDAsIDUsIDUwMCwgMTAsIDEwMDAsIDEwMDB9LAorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX01FRElVTVJPT00KKyAgICAgICAgey00MDAsIC02MDAsIDEzMDAsIDgzMCwgLTEwMDAsIDIwLCAtMjAwLCAyMCwgMTAwMCwgMTAwMH0sCisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NCisgICAgICAgIHstNDAwLCAtNjAwLCAxNTAwLCA4MzAsIC0xNjAwLCA1LCAtMTAwMCwgNDAsIDEwMDAsIDEwMDB9LAorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwKKyAgICAgICAgey00MDAsIC02MDAsIDE4MDAsIDcwMCwgLTEzMDAsIDE1LCAtODAwLCAzMCwgMTAwMCwgMTAwMH0sCisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfTEFSR0VIQUxMCisgICAgICAgIHstNDAwLCAtNjAwLCAxODAwLCA3MDAsIC0yMDAwLCAzMCwgLTE0MDAsIDYwLCAxMDAwLCAxMDAwfSwKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9QTEFURQorICAgICAgICB7LTQwMCwgLTIwMCwgMTMwMCwgOTAwLCAwLCAyLCAwLCAxMCwgMTAwMCwgNzUwfSwKK307CisKKworLy8gTlhQIFNXIGF1eGlsaWFyeSBlbnZpcm9ubWVudGFsIHJldmVyYgorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKKyAgICAgICAgeyAweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7IDB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWUgfSB9LAorICAgICAgICB7IDB4NGEzODdmYzAsIDB4OGFiMywgMHgxMWRmLCAweDhiYWQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCisgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCisgICAgICAgICJBdXhpbGlhcnkgRW52aXJvbm1lbnRhbCBSZXZlcmIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIGluc2VydCBlbnZpcm9ubWVudGFsIHJldmVyYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAorICAgICAgICB7MHhjN2E1MTFhMCwgMHhhM2JiLCAweDExZGYsIDB4ODYwZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMLAorICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKKyAgICAgICAgTFZSRVZfTUVNX1VTQUdFLAorICAgICAgICAiSW5zZXJ0IEVudmlyb25tZW50YWwgUmV2ZXJiIiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vIE5YUCBTVyBhdXhpbGlhcnkgcHJlc2V0IHJldmVyYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHhmMjlhMTQwMCwgMHhhM2JiLCAweDExZGYsIDB4OGRkYywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKKyAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIExWUkVWX01FTV9VU0FHRSwKKyAgICAgICAgIkF1eGlsaWFyeSBQcmVzZXQgUmV2ZXJiIiwKKyAgICAgICAgIk5YUCBTb2Z0d2FyZSBMdGQuIiwKK307CisKKy8vIE5YUCBTVyBpbnNlcnQgcHJlc2V0IHJldmVyYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHgxNzJjZGYwMCwgMHhhM2JjLCAweDExZGYsIDB4YTcyZiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMLAorICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKKyAgICAgICAgTFZSRVZfTUVNX1VTQUdFLAorICAgICAgICAiSW5zZXJ0IFByZXNldCBSZXZlcmIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gZ0Rlc2NyaXB0b3JzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbCBkZWZpbmVkIGVmZmVjdCBkZXNjcmlwdG9yIGluIHRoaXMgbGlicmFyeQorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKKyAgICAgICAgJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yLAorICAgICAgICAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IsCisgICAgICAgICZnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yCit9OworCitzdHJ1Y3QgUmV2ZXJiQ29udGV4dHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIGVmZmVjdF9jb25maWdfdCAgICAgICAgICAgICAgICAgY29uZmlnOworICAgIExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgICAgICAgaEluc3RhbmNlOworICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWRSb29tTGV2ZWw7CisgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZEhmTGV2ZWw7CisgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERlY2F5VGltZTsKKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVjYXlIZlJhdGlvOworICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWRSZXZlcmJMZXZlbDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGlmZnVzaW9uOworICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREZW5zaXR5OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVuYWJsZWQ7CisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21JblB0cjsKKyAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21PdXRQdHI7CisgICAgI2VuZGlmCisgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKkluRnJhbWVzMzI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqT3V0RnJhbWVzMzI7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXhpbGlhcnk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBjdXJQcmVzZXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UHJlc2V0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50OworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZvbHVtZTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Vm9sdW1lOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgcHJldkxlZnRWb2x1bWU7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBwcmV2UmlnaHRWb2x1bWU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVNb2RlOworfTsKKworZW51bSB7CisgICAgUkVWRVJCX1ZPTFVNRV9PRkYsCisgICAgUkVWRVJCX1ZPTFVNRV9GTEFULAorICAgIFJFVkVSQl9WT0xVTUVfUkFNUCwKK307CisKKyNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUFJFU0VUIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTQorCisKKyNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAoMHgwQzAwKSAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZGVmaW5lIFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CisKKy8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK2ludCAgUmV2ZXJiX2luaXQgICAgICAgICAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpOwordm9pZCBSZXZlcmJfZnJlZSAgICAgICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCk7CitpbnQgIFJldmVyYl9jb25maWd1cmUgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOworaW50ICBSZXZlcmJfc2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOworaW50ICBSZXZlcmJfZ2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOworaW50IFJldmVyYl9Mb2FkUHJlc2V0ICAgICAgIChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KTsKKworLyogRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uICovCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIHN0YXJ0Iik7CisgICAgKnBOdW1FZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBjcmVhdGluZyAlZCBlZmZlY3RzIiwgKnBOdW1FZmZlY3RzKTsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBlbmRcbiIpOworICAgIHJldHVybiAwOworfSAgICAgLyogZW5kIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpeworICAgIExPR1YoIlxuXHRFZmZlY3RRdWVyeUVmZmVjdCBzdGFydCIpOworICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBpbmRleCAlZCIsIGluZGV4KTsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UXVlcnlFZmZlY3Qgd2FzIHBhc3NlZCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChpbmRleCA+PSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopKSB7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UXVlcnlFZmZlY3QgaW5kZXggb3V0IG9mIHJhbmdlICVkIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaW5kZXhdLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgIC8qIGVuZCBFZmZlY3RRdWVyeUVmZmVjdCAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICAqcEludGVyZmFjZSl7CisgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOworCisgICAgTE9HVigiXHRcbkVmZmVjdENyZWF0ZSBzdGFydCIpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZGVzYyA9IGdEZXNjcmlwdG9yc1tpXTsKKyAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZGVzYy0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKQorICAgICAgICAgICAgICAgID09IDApIHsKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLCBpLCBkZXNjLT51dWlkLnRpbWVMb3cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaSA9PSBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgUmV2ZXJiQ29udGV4dCAqcENvbnRleHQgPSBuZXcgUmV2ZXJiQ29udGV4dDsKKworICAgIHBDb250ZXh0LT5pdGZlICAgICAgPSAmZ1JldmVyYkludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKworICAgIHBDb250ZXh0LT5hdXhpbGlhcnkgPSBmYWxzZTsKKyAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSl7CisgICAgICAgIHBDb250ZXh0LT5hdXhpbGlhcnkgPSB0cnVlOworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEFVWCIpOworICAgIH1lbHNleworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIElOUyIpOworICAgIH0KKworICAgIHBDb250ZXh0LT5wcmVzZXQgPSBmYWxzZTsKKyAgICBpZiAobWVtY21wKCZkZXNjLT50eXBlLCBTTF9JSURfUFJFU0VUUkVWRVJCLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgcENvbnRleHQtPnByZXNldCA9IHRydWU7CisgICAgICAgIC8vIGZvcmNlIHJlbG9hZGluZyBwcmVzZXQgYXQgZmlyc3QgY2FsbCB0byBwcm9jZXNzKCkKKyAgICAgICAgcENvbnRleHQtPmN1clByZXNldCA9IFJFVkVSQl9QUkVTRVRfTEFTVCArIDE7CisgICAgICAgIHBDb250ZXh0LT5uZXh0UHJlc2V0ID0gUkVWRVJCX0RFRkFVTFRfUFJFU0VUOworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFBSRVNFVCIpOworICAgIH1lbHNleworICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVOVklST05NRU5UQUwiKTsKKyAgICB9CisKKyAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgUmV2ZXJiX2luaXQiKTsKKyAgICByZXQgPSBSZXZlcmJfaW5pdChwQ29udGV4dCk7CisKKyAgICBpZiAocmV0IDwgMCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgZGVsZXRlIHBDb250ZXh0OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKworICAgICNpZmRlZiBMVk1fUENNCisgICAgcENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+UGNtT3V0UHRyID0gTlVMTDsKKworICAgIHBDb250ZXh0LT5QY21JblB0ciAgPSBmb3BlbigiL2RhdGEvdG1wL3JldmVyYl9wY21faW4ucGNtIiwgInciKTsKKyAgICBwQ29udGV4dC0+UGNtT3V0UHRyID0gZm9wZW4oIi9kYXRhL3RtcC9yZXZlcmJfcGNtX291dC5wY20iLCAidyIpOworCisgICAgaWYoKHBDb250ZXh0LT5QY21JblB0ciAgPT0gTlVMTCl8fAorICAgICAgIChwQ29udGV4dC0+UGNtT3V0UHRyID09IE5VTEwpKXsKKyAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgI2VuZGlmCisKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCisgICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CisgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMik7CisKKyAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlZCIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOworICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKXsKKyAgICBSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCAqKWludGVyZmFjZTsKKworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSAlcCIsIGludGVyZmFjZSk7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZmNsb3NlKHBDb250ZXh0LT5QY21JblB0cik7CisgICAgZmNsb3NlKHBDb250ZXh0LT5QY21PdXRQdHIpOworICAgICNlbmRpZgorICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOworICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CisgICAgZGVsZXRlIHBDb250ZXh0OworICAgIHJldHVybiAwOworfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLworCisvKiBsb2NhbCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIjY29uZCk7ICAgICAgXAorICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9ub1RvMklfMzIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gIENvbnZlcnQgTU9OTyB0byBTVEVSRU8KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBNb25vVG8ySV8zMiggY29uc3QgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICBMVk1fSU5UMTYgaWk7CisgICBzcmMgKz0gKG4tMSk7CisgICBkc3QgKz0gKChuKjIpLTEpOworCisgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgIHsKKyAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICBkc3QtLTsKKworICAgICAgICpkc3QgPSAqc3JjOworICAgICAgIGRzdC0tOworICAgICAgIHNyYy0tOworICAgfQorCisgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnJvbTJpVG9Nb25vXzMyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vICBDb252ZXJ0IFNURVJFTyB0byBNT05PCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgIExWTV9JTlQxNiBpaTsKKyAgIExWTV9JTlQzMiBUZW1wOworCisgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgIHsKKyAgICAgICBUZW1wID0gKCpzcmM+PjEpOworICAgICAgIHNyYysrOworCisgICAgICAgVGVtcCArPSgqc3JjPj4xKTsKKyAgICAgICBzcmMrKzsKKworICAgICAgICpkc3QgPSBUZW1wOworICAgICAgIGRzdCsrOworICAgfQorCisgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHByb2Nlc3MoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIFJldmVyYgorLy8KKy8vIElucHV0czoKKy8vICBwSW46ICAgICAgICBwb2ludGVyIHRvIHN0ZXJlby9tb25vIDE2IGJpdCBpbnB1dCBkYXRhCisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCisvLyAgZnJhbWVDb3VudDogRnJhbWVzIHRvIHByb2Nlc3MKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCisvLworLy8gIE91dHB1dHM6CisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IHByb2Nlc3MoIExWTV9JTlQxNiAgICAgKnBJbiwKKyAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpwT3V0LAorICAgICAgICAgICAgIGludCAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICBSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxOworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAqT3V0RnJhbWVzMTY7CisKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSB7CisgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDI7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykgeworICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgT3V0RnJhbWVzMTYgPSAoTFZNX0lOVDE2ICopcENvbnRleHQtPk91dEZyYW1lczMyOworCisgICAgLy8gQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMKKyAgICBpZigocENvbnRleHQtPkluRnJhbWVzMzIgPT0gTlVMTCl8fChwQ29udGV4dC0+T3V0RnJhbWVzMzIgPT0gTlVMTCkpeworICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZW1wb3JhcnkgYnVmZmVycyAiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKnNhbXBsZXNQZXJGcmFtZSwgMSwgcENvbnRleHQtPlBjbUluUHRyKTsKKyAgICBmZmx1c2gocENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAjZW5kaWYKKworICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5uZXh0UHJlc2V0ICE9IHBDb250ZXh0LT5jdXJQcmVzZXQpIHsKKyAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOworICAgIH0KKworCisKKyAgICAvLyBDb252ZXJ0IHRvIElucHV0IDMyIGJpdHMKKyAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworICAgICAgICBmb3IoaW50IGk9MDsgaTxmcmFtZUNvdW50KnNhbXBsZXNQZXJGcmFtZTsgaSsrKXsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyW2ldID0gKExWTV9JTlQzMilwSW5baV08PDg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaV0gPSAocEluWzIqaV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPmN1clByZXNldCA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKKyAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgeworICAgICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5JbkZyYW1lczMyLDAsZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogc2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgICAgIExPR1YoIlx0WmVyb2luZyAlZCBzYW1wbGVzIHBlciBmcmFtZSBhdCB0aGUgZW5kIG9mIGNhbGwiLCBzYW1wbGVzUGVyRnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcywgcHJvZHVjaW5nIGEgc3RlcmVvIG91dHB1dCAqLworICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICB9CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfUHJvY2VzcyIsICJwcm9jZXNzIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKKyAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHdpdGggcmFtcCBpZiBuZWVkZWQKKyAgICAgICAgaWYgKChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgfHwKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBSRVZFUkJfVk9MVU1FX1JBTVApIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiB2bCA9IChMVk1fSU5UMzIpcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIDw8IDE2OworICAgICAgICAgICAgTFZNX0lOVDMyIGluY2wgPSAoKChMVk1fSU5UMzIpcENvbnRleHQtPmxlZnRWb2x1bWUgPDwgMTYpIC0gdmwpIC8gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIExWTV9JTlQzMiB2ciA9IChMVk1fSU5UMzIpcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSA8PCAxNjsKKyAgICAgICAgICAgIExWTV9JTlQzMiBpbmNyID0gKCgoTFZNX0lOVDMyKXBDb250ZXh0LT5yaWdodFZvbHVtZSA8PCAxNikgLSB2cikgLyBmcmFtZUNvdW50OworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKSgodmwgPj4gMTYpICogT3V0RnJhbWVzMTZbMippXSkgPj4gMTIpOworICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaSsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFtcDE2KChMVk1fSU5UMzIpKCh2ciA+PiAxNikgKiBPdXRGcmFtZXMxNlsyKmkrMV0pID4+IDEyKTsKKworICAgICAgICAgICAgICAgIHZsICs9IGluY2w7CisgICAgICAgICAgICAgICAgdnIgKz0gaW5jcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lID0gcENvbnRleHQtPmxlZnRWb2x1bWU7CisgICAgICAgICAgICBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lID0gcENvbnRleHQtPnJpZ2h0Vm9sdW1lOworICAgICAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT52b2x1bWVNb2RlICE9IFJFVkVSQl9WT0xVTUVfT0ZGKSB7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gUkVWRVJCX1VOSVRfVk9MVU1FIHx8CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IFJFVkVSQl9VTklUX1ZPTFVNRSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW1wMTYoKExWTV9JTlQzMikocENvbnRleHQtPmxlZnRWb2x1bWUgKiBPdXRGcmFtZXMxNlsyKmldKSA+PiAxMik7CisgICAgICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaSsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKShwQ29udGV4dC0+cmlnaHRWb2x1bWUgKiBPdXRGcmFtZXMxNlsyKmkrMV0pID4+IDEyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPSBwQ29udGV4dC0+bGVmdFZvbHVtZTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUgPSBwQ29udGV4dC0+cmlnaHRWb2x1bWU7CisgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IFJFVkVSQl9WT0xVTUVfUkFNUDsKKyAgICAgICAgfQorICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKE91dEZyYW1lczE2LCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIsIDEsIHBDb250ZXh0LT5QY21PdXRQdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAjZW5kaWYKKworICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgLy9MT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgQUNDVU1VTEFURSIpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJhbWVDb3VudCoyOyBpKyspeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKGludDMyX3QpcE91dFtpXSArIChpbnQzMl90KU91dEZyYW1lczE2W2ldKTsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICAvL0xPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBXUklURSIpOworICAgICAgICBtZW1jcHkocE91dCwgT3V0RnJhbWVzMTYsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBwcm9jZXNzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiX2ZyZWUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiX2ZyZWUoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgTWVtVGFiOworCisgICAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiUmV2ZXJiX2ZyZWUiKQorCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdGZyZWUoKSAtIFNUQVJUIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgICAgICAgICAgTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAgICAvKiBlbmQgUmV2ZXJiX2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfY29uZmlndXJlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX2NvbmZpZ3VyZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKKyAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOworICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIHN0YXJ0Iik7CisKKyAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWcgIT0gTlVMTCk7CisKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgfHwKKyAgICAgICAgICAgICAgKCghcENvbnRleHQtPmF1eGlsaWFyeSkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworCisgICAgaWYocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IDQ0MTAwKXsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9jb25maWd1cmUgY2FsbGluZyBtZW1jcHkiKTsKKyAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworCisgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHJSZXZlcmJfQ29uZmlndXJlIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKHBDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUpeworCisgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOworICAgICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7CisKKyAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb25maWd1cmUgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9jb25maWd1cmUiKQorICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9jb25maWd1cmUiKQorICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbmZpZ3VyZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgfWVsc2V7CisgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIEVuZCIpOworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBSZXZlcmJfY29uZmlndXJlICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBSZXZlcmJfaW5pdChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgaW50IHN0YXR1czsKKworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgc3RhcnQiKTsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKworICAgIGlmIChwQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpeworICAgICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CisgICAgfQorCisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9NT05POworICAgIH0gZWxzZSB7CisgICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOworICAgIH0KKworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CisgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOworICAgIHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKKyAgICBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOworICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gUkVWRVJCX1ZPTFVNRV9GTEFUOworCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU1RFUkVPOyAgICAgICAgICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCisgICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgICAgID0gTFZSRVZfREVMQVlMSU5FU180OworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldE1lbW9yeVRhYmxlIiwgIlJldmVyYl9pbml0IikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5ICovCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMgdGhhdCB3ZXJlCisgICAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgorICAgICAqLworICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgLSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgICAvKiBJbml0aWFsaXNlICovCisgICAgcENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOworCisgICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiUmV2ZXJiX2luaXQiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT047CisgICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTXzQ0MTAwOworCisgICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8peworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fTU9OTzsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fU1RFUkVPOworICAgIH0KKworICAgIC8qIFJldmVyYiBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLkxldmVsICAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuTFBGICAgICAgICAgICAgPSAyMzk5OTsKKyAgICBwYXJhbXMuSFBGICAgICAgICAgICAgPSA1MDsKKyAgICBwYXJhbXMuVDYwICAgICAgICAgICAgPSAxNDkwOworICAgIHBhcmFtcy5EZW5zaXR5ICAgICAgICA9IDEwMDsKKyAgICBwYXJhbXMuRGFtcGluZyAgICAgICAgPSAyMTsKKyAgICBwYXJhbXMuUm9vbVNpemUgICAgICAgPSAxMDA7CisKKyAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKHBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKKworICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAorICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAorICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgICAqLworICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCAgICA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgICAgICA9IDA7CisgICAgcENvbnRleHQtPmJFbmFibGVkICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSAgICA9IHBhcmFtcy5UNjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcGFyYW1zLkRhbXBpbmcqMjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSAgICAgID0gcGFyYW1zLlJvb21TaXplKjEwOworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAgICA9IHBhcmFtcy5EZW5zaXR5KjEwOworICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICA9IC02MDAwOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgRW5kIik7CisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIFJldmVyYl9pbml0ICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiQ29udmVydExldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENvbnZlcnQgbGV2ZWwgZnJvbSBPcGVuU0wgRVMgZm9ybWF0IHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkNvbnZlcnRMZXZlbChpbnQxNl90IGxldmVsKXsKKyAgICBzdGF0aWMgaW50MTZfdCBMZXZlbEFycmF5WzEwMV0gPQorICAgIHsKKyAgICAgICAtMTIwMDAsIC00MDAwLCAgLTMzOTgsICAtMzA0NiwgIC0yNzk2LCAgLTI2MDMsICAtMjQ0NCwgIC0yMzEwLCAgLTIxOTQsICAtMjA5MiwKKyAgICAgICAtMjAwMCwgIC0xOTE4LCAgLTE4NDIsICAtMTc3MywgIC0xNzA4LCAgLTE2NDgsICAtMTU5MiwgIC0xNTQwLCAgLTE0OTAsICAtMTQ0MywKKyAgICAgICAtMTM5OCwgIC0xMzU2LCAgLTEzMTYsICAtMTI3NywgIC0xMjQwLCAgLTEyMDUsICAtMTE3MSwgIC0xMTM4LCAgLTExMDYsICAtMTA3NiwKKyAgICAgICAtMTA0NiwgIC0xMDE4LCAgLTk5MCwgICAtOTYzLCAgIC05MzgsICAgLTkxMiwgICAtODg4LCAgIC04NjQsICAgLTg0MSwgICAtODE4LAorICAgICAgIC03OTYsICAgLTc3NSwgICAtNzU0LCAgIC03MzQsICAgLTcxNCwgICAtNjk0LCAgIC02NzUsICAgLTY1NiwgICAtNjM4LCAgIC02MjAsCisgICAgICAgLTYwMywgICAtNTg1LCAgIC01NjgsICAgLTU1MiwgICAtNTM2LCAgIC01MjAsICAgLTUwNCwgICAtNDg5LCAgIC00NzQsICAgLTQ1OSwKKyAgICAgICAtNDQ0LCAgIC00MzAsICAgLTQxNiwgICAtNDAyLCAgIC0zODgsICAgLTM3NSwgICAtMzYxLCAgIC0zNDgsICAgLTMzNSwgICAtMzIzLAorICAgICAgIC0zMTAsICAgLTI5OCwgICAtMjg2LCAgIC0yNzQsICAgLTI2MiwgICAtMjUwLCAgIC0yMzksICAgLTIyOCwgICAtMjE2LCAgIC0yMDUsCisgICAgICAgLTE5NCwgICAtMTg0LCAgIC0xNzMsICAgLTE2MiwgICAtMTUyLCAgIC0xNDIsICAgLTEzMiwgICAtMTIxLCAgIC0xMTIsICAgLTEwMiwKKyAgICAgICAtOTIsICAgIC04MiwgICAgLTczLCAgICAtNjQsICAgIC01NCwgICAgLTQ1LCAgICAtMzYsICAgIC0yNywgICAgLTE4LCAgICAtOSwKKyAgICAgICAwCisgICAgfTsKKyAgICBpbnQxNl90IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDE7IGkrKykKKyAgICB7CisgICAgICAgaWYobGV2ZWwgPD0gTGV2ZWxBcnJheVtpXSkKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkNvbnZlcnRIRkxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENvbnZlcnQgbGV2ZWwgZnJvbSBPcGVuU0wgRVMgZm9ybWF0IHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkNvbnZlcnRIZkxldmVsKGludDE2X3QgSGZsZXZlbCl7CisgICAgaW50MTZfdCBpOworCisgICAgc3RhdGljIExQRlBhaXJfdCBMUEZBcnJheVs5N10gPQorICAgIHsgICAvLyBMaW1pdCByYW5nZSB0byA1MCBmb3IgTFZSRVYgcGFyYW1ldGVyIHJhbmdlCisgICAgICAgIHstMTAwMDAsIDUwfSwgeyAtNTAwMCwgNTAgfSwgeyAtNDAwMCwgNTB9LCAgeyAtMzAwMCwgMTU4fSwgeyAtMjAwMCwgNTAyfSwKKyAgICAgICAgey0xMDAwLCAxNjY2fSx7IC05MDAsIDE4OTd9LCB7IC04MDAsIDIxNjl9LCB7IC03MDAsIDI0OTZ9LCB7IC02MDAsIDI4OTV9LAorICAgICAgICB7LTUwMCwgMzQwMH0sIHsgLTQwMCwgNDA2Nn0sIHsgLTMwMCwgNTAxMX0sIHsgLTIwMCwgNjUzN30sIHsgLTEwMCwgIDk4MjZ9LAorICAgICAgICB7LTk5LCA5ODgxIH0sIHsgLTk4LCA5OTM3IH0sIHsgLTk3LCA5OTk0IH0sIHsgLTk2LCAxMDA1Mn0sIHsgLTk1LCAxMDExMX0sCisgICAgICAgIHstOTQsIDEwMTcxfSwgeyAtOTMsIDEwMjMxfSwgeyAtOTIsIDEwMjkzfSwgeyAtOTEsIDEwMzU2fSwgeyAtOTAsIDEwNDE5fSwKKyAgICAgICAgey04OSwgMTA0ODR9LCB7IC04OCwgMTA1NDl9LCB7IC04NywgMTA2MTZ9LCB7IC04NiwgMTA2ODR9LCB7IC04NSwgMTA3NTN9LAorICAgICAgICB7LTg0LCAxMDgyM30sIHsgLTgzLCAxMDg5NX0sIHsgLTgyLCAxMDk2OH0sIHsgLTgxLCAxMTA0Mn0sIHsgLTgwLCAxMTExN30sCisgICAgICAgIHstNzksIDExMTk0fSwgeyAtNzgsIDExMjcyfSwgeyAtNzcsIDExMzUyfSwgeyAtNzYsIDExNDMzfSwgeyAtNzUsIDExNTE2fSwKKyAgICAgICAgey03NCwgMTE2MDB9LCB7IC03MywgMTE2ODZ9LCB7IC03MiwgMTE3NzR9LCB7IC03MSwgMTE4NjR9LCB7IC03MCwgMTE5NTV9LAorICAgICAgICB7LTY5LCAxMjA0OX0sIHsgLTY4LCAxMjE0NH0sIHsgLTY3LCAxMjI0Mn0sIHsgLTY2LCAxMjM0MX0sIHsgLTY1LCAxMjQ0M30sCisgICAgICAgIHstNjQsIDEyNTQ4fSwgeyAtNjMsIDEyNjU0fSwgeyAtNjIsIDEyNzYzfSwgeyAtNjEsIDEyODc1fSwgeyAtNjAsIDEyOTkwfSwKKyAgICAgICAgey01OSwgMTMxMDd9LCB7IC01OCwgMTMyMjd9LCB7IC01NywgMTMzNTF9LCB7IC01NiwgMTM0Nzd9LCB7IC01NSwgMTM2MDd9LAorICAgICAgICB7LTU0LCAxMzc0MX0sIHsgLTUzLCAxMzg3OH0sIHsgLTUyLCAxNDAxOX0sIHsgLTUxLCAxNDE2NH0sIHsgLTUwLCAxNDMxM30sCisgICAgICAgIHstNDksIDE0NDY3fSwgeyAtNDgsIDE0NjI2fSwgeyAtNDcsIDE0Nzg5fSwgeyAtNDYsIDE0OTU4fSwgeyAtNDUsIDE1MTMyfSwKKyAgICAgICAgey00NCwgMTUzMTJ9LCB7IC00MywgMTU0OTh9LCB7IC00MiwgMTU2OTF9LCB7IC00MSwgMTU4OTB9LCB7IC00MCwgMTYwOTd9LAorICAgICAgICB7LTM5LCAxNjMxMX0sIHsgLTM4LCAxNjUzNH0sIHsgLTM3LCAxNjc2Nn0sIHsgLTM2LCAxNzAwN30sIHsgLTM1LCAxNzI1OX0sCisgICAgICAgIHstMzQsIDE3NTIxfSwgeyAtMzMsIDE3Nzk1fSwgeyAtMzIsIDE4MDgxfSwgeyAtMzEsIDE4MzgxfSwgeyAtMzAsIDE4Njk2fSwKKyAgICAgICAgey0yOSwgMTkwMjd9LCB7IC0yOCwgMTkzNzV9LCB7IC0yNywgMTk3NDJ9LCB7IC0yNiwgMjAxMjl9LCB7IC0yNSwgMjA1NDB9LAorICAgICAgICB7LTI0LCAyMDk3Nn0sIHsgLTIzLCAyMTQzOX0sIHsgLTIyLCAyMTkzNH0sIHsgLTIxLCAyMjQ2M30sIHsgLTIwLCAyMzAzMX0sCisgICAgICAgIHstMTksIDIzNjQzfSwgeyAtMTgsIDIzOTk5fQorICAgIH07CisKKyAgICBmb3IoaSA9IDA7IGkgPCA5NjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoSGZsZXZlbCA8PSBMUEZBcnJheVtpXS5Sb29tX0hGKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBMUEZBcnJheVtpXS5MUEY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIEhGIGxldmVsIHRvIHRoZSBSZXZlcmIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldFJvb21IZkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tSGZMZXZlbCIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRik7CisKKyAgICBBY3RpdmVQYXJhbXMuTFBGID0gUmV2ZXJiQ29udmVydEhmTGV2ZWwobGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKQorICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICBwQ29udGV4dC0+U2F2ZWRIZkxldmVsID0gbGV2ZWw7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldEhmUm9vbUxldmVsIGVuZC4uIHNhdmluZyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXRSb29tSGZMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGxldmVsIGFwcGxpZWQgdG8gdGhlIFJldmVydmIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDE2X3QgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworICAgIGludDE2X3QgbGV2ZWw7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIHN0YXJ0LCBzYXZlZCBsZXZlbCBpcyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJvb21IZkxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKworICAgIGxldmVsID0gUmV2ZXJiQ29udmVydEhmTGV2ZWwocENvbnRleHQtPlNhdmVkSGZMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKKyAgICAvLyAgICAgImNvbnZlcnRlZCBsZXZlbDogJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwsIGxldmVsKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldFJldmVyYkxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBsZXZlbCB0byB0aGUgUmV2ZXJiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGxldmVsICAgICAgIGxldmVsIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBSZXZlcmJTZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7CisgICAgLy9MT0dWKCJcblx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSZXZlcmJMZXZlbCIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIC8vICAgICAgQ29tYmluZWRMZXZlbCwgbGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CisKKyAgICBBY3RpdmVQYXJhbXMuTGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBUcnlpbmcgdG8gc2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKQorICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgZW5kIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIGlzICVkXG5cbiIsCisgICAgLy8gICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkdldFJldmVyYkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKKyAgICBpbnQxNl90IGxldmVsOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBzdGFydCIpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJldmVyYkxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgLy8gbmVlZHMgdG8gc3VidHJhY3QgbWF4IGxldmVscyBmb3IgYm90aCBSb29tTGV2ZWwgYW5kIFJldmVyYkxldmVsCisgICAgQ29tYmluZWRMZXZlbCA9IChwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCArIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCktTFZSRVZfTUFYX1JFVkVSQl9MRVZFTDsKKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIC8vQ29tYmluZWRMZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CisgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKTogQWN0aXZlUGFyYW1zLkxldmVsOiAlZCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWw6ICVkLCAiCisgICAgLy8icENvbnRleHQtPlNhdmVkUm9vbUxldmVsOiAlZCwgQ29tYmluZWRMZXZlbDogJWQsIGNvbnZlcnRlZCBsZXZlbDogJWRcbiIsCisgICAgLy9BY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwgQ29tYmluZWRMZXZlbCxsZXZlbCk7CisKKyAgICBpZihBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJldmVyYkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBlbmRcbiIpOworCisgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldFJvb21MZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgbGV2ZWwgdG8gdGhlIFJldmVyYi4gTXVzdCBmaXJzdCBiZSBjb252ZXJ0ZWQgdG8gTFZNIGZvcm1hdAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBsZXZlbCAgICAgICBsZXZlbCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiU2V0Um9vbUxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIGVuZCIpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXRSb29tTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgaW50MTZfdCBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIHN0YXJ0Iik7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLUxWUkVWX01BWF9SRVZFUkJfTEVWRUwpOworICAgIGxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOworCisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCwgTGV2ZWwgPSAlZCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gJWQsICIKKyAgICAvLyAgICAgInBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsID0gJWQsIENvbWJpbmVkTGV2ZWwgPSAlZCwgbGV2ZWwgPSAlZCIsCisgICAgLy8gICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsLAorICAgIC8vICAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCwgQ29tYmluZWRMZXZlbCwgbGV2ZWwpOworCisgICAgaWYoQWN0aXZlUGFyYW1zLkxldmVsICE9IGxldmVsKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgZW5kIik7CisgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJTZXREZWNheVRpbWUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIGRlY2F5IHRpbWUgdG8gdGhlIFJldmVyYi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgdGltZSAgICAgICAgZGVjYXkgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgdGltZSl7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOworCisgICAgaWYgKHRpbWUgPD0gTFZSRVZfTUFYX1Q2MCkgeworICAgICAgICBBY3RpdmVQYXJhbXMuVDYwID0gKExWTV9VSU5UMTYpdGltZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5UNjAgPSBMVlJFVl9NQVhfVDYwOworICAgIH0KKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5VGltZSIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKworICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPSAoQWN0aXZlUGFyYW1zLlQ2MCAqIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlKS8xMDAwOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCBTYW1wbGVzVG9FeGl0Q291bnQtPiAlZFxuIixwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUgPSAoaW50MTZfdCl0aW1lOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgZW5kIik7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkdldERlY2F5VGltZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlY2F5IHRpbWUgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBzdGFydCIpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5VGltZSIpCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5UNjAgIT0gcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKXsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGRlY2F5IHRpbWUgaXMgc2V0IHRvIG1vcmUgdGhhbiA3MDAwCisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiR2V0RGVjYXlUaW1lKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgQWN0aXZlUGFyYW1zLlQ2MCwgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKTsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lIGVuZCIpOworICAgIHJldHVybiAodWludDMyX3QpQWN0aXZlUGFyYW1zLlQ2MDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJTZXREZWNheUhmUmF0aW8oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIEhGIGRlY2F5IHJhdGlvIHRvIHRoZSBSZXZlcmIuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHJhdGlvICAgICAgIHJhdGlvIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBSZXZlcmJTZXREZWNheUhmUmF0aW8oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgcmF0aW8peworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW9lIHN0YXJ0ICglZCkiLCByYXRpbyk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5SGZSYXRpbyIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbyBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisKKyAgICBBY3RpdmVQYXJhbXMuRGFtcGluZyA9IChMVk1fSU5UMTYpKHJhdGlvLzIwKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5SGZSYXRpbyIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW8gPSByYXRpbzsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIGVuZCIpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXREZWNheUhmUmF0aW8oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBIRiBkZWNheSByYXRpbyBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBSZXZlcmJHZXREZWNheUhmUmF0aW8oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gc3RhcnQiKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0RGVjYXlIZlJhdGlvIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5EYW1waW5nICE9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyAvIDIwKSl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgQWN0aXZlUGFyYW1zLkRhbXBpbmcsIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyk7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbyBlbmQiKTsKKyAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldERpZmZ1c2lvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgZGlmZnVzaW9uIHRvIHRoZSBSZXZlcmIuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGxldmVsICAgICAgICBkZWNheSB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiU2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKworICAgIEFjdGl2ZVBhcmFtcy5EZW5zaXR5ID0gKExWTV9JTlQxNikobGV2ZWwvMTApOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IGxldmVsOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gZW5kIik7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkdldERpZmZ1c2lvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlY2F5IHRpbWUgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgUmV2ZXJiR2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIHN0YXJ0Iik7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBUZW1wOworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERpZmZ1c2lvbiIpCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworCisgICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbi8xMCk7CisKKyAgICBpZihBY3RpdmVQYXJhbXMuRGVuc2l0eSAhPSBUZW1wKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREaWZmdXNpb24gaW52YWxpZCB2YWx1ZSAlZCAlZCIsIFRlbXAsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREaWZmdXNpb247Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiU2V0RGVuc2l0eSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgZGVuc2l0eSBsZXZlbCB0aGUgUmV2ZXJiLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBsZXZlbCAgICAgICAgZGVjYXkgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldERlbnNpdHkoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpeworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVuc2l0eSIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlbnNpdHkgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworCisgICAgQWN0aXZlUGFyYW1zLlJvb21TaXplID0gKExWTV9JTlQxNikoKChsZXZlbCAqIDk5KSAvIDEwMDApICsgMSk7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZW5zaXR5IikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKworICAgIHBDb250ZXh0LT5TYXZlZERlbnNpdHkgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBlbmQiKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiR2V0RGVuc2l0eSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlbnNpdHkgbGV2ZWwgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgUmV2ZXJiR2V0RGVuc2l0eShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlbnNpdHkgc3RhcnQiKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFRlbXA7CisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlbnNpdHkiKQorICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworCisKKyAgICBUZW1wID0gKExWTV9JTlQxNikoKChwQ29udGV4dC0+U2F2ZWREZW5zaXR5ICogOTkpIC8gMTAwMCkgKyAxKTsKKworICAgIGlmKFRlbXAgIT0gQWN0aXZlUGFyYW1zLlJvb21TaXplKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZW5zaXR5IGludmFsaWQgdmFsdWUgJWQgJWQiLCBUZW1wLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREZW5zaXR5OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYl9Mb2FkUHJlc2V0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIExvYWQgYSB0aGUgbmV4dCBwcmVzZXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLworLy8gT3V0cHV0czoKKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCkKK3sKKyAgICAvL1RPRE86IGFkZCByZWZsZWN0aW9ucyBkZWxheSwgbGV2ZWwgYW5kIHJldmVyYiBkZWxheSB3aGVuIGVhcmx5IHJlZmxlY3Rpb25zIGFyZQorICAgIC8vIGltcGxlbWVudGVkCisgICAgcENvbnRleHQtPmN1clByZXNldCA9IHBDb250ZXh0LT5uZXh0UHJlc2V0OworCisgICAgaWYgKHBDb250ZXh0LT5jdXJQcmVzZXQgIT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisgICAgICAgIGNvbnN0IHRfcmV2ZXJiX3NldHRpbmdzICpwcmVzZXQgPSAmc1JldmVyYlByZXNldHNbcENvbnRleHQtPmN1clByZXNldF07CisgICAgICAgIFJldmVyYlNldFJvb21MZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yb29tTGV2ZWwpOworICAgICAgICBSZXZlcmJTZXRSb29tSGZMZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yb29tSEZMZXZlbCk7CisgICAgICAgIFJldmVyYlNldERlY2F5VGltZShwQ29udGV4dCwgcHJlc2V0LT5kZWNheVRpbWUpOworICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHByZXNldC0+ZGVjYXlIRlJhdGlvKTsKKyAgICAgICAgLy9yZWZsZWN0aW9uc0xldmVsCisgICAgICAgIC8vcmVmbGVjdGlvbnNEZWxheQorICAgICAgICBSZXZlcmJTZXRSZXZlcmJMZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yZXZlcmJMZXZlbCk7CisgICAgICAgIC8vIHJldmVyYkRlbGF5CisgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcHJlc2V0LT5kaWZmdXNpb24pOworICAgICAgICBSZXZlcmJTZXREZW5zaXR5KHBDb250ZXh0LCBwcmVzZXQtPmRlbnNpdHkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiX2dldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgYSBSZXZlcmIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0ICAgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKyAgICBjaGFyICpuYW1lOworICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKKworICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKKyAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKKyAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9QUkVTRVQsIHByZXNldCAlZCIsIHBDb250ZXh0LT5uZXh0UHJlc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUxICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEyICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUzICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNCAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNSAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTYgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNyAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU4ICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTkgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMTAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih0X3JldmVyYl9zZXR0aW5ncykpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTExICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsID0gUmV2ZXJiR2V0Um9vbUhmTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5VGltZSA9IFJldmVyYkdldERlY2F5VGltZShwQ29udGV4dCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0xldmVsID0gMDsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5ID0gMDsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheSA9IDA7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiTGV2ZWwgPSBSZXZlcmJHZXRSZXZlcmJMZXZlbChwQ29udGV4dCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGlmZnVzaW9uID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5ID0gUmV2ZXJiR2V0RGVuc2l0eShwQ29udGV4dCk7CisKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJvb21MZXZlbCAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcm9vbUhGTGV2ZWwgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlY2F5VGltZSAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheVRpbWUpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGVjYXlIRlJhdGlvICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5SEZSYXRpbyk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZWZsZWN0aW9uc0xldmVsICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbCk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZWZsZWN0aW9uc0RlbGF5ICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheSk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJEZWxheSAgICAgICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiRGVsYXkpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmV2ZXJiTGV2ZWwgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkxldmVsKTsKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRpZmZ1c2lvbiAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGVuc2l0eSAgICAgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlbnNpdHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21MZXZlbChwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21IZkxldmVsKHBDb250ZXh0KTsKKworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERlY2F5VGltZShwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZWNheUhmUmF0aW8ocENvbnRleHQpOworCisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJldmVyYkxldmVsKHBDb250ZXh0KTsKKworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERpZmZ1c2lvbihwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZW5zaXR5KHBDb250ZXh0KTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFTlNJVFkgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFJldmVyYl9nZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfc2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIFNldCBhIFJldmVyYiBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQxNl90IGxldmVsOworICAgIGludDE2X3QgcmF0aW87CisgICAgdWludDMyX3QgdGltZTsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOworCisgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICBpZiAocGFyYW0gIT0gUkVWRVJCX1BBUkFNX1BSRVNFVCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICB1aW50MTZfdCBwcmVzZXQgPSAqKHVpbnQxNl90ICopcFZhbHVlOworICAgICAgICBMT0dWKCJzZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgcHJlc2V0KTsKKyAgICAgICAgaWYgKHByZXNldCA+IFJFVkVSQl9QUkVTRVRfTEFTVCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm5leHRQcmVzZXQgPSBwcmVzZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMiKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKyAgICAgICAgICAgIFJldmVyYlNldFJvb21MZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CisgICAgICAgICAgICBSZXZlcmJTZXRSb29tSGZMZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKKyAgICAgICAgICAgIFJldmVyYlNldERlY2F5VGltZShwQ29udGV4dCwgcFByb3BlcnRpZXMtPmRlY2F5VGltZSk7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW8pOworICAgICAgICAgICAgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbCk7CisgICAgICAgICAgICBSZXZlcmJTZXREaWZmdXNpb24ocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOworICAgICAgICAgICAgUmV2ZXJiU2V0RGVuc2l0eShwQ29udGV4dCwgcFByb3BlcnRpZXMtPmRlbnNpdHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CisgICAgICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21MZXZlbCIpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21IZkxldmVsIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgdGltZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIHZhbHVlIGlzICVkIiwgdGltZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8gdmFsdWUgaXMgJWQiLCByYXRpbyk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlY2F5SGZSYXRpbyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSZXZlcmJMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJldmVyYkxldmVsIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREaWZmdXNpb24iKTsKKyAgICAgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcmF0aW8pOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGlmZnVzaW9uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfREVOU0lUWSB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICBSZXZlcmJTZXREZW5zaXR5KHBDb250ZXh0LCByYXRpbyk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFJldmVyYl9zZXRQYXJhbWV0ZXIgKi8KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLworZXh0ZXJuICJDIiBpbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOworICAgIGludCAgICBzdGF0dXMgPSAwOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKKyAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX3Byb2Nlc3MoKSBFUlJPUiBOVUxMIElOUFVUIFBPSU5URVIgT1IgRlJBTUUgQ09VTlQgSVMgV1JPTkciKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIC8vTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCisgICAgc3RhdHVzID0gcHJvY2VzcyggICAgKExWTV9JTlQxNiAqKWluQnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKW91dEJ1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKworICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgeworICAgICAgICAgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9ICAgLyogZW5kIFJldmVyYl9wcm9jZXNzICovCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLworZXh0ZXJuICJDIiBpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90ICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKXsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisKKyAgICBzd2l0Y2ggKGNtZENvZGUpeworICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9JTklUIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfQ09ORklHVVJFIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocENtZERhdGEgICAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCl8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgID09IE5VTEx8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfQ09ORklHVVJFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFJldmVyYl9jb25maWd1cmUocENvbnRleHQsIChlZmZlY3RfY29uZmlnX3QgKikgcENtZERhdGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgorICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX1JFU0VUIHN0YXJ0Iik7CisgICAgICAgICAgICBSZXZlcmJfY29uZmlndXJlKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisKKyAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlJldmVyYl9nZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisKKyAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOworCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06eworCisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOworCisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCAoY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKQorICAgICAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSAoaW50KXNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdDRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9MT0dWKCJcdG41UmV2ZXJiX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCisgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKKyAgICAgICAgICAgIC8vICAgICAgICAiXG4iLAorICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOworCisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRSBzdGFydCIpOworCisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1ItRWZmZWN0IGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgcENvbnRleHQtPmJFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVGRkVDVF9DTURfRU5BQkxFIikKKyAgICAgICAgICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPQorICAgICAgICAgICAgICAgICAgICAoQWN0aXZlUGFyYW1zLlQ2MCAqIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlKS8xMDAwOworICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgZm9yIGZpcnN0IGJ1ZmZlciBwcm9jZXNzZWQgYWZ0ZXIgZW5hYmxpbmcgdGhlIGVmZmVjdAorICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPSBhbmRyb2lkOjpSRVZFUkJfVk9MVU1FX0ZMQVQ7CisgICAgICAgICAgICAvL0xPR1YoIlx0RUZGRUNUX0NNRF9FTkFCTEUgU2FtcGxlc1RvRXhpdENvdW50ID0gJWQiLCBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUi1FZmZlY3QgaXMgbm90IHlldCBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+YkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IE5VTEwpIHsgLy8gd2UgaGF2ZSB2b2x1bWUgY29udHJvbAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gKExWTV9JTlQxNikoKCoodWludDMyX3QgKilwQ21kRGF0YSArICgxIDw8IDExKSkgPj4gMTIpOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSA9IChMVk1fSU5UMTYpKCgqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMSkgKyAoMSA8PCAxMSkpID4+IDEyKTsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9ICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9ICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnZvbHVtZU1vZGUgPT0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgZm9yIGZpcnN0IGJ1ZmZlciBwcm9jZXNzZWQgYWZ0ZXIgZ2V0dGluZyB2b2x1bWUgY29udHJvbAorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IGFuZHJvaWQ6OlJFVkVSQl9WT0xVTUVfRkxBVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB3ZSBkb24ndCBoYXZlIHZvbHVtZSBjb250cm9sCisgICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9PRkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dWKCJFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgbGVmdCAlZCwgcmlnaHQgJWQgbW9kZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lLCBwQ29udGV4dC0+cmlnaHRWb2x1bWUsICBwQ29udGV4dC0+dm9sdW1lTW9kZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfREVWSUNFL0VGRkVDVF9DTURfU0VUX1ZPTFVNRS9FRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFIHN0YXJ0Iik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgIkRFRkFVTFQgc3RhcnQgJWQgRVJST1IiLGNtZENvZGUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGVuZFxuXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIFJldmVyYl9jb21tYW5kICovCisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFJldmVyYiBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1JldmVyYkludGVyZmFjZSA9IHsKKyAgICBSZXZlcmJfcHJvY2VzcywKKyAgICBSZXZlcmJfY29tbWFuZAorfTsgICAgLyogZW5kIGdSZXZlcmJJbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM5OTJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OVU1fQkFORFMgICAgICAgICAgIDUKKyNkZWZpbmUgTUFYX0NBTExfU0laRSAgICAgICAgICAgMjU2CisjZGVmaW5lIExWUkVWX01BWF9UNjAgICAgICAgICAgIDcwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1JFVkVSQl9MRVZFTCAgMjAwMAorI2RlZmluZSBMVlJFVl9NQVhfRlJBTUVfU0laRSAgICAyNTYwCisjZGVmaW5lIExWUkVWX0NVUF9MT0FEX0FSTTlFICAgIDQ3MCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgTFZSRVZfTUVNX1VTQUdFICAgICAgICAgNzErKExWUkVWX01BWF9GUkFNRV9TSVpFPj43KSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCisvLyNkZWZpbmUgTFZNX1BDTQorCit0eXBlZGVmIHN0cnVjdCBfTFBGUGFpcl90Cit7CisgICAgaW50MTZfdCBSb29tX0hGOworICAgIGludDE2X3QgTFBGOworfSBMUEZQYWlyX3Q7CisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUUkVWRVJCX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18gYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTcxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0wLDAgKzEsNjYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIFRlc3QgUmV2ZXJiIGxpYnJhcnkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJRWZmZWN0UmV2ZXJiLmMuYXJtIFwKKwlFZmZlY3RzTWF0aC5jLmFybQorTE9DQUxfQ0ZMQUdTKz0gLU8yCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscworCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJidGVzdAorCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMgVGVzdCBFcXVhbGl6ZXIgbGlicmFyeQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlFZmZlY3RzTWF0aC5jLmFybSBcCisJRWZmZWN0RXF1YWxpemVyLmNwcCBcCisJQXVkaW9CaXF1YWRGaWx0ZXIuY3BwLmFybSBcCisJQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmNwcC5hcm0gXAorCUF1ZGlvUGVha2luZ0ZpbHRlci5jcHAuYXJtIFwKKwlBdWRpb1NoZWx2aW5nRmlsdGVyLmNwcC5hcm0gXAorCUF1ZGlvRXF1YWxpemVyLmNwcC5hcm0KKworTE9DQUxfQ0ZMQUdTKz0gLU8yCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscworCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorTE9DQUxfTU9EVUxFOj0gbGliZXF1YWxpemVydGVzdAorCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9CaXF1YWRGaWx0ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0JpcXVhZEZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MTdhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9CaXF1YWRGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvKiAvL2RldmljZS9zZXJ2ZXJzL0F1ZGlvRmxpbmdlci9BdWRpb0JpcXVhZEZpbHRlci5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiQXVkaW9CaXF1YWRGaWx0ZXIuaCIKKworI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQorI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGF1ZGlvX2NvZWZfdCBBdWRpb0JpcXVhZEZpbHRlcjo6SURFTlRJVFlfQ09FRlNbQXVkaW9CaXF1YWRGaWx0ZXI6Ok5VTV9DT0VGU10gPSB7IEFVRElPX0NPRUZfT05FLCAwLCAwLCAwLCAwIH07CisKK0F1ZGlvQmlxdWFkRmlsdGVyOjpBdWRpb0JpcXVhZEZpbHRlcihpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSkgeworICAgIGNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OmNvbmZpZ3VyZShpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSkgeworICAgIGFzc2VydChuQ2hhbm5lbHMgPiAwICYmIG5DaGFubmVscyA8PSBNQVhfQ0hBTk5FTFMpOworICAgIGFzc2VydChzYW1wbGVSYXRlID4gMCk7CisgICAgbU51bUNoYW5uZWxzICA9IG5DaGFubmVsczsKKyAgICBtTWF4RGVsdGEgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihNQVhfREVMVEFfUEVSX1NFQykKKyAgICAgICAgICAgICAgICAqIEFVRElPX0NPRUZfT05FCisgICAgICAgICAgICAgICAgLyBzYW1wbGVSYXRlOworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnJlc2V0KCkgeworICAgIG1lbWNweShtQ29lZnMsIElERU5USVRZX0NPRUZTLCBzaXplb2YobUNvZWZzKSk7CisgICAgbUNvZWZEaXJ0eUJpdHMgPSAwOworICAgIHNldFN0YXRlKFNUQVRFX0JZUEFTUyk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OmNsZWFyKCkgeworICAgIG1lbXNldChtRGVsYXlzLCAwLCBzaXplb2YobURlbGF5cykpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpzZXRDb2Vmcyhjb25zdCBhdWRpb19jb2VmX3QgY29lZnNbTlVNX0NPRUZTXSwgYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBtZW1jcHkobVRhcmdldENvZWZzLCBjb2Vmcywgc2l6ZW9mKG1UYXJnZXRDb2VmcykpOworICAgIGlmIChtU3RhdGUgJiBTVEFURV9FTkFCTEVEX01BU0spIHsKKyAgICAgICAgaWYgKFVOTElLRUxZKGltbWVkaWF0ZSkpIHsKKyAgICAgICAgICAgIG1lbWNweShtQ29lZnMsIGNvZWZzLCBzaXplb2YobUNvZWZzKSk7CisgICAgICAgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0U3RhdGUoU1RBVEVfVFJBTlNJVElPTl9UT19OT1JNQUwpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90IGluW10sIGF1ZGlvX3NhbXBsZV90IG91dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworICAgICh0aGlzLT4qbUN1clByb2Nlc3NGdW5jKShpbiwgb3V0LCBmcmFtZUNvdW50KTsKK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6ZW5hYmxlKGJvb2wgaW1tZWRpYXRlKSB7CisgICAgaWYgKFVOTElLRUxZKGltbWVkaWF0ZSkpIHsKKyAgICAgICAgbWVtY3B5KG1Db2VmcywgbVRhcmdldENvZWZzLCBzaXplb2YobUNvZWZzKSk7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX05PUk1BTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfVFJBTlNJVElPTl9UT19OT1JNQUwpOworICAgIH0KK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6ZGlzYWJsZShib29sIGltbWVkaWF0ZSkgeworICAgIGlmIChVTkxJS0VMWShpbW1lZGlhdGUpKSB7CisgICAgICAgIG1lbWNweShtQ29lZnMsIElERU5USVRZX0NPRUZTLCBzaXplb2YobUNvZWZzKSk7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX0JZUEFTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfVFJBTlNJVElPTl9UT19CWVBBU1MpOworICAgIH0KK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6c2V0U3RhdGUoc3RhdGVfdCBzdGF0ZSkgeworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIFNUQVRFX0JZUEFTUzoKKyAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc19ieXBhc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX1RSQU5TSVRJT05fVE9fQllQQVNTOgorICAgICAgaWYgKG1OdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX2J5cGFzc19tb25vOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1clByb2Nlc3NGdW5jID0gJkF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX3RyYW5zaXRpb25fYnlwYXNzX211bHRpOworICAgICAgfQorICAgICAgbUNvZWZEaXJ0eUJpdHMgPSAoMSA8PCBOVU1fQ09FRlMpIC0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfVFJBTlNJVElPTl9UT19OT1JNQUw6CisgICAgICBpZiAobU51bUNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgbUN1clByb2Nlc3NGdW5jID0gJkF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX3RyYW5zaXRpb25fbm9ybWFsX21vbm87CisgICAgICB9IGVsc2UgeworICAgICAgICBtQ3VyUHJvY2Vzc0Z1bmMgPSAmQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfdHJhbnNpdGlvbl9ub3JtYWxfbXVsdGk7CisgICAgICB9CisgICAgICBtQ29lZkRpcnR5Qml0cyA9ICgxIDw8IE5VTV9DT0VGUykgLSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9OT1JNQUw6CisgICAgICBpZiAobU51bUNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgbUN1clByb2Nlc3NGdW5jID0gJkF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX25vcm1hbF9tb25vOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1clByb2Nlc3NGdW5jID0gJkF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX25vcm1hbF9tdWx0aTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBtU3RhdGUgPSBzdGF0ZTsKK30KKworYm9vbCBBdWRpb0JpcXVhZEZpbHRlcjo6dXBkYXRlQ29lZnMoY29uc3QgYXVkaW9fY29lZl90IGNvZWZzW05VTV9DT0VGU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworICAgIGludDY0X3QgbWF4RGVsdGEgPSBtTWF4RGVsdGEgKiBmcmFtZUNvdW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0NPRUZTOyArK2kpIHsKKyAgICAgICAgaWYgKG1Db2VmRGlydHlCaXRzICYgKDE8PGkpKSB7CisgICAgICAgICAgICBhdWRpb19jb2VmX3QgZGlmZiA9IGNvZWZzW2ldIC0gbUNvZWZzW2ldOworICAgICAgICAgICAgaWYgKGRpZmYgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgICAgIG1Db2Vmc1tpXSArPSBtYXhEZWx0YTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8IC1tYXhEZWx0YSkgeworICAgICAgICAgICAgICAgIG1Db2Vmc1tpXSAtPSBtYXhEZWx0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZWZzW2ldID0gY29lZnNbaV07CisgICAgICAgICAgICAgICAgbUNvZWZEaXJ0eUJpdHMgXj0gKDE8PGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ29lZkRpcnR5Qml0cyA9PSAwOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX2J5cGFzcyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworICAgIC8vIFRoZSBjb21tb24gY2FzZSBpcyBpbi1wbGFjZSBwcm9jZXNzaW5nLCBiZWNhdXNlIHRoaXMgaXMgd2hhdCB0aGUgRVEgZG9lcy4KKyAgICBpZiAoVU5MSUtFTFkoaW4gIT0gb3V0KSkgeworICAgICAgICBtZW1jcHkob3V0LCBpbiwgZnJhbWVDb3VudCAqIG1OdW1DaGFubmVscyAqIHNpemVvZihhdWRpb19zYW1wbGVfdCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc19ub3JtYWxfbW9ubyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICBzaXplX3QgbkZyYW1lcyA9IGZyYW1lQ291bnQ7CisgICAgYXVkaW9fc2FtcGxlX3QgeDEgPSBtRGVsYXlzWzBdWzBdOworICAgIGF1ZGlvX3NhbXBsZV90IHgyID0gbURlbGF5c1swXVsxXTsKKyAgICBhdWRpb19zYW1wbGVfdCB5MSA9IG1EZWxheXNbMF1bMl07CisgICAgYXVkaW9fc2FtcGxlX3QgeTIgPSBtRGVsYXlzWzBdWzNdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBiMCA9IG1Db2Vmc1swXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYjEgPSBtQ29lZnNbMV07CisgICAgY29uc3QgYXVkaW9fY29lZl90IGIyID0gbUNvZWZzWzJdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBhMSA9IG1Db2Vmc1szXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYTIgPSBtQ29lZnNbNF07CisgICAgd2hpbGUgKG5GcmFtZXMtLSA+IDApIHsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeDAgPSAqKGluKyspOworICAgICAgICBhdWRpb19jb2VmX3NhbXBsZV9hY2NfdCBhY2M7CisgICAgICAgIGFjYyA9IG11bF9jb2VmX3NhbXBsZShiMCwgeDApOworICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYjEsIHgxLCBhY2MpOworICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYjIsIHgyLCBhY2MpOworICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYTEsIHkxLCBhY2MpOworICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYTIsIHkyLCBhY2MpOworICAgICAgICBhdWRpb19zYW1wbGVfdCB5MCA9IGNvZWZfc2FtcGxlX2FjY190b19zYW1wbGUoYWNjKTsKKyAgICAgICAgeTIgPSB5MTsKKyAgICAgICAgeTEgPSB5MDsKKyAgICAgICAgeDIgPSB4MTsKKyAgICAgICAgeDEgPSB4MDsKKyAgICAgICAgKCpvdXQrKykgPSB5MDsKKyAgICB9CisgICAgbURlbGF5c1swXVswXSA9IHgxOworICAgIG1EZWxheXNbMF1bMV0gPSB4MjsKKyAgICBtRGVsYXlzWzBdWzJdID0geTE7CisgICAgbURlbGF5c1swXVszXSA9IHkyOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX3RyYW5zaXRpb25fbm9ybWFsX21vbm8oY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworICAgIGlmICh1cGRhdGVDb2VmcyhtVGFyZ2V0Q29lZnMsIGZyYW1lQ291bnQpKSB7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX05PUk1BTCk7CisgICAgfQorICAgIHByb2Nlc3Nfbm9ybWFsX21vbm8oaW4sIG91dCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfdHJhbnNpdGlvbl9ieXBhc3NfbW9ubyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSAgeworICBpZiAodXBkYXRlQ29lZnMoSURFTlRJVFlfQ09FRlMsIGZyYW1lQ291bnQpKSB7CisgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICB9CisgIHByb2Nlc3Nfbm9ybWFsX21vbm8oaW4sIG91dCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3Nfbm9ybWFsX211bHRpKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSB7CisgICAgY29uc3QgYXVkaW9fY29lZl90IGIwID0gbUNvZWZzWzBdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBiMSA9IG1Db2Vmc1sxXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYjIgPSBtQ29lZnNbMl07CisgICAgY29uc3QgYXVkaW9fY29lZl90IGExID0gbUNvZWZzWzNdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBhMiA9IG1Db2Vmc1s0XTsKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgbU51bUNoYW5uZWxzOyArK2NoKSB7CisgICAgICAgIHNpemVfdCBuRnJhbWVzID0gZnJhbWVDb3VudDsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeDEgPSBtRGVsYXlzW2NoXVswXTsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeDIgPSBtRGVsYXlzW2NoXVsxXTsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeTEgPSBtRGVsYXlzW2NoXVsyXTsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeTIgPSBtRGVsYXlzW2NoXVszXTsKKyAgICAgICAgd2hpbGUgKG5GcmFtZXMtLSA+IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90IHgwID0gKmluOworICAgICAgICAgICAgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgYWNjOworICAgICAgICAgICAgYWNjID0gbXVsX2NvZWZfc2FtcGxlKGIwLCB4MCk7CisgICAgICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYjEsIHgxLCBhY2MpOworICAgICAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGIyLCB4MiwgYWNjKTsKKyAgICAgICAgICAgIGFjYyA9IG1hY19jb2VmX3NhbXBsZShhMSwgeTEsIGFjYyk7CisgICAgICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYTIsIHkyLCBhY2MpOworICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgeTAgPSBjb2VmX3NhbXBsZV9hY2NfdG9fc2FtcGxlKGFjYyk7CisgICAgICAgICAgICB5MiA9IHkxOworICAgICAgICAgICAgeTEgPSB5MDsKKyAgICAgICAgICAgIHgyID0geDE7CisgICAgICAgICAgICB4MSA9IHgwOworICAgICAgICAgICAgKm91dCA9IHkwOworICAgICAgICAgICAgaW4gKz0gbU51bUNoYW5uZWxzOworICAgICAgICAgICAgb3V0ICs9IG1OdW1DaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBtRGVsYXlzW2NoXVswXSA9IHgxOworICAgICAgICBtRGVsYXlzW2NoXVsxXSA9IHgyOworICAgICAgICBtRGVsYXlzW2NoXVsyXSA9IHkxOworICAgICAgICBtRGVsYXlzW2NoXVszXSA9IHkyOworICAgICAgICBpbiAtPSBmcmFtZUNvdW50ICogbU51bUNoYW5uZWxzIC0gMTsKKyAgICAgICAgb3V0IC09IGZyYW1lQ291bnQgKiBtTnVtQ2hhbm5lbHMgLSAxOworICAgIH0KK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX25vcm1hbF9tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICBpZiAodXBkYXRlQ29lZnMobVRhcmdldENvZWZzLCBmcmFtZUNvdW50KSkgeworICAgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICAgIH0KKyAgICBwcm9jZXNzX25vcm1hbF9tdWx0aShpbiwgb3V0LCBmcmFtZUNvdW50KTsKK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX2J5cGFzc19tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpICB7CisgICAgaWYgKHVwZGF0ZUNvZWZzKElERU5USVRZX0NPRUZTLCBmcmFtZUNvdW50KSkgeworICAgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICAgIH0KKyAgICBwcm9jZXNzX25vcm1hbF9tdWx0aShpbiwgb3V0LCBmcmFtZUNvdW50KTsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0JpcXVhZEZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0JpcXVhZEZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGUyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQmlxdWFkRmlsdGVyLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qIC8vZGV2aWNlL2luY2x1ZGUvc2VydmVyL0F1ZGlvRmxpbmdlci9BdWRpb0JpcXVhZEZpbHRlci5oCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19CSVFVQURfRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19CSVFVQURfRklMVEVSX0gKKworI2luY2x1ZGUgIkF1ZGlvQ29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIEEgYmlxdWFkIGZpbHRlci4KKy8vIEltcGxlbWVudHMgdGhlIHJlY3Vyc2lvbiB5W25dPWEwKnlbbi0xXSthMSp5W24tMl0rYjAqeFtuXStiMSp4W24tMV0rYjIqeFtuLTJdCisvLyAodGhlIGEwIGFuZCBhMSBjb2VmZmljaWVudHMgaGF2ZSBhbiBvcHBvc2l0ZSBzaWduIHRvIHRoZSBjb21tb24gY29udmVudGlvbikKKy8vIFRoZSBmaWx0ZXIgd29ya3Mgb24gZml4ZWQgc2l6ZWQgYmxvY2tzIG9mIGRhdGEgKGZyYW1lQ291bnQgbXVsdGktY2hhbm5lbAorLy8gc2FtcGxlcywgYXMgZGVmaW5lZCBkdXJpbmcgY29uc3RydWN0aW9uKS4gQW4gYXJiaXRyYXJ5IG51bWJlciBvZiBpbnRlcmxhY2VkCisvLyBjaGFubmVscyBpcyBzdXBwb3J0ZWQuCisvLyBGaWx0ZXIgY2FuIG9wZXJhdGUgaW4gYW4gZW5hYmxlZCAoYWN0aXZlKSBvciBkaXNhYmxlZCAoYnlwYXNzZWQpIHN0YXRlcy4KKy8vIEEgbWVjaGFuaXNtIGZvciBzdXBwcmVzc2lvbiBvZiBhcnRpZmFjdHMgY2F1c2VkIGJ5IGFicnVwdCBjb2VmZmljaWVudCBjaGFuZ2VzCisvLyBpcyBpbXBsZW1lbnRlZDogbm9ybWFsbHksIHdoZW4gdGhlIGVuYWJsZSgpLCBkaXNhYmxlKCkgYW5kIHNldENvZWZzKCkgbWV0aG9kcworLy8gYXJlIGNhbGxlZCB3aXRob3V0IHRoZSBpbW1lZGlhdGUgZmxhZyBzZXQsIHRoZSBmaWx0ZXIgc21vb3RobHkgdHJhbnNpdGlvbnMKKy8vIGZyb20gaXRzIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGRlc2lyZWQgc3RhdGUuCitjbGFzcyBBdWRpb0JpcXVhZEZpbHRlciB7CitwdWJsaWM6CisgICAgLy8gTWF4IG51bWJlciBvZiBjaGFubmVscyAoY2FuIGJlIGNoYW5nZWQgaGVyZSwgYW5kIGV2ZXJ5dGhpbmcgc2hvdWxkIHdvcmspLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NIQU5ORUxTID0gMjsKKyAgICAvLyBOdW1iZXIgb2YgY29lZmZpY2llbnRzLgorICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX0NPRUZTID0gNTsKKworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vIG5DaGFubmVscyAgICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzLgorICAgIC8vIHNhbXBsZVJhdGUgICBTYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgQXVkaW9CaXF1YWRGaWx0ZXIoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpOworCisgICAgLy8gUmVjb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIuIEltcGxpZXMgY2xlYXIoKS4KKyAgICAvLyBuQ2hhbm5lbHMgICAgTnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscy4KKyAgICAvLyBzYW1wbGVSYXRlICAgU2FtcGxlIHJhdGUsIGluIEh6LgorICAgIHZvaWQgY29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGZpbHRlci4KKyAgICAvLyBDb2VmZmljaWVudHMgYXJlIHJlc2V0IHRvIGlkZW50aXR5LCBzdGF0ZSBiZWNvbWVzIGRpc2FibGVkLiBUaGlzIGNoYW5nZQorICAgIC8vIGhhcHBlbnMgaW1tZWRpYXRlbHkgYW5kIG1pZ2h0IGNhdXNlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgb3V0cHV0LgorICAgIC8vIERlbGF5IGxpbmVzIGFyZSBub3QgY2xlYXJlZC4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBDbGVhcnMgdGhlIGRlbGF5IGxpbmVzLgorICAgIC8vIFRoaXMgY2hhbmdlIGhhcHBlbnMgaW1tZWRpYXRlbHkgYW5kIG1pZ2h0IGNhdXNlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUKKyAgICAvLyBvdXRwdXQuCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gU2V0cyB0aGUgY29lZmZpY2llbnRzLgorICAgIC8vIElmIGNhbGxlZCB3aGVuIGZpbHRlciBpcyBkaXNhYmxlZCwgd2lsbCBoYXZlIG5vIGltbWVkaWF0ZSBlZmZlY3QsIGJ1dCB0aGUKKyAgICAvLyBuZXcgY29lZmZpY2llbnRzIHdpbGwgYmUgc2V0IGFuZCB1c2VkIG5leHQgdGltZSB0aGUgZmlsdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gY29lZnMgICAgICAgIFRoZSBuZXcgY29lZmZpY2llbnRzLgorICAgIC8vIGltbWVkaWF0ZSAgICBJZiB0cnVlLCB0cmFuc2l0aW9ucyB0byBuZXcgY29lZmZpY2llbnRzIHNtb290aGx5LCB3aXRob3V0CisgICAgLy8gICAgICAgICAgICAgIGludHJvZHVjaW5nIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgb3V0cHV0LiBPdGhlcndpc2UsCisgICAgLy8gICAgICAgICAgICAgIHRyYW5zaXRpb25zIGltbWVkaWF0ZWx5LgorICAgIHZvaWQgc2V0Q29lZnMoY29uc3QgYXVkaW9fY29lZl90IGNvZWZzW05VTV9DT0VGU10sIGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpOworCisgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBvZiBkYXRhLiBBbHdheXMgcHJvY2Vzc2VzIGZyYW1lQ291bnQgbXVsdGktY2hhbm5lbAorICAgIC8vIHNhbXBsZXMuIFByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgaW4tcGxhY2UsIGJ5IHBhc3NpbmcgdGhlIHNhbWUgYnVmZmVyIGFzCisgICAgLy8gYm90aCBhcmd1bWVudHMuCisgICAgLy8gaW4gICAgICAgICAgIFRoZSBpbnB1dCBidWZmZXIuIFNob3VsZCBiZSBvZiBzaXplIGZyYW1lQ291bnQgKiBuQ2hhbm5lbHMuCisgICAgLy8gb3V0ICAgICAgICAgIFRoZSBvdXRwdXQgYnVmZmVyLiBTaG91bGQgYmUgb2Ygc2l6ZSBmcmFtZUNvdW50ICogbkNoYW5uZWxzLgorICAgIC8vIGZyYW1lQ291bnQgICBOdW1iZXIgb2YgbXVsdGktY2hhbm5lbCBzYW1wbGVzIHRvIHByb2Nlc3MuCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90IGluW10sIGF1ZGlvX3NhbXBsZV90IG91dFtdLAorICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CisKKyAgICAvLyBFbmFibGVzIChhY3RpdmF0ZXMpIHRoZSBmaWx0ZXIuCisgICAgLy8gaW1tZWRpYXRlICAgIElmIHRydWUsIHRyYW5zaXRpb25zIHRvIG5ldyBzdGF0ZSBzbW9vdGhseSwgd2l0aG91dAorICAgIC8vICAgICAgICAgICAgICBpbnRyb2R1Y2luZyBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dC4gT3RoZXJ3aXNlLAorICAgIC8vICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBpbW1lZGlhdGVseS4KKyAgICB2b2lkIGVuYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIERpc2FibGVzIChieXBhc3NlcykgdGhlIGZpbHRlci4KKyAgICAvLyBpbW1lZGlhdGUgICAgSWYgdHJ1ZSwgdHJhbnNpdGlvbnMgdG8gbmV3IHN0YXRlIHNtb290aGx5LCB3aXRob3V0CisgICAgLy8gICAgICAgICAgICAgIGludHJvZHVjaW5nIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgb3V0cHV0LiBPdGhlcndpc2UsCisgICAgLy8gICAgICAgICAgICAgIHRyYW5zaXRpb25zIGltbWVkaWF0ZWx5LgorICAgIHZvaWQgZGlzYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBBIHByb3RvdHlwZSBvZiB0aGUgYWN0dWFsIHByb2Nlc3NpbmcgZnVuY3Rpb24uIEhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKKyAgICAvLyB0aGUgcHJvY2VzcygpIG1ldGhvZC4KKyAgICB0eXBlZGVmIHZvaWQgKEF1ZGlvQmlxdWFkRmlsdGVyOjoqcHJvY2Vzc19mdW5jKShjb25zdCBhdWRpb19zYW1wbGVfdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworCisgICAgLy8gVGhlIG1heGltdW0gcmF0ZSBvZiBjb2VmZmljaWVudCBjaGFuZ2UsIG1lYXN1cmVkIGluIGNvZWZmaWNpZW50IHVuaXRzIHBlcgorICAgIC8vIHNlY29uZC4KKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IE1BWF9ERUxUQV9QRVJfU0VDID0gMjAwMDsKKworICAgIC8vIENvZWZmaWNpZW50cyBvZiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbi4KKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IElERU5USVRZX0NPRUZTW05VTV9DT0VGU107CisKKyAgICAvLyBGaWx0ZXIgc3RhdGUuCisgICAgZW51bSBzdGF0ZV90IHsKKyAgICAgICAgLy8gQnlwYXNzLgorICAgICAgICBTVEFURV9CWVBBU1MgPSAweDAxLAorICAgICAgICAvLyBJbiB0aGUgcHJvY2VzcyBvZiBzbW9vdGggdHJhbnNpdGlvbiB0byBieXBhc3Mgc3RhdGUuCisgICAgICAgIFNUQVRFX1RSQU5TSVRJT05fVE9fQllQQVNTID0gMHgwMiwKKyAgICAgICAgLy8gSW4gdGhlIHByb2Nlc3Mgb2Ygc21vb3RoIHRyYW5zaXRpb24gdG8gbm9ybWFsIChlbmFibGVkKSBzdGF0ZS4KKyAgICAgICAgU1RBVEVfVFJBTlNJVElPTl9UT19OT1JNQUwgPSAweDA0LAorICAgICAgICAvLyBJbiBub3JtYWwgKGVuYWJsZWQpIHN0YXRlLgorICAgICAgICBTVEFURV9OT1JNQUwgPSAweDA1LAorICAgICAgICAvLyBBIGJpdC1tYXNrIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgICAvLyBpbiB0aGUgZXllcyBvZiB0aGUgY2xpZW50LgorICAgICAgICBTVEFURV9FTkFCTEVEX01BU0sgPSAweDA0CisgICAgfTsKKworICAgIC8vIE51bWJlciBvZiBjaGFubmVscy4KKyAgICBpbnQgbU51bUNoYW5uZWxzOworICAgIC8vIEN1cnJlbnQgc3RhdGUuCisgICAgc3RhdGVfdCBtU3RhdGU7CisgICAgLy8gTWF4aW11bSBjb2VmZmljaWVudCBkZWx0YSBwZXIgc2FtcGxlLgorICAgIGF1ZGlvX2NvZWZfdCBtTWF4RGVsdGE7CisKKyAgICAvLyBBIGJpdC1tYXNrIGRlc2lnbmF0aW5nIGZvciB3aGljaCBjb2VmZmljaWVudHMgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90CisgICAgLy8gbmVjZXNzYXJpbHkgaWRlbnRpY2FsIHRvIHRoZSB0YXJnZXQgdmFsdWUgKHNpbmNlIHdlJ3JlIGluIHRyYW5zaXRpb24KKyAgICAvLyBzdGF0ZSkuCisgICAgdWludDMyX3QgbUNvZWZEaXJ0eUJpdHM7CisgICAgLy8gVGhlIGN1cnJlbnQgY29lZmZpY2llbnRzLgorICAgIGF1ZGlvX2NvZWZfdCBtQ29lZnNbTlVNX0NPRUZTXTsKKyAgICAvLyBUaGUgdGFyZ2V0IGNvZWZmaWNpZW50cy4gV2lsbCBub3QgYmUgaWRlbnRpY2FsIHRvIG1Db2VmcyBpZiB3ZSBhcmUgaW4gYQorICAgIC8vIHRyYW5zaXRpb24gc3RhdGUuCisgICAgYXVkaW9fY29lZl90IG1UYXJnZXRDb2Vmc1tOVU1fQ09FRlNdOworCisgICAgLy8gVGhlIGRlbGF5IGxpbmVzLgorICAgIGF1ZGlvX3NhbXBsZV90IG1EZWxheXNbTUFYX0NIQU5ORUxTXVs0XTsKKworICAgIC8vIEN1cnJlbnQgcHJvY2Vzc2luZyBmdW5jdGlvbiAoZGV0ZXJtaW5lcyBhY2NvcmRpbmcgdG8gY3VycmVudCBzdGF0ZSBhbmQKKyAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMpLgorICAgIHByb2Nlc3NfZnVuYyBtQ3VyUHJvY2Vzc0Z1bmM7CisKKyAgICAvLyBTZXRzIGEgbmV3IHN0YXRlLiBVcGRhdGVzIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGFjY29yZGluZ2x5LCBhbmQgc2V0cworICAgIC8vIHRoZSBkaXJ0eSBiaXRzIGlmIGNoYW5naW5nIHRvIGEgdHJhbnNpdGlvbiBzdGF0ZS4KKyAgICB2b2lkIHNldFN0YXRlKHN0YXRlX3Qgc3RhdGUpOworCisgICAgLy8gSW4gYSB0cmFuc2l0aW9uIHN0YXRlLCBtb2RpZmllcyB0aGUgY3VycmVudCBjb2VmcyB0b3dhcmRzIHRoZSBwYXNzZWQKKyAgICAvLyBjb2Vmcywgd2hpbGUga2VlcGluZyBhIHNtb290aCBjaGFuZ2UgcmF0ZS4gV2hlbmV2ZXIgYSBjb2VmIHJlYWNoZXMgaXRzCisgICAgLy8gdGFyZ2V0IHZhbHVlLCB0aGUgZGlydHkgYml0IGlzIGNsZWFyZWQuIElmIGFsbCBhcmUgY2xlYXIsIHRoZSBmdW5jdGlvbgorICAgIC8vIHJldHVybnMgdHJ1ZSwgYW5kIHdlIGNhbiB0aGVuIGNoYW5nZSB0byBvdXIgdGFyZ2V0IHN0YXRlLgorICAgIGJvb2wgdXBkYXRlQ29lZnMoY29uc3QgYXVkaW9fY29lZl90IGNvZWZzW05VTV9DT0VGU10sIGludCBmcmFtZUNvdW50KTsKKworICAgIC8vIFByb2Nlc3NpbmcgZnVuY3Rpb24gd2hlbiBpbiBkaXNhYmxlZCBzdGF0ZS4KKyAgICB2b2lkIHByb2Nlc3NfYnlwYXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sIGF1ZGlvX3NhbXBsZV90ICogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworICAgIC8vIFByb2Nlc3NpbmcgZnVuY3Rpb24gd2hlbiBpbiBub3JtYWwgc3RhdGUsIG1vbm8uCisgICAgdm9pZCBwcm9jZXNzX25vcm1hbF9tb25vKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sIGF1ZGlvX3NhbXBsZV90ICogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CisgICAgLy8gUHJvY2Vzc2luZyBmdW5jdGlvbiB3aGVuIHRyYW5zaXRpb25pbmcgdG8gbm9ybWFsIHN0YXRlLCBtb25vLgorICAgIHZvaWQgcHJvY2Vzc190cmFuc2l0aW9uX25vcm1hbF9tb25vKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsIGludCBmcmFtZUNvdW50KTsKKyAgICAvLyBQcm9jZXNzaW5nIGZ1bmN0aW9uIHdoZW4gdHJhbnNpdGlvbmluZyB0byBieXBhc3Mgc3RhdGUsIG1vbm8uCisgICAgdm9pZCBwcm9jZXNzX3RyYW5zaXRpb25fYnlwYXNzX21vbm8oY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwgaW50IGZyYW1lQ291bnQpOworICAgIC8vIFByb2Nlc3NpbmcgZnVuY3Rpb24gd2hlbiBpbiBub3JtYWwgc3RhdGUsIG11bHRpLWNoYW5uZWwuCisgICAgdm9pZCBwcm9jZXNzX25vcm1hbF9tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLCBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKKyAgICAvLyBQcm9jZXNzaW5nIGZ1bmN0aW9uIHdoZW4gdHJhbnNpdGlvbmluZyB0byBub3JtYWwgc3RhdGUsIG11bHRpLWNoYW5uZWwuCisgICAgdm9pZCBwcm9jZXNzX3RyYW5zaXRpb25fbm9ybWFsX211bHRpKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogb3V0LCBpbnQgZnJhbWVDb3VudCk7CisgICAgLy8gUHJvY2Vzc2luZyBmdW5jdGlvbiB3aGVuIHRyYW5zaXRpb25pbmcgdG8gYnlwYXNzIHN0YXRlLCBtdWx0aS1jaGFubmVsLgorICAgIHZvaWQgcHJvY2Vzc190cmFuc2l0aW9uX2J5cGFzc19tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwgaW50IGZyYW1lQ291bnQpOworfTsKK30KKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fQklRVUFEX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29lZkludGVycG9sYXRvci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29lZkludGVycG9sYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5YWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmNwcApAQCAtMCwwICsxLDg0IEBACisvKiAvL2RldmljZS9zZXJ2ZXJzL0F1ZGlvRmxpbmdlci9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuY3BwCisgKioKKyAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJBdWRpb0NvZWZJbnRlcnBvbGF0b3IuaCIKKworI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQorI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvQ29lZkludGVycG9sYXRvcjo6QXVkaW9Db2VmSW50ZXJwb2xhdG9yKHNpemVfdCBuSW5EaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGluRGltc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5PdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29lZl90ICogdGFibGUpIHsKKyAgICBtTnVtSW5EaW1zID0gbkluRGltczsKKyAgICBtZW1jcHkobUluRGltcywgaW5EaW1zLCBuSW5EaW1zICogc2l6ZW9mKHNpemVfdCkpOworICAgIG1OdW1PdXREaW1zID0gbk91dERpbXM7CisgICAgbVRhYmxlID0gdGFibGU7CisgICAgLy8gSW5pdGlhbGl6ZSBvZmZzZXRzIGFycmF5CisgICAgc2l6ZV90IGRpbSA9IG5JbkRpbXMgLSAxOworICAgIG1JbkRpbU9mZnNldHNbbkluRGltcyAtIDFdID0gbk91dERpbXM7CisgICAgd2hpbGUgKGRpbS0tID4gMCkgeworICAgICAgICBtSW5EaW1PZmZzZXRzW2RpbV0gPSBtSW5EaW1PZmZzZXRzW2RpbSArIDFdICogbUluRGltc1tkaW0gKyAxXTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Db2VmSW50ZXJwb2xhdG9yOjpnZXRDb2VmKGNvbnN0IGludCBpbnRDb29yZFtdLCB1aW50MzJfdCBmcmFjQ29vcmRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZWZfdCBvdXRbXSkgeworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgc2l6ZV90IGRpbSA9IG1OdW1JbkRpbXM7CisgICAgd2hpbGUgKGRpbS0tID4gMCkgeworICAgICAgICBpZiAoVU5MSUtFTFkoaW50Q29vcmRbZGltXSA8IDApKSB7CisgICAgICAgICAgICBmcmFjQ29vcmRbZGltXSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoVU5MSUtFTFkoaW50Q29vcmRbZGltXSA+PSAoaW50KW1JbkRpbXNbZGltXSAtIDEpKSB7CisgICAgICAgICAgICBmcmFjQ29vcmRbZGltXSA9IDA7CisgICAgICAgICAgICBpbmRleCArPSBtSW5EaW1PZmZzZXRzW2RpbV0gKiAobUluRGltc1tkaW1dIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmRleCArPSBtSW5EaW1PZmZzZXRzW2RpbV0gKiBpbnRDb29yZFtkaW1dOworICAgICAgICB9CisgICAgfQorICAgIGdldENvZWZSZWN1cnNlKGluZGV4LCBmcmFjQ29vcmQsIG91dCwgMCk7Cit9CisKK3ZvaWQgQXVkaW9Db2VmSW50ZXJwb2xhdG9yOjpnZXRDb2VmUmVjdXJzZShzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZnJhY0Nvb3JkW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29lZl90IG91dFtdLCBzaXplX3QgZGltKSB7CisgICAgaWYgKGRpbSA9PSBtTnVtSW5EaW1zKSB7CisgICAgICAgIG1lbWNweShvdXQsIG1UYWJsZSArIGluZGV4LCBtTnVtT3V0RGltcyAqIHNpemVvZihhdWRpb19jb2VmX3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZXRDb2VmUmVjdXJzZShpbmRleCwgZnJhY0Nvb3JkLCBvdXQsIGRpbSArIDEpOworICAgICAgICBpZiAoTElLRUxZKGZyYWNDb29yZCAhPSAwKSkgeworICAgICAgICAgICBhdWRpb19jb2VmX3QgdGVtcENvZWZbTUFYX09VVF9ESU1TXTsKKyAgICAgICAgICAgZ2V0Q29lZlJlY3Vyc2UoaW5kZXggKyBtSW5EaW1PZmZzZXRzW2RpbV0sIGZyYWNDb29yZCwgdGVtcENvZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0gKyAxKTsKKyAgICAgICAgICAgIHNpemVfdCBkID0gbU51bU91dERpbXM7CisgICAgICAgICAgICB3aGlsZSAoZC0tID4gMCkgeworICAgICAgICAgICAgICAgIG91dFtkXSA9IGludGVycChvdXRbZF0sIHRlbXBDb2VmW2RdLCBmcmFjQ29vcmRbZGltXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2NvZWZfdCBBdWRpb0NvZWZJbnRlcnBvbGF0b3I6OmludGVycChhdWRpb19jb2VmX3QgbG8sIGF1ZGlvX2NvZWZfdCBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFjKSB7CisgICAgaW50NjRfdCBkZWx0YSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGhpLWxvKSAqIGZyYWM7CisgICAgcmV0dXJuIGxvICsgc3RhdGljX2Nhc3Q8YXVkaW9fY29lZl90PiAoZGVsdGEgPj4gMzIpOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29lZkludGVycG9sYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U1Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuaApAQCAtMCwwICsxLDk4IEBACisvKiAvL2RldmljZS9pbmNsdWRlL3NlcnZlci9BdWRpb0ZsaW5nZXIvQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgKKyAqKgorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0NPRUZfSU5URVJQT0xBVE9SX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19DT0VGX0lOVEVSUE9MQVRPUl9ICisKKyNpbmNsdWRlICJBdWRpb0NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEEgaGVscGVyIGNsYXNzIGZvciBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiBOLUQgLT4gTS1EIGNvZWZmaWNpZW50IHRhYmxlcy4KKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3VwcG9ydCBmb3Igb3V0LW9mLXJhbmdlIGluZGV4ZXMuCisvLyBEZXRhaWxzOgorLy8gVGhlIHB1cnBvc2UgaXMgZWZmaWNpZW50IGFwcHJveGltYXRpb24gb2YgYSBOLWRpbWVuc2lvbmFsIHZlY3RvciB0bworLy8gTS1kaW1lbnNpb25hbCBmdW5jdGlvbi4gVGhlIGFwcHJveGltYXRpb24gaXMgYmFzZWQgb24gYSB0YWJsZSBvZiBvdXRwdXQKKy8vIHZhbHVlcyBvbiBhIHVuaWZvcm0gZ3JpZCBvZiB0aGUgaW5wdXQgdmFsdWVzLiBWYWx1ZXMgbm90IG9uIHRoZSBncmlkIGFyZQorLy8gbGluZWFybHkgaW50ZXJwb2xhdGVkLgorLy8gQWNjZXNzIHRvIHZhbHVlcyBhcmUgZG9uZSBieSBzcGVjaWZ5aW5nIGlucHV0IHZhbHVlcyBpbiB0YWJsZSBpbmRleCB1bml0cywKKy8vIGhhdmluZyBhbiBpbnRlZ2VyIGFuZCBhIGZyYWN0aW9uYWwgcGFydCwgZS5nLiByZXRyaWV2aW5nIGEgdmFsdWUgZnJvbSBpbmRleAorLy8gMS40IHdpbGwgcmVzdWx0IGluIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaW5kZXggMSBhbmQgaW5kZXggMi4KK2NsYXNzIEF1ZGlvQ29lZkludGVycG9sYXRvciB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8gbkluRGltcyAgICAgIE51bWJlciBvZiBpbnB1dCBkaW1lbnNpb25zIChsaW1pdGVkIHRvIE1BWF9JTl9ESU1TKS4KKyAgICAvLyBpbkRpbXMgICAgICAgQW4gYXJyYXkgb2Ygc2l6ZSBuSW5EaW1zIHdpdGggdGhlIHNpemUgb2YgdGhlIHRhYmxlIG9uIGVhY2gKKyAgICAvLyAgICAgICAgICAgICAgcmVzcGVjdGl2ZSBkaW1lbnNpb24uCisgICAgLy8gbk91dERpbXMgICAgIE51bWJlciBvZiBvdXRwdXQgZGltZW5zaW9ucyAobGltaXRlZCB0byBNQVhfT1VUX0RJTVMpLgorICAgIC8vIHRhYmxlICAgICAgICBUaGUgY29lZmZpY2llbnQgdGFibGUuIFNob3VsZCBiZSBvZiBzaXplOgorICAgIC8vICAgICAgICAgICAgICBpbkRpbXNbMF0qaW5EaW1zWzFdKi4uLippbkRpbXNbbkluRGltcy0xXSpuT3V0RGltcywgd2hlcmUKKyAgICAvLyAgICAgICAgICAgICAgZnVuYyhbaSxqLGtdKSA9IHRhYmxlKGksaixrLDopCisgICAgQXVkaW9Db2VmSW50ZXJwb2xhdG9yKHNpemVfdCBuSW5EaW1zLCBjb25zdCBzaXplX3QgaW5EaW1zW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuT3V0RGltcywgY29uc3QgYXVkaW9fY29lZl90ICogdGFibGUpOworCisgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXBwcm94aW1hdGVkIGZ1bmN0aW9uIGF0IGEgZ2l2ZW4gcG9pbnQuCisgICAgLy8gaW50Q29vcmQgICAgIFRoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIGlucHV0IHZhbHVlLiBTaG91bGQgYmUgYW4gYXJyYXkgb2YKKyAgICAvLyAgICAgICAgICAgICAgc2l6ZSBuSW5EaW1zLgorICAgIC8vIGZyYWNDb29yZCAgICBUaGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSBpbnB1dCB2YWx1ZS4gU2hvdWxkIGJlIGFuIGFycmF5CisgICAgLy8gICAgICAgICAgICAgIG9mIHNpemUgbkluRGltcy4gVGhpcyB2YWx1ZSBpcyBpbiAzMi1iaXQgcHJlY2lzaW9uLgorICAgIC8vIG91dCAgICAgICAgICBBbiBhcnJheSBmb3IgdGhlIG91dHB1dCB2YWx1ZS4gU2hvdWxkIGJlIG9mIHNpemUgbk91dERpbXMuCisgICAgdm9pZCBnZXRDb2VmKGNvbnN0IGludCBpbnRDb29yZFtdLCB1aW50MzJfdCBmcmFjQ29vcmRbXSwgYXVkaW9fY29lZl90IG91dFtdKTsKKworcHJpdmF0ZToKKyAgICAvLyBNYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGlucHV0IGRpbWVuc2lvbnMuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBNQVhfSU5fRElNUyA9IDg7CisgICAgLy8gTWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBvdXRwdXQgZGltZW5zaW9ucy4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9PVVRfRElNUyA9IDg7CisKKyAgICAvLyBOdW1iZXIgb2YgaW5wdXQgZGltZW5zaW9ucy4KKyAgICBzaXplX3QgbU51bUluRGltczsKKyAgICAvLyBOdW1iZXIgb2YgaW5wdXQgZGltZW5zaW9ucy4KKyAgICBzaXplX3QgbUluRGltc1tNQVhfSU5fRElNU107CisgICAgLy8gVGhlIG9mZnNldCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBpbmRleGVzIG9mIGVhY2ggZGltZW5zaW9uLiBUaGlzIGlzIGluCisgICAgLy8gZmFjdCBhIGN1bXVsYXRpdmUgcHJvZHVjdCBvZiBtSW5EaW1zIChkb25lIGluIHJldmVyc2UpLgorICAgIHNpemVfdCBtSW5EaW1PZmZzZXRzW01BWF9JTl9ESU1TXTsKKyAgICAvLyBOdW1iZXIgb2Ygb3V0cHV0IGRpbWVuc2lvbnMuCisgICAgc2l6ZV90IG1OdW1PdXREaW1zOworICAgIC8vIFRoZSBjb2VmZmljaWVudCB0YWJsZS4KKyAgICBjb25zdCBhdWRpb19jb2VmX3QgKiBtVGFibGU7CisKKyAgICAvLyBBIHJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhbiBpbnRlcnBvbGF0ZWQgY29lZmZpY2llbnQgdmFsdWUuCisgICAgLy8gVGhlIHJlY3Vyc2lvbiBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IGRpbWVuc2lvbnMuCisgICAgLy8gQXQgZWFjaCBzdGVwLCB3ZSBmZXRjaCB0d28gaW50ZXJwb2xhdGVkIHZhbHVlcyBvZiB0aGUgY3VycmVudCBkaW1lbnNpb24sCisgICAgLy8gYnkgdHdvIHJlY3Vyc2l2ZSBjYWxscyB0byB0aGlzIG1ldGhvZCBmb3IgdGhlIG5leHQgZGltZW5zaW9ucy4gV2UgdGhlbgorICAgIC8vIGxpbmVhcmx5IGludGVycG9sYXRlIHRoZXNlIHZhbHVlcyBvdmVyIHRoZSBjdXJyZW50IGRpbWVuc2lvbi4KKyAgICAvLyBpbmRleCAgICAgIFRoZSBsaW5lYXIgaW50ZWdlciBpbmRleCBvZiB0aGUgdmFsdWUgd2UgbmVlZCB0byBpbnRlcnBvbGF0ZS4KKyAgICAvLyBmcmFjQ29vcmQgIEEgdmVjdG9yIG9mIGZyYWN0aW9uYWwgY29vcmRpbmF0ZXMgZm9yIGVhY2ggb2YgdGhlIGlucHV0CisgICAgLy8gICAgICAgICAgICBkaW1lbnNpb25zLgorICAgIC8vIG91dCAgICAgICAgV2hlcmUgdGhlIG91dHB1dCBzaG91bGQgYmUgd3JpdHRlbi4gTmVlZHMgdG8gYmUgb2Ygc2l6ZQorICAgIC8vICAgICAgICAgICAgbU51bU91dERpbXMuCisgICAgLy8gZGltICAgICAgICBUaGUgaW5wdXQgZGltZW5zaW9ucyB3ZSBhcmUgY3VycmVudGx5IGludGVycG9sYXRpbmcuIFRoaXMKKyAgICAvLyAgICAgICAgICAgIHZhbHVlIHdpbGwgYmUgaW5jcmVhc2VkIG9uIHJlY3Vyc2l2ZSBjYWxscy4KKyAgICB2b2lkIGdldENvZWZSZWN1cnNlKHNpemVfdCBpbmRleCwgY29uc3QgdWludDMyX3QgZnJhY0Nvb3JkW10sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb2VmX3Qgb3V0W10sIHNpemVfdCBkaW0pOworCisgICAgLy8gU2NhbGFyIGludGVycG9sYXRpb24gb2YgdHdvIGRhdGEgcG9pbnRzLgorICAgIC8vIGxvICAgICAgIFRoZSBmaXJzdCBkYXRhIHBvaW50LgorICAgIC8vIGhpICAgICAgIFRoZSBzZWNvbmQgZGF0YSBwb2ludC4KKyAgICAvLyBmcmFjICAgICBBIDMyLWJpdCBmcmFjdGlvbiBkZXNpZ25hdGluZyB0aGUgd2VpZ2h0IG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgc3RhdGljIGF1ZGlvX2NvZWZfdCBpbnRlcnAoYXVkaW9fY29lZl90IGxvLCBhdWRpb19jb2VmX3QgaGksIHVpbnQzMl90IGZyYWMpOworfTsKKworfQorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19DT0VGX0lOVEVSUE9MQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29tbW9uLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZjkzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Db21tb24uaApAQCAtMCwwICsxLDkyIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fQ09NTU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19DT01NT05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQXVkaW8gY29lZmZpY2llbnQgdHlwZS4KK3R5cGVkZWYgaW50MzJfdCBhdWRpb19jb2VmX3Q7CisvLyBBdWRpbyBzYW1wbGUgdHlwZS4KK3R5cGVkZWYgaW50MzJfdCBhdWRpb19zYW1wbGVfdDsKKy8vIEFjY3VtdWxhdG9yIHR5cGUgZm9yIGNvZWYgeCBzYW1wbGUuCit0eXBlZGVmIGludDY0X3QgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3Q7CisKKy8vIE51bWJlciBvZiBmcmFjdGlvbiBiaXRzIGZvciBhdWRpbyBjb2VmZmljaWVudC4KK3N0YXRpYyBjb25zdCBpbnQgQVVESU9fQ09FRl9QUkVDSVNJT04gPSAyNDsKKy8vIEF1ZGlvIGNvZWZmaWNpZW50IHdpdGggdGhlIHZhbHVlIG9mIDEuMAorc3RhdGljIGNvbnN0IGF1ZGlvX2NvZWZfdCBBVURJT19DT0VGX09ORSA9IDEgPDwgQVVESU9fQ09FRl9QUkVDSVNJT047CisvLyBBdWRpbyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSBvZiAwLjUKK3N0YXRpYyBjb25zdCBhdWRpb19jb2VmX3QgQVVESU9fQ09FRl9IQUxGID0gMSA8PCAoQVVESU9fQ09FRl9QUkVDSVNJT04gLSAxKTsKKy8vIE51bWJlciBvZiBmcmFjdGlvbiBiaXRzIGZvciBhdWRpbyBzYW1wbGUuCitzdGF0aWMgY29uc3QgaW50IEFVRElPX1NBTVBMRV9QUkVDSVNJT04gPSAyNDsKKy8vIEF1ZGlvIHNhbXBsZSB3aXRoIHRoZSB2YWx1ZSBvZiAxLjAKK3N0YXRpYyBjb25zdCBhdWRpb19zYW1wbGVfdCBBVURJT19TQU1QTEVfT05FID0gMSA8PCBBVURJT19TQU1QTEVfUFJFQ0lTSU9OOworCisvLyBUT0RPOiBUaGVzZSBhcmUganVzdCB0ZW1wb3JhcnkgbmFpdmUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBuZWNlc3NhcnkKKy8vIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBuZWVkZWQgZm9yIHRoZSBmaWx0ZXIuIFRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIGEgbW9yZQorLy8gZ2VuZXJpYyBsb2NhdGlvbiBhbmQgaW1wbGVtZW50ZWQgbW9yZSBlZmZpY2llbnRseS4KKworLy8gTXVsdGlwbHkgYSBzYW1wbGUgYnkgYSBjb2VmZmljaWVudCB0byByZXR1cm4gYW4gYWNjdW11bGF0b3IuCitpbmxpbmUgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgbXVsX2NvZWZfc2FtcGxlKGF1ZGlvX2NvZWZfdCB4LCBhdWRpb19zYW1wbGVfdCB5KSB7CisgICAgcmV0dXJuICgoYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QpICh4KSkgKiB5OworfQorCisvLyBNdWx0aXBseSBhbmQgYWNjdW11bGF0ZSBzYW1wbGUgYnkgYSBjb2VmZmljaWVudCB0byByZXR1cm4gYW4gYWNjdW11bGF0b3IuCitpbmxpbmUgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgbWFjX2NvZWZfc2FtcGxlKGF1ZGlvX2NvZWZfdCB4LCBhdWRpb19zYW1wbGVfdCB5LCBhdWRpb19jb2VmX3NhbXBsZV9hY2NfdCBhY2MpIHsKKyAgICByZXR1cm4gYWNjICsgKChhdWRpb19jb2VmX3NhbXBsZV9hY2NfdCkgKHgpKSAqIHk7Cit9CisKKy8vIENvbnZlcnQgYSBzYW1wbGUtY29lZmZpY2llbnQgYWNjdW11bGF0b3IgdG8gYSBzYW1wbGUuCitpbmxpbmUgYXVkaW9fc2FtcGxlX3QgY29lZl9zYW1wbGVfYWNjX3RvX3NhbXBsZShhdWRpb19jb2VmX3NhbXBsZV9hY2NfdCBhY2MpIHsKKyAgICBpZiAoYWNjIDwgMCkgeworICAgICAgICBhY2MgKz0gQVVESU9fQ09FRl9PTkUgLSAxOworICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX3NhbXBsZV90KSAoYWNjID4+IEFVRElPX0NPRUZfUFJFQ0lTSU9OKTsKK30KKworLy8gQ29udmVydCBhIFMxNSBzYW1wbGUgdG8gYXVkaW9fc2FtcGxlX3QKK2lubGluZSBhdWRpb19zYW1wbGVfdCBzMTVfdG9fYXVkaW9fc2FtcGxlX3QoaW50MTZfdCBzMTUpIHsKKyAgICByZXR1cm4gYXVkaW9fc2FtcGxlX3QoczE1KSA8PCA5OworfQorCisvLyBDb252ZXJ0IGEgYXVkaW9fc2FtcGxlX3Qgc2FtcGxlIHRvIFMxNSAobm8gY2xpcHBpbmcpCitpbmxpbmUgaW50MTZfdCBhdWRpb19zYW1wbGVfdF90b19zMTUoYXVkaW9fc2FtcGxlX3Qgc2FtcGxlKSB7CisgICAgcmV0dXJuIGludDE2X3QoKHNhbXBsZSArICgxIDw8IDgpKSA+PiA5KTsKK30KKworLy8gQ29udmVydCBhIGF1ZGlvX3NhbXBsZV90IHNhbXBsZSB0byBTMTUgKHdpdGggY2xpcHBpbmcpCitpbmxpbmUgaW50MTZfdCBhdWRpb19zYW1wbGVfdF90b19zMTVfY2xpcChhdWRpb19zYW1wbGVfdCBzYW1wbGUpIHsKKyAgICAvLyBUT0RPOiBvcHRpbWl6ZSBmb3IgdGFyZ2V0cyBzdXBwb3J0aW5nIHRoaXMgYXMgYW4gYXRvbWljIG9wZXJhdGlvbi4KKyAgICBpZiAoX19idWlsdGluX2V4cGVjdChzYW1wbGUgPj0gKDB4N0ZGRiA8PCA5KSwgMCkpIHsKKyAgICAgICAgcmV0dXJuIDB4N0ZGRjsKKyAgICB9IGVsc2UgaWYgKF9fYnVpbHRpbl9leHBlY3Qoc2FtcGxlIDw9IC0oMHg4MDAwIDw8IDkpLCAwKSkgeworICAgICAgICByZXR1cm4gMHg4MDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBhdWRpb19zYW1wbGVfdF90b19zMTUoc2FtcGxlKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK30KKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjOTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRXF1YWxpemVyIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQXVkaW9FcXVhbGl6ZXIuaCIKKyNpbmNsdWRlICJBdWRpb1BlYWtpbmdGaWx0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb1NoZWx2aW5nRmlsdGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzaXplX3QgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShpbnQgbkJhbmRzKSB7CisgICAgYXNzZXJ0KG5CYW5kcyA+PSAyKTsKKyAgICByZXR1cm4gc2l6ZW9mKEF1ZGlvRXF1YWxpemVyKSArCisgICAgICAgICAgIHNpemVvZihBdWRpb1NoZWx2aW5nRmlsdGVyKSAqIDIgKworICAgICAgICAgICBzaXplb2YoQXVkaW9QZWFraW5nRmlsdGVyKSAqIChuQmFuZHMgLSAyKTsKK30KKworQXVkaW9FcXVhbGl6ZXIgKiBBdWRpb0VxdWFsaXplcjo6Q3JlYXRlSW5zdGFuY2Uodm9pZCAqIHBNZW0sIGludCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXNldENvbmZpZyAqIHByZXNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblByZXNldHMpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6Q3JlYXRlSW5zdGFuY2UocE1lbT0lcCwgbkJhbmRzPSVkLCBuQ2hhbm5lbHM9JWQsICIKKyAgICAgICAgICJzYW1wbGVSYXRlPSVkLCBuUHJlc2V0cz0lZCkiLAorICAgICAgICAgcE1lbSwgbkJhbmRzLCBuQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIG5QcmVzZXRzKTsKKyAgICBhc3NlcnQobkJhbmRzID49IDIpOworICAgIGJvb2wgb3duTWVtID0gZmFsc2U7CisgICAgaWYgKHBNZW0gPT0gTlVMTCkgeworICAgICAgICBwTWVtID0gbWFsbG9jKEdldEluc3RhbmNlU2l6ZShuQmFuZHMpKTsKKyAgICAgICAgaWYgKHBNZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgb3duTWVtID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyAocE1lbSkgQXVkaW9FcXVhbGl6ZXIocE1lbSwgbkJhbmRzLCBuQ2hhbm5lbHMsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duTWVtLCBwcmVzZXRzLCBuUHJlc2V0cyk7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmNvbmZpZ3VyZShpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSkgeworICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpjb25maWd1cmUobkNoYW5uZWxzPSVkLCBzYW1wbGVSYXRlPSVkKSIsIG5DaGFubmVscywKKyAgICAgICAgIHNhbXBsZVJhdGUpOworICAgIG1wTG93U2hlbGYtPmNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLmNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+Y29uZmlndXJlKG5DaGFubmVscywgc2FtcGxlUmF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmNsZWFyKCkgeworICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpjbGVhcigpIik7CisgICAgbXBMb3dTaGVsZi0+Y2xlYXIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1QZWFraW5nOyArK2kpIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVyc1tpXS5jbGVhcigpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+Y2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6ZnJlZSgpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6ZnJlZSgpIik7CisgICAgaWYgKG1wTWVtICE9IE5VTEwpIHsKKyAgICAgICAgOjpmcmVlKG1wTWVtKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OnJlc2V0KCkgeworICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpyZXNldCgpIik7CisgICAgY29uc3QgaW50MzJfdCBib3R0b20gPSBFZmZlY3RzX2xvZzIoa01pbkZyZXEpOworICAgIGNvbnN0IGludDMyX3QgdG9wID0gRWZmZWN0c19sb2cyKG1TYW1wbGVSYXRlICogNTAwKTsKKyAgICBjb25zdCBpbnQzMl90IGp1bXAgPSAodG9wIC0gYm90dG9tKSAvIChtTnVtUGVha2luZyArIDIpOworICAgIGludDMyX3QgY2VudGVyRnJlcSA9IGJvdHRvbSArIGp1bXAvMjsKKworICAgIG1wTG93U2hlbGYtPnJlc2V0KCk7CisgICAgbXBMb3dTaGVsZi0+c2V0RnJlcXVlbmN5KEVmZmVjdHNfZXhwMihjZW50ZXJGcmVxKSk7CisgICAgY2VudGVyRnJlcSArPSBqdW1wOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLnJlc2V0KCk7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbaV0uc2V0RnJlcXVlbmN5KEVmZmVjdHNfZXhwMihjZW50ZXJGcmVxKSk7CisgICAgICAgIGNlbnRlckZyZXEgKz0ganVtcDsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPnJlc2V0KCk7CisgICAgbXBIaWdoU2hlbGYtPnNldEZyZXF1ZW5jeShFZmZlY3RzX2V4cDIoY2VudGVyRnJlcSkpOworICAgIGNvbW1pdCh0cnVlKTsKKyAgICBtQ3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6c2V0R2FpbihpbnQgYmFuZCwgaW50MzJfdCBtaWxsaWJlbCkgeworICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpzZXRHYWluKGJhbmQ9JWQsIG1pbGxpYmVsPSVkKSIsIGJhbmQsIG1pbGxpYmVsKTsKKyAgICBhc3NlcnQoYmFuZCA+PSAwICYmIGJhbmQgPCBtTnVtUGVha2luZyArIDIpOworICAgIGlmIChiYW5kID09IDApIHsKKyAgICAgICAgbXBMb3dTaGVsZi0+c2V0R2FpbihtaWxsaWJlbCk7CisgICAgfSBlbHNlIGlmIChiYW5kID09IG1OdW1QZWFraW5nICsgMSkgeworICAgICAgICBtcEhpZ2hTaGVsZi0+c2V0R2FpbihtaWxsaWJlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVyc1tiYW5kIC0gMV0uc2V0R2FpbihtaWxsaWJlbCk7CisgICAgfQorICAgIG1DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpzZXRGcmVxdWVuY3koaW50IGJhbmQsIHVpbnQzMl90IG1pbGxpaGVydHopIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6c2V0RnJlcXVlbmN5KGJhbmQ9JWQsIG1pbGxpaGVydHo9JWQpIiwgYmFuZCwKKyAgICAgICAgIG1pbGxpaGVydHopOworICAgIGFzc2VydChiYW5kID49IDAgJiYgYmFuZCA8IG1OdW1QZWFraW5nICsgMik7CisgICAgaWYgKGJhbmQgPT0gMCkgeworICAgICAgICBtcExvd1NoZWxmLT5zZXRGcmVxdWVuY3kobWlsbGloZXJ0eik7CisgICAgfSBlbHNlIGlmIChiYW5kID09IG1OdW1QZWFraW5nICsgMSkgeworICAgICAgICBtcEhpZ2hTaGVsZi0+c2V0RnJlcXVlbmN5KG1pbGxpaGVydHopOworICAgIH0gZWxzZSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLnNldEZyZXF1ZW5jeShtaWxsaWhlcnR6KTsKKyAgICB9CisgICAgbUN1clByZXNldCA9IFBSRVNFVF9DVVNUT007Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OnNldEJhbmR3aWR0aChpbnQgYmFuZCwgdWludDMyX3QgY2VudHMpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6c2V0QmFuZHdpZHRoKGJhbmQ9JWQsIGNlbnRzPSVkKSIsIGJhbmQsIGNlbnRzKTsKKyAgICBhc3NlcnQoYmFuZCA+PSAwICYmIGJhbmQgPCBtTnVtUGVha2luZyArIDIpOworICAgIGlmIChiYW5kID4gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAxKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLnNldEJhbmR3aWR0aChjZW50cyk7CisgICAgICAgIG1DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICAgIH0KK30KKworaW50MzJfdCBBdWRpb0VxdWFsaXplcjo6Z2V0R2FpbihpbnQgYmFuZCkgY29uc3QgeworICAgIGFzc2VydChiYW5kID49IDAgJiYgYmFuZCA8IG1OdW1QZWFraW5nICsgMik7CisgICAgaWYgKGJhbmQgPT0gMCkgeworICAgICAgICByZXR1cm4gbXBMb3dTaGVsZi0+Z2V0R2FpbigpOworICAgIH0gZWxzZSBpZiAoYmFuZCA9PSBtTnVtUGVha2luZyArIDEpIHsKKyAgICAgICAgcmV0dXJuIG1wSGlnaFNoZWxmLT5nZXRHYWluKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLmdldEdhaW4oKTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvRXF1YWxpemVyOjpnZXRGcmVxdWVuY3koaW50IGJhbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoYmFuZCA+PSAwICYmIGJhbmQgPCBtTnVtUGVha2luZyArIDIpOworICAgIGlmIChiYW5kID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1wTG93U2hlbGYtPmdldEZyZXF1ZW5jeSgpOworICAgIH0gZWxzZSBpZiAoYmFuZCA9PSBtTnVtUGVha2luZyArIDEpIHsKKyAgICAgICAgcmV0dXJuIG1wSGlnaFNoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBQZWFraW5nRmlsdGVyc1tiYW5kIC0gMV0uZ2V0RnJlcXVlbmN5KCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb0VxdWFsaXplcjo6Z2V0QmFuZHdpZHRoKGludCBiYW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KGJhbmQgPj0gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAyKTsKKyAgICBpZiAoYmFuZCA9PSAwIHx8IGJhbmQgPT0gbU51bVBlYWtpbmcgKyAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcFBlYWtpbmdGaWx0ZXJzW2JhbmQgLSAxXS5nZXRCYW5kd2lkdGgoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmdldEJhbmRSYW5nZShpbnQgYmFuZCwgdWludDMyX3QgJiBsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJiBoaWdoKSBjb25zdCB7CisgICAgYXNzZXJ0KGJhbmQgPj0gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAyKTsKKyAgICBpZiAoYmFuZCA9PSAwKSB7CisgICAgICAgIGxvdyA9IDA7CisgICAgICAgIGhpZ2ggPSBtcExvd1NoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICB9IGVsc2UgaWYgKGJhbmQgPT0gbU51bVBlYWtpbmcgKyAxKSB7CisgICAgICAgIGxvdyA9IG1wSGlnaFNoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICAgICAgaGlnaCA9IG1TYW1wbGVSYXRlICogNTAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLmdldEJhbmRSYW5nZShsb3csIGhpZ2gpOworICAgIH0KK30KKworY29uc3QgY2hhciAqIEF1ZGlvRXF1YWxpemVyOjpnZXRQcmVzZXROYW1lKGludCBwcmVzZXQpIGNvbnN0IHsKKyAgICBhc3NlcnQocHJlc2V0IDwgbU51bVByZXNldHMgJiYgcHJlc2V0ID49IFBSRVNFVF9DVVNUT00pOworICAgIGlmIChwcmVzZXQgPT0gUFJFU0VUX0NVU1RPTSkgeworICAgICAgICByZXR1cm4gIkN1c3RvbSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wUHJlc2V0c1twcmVzZXRdLm5hbWU7CisgICAgfQorfQorCitpbnQgQXVkaW9FcXVhbGl6ZXI6OmdldE51bVByZXNldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OdW1QcmVzZXRzOworfQorCitpbnQgQXVkaW9FcXVhbGl6ZXI6OmdldFByZXNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUN1clByZXNldDsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6c2V0UHJlc2V0KGludCBwcmVzZXQpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6c2V0UHJlc2V0KHByZXNldD0lZCkiLCBwcmVzZXQpOworICAgIGFzc2VydChwcmVzZXQgPCBtTnVtUHJlc2V0cyAmJiBwcmVzZXQgPj0gMCk7CisgICAgY29uc3QgUHJlc2V0Q29uZmlnICZwcmVzZXRDZmcgPSBtcFByZXNldHNbcHJlc2V0XTsKKyAgICBmb3IgKGludCBiYW5kID0gMDsgYmFuZCA8IChtTnVtUGVha2luZyArIDIpOyArK2JhbmQpIHsKKyAgICAgICAgY29uc3QgQmFuZENvbmZpZyAmIGJhbmRDZmcgPSBwcmVzZXRDZmcuYmFuZENvbmZpZ3NbYmFuZF07CisgICAgICAgIHNldEdhaW4oYmFuZCwgYmFuZENmZy5nYWluKTsKKyAgICAgICAgc2V0RnJlcXVlbmN5KGJhbmQsIGJhbmRDZmcuZnJlcSk7CisgICAgICAgIHNldEJhbmR3aWR0aChiYW5kLCBiYW5kQ2ZnLmJhbmR3aWR0aCk7CisgICAgfQorICAgIG1DdXJQcmVzZXQgPSBwcmVzZXQ7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmNvbW1pdChib29sIGltbWVkaWF0ZSkgeworICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpjb21taXQoaW1tZWRpYXRlPSVkKSIsIGltbWVkaWF0ZSk7CisgICAgbXBMb3dTaGVsZi0+Y29tbWl0KGltbWVkaWF0ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbaV0uY29tbWl0KGltbWVkaWF0ZSk7CisgICAgfQorICAgIG1wSGlnaFNoZWxmLT5jb21taXQoaW1tZWRpYXRlKTsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6cHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIHBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBwT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworLy8gICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OnByb2Nlc3MoZnJhbWVDb3VudD0lZCkiLCBmcmFtZUNvdW50KTsKKyAgICBtcExvd1NoZWxmLT5wcm9jZXNzKHBJbiwgcE91dCwgZnJhbWVDb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbaV0ucHJvY2VzcyhwSW4sIHBPdXQsIGZyYW1lQ291bnQpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+cHJvY2VzcyhwSW4sIHBPdXQsIGZyYW1lQ291bnQpOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjplbmFibGUoYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6ZW5hYmxlKGltbWVkaWF0ZT0lZCkiLCBpbW1lZGlhdGUpOworICAgIG1wTG93U2hlbGYtPmVuYWJsZShpbW1lZGlhdGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLmVuYWJsZShpbW1lZGlhdGUpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+ZW5hYmxlKGltbWVkaWF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmRpc2FibGUoYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6ZGlzYWJsZShpbW1lZGlhdGU9JWQpIiwgaW1tZWRpYXRlKTsKKyAgICBtcExvd1NoZWxmLT5kaXNhYmxlKGltbWVkaWF0ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbaV0uZGlzYWJsZShpbW1lZGlhdGUpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+ZGlzYWJsZShpbW1lZGlhdGUpOworfQorCitpbnQgQXVkaW9FcXVhbGl6ZXI6OmdldE1vc3RSZWxldmFudEJhbmQodWludDMyX3QgdGFyZ2V0RnJlcSkgY29uc3QgeworICAgIC8vIEZpcnN0LCBmaW5kIHRoZSB0d28gYmFuZHMgdGhhdCB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSBpcyBiZXR3ZWVuLgorICAgIHVpbnQzMl90IGxvdyA9IG1wTG93U2hlbGYtPmdldEZyZXF1ZW5jeSgpOworICAgIGlmICh0YXJnZXRGcmVxIDw9IGxvdykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdWludDMyX3QgaGlnaCA9IG1wSGlnaFNoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICBpZiAodGFyZ2V0RnJlcSA+PSBoaWdoKSB7CisgICAgICAgIHJldHVybiBtTnVtUGVha2luZyArIDE7CisgICAgfQorICAgIGludCBiYW5kID0gbU51bVBlYWtpbmc7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IGZyZXEgPSBtcFBlYWtpbmdGaWx0ZXJzW2ldLmdldEZyZXF1ZW5jeSgpOworICAgICAgICBpZiAoZnJlcSA+PSB0YXJnZXRGcmVxKSB7CisgICAgICAgICAgICBoaWdoID0gZnJlcTsKKyAgICAgICAgICAgIGJhbmQgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbG93ID0gZnJlcTsKKyAgICB9CisgICAgLy8gTm93LCBsb3cgaXMgcmlnaHQgYmVsb3cgdGhlIHRhcmdldCBhbmQgaGlnaCBpcyByaWdodCBhYm92ZS4gU2VlIHdoaWNoIG9uZQorICAgIC8vIGlzIGNsb3NlciBvbiBhIGxvZyBzY2FsZS4KKyAgICBsb3cgPSBFZmZlY3RzX2xvZzIobG93KTsKKyAgICBoaWdoID0gRWZmZWN0c19sb2cyKGhpZ2gpOworICAgIHRhcmdldEZyZXEgPSBFZmZlY3RzX2xvZzIodGFyZ2V0RnJlcSk7CisgICAgaWYgKGhpZ2ggLSB0YXJnZXRGcmVxIDwgdGFyZ2V0RnJlcSAtIGxvdykgeworICAgICAgICByZXR1cm4gYmFuZCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGJhbmQ7CisgICAgfQorfQorCisKK0F1ZGlvRXF1YWxpemVyOjpBdWRpb0VxdWFsaXplcih2b2lkICogcE1lbSwgaW50IG5CYW5kcywgaW50IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwgYm9vbCBvd25NZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlc2V0Q29uZmlnICogcHJlc2V0cywgaW50IG5QcmVzZXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1wUHJlc2V0cyhwcmVzZXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbU51bVByZXNldHMoblByZXNldHMpIHsKKyAgICBhc3NlcnQocE1lbSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoblByZXNldHMgPT0gMCB8fCBuUHJlc2V0cyA+IDAgJiYgcHJlc2V0cyAhPSBOVUxMKTsKKyAgICBtcE1lbSA9IG93bk1lbSA/IHBNZW0gOiBOVUxMOworCisgICAgcE1lbSA9IChjaGFyICopIHBNZW0gKyBzaXplb2YoQXVkaW9FcXVhbGl6ZXIpOworICAgIG1wTG93U2hlbGYgPSBuZXcgKHBNZW0pIEF1ZGlvU2hlbHZpbmdGaWx0ZXIoQXVkaW9TaGVsdmluZ0ZpbHRlcjo6a0xvd1NoZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICBwTWVtID0gKGNoYXIgKikgcE1lbSArIHNpemVvZihBdWRpb1NoZWx2aW5nRmlsdGVyKTsKKyAgICBtcEhpZ2hTaGVsZiA9IG5ldyAocE1lbSkgQXVkaW9TaGVsdmluZ0ZpbHRlcihBdWRpb1NoZWx2aW5nRmlsdGVyOjprSGlnaFNoZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgcE1lbSA9IChjaGFyICopIHBNZW0gKyBzaXplb2YoQXVkaW9TaGVsdmluZ0ZpbHRlcik7CisgICAgbU51bVBlYWtpbmcgPSBuQmFuZHMgLSAyOworICAgIGlmIChtTnVtUGVha2luZyA+IDApIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVycyA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9QZWFraW5nRmlsdGVyICo+KHBNZW0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1QZWFraW5nOyArK2kpIHsKKyAgICAgICAgICAgIG5ldyAoJm1wUGVha2luZ0ZpbHRlcnNbaV0pIEF1ZGlvUGVha2luZ0ZpbHRlcihuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzZXQoKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjg0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVVESU9FUVVBTElaRVJfSF8KKyNkZWZpbmUgQVVESU9FUVVBTElaRVJfSF8KKworI2luY2x1ZGUgIkF1ZGlvQ29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9TaGVsdmluZ0ZpbHRlcjsKK2NsYXNzIEF1ZGlvUGVha2luZ0ZpbHRlcjsKKworLy8gQSBwYXJhbWV0cmljIGF1ZGlvIGVxdWFsaXplci4gU3VwcG9ydHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBiYW5kcyBhbmQKKy8vIHByZXNldHMuCisvLyBUaGUgRVEgaXMgY29tcG9zZWQgb2YgYSBsb3ctc2hlbGYsIHplcm8gb3IgbW9yZSBwZWFraW5nIGZpbHRlcnMgYW5kIGEgaGlnaAorLy8gc2hlbGYsIHdoZXJlIGVhY2ggYmFuZCBoYXMgZnJlcXVlbmN5IGFuZCBnYWluIGNvbnRyb2xzLCBhbmQgdGhlIHBlYWtpbmcKKy8vIGZpbHRlcnMgaGF2ZSBhbiBhZGRpdGlvbmFsIGJhbmR3aWR0aCBjb250cm9sLgorY2xhc3MgQXVkaW9FcXVhbGl6ZXIgeworcHVibGljOgorICAgIC8vIENvbmZpZ3VyYXRpb24gb2YgYSBzaW5nbGUgYmFuZC4KKyAgICBzdHJ1Y3QgQmFuZENvbmZpZyB7CisgICAgICAgIC8vIEdhaW4gaW4gbWlsbGliZWwuCisgICAgICAgIGludDMyX3QgZ2FpbjsKKyAgICAgICAgLy8gRnJlcXVlbmN5IGluIG1pbGxpaGVydHouCisgICAgICAgIHVpbnQzMl90IGZyZXE7CisgICAgICAgIC8vIEJhbmR3aWR0aCBpbiBjZW50cyAoaWdub3JlZCBvbiBzaGVsdmluZyBmaWx0ZXJzKS4KKyAgICAgICAgdWludDMyX3QgYmFuZHdpZHRoOworICAgIH07CisKKyAgICAvLyBQcmVzZXQgY29uZmlndXJhdGlvbi4KKyAgICBzdHJ1Y3QgUHJlc2V0Q29uZmlnIHsKKyAgICAgICAgLy8gSHVtYW4tcmVhZGFibGUgbmFtZS4KKyAgICAgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgICAgIC8vIEFuIGFycmF5IG9mIHNpemUgbkJhbmRzIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGJhbmQuCisgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKiBiYW5kQ29uZmlnczsKKyAgICB9OworCisgICAgLy8gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gcmVxdWVzdGluZyBjdXJyZW50IHByZXNldCwgYW5kIEVRIGlzIG5vdCB1c2luZyBhCisgICAgLy8gcHJlc2V0LgorICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFU0VUX0NVU1RPTSA9IC0xOworCisgICAgLy8gR2V0IHRoZSByZXF1aXJlZCBtZW1vcnkgc2l6ZSBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAvLyBuQmFuZHMgICBOdW1iZXIgb2YgYmFuZHMgcmVxdWlyZWQgaW4gdGhlIGluc3RhbmNlLgorICAgIHN0YXRpYyBzaXplX3QgR2V0SW5zdGFuY2VTaXplKGludCBuQmFuZHMpOworCisgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgLy8gSWYgc3VjY2VlZHMsIGEgcmVzcGVjdGl2ZSBjYWxsIGlzIGV4cGVjdGVkIHRvIGZyZWVJbnN0YW5jZSgpLCByZWdhcmRsZXNzCisgICAgLy8gb2Ygd2hvIG93bnMgdGhlIGNvbnRleHQgbWVtb3J5LgorICAgIC8vIHBNZW0gICAgICAgICBBIG1lbW9yeSBidWZmZXIgb2YgYXQgbGVhc3QgdGhlIHNpemUgcmV0dXJuZWQgYnkKKyAgICAvLyAgICAgICAgICAgICAgR2V0SW5zdGFuY2VTaXplKCksIHdoZXJlIHRoZSBpbnN0YW5jZSBjb250ZXh0IGlzIHRvIGJlCisgICAgLy8gICAgICAgICAgICAgIHN0b3JlZC4gSWYgTlVMTCwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZCAodXNpbmcKKyAgICAvLyAgICAgICAgICAgICAgbWFsbG9jKS4KKyAgICAvLyBuQmFuZHMgICAgICAgTnVtYmVyIG9mIGJhbmRzLiBNdXN0IGJlID49IDIuCisgICAgLy8gbkNoYW5uZWxzICAgIE51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMgKGludGVybGFjZWQpLgorICAgIC8vIHNhbXBsZVJhdGUgICBUaGUgaW5wdXQvb3V0cHV0IHNhbXBsZSByYXRlLCBpbiBIei4KKyAgICAvLyBwcmVzZXRzICAgICAgVGhlIHByZXNldHMgY29uZmlndXJhdGlvbi4gTWF5IGJlIE5VTEwsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlCisgICAgLy8gICAgICAgICAgICAgIGNsaWVudCBpcyByZXF1aXJlZCBub3QgdG8gY2FsbCBwcmVzZXQtcmVsYXRlZCBmdW5jdGlvbnMuCisgICAgLy8gICAgICAgICAgICAgIFRoaXMgYXJyYXkgaXMgb3duZWQgYnkgdGhlIGNsaWVudCBhbmQgaXMgbm90IGNvcGllZC4gSXQKKyAgICAvLyAgICAgICAgICAgICAgbXVzdCBiZSBrZXB0IHZhbGlkIGJ5IHRoZSBjbGllbnQgYXMgbG9uZyBhcyB0aGUgaW5zdGFuY2UgaXMKKyAgICAvLyAgICAgICAgICAgICAgYWxpdmUuCisgICAgLy8gblByZXNldHMgICAgIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcHJlc2V0cyBhcnJheS4KKyAgICAvLyByZXR1cm5zICAgICAgVGhlIGluc3RhbmNlIGlmIHN1Y2Nlc3MuIE5VTEwgaWYgcE1lbSBpcyBOVUxMIGFuZCBhbGxvY2F0aW9uCisgICAgLy8gICAgICAgICAgICAgIGZhaWxlZC4KKyAgICBzdGF0aWMgQXVkaW9FcXVhbGl6ZXIgKiBDcmVhdGVJbnN0YW5jZSh2b2lkICogcE1lbSwgaW50IG5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXNldENvbmZpZyAqIHByZXNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QcmVzZXRzKTsKKworICAgIC8vIFJlY29uZmlndXJhdGlvbiBvZiB0aGUgZmlsdGVyLiBDaGFuZ2VzIGlucHV0L291dHB1dCBmb3JtYXQsIGJ1dCBkb2VzIG5vdAorICAgIC8vIGFsdGVyIGN1cnJlbnQgcGFyYW1ldGVyIHZhbHVlcy4gQ2F1c2VzIHJlc2V0IG9mIHRoZSBkZWxheSBsaW5lcy4KKyAgICAvLyBuQ2hhbm5lbHMgIE51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMgKGludGVybGFjZWQpLgorICAgIC8vIHNhbXBsZVJhdGUgVGhlIGlucHV0L291dHB1dCBzYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgdm9pZCBjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpOworCisgICAgLy8gUmVzZXRzIHRoZSBmaWx0ZXIgcGFyYW1ldGVycyB0byB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAvLyBmcmVxdWVuY3k6IDAKKyAgICAvLyBnYWluOiAwCisgICAgLy8gYmFuZHdpZHRoOiAxMjAwIGNlbnRzLgorICAgIC8vIEl0IGFsc28gZGlzYWJsZXMgdGhlIGZpbHRlci4gRG9lcyBub3QgY2xlYXIgdGhlIGRlbGF5IGxpbmVzLgorICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIENsZWFycyBkZWxheSBsaW5lcy4gRG9lcyBub3QgYWx0ZXIgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLyBGcmVlcyB0aGUgb2JqZWN0LiBXaWxsIGZyZWUgdGhlIG1lbW9yeSBpZiB0aGUgb2JqZWN0IG93bmVkIGl0LCBpLmUuIGlmCisgICAgLy8gYSBOVUxMIHBvaW50ZXIgd2FzIHBhc3NlZCB0byBDcmVhdGVJbnN0YW5jZSBhcyBwTWVtLgorICAgIHZvaWQgZnJlZSgpOworCisgICAgLy8gU2V0cyBnYWluIHZhbHVlLiBBY3R1YWwgY2hhbmdlIHdpbGwgb25seSB0YWtlIHBsYWNlIHVwb24gY29tbWl0KCkuCisgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHJlbWVtYmVyZWQgZXZlbiBpZiB0aGUgZmlsdGVyIGlzIGluIGRpc2FibGVkKCkgc3RhdGUuCisgICAgLy8gYmFuZCAgICAgVGhlIGJhbmQgdG8gc2V0IHRoZSBnYWluIGZvci4KKyAgICAvLyBtaWxsaWJlbCBHYWluIHZhbHVlIGluIG1pbGxpYmVsICgxLzEwMCBvZiBkZWNpYmVsKS4KKyAgICB2b2lkIHNldEdhaW4oaW50IGJhbmQsIGludDMyX3QgbWlsbGliZWwpOworCisgICAgLy8gR2V0cyBnYWluIG9mIGEgY2VydGFpbiBiYW5kLiBUaGlzIGlzIGFsd2F5cyB0aGUgbGFzdCB2YWx1ZSBzZXQgKG9yCisgICAgLy8gZGVmYXVsdCB2YWx1ZSBhZnRlciByZXNldCkuCisgICAgLy8gYmFuZCAgICAgVGhlIGJhbmQgdG8gZ2V0IHRoZSBnYWluIGZvci4KKyAgICAvLyByZXR1cm5zICBHYWluIHZhbHVlIGluIG1pbGxpYmVsICgxLzEwMCBvZiBkZWNpYmVsKS4KKyAgICBpbnQzMl90IGdldEdhaW4oaW50IGJhbmQpIGNvbnN0OworCisgICAgLy8gU2V0cyBjdXRvZmYgZnJlcXVlbmN5IHZhbHVlLiBBY3R1YWwgY2hhbmdlIHdpbGwgb25seSB0YWtlIHBsYWNlIHVwb24KKyAgICAvLyBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBiYW5kICAgICAgIFRoZSBiYW5kIHRvIHNldCB0aGUgZnJlcXVlbmN5IGZvci4KKyAgICAvLyBtaWxsaWhlcnR6IEZyZXF1ZW5jeSB2YWx1ZSBpbiBtSHouCisgICAgdm9pZCBzZXRGcmVxdWVuY3koaW50IGJhbmQsIHVpbnQzMl90IG1pbGxpaGVydHopOworCisgICAgLy8gR2V0cyBmcmVxdWVuY3kgb2YgYSBjZXJ0YWluIGJhbmQuIFRoaXMgaXMgYWx3YXlzIHRoZSBsYXN0IHZhbHVlIHNldCAob3IKKyAgICAvLyBkZWZhdWx0IHZhbHVlIGFmdGVyIHJlc2V0KS4KKyAgICAvLyBiYW5kICAgICBUaGUgYmFuZCB0byBnZXQgdGhlIGZyZXF1ZW5jeSBmb3IuCisgICAgLy8gcmV0dXJucyAgRnJlcXVlbmN5IHZhbHVlIGluIG1Iei4KKyAgICB1aW50MzJfdCBnZXRGcmVxdWVuY3koaW50IGJhbmQpIGNvbnN0OworCisgICAgLy8gU2V0cyBiYW5kd2lkdGggdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbiBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBJZiBjYWxsZWQgb24gdGhlIGZpcnN0IG9yIGxhc3QgYmFuZCwgdGhpcyBjYWxsIGlzIGlnbm9yZWQuCisgICAgLy8gYmFuZCAgVGhlIGJhbmQgdG8gc2V0IHRoZSBmcmVxdWVuY3kgZm9yLgorICAgIC8vIGNlbnRzIEJhbmR3aWR0aCB2YWx1ZSBpbiBjZW50cyAoMS8xMjAwIG9jdGF2ZSkuCisgICAgdm9pZCBzZXRCYW5kd2lkdGgoaW50IGJhbmQsIHVpbnQzMl90IGNlbnRzKTsKKworICAgIC8vIEdldHMgYmFuZHdpZHRoIG9mIGEgY2VydGFpbiBiYW5kLiBUaGlzIGlzIGFsd2F5cyB0aGUgbGFzdCB2YWx1ZSBzZXQgKG9yCisgICAgLy8gZGVmYXVsdCB2YWx1ZSBhZnRlciByZXNldCkuIEZvciB0aGUgZmlyc3QgYW5kIGxhc3QgYmFuZHMsIDAgaXMgYWx3YXlzCisgICAgLy8gcmV0dXJuZWQuCisgICAgLy8gYmFuZCAgICAgVGhlIGJhbmQgdG8gZ2V0IHRoZSBiYW5kd2lkdGggZm9yLgorICAgIC8vIHJldHVybnMgIEJhbmR3aWR0aCB2YWx1ZSBpbiBjZW50cyAoMS8xMjAwIG9jdGF2ZSkuCisgICAgdWludDMyX3QgZ2V0QmFuZHdpZHRoKGludCBiYW5kKSBjb25zdDsKKworICAgIC8vIEdldHMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgb2YgYSBiYW5kLgorICAgIC8vIEZvciB0aGUgbG93IHNoZWxmLCB0aGUgbG93IGJvdW5kIGlzIDAgYW5kIHRoZSBoaWdoIGJvdW5kIGlzIHRoZSBiYW5kCisgICAgLy8gZnJlcXVlbmN5LgorICAgIC8vIEZvciB0aGUgaGlnaCBzaGVsZiwgdGhlIGxvdyBib3VuZCBpcyB0aGUgYmFuZCBmcmVxdWVuY3kgYW5kIHRoZSBoaWdoCisgICAgLy8gYm91bmQgaXMgTnlxdWlzdC4KKyAgICAvLyBGb3IgdGhlIHBlYWtpbmcgZmlsdGVycywgdGhleSBhcmUgdGhlIGdhaW5bZEJdLzIgcG9pbnRzLgorICAgIHZvaWQgZ2V0QmFuZFJhbmdlKGludCBiYW5kLCB1aW50MzJfdCAmIGxvdywgdWludDMyX3QgJiBoaWdoKSBjb25zdDsKKworICAgIC8vIEdldHMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciBhIHByZXNldCBJRC4gV2lsbCByZXR1cm4gIkN1c3RvbSIgaWYKKyAgICAvLyBQUkVTRVRfQ1VTVE9NIGlzIHBhc3NlZC4KKyAgICAvLyBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4gTXVzdCBiZSBsZXNzIHRoYW4gbnVtYmVyIG9mIHByZXNldHMuCisgICAgY29uc3QgY2hhciAqIGdldFByZXNldE5hbWUoaW50IHByZXNldCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgcHJlc2V0cy4KKyAgICBpbnQgZ2V0TnVtUHJlc2V0cygpIGNvbnN0OworCisgICAgLy8gR2V0cyB0aGUgY3VycmVudGx5IHNldCBwcmVzZXQgSUQuCisgICAgLy8gV2lsbCByZXR1cm4gUFJFU0VUX0NVU1RPTSBpbiBjYXNlIHRoZSBFUSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBtb2RpZmllZAorICAgIC8vIG1hbnVhbGx5IHNpbmNlIGEgcHJlc2V0IHdhcyBzZXQuCisgICAgaW50IGdldFByZXNldCgpIGNvbnN0OworCisgICAgLy8gU2V0cyB0aGUgY3VycmVudCBwcmVzZXQgYnkgSUQuCisgICAgLy8gQWxsIHRoZSBiYW5kIHBhcmFtZXRlcnMgd2lsbCBiZSBvdmVycmlkZGVuLgorICAgIC8vIENoYW5nZSB3aWxsIG5vdCBiZSBhcHBsaWVkIHVudGlsIGNvbW1pdCgpIGlzIGNhbGxlZC4KKyAgICAvLyBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4gTXVzdCBiZSBsZXNzIHRoYW4gbnVtYmVyIG9mIHByZXNldHMuCisgICAgLy8gICAgICAgICAgICAgIFBSRVNFVF9DVVNUT00gaXMgTk9UIGEgdmFsaWQgdmFsdWUgaGVyZS4KKyAgICB2b2lkIHNldFByZXNldChpbnQgcHJlc2V0KTsKKworICAgIC8vIEFwcGxpZXMgYWxsIHBhcmFtZXRlciBjaGFuZ2VzIGRvbmUgdG8gdGhpcyBwb2ludCBpbiB0aW1lLgorICAgIC8vIElmIHRoZSBmaWx0ZXIgaXMgZGlzYWJsZWQsIHRoZSBuZXcgcGFyYW1ldGVycyB3aWxsIHRha2UgcGxhY2Ugd2hlbiBpdCBpcworICAgIC8vIGVuYWJsZWQgYWdhaW4uIERvZXMgbm90IGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseSAoaWdub3JlZCBpZiBmaWx0ZXIgaXMKKyAgICAvLyBkaXNhYmxlZCkuCisgICB2b2lkIGNvbW1pdChib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIFByb2Nlc3MgYSBidWZmZXIgb2YgaW5wdXQgZGF0YS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgc2hvdWxkIGNvbnRhaW4KKyAgICAvLyBmcmFtZUNvdW50ICogbkNoYW5uZWxzIGludGVybGFjZWQgc2FtcGxlcy4gUHJvY2Vzc2luZyBjYW4gYmUgZG9uZQorICAgIC8vIGluLXBsYWNlLCBieSBwYXNzaW5nIHRoZSBzYW1lIGJ1ZmZlciBhcyBib3RoIGFyZ3VtZW50cy4KKyAgICAvLyBwSW4gICAgICAgICAgSW5wdXQgYnVmZmVyLgorICAgIC8vIHBPdXQgICAgICAgICBPdXRwdXQgYnVmZmVyLgorICAgIC8vIGZyYW1lQ291bnQgICBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2R1Y2Ugb24gZWFjaCBjYWxsIHRvIHByb2Nlc3MoKS4KKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBwSW4sIGF1ZGlvX3NhbXBsZV90ICogcE91dCwKKyAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworCisgICAgLy8gRW5hYmxlcyB0aGUgZmlsdGVyLCBzbyBpdCB3b3VsZCBzdGFydCBwcm9jZXNzaW5nIGlucHV0LiBEb2VzIG5vdAorICAgIC8vIGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseS4KKyAgICB2b2lkIGVuYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIERpc2FibGVkIChieXBhc3NlcykgdGhlIGZpbHRlci4gRG9lcyBub3QgaW50cm9kdWNlIGFydGlmYWN0cywgdW5sZXNzCisgICAgLy8gaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkuCisgICAgdm9pZCBkaXNhYmxlKGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpOworCisgICAgLy8gUmV0dXJucyB0aGUgYmFuZCB3aXRoIHRoZSBtYXhpbXVtIGluZmx1ZW5jZSBvbiBhIGdpdmVuIGZyZXF1ZW5jeS4KKyAgICAvLyBSZXN1bHQgaXMgdW5hZmZlY3RlZCBieSB3aGV0aGVyIEVRIGlzIGVuYWJsZWQgb3Igbm90LCBvciBieSB3aGV0aGVyCisgICAgLy8gY2hhbmdlcyBoYXZlIGJlZW4gY29tbWl0dGVkIG9yIG5vdC4KKyAgICAvLyB0YXJnZXRGcmVxICAgVGhlIHRhcmdldCBmcmVxdWVuY3ksIGluIG1pbGxpaGVydHouCisgICAgaW50IGdldE1vc3RSZWxldmFudEJhbmQodWludDMyX3QgdGFyZ2V0RnJlcSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gQm90dG9tIGZyZXF1ZW5jeSwgaW4gbUh6LgorICAgIHN0YXRpYyBjb25zdCBpbnQga01pbkZyZXEgPSAyMDAwMDsKKyAgICAvLyBTYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgaW50IG1TYW1wbGVSYXRlOworICAgIC8vIE51bWJlciBvZiBwZWFraW5nIGZpbHRlcnMuIFRvdGFsIG51bWJlciBvZiBiYW5kcyBpcyArMi4KKyAgICBpbnQgbU51bVBlYWtpbmc7CisgICAgLy8gUHJlc2V0IGNvbmZpZ3VyYXRpb25zLgorICAgIGNvbnN0IFByZXNldENvbmZpZyAqIG1wUHJlc2V0czsKKyAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbXBQcmVzZXRzOworICAgIGludCBtTnVtUHJlc2V0czsKKyAgICAvLyBDdXJyZW50IHByZXNldC4KKyAgICBpbnQgbUN1clByZXNldDsKKworICAgIC8vIE1lbW9yeSBzcGFjZSB0byBmcmVlIHdoZW4gaW5zdGFuY2UgaXMgZGVsZXRlZCwgb3IgTlVMTCBpZiBubyBtZW1vcnkgaXMKKyAgICAvLyBvd25lZC4KKyAgICB2b2lkICogbXBNZW07CisgICAgLy8gVGhlIGxvdy1zaGVsdmluZyBmaWx0ZXIuCisgICAgQXVkaW9TaGVsdmluZ0ZpbHRlciAqIG1wTG93U2hlbGY7CisgICAgLy8gVGhlIGhpZ2gtc2hlbHZpbmcgZmlsdGVyLgorICAgIEF1ZGlvU2hlbHZpbmdGaWx0ZXIgKiBtcEhpZ2hTaGVsZjsKKyAgICAvLyBBbiBhcnJheSBvZiBzaXplIG1OdW1QZWFraW5nIG9mIHBlYWtpbmcgZmlsdGVycy4KKyAgICBBdWRpb1BlYWtpbmdGaWx0ZXIgKiBtcFBlYWtpbmdGaWx0ZXJzOworCisgICAgLy8gQ29uc3RydWN0b3IuIFJlc2V0cyB0aGUgZmlsdGVyIChzZWUgcmVzZXQoKSkuIE11c3QgY2FsbCBpbml0KCkgZG9pbmcKKyAgICAvLyBhbnl0aGluZyBlbHNlLgorICAgIC8vIHBNZW0gICAgICAgTWVtb3J5IGJ1ZmZlciBmb3IgYmFuZHMuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIC8vIG93bk1lbSAgICAgV2hldGhlciBwTWVtIGlzIG93bmVkIGJ5IG1lLgorICAgIC8vIHByZXNldHMgICAgICBUaGUgcHJlc2V0cyBjb25maWd1cmF0aW9uLiBNYXkgYmUgTlVMTCwgYnV0IGluIHRoYXQgY2FzZSB0aGUKKyAgICAvLyAgICAgICAgICAgICAgY2xpZW50IGlzIHJlcXVpcmVkIG5vdCB0byBjYWxsIHByZXNldC1yZWxhdGVkIGZ1bmN0aW9ucy4KKyAgICAvLyAgICAgICAgICAgICAgVGhpcyBhcnJheSBpcyBvd25lZCBieSB0aGUgY2xpZW50IGFuZCBpcyBub3QgY29waWVkLiBJdAorICAgIC8vICAgICAgICAgICAgICBtdXN0IGJlIGtlcHQgdmFsaWQgYnkgdGhlIGNsaWVudCBhcyBsb25nIGFzIHRoZSBpbnN0YW5jZSBpcworICAgIC8vICAgICAgICAgICAgICBhbGl2ZS4KKyAgICAvLyBuUHJlc2V0cyAgICAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwcmVzZXRzIGFycmF5LgorICAgIEF1ZGlvRXF1YWxpemVyKHZvaWQgKiBwTWVtLCBpbnQgbkJhbmRzLCBpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIG93bk1lbSwgY29uc3QgUHJlc2V0Q29uZmlnICogcHJlc2V0cywgaW50IG5QcmVzZXRzKTsKK307CisKK30KKworI2VuZGlmIC8vIEFVRElPRVFVQUxJWkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNlYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaApAQCAtMCwwICsxLDE4NCBAQAorLyogL2FuZHJvaWQvc3JjL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJlZmZlY3RzL0F1ZGlvRm9ybWF0QWRhcHRlci5oCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQVVESU9GT1JNQVRBREFQVEVSX0hfCisjZGVmaW5lIEFVRElPRk9STUFUQURBUFRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKworI2RlZmluZSBtaW4oeCx5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQW4gYWRhcHRlciBmb3IgYW4gYXVkaW8gcHJvY2Vzc29yIHdvcmtpbmcgb24gYXVkaW9fc2FtcGxlX3Qgc2FtcGxlcyB3aXRoIGEKKy8vIGJ1ZmZlciBvdmVycmlkZSBiZWhhdmlvciB0byBhcmJpdHJhcnkgc2FtcGxlIGZvcm1hdHMgYW5kIGJ1ZmZlciBiZWhhdmlvcnMuCisvLyBUaGUgYWRhcHRlciBtYXkgd29yayBvbiBhbnkgcHJvY2Vzc2luZyBjbGFzcyB3aGljaCBoYXMgYSBwcm9jZXNzaW5nIGZ1bmN0aW9uCisvLyB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgorLy8gdm9pZCBwcm9jZXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogcEluLAorLy8gICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogcE91dCwKKy8vICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CisvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yIHdvcmtzIGluIFM3LjI0IGZvcm1hdCBhbmQgYW4KKy8vIG92ZXJ3cml0ZSBiZWhhdmlvci4KKy8vCisvLyBVc2FnZSBpcyBzaW1wbGU6IGp1c3Qgd29yayB3aXRoIHRoZSBwcm9jZXNzb3Igbm9ybWFsbHksIGJ1dCBpbnN0ZWFkIG9mCisvLyBjYWxsaW5nIGl0cyBwcm9jZXNzKCkgZnVuY3Rpb24gZGlyZWN0bHksIHdvcmsgd2l0aCB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIG9mCisvLyB0aGUgYWRhcHRlci4KKy8vIFRoZSBhZGFwdGVyIHN1cHBvcnRzIHJlLWNvbmZpZ3VyYXRpb24gdG8gYSBkaWZmZXJlbnQgZm9ybWF0IG9uIHRoZSBmbHkuCisvLworLy8gVCAgICAgICAgVGhlIHByb2Nlc3NvciBjbGFzcy4KKy8vIGJ1ZlNpemUgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIChzaW5nbGUgY2hhbm5lbCkgdG8gcHJvY2VzcyBvbiBhCisvLyAgICAgICAgICBzaW5nbGUgY2FsbCB0byB0aGUgdW5kZXJseWluZyBwcm9jZXNzb3IuIFNldHRpbmcgdGhpcyB0byBhIHNtYWxsCisvLyAgICAgICAgICBudW1iZXIgd2lsbCBzYXZlIGEgbGl0dGxlIG1lbW9yeSwgYnV0IHdpbGwgY29zdCBmdW5jdGlvbiBjYWxsCisvLyAgICAgICAgICBvdmVyaGVhZCwgcmVzdWx0aW5nIGZyb20gbXVsdGlwbGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgcHJvY2VzcygpCisvLyAgICAgICAgICBwZXIgYSBzaW5nbGUgY2FsbCB0byB0aGlzIGNsYXNzJ3MgcHJvY2VzcygpLgordGVtcGxhdGU8Y2xhc3MgVCwgc2l6ZV90IGJ1ZlNpemU+CitjbGFzcyBBdWRpb0Zvcm1hdEFkYXB0ZXIgeworcHVibGljOgorICAgIC8vIENvbmZpZ3VyZSB0aGUgYWRhcHRlci4KKyAgICAvLyBwcm9jZXNzb3IgICAgVGhlIHVuZGVybHlpbmcgYXVkaW8gcHJvY2Vzc29yLgorICAgIC8vIG5DaGFubmVscyAgICBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4gVGhlIGFkYXB0ZXIgZG9lcyBub3QgZG8KKyAgICAvLyAgICAgICAgICAgICAgY2hhbm5lbCBjb252ZXJzaW9uIC0gdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlCisgICAgLy8gICAgICAgICAgICAgIGFjdHVhbCBwcm9jZXNzb3IuCisgICAgLy8gcGNtRm9ybWF0ICAgIFRoZSBkZXNpcmVkIGlucHV0L291dHB1dCBzYW1wbGUgZm9ybWF0LgorICAgIC8vIGJlaGF2aW9yICAgICBUaGUgZGVzaXJlZCBiZWhhdmlvciAob3ZlcndyaXRlIG9yIGFjY3VtdWxhdGUpLgorICAgIHZvaWQgY29uZmlndXJlKFQgJiBwcm9jZXNzb3IsIGludCBuQ2hhbm5lbHMsIHVpbnQ4X3QgcGNtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJlaGF2aW9yKSB7CisgICAgICAgIG1wUHJvY2Vzc29yID0gJnByb2Nlc3NvcjsKKyAgICAgICAgbU51bUNoYW5uZWxzID0gbkNoYW5uZWxzOworICAgICAgICBtUGNtRm9ybWF0ID0gcGNtRm9ybWF0OworICAgICAgICBtQmVoYXZpb3IgPSBiZWhhdmlvcjsKKyAgICAgICAgbU1heFNhbXBsZXNQZXJDYWxsID0gYnVmU2l6ZSAvIG5DaGFubmVsczsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcy4KKyAgICAvLyBwSW4gICAgICAgICAgQSBidWZmZXIgb2Ygc2FtcGxlcyB3aXRoIHRoZSBmb3JtYXQgc3BlY2lmaWVkIG9uCisgICAgLy8gICAgICAgICAgICAgIGNvbmZpZ3VyZSgpLgorICAgIC8vIHBPdXQgICAgICAgICBBIGJ1ZmZlciBvZiBzYW1wbGVzIHdpdGggdGhlIGZvcm1hdCBzcGVjaWZpZWQgb24KKyAgICAvLyAgICAgICAgICAgICAgY29uZmlndXJlKCkuIE1heSBiZSB0aGUgc2FtZSBhcyBwSW4uCisgICAgLy8gbnVtU2FtcGxlcyAgIFRoZSBudW1iZXIgb2YgbXVsdGktY2hhbm5lbCBzYW1wbGVzIHRvIHByb2Nlc3MuCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHZvaWQgKiBwSW4sIHZvaWQgKiBwT3V0LCB1aW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgICAgIHdoaWxlIChudW1TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlc0l0ZXIgPSBtaW4obnVtU2FtcGxlcywgbU1heFNhbXBsZXNQZXJDYWxsKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5TYW1wbGVzQ2hhbm5lbHMgPSBudW1TYW1wbGVzSXRlciAqIG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgeworICAgICAgICAgICAgICAgICAgICBtcFByb2Nlc3Nvci0+cHJvY2VzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYXVkaW9fc2FtcGxlX3QgKj4gKHBJbiksCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGF1ZGlvX3NhbXBsZV90ICo+IChwT3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXNJdGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIG1wUHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBhdWRpb19zYW1wbGVfdCAqPiAocEluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIsIG51bVNhbXBsZXNJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgTWl4T3V0cHV0KHBPdXQsIG51bVNhbXBsZXNJdGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwSW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGF1ZGlvX3NhbXBsZV90ICo+IChwSW4pCisgICAgICAgICAgICAgICAgICAgICAgICArIG5TYW1wbGVzQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgcE91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8YXVkaW9fc2FtcGxlX3QgKj4gKHBPdXQpCisgICAgICAgICAgICAgICAgICAgICAgICArIG5TYW1wbGVzQ2hhbm5lbHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvbnZlcnRJbnB1dChwSW4sIG5TYW1wbGVzQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIG1wUHJvY2Vzc29yLT5wcm9jZXNzKG1CdWZmZXIsIG1CdWZmZXIsIG51bVNhbXBsZXNJdGVyKTsKKyAgICAgICAgICAgICAgICBDb252ZXJ0T3V0cHV0KHBPdXQsIG5TYW1wbGVzQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBudW1TYW1wbGVzSXRlcjsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGUgdW5kZXJseWluZyBwcm9jZXNzb3IuCisgICAgVCAqIG1wUHJvY2Vzc29yOworICAgIC8vIFRoZSBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzLgorICAgIGludCBtTnVtQ2hhbm5lbHM7CisgICAgLy8gVGhlIGRlc2lyZWQgUENNIGZvcm1hdC4KKyAgICB1aW50OF90IG1QY21Gb3JtYXQ7CisgICAgLy8gVGhlIGRlc2lyZWQgYnVmZmVyIGJlaGF2aW9yLgorICAgIHVpbnQzMl90IG1CZWhhdmlvcjsKKyAgICAvLyBBbiBpbnRlcm1lZGlhdGUgYnVmZmVyIGZvciBwcm9jZXNzaW5nLgorICAgIGF1ZGlvX3NhbXBsZV90IG1CdWZmZXJbYnVmU2l6ZV07CisgICAgLy8gVGhlIGJ1ZmZlciBzaXplLCBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgLSByZXByZXNlbnRzIHRoZQorICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIG11bHRpLWNoYW5uZWwgc2FtcGxlcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlCisgICAgLy8gaW50ZXJtZWRpYXRlIGJ1ZmZlci4KKyAgICBzaXplX3QgbU1heFNhbXBsZXNQZXJDYWxsOworCisgICAgLy8gQ29udmVydHMgYSBidWZmZXIgb2YgaW5wdXQgc2FtcGxlcyB0byBhdWRpb19zYW1wbGVfdCBmb3JtYXQuCisgICAgLy8gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIGludGVybWVkaWF0ZSBidWZmZXIuCisgICAgLy8gcEluICAgICAgICAgIFRoZSBpbnB1dCBidWZmZXIgd2l0aCB0aGUgZm9ybWF0IGRlc2lnbmF0ZWQgaW4gY29uZmlndXJlKCkuCisgICAgLy8gICAgICAgICAgICAgIFdoZW4gZnVuY3Rpb24gZXhpc3Qgd2lsbCBwb2ludCB0byB0aGUgbmV4dCB1bnJlYWQgaW5wdXQKKyAgICAvLyAgICAgICAgICAgICAgc2FtcGxlLgorICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KKyAgICB2b2lkIENvbnZlcnRJbnB1dChjb25zdCB2b2lkIComIHBJbiwgdWludDMyX3QgbnVtU2FtcGxlcykgeworICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBwSW4xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihwSW4pOworICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBwT3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgKihwT3V0KyspID0gczE1X3RvX2F1ZGlvX3NhbXBsZV90KCoocEluMTYrKykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEluID0gcEluMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29udmVydHMgYXVkaW9fc2FtcGxlX3Qgc2FtcGxlcyBmcm9tIHRoZSBpbnRlcm1lZGlhdGUgYnVmZmVyIHRvIHRoZQorICAgIC8vIG91dHB1dCBidWZmZXIsIGNvbnZlcnRpbmcgdG8gdGhlIGRlc2lyZWQgZm9ybWF0IGFuZCBidWZmZXIgYmVoYXZpb3IuCisgICAgLy8gcE91dCAgICAgICAgIFRoZSBidWZmZXIgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyAgICAvLyAgICAgICAgICAgICAgV2hlbiBmdW5jdGlvbiBleGlzdCB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IG91dHB1dCBzYW1wbGUuCisgICAgLy8gbnVtU2FtcGxlcyAgIFRoZSBudW1iZXIgb2Ygc2luZ2xlLWNoYW5uZWwgc2FtcGxlcyB0byBwcm9jZXNzLgorICAgIHZvaWQgQ29udmVydE91dHB1dCh2b2lkIComIHBPdXQsIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19zYW1wbGVfdCAqIHBJbiA9IG1CdWZmZXI7CisgICAgICAgICAgICBpbnQxNl90ICogcE91dDE2ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHBPdXQpOworICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICoocE91dDE2KyspID0gYXVkaW9fc2FtcGxlX3RfdG9fczE1X2NsaXAoKihwSW4rKykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUJlaGF2aW9yID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnVtU2FtcGxlcy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAqKHBPdXQxNisrKSArPSBhdWRpb19zYW1wbGVfdF90b19zMTVfY2xpcCgqKHBJbisrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dCA9IHBPdXQxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBY2N1bXVsYXRlIGRhdGEgZnJvbSB0aGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byB0aGUgb3V0cHV0LiBPdXRwdXQgaXMKKyAgICAvLyBhc3N1bWVkIHRvIGJlIG9mIGF1ZGlvX3NhbXBsZV90IHR5cGUuCisgICAgLy8gcE91dCAgICAgICAgIFRoZSBidWZmZXIgdG8gbWl4IHRoZSBvdXRwdXQgdG8uCisgICAgLy8gICAgICAgICAgICAgIFdoZW4gZnVuY3Rpb24gZXhpc3Qgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBvdXRwdXQgc2FtcGxlLgorICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KKyAgICB2b2lkIE1peE91dHB1dCh2b2lkIComIHBPdXQsIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBwSW4gPSBtQnVmZmVyOworICAgICAgICBhdWRpb19zYW1wbGVfdCAqIHBPdXQyNCA9IHJlaW50ZXJwcmV0X2Nhc3Q8YXVkaW9fc2FtcGxlX3QgKj4ocE91dCk7CisgICAgICAgIG51bVNhbXBsZXMgKj0gbU51bUNoYW5uZWxzOworICAgICAgICB3aGlsZSAobnVtU2FtcGxlcy0tID4gMCkgeworICAgICAgICAgICAgKihwT3V0MjQrKykgKz0gKihwSW4rKyk7CisgICAgICAgIH0KKyAgICAgICAgcE91dCA9IHBPdXQyNDsKKyAgICB9Cit9OworCit9CisKKyNlbmRpZiAvLyBBVURJT0ZPUk1BVEFEQVBURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9IaWdoU2hlbGZGaWx0ZXJDb2VmLmlubCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9IaWdoU2hlbGZGaWx0ZXJDb2VmLmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmJhMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0hpZ2hTaGVsZkZpbHRlckNvZWYuaW5sCkBAIC0wLDAgKzEsMjI1IEBACisxMzY3OSwKKzIxNTc1LAorODkyMSwKKzMyMzE1MDU2LAorLTE1NTgyMDE1LAorMjYxNzIsCiszNzY3OCwKKzE0Nzk3LAorMzE4OTEwOTYsCistMTUxOTI1MjcsCis1MTAyMCwKKzY0NDQ5LAorMjM5NDUsCiszMTMyMjk4OCwKKy0xNDY4NTE4NiwKKzEwMTgxNywKKzEwNjE0NCwKKzM3NzQ0LAorMzA1NjI4ODIsCistMTQwMzEzNzIsCisyMDg5OTYsCisxNjIxNjMsCis1ODUzNiwKKzI5NTQ4NTM4LAorLTEzMjAxMDE3LAorNDQyOTk2LAorMjA3NDU5LAorOTMzMDAsCisyODIwMDc5MiwKKy0xMjE2NzMzMSwKKzk3MTQyMywKKzEyODc4NiwKKzE2OTY5MCwKKzI2NDIyNzQ0LAorLTEwOTE1NDI4LAorMjIwMDQ2MSwKKy00NjU2ODYsCiszOTQ5ODYsCisyNDEwMzMxNywKKy05NDU1ODYyLAorNTExOTk5MSwKKy0yNzc3MTk5LAorMTE0NzI0NSwKKzIxMTI5NDczLAorLTc4NDIyOTQsCisxMjEyMDM3OSwKKy0xMDE5ODE2MCwKKzM2MzE1NDQsCisxNzQxMTgzNywKKy02MTg4Mzg0LAorMjg4MzQyMzQsCistMzE2NDcxMzUsCisxMTMzNzc5NSwKKzEyOTI0OTYwLAorLTQ2NzI2MzgsCis2ODAzNzc2NiwKKy04ODk3NDM4OCwKKzMzNDc3MjU1LAorNzc1MjY4MCwKKy0zNTE2MDk4LAorMTU3MzY5OTQ0LAorLTIzMjA2MzE2MCwKKzkyMjgyMTI5LAorMjExMzkyNiwKKy0yOTI1NjI0LAorMzUzNzIwMTEyLAorLTU2NzQyNzE0NCwKKzIzNzE2NDExMiwKKy0zNjU5OTkzLAorLTMwMTk4NzEsCis3NjkwOTExNTEsCistMTMwOTg3MTk0OSwKKzU3MDUzOTQzMCwKKy05MjAyMTE0LAorLTM3NzkzMDIsCis2Njc5MSwKKzEyMTcwNiwKKzU1ODg4LAorMzA1NzEyNDUsCistMTQwMzg0MTUsCisxMjA0MjYsCisyMTIxNzgsCis5NDgyMCwKKzI5NTU5Njc5LAorLTEzMjA5ODg2LAorMjE3MTMwLAorMzY1MTY1LAorMTU3NjEwLAorMjgyMTU1NTQsCistMTIxNzgyNDMsCiszOTE0ODksCis2MTcwMTYsCisyNTUwMTAsCisyNjQ0MjEzMSwKKy0xMDkyODQzMSwKKzcwNTg2MiwKKzEwMTUxNDcsCiszOTg0NTcsCisyNDEyODQzMCwKKy05NDcwNjgwLAorMTI3MjY4MiwKKzE2MDUyNTEsCis1OTYxMDIsCisyMTE2MTMzNCwKKy03ODU4MTUzLAorMjI5NDY2OCwKKzIzODY4MzMsCis4NDg1MjMsCisxNzQ1MTA3MiwKKy02MjAzODgwLAorNDEzNzMyNywKKzMxOTg3ODksCisxMTU1NTM2LAorMTI5NzEzNjIsCistNDY4NTc5OCwKKzc0NTk2NzUsCiszNDcwMjY2LAorMTU2NzIxOSwKKzc4MDQ4MTgsCistMzUyNDc2MSwKKzEzNDQ5OTI2LAorMTczODkxMSwKKzIzNDc0MDYsCisyMTY5MDg5LAorLTI5MjgxMTYsCisyNDI1MDQ1NSwKKy01MjExMjQxLAorNDM1ODk3MSwKKy0zNjA1Mjk4LAorLTMwMTU2NzEsCis0MzcyNDAwMSwKKy0yMzg0OTU3MCwKKzk4MjMzMTUsCistOTE1MTI1MywKKy0zNzY5Mjc3LAorNzg4MzUxNTAsCistNjY1NDIzNzUsCisyMzY4NjM3MywKKy0xNDE2MTE0MywKKy01MDQwNzkwLAorMTQyMTQxMTczLAorLTE1NjMyNDI2MSwKKzU2MDI0MjM0LAorLTE4NDUxMjc1LAorLTY2MTI2NTYsCisyNTYyODMwNTcsCistMzM1NjA2MzI2LAorMTI2MzQxMjQ0LAorLTIxOTcwMDA0LAorLTgyNzA3NTUsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCisxNjc3NzIxNiwKKzMzNTU0NDMyLAorMTY3NzcyMTYsCistMzM1NTQ0MzIsCistMTY3NzcyMTYsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvTG93U2hlbGZGaWx0ZXJDb2VmLmlubCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Mb3dTaGVsZkZpbHRlckNvZWYuaW5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2RlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvTG93U2hlbGZGaWx0ZXJDb2VmLmlubApAQCAtMCwwICsxLDM3NSBAQAorMTYyMTI1MDYsCistMzI0MjA1NzQsCisxNjIwODA2OCwKKzMyNDAxNDExLAorLTE1NjYyNTIxLAorMTYzNTYxMjksCistMzI3MDYyNDYsCisxNjM1MDExOCwKKzMyNjk1NTI1LAorLTE1OTM5NzUyLAorMTY0NjQzOTksCistMzI5MjA2NzAsCisxNjQ1NjI3NCwKKzMyOTE0Njg2LAorLTE2MTQ5NDQxLAorMTY1NDYxMjgsCistMzMwODEyODksCisxNjUzNTE2NSwKKzMzMDc3OTU1LAorLTE2MzA3NDExLAorMTY2MDgxMDEsCistMzMyMDE0MjIsCisxNjU5MzMyOCwKKzMzMTk5NTY5LAorLTE2NDI2MDY3LAorMTY2NTU1MzksCistMzMyOTExNzQsCisxNjYzNTY0NywKKzMzMjkwMTQ3LAorLTE2NTE0OTk3LAorMTY2OTI0NzgsCistMzMzNTgxNzEsCisxNjY2NTcxNSwKKzMzMzU3NjA4LAorLTE2NTgxNTQwLAorMTY3MjIwODksCistMzM0MDgxNDksCisxNjY4NjA5OSwKKzMzNDA3ODUwLAorLTE2NjMxMjcxLAorMTY3NDY5MzAsCistMzM0NDU0MDksCisxNjY5ODU0OSwKKzMzNDQ1MjY3LAorLTE2NjY4NDA1LAorMTY3NjkxNTYsCistMzM0NzMxNjgsCisxNjcwNDEzOCwKKzMzNDczMTMzLAorLTE2Njk2MTE0LAorMTY3OTA3MDYsCistMzM0OTM4MjcsCisxNjcwMzM0OCwKKzMzNDkzODg2LAorLTE2NzE2Nzc5LAorMTY4MTM0NjYsCistMzM1MDkxNjYsCisxNjY5NjExMSwKKzMzNTA5MzQyLAorLTE2NzMyMTg2LAorMTY4Mzk0MzcsCistMzM1MjA0OTgsCisxNjY4MTgwMiwKKzMzNTIwODUyLAorLTE2NzQzNjY5LAorMTY4NzA5MTEsCistMzM1Mjg3NjUsCisxNjY1OTE5MSwKKzMzNTI5NDI0LAorLTE2NzUyMjI2LAorMTY5MTA2ODEsCistMzM1MzQ2MDcsCisxNjYyNjMzNywKKzMzNTM1ODA3LAorLTE2NzU4NjAyLAorMTU2Njc0MDEsCistMzEzMjYyMjQsCisxNTY1ODgyNSwKKzMxMjUyMTYxLAorLTE0NjIzMDc0LAorMTU5NDU4NjUsCistMzE4ODAwMDcsCisxNTkzNDE0NiwKKzMxODM4MjA1LAorLTE1MTQ0NTk3LAorMTYxNTc1MjEsCistMzIyOTkwOTEsCisxNjE0MTU3OCwKKzMyMjc1NjA0LAorLTE1NTQ1MzY5LAorMTYzMTgyNjcsCistMzI2MTQ5MDMsCisxNjI5NjY1MSwKKzMyNjAxNzU1LAorLTE1ODUwODUwLAorMTY0NDA3MTAsCistMzI4NTIxNTcsCisxNjQxMTQ3MywKKzMyODQ0ODIwLAorLTE2MDgyMzAzLAorMTY1MzQ3NTEsCistMzMwMjk5ODUsCisxNjQ5NTI4MSwKKzMzMDI1OTEwLAorLTE2MjU2ODkxLAorMTY2MDgxNzEsCistMzMxNjMwNDMsCisxNjU1NDk1NywKKzMzMTYwODAzLAorLTE2Mzg4MTUyLAorMTY2NjcxNDUsCistMzMyNjI0NjgsCisxNjU5NTQ3NywKKzMzMjYxMjc1LAorLTE2NDg2NTk5LAorMTY3MTY2OTksCistMzMzMzY2NzEsCisxNjYyMDI1MiwKKzMzMzM2MTA1LAorLTE2NTYwMzAxLAorMTY3NjExMDAsCistMzMzOTE5NzYsCisxNjYzMTM3OSwKKzMzMzkxODM2LAorLTE2NjE1NDA0LAorMTY4MDQyMDcsCistMzM0MzMxMDMsCisxNjYyOTgwNiwKKzMzNDMzMzQxLAorLTE2NjU2NTYwLAorMTY4NDk3OTQsCistMzM0NjM1NTEsCisxNjYxNTM5OSwKKzMzNDY0MjUxLAorLTE2Njg3Mjc3LAorMTY5MDE4ODcsCistMzM0ODU4NTcsCisxNjU4NjkzMywKKzMzNDg3MjcxLAorLTE2NzEwMTg5LAorMTY5NjUxMjUsCistMzM1MDE3ODEsCisxNjU0MjAwMCwKKzMzNTA0NDE1LAorLTE2NzI3Mjc0LAorMTcwNDUxOTgsCistMzM1MTIzODQsCisxNjQ3NjgyNCwKKzMzNTE3MTgzLAorLTE2NzQwMDA4LAorMTQ2MzUyMDEsCistMjkyNTQzNzYsCisxNDYxOTE4NCwKKzI4OTc3NzExLAorLTEyNzUzODM0LAorMTUxNTc1NTYsCistMzAyOTI4MjUsCisxNTEzNTI4NSwKKzMwMTMzOTM4LAorLTEzNjc0NTEzLAorMTU1NjE1MTEsCistMzEwOTIyOTgsCisxNTUzMDgxNywKKzMxMDAxODYwLAorLTE0NDA1NTUxLAorMTU4NzIyMTEsCistMzE3MDIzNDIsCisxNTgzMDE4NywKKzMxNjUxMjE4LAorLTE0OTc2MzA2LAorMTYxMTEwOTQsCistMzIxNjQ4MzQsCisxNjA1Mzg0MywKKzMyMTM2MTAxLAorLTE1NDE2NDUzLAorMTYyOTU4NDgsCistMzI1MTM4MDIsCisxNjIxODE0MCwKKzMyNDk3NzU3LAorLTE1NzUyODE3LAorMTY0NDA4NTIsCistMzI3NzYxNzksCisxNjMzNTY2NSwKKzMyNzY3MzI2LAorLTE2MDA4MTU1LAorMTY1NTc4MDQsCistMzI5NzI5MDcsCisxNjQxNTcxNSwKKzMyOTY4MTc5LAorLTE2MjAxMDMxLAorMTY2NTY0MDMsCistMzMxMjAwNTIsCisxNjQ2NDc1OCwKKzMzMTE3ODAyLAorLTE2MzQ2MTk1LAorMTY3NDUwMDEsCistMzMyMjk4MDUsCisxNjQ4NjgxMCwKKzMzMjI5MjQ3LAorLTE2NDU1MTUzLAorMTY4MzEyNDAsCistMzMzMTEzMDYsCisxNjQ4MzY5MiwKKzMzMzEyMjUyLAorLTE2NTM2NzcxLAorMTY5MjI2ODIsCistMzMzNzEyNzgsCisxNjQ1NTE0NSwKKzMzMzc0MDcwLAorLTE2NTk3ODE5LAorMTcwMjc0NzIsCistMzM0MTQ0NjUsCisxNjM5ODgxOCwKKzMzNDIwMTEwLAorLTE2NjQzNDMwLAorMTcxNTUxMDgsCistMzM0NDM4NzUsCisxNjMxMDExMCwKKzMzNDU0Mzk4LAorLTE2Njc3NDc5LAorMTczMTczODQsCistMzM0NjA3NjAsCisxNjE4MTg4NywKKzMzNDc5OTMzLAorLTE2NzAyODgyLAorMTI3OTI3MDMsCistMjU1NTczODgsCisxMjc2NDcxNiwKKzI0NTkwNTA3LAorLTk3NDcwODUsCisxMzcwNjQ2NSwKKy0yNzM3MjYyMSwKKzEzNjY2MjE1LAorMjY3OTgyOTYsCistMTExNjk3OTAsCisxNDQzOTQyNSwKKy0yODgyMTgzMCwKKzE0MzgyNTE4LAorMjg0ODY0NjksCistMTIzODAwODgsCisxNTAxODQ1MywKKy0yOTk1NzI3MywKKzE0OTM5MDMwLAorMjk3NjQwMTgsCistMTMzNzM1MjIsCisxNTQ3MjQ2MCwKKy0zMDgzNDc1NywKKzE1MzYyNjg4LAorMzA3MjQ1NjgsCistMTQxNjgxMjAsCisxNTgyODcyNSwKKy0zMTUwNjEyMywKKzE1Njc4MTE4LAorMzE0NDM5MjgsCistMTQ3OTE4MjIsCisxNjExMTQwNiwKKy0zMjAxNTk4OCwKKzE1OTA1OTAxLAorMzE5ODEzOTEsCistMTUyNzQ2ODgsCisxNjM0MTMyOSwKKy0zMjQwMDk4NCwKKzE2MDYyMDYxLAorMzIzODIzOTgsCistMTU2NDQ3NjEsCisxNjUzNjQ4NCwKKy0zMjY5MDIzOCwKKzE2MTU4MTMzLAorMzI2ODEzNTQsCistMTU5MjYyODYsCisxNjcxMjg1MywKKy0zMjkwNjMzNywKKzE2MjAxNDMyLAorMzI5MDQxMjgsCistMTYxMzkyNzgsCisxNjg4NTQzMCwKKy0zMzA2NjMzNiwKKzE2MTk1MzA2LAorMzMwNzAwOTAsCistMTYyOTk3NjcsCisxNzA2OTM3NywKKy0zMzE4MjU5OSwKKzE2MTM5MjgyLAorMzMxOTM3MTEsCistMTY0MjAzMzIsCisxNzI4MTM3MSwKKy0zMzI2MzI5NCwKKzE2MDI5MDM5LAorMzMyODU3ODUsCistMTY1MTA3MDIsCisxNzU0MTI3MSwKKy0zMzMxMjM5MCwKKzE1ODU2MjQzLAorMzMzNTQzNTksCistMTY1NzgzMjksCisxNzg3NDMzMCwKKy0zMzMyODkwMiwKKzE1NjA4Mjg3LAorMzM0MDU0MzAsCistMTY2Mjg4NzMsCis5ODgxMjc5LAorLTE5NzE5MjY4LAorOTgzODA4NCwKKzE2NzM0MzAzLAorLTU5MjcxMTEsCisxMTI2NDg1NywKKy0yMjQ2MzQ0NywKKzExMTk4Nzg0LAorMjA1Nzc1ODQsCistNzU3MjI4OCwKKzEyNDYwNzM2LAorLTI0ODIzMDQ2LAorMTIzNjI2OTcsCisyMzY2NzM1OSwKKy05MjAxOTAzLAorMTM0NTk4MDUsCistMjY3NzY4NTEsCisxMzMxNzc5OSwKKzI2MDg1NjgzLAorLTEwNjkxNTU1LAorMTQyNzYyODcsCistMjgzNDkyNTYsCisxNDA3NDQwNiwKKzI3OTQzODk5LAorLTExOTc4ODM0LAorMTQ5MzY5NDMsCistMjk1ODgyNDgsCisxNDY1NDAxMSwKKzI5MzU0NTMzLAorLTEzMDQ3NDUzLAorMTU0NzMzMDAsCistMzA1NDkyOTksCisxNTA4MTAzNiwKKzMwNDE3MjAzLAorLTEzOTA5MjE2LAorMTU5MTcyNzEsCistMzEyODU3ODgsCisxNTM3NzgxNywKKzMxMjEzOTcyLAorLTE0NTg5Njg3LAorMTYyOTkzODQsCistMzE4NDQzMjAsCisxNTU2MjAwNiwKKzMxODA5NjgzLAorLTE1MTE4ODExLAorMTY2NDg3NzQsCistMzIyNjI5OTksCisxNTY0NTQxNCwKKzMyMjU0MzI5LAorLTE1NTI1NjQxLAorMTY5OTQyNzcsCistMzI1NzEwOTAsCisxNTYzMzYwNywKKzMyNTg1ODk1LAorLTE1ODM1ODYyLAorMTczNjYzNzQsCistMzI3ODkwMTksCisxNTUyNTgwMSwKKzMyODMzMDAzLAorLTE2MDcwOTc1LAorMTc3OTk5NTUsCistMzI5Mjc4MzQsCisxNTMxNDg5NSwKKzMzMDE3MTA3LAorLTE2MjQ4MzYxLAorMTgzMzgyMDYsCistMzI5ODczMTgsCisxNDk4NzY4NiwKKzMzMTU0MjQ2LAorLTE2MzgxNzQ3LAorMTkwMzgyNzAsCistMzI5NTE1NDUsCisxNDUyNTU5MiwKKzMzMjU2MzkyLAorLTE2NDgxODAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmVmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qIC8vZGV2aWNlL2luY2x1ZGUvc2VydmVyL0F1ZGlvRmxpbmdlci9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCisgKioKKyAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BlYWtpbmdGaWx0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb0NvbW1vbi5oIgorI2luY2x1ZGUgIkVmZmVjdHNNYXRoLmgiCisKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKKyNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gRm9ybWF0IG9mIHRoZSBjb2VmZmljaWVudCB0YWJsZToKKy8vIGtDb2VmVGFibGVbZnJlcV1bZ2Fpbl1bYnddW2NvZWZdCisvLyBmcmVxIC0gcGVhayBmcmVxdWVuY3ksIGluIG9jdGF2ZXMgYmVsb3cgTnlxdWlzdCxmcm9tIC05IHRvIC0xLgorLy8gZ2FpbiAtIGdhaW4sIGluIG1pbGxpYmVsLCBzdGFydGluZyBhdCAtOTYwMCwganVtcHMgb2YgMTAyNCwgdG8gNDczNiBtaWxsaWJlbC4KKy8vIGJ3ICAgLSBiYW5kd2lkdGgsIHN0YXJ0aW5nIGF0IDEgY2VudCwganVtcHMgb2YgMTAyNCwgdG8gMzA3MyBjZW50cy4KKy8vIGNvZWYgLSAwOiBiMAorLy8gICAgICAgIDE6IGIxCisvLyAgICAgICAgMjogYjIKKy8vICAgICAgICAzOiAtYTEKKy8vICAgICAgICA0OiAtYTIKK3N0YXRpYyBjb25zdCBzaXplX3Qga0luRGltc1szXSA9IHs5LCAxNSwgNH07CitzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IGtDb2VmVGFibGVbOSoxNSo0KjVdID0geworI2luY2x1ZGUgIkF1ZGlvUGVha2luZ0ZpbHRlckNvZWYuaW5sIgorfTsKKworQXVkaW9Db2VmSW50ZXJwb2xhdG9yIEF1ZGlvUGVha2luZ0ZpbHRlcjo6bUNvZWZJbnRlcnAoMywga0luRGltcywgNSwgKGNvbnN0IGF1ZGlvX2NvZWZfdCopIGtDb2VmVGFibGUpOworCitBdWRpb1BlYWtpbmdGaWx0ZXI6OkF1ZGlvUGVha2luZ0ZpbHRlcihpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSkKKyAgICAgICAgOiBtQmlxdWFkKG5DaGFubmVscywgc2FtcGxlUmF0ZSkgeworICAgIGNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgQXVkaW9QZWFraW5nRmlsdGVyOjpjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpIHsKKyAgICBtTmlxdWlzdEZyZXEgPSBzYW1wbGVSYXRlICogNTAwOworICAgIG1GcmVxdWVuY3lGYWN0b3IgPSAoKDF1bGwpIDw8IDQyKSAvIG1OaXF1aXN0RnJlcTsKKyAgICBtQmlxdWFkLmNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIHNldEZyZXF1ZW5jeShtTm9taW5hbEZyZXF1ZW5jeSk7CisgICAgY29tbWl0KHRydWUpOworfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6cmVzZXQoKSB7CisgICAgc2V0R2FpbigwKTsKKyAgICBzZXRGcmVxdWVuY3koMCk7CisgICAgc2V0QmFuZHdpZHRoKDI0MDApOworICAgIGNvbW1pdCh0cnVlKTsKK30KKwordm9pZCBBdWRpb1BlYWtpbmdGaWx0ZXI6OnNldEZyZXF1ZW5jeSh1aW50MzJfdCBtaWxsaWhlcnR6KSB7CisgICAgbU5vbWluYWxGcmVxdWVuY3kgPSBtaWxsaWhlcnR6OworICAgIGlmIChVTkxJS0VMWShtaWxsaWhlcnR6ID4gbU5pcXVpc3RGcmVxIC8gMikpIHsKKyAgICAgICAgbWlsbGloZXJ0eiA9IG1OaXF1aXN0RnJlcSAvIDI7CisgICAgfQorICAgIHVpbnQzMl90IG5vcm1GcmVxID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihtaWxsaWhlcnR6KSAqIG1GcmVxdWVuY3lGYWN0b3IpID4+IDEwKTsKKyAgICBpZiAoTElLRUxZKG5vcm1GcmVxID4gKDEgPDwgMjMpKSkgeworICAgICAgICBtRnJlcXVlbmN5ID0gKEVmZmVjdHNfbG9nMihub3JtRnJlcSkgLSAoKDMyLTkpIDw8IDE1KSkgPDwgKEZSRVFfUFJFQ0lTSU9OX0JJVFMgLSAxNSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyZXF1ZW5jeSA9IDA7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6c2V0R2FpbihpbnQzMl90IG1pbGxpYmVsKSB7CisgICAgbUdhaW4gPSBtaWxsaWJlbCArIDk2MDA7Cit9CisKK3ZvaWQgQXVkaW9QZWFraW5nRmlsdGVyOjpzZXRCYW5kd2lkdGgodWludDMyX3QgY2VudHMpIHsKKyAgICBtQmFuZHdpZHRoID0gY2VudHMgLSAxOworfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6Y29tbWl0KGJvb2wgaW1tZWRpYXRlKSB7CisgICAgYXVkaW9fY29lZl90IGNvZWZzWzVdOworICAgIGludCBpbnRDb29yZFszXSA9IHsKKyAgICAgICAgbUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTLAorICAgICAgICBtR2FpbiA+PiBHQUlOX1BSRUNJU0lPTl9CSVRTLAorICAgICAgICBtQmFuZHdpZHRoID4+IEJBTkRXSURUSF9QUkVDSVNJT05fQklUUworICAgIH07CisgICAgdWludDMyX3QgZnJhY0Nvb3JkWzNdID0geworICAgICAgICBtRnJlcXVlbmN5IDw8ICgzMiAtIEZSRVFfUFJFQ0lTSU9OX0JJVFMpLAorICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdhaW4pIDw8ICgzMiAtIEdBSU5fUFJFQ0lTSU9OX0JJVFMpLAorICAgICAgICBtQmFuZHdpZHRoIDw8ICgzMiAtIEJBTkRXSURUSF9QUkVDSVNJT05fQklUUykKKyAgICB9OworICAgIG1Db2VmSW50ZXJwLmdldENvZWYoaW50Q29vcmQsIGZyYWNDb29yZCwgY29lZnMpOworICAgIG1CaXF1YWQuc2V0Q29lZnMoY29lZnMsIGltbWVkaWF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9QZWFraW5nRmlsdGVyOjpnZXRCYW5kUmFuZ2UodWludDMyX3QgJiBsb3csIHVpbnQzMl90ICYgaGlnaCkgY29uc3QgeworICAgIC8vIEhhbGYgYmFuZHdpZHRoLCBpbiBvY3RhdmVzLCAxNS1iaXQgcHJlY2lzaW9uCisgICAgaW50MzJfdCBoYWxmQlcgPSAoKChtQmFuZHdpZHRoICsgMSkgLyAyKSA8PCAxNSkgLyAxMjAwOworCisgICAgbG93ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChzdGF0aWNfY2FzdDx1aW50NjRfdD4obU5vbWluYWxGcmVxdWVuY3kpICogRWZmZWN0c19leHAyKC1oYWxmQlcgKyAoMTYgPDwgMTUpKSkgPj4gMTYpOworICAgIGlmIChVTkxJS0VMWShoYWxmQlcgPj0gKDE2IDw8IDE1KSkpIHsKKyAgICAgICAgaGlnaCA9IG1OaXF1aXN0RnJlcTsKKyAgICB9IGVsc2UgeworICAgICAgICBoaWdoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChzdGF0aWNfY2FzdDx1aW50NjRfdD4obU5vbWluYWxGcmVxdWVuY3kpICogRWZmZWN0c19leHAyKGhhbGZCVyArICgxNiA8PCAxNSkpKSA+PiAxNik7CisgICAgICAgIGlmIChVTkxJS0VMWShoaWdoID4gbU5pcXVpc3RGcmVxKSkgeworICAgICAgICAgICAgaGlnaCA9IG1OaXF1aXN0RnJlcTsKKyAgICAgICAgfQorICAgIH0KK30KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGY0OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuaApAQCAtMCwwICsxLDE1MSBAQAorLyogLy9kZXZpY2UvaW5jbHVkZS9zZXJ2ZXIvQXVkaW9GbGluZ2VyL0F1ZGlvUGVha2luZ0ZpbHRlci5oCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19QRUFLSU5HX0ZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUEVBS0lOR19GSUxURVJfSAorCisjaW5jbHVkZSAiQXVkaW9CaXF1YWRGaWx0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb0NvZWZJbnRlcnBvbGF0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBIHBlYWtpbmcgYXVkaW8gZmlsdGVyLCB3aXRoIHVuaXR5IHNraXJ0IGdhaW4sIGFuZCBjb250cm9sbGFibGUgcGVhaworLy8gZnJlcXVlbmN5LCBnYWluIGFuZCBiYW5kd2lkdGguCisvLyBUaGlzIGZpbHRlciBpcyBhYmxlIHRvIHN1cHByZXNzIGludHJvZHVjZSBkaXNjb250aW51aXRpZXMgYW5kIG90aGVyIGFydGlmYWN0cworLy8gaW4gdGhlIG91dHB1dCwgZXZlbiB3aGVuIGNoYW5naW5nIHBhcmFtZXRlcnMgYWJydXB0bHkuCisvLyBQYXJhbWV0ZXJzIGNhbiBiZSBzZXQgdG8gYW55IHZhbHVlIC0gdGhpcyBjbGFzcyB3aWxsIG1ha2Ugc3VyZSB0byBjbGlwIHRoZW0KKy8vIHdoZW4gdGhleSBhcmUgb3V0IG9mIHN1cHBvcnRlZCByYW5nZS4KKy8vCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlczoKKy8vIFRoaXMgY2xhc3MgdXNlcyBhbiB1bmRlcmx5aW5nIGJpcXVhZCBmaWx0ZXIgd2hvc2UgcGFyYW1ldGVycyBhcmUgZGV0ZXJtaW5lZAorLy8gdXNpbmcgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmcm9tIGEgY29lZmZpY2llbnQgdGFibGUsIHVzaW5nIGEKKy8vIEF1ZGlvQ29lZkludGVycG9sYXRvci4KKy8vIEFsbCBpcyBsZWZ0IGZvciB0aGlzIGNsYXNzIHRvIGRvIGlzIG1hcHBpbmcgYmV0d2VlbiBoaWdoLWxldmVsIHBhcmFtZXRlcnMgdG8KKy8vIGZyYWN0aW9uYWwgaW5kaWNlcyBpbnRvIHRoZSBjb2VmZmljaWVudCB0YWJsZS4KK2NsYXNzIEF1ZGlvUGVha2luZ0ZpbHRlciB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IuIFJlc2V0cyB0aGUgZmlsdGVyIChzZWUgcmVzZXQoKSkuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIEF1ZGlvUGVha2luZ0ZpbHRlcihpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSk7CisKKyAgICAvLyBSZWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci4gQ2hhbmdlcyBpbnB1dC9vdXRwdXQgZm9ybWF0LCBidXQgZG9lcyBub3QKKyAgICAvLyBhbHRlciBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZXMuIENsZWFycyBkZWxheSBsaW5lcy4KKyAgICAvLyBuQ2hhbm5lbHMgIE51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMgKGludGVybGFjZWQpLgorICAgIC8vIHNhbXBsZVJhdGUgVGhlIGlucHV0L291dHB1dCBzYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgdm9pZCBjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpOworCisgICAgLy8gUmVzZXRzIHRoZSBmaWx0ZXIgcGFyYW1ldGVycyB0byB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAvLyBmcmVxdWVuY3k6IDAKKyAgICAvLyBnYWluOiAwCisgICAgLy8gYmFuZHdpZHRoOiAxMjAwIGNlbnRzLgorICAgIC8vIEl0IGFsc28gZGlzYWJsZXMgdGhlIGZpbHRlci4gRG9lcyBub3QgY2xlYXIgdGhlIGRlbGF5IGxpbmVzLgorICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIENsZWFycyBkZWxheSBsaW5lcy4gRG9lcyBub3QgYWx0ZXIgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICB2b2lkIGNsZWFyKCkgeyBtQmlxdWFkLmNsZWFyKCk7IH0KKworICAgIC8vIFNldHMgZ2FpbiB2YWx1ZS4gQWN0dWFsIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBwbGFjZSB1cG9uIGNvbW1pdCgpLgorICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSByZW1lbWJlcmVkIGV2ZW4gaWYgdGhlIGZpbHRlciBpcyBpbiBkaXNhYmxlZCgpIHN0YXRlLgorICAgIC8vIG1pbGxpYmVsIEdhaW4gdmFsdWUgaW4gbWlsbGliZWwgKDEvMTAwIG9mIGRlY2liZWwpLgorICAgIHZvaWQgc2V0R2FpbihpbnQzMl90IG1pbGxpYmVsKTsKKworICAgIC8vIEdldHMgdGhlIGdhaW4sIGluIG1pbGxpYmVsLCBhcyBzZXQuCisgICAgaW50MzJfdCBnZXRHYWluKCkgY29uc3QgeyByZXR1cm4gbUdhaW4gLSA5NjAwOyB9CisKKyAgICAvLyBTZXRzIGJhbmR3aWR0aCB2YWx1ZS4gQWN0dWFsIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBwbGFjZSB1cG9uIGNvbW1pdCgpLgorICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSByZW1lbWJlcmVkIGV2ZW4gaWYgdGhlIGZpbHRlciBpcyBpbiBkaXNhYmxlZCgpIHN0YXRlLgorICAgIC8vIGNlbnRzIEJhbmR3aWR0aCB2YWx1ZSBpbiBjZW50cyAoMS8xMjAwIG9jdGF2ZSkuCisgICAgdm9pZCBzZXRCYW5kd2lkdGgodWludDMyX3QgY2VudHMpOworCisgICAgLy8gR2V0cyB0aGUgZ2FpbiwgaW4gY2VudHMsIGFzIHNldC4KKyAgICB1aW50MzJfdCBnZXRCYW5kd2lkdGgoKSBjb25zdCB7IHJldHVybiBtQmFuZHdpZHRoICsgMTsgfQorCisgICAgLy8gU2V0cyBmcmVxdWVuY3kgdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbiBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBtaWxsaWhlcnR6IEZyZXF1ZW5jeSB2YWx1ZSBpbiBtSHouCisgICAgdm9pZCBzZXRGcmVxdWVuY3kodWludDMyX3QgbWlsbGloZXJ0eik7CisKKyAgICAvLyBHZXRzIHRoZSBmcmVxdWVuY3ksIGluIG1IeiwgYXMgc2V0LgorICAgIHVpbnQzMl90IGdldEZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIG1Ob21pbmFsRnJlcXVlbmN5OyB9CisKKyAgICAvLyBHZXRzIGdhaW5bZEJdLzIgcG9pbnRzLgorICAgIC8vIFJlc3VsdHMgaW4gbUh6LCBhbmQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBub21pbmFsIHZhbHVlcyBzZXQsIG5vdCBvbgorICAgIC8vIHBvc3NpYmx5IHJvdW5kZWQgb3IgdHJ1bmNhdGVkIGFjdHVhbCB2YWx1ZXMuCisgICAgdm9pZCBnZXRCYW5kUmFuZ2UodWludDMyX3QgJiBsb3csIHVpbnQzMl90ICYgaGlnaCkgY29uc3Q7CisKKyAgICAvLyBBcHBsaWVzIGFsbCBwYXJhbWV0ZXIgY2hhbmdlcyBkb25lIHRvIHRoaXMgcG9pbnQgaW4gdGltZS4KKyAgICAvLyBJZiB0aGUgZmlsdGVyIGlzIGRpc2FibGVkLCB0aGUgbmV3IHBhcmFtZXRlcnMgd2lsbCB0YWtlIHBsYWNlIHdoZW4gaXQgaXMKKyAgICAvLyBlbmFibGVkIGFnYWluLiBEb2VzIG5vdCBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MgaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkgKGlnbm9yZWQgaWYgZmlsdGVyIGlzCisgICAgLy8gZGlzYWJsZWQpLgorICAgdm9pZCBjb21taXQoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKKyAgICAvLyBQcm9jZXNzIGEgYnVmZmVyIG9mIGlucHV0IGRhdGEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHNob3VsZCBjb250YWluCisgICAgLy8gZnJhbWVDb3VudCAqIG5DaGFubmVscyBpbnRlcmxhY2VkIHNhbXBsZXMuIFByb2Nlc3NpbmcgY2FuIGJlIGRvbmUKKyAgICAvLyBpbi1wbGFjZSwgYnkgcGFzc2luZyB0aGUgc2FtZSBidWZmZXIgYXMgYm90aCBhcmd1bWVudHMuCisgICAgLy8gaW4gICAgICAgICAgIElucHV0IGJ1ZmZlci4KKyAgICAvLyBvdXQgICAgICAgICAgT3V0cHV0IGJ1ZmZlci4KKyAgICAvLyBmcmFtZUNvdW50ICAgTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9kdWNlLgorICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCBpbltdLCBhdWRpb19zYW1wbGVfdCBvdXRbXSwKKyAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsgbUJpcXVhZC5wcm9jZXNzKGluLCBvdXQsIGZyYW1lQ291bnQpOyB9CisKKyAgICAvLyBFbmFibGVzIHRoZSBmaWx0ZXIsIHNvIGl0IHdvdWxkIHN0YXJ0IHByb2Nlc3NpbmcgaW5wdXQuIERvZXMgbm90CisgICAgLy8gaW50cm9kdWNlIGFydGlmYWN0cywgdW5sZXNzIGltbWVkaWF0ZSBpcyBzZXQuCisgICAgLy8gaW1tZWRpYXRlICAgIFdoZXRoZXIgdG8gYXBwbHkgY2hhbmdlIGFicnVwdGx5LgorICAgIHZvaWQgZW5hYmxlKGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpIHsgbUJpcXVhZC5lbmFibGUoaW1tZWRpYXRlKTsgfQorCisgICAgLy8gRGlzYWJsZWQgKGJ5cGFzc2VzKSB0aGUgZmlsdGVyLiBEb2VzIG5vdCBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MKKyAgICAvLyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseS4KKyAgICB2b2lkIGRpc2FibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSkgeyBtQmlxdWFkLmRpc2FibGUoaW1tZWRpYXRlKTsgfQorCitwcml2YXRlOgorICAgIC8vIFByZWNpc2lvbiBmb3IgdGhlIG1GcmVxdWVuY3kgbWVtYmVyLgorICAgIHN0YXRpYyBjb25zdCBpbnQgRlJFUV9QUkVDSVNJT05fQklUUyA9IDI2OworICAgIC8vIFByZWNpc2lvbiBmb3IgdGhlIG1HYWluIG1lbWJlci4KKyAgICBzdGF0aWMgY29uc3QgaW50IEdBSU5fUFJFQ0lTSU9OX0JJVFMgPSAxMDsKKyAgICAvLyBQcmVjaXNpb24gZm9yIHRoZSBtQmFuZHdpZHRoIG1lbWJlci4KKyAgICBzdGF0aWMgY29uc3QgaW50IEJBTkRXSURUSF9QUkVDSVNJT05fQklUUyA9IDEwOworCisgICAgLy8gTnlxdWlzdCwgaW4gbUh6LgorICAgIHVpbnQzMl90IG1OaXF1aXN0RnJlcTsKKyAgICAvLyBGcmFjdGlvbmFsIGluZGV4IGludG8gdGhlIGdhaW4gZGltZW5zaW9uIG9mIHRoZSBjb2VmIHRhYmxlIGluCisgICAgLy8gR0FJTl9QUkVDSVNJT05fQklUUyBwcmVjaXNpb24uCisgICAgaW50MzJfdCBtR2FpbjsKKyAgICAvLyBGcmFjdGlvbmFsIGluZGV4IGludG8gdGhlIGJhbmR3aWR0aCBkaW1lbnNpb24gb2YgdGhlIGNvZWYgdGFibGUgaW4KKyAgICAvLyBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMgcHJlY2lzaW9uLgorICAgIHVpbnQzMl90IG1CYW5kd2lkdGg7CisgICAgLy8gRnJhY3Rpb25hbCBpbmRleCBpbnRvIHRoZSBmcmVxdWVuY3kgZGltZW5zaW9uIG9mIHRoZSBjb2VmIHRhYmxlIGluCisgICAgLy8gRlJFUV9QUkVDSVNJT05fQklUUyBwcmVjaXNpb24uCisgICAgdWludDMyX3QgbUZyZXF1ZW5jeTsKKyAgICAvLyBOb21pbmFsIHZhbHVlIG9mIGZyZXF1ZW5jeSwgYXMgc2V0LgorICAgIHVpbnQzMl90IG1Ob21pbmFsRnJlcXVlbmN5OworICAgIC8vIDEvTnlxdWlzdFttSHpdLCBpbiA0Mi1iaXQgcHJlY2lzaW9uICh2ZXJ5IHNtYWxsKS4KKyAgICAvLyBVc2VkIGZvciBzY2FsaW5nIHRoZSBmcmVxdWVuY3kuCisgICAgdWludDMyX3QgbUZyZXF1ZW5jeUZhY3RvcjsKKworICAgIC8vIEEgYmlxdWFkIGZpbHRlciwgdXNlZCBmb3IgdGhlIGFjdHVhbCBwcm9jZXNzaW5nLgorICAgIEF1ZGlvQmlxdWFkRmlsdGVyIG1CaXF1YWQ7CisgICAgLy8gQSBjb2VmZmljaWVudCBpbnRlcnBvbGF0b3IsIHVzZWQgZm9yIG1hcHBpbmcgdGhlIGhpZ2ggbGV2ZWwgcGFyYW1ldGVycyB0bworICAgIC8vIHRoZSBsb3ctbGV2ZWwgYmlxdWFkIGNvZWZmaWNpZW50cy4KKyAgICBzdGF0aWMgQXVkaW9Db2VmSW50ZXJwb2xhdG9yIG1Db2VmSW50ZXJwOworfTsKKworfQorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19QRUFLSU5HX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlckNvZWYuaW5sIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXJDb2VmLmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzRjNmUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXJDb2VmLmlubApAQCAtMCwwICsxLDI3MDAgQEAKKzE2NzY5NzUxLAorLTMzNTM4ODcxLAorMTY3Njk3NTEsCiszMzUzODg3MSwKKy0xNjc2MjI4NiwKKzExNDY4MDgzLAorLTIyOTM1NTY2LAorMTE0Njc5MTUsCisyMjkzNTU2NiwKKy02MTU4NzgxLAorODUzMjY3MywKKy0xNzA2NDc2MywKKzg1MzI0MTIsCisxNzA2NDc2MywKKy0yODc4NjksCis2NTY3MzY2LAorLTEzMTM0MTYwLAorNjU2NzA0MiwKKzEzMTM0MTYwLAorMzY0MjgwOCwKKzE2NzczMDc1LAorLTMzNTQ1NTE4LAorMTY3NzMwNzUsCiszMzU0NTUxOCwKKy0xNjc2ODkzNCwKKzEzMzQ5NjU4LAorLTI2Njk4NDU5LAorMTMzNDkzMDQsCisyNjY5ODQ1OSwKKy05OTIxNzQ2LAorMTA5MjM1ODEsCistMjE4NDYxNDcsCisxMDkyMjk3NywKKzIxODQ2MTQ3LAorLTUwNjkzNDIsCis5MDA5MzkwLAorLTE4MDE3NjQxLAorOTAwODU5MCwKKzE4MDE3NjQxLAorLTEyNDA3NjQsCisxNjc3NDkxOSwKKy0zMzU0OTIwNywKKzE2Nzc0OTE5LAorMzM1NDkyMDcsCistMTY3NzI2MjIsCisxNDY4NjE1MCwKKy0yOTM3MTA0NywKKzE0Njg1NDUwLAorMjkzNzEwNDcsCistMTI1OTQzODQsCisxMjkzMzczNiwKKy0yNTg2NTY5NywKKzEyOTMyNDQ4LAorMjU4NjU2OTcsCistOTA4ODk2OCwKKzExMzUwMzY0LAorLTIyNjk4NDgyLAorMTEzNDg1NDUsCisyMjY5ODQ4MiwKKy01OTIxNjkzLAorMTY3NzU5NDMsCistMzM1NTEyNTIsCisxNjc3NTk0MSwKKzMzNTUxMjUyLAorLTE2Nzc0NjY4LAorMTU1NDk3NDYsCistMzEwOTc1NjksCisxNTU0ODQwOCwKKzMxMDk3NTY5LAorLTE0MzIwOTM4LAorMTQ0MDQxNjMsCistMjg4MDUxOTcsCisxNDQwMTU3NywKKzI4ODA1MTk3LAorLTEyMDI4NTI0LAorMTMyNjE5NzgsCistMjY1MTk2MjYsCisxMzI1ODE0NywKKzI2NTE5NjI2LAorLTk3NDI5MDksCisxNjc3NjUxMSwKKy0zMzU1MjM4NywKKzE2Nzc2NTA4LAorMzM1NTIzODcsCistMTY3NzU4MDMsCisxNjA3NDM0OSwKKy0zMjE0NTYwMCwKKzE2MDcxODU2LAorMzIxNDU2MDAsCistMTUzNjg5ODksCisxNTM3NDI0NCwKKy0zMDc0MjkzMywKKzE1MzY5MjY4LAorMzA3NDI5MzMsCistMTM5NjYyOTYsCisxNDYyOTQzMSwKKy0yOTI1MDY5NSwKKzE0NjIxODE0LAorMjkyNTA2OTUsCistMTI0NzQwMzAsCisxNjc3NjgyNiwKKy0zMzU1MzAxNywKKzE2Nzc2ODIyLAorMzM1NTMwMTcsCistMTY3NzY0MzIsCisxNjM4MTU0OCwKKy0zMjc1NzkwMCwKKzE2Mzc2OTY4LAorMzI3NTc5MDAsCistMTU5ODEzMDAsCisxNTk3MjE2MSwKKy0zMTkzNDQwMiwKKzE1OTYyODQyLAorMzE5MzQ0MDIsCistMTUxNTc3ODcsCisxNTUxODg4MiwKKy0zMTAyMjYxNCwKKzE1NTA0MzE2LAorMzEwMjI2MTQsCistMTQyNDU5ODIsCisxNjc3NzAwMywKKy0zMzU1MzM2NiwKKzE2Nzc2OTk1LAorMzM1NTMzNjYsCistMTY3NzY3ODEsCisxNjU1ODMxNSwKKy0zMzEwNzY2MCwKKzE2NTQ5OTY5LAorMzMxMDc2NjAsCistMTYzMzEwNjcsCisxNjMyNjg0OCwKKy0zMjYzNTkxMCwKKzE2MzA5Njc3LAorMzI2MzU5MTAsCistMTU4NTkzMDgsCisxNjA2NDQ1NiwKKy0zMjEwMTEzMywKKzE2MDM3MjgxLAorMzIxMDExMzMsCistMTUzMjQ1MjEsCisxNjc3NzEwMywKKy0zMzU1MzU1OSwKKzE2Nzc3MDg4LAorMzM1NTM1NTksCistMTY3NzY5NzUsCisxNjY2MDMyNSwKKy0zMzMwNDg4NSwKKzE2NjQ1MTg3LAorMzMzMDQ4ODUsCistMTY1MjgyOTYsCisxNjUzNTIwMCwKKy0zMzAzODQzNiwKKzE2NTAzODU4LAorMzMwMzg0MzYsCistMTYyNjE4NDIsCisxNjM5MTQyNSwKKy0zMjczMjI3MywKKzE2MzQxNDY0LAorMzI3MzIyNzMsCistMTU5NTU2NzMsCisxNjc3NzE2MiwKKy0zMzU1MzY2NywKKzE2Nzc3MTM2LAorMzM1NTM2NjcsCistMTY3NzcwODIsCisxNjcyMTY1MSwKKy0zMzQxNTI4OCwKKzE2Njk0MjY3LAorMzM0MTUyODgsCistMTY2Mzg3MDEsCisxNjY2MTc2MSwKKy0zMzI2NTk5NywKKzE2NjA0ODYyLAorMzMyNjU5OTcsCistMTY0ODk0MDcsCisxNjU5MjQxNywKKy0zMzA5MzEzNywKKzE2NTAxMzQzLAorMzMwOTMxMzcsCistMTYzMTY1NDQsCisxNjc3NzIwMywKKy0zMzU1MzcyNiwKKzE2Nzc3MTU1LAorMzM1NTM3MjYsCistMTY3NzcxNDIsCisxNjc2MzQ2NiwKKy0zMzQ3NjgzNiwKKzE2NzE0MDAxLAorMzM0NzY4MzYsCistMTY3MDAyNTEsCisxNjc0ODU4OCwKKy0zMzM5MzU2NSwKKzE2NjQ1NjA1LAorMzMzOTM1NjUsCistMTY2MTY5NzgsCisxNjczMTI4OCwKKy0zMzI5NjczMywKKzE2NTY2MDcxLAorMzMyOTY3MzMsCistMTY1MjAxNDQsCisxNjc3NzIzOCwKKy0zMzU1Mzc1OSwKKzE2Nzc3MTUyLAorMzM1NTM3NTksCistMTY3NzcxNzUsCisxNjgwMDQ4OSwKKy0zMzUxMTA3MSwKKzE2NzExMjEyLAorMzM1MTEwNzEsCistMTY3MzQ0ODUsCisxNjgyNTcyMywKKy0zMzQ2NDc0MCwKKzE2NjM5NjQ3LAorMzM0NjQ3NDAsCistMTY2ODgxNTQsCisxNjg1NTEzNywKKy0zMzQxMDczNiwKKzE2NTU2MjI4LAorMzM0MTA3MzYsCistMTY2MzQxNDksCisxNjc3NzI4MiwKKy0zMzU1Mzc3OCwKKzE2Nzc3MTI3LAorMzM1NTM3NzgsCistMTY3NzcxOTMsCisxNjg0NTg4OSwKKy0zMzUzMDA4OCwKKzE2Njg0ODMwLAorMzM1MzAwODgsCistMTY3NTM1MDMsCisxNjkyMDQzNywKKy0zMzUwNDM0NywKKzE2NTg0NTQxLAorMzM1MDQzNDcsCistMTY3Mjc3NjIsCisxNzAwNzQ0OSwKKy0zMzQ3NDMwMiwKKzE2NDY3NDg0LAorMzM0NzQzMDIsCistMTY2OTc3MTYsCisxNjc3NzM0OSwKKy0zMzU1Mzc4OCwKKzE2Nzc3MDcwLAorMzM1NTM3ODgsCistMTY3NzcyMDMsCisxNjkxNTg4MCwKKy0zMzU0MDY0NSwKKzE2NjI1Mzk2LAorMzM1NDA2NDUsCistMTY3NjQwNjAsCisxNzA2NjUwNCwKKy0zMzUyNjM1NCwKKzE2NDYwNDgxLAorMzM1MjYzNTQsCistMTY3NDk3NjksCisxNzI0MjQ0NCwKKy0zMzUwOTY2MiwKKzE2MjY3ODQ5LAorMzM1MDk2NjIsCistMTY3MzMwNzcsCisxNjc3NzQ2NCwKKy0zMzU1Mzc5MywKKzE2Nzc2OTYxLAorMzM1NTM3OTMsCistMTY3NzcyMDksCisxNzAzNTQ4NywKKy0zMzU0NjUwMywKKzE2NTExNjQ3LAorMzM1NDY1MDMsCistMTY3Njk5MTgsCisxNzMxNjEzNywKKy0zMzUzODU3MiwKKzE2MjIzMDY3LAorMzM1Mzg1NzIsCistMTY3NjE5ODgsCisxNzY0NDA4OSwKKy0zMzUyOTMwNiwKKzE1ODg1ODQ4LAorMzM1MjkzMDYsCistMTY3NTI3MjEsCisxNjc3NzY2OCwKKy0zMzU1Mzc5NiwKKzE2Nzc2NzYwLAorMzM1NTM3OTYsCistMTY3NzcyMTIsCisxNzI0NzQ4NCwKKy0zMzU0OTc1MiwKKzE2MzAyOTAwLAorMzM1NDk3NTIsCistMTY3NzMxNjgsCisxNzc1ODYwMywKKy0zMzU0NTM1MywKKzE1Nzg3MzgxLAorMzM1NDUzNTMsCistMTY3Njg3NjgsCisxODM1NjAwNywKKy0zMzU0MDIxMSwKKzE1MTg0ODM1LAorMzM1NDAyMTEsCistMTY3NjM2MjYsCisxNjc2MjI5MywKKy0zMzUyMjA2MiwKKzE2NzYyMjkzLAorMzM1MjIwNjIsCistMTY3NDczNzAsCis4NzExNDA1LAorLTE3NDIxMjQyLAorODcxMTE0OSwKKzE3NDIxMjQyLAorLTY0NTMzOCwKKzU3MjEyNTAsCistMTE0NDEyODgsCis1NzIwOTAwLAorMTE0NDEyODgsCis1MzM1MDY2LAorNDA4MjgzNiwKKy04MTY0NjU1LAorNDA4MjQzNCwKKzgxNjQ2NTUsCis4NjExOTQ2LAorMTY3Njg5MzYsCistMzM1MzUzNDcsCisxNjc2ODkzNiwKKzMzNTM1MzQ3LAorLTE2NzYwNjU2LAorMTEwODUwNTYsCistMjIxNjc4NTYsCisxMTA4NDQ2OSwKKzIyMTY3ODU2LAorLTUzOTIzMDksCis4MDk4MjIzLAorLTE2MTk0MzMzLAorODA5NzMyOSwKKzE2MTk0MzMzLAorNTgxNjY0LAorNjE1ODMyMywKKy0xMjMxNDYyMywKKzYxNTcyMjgsCisxMjMxNDYyMywKKzQ0NjE2NjUsCisxNjc3MjYyMywKKy0zMzU0MjcxOSwKKzE2NzcyNjIyLAorMzM1NDI3MTksCistMTY3NjgwMjksCisxMzA1ODYzNCwKKy0yNjExNDA1NSwKKzEzMDU3Mzg4LAorMjYxMTQwNTUsCistOTMzODgwNiwKKzEwNTIzMjExLAorLTIxMDQyNzQyLAorMTA1MjExMTYsCisyMTA0Mjc0MiwKKy00MjY3MTEwLAorODU3NjU2MCwKKy0xNzE0OTA4MSwKKzg1NzM4MTIsCisxNzE0OTA4MSwKKy0zNzMxNTYsCisxNjc3NDY3MCwKKy0zMzU0NjgxMCwKKzE2Nzc0NjY3LAorMzM1NDY4MTAsCistMTY3NzIxMjAsCisxNDQ4OTcyNSwKKy0yODk3NDc3NiwKKzE0NDg3MjMzLAorMjg5NzQ3NzYsCistMTIxOTk3NDIsCisxMjYxOTUwOSwKKy0yNTIzMjU4NywKKzEyNjE0OTc5LAorMjUyMzI1ODcsCistODQ1NzI3MSwKKzEwOTY1MTUxLAorLTIxOTIyMzE5LAorMTA5NTg4MTgsCisyMTkyMjMxOSwKKy01MTQ2NzUzLAorMTY3NzU4MDUsCistMzM1NDkwNzksCisxNjc3NTgwMCwKKzMzNTQ5MDc5LAorLTE2Nzc0MzkwLAorMTU0MjgxMDIsCistMzA4NDkwOTUsCisxNTQyMzMxNywKKzMwODQ5MDk1LAorLTE0MDc0MjAyLAorMTQxODgxNTcsCistMjgzNjQ5OTYsCisxNDE3ODk3NSwKKzI4MzY0OTk2LAorLTExNTg5OTE2LAorMTI5Njk5MDAsCistMjU5MjQzNDYsCisxMjk1NjM5OCwKKzI1OTI0MzQ2LAorLTkxNDkwODIsCisxNjc3NjQzNywKKy0zMzU1MDMzOCwKKzE2Nzc2NDI4LAorMzM1NTAzMzgsCistMTY3NzU2NDgsCisxNjAwNDIxNiwKKy0zMTk5NzA3NCwKKzE1OTk1MjY4LAorMzE5OTcwNzQsCistMTUyMjIyNjcsCisxNTI0MTIzMywKKy0zMDQ2MjM5MywKKzE1MjIzNDU0LAorMzA0NjIzOTMsCistMTM2ODc0NzEsCisxNDQzNzA3MCwKKy0yODg0NDg4MCwKKzE0NDA5OTgyLAorMjg4NDQ4ODAsCistMTIwNjk4MzYsCisxNjc3Njc4OSwKKy0zMzU1MTAzNiwKKzE2Nzc2NzczLAorMzM1NTEwMzYsCistMTY3NzYzNDcsCisxNjM0NTE1OCwKKy0zMjY3MTM4MywKKzE2MzI4Njg1LAorMzI2NzEzODMsCistMTU4OTY2MjcsCisxNTkwMDQ2MiwKKy0zMTc2NTEwNCwKKzE1ODY3MDM0LAorMzE3NjUxMDQsCistMTQ5OTAyODAsCisxNTQxMDg0NiwKKy0zMDc2NzI3OSwKKzE1MzU4NzUwLAorMzA3NjcyNzksCistMTM5OTIzODAsCisxNjc3Njk5MCwKKy0zMzU1MTQyMywKKzE2Nzc2OTYwLAorMzM1NTE0MjMsCistMTY3NzY3MzQsCisxNjU0NTE1NiwKKy0zMzA1Nzc2OSwKKzE2NTE1MTAzLAorMzMwNTc3NjksCistMTYyODMwNDMsCisxNjMwMDUwNCwKKy0zMjUzNjgyMywKKzE2MjM4NzY5LAorMzI1MzY4MjMsCistMTU3NjIwNTgsCisxNjAyNDA3MSwKKy0zMTk0ODIwMSwKKzE1OTI2NTM3LAorMzE5NDgyMDEsCistMTUxNzMzOTEsCisxNjc3NzEwOSwKKy0zMzU1MTYzOCwKKzE2Nzc3MDU2LAorMzM1NTE2MzgsCistMTY3NzY5NDksCisxNjY2NjU0MiwKKy0zMzI3NjAzNSwKKzE2NjExOTk5LAorMzMyNzYwMzUsCistMTY1MDEzMjUsCisxNjU0ODI3MCwKKy0zMjk4MTIyNSwKKzE2NDM1NDM5LAorMzI5ODEyMjUsCistMTYyMDY0OTMsCisxNjQxMjYyMSwKKy0zMjY0MzEwMywKKzE2MjMyOTQwLAorMzI2NDMxMDMsCistMTU4NjgzNDYsCisxNjc3NzE4OSwKKy0zMzU1MTc1NywKKzE2Nzc3MDk0LAorMzM1NTE3NTcsCistMTY3NzcwNjgsCisxNjc0OTc3OCwKKy0zMzM5ODMzOCwKKzE2NjUxMDc1LAorMzMzOTgzMzgsCistMTY2MjM2MzcsCisxNjcyMDIzMywKKy0zMzIzMjk3NiwKKzE2NTE1MjQ1LAorMzMyMzI5NzYsCistMTY0NTgyNjIsCisxNjY4NjA1OSwKKy0zMzA0MTcwNiwKKzE2MzU4MTM1LAorMzMwNDE3MDYsCistMTYyNjY5NzgsCisxNjc3NzI2MSwKKy0zMzU1MTgyMywKKzE2Nzc3MDg5LAorMzM1NTE4MjMsCistMTY3NzcxMzQsCisxNjgyMzcwMywKKy0zMzQ2NjU1OSwKKzE2NjQ1Mzc2LAorMzM0NjY1NTksCistMTY2OTE4NjMsCisxNjg3Mzk3NCwKKy0zMzM3NDI2NywKKzE2NTAyODA2LAorMzMzNzQyNjcsCistMTY1OTk1NjQsCisxNjkzMjM5OCwKKy0zMzI2NzAwNiwKKzE2MzM3MTE0LAorMzMyNjcwMDYsCistMTY0OTIyOTUsCisxNjc3NzM0OCwKKy0zMzU1MTg2MCwKKzE2Nzc3MDM4LAorMzM1NTE4NjAsCistMTY3NzcxNzAsCisxNjkxNDQ2NSwKKy0zMzUwNDUxNywKKzE2NTkyNTc0LAorMzM1MDQ1MTcsCistMTY3Mjk4MjQsCisxNzA2MzIzNiwKKy0zMzQ1MzE1MCwKKzE2MzkyNDMyLAorMzM0NTMxNTAsCistMTY2Nzg0NTMsCisxNzIzNjU5NSwKKy0zMzM5MzI5MywKKzE2MTU5MjEzLAorMzMzOTMyOTMsCistMTY2MTg1OTIsCisxNjc3NzQ4MywKKy0zMzU1MTg4MCwKKzE2Nzc2OTI0LAorMzM1NTE4ODAsCistMTY3NzcxOTEsCisxNzA1NDQzNiwKKy0zMzUyNTYwNiwKKzE2NDczNjk1LAorMzM1MjU2MDYsCistMTY3NTA5MTQsCisxNzM1NTMyMSwKKy0zMzQ5NzA2MSwKKzE2MTQ0MjYyLAorMzM0OTcwNjEsCistMTY3MjIzNjcsCisxNzcwNjQ1MywKKy0zMzQ2Mzc0OSwKKzE1NzU5ODE2LAorMzM0NjM3NDksCistMTY2ODkwNTMsCisxNjc3NzcxMywKKy0zMzU1MTg5MSwKKzE2Nzc2NzA1LAorMzM1NTE4OTEsCistMTY3NzcyMDIsCisxNzI5MzY0NiwKKy0zMzUzNzMxNCwKKzE2MjQ2MTk0LAorMzM1MzczMTQsCistMTY3NjI2MjMsCisxNzg1NDU3MSwKKy0zMzUyMTQ2NSwKKzE1NjY5NDE5LAorMzM1MjE0NjUsCistMTY3NDY3NzMsCisxODUwOTcwNiwKKy0zMzUwMjk1NCwKKzE0OTk1NzcyLAorMzM1MDI5NTQsCistMTY3MjgyNjEsCisxNjc3ODEyMCwKKy0zMzU1MTg5OCwKKzE2Nzc2MzA0LAorMzM1NTE4OTgsCistMTY3NzcyMDgsCisxNzcxNzYzOSwKKy0zMzU0MzgxMSwKKzE1ODI4Njk4LAorMzM1NDM4MTEsCistMTY3NjkxMjEsCisxODczOTUwMSwKKy0zMzUzNTAxNiwKKzE0Nzk4MDQwLAorMzM1MzUwMTYsCistMTY3NjAzMjUsCisxOTkzMzUzNCwKKy0zMzUyNDczOCwKKzEzNTkzNzI5LAorMzM1MjQ3MzgsCistMTY3NTAwNDcsCisxNjc0NzM5NywKKy0zMzQ4NDcwNSwKKzE2NzQ3Mzk2LAorMzM0ODQ3MDUsCistMTY3MTc1NzcsCis1ODgzMTEyLAorLTExNzYyMzM1LAorNTg4Mjc2NywKKzExNzYyMzM1LAorNTAxMTMzNywKKzM0NDg3MDEsCistNjg5NDkwMywKKzM0NDgyNzksCis2ODk0OTAzLAorOTg4MDIzNiwKKzIzMjQyODYsCistNDY0NjcxNCwKKzIzMjM4MjgsCis0NjQ2NzE0LAorMTIxMjkxMDIsCisxNjc2MDY2NSwKKy0zMzUxMTIzMiwKKzE2NzYwNjYzLAorMzM1MTEyMzIsCistMTY3NDQxMTIsCis4Mjc2OTg0LAorLTE2NTQ4MTA2LAorODI3NjEwOCwKKzE2NTQ4MTA2LAorMjI0MTI0LAorNTMzNzQwMCwKKy0xMDY3MDQwNiwKKzUzMzYyMjEsCisxMDY3MDQwNiwKKzYxMDM1OTYsCiszNzcxNTI1LAorLTc1Mzk0MzksCiszNzcwMTg1LAorNzUzOTQzOSwKKzkyMzU1MDYsCisxNjc2ODAzMywKKy0zMzUyNTk2MywKKzE2NzY4MDMwLAorMzM1MjU5NjMsCistMTY3NTg4NDgsCisxMDY4OTU2NCwKKy0yMTM3MDY0OSwKKzEwNjg3NTI0LAorMjEzNzA2NDksCistNDU5OTg3MiwKKzc2NjYwNjgsCistMTUzMjQ0NjYsCis3NjYzMDE1LAorMTUzMjQ0NjYsCisxNDQ4MTMzLAorNTc2MTI2NiwKKy0xMTUxNTM3MSwKKzU3NTc1NzUsCisxMTUxNTM3MSwKKzUyNTgzNzYsCisxNjc3MjEyNCwKKy0zMzUzNDEzOSwKKzE2NzcyMTE4LAorMzM1MzQxMzksCistMTY3NjcwMjYsCisxMjc1MTQyMywKKy0yNTQ5MDc4MCwKKzEyNzQ3MDM2LAorMjU0OTA3ODAsCistODcyMTI0MywKKzEwMTEzOTQyLAorLTIwMjE0NTMzLAorMTAxMDY2ODIsCisyMDIxNDUzMywKKy0zNDQzNDA3LAorODE0NTAyNSwKKy0xNjI3NTc0MSwKKzgxMzU2MjAsCisxNjI3NTc0MSwKKzQ5NjU3MSwKKzE2Nzc0Mzk1LAorLTMzNTM4Njc1LAorMTY3NzQzODUsCiszMzUzODY3NSwKKy0xNjc3MTU2NCwKKzE0MjgwMTM3LAorLTI4NTQyODE5LAorMTQyNzEyODEsCisyODU0MjgxOSwKKy0xMTc3NDIwMiwKKzEyMjkyMzkxLAorLTI0NTYxNDc2LAorMTIyNzY0ODUsCisyNDU2MTQ3NiwKKy03NzkxNjYwLAorMTA1NzI5NDksCistMjExMTc1MzIsCisxMDU1MDk0NSwKKzIxMTE3NTMyLAorLTQzNDY2NzgsCisxNjc3NTY1NywKKy0zMzU0MTE5MiwKKzE2Nzc1NjM5LAorMzM1NDExOTIsCistMTY3NzQwODEsCisxNTI5OTY4MywKKy0zMDU3MzA1MSwKKzE1MjgyNTc5LAorMzA1NzMwNTEsCistMTM4MDUwNDYsCisxMzk2NDI1MSwKKy0yNzg4NzUzOSwKKzEzOTMxNjkwLAorMjc4ODc1MzksCistMTExMTg3MjQsCisxMjY3MjY4NiwKKy0yNTI5MDI0MSwKKzEyNjI1MTc0LAorMjUyOTAyNDEsCistODUyMDY0NCwKKzE2Nzc2MzYzLAorLTMzNTQyNTg4LAorMTY3NzYzMzAsCiszMzU0MjU4OCwKKy0xNjc3NTQ3NywKKzE1OTM1MTk2LAorLTMxODI4Njk5LAorMTU5MDMwOTIsCiszMTgyODY5OSwKKy0xNTA2MTA3MiwKKzE1MTEyMzU2LAorLTMwMTUyMTUzLAorMTUwNDg4ODEsCiszMDE1MjE1MywKKy0xMzM4NDAyMSwKKzE0MjUzODU3LAorLTI4NDAyOTUwLAorMTQxNTc2NDksCisyODQwMjk1MCwKKy0xMTYzNDI5MSwKKzE2Nzc2NzYzLAorLTMzNTQzMzYyLAorMTY3NzY3MDQsCiszMzU0MzM2MiwKKy0xNjc3NjI1MiwKKzE2MzE5ODMwLAorLTMyNTcwNjE1LAorMTYyNjA1OTgsCiszMjU3MDYxNSwKKy0xNTgwMzIxMiwKKzE1ODUxNzgzLAorLTMxNTc0MjA4LAorMTU3MzE5MzgsCiszMTU3NDIwOCwKKy0xNDgwNjUwNSwKKzE1MzM5NjE0LAorLTMwNDgzODcxLAorMTUxNTM0NDEsCiszMDQ4Mzg3MSwKKy0xMzcxNTgzOCwKKzE2Nzc3MDAxLAorLTMzNTQzNzkxLAorMTY3NzY4OTYsCiszMzU0Mzc5MSwKKy0xNjc3NjY4MSwKKzE2NTU3NjczLAorLTMyOTk3MjA4LAorMTY0NDk0NzYsCiszMjk5NzIwOCwKKy0xNjIyOTkzMywKKzE2MzI2OTc3LAorLTMyNDIyMjk5LAorMTYxMDUwODksCiszMjQyMjI5OSwKKy0xNTY1NDg1MSwKKzE2MDY3MjQ0LAorLTMxNzc1MDI0LAorMTU3MTczNTMsCiszMTc3NTAyNCwKKy0xNTAwNzM4MSwKKzE2Nzc3MTYzLAorLTMzNTQ0MDI5LAorMTY3NzY5NzIsCiszMzU0NDAyOSwKKy0xNjc3NjkxOSwKKzE2NzIyNTkwLAorLTMzMjM4NjYwLAorMTY1MjYwODMsCiszMzIzODY2MCwKKy0xNjQ3MTQ1OCwKKzE2NjY0MzIyLAorLTMyOTEyNjEwLAorMTYyNTgyMDMsCiszMjkxMjYxMCwKKy0xNjE0NTMxMCwKKzE2NTk3NjI5LAorLTMyNTM5NDE5LAorMTU5NTE1OTMsCiszMjUzOTQxOSwKKy0xNTc3MjAwNywKKzE2Nzc3MzA2LAorLTMzNTQ0MTYyLAorMTY3NzY5NjIsCiszMzU0NDE2MiwKKy0xNjc3NzA1MSwKKzE2ODY5OTU1LAorLTMzMzc0MTA1LAorMTY1MTQyMDUsCiszMzM3NDEwNSwKKy0xNjYwNjk0NCwKKzE2OTY5NzE0LAorLTMzMTkwOTk2LAorMTYyMzEyODIsCiszMzE5MDk5NiwKKy0xNjQyMzc4MCwKKzE3MDg0OTcyLAorLTMyOTc5NDQyLAorMTU5MDQ0MDYsCiszMjk3OTQ0MiwKKy0xNjIxMjE2MiwKKzE2Nzc3NDgwLAorLTMzNTQ0MjM1LAorMTY3NzY4NjAsCiszMzU0NDIzNSwKKy0xNjc3NzEyNSwKKzE3MDUxMzI4LAorLTMzNDQ5NzAzLAorMTY0MDg0NTIsCiszMzQ0OTcwMywKKy0xNjY4MjU2NSwKKzE3MzQ3NTgzLAorLTMzMzQ3NDM3LAorMTYwMDk5MDEsCiszMzM0NzQzNywKKy0xNjU4MDI2NywKKzE3NjkxNjY4LAorLTMzMjI4NjU5LAorMTU1NDcwMDIsCiszMzIyODY1OSwKKy0xNjQ2MTQ1NCwKKzE2Nzc3NzUwLAorLTMzNTQ0Mjc1LAorMTY3NzY2MzIsCiszMzU0NDI3NSwKKy0xNjc3NzE2NSwKKzE3MzMxMjIyLAorLTMzNDkxNzgwLAorMTYxNzA2NDgsCiszMzQ5MTc4MCwKKy0xNjcyNDY1NCwKKzE3OTMxNTUwLAorLTMzNDM0ODQwLAorMTU1MTMzNjMsCiszMzQzNDg0MCwKKy0xNjY2NzY5NywKKzE4NjMwODU1LAorLTMzMzY4NTEyLAorMTQ3NDc3MTAsCiszMzM2ODUxMiwKKy0xNjYwMTM0OSwKKzE2Nzc4MjEwLAorLTMzNTQ0Mjk4LAorMTY3NzYxOTQsCiszMzU0NDI5OCwKKy0xNjc3NzE4OCwKKzE3ODA5NjI4LAorLTMzNTE1MTYyLAorMTU3MTU2MzEsCiszMzUxNTE2MiwKKy0xNjc0ODA0MywKKzE4OTI5OTkxLAorLTMzNDgzNTE0LAorMTQ1NjM2MTEsCiszMzQ4MzUxNCwKKy0xNjcxNjM4NSwKKzIwMjM3MjEyLAorLTMzNDQ2NTg3LAorMTMyMTk0NTEsCiszMzQ0NjU4NywKKy0xNjY3OTQ0OCwKKzE2Nzc5MDI1LAorLTMzNTQ0MzEwLAorMTY3NzUzOTIsCiszMzU0NDMxMCwKKy0xNjc3NzIwMCwKKzE4NjU3NjEyLAorLTMzNTI4MTQ1LAorMTQ4ODA2MzQsCiszMzUyODE0NSwKKy0xNjc2MTAzMCwKKzIwNjk5ODQ0LAorLTMzNTEwNTcxLAorMTI4MjA4MjIsCiszMzUxMDU3MSwKKy0xNjc0MzQ1MSwKKzIzMDg0ODYzLAorLTMzNDkwMDQ3LAorMTA0MTUyNzQsCiszMzQ5MDA0NywKKy0xNjcyMjkyMSwKKzE2NzE3Njg0LAorLTMzMzk1MDkxLAorMTY3MTc2ODIsCiszMzM5NTA5MSwKKy0xNjY1ODE0OSwKKzM1NjcwMDksCistNzEyNTAwNiwKKzM1NjY1OTAsCis3MTI1MDA2LAorOTY0MzYxNywKKzE5MjE5MjYsCistMzgzODc1MSwKKzE5MjE0NTUsCiszODM4NzUxLAorMTI5MzM4MzUsCisxMjQ4NjYyLAorLTI0OTM4MjQsCisxMjQ4MTcwLAorMjQ5MzgyNCwKKzE0MjgwMzg0LAorMTY3NDQxNDcsCistMzM0NDc5NTIsCisxNjc0NDE0MywKKzMzNDQ3OTUyLAorLTE2NzExMDc0LAorNTQ5Mzc4NSwKKy0xMDk3MzE3NCwKKzU0OTI2MjIsCisxMDk3MzE3NCwKKzU3OTA4MDgsCiszMTczNjk0LAorLTYzMzgzNDIsCiszMTcyMjkyLAorNjMzODM0MiwKKzEwNDMxMjMwLAorMjEyNDc1NCwKKy00MjQyODgxLAorMjEyMzI0NCwKKzQyNDI4ODEsCisxMjUyOTIxOCwKKzE2NzU4ODYxLAorLTMzNDc3MzQyLAorMTY3NTg4NTUsCiszMzQ3NzM0MiwKKy0xNjc0MDUwMCwKKzc4NDM4ODUsCistMTU2NjU4ODQsCis3ODQwODkyLAorMTU2NjU4ODQsCisxMDkyNDM5LAorNDk2ODY0OSwKKy05OTIxMzc2LAorNDk2NDY5MiwKKzk5MjEzNzYsCis2ODQzODc1LAorMzQ3ODQzNywKKy02OTQ0MDQzLAorMzQ3Mzk4MSwKKzY5NDQwNDMsCis5ODI0Nzk4LAorMTY3NjcwMzUsCistMzM0OTM2NjUsCisxNjc2NzAyNCwKKzMzNDkzNjY1LAorLTE2NzU2ODQyLAorMTAyODQ0MjEsCistMjA1MzY5OTksCisxMDI3NzM0NiwKKzIwNTM2OTk5LAorLTM3ODQ1NTAsCis3MjQwMjU0LAorLTE0NDUyNjg2LAorNzIyOTg2MiwKKzE0NDUyNjg2LAorMjMwNzEwMCwKKzUzNzk3OTgsCistMTA3MzQyMzEsCis1MzY3Mzc5LAorMTA3MzQyMzEsCis2MDMwMDM5LAorMTY3NzE1NzUsCistMzM1MDI3MjUsCisxNjc3MTU1NSwKKzMzNTAyNzI1LAorLTE2NzY1OTEzLAorMTI0MzEwNDYsCistMjQ4MTY3NDksCisxMjQxNTYzMiwKKzI0ODE2NzQ5LAorLTgwNjk0NjIsCis5NzAyMDQ5LAorLTE5MzU1NjY0LAorOTY3Njk1NywKKzE5MzU1NjY0LAorLTI2MDE3OTAsCis3NzIyNjExLAorLTE1Mzk0NTQ0LAorNzY5MDQ5OSwKKzE1Mzk0NTQ0LAorMTM2NDEwNiwKKzE2Nzc0MDk5LAorLTMzNTA3NzUyLAorMTY3NzQwNjMsCiszMzUwNzc1MiwKKy0xNjc3MDk0NiwKKzE0MDYyNTgzLAorLTI4MDU5OTAzLAorMTQwMzExNjAsCisyODA1OTkwMywKKy0xMTMxNjUyNywKKzExOTYyOTk5LAorLTIzODQxNTE5LAorMTE5MDcyNzMsCisyMzg0MTUxOSwKKy03MDkzMDU2LAorMTAxODg5MjksCistMjAyNzcxNDIsCisxMDExMjY2NywKKzIwMjc3MTQyLAorLTM1MjQzODAsCisxNjc3NTUxMCwKKy0zMzUxMDU0MSwKKzE2Nzc1NDQ1LAorMzM1MTA1NDEsCistMTY3NzM3MzgsCisxNTE3NTEwMiwKKy0zMDI1MjYzNywKKzE1MTE0MDE5LAorMzAyNTI2MzcsCistMTM1MTE5MDUsCisxMzc1MzIwNywKKy0yNzM1ODEyMywKKzEzNjM3OTExLAorMjczNTgxMjMsCistMTA2MTM5MDEsCisxMjQwMDk3MSwKKy0yNDYwNTQxNiwKKzEyMjM0MTE5LAorMjQ2MDU0MTYsCistNzg1Nzg3NCwKKzE2Nzc2MzEwLAorLTMzNTEyMDg4LAorMTY3NzYxOTMsCiszMzUxMjA4OCwKKy0xNjc3NTI4NywKKzE1ODg4MjQyLAorLTMxNjIzMjIxLAorMTU3NzMxMTcsCiszMTYyMzIyMSwKKy0xNDg4NDE0MywKKzE1MDI4OTcyLAorLTI5Nzk1NjA4LAorMTQ4MDI1NzAsCisyOTc5NTYwOCwKKy0xMzA1NDMyNSwKKzE0MTQyMjM3LAorLTI3OTA5NTc4LAorMTM4MDEwMDAsCisyNzkwOTU3OCwKKy0xMTE2NjAyMSwKKzE2Nzc2Nzg3LAorLTMzNTEyOTQ2LAorMTY3NzY1NzUsCiszMzUxMjk0NiwKKy0xNjc3NjE0NiwKKzE2MzQ1MTcyLAorLTMyNDM4MzAyLAorMTYxMzIyNTEsCiszMjQzODMwMiwKKy0xNTcwMDIwNywKKzE1OTA1ODU2LAorLTMxMzQ0NDg0LAorMTU0NzY0MjksCiszMTM0NDQ4NCwKKy0xNDYwNTA2OSwKKzE1NDI4MzI0LAorLTMwMTU1NTE0LAorMTQ3NjM1NTgsCiszMDE1NTUxNCwKKy0xMzQxNDY2NSwKKzE2Nzc3MTEwLAorLTMzNTEzNDIyLAorMTY3NzY3MjksCiszMzUxMzQyMiwKKy0xNjc3NjYyMywKKzE2NjY4OTUwLAorLTMyOTA4NzQ0LAorMTYyNzk0ODIsCiszMjkwODc0NCwKKy0xNjE3MTIxNiwKKzE2NTU1NTk0LAorLTMyMjc1MDE1LAorMTU3NTgzNDQsCiszMjI3NTAxNSwKKy0xNTUzNjcyMiwKKzE2NDI4NDY1LAorLTMxNTY0Mjg0LAorMTUxNzM4ODYsCiszMTU2NDI4NCwKKy0xNDgyNTEzNCwKKzE2Nzc3Mzk1LAorLTMzNTEzNjg2LAorMTY3NzY3MDgsCiszMzUxMzY4NiwKKy0xNjc3Njg4NywKKzE2OTYxNzU4LAorLTMzMTc1NTk0LAorMTYyNTM4NDUsCiszMzE3NTU5NCwKKy0xNjQzODM4NywKKzE3MTU4MjEyLAorLTMyODE1MzI5LAorMTU2OTY2OTIsCiszMjgxNTMyOSwKKy0xNjA3NzY4OCwKKzE3MzgyNTc4LAorLTMyNDAzODgwLAorMTUwNjAzODEsCiszMjQwMzg4MCwKKy0xNTY2NTc0MywKKzE2Nzc3NzQ1LAorLTMzNTEzODMyLAorMTY3NzY1MDUsCiszMzUxMzgzMiwKKy0xNjc3NzAzMywKKzE3MzIzOTAzLAorLTMzMzI1NDcwLAorMTYwNDE3NTcsCiszMzMyNTQ3MCwKKy0xNjU4ODQ0NCwKKzE3OTExMzMyLAorLTMzMTIyODc0LAorMTUyNTE0ODgsCiszMzEyMjg3NCwKKy0xNjM4NTYwNCwKKzE4NTg5MjAzLAorLTMyODg5MDg2LAorMTQzMzk1NDYsCiszMjg4OTA4NiwKKy0xNjE1MTUzNCwKKzE2Nzc4MjgzLAorLTMzNTEzOTEzLAorMTY3NzYwNDgsCiszMzUxMzkxMywKKy0xNjc3NzExNSwKKzE3ODgzNTA1LAorLTMzNDA5MTgwLAorMTU1NjU5NjYsCiszMzQwOTE4MCwKKy0xNjY3MjI1NSwKKzE5MDc4NDUxLAorLTMzMjk1OTQ0LAorMTQyNTc2NDgsCiszMzI5NTk0NCwKKy0xNjU1ODg4MywKKzIwNDY1NDQwLAorLTMzMTY0NTEwLAorMTI3MzkwNjcsCiszMzE2NDUxMCwKKy0xNjQyNzI5MCwKKzE2Nzc5MjAzLAorLTMzNTEzOTU4LAorMTY3NzUxNzMsCiszMzUxMzk1OCwKKy0xNjc3NzE2MCwKKzE4ODQwMjY1LAorLTMzNDU1Nzg5LAorMTQ2NTU4NzEsCiszMzQ1NTc4OSwKKy0xNjcxODkyMSwKKzIxMDc1MTIxLAorLTMzMzkyNzE1LAorMTIzNTc4NjYsCiszMzM5MjcxNSwKKy0xNjY1NTc3MSwKKzIzNjc3NjIxLAorLTMzMzE5MjY2LAorOTY4MTgyOCwKKzMzMzE5MjY2LAorLTE2NTgyMjMzLAorMTY3ODA4MzQsCistMzM1MTM5ODMsCisxNjc3MzU2NywKKzMzNTEzOTgzLAorLTE2Nzc3MTg1LAorMjA1MzYyMjcsCistMzM0ODE2OTYsCisxMjk4NTg0OCwKKzMzNDgxNjk2LAorLTE2NzQ0ODU5LAorMjQ2MTQ4NTUsCistMzM0NDY2MzAsCis4ODcyMTEyLAorMzM0NDY2MzAsCistMTY3MDk3NTEsCisyOTM3MzA3NSwKKy0zMzQwNTcyMSwKKzQwNzI5MzQsCiszMzQwNTcyMSwKKy0xNjY2ODc5MywKKzE2NjU4NTcyLAorLTMzMTU2NzEwLAorMTY2NTg1NjgsCiszMzE1NjcxMCwKKy0xNjUzOTkyNSwKKzE5OTU2OTQsCistMzk3MTcwMiwKKzE5OTUyMjUsCiszOTcxNzAyLAorMTI3ODYyOTYsCisxMDE5MzM0LAorLTIwMjgzNTUsCisxMDE4ODM1LAorMjAyODM1NSwKKzE0NzM5MDQ3LAorNjQ4Mzk3LAorLTEyOTAwNDEsCis2NDc4ODYsCisxMjkwMDQxLAorMTU0ODA5MzMsCisxNjcxMTIwOCwKKy0zMzI2MTQ3MCwKKzE2NzExMjAxLAorMzMyNjE0NzAsCistMTY2NDUxOTIsCiszMjg0ODczLAorLTY1MzY3MjcsCiszMjgzNDgzLAorNjUzNjcyNywKKzEwMjA4ODYwLAorMTc1Mjc0NiwKKy0zNDg3MDcxLAorMTc1MTE5OCwKKzM0ODcwNzEsCisxMzI3MzI3MiwKKzExMzQyNTQsCistMjI1NTk4MSwKKzExMzI2NDIsCisyMjU1OTgxLAorMTQ1MTAzMTksCisxNjc0MDU0NiwKKy0zMzMxOTg1OSwKKzE2NzQwNTM0LAorMzMzMTk4NTksCistMTY3MDM4NjQsCis1MTE5MDE5LAorLTEwMTg0ODUzLAorNTExNTExMywKKzEwMTg0ODUzLAorNjU0MzA4MywKKzI5MTY3NjYsCistNTgwMDgyMCwKKzI5MTIxMjIsCis1ODAwODIwLAorMTA5NDgzMjksCisxOTQwOTUwLAorLTM4NTgyNjAsCisxOTM1OTc5LAorMzg1ODI2MCwKKzEyOTAwMjg4LAorMTY3NTY4NjYsCistMzMzNTIzMzIsCisxNjc1Njg0NCwKKzMzMzUyMzMyLAorLTE2NzM2NDkzLAorNzQxNjE0MSwKKy0xNDc1MDcwOSwKKzc0MDU5NDEsCisxNDc1MDcwOSwKKzE5NTUxMzQsCis0NjE4MTMyLAorLTkxNzg2MDQsCis0NjA0ODg0LAorOTE3ODYwNCwKKzc1NTQyMDAsCiszMjA1NzMxLAorLTYzNjU4NzMsCiszMTkwOTQ0LAorNjM2NTg3MywKKzEwMzgwNTQxLAorMTY3NjU5MzcsCistMzMzNzAzNjksCisxNjc2NTg5NywKKzMzMzcwMzY5LAorLTE2NzU0NjE4LAorOTg3NTcxNCwKKy0xOTYzMTk2MSwKKzk4NTEyMzgsCisxOTYzMTk2MSwKKy0yOTQ5NzM2LAorNjgyODg3NCwKKy0xMzU1Njg3MCwKKzY3OTM1OTIsCisxMzU1Njg3MCwKKzMxNTQ3NTEsCis1MDIxOTIwLAorLTk5NTM5ODcsCis0OTgwMjMwLAorOTk1Mzk4NywKKzY3NzUwNjYsCisxNjc3MDk4MywKKy0zMzM4MDM4MSwKKzE2NzcwOTExLAorMzMzODAzODEsCistMTY3NjQ2NzksCisxMjEwNzczMSwKKy0yNDA0NTA2NiwKKzEyMDUzNjc5LAorMjQwNDUwNjYsCistNzM4NDE5NCwKKzkzMDQ2OTcsCistMTg0MzM3MDQsCis5MjE4MjAwLAorMTg0MzM3MDQsCistMTc0NTY4MSwKKzczMzAxNzMsCistMTQ0ODA5MjUsCis3MjIwODE5LAorMTQ0ODA5MjUsCisyMjI2MjI0LAorMTY3NzM4MDQsCistMzMzODU5MzcsCisxNjc3MzY3NCwKKzMzMzg1OTM3LAorLTE2NzcwMjYxLAorMTM4NTcwNjcsCistMjc0Njk4ODMsCisxMzc0NTczMSwKKzI3NDY5ODgzLAorLTEwODI1NTgzLAorMTE2NjcyMzAsCistMjMwMjgyMDksCisxMTQ3MjQwMywKKzIzMDI4MjA5LAorLTYzNjI0MTcsCis5ODYxNTA5LAorLTE5MzY1NjQyLAorOTU5NzgzNSwKKzE5MzY1NjQyLAorLTI2ODIxMjgsCisxNjc3NTQwNSwKKy0zMzM4OTAxOSwKKzE2Nzc1MTcwLAorMzMzODkwMTksCistMTY3NzMzNTgsCisxNTA5NDE2NiwKKy0yOTgyNjA1NywKKzE0ODc2MjA3LAorMjk4MjYwNTcsCistMTMxOTMxNTcsCisxMzYyOTU3NSwKKy0yNjcyMjIyNSwKKzEzMjIxOTQ4LAorMjY3MjIyMjUsCistMTAwNzQzMDcsCisxMjI2MTMwNCwKKy0yMzgyMjUyMCwKKzExNjc2NDgyLAorMjM4MjI1MjAsCistNzE2MDU3MSwKKzE2Nzc2MzU4LAorLTMzMzkwNzI5LAorMTY3NzU5MzUsCiszMzM5MDcyOSwKKy0xNjc3NTA3NiwKKzE1OTM5OTczLAorLTMxMzE1ODA5LAorMTU1MjczNjAsCiszMTMxNTgwOSwKKy0xNDY5MDExNywKKzE1MTQwMjU0LAorLTI5MzMxODUwLAorMTQzMzM1MjAsCisyOTMzMTg1MCwKKy0xMjY5NjU1OCwKKzE0MzI0NTUyLAorLTI3MzA4MjQwLAorMTMxMTU4MjEsCisyNzMwODI0MCwKKy0xMDY2MzE1NywKKzE2Nzc3MDA0LAorLTMzMzkxNjc3LAorMTY3NzYyNDEsCiszMzM5MTY3NywKKy0xNjc3NjAyOSwKKzE2NTY0NTE5LAorLTMyMjA4MDUxLAorMTU3OTkzNzQsCiszMjIwODA1MSwKKy0xNTU4NjY3NiwKKzE2MzQ5NzIwLAorLTMxMDExNTM4LAorMTQ4MTE4NzAsCiszMTAxMTUzOCwKKy0xNDM4NDM3NCwKKzE2MTE3ODg0LAorLTI5NzIwMTE5LAorMTM3NDYwMzgsCisyOTcyMDExOSwKKy0xMzA4NjcwNSwKKzE2Nzc3NTc0LAorLTMzMzkyMjAzLAorMTY3NzYxOTksCiszMzM5MjIwMywKKy0xNjc3NjU1OCwKKzE3MTQyNjIzLAorLTMyNzI1MTgzLAorMTU3NDA5MDMsCiszMjcyNTE4MywKKy0xNjEwNjMxMCwKKzE3NTIzNzQ2LAorLTMyMDI4NzkzLAorMTQ2NjAwMjEsCiszMjAyODc5MywKKy0xNTQwNjU1MSwKKzE3OTQ5NDUyLAorLTMxMjUwOTQxLAorMTM0NTI2OTksCiszMTI1MDk0MSwKKy0xNDYyNDkzNSwKKzE2Nzc4MjczLAorLTMzMzkyNDk1LAorMTY3NzU3OTQsCiszMzM5MjQ5NSwKKy0xNjc3Njg1MSwKKzE3ODY0NTExLAorLTMzMDE5MjIxLAorMTUzMTQ0NzYsCiszMzAxOTIyMSwKKy0xNjQwMTc3MSwKKzE5MDE5NTgyLAorLTMyNjIyMjk0LAorMTM3NjA1NTcsCiszMjYyMjI5NCwKKy0xNjAwMjkyMywKKzIwMzM1ODg2LAorLTMyMTY5OTYxLAorMTE5ODk3MzEsCiszMjE2OTk2MSwKKy0xNTU0ODQwMSwKKzE2Nzc5MzUwLAorLTMzMzkyNjU3LAorMTY3NzQ4NzksCiszMzM5MjY1NywKKy0xNjc3NzAxNCwKKzE4OTgyOTcyLAorLTMzMTg0NTkyLAorMTQzNjIxODYsCiszMzE4NDU5MiwKKy0xNjU2Nzk0MiwKKzIxMzUwNTU0LAorLTMyOTYxMDQ2LAorMTE3Njk5NzYsCiszMjk2MTA0NiwKKy0xNjM0MzMxNCwKKzI0MDc5Njg4LAorLTMyNzAzMzYyLAorODc4MTkxMiwKKzMyNzAzMzYyLAorLTE2MDg0MzgzLAorMTY3ODExOTAsCistMzMzOTI3NDYsCisxNjc3MzEzMCwKKzMzMzkyNzQ2LAorLTE2Nzc3MTA0LAorMjA4OTYzMDMsCistMzMyNzcwMjYsCisxMjU0MTczNywKKzMzMjc3MDI2LAorLTE2NjYwODI0LAorMjUzNDMxOTksCistMzMxNTE5NzcsCis3OTY5MTg1LAorMzMxNTE5NzcsCistMTY1MzUxNjksCiszMDUwMjM4NCwKKy0zMzAwNjg5NiwKKzI2NjQyMTksCiszMzAwNjg5NiwKKy0xNjM4OTM4NywKKzE2Nzg0NDUxLAorLTMzMzkyNzk2LAorMTY3Njk5MTgsCiszMzM5Mjc5NiwKKy0xNjc3NzE1NCwKKzI0Mjg4MjU4LAorLTMzMzI4NTE2LAorOTIwMTUyMCwKKzMzMzI4NTE2LAorLTE2NzEyNTYyLAorMzI0MjMxODcsCistMzMyNTg4MjgsCis5OTY1NjcsCiszMzI1ODgyOCwKKy0xNjY0MjUzOCwKKzQxODk1MzIwLAorLTMzMTc3Njg2LAorLTg1NTcxMDEsCiszMzE3NzY4NiwKKy0xNjU2MTAwMywKKzE2NTQxNTk1LAorLTMyNDQ3NDk4LAorMTY1NDE1ODcsCiszMjQ0NzQ5OCwKKy0xNjMwNTk2NiwKKzEwNjA5MjUsCistMjA4MDU5MCwKKzEwNjA0MjYsCisyMDgwNTkwLAorMTQ2NTU4NjUsCis1MjU0NzgsCistMTAzMDI1NiwKKzUyNDk2MiwKKzEwMzAyNTYsCisxNTcyNjc3NiwKKzMzMDMyMSwKKy02NDc0MzcsCiszMjk4MDAsCis2NDc0MzcsCisxNjExNzA5NSwKKzE2NjQ1NzE3LAorLTMyNjUxNzM0LAorMTY2NDU3MDMsCiszMjY1MTczNCwKKy0xNjUxNDIwMywKKzE4MjA3ODksCistMzU3MDA5NSwKKzE4MTkyNDgsCiszNTcwMDk1LAorMTMxMzcxNzksCis5MjQ1NzUsCistMTgxMjAxOCwKKzkyMjk0MiwKKzE4MTIwMTgsCisxNDkyOTY5OSwKKzU4NjY4NCwKKy0xMTQ5MTg2LAorNTg1MDE2LAorMTE0OTE4NiwKKzE1NjA1NTE2LAorMTY3MDQwMzYsCistMzI3NjYxMjEsCisxNjcwNDAxMSwKKzMyNzY2MTIxLAorLTE2NjMwODMxLAorMzAyMDg3NSwKKy01OTIxMTM4LAorMzAxNjI2NiwKKzU5MjExMzgsCisxMDc0MDA3NiwKKzE1OTc1NzMsCistMzEyODc2NCwKKzE1OTI0ODcsCiszMTI4NzY0LAorMTM1ODcxNTYsCisxMDMwMTI0LAorLTIwMTU0ODcsCisxMDI0ODQ4LAorMjAxNTQ4NywKKzE0NzIyMjQ0LAorMTY3MzY1NjUsCistMzI4Mjk5MDksCisxNjczNjUyMSwKKzMyODI5OTA5LAorLTE2Njk1ODY5LAorNDc2MjAxMywKKy05MzI4MTg1LAorNDc0ODkyMiwKKzkzMjgxODUsCis3MjY2MjgxLAorMjY3OTU2NiwKKy01MjQxMDkxLAorMjY2NDIwNSwKKzUyNDEwOTEsCisxMTQzMzQ0NiwKKzE3NzM5MTIsCistMzQ2MzYyMCwKKzE3NTc1NjQsCiszNDYzNjIwLAorMTMyNDU3NDAsCisxNjc1NDY3MywKKy0zMjg2NTM5NSwKKzE2NzU0NTkzLAorMzI4NjUzOTUsCistMTY3MzIwNTAsCis3MDAxNzcyLAorLTEzNzAwNDY4LAorNjk2NzEwNCwKKzEzNzAwNDY4LAorMjgwODM0MCwKKzQyOTMzNjMsCistODM3ODMxMiwKKzQyNDkwODksCis4Mzc4MzEyLAorODIzNDc2NCwKKzI5NjAwNjEsCistNTc1ODMwNywKKzI5MTEwNTgsCis1NzU4MzA3LAorMTA5MDYwOTcsCisxNjc2NDc1NiwKKy0zMjg4NTExMCwKKzE2NzY0NjExLAorMzI4ODUxMTAsCistMTY3NTIxNTEsCis5NDgwMTg4LAorLTE4NTEzMjE1LAorOTM5NTcyMiwKKzE4NTEzMjE1LAorLTIwOTg2OTQsCis2NDUzNjkzLAorLTEyNTQyMTcxLAorNjMzNDE5NCwKKzEyNTQyMTcxLAorMzk4OTMzMCwKKzQ3MTA2NDEsCistOTEwMzI2NCwKKzQ1NzA5NjYsCis5MTAzMjY0LAorNzQ5NTYwOSwKKzE2NzcwMzkzLAorLTMyODk2MDU0LAorMTY3NzAxMzMsCiszMjg5NjA1NCwKKy0xNjc2MzMxMCwKKzExODE2Mjc2LAorLTIyOTkyOTQ5LAorMTE2MjcxMzEsCisyMjk5Mjk0OSwKKy02NjY2MTkxLAorODk3NTcyNiwKKy0xNzMxNDc4OSwKKzg2NzgyODAsCisxNzMxNDc4OSwKKy04NzY3OTAsCis3MDMyNDA4LAorLTEzNDMwMTY0LAorNjY2MDg2OSwKKzEzNDMwMTY0LAorMzA4Mzk0MCwKKzE2NzczNTkzLAorLTMyOTAyMTI3LAorMTY3NzMxMjQsCiszMjkwMjEyNywKKy0xNjc2OTUwMiwKKzEzNzM1NjE1LAorLTI2NTU3MDUyLAorMTMzNDE3MjAsCisyNjU1NzA1MiwKKy0xMDMwMDEyMCwKKzExNTI4MTY1LAorLTIxOTQ2NjA2LAorMTA4NDg0MDAsCisyMTk0NjYwNiwKKy01NTk5MzQ5LAorOTc1MjU2MywKKy0xODIzODExMCwKKzg4NDI4NTMsCisxODIzODExMCwKKy0xODE4MjAwLAorMTY3NzU0OTksCistMzI5MDU0OTYsCisxNjc3NDY1NCwKKzMyOTA1NDk2LAorLTE2NzcyOTM3LAorMTUyMDA1ODgsCistMjkwNTQ5NTcsCisxNDQyMzU4OSwKKzI5MDU0OTU3LAorLTEyODQ2OTYxLAorMTM4NTcwMDQsCistMjU3Njk5OTUsCisxMjQxNzg1NSwKKzI1NzY5OTk1LAorLTk0OTc2NDMsCisxMjYyNDQ1MywKKy0yMjc1NjUwMCwKKzEwNTc3ODczLAorMjI3NTY1MDAsCistNjQyNTExMSwKKzE2Nzc2NzkyLAorLTMyOTA3MzY1LAorMTY3NzUyNjcsCiszMjkwNzM2NSwKKy0xNjc3NDg0MywKKzE2MzY2MzQ0LAorLTMwNjU0MDg5LAorMTQ4ODgyOTQsCiszMDY1NDA4OSwKKy0xNDQ3NzQyMiwKKzE1OTc4NzUzLAorLTI4NTI2Mjk1LAorMTMxMDY0MDYsCisyODUyNjI5NSwKKy0xMjMwNzk0MiwKKzE1NTg4MDU3LAorLTI2MzgxNDU2LAorMTEzMTAyNDIsCisyNjM4MTQ1NiwKKy0xMDEyMTA4MywKKzE2Nzc3OTMzLAorLTMyOTA4NDAyLAorMTY3NzUxODMsCiszMjkwODQwMiwKKy0xNjc3NTkwMCwKKzE3NDkzODAyLAorLTMxNjE5Mjg3LAorMTQ3NDQ5NDMsCiszMTYxOTI4NywKKy0xNTQ2MTUyOSwKKzE4MjEyNDE0LAorLTMwMzI1MjM0LAorMTI3MDY5MjcsCiszMDMyNTIzNCwKKy0xNDE0MjEyNCwKKzE4OTgyNzI1LAorLTI4OTM4MDgxLAorMTA1MjIyODYsCisyODkzODA4MSwKKy0xMjcyNzc5NSwKKzE2Nzc5MzMwLAorLTMyOTA4OTc3LAorMTY3NzQzNzIsCiszMjkwODk3NywKKy0xNjc3NjQ4NiwKKzE4OTI4MDQxLAorLTMyMTgxMjgwLAorMTM4ODM3MDcsCiszMjE4MTI4MCwKKy0xNjAzNDUzMiwKKzIxMTYzMTE4LAorLTMxNDI0MzM0LAorMTA4NzY4NTUsCiszMTQyNDMzNCwKKy0xNTI2Mjc1NywKKzIzNjUwODcxLAorLTMwNTgxODE0LAorNzUzMDA3NiwKKzMwNTgxODE0LAorLTE0NDAzNzMxLAorMTY3ODE0ODQsCistMzI5MDkyOTYsCisxNjc3MjU0MywKKzMyOTA5Mjk2LAorLTE2Nzc2ODExLAorMjExNjE5OTYsCistMzI1MDE2NzQsCisxMTk3NjQyNCwKKzMyNTAxNjc0LAorLTE2MzYxMjA0LAorMjU4MTIwMDksCistMzIwNjg5NzUsCis2ODg1MjM0LAorMzIwNjg5NzUsCistMTU5MjAwMjcsCiszMTEwMzM4NSwKKy0zMTU3NjU5NCwKKzEwOTE4MzEsCiszMTU3NjU5NCwKKy0xNTQxODAwMCwKKzE2Nzg1MTY0LAorLTMyOTA5NDczLAorMTY3NjkwNDMsCiszMjkwOTQ3MywKKy0xNjc3Njk5MSwKKzI0OTg4MDY0LAorLTMyNjgyMTM5LAorODMzNDM1NiwKKzMyNjgyMTM5LAorLTE2NTQ1MjA0LAorMzM3OTU3OTQsCistMzI0MzgwNDMsCistNzIyMjUyLAorMzI0MzgwNDMsCistMTYyOTYzMjUsCis0Mzk0NjEyOCwKKy0zMjE1NjczOCwKKy0xMTE1OTQwMywKKzMyMTU2NzM4LAorLTE2MDA5NTEwLAorMTY3OTE2ODcsCistMzI5MDk1NzEsCisxNjc2MjYyMCwKKzMyOTA5NTcxLAorLTE2Nzc3MDkxLAorMzE3NzI1MjEsCistMzI3ODMwOTYsCisxNjUyODM0LAorMzI3ODMwOTYsCistMTY2NDgxMzksCis0Nzk2MTIyOSwKKy0zMjY0NjQyMywKKy0xNDY3NTIyNSwKKzMyNjQ2NDIzLAorLTE2NTA4Nzg4LAorNjY3NTE2ODIsCistMzI0ODc3ODUsCistMzM2Mjc0MjMsCiszMjQ4Nzc4NSwKKy0xNjM0NzA0MywKKzE2MzEyNTAwLAorLTMwMTQxNTU2LAorMTYzMTI0ODUsCiszMDE0MTU1NiwKKy0xNTg0Nzc2OSwKKzU0NzU5OCwKKy0xMDExMzU0LAorNTQ3MDg0LAorMTAxMTM1NCwKKzE1NjgyNTM0LAorMjY2NDQ4LAorLTQ5MTg0OSwKKzI2NTkyNSwKKzQ5MTg0OSwKKzE2MjQ0ODQzLAorMTY2MTExLAorLTMwNjQ0NiwKKzE2NTU4NCwKKzMwNjQ0NiwKKzE2NDQ1NTIxLAorMTY1MTYyNjIsCistMzA1MTgwNDksCisxNjUxNjIzNiwKKzMwNTE4MDQ5LAorLTE2MjU1MjgyLAorOTYyNDg3LAorLTE3NzY5MzgsCis5NjA4NTcsCisxNzc2OTM4LAorMTQ4NTM4NzIsCis0NzQ3NDIsCistODc1NjU2LAorNDczMDYyLAorODc1NjU2LAorMTU4Mjk0MTMsCisyOTc1MjAsCistNTQ4MTc2LAorMjk1ODIxLAorNTQ4MTc2LAorMTYxODM4NzUsCisxNjYzMTQ5MiwKKy0zMDczMDk0NCwKKzE2NjMxNDQzLAorMzA3MzA5NDQsCistMTY0ODU3MTksCisxNjYwMTQ2LAorLTMwNjI4NzAsCisxNjU1MDgxLAorMzA2Mjg3MCwKKzEzNDYxOTg5LAorODM4MTcyLAorLTE1NDM4MDYsCis4MzI4MzEsCisxNTQzODA2LAorMTUxMDYyMTMsCis1MzAxMzUsCistOTc0NTMyLAorNTI0NjkxLAorOTc0NTMyLAorMTU3MjIzOTAsCisxNjY5NjExMCwKKy0zMDg1MDMwNywKKzE2Njk2MDIyLAorMzA4NTAzMDcsCistMTY2MTQ5MTYsCisyNzc2NjQyLAorLTUxMTY0NzIsCisyNzYxMzg3LAorNTExNjQ3MiwKKzExMjM5MTg3LAorMTQ1Njg0NSwKKy0yNjc2NDc3LAorMTQ0MDE1MiwKKzI2NzY0NzcsCisxMzg4MDIxOSwKKzkzNjE1MSwKKy0xNzEzODM1LAorOTE4ODkxLAorMTcxMzgzNSwKKzE0OTIyMTc0LAorMTY3MzIxOTEsCistMzA5MTY5MTAsCisxNjczMjAzMSwKKzMwOTE2OTEwLAorLTE2Njg3MDA2LAorNDQzMDIxOSwKKy04MTQ1NTIzLAorNDM4NjQzMSwKKzgxNDU1MjMsCis3OTYwNTY2LAorMjQ2NzcxNSwKKy00NTEyODU3LAorMjQxNjk2NiwKKzQ1MTI4NTcsCisxMTg5MjUzNSwKKzE2MjgxMTMsCistMjk1ODcyNSwKKzE1NzQzODcsCisyOTU4NzI1LAorMTM1NzQ3MTYsCisxNjc1MjMxNCwKKy0zMDk1Mzk3MywKKzE2NzUyMDI1LAorMzA5NTM5NzMsCistMTY3MjcxMjMsCis2NjIyMTkzLAorLTEyMTI3NjE2LAorNjUwNDY0NCwKKzEyMTI3NjE2LAorMzY1MDM3OSwKKzQwMTY1NDEsCistNzI4NTEzNSwKKzM4Njg4MzEsCis3Mjg1MTM1LAorODg5MTg0MywKKzI3NjI2NzUsCistNDk1NDg4MywKKzI2MDA0NTEsCis0OTU0ODgzLAorMTE0MTQwODksCisxNjc2MzU3NSwKKy0zMDk3NDU2OCwKKzE2NzYzMDU1LAorMzA5NzQ1NjgsCistMTY3NDk0MTUsCis5MTUwNDMxLAorLTE2NjM5MTQyLAorODg1OTY0NiwKKzE2NjM5MTQyLAorLTEyMzI4NjEsCis2MTgyMTgxLAorLTExMDQ5OTc0LAorNTc3ODIyNSwKKzExMDQ5OTc0LAorNDgxNjgxMCwKKzQ1MTg2MjksCistNzkxNzUzMiwKKzQwNTEyNDcsCis3OTE3NTMyLAorODIwNzM0MSwKKzE2NzY5OTczLAorLTMwOTg2MDAyLAorMTY3NjkwMzQsCiszMDk4NjAwMiwKKy0xNjc2MTc5MSwKKzExNjc2MjY5LAorLTIwOTY0NjMwLAorMTEwMTU2ODMsCisyMDk2NDYzMCwKKy01OTE0NzM2LAorODg5MzQxOCwKKy0xNTQ4OTYzOCwKKzc4NzI0NDYsCisxNTQ4OTYzOCwKKzExMzUyLAorNzA0MTM4MywKKy0xMTg0NTkzOSwKKzU3ODA1NjgsCisxMTg0NTkzOSwKKzM5NTUyNjUsCisxNjc3Mzc4MywKKy0zMDk5MjM0NywKKzE2NzcyMDkyLAorMzA5OTIzNDcsCistMTY3Njg2NTksCisxMzk1MzI4MCwKKy0yNDQ5NjUzNCwKKzEyNTYxNTc3LAorMjQ0OTY1MzQsCistOTczNzY0MSwKKzExOTcwOTIxLAorLTE5OTMxMDI1LAorOTYwMjI2NSwKKzE5OTMxMDI1LAorLTQ3OTU5NzAsCisxMDQxMzE3MiwKKy0xNjM0MzQyMSwKKzcyNzY4MjAsCisxNjM0MzQyMSwKKy05MTI3NzUsCisxNjc3NjM2OCwKKy0zMDk5NTg2OCwKKzE2NzczMzE4LAorMzA5OTU4NjgsCistMTY3NzI0NzAsCisxNjAwNzc5MCwKKy0yNzAyMTM0MywKKzEzMjM5OTAxLAorMjcwMjEzNDMsCistMTI0NzA0NzUsCisxNTM2NTUyNywKKy0yMzcwMDAyNCwKKzEwMjg3MTk0LAorMjM3MDAwMjQsCistODg3NTUwNSwKKzE0Nzg1OTQ3LAorLTIwNzAyODU3LAorNzYyMjY2NCwKKzIwNzAyODU3LAorLTU2MzEzOTUsCisxNjc3ODY1MCwKKy0zMDk5NzgyMSwKKzE2NzczMTUwLAorMzA5OTc4MjEsCistMTY3NzQ1ODMsCisxODE1NzA1NiwKKy0yODY1OTY0OSwKKzEyODYzOTI1LAorMjg2NTk2NDksCistMTQyNDM3NjQsCisxOTQ0MzgwNiwKKy0yNjQ3Njk1MCwKKzkyMTQ2MzgsCisyNjQ3Njk1MCwKKy0xMTg4MTIyOCwKKzIwNzI4NjgxLAorLTI0Mjk3NDMzLAorNTU3MDY3MSwKKzI0Mjk3NDMzLAorLTk1MjIxMzYsCisxNjc4MTQ0NSwKKy0zMDk5ODkwNCwKKzE2NzcxNTI3LAorMzA5OTg5MDQsCistMTY3NzU3NTYsCisyMDk4ODA2MCwKKy0yOTY1NjkyMSwKKzExMTEyMzYxLAorMjk2NTY5MjEsCistMTUzMjMyMDQsCisyNTE4Nzc0MywKKy0yODMxNzE1MCwKKzU0NjI1MjAsCisyODMxNzE1MCwKKy0xMzg3MzA0NywKKzI5NjcyMTI0LAorLTI2ODg2NTU2LAorLTU3MDMyNiwKKzI2ODg2NTU2LAorLTEyMzI0NTgyLAorMTY3ODU3NTIsCistMzA5OTk1MDUsCisxNjc2Nzg3MCwKKzMwOTk5NTA1LAorLTE2Nzc2NDA2LAorMjU0NDQzMDAsCistMzAyNDA1NDUsCis3Mjg3ODMwLAorMzAyNDA1NDUsCistMTU5NTQ5MTQsCiszNDQzNDk4MCwKKy0yOTQ1MjQ3MiwKKy0yNTU1ODU0LAorMjk0NTI0NzIsCistMTUxMDE5MTAsCis0NDQ0MTI0MiwKKy0yODU3NTM3OSwKKy0xMzUxMTQ3NCwKKzI4NTc1Mzc5LAorLTE0MTUyNTUyLAorMTY3OTMxMTIsCistMzA5OTk4MzgsCisxNjc2MDg3MSwKKzMwOTk5ODM4LAorLTE2Nzc2NzY3LAorMzMwOTU1MDYsCistMzA1NzQyNTAsCistMjE3NywKKzMwNTc0MjUwLAorLTE2MzE2MTEzLAorNTA0MDgwMzQsCistMzAxMjIyOTEsCistMTc4MDM5MDIsCiszMDEyMjI5MSwKKy0xNTgyNjkxNywKKzcwMTUzNzY1LAorLTI5NjA2ODExLAorLTM4MTA3NTgzLAorMjk2MDY4MTEsCistMTUyNjg5NjYsCisxNjgwNjE1OCwKKy0zMTAwMDAyMywKKzE2NzQ4MDI1LAorMzEwMDAwMjMsCistMTY3NzY5NjcsCis0NjY3MDE1NSwKKy0zMDc2MjUyNiwKKy0xMzM3MzAzNywKKzMwNzYyNTI2LAorLTE2NTE5OTAyLAorNzg3ODk1NDQsCistMzA1MDcwOTIsCistNDU3Njg5MDUsCiszMDUwNzA5MiwKKy0xNjI0MzQyMywKKzExNTk0Mjc0NywKKy0zMDIxMTYyNywKKy04MzI0MTkxOCwKKzMwMjExNjI3LAorLTE1OTIzNjEzLAorMTU4NzI4MzUsCistMjI0NDc1NTksCisxNTg3MjgwNywKKzIyNDQ3NTU5LAorLTE0OTY4NDI2LAorMjc3NzU0LAorLTM5MjQzNCwKKzI3NzIzMSwKKzM5MjQzNCwKKzE2MjIyMjMxLAorMTMzMDYxLAorLTE4NzgwNCwKKzEzMjUzMywKKzE4NzgwNCwKKzE2NTExNjIyLAorODE3NjMsCistMTE1MjU2LAorODEyMzMsCisxMTUyNTYsCisxNjYxNDIyMCwKKzE2MjYzMzAzLAorLTIyOTk5NzQ2LAorMTYyNjMyNTAsCisyMjk5OTc0NiwKKy0xNTc0OTMzNywKKzQ5NDYwNSwKKy02OTgyOTAsCis0OTI5MjcsCis2OTgyOTAsCisxNTc4OTY4NSwKKzIzODc3NiwKKy0zMzY0NzUsCisyMzcwNzEsCiszMzY0NzUsCisxNjMwMTM2OSwKKzE0NzIyOCwKKy0yMDcwMDAsCisxNDU1MTQsCisyMDcwMDAsCisxNjQ4NDQ3MywKKzE2NDg4Mjc4LAorLTIzMzE3ODc3LAorMTY0ODgxODEsCisyMzMxNzg3NywKKy0xNjE5OTI0MiwKKzg3MjM3OCwKKy0xMjI5OTYxLAorODY3MDQ5LAorMTIyOTk2MSwKKzE1MDM3Nzg4LAorNDI2ODg5LAorLTU5OTgzOSwKKzQyMTQxMSwKKzU5OTgzOSwKKzE1OTI4OTE2LAorMjY0ODQwLAorLTM3MDYyOSwKKzI1OTMwOCwKKzM3MDYyOSwKKzE2MjUzMDY4LAorMTY2MTU3ODUsCistMjM0OTgxNDUsCisxNjYxNTYwOSwKKzIzNDk4MTQ1LAorLTE2NDU0MTc5LAorMTUxMzc1NywKKy0yMTI5MDE2LAorMTQ5NzEyNiwKKzIxMjkwMTYsCisxMzc2NjMzMywKKzc1ODI2MSwKKy0xMDYwMDAxLAorNzQwODA2LAorMTA2MDAwMSwKKzE1Mjc4MTQ5LAorNDc1NTUxLAorLTY1OTk3MSwKKzQ1Nzc4OSwKKzY1OTk3MSwKKzE1ODQzODc1LAorMTY2ODc0MDcsCistMjM1OTkzMzIsCisxNjY4NzA4OSwKKzIzNTk5MzMyLAorLTE2NTk3MjgwLAorMjU1NzExNiwKKy0zNTgwNjQ3LAorMjUwNjY4NCwKKzM1ODA2NDcsCisxMTcxMzQxNiwKKzEzMzIwMDcsCistMTg0NTAwOSwKKzEyNzcyMzAsCisxODQ1MDA5LAorMTQxNjc5NzksCis4NTEyNzIsCistMTE2Mzk0MiwKKzc5NDc5MSwKKzExNjM5NDIsCisxNTEzMTE1NCwKKzE2NzI3NDg2LAorLTIzNjU1ODMwLAorMTY3MjY5MTAsCisyMzY1NTgzMCwKKy0xNjY3NzE4MCwKKzQxNDQ3NDksCistNTc1ODE2MywKKzM5OTg1MjMsCis1NzU4MTYzLAorODYzMzk0NCwKKzIyOTc4MDMsCistMzEzMTA2OSwKKzIxMzAxOTgsCiszMTMxMDY5LAorMTIzNDkyMTYsCisxNTE2MDI1LAorLTIwMTkwNzAsCisxMzM5MzcxLAorMjAxOTA3MCwKKzEzOTIxODIwLAorMTY3NDk5NTcsCistMjM2ODcyODIsCisxNjc0ODkxOCwKKzIzNjg3MjgyLAorLTE2NzIxNjYwLAorNjM0MjgwNywKKy04Njg4Nzc0LAorNTk0NDk3NSwKKzg2ODg3NzQsCis0NDg5NDM0LAorMzg1NTcyMiwKKy01MTA0NDU0LAorMzM2MzA2NiwKKzUxMDQ0NTQsCis5NTU4NDI4LAorMjY3ODI4NiwKKy0zNDA3NTY0LAorMjE0MDczOCwKKzM0MDc1NjQsCisxMTk1ODE5MiwKKzE2NzYyNzM2LAorLTIzNzA0NzYyLAorMTY3NjA4NjEsCisyMzcwNDc2MiwKKy0xNjc0NjM4MCwKKzkwNTk5NDgsCistMTIxMDYwMTQsCis4MDYwNTQyLAorMTIxMDYwMTQsCistMzQzMjc0LAorNjIzMTk1OSwKKy03ODQ3NjY5LAorNDg2NjMyMiwKKzc4NDc2NjksCis1Njc4OTM2LAorNDY3ODU3MywKKy01NTA4NjAzLAorMzExMTc2OCwKKzU1MDg2MDMsCis4OTg2ODc1LAorMTY3NzAzNTMsCistMjM3MTQ0NjgsCisxNjc2Njk3MCwKKzIzNzE0NDY4LAorLTE2NzYwMTA3LAorMTIxMDA3NjgsCistMTU0ODM0MjcsCis5Nzk2MTA0LAorMTU0ODM0MjcsCistNTExOTY1NiwKKzk2NTk0MDEsCistMTExODAwNDcsCis2MTUxNTczLAorMTExODAwNDcsCis5NjYyNDIsCis4MDY2MDAzLAorLTgzNzEzNzYsCiszNzcyOTExLAorODM3MTM3NiwKKzQ5MzgzMDIsCisxNjc3NTUyMCwKKy0yMzcxOTg1NSwKKzE2NzY5NDIwLAorMjM3MTk4NTUsCistMTY3Njc3MjUsCisxNTQxMDY0NywKKy0xODMxNzc5NCwKKzEwNDk0NjI2LAorMTgzMTc3OTQsCistOTEyODA1NiwKKzE0NDc3NDM5LAorLTE0NjI0MjMzLAorNjIwNDM1MCwKKzE0NjI0MjMzLAorLTM5MDQ1NzMsCisxMzc1NDEyNywKKy0xMTc2MTQxOSwKKzI4NzkwMzIsCisxMTc2MTQxOSwKKzE0NDA1OCwKKzE2NzgwMDgzLAorLTIzNzIyODQ0LAorMTY3NjkwODQsCisyMzcyMjg0NCwKKy0xNjc3MTk1MSwKKzE5MzQ4OTQ3LAorLTIwMzg3NzM1LAorOTQ4MzY2NCwKKzIwMzg3NzM1LAorLTEyMDU1Mzk1LAorMjE0NjcwMzgsCistMTc2Mzc4NTUsCiszNDc2NjU2LAorMTc2Mzc4NTUsCistODE2NjQ3OCwKKzIzMzY5MzAxLAorLTE1MTY4MTgxLAorLTE5MTgyNTMsCisxNTE2ODE4MSwKKy00NjczODMyLAorMTY3ODU2NzMsCistMjM3MjQ1MDEsCisxNjc2NTgzOSwKKzIzNzI0NTAxLAorLTE2Nzc0Mjk2LAorMjQ4Njg1NDcsCistMjE3NTA5NDUsCis1ODkxOTM0LAorMjE3NTA5NDUsCistMTM5ODMyNjUsCiszMjM5MjU0MywKKy0xOTkxMzg0NywKKy00MjMwMTEwLAorMTk5MTM4NDcsCistMTEzODUyMTcsCiszOTkzODY0MSwKKy0xODA3MTM1MywKKy0xNDM4MTg4OCwKKzE4MDcxMzUzLAorLTg3Nzk1MzcsCisxNjc5NDI4OCwKKy0yMzcyNTQyMSwKKzE2NzU4NTI1LAorMjM3MjU0MjEsCistMTY3NzU1OTYsCiszMzczOTAyNSwKKy0yMjU4ODYzNiwKKy0xNzkzODcwLAorMjI1ODg2MzYsCistMTUxNjc5NDAsCis1MDcyNzM3MSwKKy0yMTQ0ODkyNiwKKy0yMDM5NDAxMCwKKzIxNDQ4OTI2LAorLTEzNTU2MTQ2LAorNjkwODIyMTgsCistMjAyMTc1NDAsCistNDA0OTAyOTgsCisyMDIxNzU0MCwKKy0xMTgxNDcwMywKKzE2ODA5MDA4LAorLTIzNzI1OTMxLAorMTY3NDQ1MjYsCisyMzcyNTkzMSwKKy0xNjc3NjMxOCwKKzQ5MDUzNTk0LAorLTIzMDgxNjY2LAorLTE2NDExMTg5LAorMjMwODE2NjYsCistMTU4NjUxODksCis4MjgyNDI5NiwKKy0yMjQwNjkwOCwKKy01MTEzNjE0MywKKzIyNDA2OTA4LAorLTE0OTEwOTM3LAorMTIxMDQ5OTE1LAorLTIxNjQzMTM4LAorLTkwNDQxODk1LAorMjE2NDMxMzgsCistMTM4MzA4MDMsCisxNjgzNTA5OSwKKy0yMzcyNjIxNCwKKzE2NzE4ODM1LAorMjM3MjYyMTQsCistMTY3NzY3MTgsCis3NjI2MTQ2OCwKKy0yMzM2NDUwNSwKKy00MzIxOTA2OCwKKzIzMzY0NTA1LAorLTE2MjY1MTg0LAorMTQwMDgwNjAzLAorLTIyOTc2MDU5LAorLTEwNzU4NzU0OSwKKzIyOTc2MDU5LAorLTE1NzE1ODM4LAorMjE0MzQ4NTU3LAorLTIyNTI0MDE0LAorLTE4MjQ5NDc5MSwKKzIyNTI0MDE0LAorLTE1MDc2NTUwLAorMTUwNjA5NzEsCiswLAorMTUwNjA5MTYsCiswLAorLTEzMzQ0NjcxLAorMTM3NzE1LAorMCwKKzEzNzE4OCwKKzAsCisxNjUwMjMxMywKKzYyNDk0LAorMCwKKzYxOTY0LAorMCwKKzE2NjUyNzU3LAorMzU0OTksCiswLAorMzQ5NjksCiswLAorMTY3MDY3NDgsCisxNTc3OTkzOSwKKzAsCisxNTc3OTgzNywKKzAsCistMTQ3ODI1NjAsCisyNDcwNTksCiswLAorMjQ1MzU2LAorMCwKKzE2Mjg0ODAxLAorMTEyNzI2LAorMCwKKzExMTAwOSwKKzAsCisxNjU1MzQ4MSwKKzY0MjgyLAorMCwKKzYyNTYwLAorMCwKKzE2NjUwMzc1LAorMTYyMDkxMjQsCiswLAorMTYyMDg5MzQsCiswLAorLTE1NjQwODQyLAorNDQxNDgzLAorMCwKKzQzNjAxMCwKKzAsCisxNTg5OTcyMywKKzIwMzQwMSwKKzAsCisxOTc4NDgsCiswLAorMTYzNzU5NjcsCisxMTY3OTQsCiswLAorMTExMjEyLAorMCwKKzE2NTQ5MjExLAorMTY0NTc0MzMsCiswLAorMTY0NTcwODUsCiswLAorLTE2MTM3MzAyLAorNzgzNTEwLAorMCwKKzc2NjA4MywKKzAsCisxNTIyNzYyMywKKzM2NzIyOSwKKzAsCiszNDkzNDksCiswLAorMTYwNjA2MzgsCisyMTM0NTcsCiswLAorMTk1NDA5LAorMCwKKzE2MzY4MzQ5LAorMTY1OTg1NTYsCiswLAorMTY1OTc5MjMsCiswLAorLTE2NDE5MjYzLAorMTM3NDMzMiwKKzAsCisxMzE5NzA1LAorMCwKKzE0MDgzMTc5LAorNjYzNjgzLAorMCwKKzYwNjUzNiwKKzAsCisxNTUwNjk5NiwKKzM5NDA3NywKKzAsCiszMzU5NzQsCiswLAorMTYwNDcxNjYsCisxNjY3ODA1MSwKKzAsCisxNjY3NjkwMywKKzAsCistMTY1Nzc3MzgsCisyMzY1MDEwLAorMCwKKzIxOTgxODMsCiswLAorMTIyMTQwMjMsCisxMjAxNDc5LAorMCwKKzEwMjExODMsCiswLAorMTQ1NTQ1NTQsCis3Mzk2NjYsCiswLAorNTU0MDI1LAorMCwKKzE1NDgzNTI1LAorMTY3MjI3ODksCiswLAorMTY3MjA3MTQsCiswLAorLTE2NjY2Mjg3LAorMzk1MzIxNCwKKzAsCiszNDY0Mjc1LAorMCwKKzkzNTk3MjgsCisyMTgwODA3LAorMCwKKzE2MjQyOTEsCiswLAorMTI5NzIxMTgsCisxNDIzOTM2LAorMCwKKzgzODU2NCwKKzAsCisxNDUxNDcxNiwKKzE2NzQ4MjgyLAorMCwKKzE2NzQ0NTM1LAorMCwKKy0xNjcxNTYwMSwKKzYzNTM3ODYsCiswLAorNTAwMzkyNiwKKzAsCis1NDE5NTA0LAorMzk3MzEwOCwKKzAsCisyMzE0OTQ0LAorMCwKKzEwNDg5MTY1LAorMjgzNzUxMSwKKzAsCisxMDMyMjg0LAorMCwKKzEyOTA3NDIxLAorMTY3NjM0OTYsCiswLAorMTY3NTY3MzUsCiswLAorLTE2NzQzMDE1LAorOTc3NTk3OCwKKzAsCis2MzI1NjAyLAorMCwKKzY3NTYzNiwKKzcyNjk5NTksCiswLAorMjU4NDU1OCwKKzAsCis2OTIyNjk4LAorNTg3ODUyMCwKKzAsCis1MDczODQsCiswLAorMTAzOTEzMTMsCisxNjc3MzgyNiwKKzAsCisxNjc2MTYyOSwKKzAsCistMTY3NTgyMzksCisxNDUyNjQ2MiwKKzAsCis2NDI5NzIzLAorMCwKKy00MTc4OTY4LAorMTMzNTEwODYsCiswLAorMTAyNjExNywKKzAsCisyNDAwMDEyLAorMTI1NjY4NDYsCiswLAorLTI1NzkzMDYsCiswLAorNjc4OTY3NiwKKzE2NzgyOTUwLAorMCwKKzE2NzYwOTU0LAorMCwKKy0xNjc2NjY4OCwKKzIxMzQ2OTk2LAorMCwKKzM4MTcxMDIsCiswLAorLTgzODY4ODEsCisyNDU0ODI1NywKKzAsCistNTI2MTgyOCwKKzAsCistMjUwOTIxMiwKKzI3MTM2NzQ2LAorMCwKKy0xMjYwMjkwOCwKKzAsCisyMjQzMzc4LAorMTY3OTQxMjksCiswLAorMTY3NTQ0NjMsCiswLAorLTE2NzcxMzc2LAorMzE5NDI3NTYsCiswLAorLTM2MjUwMTEsCiswLAorLTExNTQwNTI5LAorNDUwNDg2NzMsCiswLAorLTIxMjU2NDIzLAorMCwKKy03MDE1MDM0LAorNTc2NDYxNDAsCiswLAorLTM4MjAzODE3LAorMCwKKy0yNjY1MTA3LAorMTY4MTEzNTgsCiswLAorMTY3Mzk4MzUsCiswLAorLTE2NzczOTc3LAorNDk2NzY0MTUsCiswLAorLTE5MjQzMzQyLAorMCwKKy0xMzY1NTg1NywKKzgyMzM5OTg0LAorMCwKKy01NTAwNTkxNSwKKzAsCistMTA1NTY4NTMsCisxMTgyODc0OTYsCiswLAorLTk0MzYzOTk5LAorMCwKKy03MTQ2MjgxLAorMTY4NDA3OTksCiswLAorMTY3MTE4MzcsCiswLAorLTE2Nzc1NDE5LAorODA2OTEzODMsCiswLAorLTQ4OTQyOTYxLAorMCwKKy0xNDk3MTIwNiwKKzE0OTg1ODUwNSwKKzAsCistMTIwMDY0NTI0LAorMCwKKy0xMzAxNjc2NSwKKzIzMzUyMDY1MiwKKzAsCistMjA2MDkwNjk1LAorMCwKKy0xMDY1Mjc0MSwKKzE2ODkyOTgxLAorMCwKKzE2NjYwNDU1LAorMCwKKy0xNjc3NjIyMCwKKzEzNjAwMDg2OCwKKzAsCistMTAzNDcyNjk2LAorMCwKKy0xNTc1MDk1NiwKKzI3MTgwMTQ2OSwKKzAsCistMjQwNDQyMjUwLAorMCwKKy0xNDU4MjAwMywKKzQ0NjMwOTYwMSwKKzAsCistNDE2NDUyNTI0LAorMCwKKy0xMzA3OTg2MiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjUwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKiAvYW5kcm9pZC9zcmMvZnJhbWV3b3Jrcy9iYXNlL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJBdWRpb1NoZWx2aW5nRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9Db21tb24uaCIKKyNpbmNsdWRlICJFZmZlY3RzTWF0aC5oIgorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExJS0VMWSggZXhwICkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIHRydWUgICkpCisjZGVmaW5lIFVOTElLRUxZKCBleHAgKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIGZhbHNlICkpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIEZvcm1hdCBvZiB0aGUgY29lZmZpY2llbnQgdGFibGVzOgorLy8ga0NvZWZUYWJsZVtmcmVxXVtnYWluXVtjb2VmXQorLy8gZnJlcSAgLSBjdXRvZmYgZnJlcXVlbmN5LCBpbiBvY3RhdmVzIGJlbG93IE55cXVpc3QsZnJvbSAtMTAgdG8gLTYgaW4gbG93CisvLyAgICAgICAgIHNoZWxmLCAtMiB0byAwIGluIGhpZ2ggc2hlbGYuCisvLyBnYWluICAtIGdhaW4sIGluIG1pbGxpYmVsLCBzdGFydGluZyBhdCAtOTYwMCwganVtcHMgb2YgMTAyNCwgdG8gNDczNiBtaWxsaWJlbC4KKy8vIGNvZWYgLSAwOiBiMAorLy8gICAgICAgIDE6IGIxCisvLyAgICAgICAgMjogYjIKKy8vICAgICAgICAzOiAtYTEKKy8vICAgICAgICA0OiAtYTIKK3N0YXRpYyBjb25zdCBzaXplX3Qga0hpSW5EaW1zWzJdID0gezMsIDE1fTsKK3N0YXRpYyBjb25zdCBhdWRpb19jb2VmX3Qga0hpQ29lZlRhYmxlWzMqMTUqNV0gPSB7CisjaW5jbHVkZSAiQXVkaW9IaWdoU2hlbGZGaWx0ZXJDb2VmLmlubCIKK307CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb0luRGltc1syXSA9IHs1LCAxNX07CitzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IGtMb0NvZWZUYWJsZVs1KjE1KjVdID0geworI2luY2x1ZGUgIkF1ZGlvTG93U2hlbGZGaWx0ZXJDb2VmLmlubCIKK307CisKK0F1ZGlvQ29lZkludGVycG9sYXRvciBBdWRpb1NoZWx2aW5nRmlsdGVyOjptSGlDb2VmSW50ZXJwKDIsIGtIaUluRGltcywgNSwgKGNvbnN0IGF1ZGlvX2NvZWZfdCopIGtIaUNvZWZUYWJsZSk7CitBdWRpb0NvZWZJbnRlcnBvbGF0b3IgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6bUxvQ29lZkludGVycCgyLCBrTG9JbkRpbXMsIDUsIChjb25zdCBhdWRpb19jb2VmX3QqKSBrTG9Db2VmVGFibGUpOworCitBdWRpb1NoZWx2aW5nRmlsdGVyOjpBdWRpb1NoZWx2aW5nRmlsdGVyKFNoZWxmVHlwZSB0eXBlLCBpbnQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSkKKyAgICAgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgICAgICBtQmlxdWFkKG5DaGFubmVscywgc2FtcGxlUmF0ZSkgIHsKKyAgICBjb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKK30KKwordm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpIHsKKyAgICBtTmlxdWlzdEZyZXEgPSBzYW1wbGVSYXRlICogNTAwOworICAgIG1GcmVxdWVuY3lGYWN0b3IgPSAoKDF1bGwpIDw8IDQyKSAvIG1OaXF1aXN0RnJlcTsKKyAgICBtQmlxdWFkLmNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIHNldEZyZXF1ZW5jeShtTm9taW5hbEZyZXF1ZW5jeSk7CisgICAgY29tbWl0KHRydWUpOworfQorCit2b2lkIEF1ZGlvU2hlbHZpbmdGaWx0ZXI6OnJlc2V0KCkgeworICAgIHNldEdhaW4oMCk7CisgICAgc2V0RnJlcXVlbmN5KG1UeXBlID09IGtMb3dTaGVsZiA/IDAgOiBtTmlxdWlzdEZyZXEpOworICAgIGNvbW1pdCh0cnVlKTsKK30KKwordm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpzZXRGcmVxdWVuY3kodWludDMyX3QgbWlsbGloZXJ0eikgeworICAgIG1Ob21pbmFsRnJlcXVlbmN5ID0gbWlsbGloZXJ0ejsKKyAgICBpZiAoVU5MSUtFTFkobWlsbGloZXJ0eiA+IG1OaXF1aXN0RnJlcSAvIDIpKSB7CisgICAgICAgIG1pbGxpaGVydHogPSBtTmlxdWlzdEZyZXEgLyAyOworICAgIH0KKyAgICB1aW50MzJfdCBub3JtRnJlcSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obWlsbGloZXJ0eikgKiBtRnJlcXVlbmN5RmFjdG9yKSA+PiAxMCk7CisgICAgdWludDMyX3QgbG9nMm1pbkZyZXEgPSAobVR5cGUgPT0ga0xvd1NoZWxmID8gKDMyLTEwKSA6ICgzMi0yKSk7CisgICAgaWYgKExJS0VMWShub3JtRnJlcSA+ICgxVSA8PCBsb2cybWluRnJlcSkpKSB7CisgICAgICAgIG1GcmVxdWVuY3kgPSAoRWZmZWN0c19sb2cyKG5vcm1GcmVxKSAtIChsb2cybWluRnJlcSA8PCAxNSkpIDw8IChGUkVRX1BSRUNJU0lPTl9CSVRTIC0gMTUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GcmVxdWVuY3kgPSAwOworICAgIH0KK30KKwordm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpzZXRHYWluKGludDMyX3QgbWlsbGliZWwpIHsKKyAgICBtR2FpbiA9IG1pbGxpYmVsICsgOTYwMDsKK30KKwordm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpjb21taXQoYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBhdWRpb19jb2VmX3QgY29lZnNbNV07CisgICAgaW50IGludENvb3JkWzJdID0geworICAgICAgICBtRnJlcXVlbmN5ID4+IEZSRVFfUFJFQ0lTSU9OX0JJVFMsCisgICAgICAgIG1HYWluID4+IEdBSU5fUFJFQ0lTSU9OX0JJVFMKKyAgICB9OworICAgIHVpbnQzMl90IGZyYWNDb29yZFsyXSA9IHsKKyAgICAgICAgbUZyZXF1ZW5jeSA8PCAoMzIgLSBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1HYWluKSA8PCAoMzIgLSBHQUlOX1BSRUNJU0lPTl9CSVRTKQorICAgIH07CisgICAgaWYgKG1UeXBlID09IGtIaWdoU2hlbGYpIHsKKyAgICAgICAgbUhpQ29lZkludGVycC5nZXRDb2VmKGludENvb3JkLCBmcmFjQ29vcmQsIGNvZWZzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTG9Db2VmSW50ZXJwLmdldENvZWYoaW50Q29vcmQsIGZyYWNDb29yZCwgY29lZnMpOworICAgIH0KKyAgICBtQmlxdWFkLnNldENvZWZzKGNvZWZzLCBpbW1lZGlhdGUpOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmQ3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuaApAQCAtMCwwICsxLDE0NiBAQAorLyogL2FuZHJvaWQvc3JjL2ZyYW1ld29ya3MvYmFzZS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1NoZWx2aW5nRmlsdGVyLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBVURJT19TSEVMVklOR19GSUxURVJfSAorI2RlZmluZSBBVURJT19TSEVMVklOR19GSUxURVJfSAorCisjaW5jbHVkZSAiQXVkaW9CaXF1YWRGaWx0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb0NvZWZJbnRlcnBvbGF0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBIHNoZWx2aW5nIGF1ZGlvIGZpbHRlciwgd2l0aCB1bml0eSBza2lydCBnYWluLCBhbmQgY29udHJvbGxhYmxlIGN1dG9mZgorLy8gZnJlcXVlbmN5IGFuZCBnYWluLgorLy8gVGhpcyBmaWx0ZXIgaXMgYWJsZSB0byBzdXBwcmVzcyBpbnRyb2R1Y2UgZGlzY29udGludWl0aWVzIGFuZCBvdGhlciBhcnRpZmFjdHMKKy8vIGluIHRoZSBvdXRwdXQsIGV2ZW4gd2hlbiBjaGFuZ2luZyBwYXJhbWV0ZXJzIGFicnVwdGx5LgorLy8gUGFyYW1ldGVycyBjYW4gYmUgc2V0IHRvIGFueSB2YWx1ZSAtIHRoaXMgY2xhc3Mgd2lsbCBtYWtlIHN1cmUgdG8gY2xpcCB0aGVtCisvLyB3aGVuIHRoZXkgYXJlIG91dCBvZiBzdXBwb3J0ZWQgcmFuZ2UuCisvLworLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6CisvLyBUaGlzIGNsYXNzIHVzZXMgYW4gdW5kZXJseWluZyBiaXF1YWQgZmlsdGVyIHdob3NlIHBhcmFtZXRlcnMgYXJlIGRldGVybWluZWQKKy8vIHVzaW5nIGEgbGluZWFyIGludGVycG9sYXRpb24gZnJvbSBhIGNvZWZmaWNpZW50IHRhYmxlLCB1c2luZyBhCisvLyBBdWRpb0NvZWZJbnRlcnBvbGF0b3IuCisvLyBBbGwgaXMgbGVmdCBmb3IgdGhpcyBjbGFzcyB0byBkbyBpcyBtYXBwaW5nIGJldHdlZW4gaGlnaC1sZXZlbCBwYXJhbWV0ZXJzIHRvCisvLyBmcmFjdGlvbmFsIGluZGljZXMgaW50byB0aGUgY29lZmZpY2llbnQgdGFibGUuCitjbGFzcyBBdWRpb1NoZWx2aW5nRmlsdGVyIHsKK3B1YmxpYzoKKyAgICAvLyBTaGVsZiB0eXBlCisgICAgZW51bSBTaGVsZlR5cGUgeworICAgICAgICBrTG93U2hlbGYsCisgICAgICAgIGtIaWdoU2hlbGYKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0b3IuIFJlc2V0cyB0aGUgZmlsdGVyIChzZWUgcmVzZXQoKSkuCisgICAgLy8gdHlwZSAgICAgICBUeXBlIG9mIHRoZSBmaWx0ZXIgKGhpZ2ggc2hlbGYgb3IgbG93IHNoZWxmKS4KKyAgICAvLyBuQ2hhbm5lbHMgIE51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMgKGludGVybGFjZWQpLgorICAgIC8vIHNhbXBsZVJhdGUgVGhlIGlucHV0L291dHB1dCBzYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgQXVkaW9TaGVsdmluZ0ZpbHRlcihTaGVsZlR5cGUgdHlwZSwgaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpOworCisgICAgLy8gUmVjb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIuIENoYW5nZXMgaW5wdXQvb3V0cHV0IGZvcm1hdCwgYnV0IGRvZXMgbm90CisgICAgLy8gYWx0ZXIgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWVzLiBDbGVhcnMgZGVsYXkgbGluZXMuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIHZvaWQgY29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlc2V0cyB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgLy8gZnJlcXVlbmN5OiAwCisgICAgLy8gZ2FpbjogMAorICAgIC8vIEl0IGFsc28gZGlzYWJsZXMgdGhlIGZpbHRlci4gRG9lcyBub3QgY2xlYXIgdGhlIGRlbGF5IGxpbmVzLgorICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIENsZWFycyBkZWxheSBsaW5lcy4gRG9lcyBub3QgYWx0ZXIgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICB2b2lkIGNsZWFyKCkgeyBtQmlxdWFkLmNsZWFyKCk7IH0KKworICAgIC8vIFNldHMgZ2FpbiB2YWx1ZS4gQWN0dWFsIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBwbGFjZSB1cG9uIGNvbW1pdCgpLgorICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSByZW1lbWJlcmVkIGV2ZW4gaWYgdGhlIGZpbHRlciBpcyBpbiBkaXNhYmxlZCgpIHN0YXRlLgorICAgIC8vIG1pbGxpYmVsIEdhaW4gdmFsdWUgaW4gbWlsbGliZWwgKDEvMTAwIG9mIGRlY2liZWwpLgorICAgIHZvaWQgc2V0R2FpbihpbnQzMl90IG1pbGxpYmVsKTsKKworICAgIC8vIEdldHMgdGhlIGdhaW4sIGluIG1pbGxpYmVsLCBhcyBzZXQuCisgICAgaW50MzJfdCBnZXRHYWluKCkgY29uc3QgeyByZXR1cm4gbUdhaW4gLSA5NjAwOyB9CisKKyAgICAvLyBTZXRzIGN1dG9mZiBmcmVxdWVuY3kgdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbgorICAgIC8vIGNvbW1pdCgpLgorICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSByZW1lbWJlcmVkIGV2ZW4gaWYgdGhlIGZpbHRlciBpcyBpbiBkaXNhYmxlZCgpIHN0YXRlLgorICAgIC8vIG1pbGxpaGVydHogRnJlcXVlbmN5IHZhbHVlIGluIG1Iei4KKyAgICB2b2lkIHNldEZyZXF1ZW5jeSh1aW50MzJfdCBtaWxsaWhlcnR6KTsKKworICAgIC8vIEdldHMgdGhlIGZyZXF1ZW5jeSwgaW4gbUh6LCBhcyBzZXQuCisgICAgdWludDMyX3QgZ2V0RnJlcXVlbmN5KCkgY29uc3QgeyByZXR1cm4gbU5vbWluYWxGcmVxdWVuY3k7IH0KKworICAgIC8vIEFwcGxpZXMgYWxsIHBhcmFtZXRlciBjaGFuZ2VzIGRvbmUgdG8gdGhpcyBwb2ludCBpbiB0aW1lLgorICAgIC8vIElmIHRoZSBmaWx0ZXIgaXMgZGlzYWJsZWQsIHRoZSBuZXcgcGFyYW1ldGVycyB3aWxsIHRha2UgcGxhY2Ugd2hlbiBpdCBpcworICAgIC8vIGVuYWJsZWQgYWdhaW4uIERvZXMgbm90IGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseSAoaWdub3JlZCBpZiBmaWx0ZXIgaXMKKyAgICAvLyBkaXNhYmxlZCkuCisgICB2b2lkIGNvbW1pdChib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIFByb2Nlc3MgYSBidWZmZXIgb2YgaW5wdXQgZGF0YS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgc2hvdWxkIGNvbnRhaW4KKyAgICAvLyBmcmFtZUNvdW50ICogbkNoYW5uZWxzIGludGVybGFjZWQgc2FtcGxlcy4gUHJvY2Vzc2luZyBjYW4gYmUgZG9uZQorICAgIC8vIGluLXBsYWNlLCBieSBwYXNzaW5nIHRoZSBzYW1lIGJ1ZmZlciBhcyBib3RoIGFyZ3VtZW50cy4KKyAgICAvLyBpbiAgIElucHV0IGJ1ZmZlci4KKyAgICAvLyBvdXQgIE91dHB1dCBidWZmZXIuCisgICAvLyBmcmFtZUNvdW50ICAgTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9kdWNlLgorICAgdm9pZCBwcm9jZXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90IGluW10sIGF1ZGlvX3NhbXBsZV90IG91dFtdLAorICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeyBtQmlxdWFkLnByb2Nlc3MoaW4sIG91dCwgZnJhbWVDb3VudCk7IH0KKworICAgIC8vIEVuYWJsZXMgdGhlIGZpbHRlciwgc28gaXQgd291bGQgc3RhcnQgcHJvY2Vzc2luZyBpbnB1dC4gRG9lcyBub3QKKyAgICAvLyBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MgaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkuCisgICAgdm9pZCBlbmFibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSkgeyBtQmlxdWFkLmVuYWJsZShpbW1lZGlhdGUpOyB9CisKKyAgICAvLyBEaXNhYmxlZCAoYnlwYXNzZXMpIHRoZSBmaWx0ZXIuIERvZXMgbm90IGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcworICAgIC8vIGltbWVkaWF0ZSBpcyBzZXQuCisgICAgLy8gaW1tZWRpYXRlICAgIFdoZXRoZXIgdG8gYXBwbHkgY2hhbmdlIGFicnVwdGx5LgorICAgIHZvaWQgZGlzYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKSB7IG1CaXF1YWQuZGlzYWJsZShpbW1lZGlhdGUpOyB9CisKK3ByaXZhdGU6CisgICAgLy8gUHJlY2lzaW9uIGZvciB0aGUgbUZyZXF1ZW5jeSBtZW1iZXIuCisgICAgc3RhdGljIGNvbnN0IGludCBGUkVRX1BSRUNJU0lPTl9CSVRTID0gMjY7CisgICAgLy8gUHJlY2lzaW9uIGZvciB0aGUgbUdhaW4gbWVtYmVyLgorICAgIHN0YXRpYyBjb25zdCBpbnQgR0FJTl9QUkVDSVNJT05fQklUUyA9IDEwOworCisgICAgLy8gU2hlbGYgdHlwZS4KKyAgICBTaGVsZlR5cGUgbVR5cGU7CisgICAgLy8gTnlxdWlzdCwgaW4gbUh6LgorICAgIHVpbnQzMl90IG1OaXF1aXN0RnJlcTsKKyAgICAvLyBGcmFjdGlvbmFsIGluZGV4IGludG8gdGhlIGdhaW4gZGltZW5zaW9uIG9mIHRoZSBjb2VmIHRhYmxlIGluCisgICAgLy8gR0FJTl9QUkVDSVNJT05fQklUUyBwcmVjaXNpb24uCisgICAgaW50MzJfdCBtR2FpbjsKKyAgICAvLyBGcmFjdGlvbmFsIGluZGV4IGludG8gdGhlIGZyZXF1ZW5jeSBkaW1lbnNpb24gb2YgdGhlIGNvZWYgdGFibGUgaW4KKyAgICAvLyBGUkVRX1BSRUNJU0lPTl9CSVRTIHByZWNpc2lvbi4KKyAgICB1aW50MzJfdCBtRnJlcXVlbmN5OworICAgIC8vIE5vbWluYWwgdmFsdWUgb2YgZnJlcXVlbmN5LCBhcyBzZXQuCisgICAgdWludDMyX3QgbU5vbWluYWxGcmVxdWVuY3k7CisgICAvLyAxL055cXVpc3RbbUh6XSwgaW4gNDItYml0IHByZWNpc2lvbiAodmVyeSBzbWFsbCkuCisgICAgLy8gVXNlZCBmb3Igc2NhbGluZyB0aGUgZnJlcXVlbmN5LgorICAgIHVpbnQzMl90IG1GcmVxdWVuY3lGYWN0b3I7CisKKyAgICAvLyBBIGJpcXVhZCBmaWx0ZXIsIHVzZWQgZm9yIHRoZSBhY3R1YWwgcHJvY2Vzc2luZy4KKyAgICBBdWRpb0JpcXVhZEZpbHRlciBtQmlxdWFkOworICAgIC8vIEEgY29lZmZpY2llbnQgaW50ZXJwb2xhdG9yLCB1c2VkIGZvciBtYXBwaW5nIHRoZSBoaWdoIGxldmVsIHBhcmFtZXRlcnMgdG8KKyAgICAvLyB0aGUgbG93LWxldmVsIGJpcXVhZCBjb2VmZmljaWVudHMuIFRoaXMgb25lIGlzIHVzZWQgZm9yIHRoZSBoaWdoIHNoZWxmLgorICAgIHN0YXRpYyBBdWRpb0NvZWZJbnRlcnBvbGF0b3IgbUhpQ29lZkludGVycDsKKyAgICAvLyBBIGNvZWZmaWNpZW50IGludGVycG9sYXRvciwgdXNlZCBmb3IgbWFwcGluZyB0aGUgaGlnaCBsZXZlbCBwYXJhbWV0ZXJzIHRvCisgICAgLy8gdGhlIGxvdy1sZXZlbCBiaXF1YWQgY29lZmZpY2llbnRzLiBUaGlzIG9uZSBpcyB1c2VkIGZvciB0aGUgbG93IHNoZWxmLgorICAgIHN0YXRpYyBBdWRpb0NvZWZJbnRlcnBvbGF0b3IgbUxvQ29lZkludGVycDsKK307CisKK30KKworCisjZW5kaWYgLy8gQVVESU9fU0hFTFZJTkdfRklMVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU0MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFcXVhbGl6ZXIiCisjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgYXJyYXkgLyBzaXplb2YgYXJyYXlbMF0pCisvLworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgIkF1ZGlvRXF1YWxpemVyLmgiCisjaW5jbHVkZSAiQXVkaW9CaXF1YWRGaWx0ZXIuaCIKKyNpbmNsdWRlICJBdWRpb0Zvcm1hdEFkYXB0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaD4KKworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdFcXVhbGl6ZXJJbnRlcmZhY2U7CisKK2VudW0gZXF1YWxpemVyX3N0YXRlX2UgeworICAgIEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVELAorICAgIEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBFUVVBTElaRVJfU1RBVEVfQUNUSVZFLAorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHsKKworLy8gR29vZ2xlIEdyYXBoaWMgRXF1YWxpemVyIFVVSUQ6IGUyNWFhODQwLTU0M2ItMTFkZi05OGE1LTAwMDJhNWQ1YzUxYgorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnRXF1YWxpemVyRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4MGJlZDQzMDAsIDB4ZGRkNiwgMHgxMWRiLCAweDhmMzQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHR5cGUKKyAgICAgICAgezB4ZTI1YWE4NDAsIDB4NTQzYiwgMHgxMWRmLCAweDk4YTUsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCksCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMSwKKyAgICAgICAgIkdyYXBoaWMgRXF1YWxpemVyIiwKKyAgICAgICAgIkdvb2dsZSBJbmMuIiwKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8gQkVHSU4gRVEgUFJFU0VUUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitjb25zdCBpbnQga051bUJhbmRzID0gNTsKK2NvbnN0IHVpbnQzMl90IGdGcmVxc1trTnVtQmFuZHNdID0gICAgICB7IDUwMDAwLCAxMjUwMDAsIDkwMDAwMCwgMzIwMDAwMCwgNjMwMDAwMCB9OworY29uc3QgdWludDMyX3QgZ0JhbmR3aWR0aHNba051bUJhbmRzXSA9IHsgMCwgICAgIDM2MDAsICAgMzYwMCwgICAyNDAwLCAgICAwICAgICAgIH07CisKK2NvbnN0IEF1ZGlvRXF1YWxpemVyOjpCYW5kQ29uZmlnIGdCYW5kc0NsYXNzaWNba051bUJhbmRzXSA9IHsKKyAgICB7IDMwMCwgIGdGcmVxc1swXSwgZ0JhbmR3aWR0aHNbMF0gfSwKKyAgICB7IDQwMCwgIGdGcmVxc1sxXSwgZ0JhbmR3aWR0aHNbMV0gfSwKKyAgICB7IDAsICAgIGdGcmVxc1syXSwgZ0JhbmR3aWR0aHNbMl0gfSwKKyAgICB7IDIwMCwgIGdGcmVxc1szXSwgZ0JhbmR3aWR0aHNbM10gfSwKKyAgICB7IC0zMDAsIGdGcmVxc1s0XSwgZ0JhbmR3aWR0aHNbNF0gfQorfTsKKworY29uc3QgQXVkaW9FcXVhbGl6ZXI6OkJhbmRDb25maWcgZ0JhbmRzSmF6eltrTnVtQmFuZHNdID0geworICAgIHsgLTYwMCwgZ0ZyZXFzWzBdLCBnQmFuZHdpZHRoc1swXSB9LAorICAgIHsgMjAwLCAgZ0ZyZXFzWzFdLCBnQmFuZHdpZHRoc1sxXSB9LAorICAgIHsgNDAwLCAgZ0ZyZXFzWzJdLCBnQmFuZHdpZHRoc1syXSB9LAorICAgIHsgLTQwMCwgZ0ZyZXFzWzNdLCBnQmFuZHdpZHRoc1szXSB9LAorICAgIHsgLTYwMCwgZ0ZyZXFzWzRdLCBnQmFuZHdpZHRoc1s0XSB9Cit9OworCitjb25zdCBBdWRpb0VxdWFsaXplcjo6QmFuZENvbmZpZyBnQmFuZHNQb3Bba051bUJhbmRzXSA9IHsKKyAgICB7IDQwMCwgIGdGcmVxc1swXSwgZ0JhbmR3aWR0aHNbMF0gfSwKKyAgICB7IC00MDAsIGdGcmVxc1sxXSwgZ0JhbmR3aWR0aHNbMV0gfSwKKyAgICB7IDMwMCwgIGdGcmVxc1syXSwgZ0JhbmR3aWR0aHNbMl0gfSwKKyAgICB7IC00MDAsIGdGcmVxc1szXSwgZ0JhbmR3aWR0aHNbM10gfSwKKyAgICB7IDYwMCwgIGdGcmVxc1s0XSwgZ0JhbmR3aWR0aHNbNF0gfQorfTsKKworY29uc3QgQXVkaW9FcXVhbGl6ZXI6OkJhbmRDb25maWcgZ0JhbmRzUm9ja1trTnVtQmFuZHNdID0geworICAgIHsgNzAwLCAgZ0ZyZXFzWzBdLCBnQmFuZHdpZHRoc1swXSB9LAorICAgIHsgNDAwLCAgZ0ZyZXFzWzFdLCBnQmFuZHdpZHRoc1sxXSB9LAorICAgIHsgLTQwMCwgZ0ZyZXFzWzJdLCBnQmFuZHdpZHRoc1syXSB9LAorICAgIHsgNDAwLCAgZ0ZyZXFzWzNdLCBnQmFuZHdpZHRoc1szXSB9LAorICAgIHsgMjAwLCAgZ0ZyZXFzWzRdLCBnQmFuZHdpZHRoc1s0XSB9Cit9OworCitjb25zdCBBdWRpb0VxdWFsaXplcjo6UHJlc2V0Q29uZmlnIGdFcXVhbGl6ZXJQcmVzZXRzW10gPSB7CisgICAgeyAiQ2xhc3NpYyIsIGdCYW5kc0NsYXNzaWMgfSwKKyAgICB7ICJKYXp6IiwgICAgZ0JhbmRzSmF6eiAgICB9LAorICAgIHsgIlBvcCIsICAgICBnQmFuZHNQb3AgICAgIH0sCisgICAgeyAiUm9jayIsICAgIGdCYW5kc1JvY2sgICAgfQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLyBFTkQgRVEgUFJFU0VUUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmZmVyU2l6ZSA9IDMyOworCit0eXBlZGVmIEF1ZGlvRm9ybWF0QWRhcHRlcjxBdWRpb0VxdWFsaXplciwga0J1ZmZlclNpemU+IEZvcm1hdEFkYXB0ZXI7CisKK3N0cnVjdCBFcXVhbGl6ZXJDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgRm9ybWF0QWRhcHRlciBhZGFwdGVyOworICAgIEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplcjsKKyAgICB1aW50MzJfdCBzdGF0ZTsKK307CisKKy8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKworaW50IEVxdWFsaXplcl9pbml0KEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0KTsKK2ludCBFcXVhbGl6ZXJfY29uZmlndXJlKEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOworaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOworCisKKy8vCisvLy0tLSBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICAqcE51bUVmZmVjdHMgPSAxOworICAgIHJldHVybiAwOworfSAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnRXF1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIEVmZmVjdFF1ZXJ5TmV4dCAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKSB7CisgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKworICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCBzdGFydCIpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0VxdWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0ID0gbmV3IEVxdWFsaXplckNvbnRleHQ7CisKKyAgICBwQ29udGV4dC0+aXRmZSA9ICZnRXF1YWxpemVySW50ZXJmYWNlOworICAgIHBDb250ZXh0LT5wRXF1YWxpemVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIHJldCA9IEVxdWFsaXplcl9pbml0KHBDb250ZXh0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dXKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QoKSBpbml0IGZhaWxlZCIpOworICAgICAgICBkZWxldGUgcENvbnRleHQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKKworICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCwgc2l6ZSAlZCIsIHBDb250ZXh0LCBBdWRpb0VxdWFsaXplcjo6R2V0SW5zdGFuY2VTaXplKGtOdW1CYW5kcykrc2l6ZW9mKEVxdWFsaXplckNvbnRleHQpKTsKKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7CisgICAgRXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKEVxdWFsaXplckNvbnRleHQgKilpbnRlcmZhY2U7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaW50ZXJmYWNlKTsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBwQ29udGV4dC0+cEVxdWFsaXplci0+ZnJlZSgpOworICAgIGRlbGV0ZSBwQ29udGV4dDsKKworICAgIHJldHVybiAwOworfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLworCisKKy8vCisvLy0tLSBsb2NhbCBmdW5jdGlvbnMKKy8vCisKKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0dWKCJJbnZhbGlkIGFyZ3VtZW50OiAiI2NvbmQpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9jb25maWd1cmUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwQ29uZmlnOiAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgaG9sZGluZyBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFcXVhbGl6ZXJfY29uZmlndXJlKEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCit7CisgICAgTE9HVigiRXF1YWxpemVyX2NvbmZpZ3VyZSBzdGFydCIpOworCisgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOworICAgIENIRUNLX0FSRyhwQ29uZmlnICE9IE5VTEwpOworCisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOworICAgIENIRUNLX0FSRygocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9NT05PKSB8fCAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TN18yNAorICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKworICAgIGludCBjaGFubmVsQ291bnQ7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgeworICAgICAgICBjaGFubmVsQ291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYW5uZWxDb3VudCA9IDI7CisgICAgfQorICAgIENIRUNLX0FSRyhjaGFubmVsQ291bnQgPD0gQXVkaW9CaXF1YWRGaWx0ZXI6Ok1BWF9DSEFOTkVMUyk7CisKKyAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworICAgIHBDb250ZXh0LT5wRXF1YWxpemVyLT5jb25maWd1cmUoY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOworCisgICAgcENvbnRleHQtPmFkYXB0ZXIuY29uZmlndXJlKCpwQ29udGV4dC0+cEVxdWFsaXplciwgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUpOworCisgICAgcmV0dXJuIDA7Cit9ICAgLy8gZW5kIEVxdWFsaXplcl9jb25maWd1cmUKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIGNyZWF0ZXMKKy8vICAgICBBdWRpb0VxdWFsaXplciBpbnN0YW5jZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEVxdWFsaXplcl9pbml0KEVxdWFsaXplckNvbnRleHQgKnBDb250ZXh0KQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBMT0dWKCJFcXVhbGl6ZXJfaW5pdCBzdGFydCIpOworCisgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOworCisgICAgaWYgKHBDb250ZXh0LT5wRXF1YWxpemVyICE9IE5VTEwpIHsKKyAgICAgICAgcENvbnRleHQtPnBFcXVhbGl6ZXItPmZyZWUoKTsKKyAgICB9CisKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgcENvbnRleHQtPnBFcXVhbGl6ZXIgPSBBdWRpb0VxdWFsaXplcjo6Q3JlYXRlSW5zdGFuY2UoCisgICAgICAgIE5VTEwsCisgICAgICAgIGtOdW1CYW5kcywKKyAgICAgICAgQXVkaW9CaXF1YWRGaWx0ZXI6Ok1BWF9DSEFOTkVMUywKKyAgICAgICAgNDQxMDAsCisgICAgICAgIGdFcXVhbGl6ZXJQcmVzZXRzLAorICAgICAgICBBUlJBWV9TSVpFKGdFcXVhbGl6ZXJQcmVzZXRzKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1CYW5kczsgKytpKSB7CisgICAgICAgIHBDb250ZXh0LT5wRXF1YWxpemVyLT5zZXRGcmVxdWVuY3koaSwgZ0ZyZXFzW2ldKTsKKyAgICAgICAgcENvbnRleHQtPnBFcXVhbGl6ZXItPnNldEJhbmR3aWR0aChpLCBnQmFuZHdpZHRoc1tpXSk7CisgICAgfQorCisgICAgcENvbnRleHQtPnBFcXVhbGl6ZXItPmVuYWJsZSh0cnVlKTsKKworICAgIEVxdWFsaXplcl9jb25maWd1cmUocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKKworICAgIHJldHVybiAwOworfSAgIC8vIGVuZCBFcXVhbGl6ZXJfaW5pdAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyX2dldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgYSBFcXVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBFcXVhbGl6ZXIgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgc2l6ZV90ICpwVmFsdWVTaXplLCB2b2lkICpwVmFsdWUpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKKyAgICBpbnQzMl90IHBhcmFtMjsKKyAgICBjaGFyICpuYW1lOworCisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRVFfUEFSQU1fTlVNX0JBTkRTOgorICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDoKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0U6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOgorICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgKDIgKyBrTnVtQmFuZHMpICogc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAoMiArIGtOdW1CYW5kcykgKiBzaXplb2YodWludDE2X3QpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClrTnVtQmFuZHM7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9OVU1fQkFORFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IC05NjAwOworICAgICAgICAqKChpbnQxNl90ICopcFZhbHVlICsgMSkgPSA0ODAwOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLCAqKGludDMyX3QgKilwVmFsdWUsICooKGludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOworICAgICAgICBpZiAocGFyYW0yID49IGtOdW1CYW5kcykgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IChpbnQxNl90KXBFcXVhbGl6ZXItPmdldEdhaW4ocGFyYW0yKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbTsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBrTnVtQmFuZHMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBwRXF1YWxpemVyLT5nZXRGcmVxdWVuY3kocGFyYW0yKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbTsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBrTnVtQmFuZHMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwRXF1YWxpemVyLT5nZXRCYW5kUmFuZ2UocGFyYW0yLCAqKHVpbnQzMl90ICopcFZhbHVlLCAqKCh1aW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpcEVxdWFsaXplci0+Z2V0TW9zdFJlbGV2YW50QmFuZChwYXJhbTIpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX0JBTkQgZnJlcXVlbmN5ICVkLCBiYW5kICVkIiwgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClwRXF1YWxpemVyLT5nZXRQcmVzZXQoKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTOgorICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KXBFcXVhbGl6ZXItPmdldE51bVByZXNldHMoKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyAlZCIsICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgIGlmIChwYXJhbTIgPj0gcEVxdWFsaXplci0+Z2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IChjaGFyICopcFZhbHVlOworICAgICAgICBzdHJuY3B5KG5hbWUsIHBFcXVhbGl6ZXItPmdldFByZXNldE5hbWUocGFyYW0yKSwgKnBWYWx1ZVNpemUgLSAxKTsKKyAgICAgICAgbmFtZVsqcFZhbHVlU2l6ZSAtIDFdID0gMDsKKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLCBwYXJhbTIsIGdFcXVhbGl6ZXJQcmVzZXRzW3BhcmFtMl0ubmFtZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogeworICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9QUk9QRVJUSUVTIik7CisgICAgICAgIHBbMF0gPSAoaW50MTZfdClwRXF1YWxpemVyLT5nZXRQcmVzZXQoKTsKKyAgICAgICAgcFsxXSA9IChpbnQxNl90KWtOdW1CYW5kczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgcFsyICsgaV0gPSAoaW50MTZfdClwRXF1YWxpemVyLT5nZXRHYWluKGkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyBlbmQgRXF1YWxpemVyX2dldFBhcmFtZXRlcgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyX3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBFcXVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBFcXVhbGl6ZXIgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlciAoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90IHByZXNldDsKKyAgICBpbnQzMl90IGJhbmQ7CisgICAgaW50MzJfdCBsZXZlbDsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbSsrOworCisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgorICAgICAgICBwcmVzZXQgPSAoaW50MzJfdCkoKih1aW50MTZfdCAqKXBWYWx1ZSk7CisKKyAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsIHByZXNldCk7CisgICAgICAgIGlmIChwcmVzZXQgPCAwIHx8IHByZXNldCA+PSBwRXF1YWxpemVyLT5nZXROdW1QcmVzZXRzKCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwRXF1YWxpemVyLT5zZXRQcmVzZXQocHJlc2V0KTsKKyAgICAgICAgcEVxdWFsaXplci0+Y29tbWl0KHRydWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgICAgIGJhbmQgPSAgKnBQYXJhbTsKKyAgICAgICAgbGV2ZWwgPSAoaW50MzJfdCkoKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgaWYgKGJhbmQgPj0ga051bUJhbmRzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcEVxdWFsaXplci0+c2V0R2FpbihiYW5kLCBsZXZlbCk7CisgICAgICAgIHBFcXVhbGl6ZXItPmNvbW1pdCh0cnVlKTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fUFJPUEVSVElFUyIpOworICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgIGlmICgoaW50KXBbMF0gPj0gcEVxdWFsaXplci0+Z2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBbMF0gPj0gMCkgeworICAgICAgICAgICAgcEVxdWFsaXplci0+c2V0UHJlc2V0KChpbnQpcFswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKGludClwWzFdICE9IGtOdW1CYW5kcykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcEVxdWFsaXplci0+c2V0R2FpbihpLCAoaW50MzJfdClwWzIgKyBpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcEVxdWFsaXplci0+Y29tbWl0KHRydWUpOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigic2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gZW5kIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIKKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlCisKKworLy8KKy8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8KKworZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKK3sKKyAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgcENvbnRleHQtPmFkYXB0ZXIucHJvY2VzcyhpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKKworICAgIHJldHVybiAwOworfSAgIC8vIGVuZCBFcXVhbGl6ZXJfcHJvY2VzcworCitleHRlcm4gIkMiIGludCBFcXVhbGl6ZXJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKworICAgIGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICopIHNlbGY7CisgICAgaW50IHJldHNpemU7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+c3RhdGUgPT0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgYW5kcm9pZDo6QXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyID0gcENvbnRleHQtPnBFcXVhbGl6ZXI7CisKKyAgICBMT0dWKCJFcXVhbGl6ZXJfY29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworCisgICAgc3dpdGNoIChjbWRDb2RlKSB7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IEVxdWFsaXplcl9pbml0KHBDb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRToKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQorICAgICAgICAgICAgICAgIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gRXF1YWxpemVyX2NvbmZpZ3VyZShwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopIHBDbWREYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgorICAgICAgICBFcXVhbGl6ZXJfY29uZmlndXJlKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwRXF1YWxpemVyLCAoaW50MzJfdCAqKXAtPmRhdGEsICZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICUwOHggJTA4eCIsCisgICAgICAgICAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpLAorICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHNpemVvZihpbnQzMl90KSkpOworCisgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTogeworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhICVwIiwgY21kU2l6ZSwgcENtZERhdGEsICpyZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVxdWFsaXplcl9zZXRQYXJhbWV0ZXIocEVxdWFsaXplciwgKGludDMyX3QgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPnN0YXRlICE9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX0FDVElWRTsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPnN0YXRlICE9IEVRVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9ESVNBQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJFcXVhbGl6ZXJfY29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJWQiLGNtZENvZGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnRXF1YWxpemVySW50ZXJmYWNlID0geworICAgICAgICBFcXVhbGl6ZXJfcHJvY2VzcywKKyAgICAgICAgRXF1YWxpemVyX2NvbW1hbmQKK307CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViOGIyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKQEAgLTAsMCArMSwyMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RSZXZlcmIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKKyNpbmNsdWRlICJFZmZlY3RzTWF0aC5oIgorCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2UgPSB7CisgICAgICAgIFJldmVyYl9Qcm9jZXNzLAorICAgICAgICBSZXZlcmJfQ29tbWFuZAorfTsKKworLy8gR29vZ2xlIGF1eGlsaWFyeSBlbnZpcm9ubWVudGFsIHJldmVyYiBVVUlEOiAxZjBhZTJlMC00ZWY3LTExZGYtYmMwOS0wMDAyYTVkNWM1MWIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yID0geworICAgICAgICB7MHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgezB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWV9fSwKKyAgICAgICAgezB4MWYwYWUyZTAsIDB4NGVmNywgMHgxMWRmLCAweGJjMDksIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgLy8gZmxhZ3Mgb3RoZXIgdGhhbiBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSBzZXQgZm9yIHRlc3QgcHVycG9zZQorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAzMywKKyAgICAgICAgIkF1eCBFbnZpcm9ubWVudGFsIFJldmVyYiIsCisgICAgICAgICJHb29nbGUgSW5jLiIKK307CisKKy8vIEdvb2dsZSBpbnNlcnQgZW52aXJvbm1lbnRhbCByZXZlcmIgVVVJRDogYWE0NzYwNDAtNjM0Mi0xMWRmLTkxYTQtMDAwMmE1ZDVjNTFiCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCisgICAgICAgIHsweGFhNDc2MDQwLCAweDYzNDIsIDB4MTFkZiwgMHg5MWE0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNULAorICAgICAgICAwLCAvLyBUT0RPCisgICAgICAgIDMzLAorICAgICAgICAiSW5zZXJ0IEVudmlyb25tZW50YWwgcmV2ZXJiIiwKKyAgICAgICAgIkdvb2dsZSBJbmMuIgorfTsKKworLy8gR29vZ2xlIGF1eGlsaWFyeSBwcmVzZXQgcmV2ZXJiIFVVSUQ6IDYzOTA5MzIwLTUzYTYtMTFkZi1iZGJkLTAwMDJhNWQ1YzUxYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHg2MzkwOTMyMCwgMHg1M2E2LCAweDExZGYsIDB4YmRiZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAzMywKKyAgICAgICAgIkF1eCBQcmVzZXQgUmV2ZXJiIiwKKyAgICAgICAgIkdvb2dsZSBJbmMuIgorfTsKKworLy8gR29vZ2xlIGluc2VydCBwcmVzZXQgcmV2ZXJiIFVVSUQ6IGQ5M2RjNmEwLTYzNDItMTFkZi1iMTI4LTAwMDJhNWQ1YzUxYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHhkOTNkYzZhMCwgMHg2MzQyLCAweDExZGYsIDB4YjEyOCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAzMywKKyAgICAgICAgIkluc2VydCBQcmVzZXQgUmV2ZXJiIiwKKyAgICAgICAgIkdvb2dsZSBJbmMuIgorfTsKKworLy8gZ0Rlc2NyaXB0b3JzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbCBkZWZpbmVkIGVmZmVjdCBkZXNjcmlwdG9yIGluIHRoaXMgbGlicmFyeQorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKKyAgICAgICAgJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yLAorICAgICAgICAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IsCisgICAgICAgICZnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdCBBUEkgaW1wbGVtZW50YXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLSBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KKworaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICAqcE51bUVmZmVjdHMgPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOworICAgIHJldHVybiAwOworfQorCitpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChpbmRleCA+PSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpbmRleF0sCisgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIHJldHVybiAwOworfQorCitpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgIGludCByZXQ7CisgICAgaW50IGk7CisgICAgcmV2ZXJiX21vZHVsZV90ICptb2R1bGU7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKyAgICBpbnQgYXV4ID0gMDsKKyAgICBpbnQgcHJlc2V0ID0gMDsKKworICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCBzdGFydCIpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgZ0Rlc2NyaXB0b3JzW2ldICE9IE5VTEw7IGkrKykgeworICAgICAgICBkZXNjID0gZ0Rlc2NyaXB0b3JzW2ldOworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZkZXNjLT51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpCisgICAgICAgICAgICAgICAgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ0Rlc2NyaXB0b3JzW2ldID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgbW9kdWxlID0gbWFsbG9jKHNpemVvZihyZXZlcmJfbW9kdWxlX3QpKTsKKworICAgIG1vZHVsZS0+aXRmZSA9ICZnUmV2ZXJiSW50ZXJmYWNlOworCisgICAgbW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEOworCisgICAgaWYgKG1lbWNtcCgmZGVzYy0+dHlwZSwgU0xfSUlEX1BSRVNFVFJFVkVSQiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgIHByZXNldCA9IDE7CisgICAgfQorICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgIGF1eCA9IDE7CisgICAgfQorICAgIHJldCA9IFJldmVyYl9Jbml0KG1vZHVsZSwgYXV4LCBwcmVzZXQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIExPR1coIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCgpIGluaXQgZmFpbGVkIik7CisgICAgICAgIGZyZWUobW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpIG1vZHVsZTsKKworICAgIG1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAgLHNpemUgJWQiLCBtb2R1bGUsIHNpemVvZihyZXZlcmJfbW9kdWxlX3QpKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7CisgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKWludGVyZmFjZTsKKworICAgIExPR1YoIkVmZmVjdExpYlJlbGVhc2VFZmZlY3QgJXAiLCBpbnRlcmZhY2UpOworICAgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEOworCisgICAgZnJlZShwUnZiTW9kdWxlKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KKworc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CisgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiOworICAgIGludDE2X3QgKnBTcmMsICpwRHN0OworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKilzZWxmOworCisgICAgaWYgKHBSdmJNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcFJldmVyYiA9IChyZXZlcmJfb2JqZWN0X3QqKSAmcFJ2Yk1vZHVsZS0+Y29udGV4dDsKKworICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICAvL2lmIGJ5cGFzc2VkIG9yIHRoZSBwcmVzZXQgZm9yY2VzIHRoZSBzaWduYWwgdG8gYmUgY29tcGxldGVseSBkcnkKKyAgICBpZiAocFJldmVyYi0+bV9iQnlwYXNzICE9IDApIHsKKyAgICAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyAgICAgICAgICAgIGludDE2X3Qgc21wOworICAgICAgICAgICAgcFNyYyA9IGluQnVmZmVyLT5zMTY7CisgICAgICAgICAgICBwRHN0ID0gb3V0QnVmZmVyLT5zMTY7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscykgeworICAgICAgICAgICAgICAgIGNvdW50ICo9IDI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3QrKyA9ICpwU3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgICAgICAgICAgICBzbXAgPSAqcFNyYysrOworICAgICAgICAgICAgICAgICAgICAqcERzdCsrID0gc21wOworICAgICAgICAgICAgICAgICAgICAqcERzdCsrID0gc21wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocFJldmVyYi0+bV9uTmV4dFJvb20gIT0gcFJldmVyYi0+bV9uQ3VycmVudFJvb20pIHsKKyAgICAgICAgUmV2ZXJiVXBkYXRlUm9vbShwUmV2ZXJiLCB0cnVlKTsKKyAgICB9CisKKyAgICBwU3JjID0gaW5CdWZmZXItPnMxNjsKKyAgICBwRHN0ID0gb3V0QnVmZmVyLT5zMTY7CisgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgd2hpbGUgKG51bVNhbXBsZXMpIHsKKyAgICAgICAgdWludDMyX3QgcHJvY2Vzc2VkU2FtcGxlczsKKyAgICAgICAgaWYgKG51bVNhbXBsZXMgPiAodWludDMyX3QpIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlcykgeworICAgICAgICAgICAgcHJvY2Vzc2VkU2FtcGxlcyA9ICh1aW50MzJfdCkgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5TYW1wbGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvY2Vzc2VkU2FtcGxlcyA9IG51bVNhbXBsZXM7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbmNyZW1lbnQgdXBkYXRlIGNvdW50ZXIgKi8KKyAgICAgICAgcFJldmVyYi0+bV9uVXBkYXRlQ291bnRlciArPSAoaW50MTZfdCkgcHJvY2Vzc2VkU2FtcGxlczsKKyAgICAgICAgLyogY2hlY2sgaWYgdXBkYXRlIGNvdW50ZXIgbmVlZHMgdG8gYmUgcmVzZXQgKi8KKyAgICAgICAgaWYgKHBSZXZlcmItPm1fblVwZGF0ZUNvdW50ZXIgPj0gcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5TYW1wbGVzKSB7CisgICAgICAgICAgICAvKiB1cGRhdGUgaW50ZXJ2YWwgaGFzIGVsYXBzZWQsIHNvIHJlc2V0IGNvdW50ZXIgKi8KKyAgICAgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZUNvdW50ZXIgLT0gcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5TYW1wbGVzOworICAgICAgICAgICAgUmV2ZXJiVXBkYXRlWGZhZGUocFJldmVyYiwgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5TYW1wbGVzKTsKKworICAgICAgICB9IC8qIGVuZCBpZiBtX25VcGRhdGVDb3VudGVyID49IHVwZGF0ZSBpbnRlcnZhbCAqLworCisgICAgICAgIFJldmVyYihwUmV2ZXJiLCBwcm9jZXNzZWRTYW1wbGVzLCBwRHN0LCBwU3JjKTsKKworICAgICAgICBudW1TYW1wbGVzIC09IHByb2Nlc3NlZFNhbXBsZXM7CisgICAgICAgIGlmIChwUmV2ZXJiLT5tX0F1eCkgeworICAgICAgICAgICAgcFNyYyArPSBwcm9jZXNzZWRTYW1wbGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNyYyArPSBwcm9jZXNzZWRTYW1wbGVzICogTlVNX09VVFBVVF9DSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBwRHN0ICs9IHByb2Nlc3NlZFNhbXBsZXMgKiBOVU1fT1VUUFVUX0NIQU5ORUxTOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgUmV2ZXJiX0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKSBzZWxmOworICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKKyAgICBpbnQgcmV0c2l6ZTsKKworICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBSZXZlcmIgPSAocmV2ZXJiX29iamVjdF90KikgJnBSdmJNb2R1bGUtPmNvbnRleHQ7CisKKyAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworCisgICAgc3dpdGNoIChjbWRDb2RlKSB7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFJldmVyYl9Jbml0KHBSdmJNb2R1bGUsIHBSZXZlcmItPm1fQXV4LCBwUmV2ZXJiLT5tX1ByZXNldCk7CisgICAgICAgIGlmICgqKGludCAqKSBwUmVwbHlEYXRhID09IDApIHsKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKKyAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFJldmVyYl9Db25maWd1cmUocFJ2Yk1vZHVsZSwKKyAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopcENtZERhdGEsIGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgorICAgICAgICBSZXZlcmJfUmVzZXQocFJldmVyYiwgZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgorICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlZCwgcFJlcGx5RGF0YTogJXAiLHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgKGludCkgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnJlcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwUmVwbHlEYXRhOworICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpOworICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBwYXJhbSAlZCwgcmVwbHlTaXplICVkIiwqKGludDMyX3QgKilyZXAtPmRhdGEsIHJlcC0+dnNpemUpOworICAgICAgICByZXAtPnN0YXR1cyA9IFJldmVyYl9nZXRQYXJhbWV0ZXIocFJldmVyYiwgKihpbnQzMl90ICopcmVwLT5kYXRhLCAmcmVwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICByZXAtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIHJlcC0+dnNpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06CisgICAgICAgIExPR1YoIlJldmVyYl9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAorICAgICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgKGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkKKyAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSAoaW50KXNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmNtZCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gUmV2ZXJiX3NldFBhcmFtZXRlcihwUmV2ZXJiLCAqKGludDMyX3QgKiljbWQtPmRhdGEsCisgICAgICAgICAgICAgICAgY21kLT52c2l6ZSwgY21kLT5kYXRhICsgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocFJldmVyYi0+bVN0YXRlICE9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcFJldmVyYi0+bVN0YXRlID0gUkVWRVJCX1NUQVRFX0FDVElWRTsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocFJldmVyYi0+bVN0YXRlICE9IFJFVkVSQl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBSZXZlcmItPm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9ESVNBQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gKGludClzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4eCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiB7CisgICAgICAgIC8vIGF1ZGlvIG91dHB1dCBpcyBhbHdheXMgc3RlcmVvID0+IDIgY2hhbm5lbCB2b2x1bWVzCisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gKGludClzaXplb2YodWludDMyX3QpICogMikgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgbGVmdCA9IChmbG9hdCkoKih1aW50MzJfdCAqKXBDbWREYXRhKSAvICgxIDw8IDI0KTsKKyAgICAgICAgZmxvYXQgcmlnaHQgPSAoZmxvYXQpKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSkgLyAoMSA8PCAyNCk7CisgICAgICAgIExPR1YoIlJldmVyYl9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogbGVmdCAlZiwgcmlnaHQgJWYgIiwgbGVmdCwgcmlnaHQpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAoaW50KXNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIExPR1YoIlJldmVyYl9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6ICVkIiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiUmV2ZXJiX0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmIgaW50ZXJuYWwgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJfSW5pdCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBJbml0aWFsaXplIHJldmVyYiBjb250ZXh0IGFuZCBhcHBseSBkZWZhdWx0IHBhcmFtZXRlcnMKKyAqCisgKiBJbnB1dHM6CisgKiAgcFJ2Yk1vZHVsZSAgICAtIHBvaW50ZXIgdG8gcmV2ZXJiIGVmZmVjdCBtb2R1bGUKKyAqICBhdXggICAgICAgICAgIC0gaW5kaWNhdGVzIGlmIHRoZSByZXZlcmIgaXMgdXNlZCBhcyBhdXhpbGlhcnkgKDEpIG9yIGluc2VydCAoMCkKKyAqICBwcmVzZXQgICAgICAgIC0gaW5kaWNhdGVzIGlmIHRoZSByZXZlcmIgaXMgdXNlZCBpbiBwcmVzZXQgKDEpIG9yIGVudmlyb25tZW50YWwgKDApIG1vZGUKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgUmV2ZXJiX0luaXQocmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlLCBpbnQgYXV4LCBpbnQgcHJlc2V0KSB7CisgICAgaW50IHJldDsKKworICAgIExPR1YoIlJldmVyYl9Jbml0IG1vZHVsZSAlcCwgYXV4OiAlZCwgcHJlc2V0OiAlZCIsIHBSdmJNb2R1bGUsYXV4LCBwcmVzZXQpOworCisgICAgbWVtc2V0KCZwUnZiTW9kdWxlLT5jb250ZXh0LCAwLCBzaXplb2YocmV2ZXJiX29iamVjdF90KSk7CisKKyAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1fQXV4ID0gKHVpbnQxNl90KWF1eDsKKyAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1fUHJlc2V0ID0gKHVpbnQxNl90KXByZXNldDsKKworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBpZiAoYXV4KSB7CisgICAgICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICB9IGVsc2UgeworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICB9CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICByZXQgPSBSZXZlcmJfQ29uZmlndXJlKHBSdmJNb2R1bGUsICZwUnZiTW9kdWxlLT5jb25maWcsIHRydWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIExPR1YoIlJldmVyYl9Jbml0IGVycm9yICVkIG9uIG1vZHVsZSAlcCIsIHJldCwgcFJ2Yk1vZHVsZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJfSW5pdCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiAgU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKyAqCisgKiBJbnB1dHM6CisgKiAgcFJ2Yk1vZHVsZSAgICAtIHBvaW50ZXIgdG8gcmV2ZXJiIGVmZmVjdCBtb2R1bGUKKyAqICBwQ29uZmlnICAgICAgIC0gcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQKKyAqICAgICAgICAgICAgICBhbmQgb3V0cHV0IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbgorICogIGluaXQgICAgICAgICAgLSB0cnVlIGlmIGNhbGxlZCBmcm9tIGluaXQgZnVuY3Rpb24KKyAqIE91dHB1dHM6CisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBSZXZlcmJfQ29uZmlndXJlKHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnLAorICAgICAgICBib29sIGluaXQpIHsKKyAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIgPSAmcFJ2Yk1vZHVsZS0+Y29udGV4dDsKKyAgICBpbnQgYnVmZmVyU2l6ZUluU2FtcGxlczsKKyAgICBpbnQgdXBkYXRlUGVyaW9kSW5TYW1wbGVzOworICAgIGludCB4ZmFkZVBlcmlvZEluU2FtcGxlczsKKworICAgIC8vIENoZWNrIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIGJ1aWxkIG9wdGlvbnMKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlCisgICAgICAgICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzICE9IE9VVFBVVF9DSEFOTkVMUworICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1CisgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIExPR1YoIlJldmVyYl9Db25maWd1cmUgaW52YWxpZCBjb25maWciKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmICgocFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykpIHx8CisgICAgICAgICghcFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfU1RFUkVPKSkpIHsKKyAgICAgICAgTE9HVigiUmV2ZXJiX0NvbmZpZ3VyZSBpbnZhbGlkIGNvbmZpZyIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkoJnBSdmJNb2R1bGUtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworCisgICAgcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlID0gcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGU7CisKKyAgICBzd2l0Y2ggKHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgICAgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzID0gNTsKKyAgICAgICAgYnVmZmVyU2l6ZUluU2FtcGxlcyA9IDQwOTY7CisgICAgICAgIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogPSAtMjMxNzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0cyA9IDY7CisgICAgICAgIGJ1ZmZlclNpemVJblNhbXBsZXMgPSA4MTkyOworICAgICAgICBwUmV2ZXJiLT5tX25Db3NXVF81S0h6ID0gLTEyNTQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgICBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMgPSA3OworICAgICAgICBidWZmZXJTaXplSW5TYW1wbGVzID0gODE5MjsKKyAgICAgICAgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiA9IDQ3Njg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0cyA9IDc7CisgICAgICAgIGJ1ZmZlclNpemVJblNhbXBsZXMgPSAxNjM4NDsKKyAgICAgICAgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiA9IDE4MjA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgICBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMgPSA4OworICAgICAgICBidWZmZXJTaXplSW5TYW1wbGVzID0gMTYzODQ7CisgICAgICAgIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogPSAyNDc5OTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgICAgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzID0gODsKKyAgICAgICAgYnVmZmVyU2l6ZUluU2FtcGxlcyA9IDE2Mzg0OworICAgICAgICBwUmV2ZXJiLT5tX25Db3NXVF81S0h6ID0gMjU5OTc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIlJldmVyYl9Db25maWd1cmUgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gRGVmaW5lIGEgbWFzayBmb3IgY2lyY3VsYXIgYWRkcmVzc2luZywgc28gdGhhdCBhcnJheSBpbmRleAorICAgIC8vIGNhbiB3cmFwYXJvdW5kIGFuZCBzdGF5IGluIGFycmF5IGJvdW5kYXJ5IG9mIDAsIDEsIC4uLiwgKGJ1ZmZlciBzaXplIC0xKQorICAgIC8vIFRoZSBidWZmZXIgc2l6ZSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvCisgICAgcFJldmVyYi0+bV9uQnVmZmVyTWFzayA9IChpbnQzMl90KSAoYnVmZmVyU2l6ZUluU2FtcGxlcyAtIDEpOworICAgIC8qIHJldmVyYiBwYXJhbWV0ZXJzIGFyZSB1cGRhdGVkIGV2ZXJ5IDJeKHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0cykgc2FtcGxlcyAqLworICAgIHVwZGF0ZVBlcmlvZEluU2FtcGxlcyA9IChpbnQzMl90KSAoMHgxTCA8PCBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMpOworICAgIC8qCisgICAgIGNhbGN1bGF0ZSB0aGUgdXBkYXRlIGNvdW50ZXIgYnkgYml0d2lzZSBBTkRJTkcgd2l0aCB0aGlzIHZhbHVlIHRvCisgICAgIGdlbmVyYXRlIGEgMl5uIG1vZHVsbyB2YWx1ZQorICAgICAqLworICAgIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlcyA9IChpbnQzMl90KSB1cGRhdGVQZXJpb2RJblNhbXBsZXM7CisKKyAgICB4ZmFkZVBlcmlvZEluU2FtcGxlcyA9IChpbnQzMl90KSAoUkVWRVJCX1hGQURFX1BFUklPRF9JTl9TRUNPTkRTCisgICAgICAgICAgICAqIChkb3VibGUpIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSk7CisKKyAgICAvLyBzZXQgeGZhZGUgcGFyYW1ldGVycworICAgIHBSZXZlcmItPm1fblBoYXNlSW5jcmVtZW50CisgICAgICAgICAgICA9IChpbnQxNl90KSAoNjU1MzYgLyAoKGludDE2X3QpIHhmYWRlUGVyaW9kSW5TYW1wbGVzCisgICAgICAgICAgICAgICAgICAgIC8gKGludDE2X3QpIHVwZGF0ZVBlcmlvZEluU2FtcGxlcykpOworCisgICAgaWYgKGluaXQpIHsKKyAgICAgICAgUmV2ZXJiUmVhZEluUHJlc2V0cyhwUmV2ZXJiKTsKKworICAgICAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBhbGxvdyBub2lzZSBnZW5lcmF0b3IKKyAgICAgICAgcFJldmVyYi0+bV9iVXNlTm9pc2UgPSB0cnVlOworCisgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGFsbG93IGJ5cGFzcworICAgICAgICBwUmV2ZXJiLT5tX2JCeXBhc3MgPSAwOworCisgICAgICAgIHBSZXZlcmItPm1fbk5leHRSb29tID0gMTsKKworICAgICAgICBwUmV2ZXJiLT5tX25Ob2lzZSA9IChpbnQxNl90KSAweEFCQ0Q7CisgICAgfQorCisgICAgUmV2ZXJiX1Jlc2V0KHBSZXZlcmIsIGluaXQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiX1Jlc2V0KCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqICBSZXNldCBpbnRlcm5hbCBzdGF0ZXMgYW5kIGNsZWFyIGRlbGF5IGxpbmVzLgorICoKKyAqIElucHV0czoKKyAqICBwUmV2ZXJiICAgIC0gcG9pbnRlciB0byByZXZlcmIgY29udGV4dAorICogIGluaXQgICAgICAgLSB0cnVlIGlmIGNhbGxlZCBmcm9tIGluaXQgZnVuY3Rpb24KKyAqCisgKiBPdXRwdXRzOgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit2b2lkIFJldmVyYl9SZXNldChyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGJvb2wgaW5pdCkgeworICAgIGludCBidWZmZXJTaXplSW5TYW1wbGVzID0gKGludDMyX3QpIChwUmV2ZXJiLT5tX25CdWZmZXJNYXNrICsgMSk7CisgICAgaW50IG1heEFwU2FtcGxlczsKKyAgICBpbnQgbWF4RGVsYXlTYW1wbGVzOworICAgIGludCBtYXhFYXJseVNhbXBsZXM7CisgICAgaW50IGFwMUluOworICAgIGludCBkZWxheTBJbjsKKyAgICBpbnQgZGVsYXkxSW47CisgICAgaW50MzJfdCBpOworICAgIHVpbnQxNl90IG5PZmZzZXQ7CisKKyAgICBtYXhBcFNhbXBsZXMgPSAoKGludDMyX3QpIChNQVhfQVBfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOworICAgIG1heERlbGF5U2FtcGxlcyA9ICgoaW50MzJfdCkgKE1BWF9ERUxBWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgPj4gMTYpOworICAgIG1heEVhcmx5U2FtcGxlcyA9ICgoaW50MzJfdCkgKE1BWF9FQVJMWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgPj4gMTYpOworCisgICAgYXAxSW4gPSAoQVAwX0lOICsgbWF4QXBTYW1wbGVzICsgR1VBUkQpOworICAgIGRlbGF5MEluID0gKGFwMUluICsgbWF4QXBTYW1wbGVzICsgR1VBUkQpOworICAgIGRlbGF5MUluID0gKGRlbGF5MEluICsgbWF4RGVsYXlTYW1wbGVzICsgR1VBUkQpOworICAgIC8vIERlZmluZSB0aGUgbWF4IG9mZnNldHMgZm9yIHRoZSBlbmQgcG9pbnRzIG9mIGVhY2ggc2VjdGlvbgorICAgIC8vIGkuZS4sIHdlIGRvbid0IGV4cGVjdCBhIGdpdmVuIHNlY3Rpb24ncyB0YXBzIHRvIGdvIGJleW9uZAorICAgIC8vIHRoZSBmb2xsb3dpbmcgbGltaXRzCisKKyAgICBwUmV2ZXJiLT5tX25FYXJseTBpbiA9IChkZWxheTFJbiArIG1heERlbGF5U2FtcGxlcyArIEdVQVJEKTsKKyAgICBwUmV2ZXJiLT5tX25FYXJseTFpbiA9IChwUmV2ZXJiLT5tX25FYXJseTBpbiArIG1heEVhcmx5U2FtcGxlcyArIEdVQVJEKTsKKworICAgIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluID0gQVAwX0lOOworCisgICAgcFJldmVyYi0+bV96RDBJbiA9IGRlbGF5MEluOworCisgICAgcFJldmVyYi0+bV9zQXAxLm1fekFwSW4gPSBhcDFJbjsKKworICAgIHBSZXZlcmItPm1fekQxSW4gPSBkZWxheTFJbjsKKworICAgIHBSZXZlcmItPm1fek91dExwZkwgPSAwOworICAgIHBSZXZlcmItPm1fek91dExwZlIgPSAwOworCisgICAgcFJldmVyYi0+bV9uUmV2RmJrUiA9IDA7CisgICAgcFJldmVyYi0+bV9uUmV2RmJrTCA9IDA7CisKKyAgICAvLyBzZXQgYmFzZSBpbmRleCBpbnRvIGNpcmN1bGFyIGJ1ZmZlcgorICAgIHBSZXZlcmItPm1fbkJhc2VJbmRleCA9IDA7CisKKyAgICAvLyBjbGVhciB0aGUgcmV2ZXJiIGRlbGF5IGxpbmUKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyU2l6ZUluU2FtcGxlczsgaSsrKSB7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5TGluZVtpXSA9IDA7CisgICAgfQorCisgICAgUmV2ZXJiVXBkYXRlUm9vbShwUmV2ZXJiLCBpbml0KTsKKworICAgIHBSZXZlcmItPm1fblVwZGF0ZUNvdW50ZXIgPSAwOworCisgICAgcFJldmVyYi0+bV9uUGhhc2UgPSAtMzI3Njg7CisKKyAgICBwUmV2ZXJiLT5tX25TaW4gPSAwOworICAgIHBSZXZlcmItPm1fbkNvcyA9IDA7CisgICAgcFJldmVyYi0+bV9uU2luSW5jcmVtZW50ID0gMDsKKyAgICBwUmV2ZXJiLT5tX25Db3NJbmNyZW1lbnQgPSAwOworCisgICAgLy8gc2V0IGRlbGF5IHRhcCBsZW5ndGhzCisgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgcFJldmVyYi0+bV96RDFDcm9zcyA9IHBSZXZlcmItPm1fbkRlbGF5MU91dCAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbgorICAgICAgICAgICAgKyBuT2Zmc2V0OworCisgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgcFJldmVyYi0+bV96RDBDcm9zcyA9IHBSZXZlcmItPm1fbkRlbGF5ME91dCAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbgorICAgICAgICAgICAgLSBuT2Zmc2V0OworCisgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgcFJldmVyYi0+bV96RDBTZWxmID0gcFJldmVyYi0+bV9uRGVsYXkwT3V0IC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uCisgICAgICAgICAgICAtIG5PZmZzZXQ7CisKKyAgICBuT2Zmc2V0ID0gUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocFJldmVyYik7CisKKyAgICBwUmV2ZXJiLT5tX3pEMVNlbGYgPSBwUmV2ZXJiLT5tX25EZWxheTFPdXQgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24KKyAgICAgICAgICAgICsgbk9mZnNldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIEdldCBhIFJldmVyYiBwYXJhbWV0ZXIKKyAqCisgKiBJbnB1dHM6CisgKiAgcFJldmVyYiAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisgKiAgcGFyYW0gICAgICAgICAtIHBhcmFtZXRlcgorICogIHBWYWx1ZSAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisgKiAgcFNpemUgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisgKgorICogT3V0cHV0czoKKyAqICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKyAqICAqcFNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisgKgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3QgKnBTaXplLAorICAgICAgICB2b2lkICpwVmFsdWUpIHsKKyAgICBpbnQzMl90ICpwVmFsdWUzMjsKKyAgICBpbnQxNl90ICpwVmFsdWUxNjsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7CisgICAgaW50MzJfdCBpOworICAgIGludDMyX3QgdGVtcDsKKyAgICBpbnQzMl90IHRlbXAyOworICAgIHNpemVfdCBzaXplOworCisgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CisgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8ICpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FIGlzIG1hcHBlZCB0byBieXBhc3MKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fYkJ5cGFzcyAhPSAwKSB7CisgICAgICAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdClSRVZFUkJfUFJFU0VUX05PTkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdCkocFJldmVyYi0+bV9uTmV4dFJvb20gKyAxKTsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgKnBWYWx1ZTE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKHRfcmV2ZXJiX3NldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqcFNpemUgPCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHBWYWx1ZTMyID0gKGludDMyX3QgKikgcFZhbHVlOworICAgICAgICBwVmFsdWUxNiA9IChpbnQxNl90ICopIHBWYWx1ZTsKKyAgICAgICAgcFByb3BlcnRpZXMgPSAodF9yZXZlcmJfc2V0dGluZ3MgKikgcFZhbHVlOworCisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICAgICAgKnBWYWx1ZTMyID0gKGludDMyX3QpIHBSZXZlcmItPm1fYkJ5cGFzczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cm9vbUxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbV9uUm9vbUxwZkZ3ZCB0byBtaWxsaWJlbHMKKyAgICAgICAgICAgIHRlbXAgPSAocFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCA8PCAxNSkKKyAgICAgICAgICAgICAgICAgICAgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKKworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMICVkLCBnYWluICVkLCBtX25Sb29tTHBmRndkICVkLCBtX25Sb29tTHBmRmJrICVkIiwgKnBWYWx1ZTE2LCB0ZW1wLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICAgICAgLy8gVGhlIHJhdGlvIGJldHdlZW4gbGluZWFyIGdhaW4gYXQgMEh6IGFuZCBhdCA1MDAwSHogZm9yIHRoZSByb29tIGxvdyBwYXNzIGlzOgorICAgICAgICAgICAgLy8gKDEgKyBhMSkgLyBzcXJ0KGExXjIgKyAyKkMqYTEgKyAxKSB3aGVyZToKKyAgICAgICAgICAgIC8vIC0gYTEgaXMgbWludXMgdGhlIExQIGZlZWRiYWNrIGdhaW46IC1wUmV2ZXJiLT5tX25Sb29tTHBmRmJrCisgICAgICAgICAgICAvLyAtIEMgaXMgY29zKDJwaVdUKSBAIDUwMDBIejogcFJldmVyYi0+bV9uQ29zV1RfNUtIegorCisgICAgICAgICAgICB0ZW1wID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJvb21McGZGYmssIHBSZXZlcmItPm1fblJvb21McGZGYmspOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBhMV4yICVkIiwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wMiA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX25Sb29tTHBmRmJrLCBwUmV2ZXJiLT5tX25Db3NXVF81S0h6KQorICAgICAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAyIENvcyBhMSAlZCIsIHRlbXAyKTsKKyAgICAgICAgICAgIHRlbXAgPSAzMjc2NyArIHRlbXAgLSB0ZW1wMjsKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgYTFeMiArIDIgQ29zIGExICsgMSAlZCIsIHRlbXApOworICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfU3FydCh0ZW1wKSAqIDE4MTsKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgU1FSVChhMV4yICsgMiBDb3MgYTEgKyAxKSAlZCIsIHRlbXApOworICAgICAgICAgICAgdGVtcCA9ICgoMzI3NjcgLSBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKSA8PCAxNSkgLyB0ZW1wOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIGdhaW4gJWQsIG1fblJvb21McGZGd2QgJWQsIG1fblJvb21McGZGYmsgJWQiLCB0ZW1wLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKworICAgICAgICAgICAgKnBWYWx1ZTE2ID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXApOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5kZWNheVRpbWU7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJldmVyYiBmZWVkYmFjayBwYXRoIGdhaW4KKyAgICAgICAgICAgIHRlbXAgPSAocFJldmVyYi0+bV9uUnZiTHBmRndkIDw8IDE1KSAvICgzMjc2NyAtIHBSZXZlcmItPm1fblJ2YkxwZkZiayk7CisgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXApOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZGVjYXkgdGltZTogZyA9IC02MDAwIGQvRFQgLCBnIGdhaW4gaW4gbWlsbGliZWxzLCBkIHJldmVyYiBkZWxheSwgRFQgZGVjYXkgdGltZQorICAgICAgICAgICAgdGVtcCA9ICgtNjAwMCAqIHBSZXZlcmItPm1fbkxhdGVEZWxheSkgLyB0ZW1wOworCisgICAgICAgICAgICAvLyBDb252ZXJ0IHNhbXBsZXMgdG8gbXMKKyAgICAgICAgICAgICpwVmFsdWUzMiA9ICh0ZW1wICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSwgc2FtcGxlcyAlZCwgbXMgJWQiLCB0ZW1wLCAqcFZhbHVlMzIpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW87CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgICAgIC8vIElmIHIgaXMgdGhlIGRlY2F5IEhGIHJhdGlvICAociA9IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTy8xMDAwKSB3ZSBoYXZlOgorICAgICAgICAgICAgLy8gICAgICAgRFRfNTAwMEh6ID0gRFRfMEh6ICogcgorICAgICAgICAgICAgLy8gIGFuZCAgR181MDAwSHogPSAtNjAwMCAqIGQgLyBEVF81MDAwSHogYW5kIEdfMEh6ID0gLTYwMDAgKiBkIC8gRFRfMEh6IGluIG1pbGxpYmVscyBzbyA6CisgICAgICAgICAgICAvLyByID0gR18wSHovR181MDAwSHogaW4gbWlsbGliZWxzCisgICAgICAgICAgICAvLyBUaGUgbGluZWFyIGdhaW4gYXQgNTAwMEh6IGlzIGIwIC8gc3FydChhMV4yICsgMipDKmExICsgMSkgd2hlcmU6CisgICAgICAgICAgICAvLyAtIGExIGlzIG1pbnVzIHRoZSBMUCBmZWVkYmFjayBnYWluOiAtcFJldmVyYi0+bV9uUnZiTHBmRmJrCisgICAgICAgICAgICAvLyAtIGIwIGlzIHRoZSBMUCBmb3J3YXJkIGdhaW46IHBSZXZlcmItPm1fblJ2YkxwZkZ3ZAorICAgICAgICAgICAgLy8gLSBDIGlzIGNvcygycGlXVCkgQCA1MDAwSHo6IHBSZXZlcmItPm1fbkNvc1dUXzVLSHoKKyAgICAgICAgICAgIGlmIChwUmV2ZXJiLT5tX25SdmJMcGZGYmsgPT0gMCkgeworICAgICAgICAgICAgICAgICpwVmFsdWUxNiA9IDEwMDA7CisgICAgICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgcFJldmVyYi0+bV9uUnZiTHBmRmJrID09IDAsIHJhdGlvICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX25SdmJMcGZGYmssIHBSZXZlcmItPm1fblJ2YkxwZkZiayk7CisgICAgICAgICAgICAgICAgdGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25Db3NXVF81S0h6KQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gMzI3NjcgKyB0ZW1wIC0gdGVtcDI7CisgICAgICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfU3FydCh0ZW1wKSAqIDE4MTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA8PCAxNSkgLyB0ZW1wOworICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lYXIgZ2FpbiBhdCAwSHogaXMgYjAgLyAoYTEgKyAxKQorICAgICAgICAgICAgICAgIHRlbXAyID0gKHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA8PCAxNSkgLyAoMzI3NjcKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKKworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcCk7CisgICAgICAgICAgICAgICAgdGVtcDIgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcDIpOworICAgICAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIGdhaW4gNUtIeiAlZCBtQiwgZ2FpbiBEQyAlZCBtQiIsIHRlbXAsIHRlbXAyKTsKKworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IDApCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAxOworICAgICAgICAgICAgICAgIHRlbXAgPSAoaW50MTZfdCkgKCgxMDAwICogdGVtcDIpIC8gdGVtcCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPiAxMDAwKQorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gMTAwMDsKKworICAgICAgICAgICAgICAgICpwVmFsdWUxNiA9IHRlbXA7CisgICAgICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgcmF0aW8gJWQiLCAqcFZhbHVlMTYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICAgICAgKnBWYWx1ZTE2ID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHBSZXZlcmItPm1fbkVhcmx5R2Fpbik7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CisgICAgICAgICAgICAvLyBjb252ZXJ0IHNhbXBsZXMgdG8gbXMKKyAgICAgICAgICAgICpwVmFsdWUzMiA9IChwUmV2ZXJiLT5tX25FYXJseURlbGF5ICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVksIHNhbXBsZXMgJWQsIG1zICVkIiwgcFJldmVyYi0+bV9uRWFybHlEZWxheSwgKnBWYWx1ZTMyKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJldmVyYkxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgLy8gQ29udmVydCBsaW5lYXIgZ2FpbiB0byBtaWxsaWJlbHMKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25MYXRlR2FpbiA8PCAyKTsKKworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgJWQiLCAqcFZhbHVlMTYpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMzIgPSAmcFByb3BlcnRpZXMtPnJldmVyYkRlbGF5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgLy8gY29udmVydCBzYW1wbGVzIHRvIG1zCisgICAgICAgICAgICAqcFZhbHVlMzIgPSAocFJldmVyYi0+bV9uTGF0ZURlbGF5ICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCBzYW1wbGVzICVkLCBtcyAlZCIsIHBSZXZlcmItPm1fbkxhdGVEZWxheSwgKnBWYWx1ZTMyKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5kaWZmdXNpb247CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgICAgICB0ZW1wID0gKGludDE2X3QpICgoMTAwMCAqIChwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluIC0gQVAwX0dBSU5fQkFTRSkpCisgICAgICAgICAgICAgICAgICAgIC8gQVAwX0dBSU5fUkFOR0UpOworCisgICAgICAgICAgICBpZiAodGVtcCA8IDApCisgICAgICAgICAgICAgICAgdGVtcCA9IDA7CisgICAgICAgICAgICBpZiAodGVtcCA+IDEwMDApCisgICAgICAgICAgICAgICAgdGVtcCA9IDEwMDA7CisKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IHRlbXA7CisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTiwgJWQsIEFQMCBnYWluICVkIiwgKnBWYWx1ZTE2LCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ESUZGVVNJT04pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5kZW5zaXR5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBBUCBkZWxheSBpbiB0aW1lIHVuaXRzCisgICAgICAgICAgICB0ZW1wID0gKChwUmV2ZXJiLT5tX3NBcDAubV96QXBPdXQgLSBwUmV2ZXJiLT5tX3NBcDAubV96QXBJbikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICB0ZW1wID0gKGludDE2X3QpICgoMTAwMCAqICh0ZW1wIC0gQVAwX1RJTUVfQkFTRSkpIC8gQVAwX1RJTUVfUkFOR0UpOworCisgICAgICAgICAgICBpZiAodGVtcCA8IDApCisgICAgICAgICAgICAgICAgdGVtcCA9IDA7CisgICAgICAgICAgICBpZiAodGVtcCA+IDEwMDApCisgICAgICAgICAgICAgICAgdGVtcCA9IDEwMDA7CisKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IHRlbXA7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVOU0lUWSwgJWQsIEFQMCBkZWxheSBzbXBzICVkIiwgKnBWYWx1ZTE2LCBwUmV2ZXJiLT5tX3NBcDAubV96QXBPdXQgLSBwUmV2ZXJiLT5tX3NBcDAubV96QXBJbik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcFNpemUgPSBzaXplOworCisgICAgTE9HVigiUmV2ZXJiX2dldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJWQsIHZhbHVlICVkIiwKKyAgICAgICAgICAgIHBSZXZlcmIsIHBhcmFtLCAqKGludCAqKXBWYWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIFJldmVyYl9nZXRQYXJhbWV0ZXIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJfc2V0UGFyYW1ldGVyKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFNldCBhIFJldmVyYiBwYXJhbWV0ZXIKKyAqCisgKiBJbnB1dHM6CisgKiAgcFJldmVyYiAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisgKiAgcGFyYW0gICAgICAgICAtIHBhcmFtZXRlcgorICogIHBWYWx1ZSAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlciB2YWx1ZQorICogIHNpemUgICAgICAgICAgLSB2YWx1ZSBzaXplCisgKgorICogT3V0cHV0czoKKyAqCisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLAorICAgICAgICB2b2lkICpwVmFsdWUpIHsKKyAgICBpbnQzMl90IHZhbHVlMzI7CisgICAgaW50MTZfdCB2YWx1ZTE2OworICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKKyAgICBpbnQzMl90IGk7CisgICAgaW50MzJfdCB0ZW1wOworICAgIGludDMyX3QgdGVtcDI7CisgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0OworICAgIGludCBtYXhTYW1wbGVzOworICAgIGludDMyX3QgYXZlcmFnZURlbGF5OworICAgIHNpemVfdCBwYXJhbVNpemU7CisKKyAgICBMT0dWKCJSZXZlcmJfc2V0UGFyYW1ldGVyLCBjb250ZXh0ICVwLCBwYXJhbSAlZCwgdmFsdWUxNiAlZCwgdmFsdWUzMiAlZCIsCisgICAgICAgICAgICBwUmV2ZXJiLCBwYXJhbSwgKihpbnQxNl90ICopcFZhbHVlLCAqKGludDMyX3QgKilwVmFsdWUpOworCisgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CisgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8IHNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZTE2ID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICBMT0dWKCJzZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgdmFsdWUxNik7CisgICAgICAgIGlmICh2YWx1ZTE2IDwgUkVWRVJCX1BSRVNFVF9OT05FIHx8IHZhbHVlMTYgPiBSRVZFUkJfUFJFU0VUX1BMQVRFKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX05PTkUgaXMgbWFwcGVkIHRvIGJ5cGFzcworICAgICAgICBpZiAodmFsdWUxNiA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fYkJ5cGFzcyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX2JCeXBhc3MgPSAwOworICAgICAgICAgICAgcFJldmVyYi0+bV9uTmV4dFJvb20gPSB2YWx1ZTE2IC0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIHBhcmFtU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIHBhcmFtU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBwYXJhbVNpemUgPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpemUgIT0gcGFyYW1TaXplKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJhbVNpemUgPT0gc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICB2YWx1ZTE2ID0gKihpbnQxNl90ICopIHBWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbVNpemUgPT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICB2YWx1ZTMyID0gKihpbnQzMl90ICopIHBWYWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHBQcmVzZXQgPSAmcFJldmVyYi0+bV9zUHJlc2V0Lm1fc1ByZXNldFtwUmV2ZXJiLT5tX25OZXh0Um9vbV07CisKKyAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9CWVBBU1M6CisgICAgICAgICAgICBwUmV2ZXJiLT5tX2JCeXBhc3MgPSAodWludDE2X3QpdmFsdWUzMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPnJvb21MZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1pbGxpYmVscyB0byBsaW5lYXIgMTYgYml0IHNpZ25lZCA9PiBtX25Sb29tTHBmRndkCisgICAgICAgICAgICBpZiAodmFsdWUxNiA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodmFsdWUxNik7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcCwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiaykpOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCwgZ2FpbiAlZCwgbmV3IG1fblJvb21McGZGd2QgJWQsIG1fblJvb21McGZGYmsgJWQiLCB0ZW1wLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorCisgICAgICAgICAgICAvLyBMaW1pdCB0byAwICwgLTQwZEIgcmFuZ2UgYmVjYXVzZSBvZiBsb3cgcGFzcyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwIHx8IHZhbHVlMTYgPCAtNDAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgYXR0ZW51YXRpb24gQCA1MDAwSCBleHByZXNzZWQgaW4gbWlsbGliZWxzIHRvID0+IG1fblJvb21McGZGYmsKKyAgICAgICAgICAgIC8vIG1fblJvb21McGZGYmsgaXMgLWExIHdoZXJlIGExIGlzIHRoZSBzb2x1dGlvbiBvZjoKKyAgICAgICAgICAgIC8vIGExXjIgKyAyKihDLWRHXjIpLygxLWRHXjIpKmExICsgMSA9IDAgd2hlcmU6CisgICAgICAgICAgICAvLyAtIEMgaXMgY29zKDIqcGkqNTAwMC9GcykgKHBSZXZlcmItPm1fbkNvc1dUXzVLSHopCisgICAgICAgICAgICAvLyAtIGRHIGlzIEcwL0dmIChHMCBpcyB0aGUgbGluZWFyIGdhaW4gYXQgREMgYW5kIEdmIGlzIHRoZSB3YW50ZWQgZ2FpbiBhdCA1MDAwSHopCisKKyAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudCBEQyBnYWluIG1fblJvb21McGZGd2QgLyAoMzI3NjcgLSBtX25Sb29tTHBmRmJrKSB0byBrZWVwIGl0IHVuY2hhbmdlZAorICAgICAgICAgICAgLy8gd2hpbGUgY2hhbmdpbmcgSEYgbGV2ZWwKKyAgICAgICAgICAgIHRlbXAyID0gKHBSZXZlcmItPm1fblJvb21McGZGd2QgPDwgMTUpIC8gKDMyNzY3CisgICAgICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisgICAgICAgICAgICBpZiAodmFsdWUxNiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZiayA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgZEcyLCBiLCBkZWx0YTsKKworICAgICAgICAgICAgICAgIC8vIGRHXjIKKyAgICAgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpOworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBIRiBnYWluICVkIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgdGVtcCA9ICgxIDw8IDMwKSAvIHRlbXA7CisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIDEvIEhGIGdhaW4gJWQiLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICBkRzIgPSAoaW50MzJfdCkgKCgoaW50NjRfdCkgdGVtcCAqIChpbnQ2NF90KSB0ZW1wKSA+PiAxNSk7CisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIDEvIEhGIGdhaW4gXiAyICVkIiwgZEcyKTsKKyAgICAgICAgICAgICAgICAvLyBiID0gMiooQy1kR14yKS8oMS1kR14yKQorICAgICAgICAgICAgICAgIGIgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIDEgPDwgKDE1ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAqICgoaW50NjRfdCkgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiAtIChpbnQ2NF90KSBkRzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAoKGludDY0X3QpIDMyNzY3IC0gKGludDY0X3QpIGRHMikpOworCisgICAgICAgICAgICAgICAgLy8gZGVsdGEgPSBiXjIgLSA0CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIGIgKiAoaW50NjRfdCkgYikgPj4gMTUpIC0gKDEgPDwgKDE1CisgICAgICAgICAgICAgICAgICAgICAgICArIDIpKSk7CisKKyAgICAgICAgICAgICAgICBMT0dWX0lGKGRlbHRhID4gKDE8PDMwKSwgIiBkZWx0YSBvdmVyZmxvdyAlZCIsIGRlbHRhKTsKKworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBkRzIgJWQsIGIgJWQsIGRlbHRhICVkLCBtX25Db3NXVF81S0h6ICVkIiwgZEcyLCBiLCBkZWx0YSwgcFJldmVyYi0+bV9uQ29zV1RfNUtIeik7CisgICAgICAgICAgICAgICAgLy8gbV9uUm9vbUxwZkZiayA9IC1hMSA9IC0gKC0gYiArIHNxcnQoZGVsdGEpKSAvIDIKKyAgICAgICAgICAgICAgICBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrID0gKGIgLSBFZmZlY3RzX1NxcnQoZGVsdGEpICogMTgxKSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIG9sZyBEQyBnYWluICVkIG5ldyBtX25Sb29tTHBmRmJrICVkLCBvbGQgbV9uUm9vbUxwZkZ3ZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHRlbXAyLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkKTsKKworICAgICAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZAorICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMSh0ZW1wMiwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiaykpOworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIG5ldyBtX25Sb29tTHBmRndkICVkIiwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCk7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMzIgPSBwUHJvcGVydGllcy0+ZGVjYXlUaW1lOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKworICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaXNlY29uZHMgdG8gPT4gbV9uUnZiTHBmRndkIChmdW5jdGlvbiBvZiBtX25SdmJMcGZGYmspCisgICAgICAgICAgICAvLyBjb252ZXJ0IG1zIHRvIHNhbXBsZXMKKyAgICAgICAgICAgIHZhbHVlMzIgPSAodmFsdWUzMiAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgLyAxMDAwOworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdmFsaWQgZGVjYXkgdGltZSByYW5nZSBhcyBhIGZ1bmN0aW9uIG9mIGN1cnJlbnQgcmV2ZXJiIGRlbGF5IGFuZAorICAgICAgICAgICAgLy8gbWF4IGZlZWQgYmFjayBnYWluLiBNaW4gdmFsdWUgPD0+IC00MGRCIGluIG9uZSBwYXNzLCBNYXggdmFsdWUgPD0+IGZlZWRiYWNrIGdhaW4gPSAtMSBkQgorICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF0dGVudWF0aW9uIGZvciBlYWNoIHJvdW5kIGluIGxhdGUgcmV2ZXJiIGdpdmVuIGEgdG90YWwgYXR0ZW51YXRpb24gb2YgLTYwMDAgbWlsbGliZWxzLgorICAgICAgICAgICAgLy8gZyA9IC02MDAwIGQvRFQgLCBnIGdhaW4gaW4gbWlsbGliZWxzLCBkIHJldmVyYiBkZWxheSwgRFQgZGVjYXkgdGltZQorICAgICAgICAgICAgYXZlcmFnZURlbGF5ID0gcFJldmVyYi0+bV9uTGF0ZURlbGF5IC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uOworICAgICAgICAgICAgYXZlcmFnZURlbGF5ICs9ICgocFJldmVyYi0+bV9zQXAwLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAwLm1fekFwSW4pCisgICAgICAgICAgICAgICAgICAgICsgKHBSZXZlcmItPm1fc0FwMS5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMS5tX3pBcEluKSkgPj4gMTsKKworICAgICAgICAgICAgdGVtcCA9ICgtNjAwMCAqIGF2ZXJhZ2VEZWxheSkgLyB2YWx1ZTMyOworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUsIGRlbGF5IHNtcHMgJWQsIERUIHNtcHMgJWQsIGdhaW4gbUIgJWQiLGF2ZXJhZ2VEZWxheSwgdmFsdWUzMiwgdGVtcCk7CisgICAgICAgICAgICBpZiAodGVtcCA8IC00MDAwIHx8IHRlbXAgPiAtMTAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbG93IHBhc3MgZ2FpbiBieSBhZGRpbmcgcmV2ZXJiIGlucHV0IGF0dGVudWF0aW9uIChwUmV2ZXJiLT5tX25MYXRlR2FpbikgYW5kIHN1YnN0cmF0aW5nIG91dHB1dAorICAgICAgICAgICAgLy8geGZhZGUgYW5kIHN1bSBnYWluIChtYXggKzlkQikKKyAgICAgICAgICAgIHRlbXAgLT0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHBSZXZlcmItPm1fbkxhdGVHYWluKSArIDkwMDsKKyAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodGVtcCk7CisKKyAgICAgICAgICAgIC8vIERDIGdhaW4gKHRlbXApID0gYjAgLyAoMSArIGExKSA9IHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCAvICgzMjc2NyAtIHBSZXZlcmItPm1fblJ2YkxwZkZiaykKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZAorICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMSh0ZW1wLCAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspKTsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUsIGdhaW4gJWQsIG5ldyBtX25SdmJMcGZGd2QgJWQsIG9sZCBtX25SdmJMcGZGYmsgJWQsIHJldmVyYiBnYWluICVkIiwgdGVtcCwgcFJldmVyYi0+bV9uUnZiTHBmRndkLCBwUmV2ZXJiLT5tX25SdmJMcGZGYmssIEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25MYXRlR2FpbikpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPmRlY2F5SEZSYXRpbzsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgorCisgICAgICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgdG8gMTAwMCBiZWNhdXNlIHJldmVyYiBmaWx0ZXIgaXMgbG93cGFzcyBvbmx5CisgICAgICAgICAgICBpZiAodmFsdWUxNiA8IDEwMCB8fCB2YWx1ZTE2ID4gMTAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgcGVyIG1pbGxlIHRvID0+IG1fbkxwZkZ3ZCwgbV9uTHBmRmJrCisKKyAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudCBEQyBnYWluIG1fblJvb21McGZGd2QgLyAoMzI3NjcgLSBtX25Sb29tTHBmRmJrKSB0byBrZWVwIGl0IHVuY2hhbmdlZAorICAgICAgICAgICAgLy8gd2hpbGUgY2hhbmdpbmcgSEYgbGV2ZWwKKyAgICAgICAgICAgIHRlbXAyID0gKHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA8PCAxNSkgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworCisgICAgICAgICAgICBpZiAodmFsdWUxNiA9PSAxMDAwKSB7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRmJrID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkRzIsIGIsIGRlbHRhOworCisgICAgICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wMik7CisgICAgICAgICAgICAgICAgLy8gR181MDAwSHogPSBHX0RDICogKDEwMDAvUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKSBpbiBtaWxsaWJlbHMKKworICAgICAgICAgICAgICAgIHZhbHVlMzIgPSAoKGludDMyX3QpIDEwMDAgPDwgMTUpIC8gKGludDMyX3QpIHZhbHVlMTY7CisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBEQyBnYWluICVkLCBEQyBnYWluIG1CICVkLCAxMDAwL1IgJWQiLCB0ZW1wMiwgdGVtcCwgdmFsdWUzMik7CisKKyAgICAgICAgICAgICAgICB0ZW1wID0gKGludDMyX3QpICgoKGludDY0X3QpIHRlbXAgKiAoaW50NjRfdCkgdmFsdWUzMikgPj4gMTUpOworCisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPCAtNDAwMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8gSEYgZ2FpbiBvdmVyZmxvdyAlZCBtQiIsIHRlbXApOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLTQwMDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih0ZW1wKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIEhGIGdhaW4gJWQiLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICAvLyBkR14yCisgICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wMiA8PCAxNSkgLyB0ZW1wOworICAgICAgICAgICAgICAgIGRHMiA9IChpbnQzMl90KSAoKChpbnQ2NF90KSB0ZW1wICogKGludDY0X3QpIHRlbXApID4+IDE1KTsKKworICAgICAgICAgICAgICAgIC8vIGIgPSAyKihDLWRHXjIpLygxLWRHXjIpCisgICAgICAgICAgICAgICAgYiA9IChpbnQzMl90KSAoKCgoaW50NjRfdCkgMSA8PCAoMTUgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICogKChpbnQ2NF90KSBwUmV2ZXJiLT5tX25Db3NXVF81S0h6IC0gKGludDY0X3QpIGRHMikpCisgICAgICAgICAgICAgICAgICAgICAgICAvICgoaW50NjRfdCkgMzI3NjcgLSAoaW50NjRfdCkgZEcyKSk7CisKKyAgICAgICAgICAgICAgICAvLyBkZWx0YSA9IGJeMiAtIDQKKyAgICAgICAgICAgICAgICBkZWx0YSA9IChpbnQzMl90KSAoKCgoaW50NjRfdCkgYiAqIChpbnQ2NF90KSBiKSA+PiAxNSkgLSAoMSA8PCAoMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMikpKTsKKworICAgICAgICAgICAgICAgIC8vIG1fblJvb21McGZGYmsgPSAtYTEgPSAtICgtIGIgKyBzcXJ0KGRlbHRhKSkgLyAyCisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRmJrID0gKGIgLSBFZmZlY3RzX1NxcnQoZGVsdGEpICogMTgxKSA+PiAxOworCisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBkRzIgJWQsIGIgJWQsIGRlbHRhICVkIiwgZEcyLCBiLCBkZWx0YSk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBnYWluICVkLCBtX25SdmJMcGZGYmsgJWQsIG1fblJ2YkxwZkZ3ZCAlZCIsIHRlbXAyLCBwUmV2ZXJiLT5tX25SdmJMcGZGYmssIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCk7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZAorICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMSh0ZW1wMiwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKSk7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byAwIGJlY2F1c2UgZ2FpbiBpcyBsaW1pdGVkIHRvIDBkQgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwIHx8IHZhbHVlMTYgPCAtNjAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaWJlbHMgdG8gbGluZWFyIDE2IGJpdCBzaWduZWQgYW5kIHJlY29tcHV0ZSBtX3NFYXJseUwubV9uR2FpbltpXSBhbmQgbV9zRWFybHlSLm1fbkdhaW5baV0uCisgICAgICAgICAgICB2YWx1ZTE2ID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseUwubV9uR2FpbltpXQorICAgICAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEocFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5baV0sdmFsdWUxNik7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlSLm1fbkdhaW5baV0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluW2ldLHZhbHVlMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFJldmVyYi0+bV9uRWFybHlHYWluID0gdmFsdWUxNjsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTCwgbV9uRWFybHlHYWluICVkIiwgcFJldmVyYi0+bV9uRWFybHlHYWluKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMzIgPSBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIE1BWF9FQVJMWV9USU1FCisgICAgICAgICAgICAvLyBjb252ZXJ0IG1zIHRvIHRpbWUgdW5pdHMKKyAgICAgICAgICAgIHRlbXAgPSAodmFsdWUzMiAqIDY1NTM2KSAvIDEwMDA7CisgICAgICAgICAgICBpZiAodGVtcCA8IDAgfHwgdGVtcCA+IE1BWF9FQVJMWV9USU1FKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfRUFSTFlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgPj4gMTY7CisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IHRlbXAgKyAoKChpbnQzMl90KSBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNik7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAyID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5TC5tX3pEZWxheVtpXSA9IHBSZXZlcmItPm1fbkVhcmx5MGluICsgdGVtcDI7CisgICAgICAgICAgICAgICAgdGVtcDIgPSB0ZW1wICsgKCgoaW50MzJfdCkgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wMiA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gbWF4U2FtcGxlczsKKyAgICAgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseVIubV96RGVsYXlbaV0gPSBwUmV2ZXJiLT5tX25FYXJseTFpbiArIHRlbXAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFJldmVyYi0+bV9uRWFybHlEZWxheSA9IHRlbXA7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWSwgbV9uRWFybHlEZWxheSBzbXBzICVkIG1heCBzbXAgZGVsYXkgJWQiLCBwUmV2ZXJiLT5tX25FYXJseURlbGF5LCBtYXhTYW1wbGVzKTsKKworICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaXNlY29uZHMgdG8gc2FtcGxlIGNvdW50ID0+IG1fbkVhcmx5RGVsYXkKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPnJldmVyYkxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIDAgYmVjYXVzZSBnYWluIGlzIGxpbWl0ZWQgdG8gMGRCCisgICAgICAgICAgICBpZiAodmFsdWUxNiA+IDAgfHwgdmFsdWUxNiA8IC02MDAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaWJlbHMgdG8gbGluZWFyIDE2IGJpdHMgKGdhbmdlIDAgLSA4MTkxKSA9PiBtX25MYXRlR2Fpbi4KKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkxhdGVHYWluID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpID4+IDI7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwsIG1fbkxhdGVHYWluICVkIiwgcFJldmVyYi0+bV9uTGF0ZUdhaW4pOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMzIgPSBwUHJvcGVydGllcy0+cmV2ZXJiRGVsYXk7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CisgICAgICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgdG8gTUFYX0RFTEFZX1RJTUUKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgbXMgdG8gdGltZSB1bml0cworICAgICAgICAgICAgdGVtcCA9ICh2YWx1ZTMyICogNjU1MzYpIC8gMTAwMDsKKyAgICAgICAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gTUFYX0RFTEFZX1RJTUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIG1heFNhbXBsZXMgPSAoaW50MzJfdCkgKE1BWF9ERUxBWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgICAgICAgICA+PiAxNjsKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgICAgICBpZiAoKHRlbXAgKyBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24pID4gbWF4U2FtcGxlcykgeworICAgICAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzIC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlbXAgPCBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24pIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wIC09IHBSZXZlcmItPm1fbkxhdGVEZWxheTsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5ME91dCArPSB0ZW1wOworICAgICAgICAgICAgcFJldmVyYi0+bV9uRGVsYXkxT3V0ICs9IHRlbXA7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25MYXRlRGVsYXkgKz0gdGVtcDsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWSwgbV9uTGF0ZURlbGF5IHNtcHMgJWQgbWF4IHNtcCBkZWxheSAlZCIsIHBSZXZlcmItPm1fbkxhdGVEZWxheSwgbWF4U2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvIHNhbXBsZSBjb3VudCA9PiBtX25EZWxheTFPdXQgKyBtX25NYXhFeGN1cnNpb24KKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPmRpZmZ1c2lvbjsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgICAgIGlmICh2YWx1ZTE2IDwgMCB8fCB2YWx1ZTE2ID4gMTAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLy8gQ29udmVydCBwZXIgbWlsbGUgdG8gbV9zQXAwLm1fbkFwR2FpbiwgbV9zQXAxLm1fbkFwR2FpbgorICAgICAgICAgICAgcFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiA9IEFQMF9HQUlOX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYKKyAgICAgICAgICAgICAgICAgICAgKiBBUDBfR0FJTl9SQU5HRSkgLyAxMDAwOworICAgICAgICAgICAgcFJldmVyYi0+bV9zQXAxLm1fbkFwR2FpbiA9IEFQMV9HQUlOX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYKKyAgICAgICAgICAgICAgICAgICAgKiBBUDFfR0FJTl9SQU5HRSkgLyAxMDAwOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fRElGRlVTSU9OLCBtX3NBcDAubV9uQXBHYWluICVkIG1fc0FwMS5tX25BcEdhaW4gJWQiLCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluLCBwUmV2ZXJiLT5tX3NBcDEubV9uQXBHYWluKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ESUZGVVNJT04pCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+ZGVuc2l0eTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6CisgICAgICAgICAgICBpZiAodmFsdWUxNiA8IDAgfHwgdmFsdWUxNiA+IDEwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgcGVyIG1pbGxlIHRvIG1fc0FwMC5tX3pBcE91dCwgbV9zQXAxLm1fekFwT3V0CisgICAgICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfQVBfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisKKyAgICAgICAgICAgIHRlbXAgPSBBUDBfVElNRV9CQVNFICsgKChpbnQzMl90KSB2YWx1ZTE2ICogQVAwX1RJTUVfUkFOR0UpIC8gMTAwMDsKKyAgICAgICAgICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlczsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMC5tX3pBcEluICsgdGVtcCk7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERU5TSVRZLCBBcDAgZGVsYXkgc21wcyAlZCIsIHRlbXApOworCisgICAgICAgICAgICB0ZW1wID0gQVAxX1RJTUVfQkFTRSArICgoaW50MzJfdCkgdmFsdWUxNiAqIEFQMV9USU1FX1JBTkdFKSAvIDEwMDA7CisgICAgICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgICAgICBpZiAodGVtcCA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NBcDEubV96QXBPdXQgPSAodWludDE2X3QpIChwUmV2ZXJiLT5tX3NBcDEubV96QXBJbiArIHRlbXApOworCisgICAgICAgICAgICBMT0dWKCJBcDEgZGVsYXkgc21wcyAlZCIsIHRlbXApOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIFJldmVyYl9zZXRQYXJhbWV0ZXIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJVcGRhdGVYZmFkZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogVXBkYXRlIHRoZSB4ZmFkZSBwYXJhbWV0ZXJzIGFzIHJlcXVpcmVkCisgKgorICogSW5wdXRzOgorICogbk51bVNhbXBsZXNUb0FkZCAtIG51bWJlciBvZiBzYW1wbGVzIHRvIHdyaXRlIHRvIGJ1ZmZlcgorICoKKyAqIE91dHB1dHM6CisgKgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqIC0geGZhZGUgcGFyYW1ldGVycyB3aWxsIGJlIGNoYW5nZWQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBSZXZlcmJVcGRhdGVYZmFkZShyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludCBuTnVtU2FtcGxlc1RvQWRkKSB7CisgICAgdWludDE2X3Qgbk9mZnNldDsKKyAgICBpbnQxNl90IHRlbXBDb3M7CisgICAgaW50MTZfdCB0ZW1wU2luOworCisgICAgaWYgKHBSZXZlcmItPm1fblhmYWRlQ291bnRlciA+PSBwUmV2ZXJiLT5tX25YZmFkZUludGVydmFsKSB7CisgICAgICAgIC8qIHVwZGF0ZSBpbnRlcnZhbCBoYXMgZWxhcHNlZCwgc28gcmVzZXQgY291bnRlciAqLworICAgICAgICBwUmV2ZXJiLT5tX25YZmFkZUNvdW50ZXIgPSAwOworCisgICAgICAgIC8vIFBpbiB0aGUgc2luLGNvcyB2YWx1ZXMgdG8gbWluIC8gbWF4IHZhbHVlcyB0byBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgLy8gbW9kdWxhdGVkIHRhcHMnIGNvZWZzIGFyZSB6ZXJvICh0aHVzIG5vIGNsaWNrcykKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fblBoYXNlSW5jcmVtZW50ID4gMCkgeworICAgICAgICAgICAgLy8gaWYgcGhhc2UgaW5jcmVtZW50ID4gMCwgdGhlbiBzaW4gLT4gMSwgY29zIC0+IDAKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblNpbiA9IDMyNzY3OworICAgICAgICAgICAgcFJldmVyYi0+bV9uQ29zID0gMDsKKworICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHBoYXNlIHRvIG1hdGNoIHRoZSBzaW4sIGNvcyB2YWx1ZXMKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblBoYXNlID0gMzI3Njc7CisKKyAgICAgICAgICAgIC8vIG1vZHVsYXRlIHRoZSBjcm9zcyB0YXBzIGJlY2F1c2UgdGhlaXIgdGFwIGNvZWZzIGFyZSB6ZXJvCisgICAgICAgICAgICBuT2Zmc2V0ID0gUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocFJldmVyYik7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fekQxQ3Jvc3MgPSBwUmV2ZXJiLT5tX25EZWxheTFPdXQKKyAgICAgICAgICAgICAgICAgICAgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24gKyBuT2Zmc2V0OworCisgICAgICAgICAgICBuT2Zmc2V0ID0gUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocFJldmVyYik7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fekQwQ3Jvc3MgPSBwUmV2ZXJiLT5tX25EZWxheTBPdXQKKyAgICAgICAgICAgICAgICAgICAgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24gLSBuT2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgcGhhc2UgaW5jcmVtZW50IDwgMCwgdGhlbiBzaW4gLT4gMCwgY29zIC0+IDEKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblNpbiA9IDA7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25Db3MgPSAzMjc2NzsKKworICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHBoYXNlIHRvIG1hdGNoIHRoZSBzaW4sIGNvcyB2YWx1ZXMKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblBoYXNlID0gLTMyNzY4OworCisgICAgICAgICAgICAvLyBtb2R1bGF0ZSB0aGUgc2VsZiB0YXBzIGJlY2F1c2UgdGhlaXIgdGFwIGNvZWZzIGFyZSB6ZXJvCisgICAgICAgICAgICBuT2Zmc2V0ID0gUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocFJldmVyYik7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fekQwU2VsZiA9IHBSZXZlcmItPm1fbkRlbGF5ME91dAorICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbiAtIG5PZmZzZXQ7CisKKyAgICAgICAgICAgIG5PZmZzZXQgPSBSZXZlcmJDYWxjdWxhdGVOb2lzZShwUmV2ZXJiKTsKKworICAgICAgICAgICAgcFJldmVyYi0+bV96RDFTZWxmID0gcFJldmVyYi0+bV9uRGVsYXkxT3V0CisgICAgICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uICsgbk9mZnNldDsKKworICAgICAgICB9IC8vIGVuZCBpZi1lbHNlIChwUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudCA+IDApCisKKyAgICAgICAgLy8gUmV2ZXJzZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzaW4sY29zIHNvIHRoYXQgdGhlCisgICAgICAgIC8vIHRhcCB3aG9zZSBjb2VmIHdhcyBwcmV2aW91c2x5IGluY3JlYXNpbmcgbm93IGRlY3JlYXNlcworICAgICAgICAvLyBhbmQgdmljZSB2ZXJzYQorICAgICAgICBwUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudCA9IC1wUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudDsKKworICAgIH0gLy8gZW5kIGlmIGNvdW50ZXIgPj0gdXBkYXRlIGludGVydmFsCisKKyAgICAvL2NvbXB1dGUgd2hhdCBwaGFzZSB3aWxsIGJlIG5leHQgdGltZQorICAgIHBSZXZlcmItPm1fblBoYXNlICs9IHBSZXZlcmItPm1fblBoYXNlSW5jcmVtZW50OworCisgICAgLy9jYWxjdWxhdGUgd2hhdCB0aGUgbmV3IHNpbiBhbmQgY29zIG5lZWQgdG8gcmVhY2ggYnkgdGhlIG5leHQgdXBkYXRlCisgICAgUmV2ZXJiQ2FsY3VsYXRlU2luQ29zKHBSZXZlcmItPm1fblBoYXNlLCAmdGVtcFNpbiwgJnRlbXBDb3MpOworCisgICAgLy9jYWxjdWxhdGUgdGhlIHBlci1zYW1wbGUgaW5jcmVtZW50IHJlcXVpcmVkIHRvIGdldCB0aGVyZSBieSB0aGUgbmV4dCB1cGRhdGUKKyAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICBwUmV2ZXJiLT5tX25TaW5JbmNyZW1lbnQgPSAodGVtcFNpbiAtIHBSZXZlcmItPm1fblNpbikKKyAgICAgICAgICAgID4+IHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0czsKKworICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgIHBSZXZlcmItPm1fbkNvc0luY3JlbWVudCA9ICh0ZW1wQ29zIC0gcFJldmVyYi0+bV9uQ29zKQorICAgICAgICAgICAgPj4gcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzOworCisgICAgLyogaW5jcmVtZW50IHVwZGF0ZSBjb3VudGVyICovCisgICAgcFJldmVyYi0+bV9uWGZhZGVDb3VudGVyICs9ICh1aW50MTZfdCkgbk51bVNhbXBsZXNUb0FkZDsKKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBSZXZlcmJVcGRhdGVYZmFkZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYkNhbGN1bGF0ZU5vaXNlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBDYWxjdWxhdGUgYSBub2lzZSBzYW1wbGUgYW5kIGxpbWl0IGl0cyB2YWx1ZQorICoKKyAqIElucHV0czoKKyAqIG5NYXhFeGN1cnNpb24gLSBub2lzZSB2YWx1ZSBpcyBsaW1pdGVkIHRvIHRoaXMgdmFsdWUKKyAqIHBuTm9pc2UgLSByZXR1cm4gbmV3IG5vaXNlIHNhbXBsZSBpbiB0aGlzIChub3QgbGltaXRlZCkKKyAqCisgKiBPdXRwdXRzOgorICogbmV3IGxpbWl0ZWQgbm9pc2UgdmFsdWUKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtICpwbk5vaXNlIG5vaXNlIHZhbHVlIGlzIHVwZGF0ZWQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHVpbnQxNl90IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYikgeworICAgIGludDE2X3Qgbk5vaXNlID0gcFJldmVyYi0+bV9uTm9pc2U7CisKKyAgICAvLyBjYWxjdWxhdGUgbmV3IG5vaXNlIHZhbHVlCisgICAgaWYgKHBSZXZlcmItPm1fYlVzZU5vaXNlKSB7CisgICAgICAgIG5Ob2lzZSA9IChpbnQxNl90KSAobk5vaXNlICogNSArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIG5Ob2lzZSA9IDA7CisgICAgfQorCisgICAgcFJldmVyYi0+bV9uTm9pc2UgPSBuTm9pc2U7CisgICAgLy8gcmV0dXJuIHRoZSBsaW1pdGVkIG5vaXNlIHZhbHVlCisgICAgcmV0dXJuIChwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24gJiBuTm9pc2UpOworCit9IC8qIGVuZCBSZXZlcmJDYWxjdWxhdGVOb2lzZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYkNhbGN1bGF0ZVNpbkNvcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogQ2FsY3VsYXRlIGEgbmV3IHNpbiBhbmQgY29zaW5lIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBwaGFzZQorICoKKyAqIElucHV0czoKKyAqIG5QaGFzZSAgIC0gcGhhc2UgYW5nbGUKKyAqIHBuU2luICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKiBwbkNvcyAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICoKKyAqIE91dHB1dHM6CisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSAqcG5TaW4sICpwbkNvcyBhcmUgdXBkYXRlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IFJldmVyYkNhbGN1bGF0ZVNpbkNvcyhpbnQxNl90IG5QaGFzZSwgaW50MTZfdCAqcG5TaW4sIGludDE2X3QgKnBuQ29zKSB7CisgICAgaW50MzJfdCBuVGVtcDsKKyAgICBpbnQzMl90IG5OZXRBbmdsZTsKKworICAgIC8vICAtMSA8PSAgblBoYXNlICA8IDEKKyAgICAvLyBIb3dldmVyLCBmb3IgdGhlIGNhbGN1bGF0aW9uLCB3ZSBuZWVkIGEgdmFsdWUKKyAgICAvLyB0aGF0IHJhbmdlcyBmcm9tIC0xLzIgdG8gKzEvMiwgc28gZGl2aWRlIHRoZSBwaGFzZSBieSAyCisgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgbk5ldEFuZ2xlID0gblBoYXNlID4+IDE7CisKKyAgICAvKgorICAgICBJbXBsZW1lbnQgdGhlIGZvbGxvd2luZworICAgICBzaW4oeCkgPSAoMi00KmMpKnheMiArIGMgKyB4CisgICAgIGNvcyh4KSA9ICgyLTQqYykqeF4yICsgYyAtIHgKKworICAgICB3aGVyZSAgYyA9IDEvc3FydCgyKQorICAgICB1c2luZyB0aGUgYTAgKyB4KihhMSArIHgqYTIpIGFwcHJvYWNoCisgICAgICovCisKKyAgICAvKiBsaW1pdCB0aGUgaW5wdXQgImFuZ2xlIiB0byBiZSBiZXR3ZWVuIC0wLjUgYW5kICswLjUgKi8KKyAgICBpZiAobk5ldEFuZ2xlID4gRUcxX0hBTEYpIHsKKyAgICAgICAgbk5ldEFuZ2xlID0gRUcxX0hBTEY7CisgICAgfSBlbHNlIGlmIChuTmV0QW5nbGUgPCBFRzFfTUlOVVNfSEFMRikgeworICAgICAgICBuTmV0QW5nbGUgPSBFRzFfTUlOVVNfSEFMRjsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgc2luICovCisgICAgblRlbXAgPSBFRzFfT05FICsgTVVMVF9FRzFfRUcxKFJFVkVSQl9QQU5fRzIsIG5OZXRBbmdsZSk7CisgICAgblRlbXAgPSBSRVZFUkJfUEFOX0cwICsgTVVMVF9FRzFfRUcxKG5UZW1wLCBuTmV0QW5nbGUpOworICAgICpwblNpbiA9IChpbnQxNl90KSBTQVRVUkFURV9FRzEoblRlbXApOworCisgICAgLyogY2FsY3VsYXRlIGNvcyAqLworICAgIG5UZW1wID0gLUVHMV9PTkUgKyBNVUxUX0VHMV9FRzEoUkVWRVJCX1BBTl9HMiwgbk5ldEFuZ2xlKTsKKyAgICBuVGVtcCA9IFJFVkVSQl9QQU5fRzAgKyBNVUxUX0VHMV9FRzEoblRlbXAsIG5OZXRBbmdsZSk7CisgICAgKnBuQ29zID0gKGludDE2X3QpIFNBVFVSQVRFX0VHMShuVGVtcCk7CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIFJldmVyYkNhbGN1bGF0ZVNpbkNvcyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogYXBwbHkgcmV2ZXJiIHRvIHRoZSBnaXZlbiBzaWduYWwKKyAqCisgKiBJbnB1dHM6CisgKiBuTnUKKyAqIHBuU2luICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKiBwbkNvcyAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICoKKyAqIE91dHB1dHM6CisgKiBudW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZXZlcmJlcmF0ZWQKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgUmV2ZXJiKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50IG5OdW1TYW1wbGVzVG9BZGQsCisgICAgICAgIHNob3J0ICpwT3V0cHV0QnVmZmVyLCBzaG9ydCAqcElucHV0QnVmZmVyKSB7CisgICAgaW50MzJfdCBpOworICAgIGludDMyX3QgbkRlbGF5T3V0MDsKKyAgICBpbnQzMl90IG5EZWxheU91dDE7CisgICAgdWludDE2X3QgbkJhc2U7CisKKyAgICB1aW50MzJfdCBuQWRkcjsKKyAgICBpbnQzMl90IG5UZW1wMTsKKyAgICBpbnQzMl90IG5UZW1wMjsKKyAgICBpbnQzMl90IG5BcEluOworICAgIGludDMyX3QgbkFwT3V0OworCisgICAgaW50MzJfdCBqOworICAgIGludDMyX3QgbkVhcmx5T3V0OworCisgICAgaW50MzJfdCB0ZW1wVmFsdWU7CisKKyAgICAvLyBnZXQgdGhlIGJhc2UgYWRkcmVzcworICAgIG5CYXNlID0gcFJldmVyYi0+bV9uQmFzZUluZGV4OworCisgICAgZm9yIChpID0gMDsgaSA8IG5OdW1TYW1wbGVzVG9BZGQ7IGkrKykgeworICAgICAgICAvLyAqKioqKioqKioqIExlZnQgQWxscGFzcyAtIHN0YXJ0CisgICAgICAgIG5BcEluID0gKnBJbnB1dEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFwUmV2ZXJiLT5tX0F1eCkgeworICAgICAgICAgICAgcElucHV0QnVmZmVyKys7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RvcmUgdG8gZWFybHkgZGVsYXkgbGluZQorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX25FYXJseTBpbiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl0gPSAoc2hvcnQpIG5BcEluOworCisgICAgICAgIC8vIGxlZnQgaW5wdXQgPSAobGVmdCBkcnkgKiBtX25MYXRlR2FpbikgKyByaWdodCBmZWVkYmFjayBmcm9tIHByZXZpb3VzIHBlcmlvZAorCisgICAgICAgIG5BcEluID0gU0FUVVJBVEUobkFwSW4gKyBwUmV2ZXJiLT5tX25SZXZGYmtSKTsKKyAgICAgICAgbkFwSW4gPSBNVUxUX0VHMV9FRzEobkFwSW4sIHBSZXZlcmItPm1fbkxhdGVHYWluKTsKKworICAgICAgICAvLyBmZXRjaCBhbGxwYXNzIGRlbGF5IGxpbmUgb3V0CisgICAgICAgIC8vbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcHNBcDAtPm1fekFwT3V0LCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgbkFkZHIKKyAgICAgICAgICAgICAgICA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3NBcDAubV96QXBPdXQsIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBuRGVsYXlPdXQwID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgYWxscGFzcyBmZWVkZm9yd2FyZDsgc3VidHJhY3QgdGhlIGZlZWRmb3J3YXJkIHJlc3VsdAorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkFwSW4sIHBSZXZlcmItPm1fc0FwMC5tX25BcEdhaW4pOworICAgICAgICBuQXBPdXQgPSBTQVRVUkFURShuRGVsYXlPdXQwIC0gblRlbXAxKTsgLy8gYWxscGFzcyBvdXRwdXQKKworICAgICAgICAvLyBjYWxjdWxhdGUgYWxscGFzcyBmZWVkYmFjazsgYWRkIHRoZSBmZWVkYmFjayByZXN1bHQKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5BcE91dCwgcFJldmVyYi0+bV9zQXAwLm1fbkFwR2Fpbik7CisgICAgICAgIG5UZW1wMSA9IFNBVFVSQVRFKG5BcEluICsgblRlbXAxKTsKKworICAgICAgICAvLyBpbmplY3QgaW50byBhbGxwYXNzIGRlbGF5CisgICAgICAgIG5BZGRyCisgICAgICAgICAgICAgICAgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9zQXAwLm1fekFwSW4sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdID0gKHNob3J0KSBuVGVtcDE7CisKKyAgICAgICAgLy8gaW5qZWN0IGFsbHBhc3Mgb3V0cHV0IGludG8gZGVsYXkgbGluZQorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3pEMEluLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXSA9IChzaG9ydCkgbkFwT3V0OworCisgICAgICAgIC8vICoqKioqKioqKiogTGVmdCBBbGxwYXNzIC0gZW5kCisKKyAgICAgICAgLy8gKioqKioqKioqKiBSaWdodCBBbGxwYXNzIC0gc3RhcnQKKyAgICAgICAgbkFwSW4gPSAoKnBJbnB1dEJ1ZmZlcisrKTsKKyAgICAgICAgLy8gc3RvcmUgdG8gZWFybHkgZGVsYXkgbGluZQorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX25FYXJseTFpbiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl0gPSAoc2hvcnQpIG5BcEluOworCisgICAgICAgIC8vIHJpZ2h0IGlucHV0ID0gKHJpZ2h0IGRyeSAqIG1fbkxhdGVHYWluKSArIGxlZnQgZmVlZGJhY2sgZnJvbSBwcmV2aW91cyBwZXJpb2QKKyAgICAgICAgLypsaW50IC1lezcwMn0gdXNlIHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgICAgICBuQXBJbiA9IFNBVFVSQVRFKG5BcEluICsgcFJldmVyYi0+bV9uUmV2RmJrTCk7CisgICAgICAgIG5BcEluID0gTVVMVF9FRzFfRUcxKG5BcEluLCBwUmV2ZXJiLT5tX25MYXRlR2Fpbik7CisKKyAgICAgICAgLy8gZmV0Y2ggYWxscGFzcyBkZWxheSBsaW5lIG91dAorICAgICAgICBuQWRkcgorICAgICAgICAgICAgICAgID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fc0FwMS5tX3pBcE91dCwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIG5EZWxheU91dDEgPSBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBhbGxwYXNzIGZlZWRmb3J3YXJkOyBzdWJ0cmFjdCB0aGUgZmVlZGZvcndhcmQgcmVzdWx0CisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuQXBJbiwgcFJldmVyYi0+bV9zQXAxLm1fbkFwR2Fpbik7CisgICAgICAgIG5BcE91dCA9IFNBVFVSQVRFKG5EZWxheU91dDEgLSBuVGVtcDEpOyAvLyBhbGxwYXNzIG91dHB1dAorCisgICAgICAgIC8vIGNhbGN1bGF0ZSBhbGxwYXNzIGZlZWRiYWNrOyBhZGQgdGhlIGZlZWRiYWNrIHJlc3VsdAorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkFwT3V0LCBwUmV2ZXJiLT5tX3NBcDEubV9uQXBHYWluKTsKKyAgICAgICAgblRlbXAxID0gU0FUVVJBVEUobkFwSW4gKyBuVGVtcDEpOworCisgICAgICAgIC8vIGluamVjdCBpbnRvIGFsbHBhc3MgZGVsYXkKKyAgICAgICAgbkFkZHIKKyAgICAgICAgICAgICAgICA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3NBcDEubV96QXBJbiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl0gPSAoc2hvcnQpIG5UZW1wMTsKKworICAgICAgICAvLyBpbmplY3QgYWxscGFzcyBvdXRwdXQgaW50byBkZWxheSBsaW5lCisgICAgICAgIG5BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fekQxSW4sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdID0gKHNob3J0KSBuQXBPdXQ7CisKKyAgICAgICAgLy8gKioqKioqKioqKiBSaWdodCBBbGxwYXNzIC0gZW5kCisKKyAgICAgICAgLy8gKioqKioqKioqKiBEMCBvdXRwdXQgLSBzdGFydAorICAgICAgICAvLyBmZXRjaCBkZWxheSBsaW5lIHNlbGYgb3V0CisgICAgICAgIG5BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fekQwU2VsZiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIG5EZWxheU91dDAgPSBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZWxheSBsaW5lIHNlbGYgb3V0CisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQwLCBwUmV2ZXJiLT5tX25TaW4pOworCisgICAgICAgIC8vIGZldGNoIGRlbGF5IGxpbmUgY3Jvc3Mgb3V0CisgICAgICAgIG5BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fekQxQ3Jvc3MsIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBuRGVsYXlPdXQwID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZGVsYXkgbGluZSBzZWxmIG91dAorICAgICAgICBuVGVtcDIgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MCwgcFJldmVyYi0+bV9uQ29zKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgdW5maWx0ZXJlZCBkZWxheSBvdXQKKyAgICAgICAgbkRlbGF5T3V0MCA9IFNBVFVSQVRFKG5UZW1wMSArIG5UZW1wMik7CisKKyAgICAgICAgLy8gKioqKioqKioqKiBEMCBvdXRwdXQgLSBlbmQKKworICAgICAgICAvLyAqKioqKioqKioqIEQxIG91dHB1dCAtIHN0YXJ0CisgICAgICAgIC8vIGZldGNoIGRlbGF5IGxpbmUgc2VsZiBvdXQKKyAgICAgICAgbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV96RDFTZWxmLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgbkRlbGF5T3V0MSA9IHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl07CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRlbGF5IGxpbmUgc2VsZiBvdXQKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5EZWxheU91dDEsIHBSZXZlcmItPm1fblNpbik7CisKKyAgICAgICAgLy8gZmV0Y2ggZGVsYXkgbGluZSBjcm9zcyBvdXQKKyAgICAgICAgbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV96RDBDcm9zcywgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIG5EZWxheU91dDEgPSBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZWxheSBsaW5lIHNlbGYgb3V0CisgICAgICAgIG5UZW1wMiA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQxLCBwUmV2ZXJiLT5tX25Db3MpOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSB1bmZpbHRlcmVkIGRlbGF5IG91dAorICAgICAgICBuRGVsYXlPdXQxID0gU0FUVVJBVEUoblRlbXAxICsgblRlbXAyKTsKKworICAgICAgICAvLyAqKioqKioqKioqIEQxIG91dHB1dCAtIGVuZAorCisgICAgICAgIC8vICoqKioqKioqKiogbWl4ZXIgYW5kIGZlZWRiYWNrIC0gc3RhcnQKKyAgICAgICAgLy8gc3VtIGlzIGZlZGJhY2sgdG8gcmlnaHQgaW5wdXQgKFIgKyBMKQorICAgICAgICBuRGVsYXlPdXQwID0gKHNob3J0KSBTQVRVUkFURShuRGVsYXlPdXQwICsgbkRlbGF5T3V0MSk7CisKKyAgICAgICAgLy8gZGlmZmVyZW5jZSBpcyBmZWVkYmFjayB0byBsZWZ0IGlucHV0IChSIC0gTCkKKyAgICAgICAgLypsaW50IC1lezY4NX0gbGludCBjb21wbGFpbnMgdGhhdCBpdCBjYW4ndCBzYXR1cmF0ZSBuZWdhdGl2ZSAqLworICAgICAgICBuRGVsYXlPdXQxID0gKHNob3J0KSBTQVRVUkFURShuRGVsYXlPdXQxIC0gbkRlbGF5T3V0MCk7CisKKyAgICAgICAgLy8gKioqKioqKioqKiBtaXhlciBhbmQgZmVlZGJhY2sgLSBlbmQKKworICAgICAgICAvLyBjYWxjdWxhdGUgbG93cGFzcyBmaWx0ZXIgKG1peGVyIHNjYWxlIGZhY3RvciBpbmNsdWRlZCBpbiBMUEYgZmVlZGZvcndhcmQpCisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQwLCBwUmV2ZXJiLT5tX25SdmJMcGZGd2QpOworCisgICAgICAgIG5UZW1wMiA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX25SZXZGYmtMLCBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBmaWx0ZXJlZCBkZWxheSBvdXQgYW5kIHNpbXVsdGFuZW91c2x5IHVwZGF0ZSBMUEYgc3RhdGUgdmFyaWFibGUKKyAgICAgICAgLy8gZmlsdGVyZWQgZGVsYXkgb3V0cHV0IGlzIHN0b3JlZCBpbiBtX25SZXZGYmtMCisgICAgICAgIHBSZXZlcmItPm1fblJldkZia0wgPSAoc2hvcnQpIFNBVFVSQVRFKG5UZW1wMSArIG5UZW1wMik7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGxvd3Bhc3MgZmlsdGVyIChtaXhlciBzY2FsZSBmYWN0b3IgaW5jbHVkZWQgaW4gTFBGIGZlZWRmb3J3YXJkKQorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MSwgcFJldmVyYi0+bV9uUnZiTHBmRndkKTsKKworICAgICAgICBuVGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUmV2RmJrUiwgcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZmlsdGVyZWQgZGVsYXkgb3V0IGFuZCBzaW11bHRhbmVvdXNseSB1cGRhdGUgTFBGIHN0YXRlIHZhcmlhYmxlCisgICAgICAgIC8vIGZpbHRlcmVkIGRlbGF5IG91dHB1dCBpcyBzdG9yZWQgaW4gbV9uUmV2RmJrUgorICAgICAgICBwUmV2ZXJiLT5tX25SZXZGYmtSID0gKHNob3J0KSBTQVRVUkFURShuVGVtcDEgKyBuVGVtcDIpOworCisgICAgICAgIC8vICoqKioqKioqKiogc3RhcnQgZWFybHkgcmVmbGVjdGlvbiBnZW5lcmF0b3IsIGxlZnQKKyAgICAgICAgLy9wc0Vhcmx5ID0gJihwUmV2ZXJiLT5tX3NFYXJseUwpOworCisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBqKyspIHsKKyAgICAgICAgICAgIC8vIGZldGNoIGRlbGF5IGxpbmUgb3V0CisgICAgICAgICAgICAvL25BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBzRWFybHktPm1fekRlbGF5W2pdLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgICAgIG5BZGRyCisgICAgICAgICAgICAgICAgICAgID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fc0Vhcmx5TC5tX3pEZWxheVtqXSwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisKKyAgICAgICAgICAgIG5UZW1wMSA9IHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl07CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSByZWZsZWN0aW9uCisgICAgICAgICAgICAvL25UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQwLCBwc0Vhcmx5LT5tX25HYWluW2pdKTsKKyAgICAgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuVGVtcDEsIHBSZXZlcmItPm1fc0Vhcmx5TC5tX25HYWluW2pdKTsKKworICAgICAgICAgICAgbkRlbGF5T3V0MCA9IFNBVFVSQVRFKG5EZWxheU91dDAgKyBuVGVtcDEpOworCisgICAgICAgIH0gLy8gZW5kIGZvciAoaj0wOyBqIDwgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlM7IGorKykKKworICAgICAgICAvLyBhcHBseSBsb3dwYXNzIHRvIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCByZXZlcmIgb3V0cHV0CisgICAgICAgIC8vblRlbXAxID0gTVVMVF9FRzFfRUcxKG5FYXJseU91dCwgcHNFYXJseS0+bV9uUnZiTHBmRndkKTsKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5EZWxheU91dDAsIHBSZXZlcmItPm1fblJvb21McGZGd2QpOworCisgICAgICAgIC8vblRlbXAyID0gTVVMVF9FRzFfRUcxKHBzRWFybHktPm1fekxwZiwgcHNFYXJseS0+bV9uTHBmRmJrKTsKKyAgICAgICAgblRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fek91dExwZkwsIHBSZXZlcmItPm1fblJvb21McGZGYmspOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBmaWx0ZXJlZCBvdXQgYW5kIHNpbXVsdGFuZW91c2x5IHVwZGF0ZSBMUEYgc3RhdGUgdmFyaWFibGUKKyAgICAgICAgLy8gZmlsdGVyZWQgb3V0cHV0IGlzIHN0b3JlZCBpbiBtX3pPdXRMcGZMCisgICAgICAgIHBSZXZlcmItPm1fek91dExwZkwgPSAoc2hvcnQpIFNBVFVSQVRFKG5UZW1wMSArIG5UZW1wMik7CisKKyAgICAgICAgLy9zdW0gd2l0aCBvdXRwdXQgYnVmZmVyCisgICAgICAgIHRlbXBWYWx1ZSA9ICpwT3V0cHV0QnVmZmVyOworICAgICAgICAqcE91dHB1dEJ1ZmZlcisrID0gKHNob3J0KSBTQVRVUkFURSh0ZW1wVmFsdWUrcFJldmVyYi0+bV96T3V0THBmTCk7CisKKyAgICAgICAgLy8gKioqKioqKioqKiBlbmQgZWFybHkgcmVmbGVjdGlvbiBnZW5lcmF0b3IsIGxlZnQKKworICAgICAgICAvLyAqKioqKioqKioqIHN0YXJ0IGVhcmx5IHJlZmxlY3Rpb24gZ2VuZXJhdG9yLCByaWdodAorICAgICAgICAvL3BzRWFybHkgPSAmKHBSZXZlcmItPm1fc0Vhcmx5Uik7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBqKyspIHsKKyAgICAgICAgICAgIC8vIGZldGNoIGRlbGF5IGxpbmUgb3V0CisgICAgICAgICAgICBuQWRkcgorICAgICAgICAgICAgICAgICAgICA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3NFYXJseVIubV96RGVsYXlbal0sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICAgICAgblRlbXAxID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHJlZmxlY3Rpb24KKyAgICAgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuVGVtcDEsIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX25HYWluW2pdKTsKKworICAgICAgICAgICAgbkRlbGF5T3V0MSA9IFNBVFVSQVRFKG5EZWxheU91dDEgKyBuVGVtcDEpOworCisgICAgICAgIH0gLy8gZW5kIGZvciAoaj0wOyBqIDwgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlM7IGorKykKKworICAgICAgICAvLyBhcHBseSBsb3dwYXNzIHRvIGVhcmx5IHJlZmxlY3Rpb25zCisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQxLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkKTsKKworICAgICAgICBuVGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV96T3V0THBmUiwgcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGZpbHRlcmVkIG91dCBhbmQgc2ltdWx0YW5lb3VzbHkgdXBkYXRlIExQRiBzdGF0ZSB2YXJpYWJsZQorICAgICAgICAvLyBmaWx0ZXJlZCBvdXRwdXQgaXMgc3RvcmVkIGluIG1fek91dExwZlIKKyAgICAgICAgcFJldmVyYi0+bV96T3V0THBmUiA9IChzaG9ydCkgU0FUVVJBVEUoblRlbXAxICsgblRlbXAyKTsKKworICAgICAgICAvL3N1bSB3aXRoIG91dHB1dCBidWZmZXIKKyAgICAgICAgdGVtcFZhbHVlID0gKnBPdXRwdXRCdWZmZXI7CisgICAgICAgICpwT3V0cHV0QnVmZmVyKysgPSAoc2hvcnQpIFNBVFVSQVRFKHRlbXBWYWx1ZSArIHBSZXZlcmItPm1fek91dExwZlIpOworCisgICAgICAgIC8vICoqKioqKioqKiogZW5kIGVhcmx5IHJlZmxlY3Rpb24gZ2VuZXJhdG9yLCByaWdodAorCisgICAgICAgIC8vIGRlY3JlbWVudCBiYXNlIGFkZHIgZm9yIG5leHQgc2FtcGxlIHBlcmlvZAorICAgICAgICBuQmFzZS0tOworCisgICAgICAgIHBSZXZlcmItPm1fblNpbiArPSBwUmV2ZXJiLT5tX25TaW5JbmNyZW1lbnQ7CisgICAgICAgIHBSZXZlcmItPm1fbkNvcyArPSBwUmV2ZXJiLT5tX25Db3NJbmNyZW1lbnQ7CisKKyAgICB9IC8vIGVuZCBmb3IgKGk9MDsgaSA8IG5OdW1TYW1wbGVzVG9BZGQ7IGkrKykKKworICAgIC8vIHN0b3JlIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbgorICAgIHBSZXZlcmItPm1fbkJhc2VJbmRleCA9IG5CYXNlOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBSZXZlcmIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJVcGRhdGVSb29tCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBVcGRhdGUgdGhlIHJvb20ncyBwcmVzZXQgcGFyYW1ldGVycyBhcyByZXF1aXJlZAorICoKKyAqIElucHV0czoKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtIHJldmVyYiBwYXJhbXRlcnMgKGZiaywgZndkLCBldGMpIHdpbGwgYmUgY2hhbmdlZAorICogLSBtX25DdXJyZW50Um9vbSA6PSBtX25OZXh0Um9vbQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgUmV2ZXJiVXBkYXRlUm9vbShyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGJvb2wgZnVsbFVwZGF0ZSkgeworICAgIGludCB0ZW1wOworICAgIGludCBpOworICAgIGludCBtYXhTYW1wbGVzOworICAgIGludCBlYXJseURlbGF5OworICAgIGludCBlYXJseUdhaW47CisKKyAgICByZXZlcmJfcHJlc2V0X3QgKnBQcmVzZXQgPQorICAgICAgICAgICAgJnBSZXZlcmItPm1fc1ByZXNldC5tX3NQcmVzZXRbcFJldmVyYi0+bV9uTmV4dFJvb21dOworCisgICAgaWYgKGZ1bGxVcGRhdGUpIHsKKyAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRndkID0gcFByZXNldC0+bV9uUnZiTHBmRndkOworICAgICAgICBwUmV2ZXJiLT5tX25SdmJMcGZGYmsgPSBwUHJlc2V0LT5tX25SdmJMcGZGYms7CisKKyAgICAgICAgcFJldmVyYi0+bV9uRWFybHlHYWluID0gcFByZXNldC0+bV9uRWFybHlHYWluOworICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIHNhbXBsZSBiYXNlZAorICAgICAgICBwUmV2ZXJiLT5tX25MYXRlR2FpbiA9IHBQcmVzZXQtPm1fbkxhdGVHYWluOworICAgICAgICBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrID0gcFByZXNldC0+bV9uUm9vbUxwZkZiazsKKyAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCA9IHBQcmVzZXQtPm1fblJvb21McGZGd2Q7CisKKyAgICAgICAgLy8gc2V0IHRoZSBlYXJseSByZWZsZWN0aW9ucyBnYWlucworICAgICAgICBlYXJseUdhaW4gPSBwUHJlc2V0LT5tX25FYXJseUdhaW47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseUwubV9uR2FpbltpXQorICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMShwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpbltpXSxlYXJseUdhaW4pOworICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlSLm1fbkdhaW5baV0KKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEocFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5baV0sZWFybHlHYWluKTsKKyAgICAgICAgfQorCisgICAgICAgIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbiA9IHBQcmVzZXQtPm1fbk1heEV4Y3Vyc2lvbjsKKworICAgICAgICBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluID0gcFByZXNldC0+bV9uQXAwX0FwR2FpbjsKKyAgICAgICAgcFJldmVyYi0+bV9zQXAxLm1fbkFwR2FpbiA9IHBQcmVzZXQtPm1fbkFwMV9BcEdhaW47CisKKyAgICAgICAgLy8gc2V0IHRoZSBlYXJseSByZWZsZWN0aW9ucyBkZWxheQorICAgICAgICBlYXJseURlbGF5ID0gKChpbnQpIHBQcmVzZXQtPm1fbkVhcmx5RGVsYXkgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgPj4gMTY7CisgICAgICAgIHBSZXZlcmItPm1fbkVhcmx5RGVsYXkgPSBlYXJseURlbGF5OworICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfRUFSTFlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKKyAgICAgICAgICAgICAgICA+PiAxNjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBpKyspIHsKKyAgICAgICAgICAgIC8vc3RvcmVkIGFzIHRpbWUgYmFzZWQsIGNvbnZlcnQgdG8gc2FtcGxlIGJhc2VkCisgICAgICAgICAgICB0ZW1wID0gZWFybHlEZWxheSArICgoKGludCkgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5W2ldCisgICAgICAgICAgICAgICAgICAgICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNik7CisgICAgICAgICAgICBpZiAodGVtcCA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseUwubV96RGVsYXlbaV0gPSBwUmV2ZXJiLT5tX25FYXJseTBpbiArIHRlbXA7CisgICAgICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIHNhbXBsZSBiYXNlZAorICAgICAgICAgICAgdGVtcCA9IGVhcmx5RGVsYXkgKyAoKChpbnQpIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVtpXQorICAgICAgICAgICAgICAgICAgICAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOworICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlSLm1fekRlbGF5W2ldID0gcFJldmVyYi0+bV9uRWFybHkxaW4gKyB0ZW1wOworICAgICAgICB9CisKKyAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0RFTEFZX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgPj4gMTY7CisgICAgICAgIC8vc3RvcmVkIGFzIHRpbWUgYmFzZWQsIGNvbnZlcnQgdG8gc2FtcGxlIGJhc2VkCisgICAgICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgICAgICB0ZW1wID0gKHBQcmVzZXQtPm1fbkxhdGVEZWxheSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgIGlmICgodGVtcCArIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbikgPiBtYXhTYW1wbGVzKSB7CisgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlcyAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wIC09IHBSZXZlcmItPm1fbkxhdGVEZWxheTsKKyAgICAgICAgcFJldmVyYi0+bV9uRGVsYXkwT3V0ICs9IHRlbXA7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5MU91dCArPSB0ZW1wOworICAgICAgICBwUmV2ZXJiLT5tX25MYXRlRGVsYXkgKz0gdGVtcDsKKworICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfQVBfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgIC8vc3RvcmVkIGFzIHRpbWUgYmFzZWQsIGNvbnZlcnQgdG8gYWJzb2x1dGUgc2FtcGxlIHZhbHVlCisgICAgICAgIHRlbXAgPSBwUHJlc2V0LT5tX25BcDBfQXBPdXQ7CisgICAgICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICBpZiAodGVtcCA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlczsKKyAgICAgICAgcFJldmVyYi0+bV9zQXAwLm1fekFwT3V0ID0gKHVpbnQxNl90KSAocFJldmVyYi0+bV9zQXAwLm1fekFwSW4gKyB0ZW1wKTsKKworICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIGFic29sdXRlIHNhbXBsZSB2YWx1ZQorICAgICAgICB0ZW1wID0gcFByZXNldC0+bV9uQXAxX0FwT3V0OworICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7CisgICAgICAgIHBSZXZlcmItPm1fc0FwMS5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMS5tX3pBcEluICsgdGVtcCk7CisgICAgICAgIC8vZ3BzUmV2ZXJiT2JqZWN0LT5tX3NBcDEubV96QXBPdXQgPSBwUHJlc2V0LT5tX25BcDFfQXBPdXQ7CisgICAgfQorCisgICAgLy9zdG9yZWQgYXMgdGltZSBiYXNlZCwgY29udmVydCB0byBzYW1wbGUgYmFzZWQKKyAgICB0ZW1wID0gcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbDsKKyAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgIHBSZXZlcmItPm1fblhmYWRlSW50ZXJ2YWwgPSAodWludDE2X3QpIHRlbXA7CisgICAgLy9nc1JldmVyYk9iamVjdC5tX25YZmFkZUludGVydmFsID0gcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbDsKKyAgICBwUmV2ZXJiLT5tX25YZmFkZUNvdW50ZXIgPSBwUmV2ZXJiLT5tX25YZmFkZUludGVydmFsICsgMTsgLy8gZm9yY2UgdXBkYXRlIG9uIGZpcnN0IGl0ZXJhdGlvbgorCisgICAgcFJldmVyYi0+bV9uQ3VycmVudFJvb20gPSBwUmV2ZXJiLT5tX25OZXh0Um9vbTsKKworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBSZXZlcmJVcGRhdGVSb29tICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiUmVhZEluUHJlc2V0cygpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6IHNldHMgZ2xvYmFsIHJldmVyYiBwcmVzZXQgYmFuayB0byBkZWZhdWx0cworICoKKyAqIElucHV0czoKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IFJldmVyYlJlYWRJblByZXNldHMocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiKSB7CisKKyAgICBpbnQgcHJlc2V0OworCisgICAgLy8gdGhpcyBpcyBmb3IgdGVzdCBvbmx5LiBPcGVuU0wgRVMgcHJlc2V0cyBhcmUgbWFwcGVkIHRvIDQgcHJlc2V0cy4KKyAgICAvLyBSRVZFUkJfUFJFU0VUX05PTkUgaXMgbWFwcGVkIHRvIGJ5cGFzcworICAgIGZvciAocHJlc2V0ID0gMDsgcHJlc2V0IDwgUkVWRVJCX05VTV9QUkVTRVRTOyBwcmVzZXQrKykgeworICAgICAgICByZXZlcmJfcHJlc2V0X3QgKnBQcmVzZXQgPSAmcFJldmVyYi0+bV9zUHJlc2V0Lm1fc1ByZXNldFtwcmVzZXRdOworICAgICAgICBzd2l0Y2ggKHByZXNldCArIDEpIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX1BMQVRFOgorICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfU01BTExST09NOgorICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRmJrID0gNTA3NzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZCA9IDExMDc2OworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlHYWluID0gMjc2OTA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseURlbGF5ID0gMTMxMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVHYWluID0gODE5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVEZWxheSA9IDM5MzI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRmJrID0gMzY5MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGd2QgPSAyMDQ3NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVswXSA9IDEzNzY7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblswXSA9IDIyMTUyOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzFdID0gMTQ2MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVszXSA9IDE4MzU7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblszXSA9IDE0MzA3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMF0gPSA3MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblswXSA9IDIwMzA2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzFdID0gMjYyMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVszXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblszXSA9IDE2MTUzOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25NYXhFeGN1cnNpb24gPSAxMjc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25YZmFkZUludGVydmFsID0gNjQ3MDsgLy82NDgzOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwR2FpbiA9IDE0NzY4OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwT3V0ID0gNzkyOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwR2FpbiA9IDE0Nzc3OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwT3V0ID0gMTE5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTUgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU2ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NyA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTggPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU5ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1MTAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BSRVNFVF9NRURJVU1ST09NOgorICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NOgorICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRmJrID0gNTA3NzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZCA9IDEyOTIyOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlHYWluID0gMjc2OTA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseURlbGF5ID0gMTMxMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVHYWluID0gODE5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVEZWxheSA9IDM5MzI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRmJrID0gMzY5MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGd2QgPSAyMTcwMzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVswXSA9IDEzNzY7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblswXSA9IDIyMTUyOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzFdID0gMTQ2MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVszXSA9IDE4MzU7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblszXSA9IDE0MzA3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMF0gPSA3MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblswXSA9IDIwMzA2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzFdID0gMjYyMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVszXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblszXSA9IDE2MTUzOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25NYXhFeGN1cnNpb24gPSAxMjc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25YZmFkZUludGVydmFsID0gNjQ0OTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcEdhaW4gPSAxNTY5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcE91dCA9IDc3NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcEdhaW4gPSAxNjMxNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcE91dCA9IDExNTU7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTQgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU1ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NiA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTcgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU4ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTEwID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfTUVESVVNSEFMTDoKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDY0NjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjQ1Njk7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDE0NjI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDYzOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTUyMzA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3MDg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTU1NDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMDIzOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX0xBUkdFSEFMTDoKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDgzMDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjQ1Njk7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDIxNjM7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDYzODg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTU2OTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3MTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTYzMTc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMDI5OworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZDE5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmg+CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlZmluZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorQ0lSQ1VMQVIoKSBjYWxjdWxhdGVzIHRoZSBhcnJheSBpbmRleCB1c2luZyBtb2R1bG8gYXJpdGhtZXRpYy4KK1RoZSAidHJpY2siIGlzIHRoYXQgbW9kdWxvIGFyaXRobWV0aWMgaXMgc2ltcGxpZmllZCBieSBtYXNraW5nCit0aGUgZWZmZWN0aXZlIGFkZHJlc3Mgd2hlcmUgdGhlIG1hc2sgaXMgKDJebiktMS4gVGhpcyBvbmx5IHdvcmtzCitpZiB0aGUgYnVmZmVyIHNpemUgaXMgYSBwb3dlciBvZiB0d28uCisqLworI2RlZmluZSBDSVJDVUxBUihiYXNlLG9mZnNldCxzaXplKSAodWludDMyX3QpKCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGJhc2UpKSArICgoaW50MzJfdCkob2Zmc2V0KSkgICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICYgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIE5VTV9PVVRQVVRfQ0hBTk5FTFMgMgorI2RlZmluZSBPVVRQVVRfQ0hBTk5FTFMgQ0hBTk5FTF9TVEVSRU8KKworI2RlZmluZSBSRVZFUkJfQlVGRkVSX1NJWkVfSU5fU0FNUExFU19NQVggICAxNjM4NAorCisjZGVmaW5lIFJFVkVSQl9OVU1fUFJFU0VUUyAgUkVWRVJCX1BSRVNFVF9QTEFURSAgIC8vIFJFVkVSQl9QUkVTRVRfTk9ORSBpcyBub3QgaW5jbHVkZWQKKyNkZWZpbmUgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlMgICAgICA1ICAgLy8gbWF4IG51bSByZWZsZWN0aW9ucyBwZXIgY2hhbm5lbAorCisKKy8vIHhmYWRlIHBhcmFtZXRlcnMKKyNkZWZpbmUgUkVWRVJCX1hGQURFX1BFUklPRF9JTl9TRUNPTkRTICAgICAgKGRvdWJsZSkgKDEwMC4wIC8gMTAwMC4wKSAgICAgICAgLy8geGZhZGUgb25jZSBldmVyeSB0aGlzIG1hbnkgc2Vjb25kcworCisKKy8qKioqKioqKioqLworLyogdGhlIGVudGlyZSBzeW50aCB1c2VzIHZhcmlvdXMgZmxhZ3MgaW4gYSBiaXQgZmllbGQgKi8KKworLyogaWYgZmxhZyBpcyBzZXQsIHN5bnRoIHJlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCAqLworI2RlZmluZSBSRVZFUkJfRkxBR19SRVNFVF9JU19SRVFVRVNURUQgICAgICAgICAgMHgwMSAgICAvKiBiaXQgMCAqLworI2RlZmluZSBNQVNLX1JFVkVSQl9SRVNFVF9JU19SRVFVRVNURUQgICAgICAgICAgMHgwMQorI2RlZmluZSBNQVNLX1JFVkVSQl9SRVNFVF9JU19OT1RfUkVRVUVTVEVEICAgICAgKHVpbnQzMl90KSh+TUFTS19SRVZFUkJfUkVTRVRfSVNfUkVRVUVTVEVEKQorCisvKgorYnkgZGVmYXVsdCwgd2UgYWx3YXlzIHdhbnQgdG8gdXBkYXRlIEFMTCBjaGFubmVsIHBhcmFtZXRlcnMKK3doZW4gd2UgcmVzZXQgdGhlIHN5bnRoIChlLmcuLCBkdXJpbmcgR00gT04pCisqLworI2RlZmluZSBERUZBVUxUX1JFVkVSQl9GTEFHUyAgICAgICAgICAgICAgICAgICAgMHgwCisKKy8qIGNvZWZmaWNpZW50cyBmb3IgZ2VuZXJhdGluZyBzaW4sIGNvcyAqLworI2RlZmluZSBSRVZFUkJfUEFOX0cyICAgNDI5NDk0MDE1MSAgICAgICAgICAvKiAtMC44Mjg0MjcxMjQ3NDYxOSA9IDIgLSA0L3NxcnQoMikgKi8KKy8qCitpbnQzMl90IG5QYW5HMSA9ICsxLjAgZm9yIHNpbgoraW50MzJfdCBuUGFuRzEgPSAtMS4wIGZvciBjb3MKKyovCisjZGVmaW5lIFJFVkVSQl9QQU5fRzAgICAyMzE3MCAgICAgICAgICAgICAgIC8qIDAuNzA3MTA2NzgxMTg2NTQ3ID0gMS9zcXJ0KDIpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gZGVmaW5lIHRoZSBpbnB1dCBpbmplY3Rpb24gcG9pbnRzCisjZGVmaW5lIEdVQVJEICAgICAgICAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FmZXR5IGd1YXJkIG9mIHRoaXMgbWFueSBzYW1wbGVzCisKKyNkZWZpbmUgTUFYX0FQX1RJTUUgICAgICAgICAoaW50KSAoKDIwKjY1NTM2KS8xMDAwKSAgLy8gZGVsYXkgdGltZSBpbiB0aW1lIHVuaXRzICg2NTUzNnRoIG9mIHNlYykKKyNkZWZpbmUgTUFYX0RFTEFZX1RJTUUgICAgICAoaW50KSAoKDY1KjY1NTM2KS8xMDAwKSAgLy8gZGVsYXkgdGltZSBpbiB0aW1lIHVuaXRzCisjZGVmaW5lIE1BWF9FQVJMWV9USU1FICAgICAgKGludCkgKCg2NSo2NTUzNikvMTAwMCkgIC8vIGRlbGF5IHRpbWUgaW4gdGltZSB1bml0cworCisjZGVmaW5lIEFQMF9JTiAgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUk9PTV9OVU1CRVIgICAgICAxICAgICAgIC8vIGRlZmF1bHQgcHJlc2V0IG51bWJlcgorI2RlZmluZSBERUZBVUxUX0FQMF9HQUlOICAgICAgICAgICAgICAgIDE5NDAwCisjZGVmaW5lIERFRkFVTFRfQVAxX0dBSU4gICAgICAgICAgICAgICAgLTE5NDAwCisKKyNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfV0VUICAgICAgICAgICAgICAzMjc2NworI2RlZmluZSBSRVZFUkJfREVGQVVMVF9EUlkgICAgICAgICAgICAgIDAKKworI2RlZmluZSBSRVZFUkJfV0VUX01BWCAgICAgICAgICAgICAgMzI3NjcKKyNkZWZpbmUgUkVWRVJCX1dFVF9NSU4gICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVWRVJCX0RSWV9NQVggICAgICAgICAgICAgIDMyNzY3CisjZGVmaW5lIFJFVkVSQl9EUllfTUlOICAgICAgICAgICAgICAwCisKKy8vIGNvbnN0YW50cyBmb3IgcmV2ZXJiIGRlbnNpdHkKKy8vIFRoZSBkZW5zaXR5IGV4cHJlc3NlZCBpbiBwZXJtaWxsZXMgY2hhbmdlcyB0aGUgQWxscGFzcyBkZWxheSBpbiBhIGxpbmVhciBtYW5uZXIgaW4gdGhlIHJhbmdlIGRlZmluZWQgYnkKKy8vIEFQMF9USU1FX0JBU0UgdG8gQVAwX1RJTUVfQkFTRSArIEFQMF9USU1FX1JBTkdFCisjZGVmaW5lIEFQMF9USU1FX0JBU0UgKGludCkoKDkqNjU1MzYpLzEwMDApCisjZGVmaW5lIEFQMF9USU1FX1JBTkdFIChpbnQpKCg0KjY1NTM2KS8xMDAwKQorI2RlZmluZSBBUDFfVElNRV9CQVNFIChpbnQpKCgxMio2NTUzNikvMTAwMCkKKyNkZWZpbmUgQVAxX1RJTUVfUkFOR0UgKGludCkoKDgqNjU1MzYpLzEwMDApCisKKy8vIGNvbnN0YW50cyBmb3IgcmV2ZXJiIGRpZmZ1c2lvbgorLy8gVGhlIGRpZmZ1c2lvbiBleHByZXNzZWQgaW4gcGVybWlsbGVzIGNoYW5nZXMgdGhlIEFsbHBhc3MgZ2FpbiBpbiBhIGxpbmVhciBtYW5uZXIgaW4gdGhlIHJhbmdlIGRlZmluZWQgYnkKKy8vIEFQMF9HQUlOX0JBU0UgdG8gQVAwX0dBSU5fQkFTRSArIEFQMF9HQUlOX1JBTkdFCisjZGVmaW5lIEFQMF9HQUlOX0JBU0UgKGludCkoOTgzMCkKKyNkZWZpbmUgQVAwX0dBSU5fUkFOR0UgKGludCkoMTk2NjAtOTgzMCkKKyNkZWZpbmUgQVAxX0dBSU5fQkFTRSAoaW50KSg2NTUzKQorI2RlZmluZSBBUDFfR0FJTl9SQU5HRSAoaW50KSgyMjkzNi02NTUzKQorCisKK2VudW0gcmV2ZXJiX3N0YXRlX2UgeworICAgIFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVELAorICAgIFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBSRVZFUkJfU1RBVEVfQUNUSVZFLAorfTsKKworLyogcGFyYW1ldGVycyBmb3IgZWFjaCBhbGxwYXNzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekFwT3V0OyAgICAgICAvLyBkZWxheSBvZmZzZXQgZm9yIGFwIG91dAorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25BcEdhaW47ICAgICAgLy8gZ2FpbiBmb3IgYXAKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekFwSW47ICAgICAgICAvLyBkZWxheSBvZmZzZXQgZm9yIGFwIGluCisKK30gYWxscGFzc19vYmplY3RfdDsKKworCisvKiBwYXJhbWV0ZXJzIGZvciBlYXJseSByZWZsZWN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1fekRlbGF5W1JFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TXTsgICAvLyBkZWxheSBvZmZzZXQgZm9yIGFwIG91dAorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25HYWluW1JFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TXTsgICAgLy8gZ2FpbiBmb3IgYXAKKworfSBlYXJseV9yZWZsZWN0aW9uX29iamVjdF90OworCisvL2RlbW8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25SdmJMcGZGYms7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25SdmJMcGZGd2Q7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25Sb29tTHBmRmJrOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUm9vbUxwZkZ3ZDsKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRWFybHlHYWluOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRWFybHlEZWxheTsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkxhdGVHYWluOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uTGF0ZURlbGF5OworCisgICAgZWFybHlfcmVmbGVjdGlvbl9vYmplY3RfdCBtX3NFYXJseUw7CisgICAgZWFybHlfcmVmbGVjdGlvbl9vYmplY3RfdCBtX3NFYXJseVI7CisKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1fbk1heEV4Y3Vyc2lvbjsgLy8yOAorICAgIGludDE2X3QgICAgICAgICAgICAgbV9uWGZhZGVJbnRlcnZhbDsKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQXAwX0FwR2FpbjsgLy8zMAorICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQXAwX0FwT3V0OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQXAxX0FwR2FpbjsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkFwMV9BcE91dDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkRpZmZ1c2lvbjsKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU0OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU1OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU2OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU3OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU4OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnU5OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9yZnUxMDsgLy80MworCit9IHJldmVyYl9wcmVzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICByZXZlcmJfcHJlc2V0X3QgICAgIG1fc1ByZXNldFtSRVZFUkJfTlVNX1BSRVNFVFNdOyAvLyBhcnJheSBvZiBwcmVzZXRzKGRvZXMgbm90IGluY2x1ZGUgUkVWRVJCX1BSRVNFVF9OT05FKQorCit9IHJldmVyYl9wcmVzZXRfYmFua190OworCisKKy8qIHBhcmFtZXRlcnMgZm9yIGVhY2ggcmV2ZXJiICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIHVwZGF0ZSBjb3VudGVyIGtlZXBzIHRyYWNrIG9mIHdoZW4gc3ludGggcGFyYW1zIG5lZWQgdXBkYXRpbmcgKi8KKyAgICAvKiBvbmx5IG5lZWRzIHRvIGJlIGFzIGxhcmdlIGFzIFJFVkVSQl9VUERBVEVfUEVSSU9EX0lOX1NBTVBMRVMgKi8KKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblVwZGF0ZUNvdW50ZXI7CisKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX25CYXNlSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGluZGV4IGZvciBjaXJjdWxhciBidWZmZXIKKworICAgIC8vIHJldmVyYiBkZWxheSBsaW5lIG9mZnNldHMsIGFsbHBhc3MgcGFyYW1ldGVycywgZXRjOgorCisgICAgc2hvcnQgICAgICAgICAgICAgbV9uUmV2RmJrUjsgICAgICAgICAgICAgIC8vIGNvbWJpbmUgZmVlZGJhY2sgcmV2ZXJiIHJpZ2h0IG91dCB3aXRoIGRyeSBsZWZ0IGluCisgICAgc2hvcnQgICAgICAgICAgICAgbV96T3V0THBmTDsgICAgICAgICAgICAgIC8vIGxlZnQgcmV2ZXJiIG91dHB1dAorCisgICAgYWxscGFzc19vYmplY3RfdCAgICBtX3NBcDA7ICAgICAgICAgICAgICAgICAgICAgLy8gYWxscGFzcyAwIChsZWZ0IGNoYW5uZWwpCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pEMEluOyAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgb2Zmc2V0IGZvciBkZWxheSBsaW5lIEQwIGluCisKKyAgICBzaG9ydCAgICAgICAgICAgICBtX25SZXZGYmtMOyAgICAgICAgICAgICAgLy8gY29tYmluZSBmZWVkYmFjayByZXZlcmIgbGVmdCBvdXQgd2l0aCBkcnkgcmlnaHQgaW4KKyAgICBzaG9ydCAgICAgICAgICAgICBtX3pPdXRMcGZSOyAgICAgICAgICAgICAgLy8gcmlnaHQgcmV2ZXJiIG91dHB1dAorCisgICAgYWxscGFzc19vYmplY3RfdCAgICBtX3NBcDE7ICAgICAgICAgICAgICAgICAgICAgLy8gYWxscGFzcyAxIChyaWdodCBjaGFubmVsKQorCisgICAgdWludDE2X3QgICAgICAgICAgICAgbV96RDFJbjsgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IG9mZnNldCBmb3IgZGVsYXkgbGluZSBEMSBpbgorCisgICAgLy8gZGVsYXkgb3V0cHV0IHRhcHMsIG5vdGljZSBjcmlzcyBjcm9zcyBvcmRlcgorICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekQwU2VsZjsgICAgICAgICAgICAgICAgICAvLyBzZWxmIGZlZWRzIGZvcndhcmQgZDAgLS0+IGQwCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pEMUNyb3NzOyAgICAgICAgICAgICAgICAgLy8gY3Jvc3MgZmVlZHMgYWNyb3NzIGQxIC0tPiBkMAorCisgICAgdWludDE2X3QgICAgICAgICAgICAgbV96RDFTZWxmOyAgICAgICAgICAgICAgICAgIC8vIHNlbGYgZmVlZHMgZm9yd2FyZCBkMSAtLT4gZDEKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekQwQ3Jvc3M7ICAgICAgICAgICAgICAgICAvLyBjcm9zcyBmZWVkcyBhY3Jvc3MgZDAgLS0+IGQxCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblNpbjsgICAgICAgICAgICAgICAgICAgICAvLyBnYWluIGZvciBzZWxmIHRhcHMKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQ29zOyAgICAgICAgICAgICAgICAgICAgIC8vIGdhaW4gZm9yIGNyb3NzIHRhcHMKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uU2luSW5jcmVtZW50OyAgICAgICAgICAgIC8vIGluY3JlbWVudCBmb3IgZ2FpbgorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25Db3NJbmNyZW1lbnQ7ICAgICAgICAgICAgLy8gaW5jcmVtZW50IGZvciBnYWluCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblJ2YkxwZkZ3ZDsgICAgICAgICAgICAgICAgICAvLyByZXZlcmIgZmVlZGJhY2sgbHBmIGZvcndhcmQgZ2FpbiAoaW5jbHVkZXMgc2NhbGluZyBmb3IgbWl4ZXIpCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblJ2YkxwZkZiazsgICAgICAgICAgICAgICAgICAvLyByZXZlcmIgZmVlZGJhY2sgbHBmIGZlZWRiYWNrIGdhaW4KKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUm9vbUxwZkZ3ZDsgICAgICAgICAgICAgICAgICAvLyByb29tIGxwZiBmb3J3YXJkIGdhaW4gKGluY2x1ZGVzIHNjYWxpbmcgZm9yIG1peGVyKQorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25Sb29tTHBmRmJrOyAgICAgICAgICAgICAgICAgIC8vIHJvb20gbHBmIGZlZWRiYWNrIGdhaW4KKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9uWGZhZGVJbnRlcnZhbDsgICAgICAgICAgIC8vIHVwZGF0ZS94ZmFkZSBhZnRlciB0aGlzIG1hbnkgc2FtcGxlcworCisgICAgdWludDE2X3QgICAgICAgICAgICBtX25YZmFkZUNvdW50ZXI7ICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB3aGVuIHRvIHhmYWRlCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblBoYXNlOyAgICAgICAgICAgICAgICAgICAvLyAtMSA8PSBtX25QaGFzZSA8IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgZHVyaW5nIHNpbixjb3MgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG1fblBoYXNlLzIKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUGhhc2VJbmNyZW1lbnQ7ICAgICAgICAgIC8vIGFkZCB0aGlzIHRvIG1fblBoYXNlIGVhY2ggZnJhbWUKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uTm9pc2U7ICAgICAgICAgICAgICAgICAgIC8vIHJhbmRvbSBub2lzZSBzYW1wbGUKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9uTWF4RXhjdXJzaW9uOyAgICAgICAgICAgIC8vIHRoZSB0YXBzIGNhbiBleGN1cnNlICsvLSB0aGlzIGFtb3VudAorCisgICAgdWludDE2X3QgICAgICAgICAgICBtX2JVc2VOb2lzZTsgICAgICAgICAgICAgICAgLy8gaWYgVFJVRSwgdXNlIG5vaXNlIGFzIGlucHV0IHNpZ25hbAorCisgICAgdWludDE2X3QgICAgICAgICAgICBtX2JCeXBhc3M7ICAgICAgICAgICAgICAgICAgLy8gaWYgVFJVRSwgdGhlbiBieXBhc3MgcmV2ZXJiIGFuZCBjb3B5IGlucHV0IHRvIG91dHB1dAorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25DdXJyZW50Um9vbTsgICAgICAgICAgICAgLy8gcHJlc2V0IG51bWJlciBmb3IgY3VycmVudCByb29tCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbk5leHRSb29tOyAgICAgICAgICAgICAgICAvLyBwcmVzZXQgbnVtYmVyIGZvciBuZXh0IHJvb20KKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRWFybHlHYWluOyAgICAgICAgICAgICAgIC8vIGdhaW4gZm9yIGVhcmx5ICh3aWRlbikgc2lnbmFsCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25FYXJseURlbGF5OyAgICAgICAgICAgICAgLy8gaW5pdGlhbCBkZWFseSBmb3IgZWFybHkgKHdpZGVuKSBzaWduYWwKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkVhcmx5MGluOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRWFybHkxaW47CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25MYXRlR2FpbjsgICAgICAgICAgICAgICAvLyBnYWluIGZvciBsYXRlIHJldmVyYgorICAgIGludDE2X3QgICAgICAgICAgICAgbV9uTGF0ZURlbGF5OworCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25EaWZmdXNpb247CisKKyAgICBlYXJseV9yZWZsZWN0aW9uX29iamVjdF90ICAgbV9zRWFybHlMOyAgICAgICAgICAvLyBsZWZ0IGNoYW5uZWwgZWFybHkgcmVmbGVjdGlvbnMKKyAgICBlYXJseV9yZWZsZWN0aW9uX29iamVjdF90ICAgbV9zRWFybHlSOyAgICAgICAgICAvLyByaWdodCBjaGFubmVsIGVhcmx5IHJlZmxlY3Rpb25zCisKKyAgICBzaG9ydCAgICAgICAgICAgICBtX25EZWxheUxpbmVbUkVWRVJCX0JVRkZFUl9TSVpFX0lOX1NBTVBMRVNfTUFYXTsgICAgLy8gb25lIGxhcmdlIGRlbGF5IGxpbmUgZm9yIGFsbCByZXZlcmIgZWxlbWVudHMKKworICAgIHJldmVyYl9wcmVzZXRfdCAgICAgcFByZXNldDsKKworICAgIHJldmVyYl9wcmVzZXRfYmFua190ICBtX3NQcmVzZXQ7CisKKyAgICAvL2ludDhfdCAgICAgICAgICAgIHByZXNldDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1fblNhbXBsaW5nUmF0ZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1fblVwZGF0ZVBlcmlvZEluQml0czsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1fbkJ1ZmZlck1hc2s7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtX25VcGRhdGVQZXJpb2RJblNhbXBsZXM7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtX25EZWxheTBPdXQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtX25EZWxheTFPdXQ7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25Db3NXVF81S0h6OworCisgICAgdWludDE2X3QgICAgICAgICAgICBtX0F1eDsgICAgICAgICAgICAgICAgLy8gaWYgVFJVRSwgaXMgY29ubmVjdGVkIGFzIGF1eGlsaWFyeSBlZmZlY3QKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1fUHJlc2V0OyAgICAgICAgICAgICAvLyBpZiBUUlVFLCBleHBvc2UgcHJlc2V0IHJldmVydCBpbnRlcmZhY2UKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVN0YXRlOworfSByZXZlcmJfb2JqZWN0X3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCByZXZlcmJfbW9kdWxlX3MgeworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKyAgICByZXZlcmJfb2JqZWN0X3QgY29udGV4dDsKK30gcmV2ZXJiX21vZHVsZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRWZmZWN0IEFQSQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CitpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICplZmZlY3RVSUQsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7CitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKKworc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKK3N0YXRpYyBpbnQgUmV2ZXJiX0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaW50ZXJuYWwgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworaW50IFJldmVyYl9Jbml0KHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgaW50IGF1eCwgaW50IHByZXNldCk7CitpbnQgUmV2ZXJiX0NvbmZpZ3VyZShyZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KTsKK3ZvaWQgUmV2ZXJiX1Jlc2V0KHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgYm9vbCBpbml0KTsKKworaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIgKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiVXBkYXRlWGZhZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFVwZGF0ZSB0aGUgeGZhZGUgcGFyYW1ldGVycyBhcyByZXF1aXJlZAorICoKKyAqIElucHV0czoKKyAqIG5OdW1TYW1wbGVzVG9BZGQgLSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSB0byBidWZmZXIKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtIHhmYWRlIHBhcmFtZXRlcnMgd2lsbCBiZSBjaGFuZ2VkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBSZXZlcmJVcGRhdGVYZmFkZShyZXZlcmJfb2JqZWN0X3QqIHBSZXZlcmJEYXRhLCBpbnQgbk51bVNhbXBsZXNUb0FkZCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiQ2FsY3VsYXRlTm9pc2UKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIENhbGN1bGF0ZSBhIG5vaXNlIHNhbXBsZSBhbmQgbGltaXQgaXRzIHZhbHVlCisgKgorICogSW5wdXRzOgorICogUG9pbnRlciB0byByZXZlcmIgY29udGV4dAorICoKKyAqIE91dHB1dHM6CisgKiBuZXcgbGltaXRlZCBub2lzZSB2YWx1ZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqIC0gcFJldmVyYkRhdGEtPm1fbk5vaXNlIHZhbHVlIGlzIHVwZGF0ZWQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdWludDE2X3QgUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiRGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiQ2FsY3VsYXRlU2luQ29zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBDYWxjdWxhdGUgYSBuZXcgc2luIGFuZCBjb3NpbmUgdmFsdWUgYmFzZWQgb24gdGhlIGdpdmVuIHBoYXNlCisgKgorICogSW5wdXRzOgorICogblBoYXNlICAgLSBwaGFzZSBhbmdsZQorICogcG5TaW4gICAgLSBpbnB1dCBvbGQgdmFsdWUsIG91dHB1dCBuZXcgdmFsdWUKKyAqIHBuQ29zICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKgorICogT3V0cHV0czoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtICpwblNpbiwgKnBuQ29zIGFyZSB1cGRhdGVkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBSZXZlcmJDYWxjdWxhdGVTaW5Db3MoaW50MTZfdCBuUGhhc2UsIGludDE2X3QgKnBuU2luLCBpbnQxNl90ICpwbkNvcyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBhcHBseSByZXZlcmIgdG8gdGhlIGdpdmVuIHNpZ25hbAorICoKKyAqIElucHV0czoKKyAqIG5OdQorICogcG5TaW4gICAgLSBpbnB1dCBvbGQgdmFsdWUsIG91dHB1dCBuZXcgdmFsdWUKKyAqIHBuQ29zICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKgorICogT3V0cHV0czoKKyAqIG51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHJldmVyYmVyYXRlZAorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50IFJldmVyYihyZXZlcmJfb2JqZWN0X3QqIHBSZXZlcmJEYXRhLCBpbnQgbk51bVNhbXBsZXNUb0FkZCwgc2hvcnQgKnBPdXRwdXRCdWZmZXIsIHNob3J0ICpwSW5wdXRCdWZmZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYlJlYWRJblByZXNldHMoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOiBzZXRzIGdsb2JhbCByZXZlcmIgcHJlc2V0IGJhbmsgdG8gZGVmYXVsdHMKKyAqCisgKiBJbnB1dHM6CisgKgorICogT3V0cHV0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50IFJldmVyYlJlYWRJblByZXNldHMocmV2ZXJiX29iamVjdF90KiBwUmV2ZXJiRGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJVcGRhdGVSb29tCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBVcGRhdGUgdGhlIHJvb20ncyBwcmVzZXQgcGFyYW1ldGVycyBhcyByZXF1aXJlZAorICoKKyAqIElucHV0czoKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtIHJldmVyYiBwYXJhbXRlcnMgKGZiaywgZndkLCBldGMpIHdpbGwgYmUgY2hhbmdlZAorICogLSBtX25DdXJyZW50Um9vbSA6PSBtX25OZXh0Um9vbQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBSZXZlcmJVcGRhdGVSb29tKHJldmVyYl9vYmplY3RfdCogcFJldmVyYkRhdGEsIGJvb2wgZnVsbFVwZGF0ZSk7CisKKworc3RhdGljIGludCBSZXZlcmJDb21wdXRlQ29uc3RhbnRzKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYkRhdGEsIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSk7CisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUUkVWRVJCX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguYyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWVjNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RzTWF0aC5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiRUZGRUNUU01BVEgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKKworLy8gZ0xvZ1RhYiBjb250YWlucyBwcmUtY2FsY3VsYXRlZCB2YWx1ZXMgb2YgbG9nMigxICsgYWk1KjJeLTEgKyBhaTQqMl4tMiArIGFpMyoyXi0zICsgYWkyKjJeLTQgKyBhaTEqMl4tNSArIGFpMCoyXi02KQorLy8gZm9yIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDYzIChpID0gYWk1KjJeNSArIGFpNCoyXjQgKyBhaTMqMl4zICsgYWkyKjJeMiArIGFpMSoyXjEgKyBhaTAqMl4wKQorLy8gSXQgaXMgdXNlZCBmb3IgYSBiZXR0ZXIgdGhhbiBwaWVjZSB3aXNlIGFwcHJveGltYXRpb24gb2YgbGluIHRvIGxvZzIgY29udmVyc2lvbgorCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ0xvZ1RhYltdID0KK3sKKyAgICAwLCA3MzMsIDE0NTUsIDIxNjYsCisgICAgMjg2NiwgMzU1NiwgNDIzNiwgNDkwNywKKyAgICA1NTY4LCA2MjIwLCA2ODYzLCA3NDk4LAorICAgIDgxMjQsIDg3NDIsIDkzNTIsIDk5NTQsCisgICAgMTA1NDksIDExMTM2LCAxMTcxNiwgMTIyODksCisgICAgMTI4NTUsIDEzNDE1LCAxMzk2OCwgMTQ1MTQsCisgICAgMTUwNTUsIDE1NTg5LCAxNjExNywgMTY2MzksCisgICAgMTcxNTYsIDE3NjY3LCAxODE3MywgMTg2NzMsCisgICAgMTkxNjgsIDE5NjU4LCAyMDE0MywgMjA2MjMsCisgICAgMjEwOTgsIDIxNTY4LCAyMjAzNCwgMjI0OTUsCisgICAgMjI5NTIsIDIzNDA0LCAyMzg1MiwgMjQyOTYsCisgICAgMjQ3MzYsIDI1MTcyLCAyNTYwNCwgMjYwMzEsCisgICAgMjY0NTUsIDI2ODc2LCAyNzI5MiwgMjc3MDUsCisgICAgMjgxMTQsIDI4NTIwLCAyODkyMiwgMjkzMjEsCisgICAgMjk3MTcsIDMwMTA5LCAzMDQ5OCwgMzA4ODQsCisgICAgMzEyNjcsIDMxNjQ3LCAzMjAyNCwgMzIzOTcsCisgICAgMzI3NjgKK307CisKK2ludDMyX3QgRWZmZWN0c19sb2cyKHVpbnQzMl90IHgpIHsKKyAgICBpbnQzMl90IGV4cCA9IDMxIC0gX19idWlsdGluX2Nseih4KTsKKyAgICB1aW50MzJfdCBzZWdTdGFydCA9IHggPj4gKGV4cCAtIDYpOworICAgIHVpbnQzMl90IGkgPSBzZWdTdGFydCAmIDB4M0Y7CisgICAgaW50MzJfdCBsb2cgPSAoaW50MzJfdClnTG9nVGFiW2ldOworICAgIGludDMyX3QgbG9nRW5kID0gKGludDMyX3QpZ0xvZ1RhYltpKzFdOworICAgIHNlZ1N0YXJ0IDw8PSBleHAgLSA2OworCisgICAgcmV0dXJuIChleHAgPDwgMTUpICsgbG9nICsgKCgoeCAtIHNlZ1N0YXJ0KSAqIChsb2dFbmQgLSBsb2cpKSA+PiAoZXhwIC0gNikpOworfQorCisvLyBnRXhwVGFiW2ldID0gKDJeKGk+PjYpKSA8PCAyMgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGdFeHBUYWJbXSA9IHsKKyAgICAgICAgICAgIDQxOTQzMDQsIDQyMzk5NzcsIDQyODYxNDcsIDQzMzI4MjAsCisgICAgICAgICAgICA0MzgwMDAyLCA0NDI3Njk3LCA0NDc1OTExLCA0NTI0NjUxLAorICAgICAgICAgICAgNDU3MzkyMSwgNDYyMzcyOCwgNDY3NDA3NywgNDcyNDk3NCwKKyAgICAgICAgICAgIDQ3NzY0MjYsIDQ4Mjg0MzgsIDQ4ODEwMTYsIDQ5MzQxNjcsCisgICAgICAgICAgICA0OTg3ODk2LCA1MDQyMjExLCA1MDk3MTE3LCA1MTUyNjIxLAorICAgICAgICAgICAgNTIwODcyOSwgNTI2NTQ0OSwgNTMyMjc4NiwgNTM4MDc0NywKKyAgICAgICAgICAgIDU0MzkzMzksIDU0OTg1NzAsIDU1NTg0NDUsIDU2MTg5NzMsCisgICAgICAgICAgICA1NjgwMTU5LCA1NzQyMDEyLCA1ODA0NTM5LCA1ODY3NzQ2LAorICAgICAgICAgICAgNTkzMTY0MiwgNTk5NjIzMywgNjA2MTUyOCwgNjEyNzUzMywKKyAgICAgICAgICAgIDYxOTQyNTgsIDYyNjE3MDksIDYzMjk4OTQsIDYzOTg4MjIsCisgICAgICAgICAgICA2NDY4NTAxLCA2NTM4OTM4LCA2NjEwMTQzLCA2NjgyMTIyLAorICAgICAgICAgICAgNjc1NDg4NiwgNjgyODQ0MiwgNjkwMjc5OSwgNjk3Nzk2NSwKKyAgICAgICAgICAgIDcwNTM5NTAsIDcxMzA3NjMsIDcyMDg0MTIsIDcyODY5MDYsCisgICAgICAgICAgICA3MzY2MjU1LCA3NDQ2NDY5LCA3NTI3NTU1LCA3NjA5NTI1LAorICAgICAgICAgICAgNzY5MjM4NywgNzc3NjE1MiwgNzg2MDgyOSwgNzk0NjQyOCwKKyAgICAgICAgICAgIDgwMzI5NTksIDgxMjA0MzIsIDgyMDg4NTcsIDgyOTgyNDYsCisgICAgICAgICAgICA4Mzg4NjA4Cit9OworCisKK3VpbnQzMl90IEVmZmVjdHNfZXhwMihpbnQzMl90IHgpIHsKKyAgICBpbnQzMl90IGkgPSB4ID4+IDE1OworICAgIGFzc2VydChpIDwgMzIpOworICAgIHggJj0gKDEgPDwgMTUpIC0gMTsKKyAgICBpbnQzMl90IGogPSB4ID4+IDk7CisgICAgeCAmPSAoMSA8PCA5KSAtIDE7CisgICAgdWludDMyX3QgZXhwID0gZ0V4cFRhYltqXTsKKyAgICB1aW50MzJfdCBleHBFbmQgPSBnRXhwVGFiW2orMV07CisKKyAgICByZXR1cm4gKChleHAgPDwgOSkgKyAoZXhwRW5kIC0gZXhwKSAqIHgpID4+ICgzMSAtIGkpOworfQorCisKK2ludDE2X3QgRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2IChpbnQzMl90IG5HYWluKQoreworICAgIG5HYWluID0gKChuR2FpbiArIE1CX1RPX0xJTl9LMSkgPDwgMTUgKSAvIE1CX1RPX0xJTl9LMjsKKyAgICB1aW50MzJfdCBleHAyID0gRWZmZWN0c19leHAyKG5HYWluKTsKKworICAgIGlmIChleHAyID4gMzI3NjcpIGV4cDIgPSAzMjc2NzsKKworICAgIHJldHVybiAoaW50MTZfdClleHAyOworfQorCisKK2ludDE2X3QgRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzIChpbnQzMl90IG5HYWluKQoreworICAgIHJldHVybiAoaW50MTZfdCkoKChNQl9UT19MSU5fSzIqRWZmZWN0c19sb2cyKG5HYWluKSk+PjE1KS1NQl9UT19MSU5fSzEpOworfQorCisKK2ludDMyX3QgRWZmZWN0c19TcXJ0KGludDMyX3QgaW4pCit7CisgICAgaW50MzJfdCB0bXA7CisgICAgaW50MzJfdCBvdXQgPSAwOworICAgIGludDMyX3QgaTsKKyAgICBpbnQzMl90IGo7CisKKworICAgIGlmIChpbiA9PSAwKSByZXR1cm4gMDsKKworICAgIGlmIChpbiA+PSAweDEwMDAwMDAwKQorICAgIHsKKyAgICAgICAgb3V0ID0gMHg0MDAwOworICAgICAgICBpbiAtPSAweDEwMDAwMDAwOworICAgIH0KKworICAgIGogPSAzMiAtIF9fYnVpbHRpbl9jbHooaW4pOworCisgICAgaWYgKGogJiAxKSBqKys7CisgICAgaiA+Pj0gMTsKKworICAgIGZvciAoaSA9IGo7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgdG1wID0gKG91dCA8PCBpKSArICgxIDw8ICgoaSAtIDEpKjIpKTsKKyAgICAgICAgaWYgKGluID49IHRtcCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0ICs9IDEgPDwgKGktMSk7CisgICAgICAgICAgICBpbiAtPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0NDM5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguaApAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTTUFUSF9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFNNQVRIX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogY29lZnMgZm9yIHBhbiwgZ2VuZXJhdGVzIHNpbiwgY29zICovCisjZGVmaW5lIENPRUZGX1BBTl9HMiAgICAtMjcxNDYgICAgLyogLTAuODI4NDI3MTI0NzQ2MTkgPSAyIC0gNC9zcXJ0KDIpICovCisjZGVmaW5lIENPRUZGX1BBTl9HMCAgICAyMzE3MCAgICAgLyogMC43MDcxMDY3ODExODY1NDcgPSAxL3NxcnQoMikgKi8KKworLyoKK2NvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGluZworMl54ID0gZ24ydG9YMCArIGduMnRvWDEqeCArIGduMnRvWDIqeF4yICsgZ24ydG9YMyp4XjMKK3doZXJlIHggaXMgYSBpbnQuZnJhYyBudW1iZXIgcmVwcmVzZW50aW5nIG51bWJlciBvZiBvY3RhdmVzLgorQWN0dWFsbHksIHdlIGFwcHJveGltYXRlIG9ubHkgdGhlIDJeKGZyYWMpIHVzaW5nIHRoZSBwb3dlciBzZXJpZXMKK2FuZCBpbXBsZW1lbnQgdGhlIDJeKGludCkgYXMgYSBzaGlmdCwgc28gdGhhdAorMl54ID09IDJeKGludC5mcmFjKSA9PSAyXihpbnQpICogMl4oZnJhY3QpCisgICAgPT0gKGduMnRvWDAgKyBnbjJ0b1gxKnggKyBnbjJ0b1gyKnheMiArIGduMnRvWDMqeF4zKSA8PCAoaW50KQorCitUaGUgZ24ydG9YLi4gd2VyZSBnZW5lcmF0ZWQgdXNpbmcgYSBiZXN0IGZpdCBmb3IgYSAzcmQKK29yZGVyIHBvbHlub21pYWwsIGluc3RlYWQgb2YgdGFraW5nIHRoZSBjb2VmZmljaWVudHMgZnJvbQorYSB0cnVuY2F0ZWQgVGF5bG9yIChvciBNYWNsYXVyaW4/KSBzZXJpZXMuCisqLworCisjZGVmaW5lIEdOMl9UT19YMCAgICAzMjc2OCAgICAvKiAgICAxICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHTjJfVE9fWDEgICAgMjI4MzMgICAgLyogICAgMC42OTY4MDc4NjEzMjgxMjUgICAgKi8KKyNkZWZpbmUgR04yX1RPX1gyICAgIDczNDQgICAgLyogICAgMC4yMjQxMjEwOTM3NSAgICAgICAgKi8KKyNkZWZpbmUgR04yX1RPX1gzICAgIDI1ODggICAgLyogICAgMC4wNzg5Nzk0OTIxODc1ICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpeGVkIFBvaW50IE1hdGgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBmaXhlZCBwb2ludCBtdWx0aXBsaWVzLiBJZiB0aGUgcHJvY2Vzc29yCisgKiBzdXBwb3J0cyBmaXhlZCBwb2ludCBtdWx0aXBsaWVzLCByZXBsYWNlIHRoZXNlIG1hY3JvcyB3aXRoIGlubGluZQorICogYXNzZW1ibHkgY29kZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKiBGaXhlZCBwb2ludCBtdWx0aXBseSAwLjE1IHggMC4xNSA9IDAuMTUgcmV0dXJuZWQgYXMgMzItYml0cyAqLworI2RlZmluZSBGTVVMXzE1eDE1KGEsYikgXAorICAgIC8qbGludCAtZSg3MDQpIDxhdm9pZCBtdWx0aXBseSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICgoKGludDMyX3QpKGEpICogKGludDMyX3QpKGIpKSA+PiAxNSkKKworLyogRml4ZWQgcG9pbnQgbXVsdGlwbHkgMC43IHggMC43ID0gMC4xNSByZXR1cm5lZCBhcyAzMi1iaXRzICovCisjZGVmaW5lIEZNVUxfN3g3KGEsYikgXAorICAgIC8qbGludCAtZSg3MDQpIDxhdm9pZCBtdWx0aXBseSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICgoKGludDMyX3QpKGEpICogKGludDMyX3QpKGIpICkgPDwgMSkKKworLyogRml4ZWQgcG9pbnQgbXVsdGlwbHkgMC44IHggMC44ID0gMC4xNSByZXR1cm5lZCBhcyAzMi1iaXRzICovCisjZGVmaW5lIEZNVUxfOHg4KGEsYikgXAorICAgIC8qbGludCAtZSg3MDQpIDxhdm9pZCBtdWx0aXBseSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICgoKGludDMyX3QpKGEpICogKGludDMyX3QpKGIpICkgPj4gMSkKKworLyogRml4ZWQgcG9pbnQgbXVsdGlwbHkgMC44IHggMS4xNSA9IDAuMTUgcmV0dXJuZWQgYXMgMzItYml0cyAqLworI2RlZmluZSBGTVVMXzh4MTUoYSxiKSBcCisgICAgLypsaW50IC1lKDcwNCkgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICgoKGludDMyX3QpKChhKSA8PCA3KSAqIChpbnQzMl90KShiKSkgPj4gMTUpCisKKy8qIG1hY3JvcyBmb3IgZnJhY3Rpb25hbCBwaGFzZSBhY2N1bXVsYXRvciAqLworLyoKK05vdGU6IGNoYW5nZWQgdGhlIF9VMzIgdG8gX0kzMiBvbiAwMy8xNC8wMi4gVGhpcyBzaG91bGQgbm90CithZmZlY3QgdGhlIHBoYXNlIGNhbGN1bGF0aW9ucywgYW5kIHNob3VsZCBhbGxvdyB1cyB0byByZXVzZSB0aGVzZQorbWFjcm9zIGZvciBvdGhlciBhdWRpbyBzYW1wbGUgcmVsYXRlZCBtYXRoLgorKi8KKyNkZWZpbmUgSEFSRFdBUkVfQklUX1dJRFRIICAgICAgICAzMgorCisjZGVmaW5lIE5VTV9QSEFTRV9JTlRfQklUUyAgICAgICAgMQorI2RlZmluZSBOVU1fUEhBU0VfRlJBQ19CSVRTICAgICAgIDE1CisKKyNkZWZpbmUgUEhBU0VfRlJBQ19NQVNLICAgICAgICAgICAodWludDMyX3QpICgoMHgxTCA8PCBOVU1fUEhBU0VfRlJBQ19CSVRTKSAtMSkKKworI2RlZmluZSBHRVRfUEhBU0VfSU5UX1BBUlQoeCkgICAgICh1aW50MzJfdCkoKHVpbnQzMl90KSh4KSA+PiBOVU1fUEhBU0VfRlJBQ19CSVRTKQorI2RlZmluZSBHRVRfUEhBU0VfRlJBQ19QQVJUKHgpICAgICh1aW50MzJfdCkoKHVpbnQzMl90KSh4KSAmIFBIQVNFX0ZSQUNfTUFTSykKKworI2RlZmluZSBERUZBVUxUX1BIQVNFX0ZSQUMgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9QSEFTRV9JTlQgICAgICAgICAwCisKKy8qCitMaW5lYXIgaW50ZXJwb2xhdGlvbiBjYWxjdWxhdGVzOgorb3V0cHV0ID0gKDEtZnJhYykgKiBzYW1wbGVbbl0gKyAoZnJhYykgKiBzYW1wbGVbbisxXQorCit3aGVyZSBjb25jZXB0dWFsbHkgICAgMCA8PSBmcmFjIDwgMQorCitGb3IgYSBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiwgZnJhYyBpcyBhY3R1YWxseSBhbiBpbnRlZ2VyIHZhbHVlCit3aXRoIGFuIGltcGxpZWQgYmluYXJ5IHBvaW50IG9uZSBwb3NpdGlvbiB0byB0aGUgbGVmdC4gVGhlIHZhbHVlIG9mCitvbmUgKHVuaXR5KSBpcyBnaXZlbiBieSBQSEFTRV9PTkUKK29uZSBoYWxmIGFuZCBvbmUgcXVhcnRlciBhcmUgdXNlZnVsIGZvciA0LXBvaW50IGxpbmVhciBpbnRlcnAuCisqLworI2RlZmluZSBQSEFTRV9PTkUgICAgICAgICAgICAgICAgKGludDMyX3QpICgweDFMIDw8IE5VTV9QSEFTRV9GUkFDX0JJVFMpCisKKy8qCisgTXVsdGlwbHkgdGhlIHNpZ25lZCBhdWRpbyBzYW1wbGUgYnkgdGhlIHVuc2lnbmVkIGZyYWN0aW9uLgorLSAgYSBpcyB0aGUgc2lnbmVkIGF1ZGlvIHNhbXBsZQorLSAgYiBpcyB0aGUgdW5zaWduZWQgZnJhY3Rpb24gKGNhc3QgdG8gc2lnbmVkIGludCBhcyBsb25nIGFzIGNvZWYKKyAgICB1c2VzIChuLTEpIG9yIGxlc3MgYml0cywgd2hlcmUgbiA9PSBoYXJkd2FyZSBiaXQgd2lkdGgpCisqLworI2RlZmluZSBNVUxUX0FVRElPX0NPRUYoYXVkaW8sY29lZikgICAgICAgICAvKmxpbnQgLWU3MDQgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICAgICAgICAgKGludDMyX3QpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGF1ZGlvKSkgKiAoKGludDMyX3QpKGNvZWYpKSAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA+PiBOVU1fUEhBU0VfRlJBQ19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnQgKzcwNCA8cmVzdG9yZSBjaGVja2luZz4qLworCisvKiB3ZXQgLyBkcnkgY2FsY3VsYXRpb24gbWFjcm9zICovCisjZGVmaW5lIE5VTV9XRVRfRFJZX0ZSQUNfQklUUyAgICAgICA3ICAgIC8vIDE1CisjZGVmaW5lIE5VTV9XRVRfRFJZX0lOVF9CSVRTICAgICAgICA5ICAgIC8vIDEKKworLyogZGVmaW5lIGEgMS4wICovCisjZGVmaW5lIFdFVF9EUllfT05FICAgICAgICAgICAgICAgICAoaW50MzJfdCkgKCgweDFMIDw8IE5VTV9XRVRfRFJZX0ZSQUNfQklUUykpCisjZGVmaW5lIFdFVF9EUllfTUlOVVNfT05FICAgICAgICAgICAoaW50MzJfdCkgKH5XRVRfRFJZX09ORSkKKyNkZWZpbmUgV0VUX0RSWV9GVUxMX1NDQUxFICAgICAgICAgIChpbnQzMl90KSAoV0VUX0RSWV9PTkUgLSAxKQorCisjZGVmaW5lIE1VTFRfQVVESU9fV0VUX0RSWV9DT0VGKGF1ZGlvLGNvZWYpIC8qbGludCAtZSg3MDIpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGF1ZGlvKSkgKiAoKGludDMyX3QpKGNvZWYpKSAgICAgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID4+IE5VTV9XRVRfRFJZX0ZSQUNfQklUUyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisvKiBFbnZlbG9wZSAxIChFRzEpIGNhbGN1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSAgICBOVU1fRUcxX0lOVF9CSVRTICAgICAgICAgIDEKKyNkZWZpbmUgTlVNX0VHMV9GUkFDX0JJVFMgICAgICAgICAgICAxNQorCisvKiB0aGUgbWF4IHBvc2l0aXZlIGdhaW4gdXNlZCBpbiB0aGUgc3ludGggZm9yIEVHMSAqLworLyogU1lOVEhfRlVMTF9TQ0FMRV9FRzFfR0FJTiBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBpbiB0aGUgZGxzMmVhcworY29udmVydGVyLCBvdGhlcndpc2UsIHRoZSB2YWx1ZXMgd2UgcmVhZCBmcm9tIHRoZSAuZWFzIGZpbGUgYXJlIGJvZ3VzLiAqLworI2RlZmluZSBTWU5USF9GVUxMX1NDQUxFX0VHMV9HQUlOICAgIChpbnQzMl90KSAoKDB4MUwgPDwgTlVNX0VHMV9GUkFDX0JJVFMpIC0xKQorCisvKiBkZWZpbmUgYSAxLjAgKi8KKyNkZWZpbmUgRUcxX09ORSAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgKCgweDFMIDw8IE5VTV9FRzFfRlJBQ19CSVRTKSkKKyNkZWZpbmUgRUcxX01JTlVTX09ORSAgICAgICAgICAgICAgICAoaW50MzJfdCkgKH5TWU5USF9GVUxMX1NDQUxFX0VHMV9HQUlOKQorCisjZGVmaW5lIEVHMV9IQUxGICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIChFRzFfT05FLzIpCisjZGVmaW5lIEVHMV9NSU5VU19IQUxGICAgICAgICAgICAgICAgKGludDMyX3QpIChFRzFfTUlOVVNfT05FLzIpCisKKy8qCitXZSBpbXBsZW1lbnQgdGhlIEVHMSB1c2luZyBhIGxpbmVhciBnYWluIHZhbHVlLCB3aGljaCBtZWFucyB0aGF0IHRoZQorYXR0YWNrIHNlZ21lbnQgaXMgaGFuZGxlZCBieSBpbmNyZW1lbnRpbmcgKGFkZGluZykgdGhlIGxpbmVhciBnYWluLgorSG93ZXZlciwgRUcxIHRyZWF0cyB0aGUgRGVjYXksIFN1c3RhaW4sIGFuZCBSZWxlYXNlIGRpZmZlcmVudGx5IHRoYW4KK3RoZSBBdHRhY2sgcG9ydGlvbi4gRm9yIERlY2F5LCBTdXN0YWluLCBhbmQgUmVsZWFzZSwgdGhlIGdhaW4gaXMKK2xpbmVhciBvbiBkQiBzY2FsZSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBleHBvbmVudGlhbCBkYW1waW5nIG9uCithIGxpbmVhciBzY2FsZS4gQmVjYXVzZSB3ZSB1c2UgYSBsaW5lYXIgZ2FpbiBmb3IgRUcxLCB3ZSBpbXBsZW1lbnQKK3RoZSBEZWNheSBhbmQgUmVsZWFzZSBhcyBtdWx0aXBsaWNhdGlvbiAoaW5zdGVhZCBvZiBpbmNyZW1lbnRpbmcKK2FzIHdlIGRpZCBmb3IgdGhlIGF0dGFjayBzZWdtZW50KS4KK1RoZXJlZm9yZSwgd2UgbmVlZCB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIGltcGxlbWVudCB0aGUgbXVsdGlwbGljYXRpb24KKyhpLmUuLCBleHBvbmVudGlhbCBkYW1waW5nKSBkdXJpbmcgdGhlIERlY2F5IGFuZCBSZWxlYXNlIHNlZ21lbnRzIG9mCit0aGUgRUcxCisqLworI2RlZmluZSBNVUxUX0VHMV9FRzEoZ2FpbixkYW1waW5nKSAgICAgICAgLypsaW50IC1lKDcwNCkgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICAgICAgICAgKGludDMyX3QpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoaW50MzJfdCkoZ2FpbikpICogKChpbnQzMl90KShkYW1waW5nKSkgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID4+IE5VTV9FRzFfRlJBQ19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKy8vIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvIHNwZWNpZmljYWxseSBmb3IgdGhlIGZpbHRlciwgd2hlbiBtdWx0aXBseWluZworLy8gdGhlIGIxIGNvZWZmaWNpZW50LiBUaGUgMCA8PSB8YjF8IDwgMiwgd2hpY2ggdGhlcmVmb3JlIG1pZ2h0IG92ZXJmbG93CisvLyBpbiBjZXJ0YWluIGNvbmRpdGlvbnMgYmVjYXVzZSB3ZSBzdG9yZSBiMSBhcyBhIDEuMTUgdmFsdWUuCisvLyBJbnN0ZWFkLCB3ZSBjb3VsZCBzdG9yZSBiMSBhcyBiMXAgKGIxJyA9PSBiMSAicHJpbWUiKSB3aGVyZQorLy8gYjFwID09IGIxLzIsIHRodXMgZW5zdXJpbmcgbm8gcG90ZW50aWFsIG92ZXJmbG93IGZvciBiMXAgYmVjYXVzZQorLy8gMCA8PSB8YjFwfCA8IDEKKy8vIEhvd2V2ZXIsIGR1cmluZyB0aGUgZmlsdGVyIGNhbGN1bGF0aW9uLCB3ZSBtdXN0IGFjY291bnQgZm9yIHRoZSBmYWN0CisvLyB0aGF0IHdlIGFyZSB1c2luZyBiMXAgaW5zdGVhZCBvZiBiMSwgYW5kIHRoZXJlYnkgbXVsdGlwbHkgYnkKKy8vIGFuIGV4dHJhIGZhY3RvciBvZiAyLiBSYXRoZXIgdGhhbiBtdWx0aXBseSBieSBhbiBleHRyYSBmYWN0b3Igb2YgMiwKKy8vIHdlIGNhbiBpbnN0ZWFkIHNoaWZ0IHRoZSByZXN1bHQgcmlnaHQgYnkgb25lIGxlc3MsIGhlbmNlIHRoZQorLy8gbW9kaWZpZWQgc2hpZnQgcmlnaHQgdmFsdWUgb2YgKE5VTV9FRzFfRlJBQ19CSVRTIC0xKQorI2RlZmluZSBNVUxUX0VHMV9FRzFfWDIoZ2FpbixkYW1waW5nKSAgICAgICAgIC8qbGludCAtZSg3MDIpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGdhaW4pKSAqICgoaW50MzJfdCkoZGFtcGluZykpICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA+PiAoTlVNX0VHMV9GUkFDX0JJVFMgLTEpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworI2RlZmluZSBTQVRVUkFURV9FRzEoeCkgICAgICAgIC8qbGludCAtZXs3MzR9IHNhdHVyYXRpb24gb3BlcmF0aW9uICovICAgICAgICAgICAgICAgIFwKKyAgICAoKGludDMyX3QpKHgpID4gU1lOVEhfRlVMTF9TQ0FMRV9FRzFfR0FJTikgICAgPyAoU1lOVEhfRlVMTF9TQ0FMRV9FRzFfR0FJTikgOiAgICBcCisgICAgKChpbnQzMl90KSh4KSA8IEVHMV9NSU5VU19PTkUpICAgICAgICAgICAgICAgID8gKEVHMV9NSU5VU19PTkUpIDogICAgKHgpOworCisKKy8qIHVzZSAiZGlnaXRhbCBjZW50cyIgPT0gImRlbnRzIiBpbnN0ZWFkIG9mIGNlbnRzICovCisvKiB3ZSBjb3VkbCByZS11c2UgdGhlIHBoYXNlIGZyYWMgbWFjcm9zLCBidXQgaWYgd2UgZG8sCit3ZSBtdXN0IGNoYW5nZSB0aGUgcGhhc2UgbWFjcm9zIHRvIGNhc3QgdG8gX0kzMiBpbnN0ZWFkIG9mIF9VMzIsCitiZWNhdXNlIHVzaW5nIGEgX1UzMiBjYXN0IGNhdXNlcyBwcm9ibGVtcyB3aGVuIHNoaWZ0aW5nIHRoZSBleHBvbmVudAorZm9yIHRoZSAyXnggY2FsY3VsYXRpb24sIGJlY2F1c2UgcmlnaHQgc2hpZnQgYSBuZWdhdGl2ZSB2YWx1ZXMgTVVTVAorYmUgc2lnbiBleHRlbmRlZCwgb3IgZWxzZSB0aGUgMl54IGNhbGN1bGF0aW9uIGlzIHdyb25nICovCisKKy8qIHVzZSAiZGlnaXRhbCBjZW50cyIgPT0gImRlbnRzIiBpbnN0ZWFkIG9mIGNlbnRzICovCisjZGVmaW5lIE5VTV9ERU5UU19GUkFDX0JJVFMgICAgICAgIDEyCisjZGVmaW5lIE5VTV9ERU5UU19JTlRfQklUUyAgICAgICAgIChIQVJEV0FSRV9CSVRfV0lEVEggLSBOVU1fREVOVFNfRlJBQ19CSVRTKQorCisjZGVmaW5lIERFTlRTX0ZSQUNfTUFTSyAgICAgICAgICAgIChpbnQzMl90KSAoKDB4MUwgPDwgTlVNX0RFTlRTX0ZSQUNfQklUUykgLTEpCisKKyNkZWZpbmUgR0VUX0RFTlRTX0lOVF9QQVJUKHgpICAgICAgICAvKmxpbnQgLWUoNzA0KSA8YXZvaWQgZGl2aWRlIGZvciBwZXJmb3JtYW5jZT4qLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKChpbnQzMl90KSh4KSA+PiBOVU1fREVOVFNfRlJBQ19CSVRTKQorCisjZGVmaW5lIEdFVF9ERU5UU19GUkFDX1BBUlQoeCkgICAgIChpbnQzMl90KSgoaW50MzJfdCkoeCkgJiBERU5UU19GUkFDX01BU0spCisKKyNkZWZpbmUgREVOVFNfT05FICAgICAgICAgICAgICAgICAgKGludDMyX3QpICgweDFMIDw8IE5VTV9ERU5UU19GUkFDX0JJVFMpCisKKy8qIHVzZSBDRU5UU19UT19ERU5UUyB0byBjb252ZXJ0IGEgdmFsdWUgaW4gY2VudHMgdG8gZGVudHMgKi8KKyNkZWZpbmUgQ0VOVFNfVE9fREVOVFMgKGludDMyX3QpIChERU5UU19PTkUgKiAoMHgxTCA8PCBOVU1fRUcxX0ZSQUNfQklUUykgLyAxMjAwTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisKKy8qCitGb3IgZ2FpbiwgdGhlIExGTyBnZW5lcmF0ZXMgYSB2YWx1ZSB0aGF0IG1vZHVsYXRlcyBpbiB0ZXJtcworb2YgZEIuIEhvd2V2ZXIsIHdlIHVzZSBhIGxpbmVhciBnYWluIHZhbHVlLCBzbyB3ZSBtdXN0IGNvbnZlcnQKK3RoZSBMRk8gdmFsdWUgaW4gZEIgdG8gYSBsaW5lYXIgZ2Fpbi4gTm9ybWFsbHksIHdlIHdvdWxkIHVzZQorbGluZWFyIGdhaW4gPSAxMF54LCB3aGVyZSB4ID0gTEZPIHZhbHVlIGluIGRCIC8gMjAuCitJbnN0ZWFkLCB3ZSBpbXBsZW1lbnQgMTBeeCB1c2luZyBvdXIgMl54IGFwcHJveGltYXRpb24uCitiZWNhdXNlCisKKyAgMTBeeCA9IDJeKGxvZzIoMTBeeCkpID0gMl4oeCAqIGxvZzIoMTApKQorCitzbyB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5IGxvZzIoMTApIHdoaWNoIGlzIGp1c3QgYSBjb25zdGFudC4KK0FoLCBidXQganVzdCB3YWl0IC0tIG91ciAyXnggYWN0dWFsbHkgZG9lc24ndCBleGFjdGx5IGltcGxlbWVudAorMl54LCBidXQgaXQgYWN0dWFsbHkgYXNzdW1lcyB0aGF0IHRoZSBpbnB1dCBpcyBpbiBjZW50cywgYW5kIHdpdGhpbgordGhlIDJeeCBhcHByb3hpbWF0aW9uIGNvbnZlcnRzIGl0cyBpbnB1dCBmcm9tIGNlbnRzIHRvIG9jdGF2ZXMKK2J5IGRpdmlkaW5nIGl0cyBpbnB1dCBieSAxMjAwLgorCitTbywgaW4gb3JkZXIgdG8gY29udmVydCB0aGUgTEZPIGdhaW4gdmFsdWUgaW4gZEIgdG8gc29tZXRoaW5nCit0aGF0IG91ciBleGlzdGluZyAyXnggYXBwcm94aW1hdGlvbiBjYW4gdXNlLCBtdWx0aXBseSB0aGUgTEZPIGdhaW4KK2J5IGxvZzIoMTApICogMTIwMCAvIDIwCisKK1RoZSBkaXZpZGUgYnkgMjAgaGVscHMgY29udmVydCBkQiB0byBsaW5lYXIgZ2FpbiwgYW5kIHdlIG1pZ2h0CithcyB3ZWxsIGluY29ycG9yYXRlIHRoYXQgb3BlcmF0aW9uIGludG8gdGhpcyBjb252ZXJzaW9uLgorT2YgY291cnNlLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBmcmFjdGlvbmFsIGJpdHMsIHNvIG11bHRpcGx5Cit0aGUgY29uc3RhbnQgYnkgTlVNX0VHMV9GUkFDX0JJVFMKKyovCisKKy8qIHVzZSBMRk9fR0FJTl9UT19DRU5UUyB0byBjb252ZXJ0IHRoZSBMRk8gZ2FpbiB2YWx1ZSB0byBjZW50cyAqLworI2lmIDAKKyNkZWZpbmUgICAgRE9VQkxFX0xPRzJfMTAgICAgKGRvdWJsZSkgKDMuMzIxOTI4MDk0ODg3MzYpICAgIC8qIGxvZzIoMTApICovCisKKyNkZWZpbmUgICAgRE9VQkxFX0xGT19HQUlOX1RPX0NFTlRTICAgIChkb3VibGUpICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKERPVUJMRV9MT0cyXzEwKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAxMjAwLjAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAyMC4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKyNkZWZpbmUgICAgTEZPX0dBSU5fVE9fQ0VOVFMgICAgKGludDMyX3QpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBET1VCTEVfTEZPX0dBSU5fVE9fQ0VOVFMgKiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgweDFMIDw8IE5VTV9FRzFfRlJBQ19CSVRTKSAgICAgICAgICAgICAgICAgICAgXAorICAgICkKKyNlbmRpZgorCisjZGVmaW5lIExGT19HQUlOX1RPX0NFTlRTIChpbnQzMl90KSAoMTY3MTk4MTE1NkwgPj4gKDIzIC0gTlVNX0VHMV9GUkFDX0JJVFMpKQorCisKKyNkZWZpbmUgTVVMVF9ERU5UU19DT0VGKGRlbnRzLGNvZWYpICAgICAvKmxpbnQgLWU3MDQgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gICAgXAorICAgICAgICAgICAgKGludDMyX3QpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGRlbnRzKSkgKiAoKGludDMyX3QpKGNvZWYpKSAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA+PiBOVU1fREVOVFNfRlJBQ19CSVRTICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnQgK2U3MDQgPHJlc3RvcmUgY2hlY2tpbmc+Ki8KKworCisvKiB3ZSB1c2UgMTYtYml0cyBpbiB0aGUgUEMgcGVyIGF1ZGlvIHNhbXBsZSAqLworI2RlZmluZSBCSVRTX1BFUl9BVURJT19TQU1QTEUgICAgMTYKKworLyogd2UgZGVmaW5lIDEgYXMgMS4wIC0gMSBMU2JpdCAqLworI2RlZmluZSBESVNUT1JUSU9OX09ORSAgICAgICAgICAgKGludDMyX3QpKCgweDFMIDw8IChCSVRTX1BFUl9BVURJT19TQU1QTEUtMSkpIC0xKQorI2RlZmluZSBESVNUT1JUSU9OX01JTlVTX09ORSAgICAgKGludDMyX3QpKH5ESVNUT1JUSU9OX09ORSkKKworLyogZHJpdmUgY29lZiBpcyBnaXZlbiBhcyBpbnQuZnJhYyAqLworI2RlZmluZSBOVU1fRFJJVkVfQ09FRl9JTlRfQklUUyAgMQorI2RlZmluZSBOVU1fRFJJVkVfQ09FRl9GUkFDX0JJVFMgNAorCisjZGVmaW5lIE1VTFRfQVVESU9fRFJJVkUoYXVkaW8sZHJpdmUpICAgICAgICAgLypsaW50IC1lKDcwMikgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gXAorICAgICAgICAgICAgKGludDMyX3QpICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGF1ZGlvKSkgKiAoKGludDMyX3QpKGRyaXZlKSkgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPj4gTlVNX0RSSVZFX0NPRUZfRlJBQ19CSVRTICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyNkZWZpbmUgTVVMVF9BVURJT19BVURJTyhhdWRpbzEsYXVkaW8yKSAgICAgICAgIC8qbGludCAtZSg3MDIpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGF1ZGlvMSkpICogKChpbnQzMl90KShhdWRpbzIpKSAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPj4gKEJJVFNfUEVSX0FVRElPX1NBTVBMRS0xKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworI2RlZmluZSBTQVRVUkFURSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKCgoaW50MzJfdCkoeCkpID4gRElTVE9SVElPTl9PTkUpICAgICAgICA/IChESVNUT1JUSU9OX09ORSkgOiAgICAgICAgICAgIFwKKyAgICAoKChpbnQzMl90KSh4KSkgPCBESVNUT1JUSU9OX01JTlVTX09ORSkgICAgPyAoRElTVE9SVElPTl9NSU5VU19PTkUpIDogICAgKChpbnQzMl90KSh4KSkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRWZmZWN0c19sb2cyKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIEZpeGVkLXBvaW50IGxvZzIgZnVuY3Rpb24uCisgKgorICogSW5wdXRzOgorICogSW5wdXQgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciAoc2hvdWxkIG5vdCBiZSAwKS4KKyAqCisgKiBPdXRwdXRzOgorICogT3V0cHV0IGlzIGluIDE1LWJpdCBwcmVjaXNpb24uCisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ludDMyX3QgRWZmZWN0c19sb2cyKHVpbnQzMl90IHgpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdHNfZXhwMigpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBGaXhlZC1wb2ludCByYWRpeC0yIGV4cG9uZW50LgorICoKKyAqIElucHV0czoKKyAqIElucHV0IGlzIGluIDE1LWJpdCBwcmVjaXNpb24uIE11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gMzIuCisgKgorICogT3V0cHV0czoKKyAqIE91dHB1dCBpcyBhbiBpbnRlZ2VyLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCit1aW50MzJfdCBFZmZlY3RzX2V4cDIoaW50MzJfdCB4KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogVHJhbnNmb3JtIGdhaW4gaW4gbWlsbGliZWxzIHRvIGxpbmVhciBnYWluIG11bHRpcGxpZXI6CisgKgorICogbUIgPSAyMDAwKmxvZyhsaW4vMzI3NjcpCisgKiAgICA9PiBsaW4gPSAyXigobUIrMjAwMCpsb2coMzI3NjcpKS8yMDAwKmxvZygyKSkKKyAqICAgID0+IGxpbiA9IEVmZmVjdHNfZXhwMigoKG1CICsgSzEpIDw8IDE1KSAvIEsyKQorICogd2l0aDoKKyAqICAgIEsxID0gMjAwMCpsb2coMzI3NjcpIGFuZCBLMiA9IDIwMDAqbG9nKDIpCisgKgorICogSW5wdXRzOgorICogbkdhaW4gLSBsb2cgc2NhbGUgdmFsdWUgaW4gbWlsbGliZWxzLgorICoKKyAqIE91dHB1dHM6CisgKiBSZXR1cm5zIGEgMTYtYml0IGxpbmVhciB2YWx1ZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIDJeKG5HYWluLzEwMjQpCisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgTUJfVE9fTElOX0sxIDkwMzEKKyNkZWZpbmUgTUJfVE9fTElOX0syIDYwMgoraW50MTZfdCBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYgKGludDMyX3QgbkdhaW4pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscygpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBUcmFuc2Zvcm0gbGluZWFyIGdhaW4gbXVsdGlwbGllciB0byBtaWxsaWJlbHMKKyAqICBtQiA9IDIwMDAqbG9nKGxpbi8zMjc2NykKKyAqICAgICA9IDIwMDAqbG9nKDIpKmxvZzIobGluKS0yMDAwKmxvZygzMjc2NykKKyAqICAgID0+IG1CID0gSzEqRWZmZWN0c19sb2cyKGxpbikgKyBLMgorICogd2l0aDoKKyAqICAgIEsxID0gMjAwMCpsb2coMikgYW5kIEsyID0gLTIwMDAqbG9nKDMyNzY3KQorICoKKyAqIElucHV0czoKKyAqIG5HYWluIC0gbGluZWFyIG11bHRpcGxpZXIgcmFuZ2luZyBmb3JtIDAgdG8gMzI3NjcgKGNvcnJlc3BvbmRpbmcgdG8gWzAgMV0gZ2FpbiByYW5nZSkuCisgKgorICogT3V0cHV0czoKKyAqIFJldHVybnMgYSAxNi1iaXQgbG9nIHZhbHVlIGV4cHJlc3NlZCBpbiBtaWxsbGliZWxzLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQxNl90IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyAoaW50MzJfdCBuR2Fpbik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRWZmZWN0c19TcXJ0KCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBhcmd1bWVudCBnaXZlbi4KKyAqCisgKiBJbnB1dHM6CisgKiBpbiAtIHBvc2l0aXZlIG51bWJlciBpbiB0aGUgcmFuZ2UgMCAtIDJeMjgKKyAqCisgKiBPdXRwdXRzOgorICogUmV0dXJuZWQgdmFsdWU6IHNxdWFyZSByb290IG9mIGluLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMl90IEVmZmVjdHNfU3FydChpbnQzMl90IGluKTsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RTTUFUSF9IXyovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNDVmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIFZpc3VhbGl6ZXIgbGlicmFyeQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlFZmZlY3RWaXN1YWxpemVyLmNwcAorCitMT0NBTF9DRkxBR1MrPSAtTzIKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9zb3VuZGZ4CitMT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCisKK2lmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCitMT0NBTF9MRExJQlMgKz0gLWxkbAorZW5kaWYKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1N2RiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVmlzdWFsaXplciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAorZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdWaXN1YWxpemVySW50ZXJmYWNlOworCisvLyBHb29nbGUgVmlzdWFsaXplciBVVUlEOiBkMDY5ZDllMC04MzI5LTExZGYtOTE2OC0wMDAyYTVkNWM1MWIKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yID0geworICAgICAgICB7MHhlNDZiMjZhMCwgMHhkZGRkLCAweDExZGIsIDB4OGFmZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQorICAgICAgICB7MHhkMDY5ZDllMCwgMHg4MzI5LCAweDExZGYsIDB4OTE2OCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCksCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMSwKKyAgICAgICAgIlZpc3VhbGl6ZXIiLAorICAgICAgICAiR29vZ2xlIEluYy4iLAorfTsKKworZW51bSB2aXN1YWxpemVyX3N0YXRlX2UgeworICAgIFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVELAorICAgIFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFLAorfTsKKworc3RydWN0IFZpc3VhbGl6ZXJDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICptSXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgbUNvbmZpZzsKKyAgICB1aW50MzJfdCBtU3RhdGU7CisgICAgdWludDMyX3QgbUNhcHR1cmVJZHg7CisgICAgdWludDMyX3QgbUNhcHR1cmVTaXplOworICAgIHVpbnQzMl90IG1DdXJyZW50QnVmOworICAgIHVpbnQ4X3QgbUNhcHR1cmVCdWZbMl1bVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYXTsKK307CisKKworLy8KKy8vLS0tIExvY2FsIGZ1bmN0aW9ucworLy8KKwordm9pZCBWaXN1YWxpemVyX3Jlc2V0KFZpc3VhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCkKK3sKKyAgICBwQ29udGV4dC0+bUNhcHR1cmVJZHggPSAwOworICAgIHBDb250ZXh0LT5tQ3VycmVudEJ1ZiA9IDA7CisgICAgbWVtc2V0KHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZlswXSwgMHg4MCwgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYKTsKKyAgICBtZW1zZXQocENvbnRleHQtPm1DYXB0dXJlQnVmWzFdLCAweDgwLCBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpc3VhbGl6ZXJfY29uZmlndXJlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlzdWFsaXplcl9jb25maWd1cmUoVmlzdWFsaXplckNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCit7CisgICAgTE9HVigiVmlzdWFsaXplcl9jb25maWd1cmUgc3RhcnQiKTsKKworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgorICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHJldHVybiAtRUlOVkFMOworCisgICAgbWVtY3B5KCZwQ29udGV4dC0+bUNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworCisgICAgVmlzdWFsaXplcl9yZXNldChwQ29udGV4dCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpc3VhbGl6ZXJfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlzdWFsaXplcl9pbml0KFZpc3VhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCkKK3sKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgPSBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVg7CisKKyAgICBWaXN1YWxpemVyX2NvbmZpZ3VyZShwQ29udGV4dCwgJnBDb250ZXh0LT5tQ29uZmlnKTsKKworICAgIHJldHVybiAwOworfQorCisvLworLy8tLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCisvLworCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgKnBOdW1FZmZlY3RzID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdWaXN1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgIGludCByZXQ7CisgICAgaW50IGk7CisKKyAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnVmlzdWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCA9IG5ldyBWaXN1YWxpemVyQ29udGV4dDsKKworICAgIHBDb250ZXh0LT5tSXRmZSA9ICZnVmlzdWFsaXplckludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEOworCisgICAgcmV0ID0gVmlzdWFsaXplcl9pbml0KHBDb250ZXh0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dXKCJFZmZlY3RDcmVhdGUoKSBpbml0IGZhaWxlZCIpOworICAgICAgICBkZWxldGUgcENvbnRleHQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworCisgICAgcENvbnRleHQtPm1TdGF0ZSA9IFZJU1VBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisKKyAgICBMT0dWKCJFZmZlY3RDcmVhdGUgJXAiLCBwQ29udGV4dCk7CisKKyAgICByZXR1cm4gMDsKKworfQorCitleHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpIHsKKyAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopaW50ZXJmYWNlOworCisgICAgTE9HVigiRWZmZWN0UmVsZWFzZSAlcCIsIGludGVyZmFjZSk7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgZGVsZXRlIHBDb250ZXh0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vCisvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vCisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCitleHRlcm4gIkMiIGludCBWaXN1YWxpemVyX3Byb2Nlc3MoCisgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKK3sKKyAgICBhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICopc2VsZjsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIGFsbCBjb2RlIGJlbG93IGFzc3VtZXMgc3RlcmVvIDE2IGJpdCBQQ00gb3V0cHV0IGFuZCBpbnB1dAorCisgICAgLy8gZGVyaXZlIGNhcHR1cmUgc2NhbGluZyBmYWN0b3IgZnJvbSBwZWFrIHZhbHVlIGluIGN1cnJlbnQgYnVmZmVyCisgICAgLy8gdGhpcyBnaXZlcyBtb3JlIGludGVyZXN0aW5nIGNhcHR1cmVzIGZvciBkaXNwbGF5LgorICAgIGludDMyX3Qgc2hpZnQgPSAzMjsKKyAgICBpbnQgbGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiAyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2W2ldOworICAgICAgICBpZiAoc21wIDwgMCkgc21wID0gLXNtcCAtIDE7IC8vIHRha2UgY2FyZSB0byBrZWVwIHRoZSBtYXggbmVnYXRpdmUgaW4gcmFuZ2UKKyAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7CisgICAgICAgIGlmIChzaGlmdCA+IGNseikgc2hpZnQgPSBjbHo7CisgICAgfQorICAgIC8vIEEgbWF4aW11bSBhbXBsaXR1ZGUgc2lnbmFsIHdpbGwgaGF2ZSAxNyBsZWFkaW5nIHplcm9zLCB3aGljaCB3ZSB3YW50IHRvCisgICAgLy8gdHJhbnNsYXRlIHRvIGEgc2hpZnQgb2YgOCAoZm9yIGNvbnZlcnRpbmcgMTYgYml0IHRvIDggYml0KQorICAgICBzaGlmdCA9IDI1IC0gc2hpZnQ7CisgICAgLy8gTmV2ZXIgc2NhbGUgYnkgbGVzcyB0aGFuIDggdG8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsLgorICAgIGlmIChzaGlmdCA8IDMpIHsKKyAgICAgICAgc2hpZnQgPSAzOworICAgIH0KKyAgICAvLyBhZGQgb25lIHRvIGNvbWJpbmUgdGhlIGRpdmlzaW9uIGJ5IDIgbmVlZGVkIGFmdGVyIHN1bW1pbmcgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgYmVsb3cKKyAgICBzaGlmdCsrOworCisgICAgdWludDMyX3QgY2FwdElkeDsKKyAgICB1aW50MzJfdCBpbklkeDsKKyAgICB1aW50OF90ICpidWYgPSBwQ29udGV4dC0+bUNhcHR1cmVCdWZbcENvbnRleHQtPm1DdXJyZW50QnVmXTsKKyAgICBmb3IgKGluSWR4ID0gMCwgY2FwdElkeCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeDsKKyAgICAgICAgIGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgJiYgY2FwdElkeCA8IHBDb250ZXh0LT5tQ2FwdHVyZVNpemU7CisgICAgICAgICBpbklkeCsrLCBjYXB0SWR4KyspIHsKKyAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeF0gKyBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeCArIDFdOworICAgICAgICBzbXAgPSBzbXAgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZltjYXB0SWR4XSA9ICgodWludDhfdClzbXApXjB4ODA7CisgICAgfQorICAgIHBDb250ZXh0LT5tQ2FwdHVyZUlkeCA9IGNhcHRJZHg7CisKKyAgICAvLyBnbyB0byBuZXh0IGJ1ZmZlciB3aGVuIGJ1ZmZlciBmdWxsCisgICAgaWYgKHBDb250ZXh0LT5tQ2FwdHVyZUlkeCA9PSBwQ29udGV4dC0+bUNhcHR1cmVTaXplKSB7CisgICAgICAgIHBDb250ZXh0LT5tQ3VycmVudEJ1ZiBePSAxOworICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVJZHggPSAwOworICAgIH0KKworICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAvLyBlbmQgVmlzdWFsaXplcl9wcm9jZXNzCisKK2V4dGVybiAiQyIgaW50IFZpc3VhbGl6ZXJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKworICAgIGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKilzZWxmOworICAgIGludCByZXRzaXplOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPm1TdGF0ZSA9PSBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisvLyAgICBMT0dWKCJWaXN1YWxpemVyX2NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBWaXN1YWxpemVyX2luaXQocENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBWaXN1YWxpemVyX2NvbmZpZ3VyZShwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopIHBDbWREYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgorICAgICAgICBWaXN1YWxpemVyX3Jlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICBMT0dWKCJFRkZFQ1RfQ01EX0RJU0FCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICBjbWRTaXplICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpKSB8fAorICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAqcmVwbHlTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDMyX3QpKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgcC0+c3RhdHVzID0gMDsKKyAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpOworICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAorICAgICAgICAgICAgKih1aW50MzJfdCAqKXAtPmRhdGEgIT0gVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUpIHsKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplOworICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICBjbWRTaXplICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQzMl90KSkgfHwKKyAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8CisgICAgICAgICAgICBwLT52c2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSAhPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRSkgeworICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazs7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOworICAgICAgICBMT0dWKCJzZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIFZJU1VfQ01EX0NBUFRVUkU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dWKCJWSVNVX0NNRF9DQVBUVVJFKCkgZXJyb3IgKnJlcGx5U2l6ZSAlZCBwQ29udGV4dC0+bUNhcHR1cmVTaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSA9PSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCisgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmW3BDb250ZXh0LT5tQ3VycmVudEJ1ZiBeIDFdLAorICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiVmlzdWFsaXplcl9jb21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAorY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZSA9IHsKKyAgICAgICAgVmlzdWFsaXplcl9wcm9jZXNzLAorICAgICAgICBWaXN1YWxpemVyX2NvbW1hbmQKK307CisKK30gLy8gbmFtZXNwYWNlCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCmluZGV4IDNhZGFiY2MuLjJlNWNiZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawpAQCAtMTIsNiArMTIsNyBAQAogICAgIG1lZGlhcGxheWVyLmNwcCBcCiAgICAgSU1lZGlhUGxheWVyU2VydmljZS5jcHAgXAogICAgIElNZWRpYVBsYXllckNsaWVudC5jcHAgXAorICAgIElNZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBcCiAgICAgSU1lZGlhUGxheWVyLmNwcCBcCiAgICAgSU1lZGlhUmVjb3JkZXIuY3BwIFwKICAgICBNZXRhZGF0YS5jcHAgXApAQCAtMjYsNyArMjcsMTIgQEAKICAgICBNZWRpYVNjYW5uZXJDbGllbnQuY3BwIFwKICAgICBhdXRvZGV0ZWN0LmNwcCBcCiAgICAgSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgXAotICAgIE1lZGlhUHJvZmlsZXMuY3BwCisgICAgTWVkaWFQcm9maWxlcy5jcHAgXAorICAgIElFZmZlY3QuY3BwIFwKKyAgICBJRWZmZWN0Q2xpZW50LmNwcCBcCisgICAgQXVkaW9FZmZlY3QuY3BwIFwKKyAgICBWaXN1YWxpemVyLmNwcCBcCisgICAgZml4ZWRmZnQuY3BwLmFybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1aSBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYnNvbml2b3ggbGliaWN1dWMgbGliZXhwYXQgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IGxpYmNhbWVyYV9jbGllbnQKQEAgLTQ0LDEyICs1MCw4IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCi0gICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zcGVleC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zcGVleC9saWJzcGVleCBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgIGV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCiAgICAgZXh0ZXJuYWwvZXhwYXQvbGliCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic3BlZXgKLQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjhjODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb0VmZmVjdCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoKQorICAgIDogbVN0YXR1cyhOT19JTklUKQoreworfQorCisKK0F1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dAorICAgICAgICAgICAgICAgICkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCkKK3sKKyAgICBtU3RhdHVzID0gc2V0KHR5cGUsIHV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgb3V0cHV0KTsKK30KKworQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgKQorICAgIDogbVN0YXR1cyhOT19JTklUKQoreworICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IE5VTEw7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gTlVMTDsKKworICAgIExPR1YoIkNvbnN0cnVjdG9yIHN0cmluZ1xuIC0gdHlwZTogJXNcbiAtIHV1aWQ6ICVzIiwgdHlwZVN0ciwgdXVpZFN0cik7CisKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBwVHlwZSA9ICZ0eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcFV1aWQgPSAmdXVpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TdGF0dXMgPSBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUVmZmVjdD4gaUVmZmVjdDsKKyAgICBzcDxJTWVtb3J5PiBjYmxrOworICAgIGludCBlbmFibGVkOworCisgICAgTE9HVigic2V0ICVwIG1Vc2VyRGF0YTogJXAiLCB0aGlzLCB1c2VyKTsKKworICAgIGlmIChtSUVmZmVjdCAhPSAwKSB7CisgICAgICAgIExPR1coIkVmZmVjdCBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgeworICAgICAgICBMT0dFKCJzZXQoKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gTlVMTCAmJiB1dWlkID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiTXVzdCBzcGVjaWZ5IGF0IGxlYXN0IHR5cGUgb3IgdXVpZCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OworICAgIG1DYmYgPSBjYmY7CisgICAgbVVzZXJEYXRhID0gdXNlcjsKKyAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOworCisgICAgbWVtc2V0KCZtRGVzY3JpcHRvciwgMCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBtZW1jcHkoJm1EZXNjcmlwdG9yLnR5cGUsIEVGRkVDVF9VVUlEX05VTEwsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgbWVtY3B5KCZtRGVzY3JpcHRvci51dWlkLCBFRkZFQ1RfVVVJRF9OVUxMLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworCisgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkoJm1EZXNjcmlwdG9yLnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgfQorICAgIGlmICh1dWlkICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KCZtRGVzY3JpcHRvci51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgIH0KKworICAgIG1JRWZmZWN0Q2xpZW50ID0gbmV3IEVmZmVjdENsaWVudCh0aGlzKTsKKworICAgIGlFZmZlY3QgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdChnZXRwaWQoKSwgKGVmZmVjdF9kZXNjcmlwdG9yX3QgKikmbURlc2NyaXB0b3IsCisgICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgbVNlc3Npb25JZCwgJm1TdGF0dXMsICZtSWQsICZlbmFibGVkKTsKKworICAgIGlmIChpRWZmZWN0ID09IDAgfHwgKG1TdGF0dXMgIT0gTk9fRVJST1IgJiYgbVN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykpIHsKKyAgICAgICAgTE9HRSgic2V0KCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIGVmZmVjdCwgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOworICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICB9CisKKyAgICBtRW5hYmxlZCA9ICh2b2xhdGlsZSBpbnQzMl90KWVuYWJsZWQ7CisKKyAgICBtSUVmZmVjdCA9IGlFZmZlY3Q7CisgICAgY2JsayA9IGlFZmZlY3QtPmdldENibGsoKTsKKyAgICBpZiAoY2JsayA9PSAwKSB7CisgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOworICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfQorCisgICAgbUlFZmZlY3QgPSBpRWZmZWN0OworICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKKyAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOworICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOworICAgIG1DYmxrLT5idWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OworCisgICAgaUVmZmVjdC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOworICAgIExPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkLCAiLCB0aGlzLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsIG1TdGF0dXMsIG1FbmFibGVkKTsKKworICAgIHJldHVybiBtU3RhdHVzOworfQorCisKK0F1ZGlvRWZmZWN0Ojp+QXVkaW9FZmZlY3QoKQoreworICAgIExPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKKworICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SIHx8IG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIGlmIChtSUVmZmVjdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtSUVmZmVjdC0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbUlFZmZlY3QtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOworICAgICAgICB9CisgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIG1JRWZmZWN0LmNsZWFyKCk7CisgICAgbUlFZmZlY3RDbGllbnQuY2xlYXIoKTsKKyAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOworfQorCisKK3N0YXR1c190IEF1ZGlvRWZmZWN0Ojppbml0Q2hlY2soKSBjb25zdAoreworICAgIHJldHVybiBtU3RhdHVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VmZmVjdF9kZXNjcmlwdG9yX3QgQXVkaW9FZmZlY3Q6OmRlc2NyaXB0b3IoKSBjb25zdAoreworICAgIHJldHVybiBtRGVzY3JpcHRvcjsKK30KKworYm9vbCBBdWRpb0VmZmVjdDo6Z2V0RW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtRW5hYmxlZCAhPSAwKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKKyAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX29yKDEsICZtRW5hYmxlZCkgPT0gMCkgeworICAgICAgICAgICByZXR1cm4gbUlFZmZlY3QtPmVuYWJsZSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiZGlzYWJsZSAlcCIsIHRoaXMpOworICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfYW5kKH4xLCAmbUVuYWJsZWQpID09IDEpIHsKKyAgICAgICAgICAgcmV0dXJuIG1JRWZmZWN0LT5kaXNhYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVwbHlEYXRhKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgTE9HVigiY29tbWFuZCgpIGJhZCBzdGF0dXMgJWQiLCBtU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmICgoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0VOQUJMRSB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfRElTQUJMRSkgJiYKKyAgICAgICAgICAgIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihzdGF0dXNfdCkgfHwgcmVwbHlEYXRhID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUlFZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgY21kU2l6ZSwgY21kRGF0YSwgcmVwbHlTaXplLCByZXBseURhdGEpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0VOQUJMRSB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfRElTQUJMRSkgeworICAgICAgICBzdGF0dXMgPSAqKHN0YXR1c190ICopcmVwbHlEYXRhOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfRU5BQkxFKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcigxLCAmbUVuYWJsZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH4xLCAmbUVuYWJsZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnBzaXplID09IDAgfHwgcGFyYW0tPnZzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKGludCk7CisgICAgdWludDMyX3QgcHNpemUgPSAoKHBhcmFtLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpICsgcGFyYW0tPnZzaXplOworCisgICAgTE9HVigic2V0UGFyYW1ldGVyOiBwYXJhbTogJWQsIHBhcmFtMjogJWQiLCAqKGludCAqKXBhcmFtLT5kYXRhLCAocGFyYW0tPnBzaXplID09IDgpID8gKigoaW50ICopcGFyYW0tPmRhdGEgKyAxKTogLTEpOworCisgICAgcmV0dXJuIG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YgKGVmZmVjdF9wYXJhbV90KSArIHBzaXplLCBwYXJhbSwgJnNpemUsICZwYXJhbS0+c3RhdHVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldFBhcmFtZXRlckRlZmVycmVkKGVmZmVjdF9wYXJhbV90ICpwYXJhbSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnBzaXplID09IDAgfHwgcGFyYW0tPnZzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNibGstPmxvY2spOworCisgICAgaW50IHBzaXplID0gKChwYXJhbS0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KSArIHBhcmFtLT52c2l6ZTsKKyAgICBpbnQgc2l6ZSA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisKKyAgICBpZiAobUNibGstPmNsaWVudEluZGV4ICsgc2l6ZSA+IEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBpbnQgKnAgPSAoaW50ICopKG1DYmxrLT5idWZmZXIgKyBtQ2Jsay0+Y2xpZW50SW5kZXgpOworICAgICpwKysgPSBzaXplOworICAgIG1lbWNweShwLCBwYXJhbSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplKTsKKyAgICBtQ2Jsay0+Y2xpZW50SW5kZXggKz0gc2l6ZTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldFBhcmFtZXRlckNvbW1pdCgpCit7CisgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2Jsay0+bG9jayk7CisgICAgaWYgKG1DYmxrLT5jbGllbnRJbmRleCA9PSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZSA9IDA7CisgICAgcmV0dXJuIG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgMCwgTlVMTCwgJnNpemUsIE5VTEwpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUiAmJiBtU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCBwYXJhbS0+cHNpemUgPT0gMCB8fCBwYXJhbS0+dnNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIExPR1YoImdldFBhcmFtZXRlcjogcGFyYW06ICVkLCBwYXJhbTI6ICVkIiwgKihpbnQgKilwYXJhbS0+ZGF0YSwgKHBhcmFtLT5wc2l6ZSA9PSA4KSA/ICooKGludCAqKXBhcmFtLT5kYXRhICsgMSk6IC0xKTsKKworICAgIHVpbnQzMl90IHBzaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArICgocGFyYW0tPnBzaXplIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkgKyBwYXJhbS0+dnNpemU7CisKKyAgICByZXR1cm4gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9HRVRfUEFSQU0sIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwYXJhbS0+cHNpemUsIHBhcmFtLCAmcHNpemUsIHBhcmFtKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQXVkaW9FZmZlY3Q6OmJpbmRlckRpZWQoKQoreworICAgIExPR1coIklFZmZlY3QgZGllZCIpOworICAgIG1TdGF0dXMgPSBOT19JTklUOworICAgIGlmIChtQ2JmKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICBtQ2JmKEVWRU5UX0VSUk9SLCBtVXNlckRhdGEsICZzdGF0dXMpOworICAgIH0KKyAgICBtSUVmZmVjdC5jbGVhcigpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQXVkaW9FZmZlY3Q6OmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpCit7CisgICAgTE9HVigiY29udHJvbFN0YXR1c0NoYW5nZWQgJXAgY29udHJvbCAlZCBjYWxsYmFjayAlcCBtVXNlckRhdGEgJXAiLCB0aGlzLCBjb250cm9sR3JhbnRlZCwgbUNiZiwgbVVzZXJEYXRhKTsKKyAgICBpZiAoY29udHJvbEdyYW50ZWQpIHsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtU3RhdHVzID0gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1DYmYpIHsKKyAgICAgICAgbUNiZihFVkVOVF9DT05UUk9MX1NUQVRVU19DSEFOR0VELCBtVXNlckRhdGEsICZjb250cm9sR3JhbnRlZCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRWZmZWN0OjplbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkICVwIGVuYWJsZWQgJWQgbUNiZiAlcCIsIHRoaXMsIGVuYWJsZWQsIG1DYmYpOworICAgIGlmIChtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcigxLCAmbUVuYWJsZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH4xLCAmbUVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2JmKSB7CisgICAgICAgICAgICBtQ2JmKEVWRU5UX0VOQUJMRV9TVEFUVVNfQ0hBTkdFRCwgbVVzZXJEYXRhLCAmZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9FZmZlY3Q6OmNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVwbHlEYXRhKQoreworICAgIGlmIChjbWREYXRhID09IE5VTEwgfHwgcmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2JmICYmIGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU0pIHsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmNtZCA9IChlZmZlY3RfcGFyYW1fdCAqKWNtZERhdGE7CisgICAgICAgIGNtZC0+c3RhdHVzID0gKihpbnQzMl90ICopcmVwbHlEYXRhOworICAgICAgICBtQ2JmKEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VELCBtVXNlckRhdGEsIGNtZCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvRWZmZWN0Ojpsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+bG9hZEVmZmVjdExpYnJhcnkobGliUGF0aCwgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+dW5sb2FkRWZmZWN0TGlicmFyeShoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5xdWVyeU51bWJlckVmZmVjdHMobnVtRWZmZWN0cyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+cXVlcnlFZmZlY3QoaW5kZXgsIGRlc2NyaXB0b3IpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIGRlc2NyaXB0b3IpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKQoreworICAgIGlmIChzdHIgPT0gTlVMTCB8fCBndWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgdG1wWzEwXTsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGd1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIGd1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIGd1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICBndWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIGd1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgZ3VpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICBndWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIGd1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgZ3VpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICpndWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCit7CisgICAgaWYgKGd1aWQgPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgZ3VpZC0+dGltZUxvdywKKyAgICAgICAgICAgIGd1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICBndWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgZ3VpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICBndWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAppbmRleCBhZDAzN2Q2Li5hNmM1MTVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCkBAIC00MSwxMSArNDEsNDMgQEAKICNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0YXRpYworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmdldE1pbkZyYW1lQ291bnQoCisgICAgICAgIGludCogZnJhbWVDb3VudCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IGNoYW5uZWxDb3VudCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsICZzaXplKQorICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZS4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxDb3VudCAlZCIsCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgorICAgIHNpemUgPDw9IDE7CisKKyAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKKyAgICAgICAgc2l6ZSAvPSBjaGFubmVsQ291bnQgKiAoZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUID8gMiA6IDEpOworICAgIH0KKworICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKQogewogfQogCkBAIC01OCwxMSArOTAsMTIgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzKQotICAgIDogbVN0YXR1cyhOT19JTklUKQorICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBpbnQgc2Vzc2lvbklkKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKQogewogICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsCi0gICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzZXNzaW9uSWQpOwogfQogCiBBdWRpb1JlY29yZDo6fkF1ZGlvUmVjb3JkKCkKQEAgLTkxLDcgKzEyNCw4IEBACiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhKQorICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICBpbnQgc2Vzc2lvbklkKQogewogCiAgICAgTE9HVigic2V0KCk6IHNhbXBsZVJhdGUgJWQsIGNoYW5uZWxzICVkLCBmcmFtZUNvdW50ICVkIixzYW1wbGVSYXRlLCBjaGFubmVscywgZnJhbWVDb3VudCk7CkBAIC0xMTksNiArMTUzLDcgQEAKICAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0lucHV0Q2hhbm5lbChjaGFubmVscykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisKICAgICBpbnQgY2hhbm5lbENvdW50ID0gQXVkaW9TeXN0ZW06OnBvcENvdW50KGNoYW5uZWxzKTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KGlucHV0U291cmNlLApAQCAtMTI5LDI5ICsxNjQsMTEgQEAKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IGlucHV0QnVmZlNpemVJbkJ5dGVzID0gLTE7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsICZpbnB1dEJ1ZmZTaXplSW5CeXRlcykKLSAgICAgICAgICAgICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUuIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIGludCBtaW5GcmFtZUNvdW50ID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNaW5GcmFtZUNvdW50KCZtaW5GcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLQotICAgIGlmIChpbnB1dEJ1ZmZTaXplSW5CeXRlcyA9PSAwKSB7Ci0gICAgICAgIExPR0UoIlJlY29yZGluZyBwYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkOiBzYW1wbGVSYXRlICVkLCBjaGFubmVsQ291bnQgJWQsIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaW50IGZyYW1lU2l6ZUluQnl0ZXMgPSBjaGFubmVsQ291bnQgKiAoZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUID8gMiA6IDEpOwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00oZm9ybWF0KSkgewotICAgICAgICBmcmFtZVNpemVJbkJ5dGVzID0gY2hhbm5lbENvdW50ICogKGZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCA/IHNpemVvZihpbnQxNl90KSA6IHNpemVvZihpbnQ4X3QpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZVNpemVJbkJ5dGVzID0gc2l6ZW9mKGludDhfdCk7Ci0gICAgfQotCi0KLSAgICAvLyBXZSB1c2UgMiogc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KLSAgICBpbnQgbWluRnJhbWVDb3VudCA9IDIgKiBpbnB1dEJ1ZmZTaXplSW5CeXRlcyAvIGZyYW1lU2l6ZUluQnl0ZXM7CiAgICAgTE9HVigiQXVkaW9SZWNvcmQ6OnNldCgpIG1pbkZyYW1lQ291bnQgPSAlZCIsIG1pbkZyYW1lQ291bnQpOwogCiAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewpAQCAtMTY0LDEwICsxODEsMTEgQEAKICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudC8yOwogICAgIH0KIAotICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBpbnB1dCk7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIAorICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCisgICAgc3RhdHVzID0gb3BlblJlY29yZChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBpbnB1dCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KQEAgLTQxNCw2ICs0MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogICAgIGlmIChyZWNvcmQgPT0gMCkgewogICAgICAgICBMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwpAQCAtNDMwLDcgKzQ0OSw3IEBACiAgICAgbUNibGtNZW1vcnkgPSBjYmxrOwogICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oY2Jsay0+cG9pbnRlcigpKTsKICAgICBtQ2Jsay0+YnVmZmVycyA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwotICAgIG1DYmxrLT5vdXQgPSAwOworICAgIG1DYmxrLT5mbGFncyAmPSB+Q0JMS19ESVJFQ1RJT05fTVNLOwogICAgIG1DYmxrLT5idWZmZXJUaW1lb3V0TXMgPSBNQVhfUlVOX1RJTUVPVVRfTVM7CiAgICAgbUNibGstPndhaXRUaW1lTXMgPSAwOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTUzMiw2ICs1NTEsMTEgQEAKICAgICByZXR1cm4gbUlucHV0OwogfQogCitpbnQgQXVkaW9SZWNvcmQ6OmdldFNlc3Npb25JZCgpCit7CisgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3NpemVfdCBBdWRpb1JlY29yZDo6cmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSkKQEAgLTY0NCwxMCArNjY4LDEwIEBACiAKICAgICAvLyBNYW5hZ2Ugb3ZlcnJ1biBjYWxsYmFjawogICAgIGlmIChtQWN0aXZlICYmIChtQ2Jsay0+ZnJhbWVzQXZhaWxhYmxlX2woKSA9PSAwKSkgewotICAgICAgICBMT0dWKCJPdmVycnVuIHVzZXI6ICV4LCBzZXJ2ZXI6ICV4LCBmbG93Q29udHJvbEZsYWcgJWQiLCBtQ2Jsay0+dXNlciwgbUNibGstPnNlcnZlciwgbUNibGstPmZsb3dDb250cm9sRmxhZyk7Ci0gICAgICAgIGlmIChtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID09IDApIHsKKyAgICAgICAgTE9HVigiT3ZlcnJ1biB1c2VyOiAleCwgc2VydmVyOiAleCwgZmxhZ3MgJTA0eCIsIG1DYmxrLT51c2VyLCBtQ2Jsay0+c2VydmVyLCBtQ2Jsay0+ZmxhZ3MpOworICAgICAgICBpZiAoKG1DYmxrLT5mbGFncyAmIENCTEtfVU5ERVJSVU5fTVNLKSA9PSBDQkxLX1VOREVSUlVOX09GRikgewogICAgICAgICAgICAgbUNiZihFVkVOVF9PVkVSUlVOLCBtVXNlckRhdGEsIDApOwotICAgICAgICAgICAgbUNibGstPmZsb3dDb250cm9sRmxhZyA9IDE7CisgICAgICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDVlNmNlNDIuLjdlM2I3NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTM2NCw2ICszNjQsMTIgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitpbnQgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvU2Vzc2lvbklkKCkgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gYWYtPm5ld0F1ZGlvU2Vzc2lvbklkKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewpAQCAtNTg0LDE4ICs1OTAsMjIgQEAKICAgICByZXR1cm4gb3V0cHV0OwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSk7CisgICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKIHZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQpAQCAtNjYwLDYgKzY3MCwzOCBAQAogICAgIHJldHVybiBhcHMtPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgpOwogfQogCit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGFwcy0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyRWZmZWN0KGRlc2MsIG91dHB1dCwgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+dW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAppbmRleCBjZDdiY2Q1Li41ODdjOGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcApAQCAtNDEsNiArNDEsMzUgQEAKICNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0YXRpYworc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCgKKyAgICAgICAgaW50KiBmcmFtZUNvdW50LAorICAgICAgICBpbnQgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSkKK3sKKyAgICBpbnQgYWZTYW1wbGVSYXRlOworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgYWZGcmFtZUNvdW50OworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgdWludDMyX3QgYWZMYXRlbmN5OworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKKyAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeSAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkgLyBhZlNhbXBsZVJhdGUpOworICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIG1pbkJ1ZkNvdW50ID0gMjsKKworICAgICpmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUgPT0gMCkgPyBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCA6CisgICAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogc2FtcGxlUmF0ZSAvIGFmU2FtcGxlUmF0ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC01OCwxMSArODcsMTMgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzKQorICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogbVN0YXR1cyhOT19JTklUKQogewogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgMCk7CisgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAwLCBmYWxzZSwgc2Vzc2lvbklkKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTc0LDExICsxMDUsMTMgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzKQorICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogbVN0YXR1cyhOT19JTklUKQogewogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKLSAgICAgICAgICAgIDAsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgIDAsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCk7CiB9CiAKIEF1ZGlvVHJhY2s6On5BdWRpb1RyYWNrKCkKQEAgLTExMCw3ICsxNDMsOCBAQAogICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhKQorICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICBpbnQgc2Vzc2lvbklkKQogewogCiAgICAgTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKQEAgLTEyNCwxMCArMTU4LDYgQEAKICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaW50IGFmRnJhbWVDb3VudDsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHVpbnQzMl90IGFmTGF0ZW5jeTsKICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dExhdGVuY3koJmFmTGF0ZW5jeSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNzMsNDggKzIwMywxNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKLSAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIG1pbkJ1ZkNvdW50ID0gMjsKLQotICAgICAgICBpbnQgbWluRnJhbWVDb3VudCA9IChhZkZyYW1lQ291bnQqc2FtcGxlUmF0ZSptaW5CdWZDb3VudCkvYWZTYW1wbGVSYXRlOwotCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudC8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbgotICAgICAgICAgICAgLy8gYmVmb3JlIHVuZGVycnVuCi0gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID4gZnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudC8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgIExPR0UoIkludmFsaWQgYnVmZmVyIHNpemU6IG1pbkZyYW1lQ291bnQgJWQsIGZyYW1lQ291bnQgJWQiLCBtaW5GcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsY291bnQKLSAgICAgICAgICAgIGlmICgoKHVpbnQzMl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGNoYW5uZWxDb3VudCB8IDEpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25lbWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbENvdW50ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKS9jaGFubmVsQ291bnQvc2l6ZW9mKGludDE2X3QpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVZvbHVtZVtMRUZUXSA9IDEuMGY7CiAgICAgbVZvbHVtZVtSSUdIVF0gPSAxLjBmOworICAgIG1TZW5kTGV2ZWwgPSAwOworICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgbUF1eEVmZmVjdElkID0gMDsKKwogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVUcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgc2hhcmVkQnVmZmVyLCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBzaGFyZWRCdWZmZXIsIG91dHB1dCwgdHJ1ZSk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMzgsMTAgKzIzNyw3IEBACiAgICAgbU11dGVkID0gZmFsc2U7CiAgICAgbUFjdGl2ZSA9IDA7CiAgICAgbUNiZiA9IGNiZjsKLSAgICBtTm90aWZpY2F0aW9uRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwotICAgIG1SZW1haW5pbmdGcmFtZXMgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKLSAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKm1GcmFtZUNvdW50KSAvIHNhbXBsZVJhdGU7CiAgICAgbUxvb3BDb3VudCA9IDA7CiAgICAgbU1hcmtlclBvc2l0aW9uID0gMDsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwpAQCAtMjgxLDcgKzI3Nyw3IEBACiAKIHVpbnQzMl90IEF1ZGlvVHJhY2s6OmZyYW1lQ291bnQoKSBjb25zdAogewotICAgIHJldHVybiBtRnJhbWVDb3VudDsKKyAgICByZXR1cm4gbUNibGstPmZyYW1lQ291bnQ7CiB9CiAKIGludCBBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSBjb25zdApAQCAtMzAzLDYgKzI5OSw3IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0YXJ0KCkKIHsKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOwogCiAgICAgTE9HVigic3RhcnQgJXAiLCB0aGlzKTsKICAgICBpZiAodCAhPSAwKSB7CkBAIC0zMTksMTcgKzMxNiwyNSBAQAogICAgICAgICBtTmV3UG9zaXRpb24gPSBtQ2Jsay0+c2VydmVyICsgbVVwZGF0ZVBlcmlvZDsKICAgICAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVM7CiAgICAgICAgIG1DYmxrLT53YWl0VGltZU1zID0gMDsKKyAgICAgICAgbUNibGstPmZsYWdzICY9IH5DQkxLX0RJU0FCTEVEX09OOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBUSFJFQURfUFJJT1JJVFlfQVVESU9fQ0xJRU5UKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICBpZiAobUNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykgeworICAgICAgICAgICAgTE9HVygic3RhcnQoKSB0cmFjayAlcCBpbnZhbGlkYXRlZCwgY3JlYXRpbmcgYSBuZXcgb25lIiwgdGhpcyk7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNsZWFyIHRoZSBpbnZhbGlkIGZsYWcgYXMgdGhpcyBjYmxrIHdpbGwgbm90IGJlIHVzZWQgYW55bW9yZQorICAgICAgICAgICAgLy8gZm9yY2UgbmV3IHRyYWNrIGNyZWF0aW9uCisgICAgICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgIExPR1YoInN0YXJ0KCkgZGVhZCBJQXVkaW9UcmFjazogY3JlYXRpbmcgYSBuZXcgb25lIik7CiAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVUcmFjayhtU3RyZWFtVHlwZSwgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBtU2hhcmVkQnVmZmVyLCBnZXRPdXRwdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBtU2hhcmVkQnVmZmVyLCBnZXRPdXRwdXQoKSwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTQzMCwxOSArNDM1LDUwIEBACiAgICAgcmV0dXJuIG1NdXRlZDsKIH0KIAotdm9pZCBBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCiB7CisgICAgaWYgKGxlZnQgPiAxLjBmIHx8IHJpZ2h0ID4gMS4wZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIG1Wb2x1bWVbTEVGVF0gPSBsZWZ0OwogICAgIG1Wb2x1bWVbUklHSFRdID0gcmlnaHQ7CiAKICAgICAvLyB3cml0ZSBtdXN0IGJlIGF0b21pYwotICAgIG1DYmxrLT52b2x1bWVMUiA9IChpbnQzMl90KGludDE2X3QobGVmdCAqIDB4MTAwMCkpIDw8IDE2KSB8IGludDE2X3QocmlnaHQgKiAweDEwMDApOworICAgIG1DYmxrLT52b2x1bWVMUiA9ICh1aW50MzJfdCh1aW50MTZfdChyaWdodCAqIDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KGxlZnQgKiAweDEwMDApOworCisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB2b2lkIEF1ZGlvVHJhY2s6OmdldFZvbHVtZShmbG9hdCogbGVmdCwgZmxvYXQqIHJpZ2h0KQogewotICAgICpsZWZ0ICA9IG1Wb2x1bWVbTEVGVF07Ci0gICAgKnJpZ2h0ID0gbVZvbHVtZVtSSUdIVF07CisgICAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgICAgICAqbGVmdCAgPSBtVm9sdW1lW0xFRlRdOworICAgIH0KKyAgICBpZiAocmlnaHQgIT0gTlVMTCkgeworICAgICAgICAqcmlnaHQgPSBtVm9sdW1lW1JJR0hUXTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOworICAgIGlmIChsZXZlbCA+IDEuMGYpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU2VuZExldmVsID0gbGV2ZWw7CisKKyAgICBtQ2Jsay0+c2VuZExldmVsID0gdWludDE2X3QobGV2ZWwgKiAweDEwMDApOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvVHJhY2s6OmdldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCogbGV2ZWwpCit7CisgICAgaWYgKGxldmVsICE9IE5VTEwpIHsKKyAgICAgICAgKmxldmVsICA9IG1TZW5kTGV2ZWw7CisgICAgfQogfQogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRTYW1wbGVSYXRlKGludCByYXRlKQpAQCAtNDc5LDE0ICs1MTUsMTQgQEAKICAgICB9CiAKICAgICBpZiAobG9vcFN0YXJ0ID49IGxvb3BFbmQgfHwKLSAgICAgICAgbG9vcEVuZCAtIGxvb3BTdGFydCA+IG1GcmFtZUNvdW50KSB7Ci0gICAgICAgIExPR0UoInNldExvb3AgaW52YWxpZCB2YWx1ZTogbG9vcFN0YXJ0ICVkLCBsb29wRW5kICVkLCBsb29wQ291bnQgJWQsIGZyYW1lY291bnQgJWQsIHVzZXIgJWQiLCBsb29wU3RhcnQsIGxvb3BFbmQsIGxvb3BDb3VudCwgbUZyYW1lQ291bnQsIGNibGstPnVzZXIpOworICAgICAgICBsb29wRW5kIC0gbG9vcFN0YXJ0ID4gY2Jsay0+ZnJhbWVDb3VudCkgeworICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3BTdGFydCAlZCwgbG9vcEVuZCAlZCwgbG9vcENvdW50ICVkLCBmcmFtZWNvdW50ICVkLCB1c2VyICVkIiwgbG9vcFN0YXJ0LCBsb29wRW5kLCBsb29wQ291bnQsIGNibGstPmZyYW1lQ291bnQsIGNibGstPnVzZXIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSAmJiAobG9vcEVuZCAgID4gbUZyYW1lQ291bnQpKSB7CisgICAgaWYgKChtU2hhcmVkQnVmZmVyICE9IDApICYmIChsb29wRW5kICAgPiBjYmxrLT5mcmFtZUNvdW50KSkgewogICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3AgbWFya2VycyBiZXlvbmQgZGF0YTogbG9vcFN0YXJ0ICVkLCBsb29wRW5kICVkLCBmcmFtZWNvdW50ICVkIiwKLSAgICAgICAgICAgIGxvb3BTdGFydCwgbG9vcEVuZCwgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgbG9vcFN0YXJ0LCBsb29wRW5kLCBjYmxrLT5mcmFtZUNvdW50KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU2Niw3ICs2MDIsNyBAQAogICAgIGlmIChwb3NpdGlvbiA+IG1DYmxrLT51c2VyKSByZXR1cm4gQkFEX1ZBTFVFOwogCiAgICAgbUNibGstPnNlcnZlciA9IHBvc2l0aW9uOwotICAgIG1DYmxrLT5mb3JjZVJlYWR5ID0gMTsKKyAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19GT1JDRVJFQURZX09OOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNTg2LDcgKzYyMiw3IEBACiAKICAgICBmbHVzaCgpOwogCi0gICAgbUNibGstPnN0ZXBVc2VyKG1GcmFtZUNvdW50KTsKKyAgICBtQ2Jsay0+c3RlcFVzZXIobUNibGstPmZyYW1lQ291bnQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNTk3LDYgKzYzMywyMSBAQAogICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVscywgKEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MpbUZsYWdzKTsKIH0KIAoraW50IEF1ZGlvVHJhY2s6OmdldFNlc3Npb25JZCgpCit7CisgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCit7CisgICAgTE9HVigiYXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmNyZWF0ZVRyYWNrKApAQCAtNjA3LDcgKzY1OCw4IEBACiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgIGJvb2wgZW5mb3JjZUZyYW1lQ291bnQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKQEAgLTYxNiw2ICs2NjgsNjEgQEAKICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBpbnQgYWZTYW1wbGVSYXRlOworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgYWZGcmFtZUNvdW50OworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgdWludDMyX3QgYWZMYXRlbmN5OworICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKKyAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShmb3JtYXQpKSB7CisgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CisgICAgICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5IC8gKCgxMDAwICogYWZGcmFtZUNvdW50KS9hZlNhbXBsZVJhdGUpOworICAgICAgICBpZiAobWluQnVmQ291bnQgPCAyKSBtaW5CdWZDb3VudCA9IDI7CisKKyAgICAgICAgaW50IG1pbkZyYW1lQ291bnQgPSAoYWZGcmFtZUNvdW50KnNhbXBsZVJhdGUqbWluQnVmQ291bnQpL2FmU2FtcGxlUmF0ZTsKKworICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDApIHsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbgorICAgICAgICAgICAgLy8gYmVmb3JlIHVuZGVycnVuCisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+ICh1aW50MzJfdClmcmFtZUNvdW50LzIpIHsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGVuZm9yY2VGcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgYnVmZmVyIHNpemU6IG1pbkZyYW1lQ291bnQgJWQsIGZyYW1lQ291bnQgJWQiLCBtaW5GcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbGNvdW50CisgICAgICAgICAgICBpZiAoKCh1aW50MzJfdClzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSAmIChjaGFubmVsQ291bnQgfCAxKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgYnVmZmVyIGFsaWduZW1lbnQ6IGFkZHJlc3MgJXAsIGNoYW5uZWxDb3VudCAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCkvY2hhbm5lbENvdW50L3NpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKQEAgLTYyNSw2ICs3MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdClmbGFncykgPDwgMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHRyYWNrID09IDApIHsKQEAgLTY0MSwyMCArNzQ5LDIyIEBACiAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICBtQ2Jsa01lbW9yeSA9IGNibGs7CiAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwotICAgIG1DYmxrLT5vdXQgPSAxOwotICAgIC8vIFVwZGF0ZSBidWZmZXIgc2l6ZSBpbiBjYXNlIGl0IGhhcyBiZWVuIGxpbWl0ZWQgYnkgQXVkaW9GbGluZ2VyIGR1cmluZyB0cmFjayBjcmVhdGlvbgotICAgIG1GcmFtZUNvdW50ID0gbUNibGstPmZyYW1lQ291bnQ7CisgICAgbUNibGstPmZsYWdzIHw9IENCTEtfRElSRUNUSU9OX09VVDsKICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbUNibGstPmJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2Jsay0+YnVmZmVycyA9IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICAgLy8gRm9yY2UgYnVmZmVyIGZ1bGwgY29uZGl0aW9uIGFzIGRhdGEgaXMgYWxyZWFkeSBwcmVzZW50IGluIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgbUNibGstPnN0ZXBVc2VyKG1GcmFtZUNvdW50KTsKKyAgICAgICAgbUNibGstPnN0ZXBVc2VyKG1DYmxrLT5mcmFtZUNvdW50KTsKICAgICB9CiAKLSAgICBtQ2Jsay0+dm9sdW1lTFIgPSAoaW50MzJfdChpbnQxNl90KG1Wb2x1bWVbTEVGVF0gKiAweDEwMDApKSA8PCAxNikgfCBpbnQxNl90KG1Wb2x1bWVbUklHSFRdICogMHgxMDAwKTsKKyAgICBtQ2Jsay0+dm9sdW1lTFIgPSAodWludDMyX3QodWludDE2X3QobVZvbHVtZVtSSUdIVF0gKiAweDEwMDApKSA8PCAxNikgfCB1aW50MTZfdChtVm9sdW1lW0xFRlRdICogMHgxMDAwKTsKKyAgICBtQ2Jsay0+c2VuZExldmVsID0gdWludDE2X3QobVNlbmRMZXZlbCAqIDB4MTAwMCk7CisgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgIG1DYmxrLT5idWZmZXJUaW1lb3V0TXMgPSBNQVhfU1RBUlRVUF9USU1FT1VUX01TOwogICAgIG1DYmxrLT53YWl0VGltZU1zID0gMDsKKyAgICBtUmVtYWluaW5nRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKKyAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKm1DYmxrLT5mcmFtZUNvdW50KSAvIHNhbXBsZVJhdGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC02ODUsOCArNzk1LDE1IEBACiAgICAgICAgICAgICAgICAgY2Jsay0+bG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IGNibGstPmN2LndhaXRSZWxhdGl2ZShjYmxrLT5sb2NrLCBtaWxsaXNlY29uZHMod2FpdFRpbWVNcykpOworICAgICAgICAgICAgaWYgKCEoY2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNibGstPmN2LndhaXRSZWxhdGl2ZShjYmxrLT5sb2NrLCBtaWxsaXNlY29uZHMod2FpdFRpbWVNcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykgeworICAgICAgICAgICAgICAgIExPR1coIm9idGFpbkJ1ZmZlcigpIHRyYWNrICVwIGludmFsaWRhdGVkLCBjcmVhdGluZyBhIG5ldyBvbmUiLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNsZWFyIHRoZSBpbnZhbGlkIGZsYWcgYXMgdGhpcyBjYmxrIHdpbGwgbm90IGJlIHVzZWQgYW55bW9yZQorICAgICAgICAgICAgICAgIGNibGstPmxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgZ290byBjcmVhdGVfbmV3X3RyYWNrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QocmVzdWx0IT1OT19FUlJPUiwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgY2Jsay0+d2FpdFRpbWVNcyArPSB3YWl0VGltZU1zOwogICAgICAgICAgICAgICAgIGlmIChjYmxrLT53YWl0VGltZU1zID49IGNibGstPmJ1ZmZlclRpbWVvdXRNcykgewpAQCAtNzAwLDggKzgxNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJvYnRhaW5CdWZmZXIoKSBkZWFkIElBdWRpb1RyYWNrOiBjcmVhdGluZyBhIG5ldyBvbmUiKTsKK2NyZWF0ZV9uZXdfdHJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2sobVN0cmVhbVR5cGUsIGNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1GbGFncywgbVNoYXJlZEJ1ZmZlciwgZ2V0T3V0cHV0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtRmxhZ3MsIG1TaGFyZWRCdWZmZXIsIGdldE91dHB1dCgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrID0gbUNibGs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKQEAgLTcyNSw2ICs4NDMsMTMgQEAKICAgICAgICAgY2Jsay0+bG9jay51bmxvY2soKTsKICAgICB9CiAKKyAgICAvLyByZXN0YXJ0IHRyYWNrIGlmIGl0IHdhcyBkaXNhYmxlZCBieSBhdWRpb2ZsaW5nZXIgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuCisgICAgaWYgKGNibGstPmZsYWdzICYgQ0JMS19ESVNBQkxFRF9NU0spIHsKKyAgICAgICAgY2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRElTQUJMRURfT047CisgICAgICAgIExPR1coIm9idGFpbkJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkLCByZXN0YXJ0aW5nIiwgdGhpcyk7CisgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgIH0KKwogICAgIGNibGstPndhaXRUaW1lTXMgPSAwOwogCiAgICAgaWYgKGZyYW1lc1JlcSA+IGZyYW1lc0F2YWlsKSB7CkBAIC04MjYsMTMgKzk1MSwxMyBAQAogCiAgICAgLy8gTWFuYWdlIHVuZGVycnVuIGNhbGxiYWNrCiAgICAgaWYgKG1BY3RpdmUgJiYgKG1DYmxrLT5mcmFtZXNSZWFkeSgpID09IDApKSB7Ci0gICAgICAgIExPR1YoIlVuZGVycnVuIHVzZXI6ICV4LCBzZXJ2ZXI6ICV4LCBmbG93Q29udHJvbEZsYWcgJWQiLCBtQ2Jsay0+dXNlciwgbUNibGstPnNlcnZlciwgbUNibGstPmZsb3dDb250cm9sRmxhZyk7Ci0gICAgICAgIGlmIChtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID09IDApIHsKKyAgICAgICAgTE9HVigiVW5kZXJydW4gdXNlcjogJXgsIHNlcnZlcjogJXgsIGZsYWdzICUwNHgiLCBtQ2Jsay0+dXNlciwgbUNibGstPnNlcnZlciwgbUNibGstPmZsYWdzKTsKKyAgICAgICAgaWYgKChtQ2Jsay0+ZmxhZ3MgJiBDQkxLX1VOREVSUlVOX01TSykgPT0gQ0JMS19VTkRFUlJVTl9PRkYpIHsKICAgICAgICAgICAgIG1DYmYoRVZFTlRfVU5ERVJSVU4sIG1Vc2VyRGF0YSwgMCk7CiAgICAgICAgICAgICBpZiAobUNibGstPnNlcnZlciA9PSBtQ2Jsay0+ZnJhbWVDb3VudCkgewogICAgICAgICAgICAgICAgIG1DYmYoRVZFTlRfQlVGRkVSX0VORCwgbVVzZXJEYXRhLCAwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOworICAgICAgICAgICAgbUNibGstPmZsYWdzIHw9IENCTEtfVU5ERVJSVU5fT047CiAgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC05MzIsNyArMTA1Nyw3IEBACiAgICAgd2hpbGUgKGZyYW1lcyk7CiAKICAgICBpZiAoZnJhbWVzID09IDApIHsKLSAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgPSBmcmFtZXM7CiAgICAgfQpAQCAtOTQ5LDcgKzEwNzQsNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLCBtVm9sdW1lWzBdLCBtVm9sdW1lWzFdKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGZvcm1hdCglZCksIGNoYW5uZWwgY291bnQoJWQpLCBmcmFtZSBjb3VudCglZClcbiIsIG1Gb3JtYXQsIG1DaGFubmVsQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCVkKVxuIiwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwgbUNibGstPmZyYW1lQ291bnQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJWQpLCBzdGF0dXMoJWQpLCBtdXRlZCglZClcbiIsIChtQ2JsayA9PSAwKSA/IDAgOiBtQ2Jsay0+c2FtcGxlUmF0ZSwgbVN0YXR1cywgbU11dGVkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC05ODYsNyArMTExMSw3IEBACiAgICAgOiBsb2NrKE11dGV4OjpTSEFSRUQpLCBjdihDb25kaXRpb246OlNIQVJFRCksIHVzZXIoMCksIHNlcnZlcigwKSwKICAgICB1c2VyQmFzZSgwKSwgc2VydmVyQmFzZSgwKSwgYnVmZmVycygwKSwgZnJhbWVDb3VudCgwKSwKICAgICBsb29wU3RhcnQoVUlOVF9NQVgpLCBsb29wRW5kKFVJTlRfTUFYKSwgbG9vcENvdW50KDApLCB2b2x1bWVMUigwKSwKLSAgICBmbG93Q29udHJvbEZsYWcoMSksIGZvcmNlUmVhZHkoMCkKKyAgICBmbGFncygwKSwgc2VuZExldmVsKDApCiB7CiB9CiAKQEAgLTk5Niw3ICsxMTIxLDcgQEAKIAogICAgIHUgKz0gZnJhbWVDb3VudDsKICAgICAvLyBFbnN1cmUgdGhhdCB1c2VyIGlzIG5ldmVyIGFoZWFkIG9mIHNlcnZlciBmb3IgQXVkaW9SZWNvcmQKLSAgICBpZiAob3V0KSB7CisgICAgaWYgKGZsYWdzICYgQ0JMS19ESVJFQ1RJT05fTVNLKSB7CiAgICAgICAgIC8vIElmIHN0ZXBTZXJ2ZXIoKSBoYXMgYmVlbiBjYWxsZWQgb25jZSwgc3dpdGNoIHRvIG5vcm1hbCBvYnRhaW5CdWZmZXIoKSB0aW1lb3V0IHBlcmlvZAogICAgICAgICBpZiAoYnVmZmVyVGltZW91dE1zID09IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMtMSkgewogICAgICAgICAgICAgYnVmZmVyVGltZW91dE1zID0gTUFYX1JVTl9USU1FT1VUX01TOwpAQCAtMTAxMyw3ICsxMTM4LDcgQEAKICAgICB0aGlzLT51c2VyID0gdTsKIAogICAgIC8vIENsZWFyIGZsb3cgY29udHJvbCBlcnJvciBjb25kaXRpb24gYXMgbmV3IGRhdGEgaGFzIGJlZW4gd3JpdHRlbi9yZWFkIHRvL2Zyb20gYnVmZmVyLgotICAgIGZsb3dDb250cm9sRmxhZyA9IDA7CisgICAgZmxhZ3MgJj0gfkNCTEtfVU5ERVJSVU5fTVNLOwogCiAgICAgcmV0dXJuIHU7CiB9CkBAIC0xMDM4LDcgKzExNjMsNyBAQAogICAgIHVpbnQzMl90IHMgPSB0aGlzLT5zZXJ2ZXI7CiAKICAgICBzICs9IGZyYW1lQ291bnQ7Ci0gICAgaWYgKG91dCkgeworICAgIGlmIChmbGFncyAmIENCTEtfRElSRUNUSU9OX01TSykgewogICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSByZWFkIHRoZSBmaXJzdCBidWZmZXIgc28gdGhhdCBuZXh0IHRpbWUgc3RlcFVzZXIoKSBpcyBjYWxsZWQKICAgICAgICAgLy8gd2Ugc3dpdGNoIHRvIG5vcm1hbCBvYnRhaW5CdWZmZXIoKSB0aW1lb3V0IHBlcmlvZAogICAgICAgICBpZiAoYnVmZmVyVGltZW91dE1zID09IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMpIHsKQEAgLTEwODksNyArMTIxNCw3IEBACiAgICAgdWludDMyX3QgdSA9IHRoaXMtPnVzZXI7CiAgICAgdWludDMyX3QgcyA9IHRoaXMtPnNlcnZlcjsKIAotICAgIGlmIChvdXQpIHsKKyAgICBpZiAoZmxhZ3MgJiBDQkxLX0RJUkVDVElPTl9NU0spIHsKICAgICAgICAgdWludDMyX3QgbGltaXQgPSAocyA8IGxvb3BTdGFydCkgPyBzIDogbG9vcFN0YXJ0OwogICAgICAgICByZXR1cm4gbGltaXQgKyBmcmFtZUNvdW50IC0gdTsKICAgICB9IGVsc2UgewpAQCAtMTEwMiw3ICsxMjI3LDcgQEAKICAgICB1aW50MzJfdCB1ID0gdGhpcy0+dXNlcjsKICAgICB1aW50MzJfdCBzID0gdGhpcy0+c2VydmVyOwogCi0gICAgaWYgKG91dCkgeworICAgIGlmIChmbGFncyAmIENCTEtfRElSRUNUSU9OX01TSykgewogICAgICAgICBpZiAodSA8IGxvb3BFbmQpIHsKICAgICAgICAgICAgIHJldHVybiB1IC0gczsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggNDdiY2MxMi4uM2E4OWUyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTYyLDcgKzYyLDE1IEBACiAgICAgU0VUX1NUUkVBTV9PVVRQVVQsCiAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKICAgICBHRVRfUkVOREVSX1BPU0lUSU9OLAotICAgIEdFVF9JTlBVVF9GUkFNRVNfTE9TVAorICAgIEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwKKyAgICBORVdfQVVESU9fU0VTU0lPTl9JRCwKKyAgICBMT0FEX0VGRkVDVF9MSUJSQVJZLAorICAgIFVOTE9BRF9FRkZFQ1RfTElCUkFSWSwKKyAgICBRVUVSWV9OVU1fRUZGRUNUUywKKyAgICBRVUVSWV9FRkZFQ1QsCisgICAgR0VUX0VGRkVDVF9ERVNDUklQVE9SLAorICAgIENSRUFURV9FRkZFQ1QsCisgICAgTU9WRV9FRkZFQ1RTCiB9OwogCiBjbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgpAQCAtODMsNiArOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC05NywxMCArMTA2LDE5IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2hhcmVkQnVmZmVyLT5hc0JpbmRlcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7CisgICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIobFNlc3Npb25JZCk7CiAgICAgICAgIHN0YXR1c190IGxTdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1RSQUNLLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgTE9HRSgiY3JlYXRlVHJhY2sgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdHJhY2sgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9UcmFjaz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQpAQCAtMTE4LDYgKzEzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xMzAsMTAgKzE0OSwxOSBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbENvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IDA7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOwogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fUkVDT1JELCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgTE9HRSgib3BlblJlY29yZCBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbFNlc3Npb25JZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9SZWNvcmQ+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgIH0KQEAgLTQ5Nyw2ICs1MjUsMTY5IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTkVXX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGludCBpZCA9IDA7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCisgICAgeworICAgICAgICBpZiAobGliUGF0aCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpoYW5kbGUgPSAwOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhsaWJQYXRoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICpoYW5kbGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTkxPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfTlVNX0VGRkVDVFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bUVmZmVjdHMpIHsKKyAgICAgICAgICAgICpudW1FZmZlY3RzID0gKHVpbnQzMl90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChwRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICpwVXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCisgICAgeworICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocFV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRUZGRUNUX0RFU0NSSVBUT1IsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChwRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3Q7CisKKyAgICAgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICByZXR1cm4gZWZmZWN0OworICAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOworICAgICAgICBkYXRhLndyaXRlKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKworICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJjcmVhdGVFZmZlY3QgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChpZCkgeworICAgICAgICAgICAgICAgICppZCA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAqZW5hYmxlZCA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVmZmVjdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLCBpbnQgc3JjT3V0cHV0LCBpbnQgZHN0T3V0cHV0KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3JjT3V0cHV0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRzdE91dHB1dCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNT1ZFX0VGRkVDVFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9GbGluZ2VyIik7CkBAIC01MTgsMTAgKzcwOSwxMiBAQAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgaW50IG91dHB1dCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKICAgICAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGNyZWF0ZVRyYWNrKHBpZCwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBmbGFncywgYnVmZmVyLCBvdXRwdXQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBmbGFncywgYnVmZmVyLCBvdXRwdXQsICZzZXNzaW9uSWQsICZzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIodHJhY2stPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTM1LDkgKzcyOCwxMSBAQAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgICAgICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IG9wZW5SZWNvcmQocGlkLCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBmbGFncywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBidWZmZXJDb3VudCwgZmxhZ3MsICZzZXNzaW9uSWQsICZzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmVjb3JkLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTc2OCw3ICs5NjMsODcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE5FV19BVURJT19TRVNTSU9OX0lEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9TZXNzaW9uSWQoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9FRkZFQ1RfTElCUkFSWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsb2FkRWZmZWN0TGlicmFyeShkYXRhLnJlYWRDU3RyaW5nKCksICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgVU5MT0FEX0VGRkVDVF9MSUJSQVJZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodW5sb2FkRWZmZWN0TGlicmFyeShkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBxdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCludW1FZmZlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFFVRVJZX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHF1ZXJ5RWZmZWN0KGRhdGEucmVhZEludDMyKCksICZkZXNjKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX0VGRkVDVF9ERVNDUklQVE9SOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJmRlc2MpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDUkVBVEVfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcGlkX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgIHNwPElFZmZlY3RDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3RDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IG91dHB1dCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgIGludCBlbmFibGVkOwogCisgICAgICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3QgPSBjcmVhdGVFZmZlY3QocGlkLCAmZGVzYywgY2xpZW50LCBwcmlvcml0eSwgb3V0cHV0LCBzZXNzaW9uSWQsICZzdGF0dXMsICZpZCwgJmVuYWJsZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVuYWJsZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGVmZmVjdC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTU9WRV9FRkZFQ1RTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHNyY091dHB1dCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgZHN0T3V0cHV0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY091dHB1dCwgZHN0T3V0cHV0KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMThkZDE3My4uOTUwYzIxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTQ0LDcgKzQ0LDExIEBACiAgICAgUkVMRUFTRV9JTlBVVCwKICAgICBJTklUX1NUUkVBTV9WT0xVTUUsCiAgICAgU0VUX1NUUkVBTV9WT0xVTUUsCi0gICAgR0VUX1NUUkVBTV9WT0xVTUUKKyAgICBHRVRfU1RSRUFNX1ZPTFVNRSwKKyAgICBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwKKyAgICBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1QsCisgICAgUkVHSVNURVJfRUZGRUNULAorICAgIFVOUkVHSVNURVJfRUZGRUNUCiB9OwogCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgpAQCAtMTM3LDIyICsxNDEsMjggQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTI0Miw2ICsyNTIsNTEgQEAKICAgICAgICAgaWYgKGluZGV4KSAqaW5kZXggPSBsSW5kZXg7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RyZWFtKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1VUUFVUX0ZPUl9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyYXRlZ3kpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTI1NSwxOCArMzEwLDI0IEBACiAgICAgc3dpdGNoKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXM+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXM+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZT4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcykpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEdFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcz4gKGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIGRldmljZV9hZGRyZXNzKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTI4Nyw3ICszNDgsOCBAQAogICAgICAgICBjYXNlIFNFVF9GT1JDRV9VU0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpmb3JjZV91c2U+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZz4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0zMDEsMTEgKzM2MywxMyBAQAogCiAgICAgICAgIGNhc2UgR0VUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncyA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncz4oZGF0YS5yZWFkSW50MzIoKSk7CiAKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLApAQCAtMzIwLDcgKzM4NCwxMCBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChvdXRwdXQsIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKSkpOworICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0zMjgsNyArMzk1LDEwIEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LCAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSkpKTsKKyAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMzQ1LDcgKzQxNSw4IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3M+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcz4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGdldElucHV0KGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKQEAgLTM3OCw3ICs0NDksOCBAQAogCiAgICAgICAgIGNhc2UgSU5JVF9TVFJFQU1fVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IGluZGV4TWluID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBpbmRleE1heCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbixpbmRleE1heCkpKTsKQEAgLTM4Nyw3ICs0NTksOCBAQAogCiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4KSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMzk1LDcgKzQ2OCw4IEBACiAKICAgICAgICAgY2FzZSBHRVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBpbmRleDsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgJmluZGV4KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKQEAgLTQwMyw2ICs0NzcsNDYgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoJmRlc2MpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4ob3V0cHV0KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRUdJU1RFUl9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3kgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZWdpc3RlckVmZmVjdCgmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFVOUkVHSVNURVJfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90Pih1bnJlZ2lzdGVyRWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAppbmRleCAwMWZmZDc1Li5iYzhmZjM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCkBAIC0zNCw3ICszNCw4IEBACiAgICAgU1RPUCwKICAgICBGTFVTSCwKICAgICBNVVRFLAotICAgIFBBVVNFCisgICAgUEFVU0UsCisgICAgQVRUQUNIX0FVWF9FRkZFQ1QKIH07CiAKIGNsYXNzIEJwQXVkaW9UcmFjayA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9UcmFjaz4KQEAgLTk3LDcgKzk4LDIxIEBACiAgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKLSAgICB9ICAgIAorICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZWZmZWN0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNIX0FVWF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiYXR0YWNoQXV4RWZmZWN0KCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvVHJhY2ssICJhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrIik7CkBAIC0xMzgsNiArMTUzLDExIEBACiAgICAgICAgICAgICBwYXVzZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQVRUQUNIX0FVWF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYXR0YWNoQXV4RWZmZWN0KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ1Yjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUVmZmVjdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIEVOQUJMRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgRElTQUJMRSwKKyAgICBDT01NQU5ELAorICAgIERJU0NPTk5FQ1QsCisgICAgR0VUX0NCTEsKK307CisKK2NsYXNzIEJwRWZmZWN0OiBwdWJsaWMgQnBJbnRlcmZhY2U8SUVmZmVjdD4KK3sKK3B1YmxpYzoKKyAgICBCcEVmZmVjdChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJRWZmZWN0PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlbmFibGUoKQorICAgIHsKKyAgICAgICAgTE9HVigiZW5hYmxlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBkaXNhYmxlKCkKKyAgICB7CisgICAgICAgIExPR1YoImRpc2FibGUiKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0FCTEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCisgICAgeworICAgICAgICBMT0dWKCJjb21tYW5kIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWRDb2RlKTsKKyAgICAgICAgaW50IHNpemUgPSBjbWRTaXplOworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgZGF0YS53cml0ZShwQ21kRGF0YSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBSZXBseVNpemUgPT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplID0gKnBSZXBseVNpemU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09NTUFORCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHNpemUgIT0gMCAmJiBwUmVwbHlEYXRhICE9IE5VTEwgJiYgcFJlcGx5U2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXBseS5yZWFkKHBSZXBseURhdGEsIHNpemUpOworICAgICAgICAgICAgKnBSZXBseVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkKKyAgICB7CisgICAgICAgIExPR1YoImRpc2Nvbm5lY3QiKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2JsazsKKyAgICB9CisgfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEVmZmVjdCwgImFuZHJvaWQubWVkaWEuSUVmZmVjdCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuRWZmZWN0OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBFTkFCTEU6IHsKKyAgICAgICAgICAgIExPR1YoIkVOQUJMRSIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVuYWJsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERJU0FCTEU6IHsKKyAgICAgICAgICAgIExPR1YoIkRJU0FCTEUiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkaXNhYmxlKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQ09NTUFORDogeworICAgICAgICAgICAgTE9HVigiQ09NTUFORCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyICpjbWQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGNtZFNpemUpIHsKKyAgICAgICAgICAgICAgICBjbWQgPSAoY2hhciAqKW1hbGxvYyhjbWRTaXplKTsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQoY21kLCBjbWRTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseVN6ID0gcmVwbHlTaXplOworICAgICAgICAgICAgY2hhciAqcmVzcCA9IE5VTEw7CisgICAgICAgICAgICBpZiAocmVwbHlTaXplKSB7CisgICAgICAgICAgICAgICAgcmVzcCA9IChjaGFyICopbWFsbG9jKHJlcGx5U2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tYW5kKGNtZENvZGUsIGNtZFNpemUsIGNtZCwgJnJlcGx5U3osIHJlc3ApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChyZXBseVN6IDwgcmVwbHlTaXplKSB7CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID0gcmVwbHlTejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcGx5U2l6ZSk7CisgICAgICAgICAgICBpZiAocmVwbHlTaXplKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHJlc3AsIHJlcGx5U2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21kKSB7CisgICAgICAgICAgICAgICAgZnJlZShjbWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3ApIHsKKyAgICAgICAgICAgICAgICBmcmVlKHJlc3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRElTQ09OTkVDVDogeworICAgICAgICAgICAgTE9HVigiRElTQ09OTkVDVCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9DQkxLOiB7CisgICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0Q2JsaygpLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3RDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTljYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJRWZmZWN0Q2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDT05UUk9MX1NUQVRVU19DSEFOR0VEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBFTkFCTEVfU1RBVFVTX0NIQU5HRUQsCisgICAgQ09NTUFORF9FWEVDVVRFRAorfTsKKworY2xhc3MgQnBFZmZlY3RDbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJRWZmZWN0Q2xpZW50PgoreworcHVibGljOgorICAgIEJwRWZmZWN0Q2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkKKyAgICB7CisgICAgICAgIExPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpY29udHJvbEdyYW50ZWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCisgICAgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkKKyAgICB7CisgICAgICAgIExPR1YoImVuYWJsZVN0YXR1c0NoYW5nZWQiKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdENsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCh1aW50MzJfdCllbmFibGVkKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRV9TVEFUVVNfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCisgICAgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKQorICAgIHsKKyAgICAgICAgTE9HVigiY29tbWFuZEV4ZWN1dGVkIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWRDb2RlKTsKKyAgICAgICAgaW50IHNpemUgPSBjbWRTaXplOworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgZGF0YS53cml0ZShwQ21kRGF0YSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IHJlcGx5U2l6ZTsKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgZGF0YS53cml0ZShwUmVwbHlEYXRhLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09NTUFORF9FWEVDVVRFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JRWZmZWN0Q2xpZW50Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5FZmZlY3RDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIENPTlRST0xfU1RBVFVTX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgIExPR1YoIkNPTlRST0xfU1RBVFVTX0NIQU5HRUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0Q2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGhhc0NvbnRyb2wgPSAoYm9vbClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgY29udHJvbFN0YXR1c0NoYW5nZWQoaGFzQ29udHJvbCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRU5BQkxFX1NUQVRVU19DSEFOR0VEOiB7CisgICAgICAgICAgICBMT0dWKCJFTkFCTEVfU1RBVFVTX0NIQU5HRUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0Q2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSAoYm9vbClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgZW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT01NQU5EX0VYRUNVVEVEOiB7CisgICAgICAgICAgICBMT0dWKCJDT01NQU5EX0VYRUNVVEVEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIgKmNtZCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoY21kU2l6ZSkgeworICAgICAgICAgICAgICAgIGNtZCA9IChjaGFyICopbWFsbG9jKGNtZFNpemUpOworICAgICAgICAgICAgICAgIGRhdGEucmVhZChjbWQsIGNtZFNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIgKnJlc3AgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSkgeworICAgICAgICAgICAgICAgIHJlc3AgPSAoY2hhciAqKW1hbGxvYyhyZXBseVNpemUpOworICAgICAgICAgICAgICAgIGRhdGEucmVhZChyZXNwLCByZXBseVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZFNpemUsIGNtZCwgcmVwbHlTaXplLCByZXNwKTsKKyAgICAgICAgICAgIGlmIChjbWQpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGNtZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzcCkgeworICAgICAgICAgICAgICAgIGZyZWUocmVzcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlZDc5MmIzLi4wZjU1YjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTQ1LDYgKzQ1LDggQEAKICAgICBHRVRfTUVUQURBVEEsCiAgICAgU1VTUEVORCwKICAgICBSRVNVTUUsCisgICAgU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwKKyAgICBBVFRBQ0hfQVVYX0VGRkVDVAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllcj4KQEAgLTIyMSw2ICsyMjMsMjQgQEAKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQobGV2ZWwpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlZmZlY3RJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0hfQVVYX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYVBsYXllciwgImFuZHJvaWQubWVkaWEuSU1lZGlhUGxheWVyIik7CkBAIC0zMzksNiArMzU5LDE2IEBACiAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9BVVhfRUZGRUNUX1NFTkRfTEVWRUw6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldEF1eEVmZmVjdFNlbmRMZXZlbChkYXRhLnJlYWRGbG9hdCgpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVRUQUNIX0FVWF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGF0dGFjaEF1eEVmZmVjdChkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggNzFjNWY4Ni4uNGFiZmE3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTM1LDggKzM1LDcgQEAKICAgICBERUNPREVfRkQsCiAgICAgQ1JFQVRFX01FRElBX1JFQ09SREVSLAogICAgIENSRUFURV9NRVRBREFUQV9SRVRSSUVWRVIsCi0gICAgR0VUX09NWCwKLSAgICBTTk9PUAorICAgIEdFVF9PTVgKIH07CiAKIGNsYXNzIEJwTWVkaWFQbGF5ZXJTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUGxheWVyU2VydmljZT4KQEAgLTU4LDcgKzU3LDcgQEAKIAogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUoCiAgICAgICAgICAgICBwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsIGludCBhdWRpb1Nlc3Npb25JZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKQEAgLTc1LDggKzc0LDEwIEBACiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoaGVhZGVycy0+dmFsdWVBdChpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbklkKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1VSTCwgZGF0YSwgJnJlcGx5KTsKKwogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIApAQCAtODksNyArOTAsOCBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCisgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGZkLAorICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgYXVkaW9TZXNzaW9uSWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtOTgsOCArMTAwLDExIEBACiAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChvZmZzZXQpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQobGVuZ3RoKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbklkKTsKKwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0ZELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworCisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7OwogICAgIH0KIAogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KQpAQCAtMTI4LDE0ICsxMzMsNiBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IHNub29wKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTTk9PUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xNjYsOSArMTYzLDEwIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyID0gY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBwaWQsIGNsaWVudCwgdXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHBpZCwgY2xpZW50LCB1cmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMLCBhdWRpb1Nlc3Npb25JZCk7CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihwbGF5ZXItPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTgwLDcgKzE3OCw5IEBACiAgICAgICAgICAgICBpbnQgZmQgPSBkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSk7CiAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZShwaWQsIGNsaWVudCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyID0gY3JlYXRlKHBpZCwgY2xpZW50LCBmZCwgb2Zmc2V0LCBsZW5ndGgsIGF1ZGlvU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihwbGF5ZXItPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjEyLDEyICsyMTIsNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHBsYXllci0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU05PT1A6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBzbm9vcGVkX2F1ZGlvID0gc25vb3AoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihzbm9vcGVkX2F1ZGlvLT5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDUkVBVEVfTUVESUFfUkVDT1JERVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBwaWRfdCBwaWQgPSBkYXRhLnJlYWRJbnQzMigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IDFkZTlmOWIuLjk0N2ZmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTIxLDggKzIxLDkgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xODksNyArMTkwLDcgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKQorICAgIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRMaXN0ZW5lciglcCkiLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTM3Myw2ICszNzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50NjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0T3V0cHV0RmlsZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WSURFT19TSVpFOiB7CkBAIC0zOTksOCArNDAxLDggQEAKICAgICAgICAgY2FzZSBTRVRfTElTVEVORVI6IHsKICAgICAgICAgICAgIExPR1YoIlNFVF9MSVNURU5FUiIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+IGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldExpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMzVjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtMCwwICsxLDcwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBOT1RJRlkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworY2xhc3MgQnBNZWRpYVJlY29yZGVyQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUmVjb3JkZXJDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgQnBNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobXNnKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGV4dDEpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZXh0Mik7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRlksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyQ2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFSZWNvcmRlckNsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuTWVkaWFSZWNvcmRlckNsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTk9USUZZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBtc2cgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGV4dDEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGV4dDIgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgbm90aWZ5KG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggMDFiNjczNy4uYWU2YzJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTM4LDExICszOCwxMyBAQAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgc2l6ZV90IGVuY29kZWRXaWR0aCwgc2l6ZV90IGVuY29kZWRIZWlnaHQsCi0gICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcykgewogICAgIHJldHVybiBjcmVhdGVSZW5kZXJlcigKICAgICAgICAgICAgIHN1cmZhY2UtPmdldElTdXJmYWNlKCksCiAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwgZW5jb2RlZFdpZHRoLCBlbmNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyk7CiB9CiAKIHNwPElPTVhSZW5kZXJlcj4gSU9NWDo6Y3JlYXRlUmVuZGVyZXJGcm9tSmF2YVN1cmZhY2UoCkBAIC01MCwxNCArNTIsMTUgQEAKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCiAgICAgICAgIHNpemVfdCBlbmNvZGVkV2lkdGgsIHNpemVfdCBlbmNvZGVkSGVpZ2h0LAotICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCkgeworICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXMpIHsKICAgICBqY2xhc3Mgc3VyZmFjZUNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9TdXJmYWNlIik7CiAgICAgaWYgKHN1cmZhY2VDbGFzcyA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC92aWV3L1N1cmZhY2UiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgamZpZWxkSUQgc3VyZmFjZUlEID0gZW52LT5HZXRGaWVsZElEKHN1cmZhY2VDbGFzcywgIm1TdXJmYWNlIiwgIkkiKTsKKyAgICBqZmllbGRJRCBzdXJmYWNlSUQgPSBlbnYtPkdldEZpZWxkSUQoc3VyZmFjZUNsYXNzLCBBTkRST0lEX1ZJRVdfU1VSRkFDRV9KTklfSUQsICJJIik7CiAgICAgaWYgKHN1cmZhY2VJRCA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIkNhbid0IGZpbmQgU3VyZmFjZS5tU3VyZmFjZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTY3LDcgKzcwLDggQEAKIAogICAgIHJldHVybiBjcmVhdGVSZW5kZXJlcigKICAgICAgICAgICAgIHN1cmZhY2UsIGNvbXBvbmVudE5hbWUsIGNvbG9yRm9ybWF0LCBlbmNvZGVkV2lkdGgsCi0gICAgICAgICAgICBlbmNvZGVkSGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgZW5jb2RlZEhlaWdodCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzKTsKIH0KIAogY2xhc3MgQnBPTVggOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWD4gewpAQCAtMzQ5LDcgKzM1Myw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICBzaXplX3QgZW5jb2RlZFdpZHRoLCBzaXplX3QgZW5jb2RlZEhlaWdodCwKLSAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKQEAgLTM2MCw2ICszNjUsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZW5jb2RlZEhlaWdodCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXNwbGF5V2lkdGgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlzcGxheUhlaWdodCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyb3RhdGlvbkRlZ3JlZXMpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfUkVOREVSRVIsIGRhdGEsICZyZXBseSk7CiAKQEAgLTY4MiwxMSArNjg4LDEzIEBACiAgICAgICAgICAgICBzaXplX3QgZW5jb2RlZEhlaWdodCA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGggPSAoc2l6ZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheUhlaWdodCA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgc3A8SU9NWFJlbmRlcmVyPiByZW5kZXJlciA9CiAgICAgICAgICAgICAgICAgY3JlYXRlUmVuZGVyZXIoaXN1cmZhY2UsIGNvbXBvbmVudE5hbWUsIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRXaWR0aCwgZW5jb2RlZEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMpOwogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmVuZGVyZXItPmFzQmluZGVyKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDEyNjMzNzMuLjM4NjkzODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yNzIsNyArMjcyLDcgQEAKIH0KIAogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZShjb25zdCBjaGFyICoqYXR0cykKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cykKIHsKICAgICBDSEVDSyghc3RyY21wKCJxdWFsaXR5IiwgICAgYXR0c1swXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJmaWxlRm9ybWF0IiwgYXR0c1syXSkgJiYKQEAgLTI4NywxNiArMjg3LDQ3IEBACiAgICAgQ0hFQ0soZmlsZUZvcm1hdCAhPSAtMSk7CiAKICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gY2FtZXJhSWQ7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBzdGF0aWNfY2FzdDxvdXRwdXRfZm9ybWF0PihmaWxlRm9ybWF0KTsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHN0YXRpY19jYXN0PGNhbWNvcmRlcl9xdWFsaXR5PihxdWFsaXR5KTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSBhdG9pKGF0dHNbNV0pOwogICAgIHJldHVybiBwcm9maWxlOwogfQogCi0vKnN0YXRpYyovIGludAotTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChjb25zdCBjaGFyKiogYXR0cykKK01lZGlhUHJvZmlsZXM6OkltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKgorTWVkaWFQcm9maWxlczo6ZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgY29uc3QKK3sKKyAgICBpbnQgbiA9IG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5zaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsc1tpXTsKKyAgICAgICAgaWYgKGxldmVscy0+bUNhbWVyYUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gbGV2ZWxzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1lZGlhUHJvZmlsZXM6OmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cykKIHsKICAgICBDSEVDSyghc3RyY21wKCJxdWFsaXR5IiwgYXR0c1swXSkpOworICAgIGludCBxdWFsaXR5ID0gYXRvaShhdHRzWzFdKTsKKyAgICBMT0dWKCIlczogY2FtZXJhSWQ9JWQsIHF1YWxpdHk9JWRcbiIsIF9fZnVuY19fLCBjYW1lcmFJZCwgcXVhbGl0eSk7CisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhjYW1lcmFJZCk7CisKKyAgICBpZiAobGV2ZWxzID09IE5VTEwpIHsKKyAgICAgICAgbGV2ZWxzID0gbmV3IEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKCk7CisgICAgICAgIGxldmVscy0+bUNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgICAgIG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQobGV2ZWxzKTsKKyAgICB9CisKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKHF1YWxpdHkpOworfQorCisvKnN0YXRpYyovIGludAorTWVkaWFQcm9maWxlczo6Z2V0Q2FtZXJhSWQoY29uc3QgY2hhcioqIGF0dHMpCit7CisgICAgaWYgKCFhdHRzWzBdKSByZXR1cm4gMDsgIC8vIGRlZmF1bHQgY2FtZXJhSWQgPSAwCisgICAgQ0hFQ0soIXN0cmNtcCgiY2FtZXJhSWQiLCBhdHRzWzBdKSk7CiAgICAgcmV0dXJuIGF0b2koYXR0c1sxXSk7CiB9CiAKQEAgLTMyMiwxMCArMzUzLDEzIEBACiAgICAgICAgIHByb2ZpbGVzLT5tQXVkaW9EZWNvZGVycy5hZGQoY3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGF0dHMpKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQiLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgIHByb2ZpbGVzLT5tRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzLmFkZChjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChhdHRzKSk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoIkNhbWNvcmRlclByb2ZpbGVzIiwgbmFtZSkgPT0gMCkgeworICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCA9IGdldENhbWVyYUlkKGF0dHMpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJFbmNvZGVyUHJvZmlsZSIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShhdHRzKSk7CisgICAgICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKAorICAgICAgICAgICAgY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJJbWFnZUVuY29kaW5nIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZChnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGF0dHMpKTsKKyAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOwogICAgIH0KIH0KIApAQCAtMzgzLDcgKzQxNyw4IEBACiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMzYwMDAwLCAzNTIsIDI4OCwgMjApOwogCiAgICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7Ci0gICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBDYW1jb3JkZXJQcm9maWxlOworICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9ISUdIOwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOwpAQCAtNDAyLDYgKzQzNyw3IEBACiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CiAKICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKICAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gQ0FNQ09SREVSX1FVQUxJVFlfTE9XOwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDMwOwpAQCAtNDU4LDkgKzQ5NCwxMiBAQAogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCiB7Ci0gICAgcHJvZmlsZXMtPm1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQoNzApOwotICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKDgwKTsKLSAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZCg5MCk7CisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IG5ldyBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpOworICAgIGxldmVscy0+bUNhbWVyYUlkID0gMDsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDcwKTsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDgwKTsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDkwKTsKKyAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZChsZXZlbHMpOwogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXMqCkBAIC02MjksMTkgKzY2OCwyNCBAQAogICAgIHJldHVybiBkZWNvZGVyczsgIC8vIGNvcHkgb3V0CiB9CiAKLWludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK2ludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdAogewotICAgIExPR1YoImdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZTogJXMgZm9yIHF1YWxpdHkgJWQiLCBuYW1lLCBxdWFsaXR5KTsKKyAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAorICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwogCiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1RdWFsaXR5ID09IHF1YWxpdHkpIHsKKyAgICAgICAgaWYgKG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bUNhbWVyYUlkID09IGNhbWVyYUlkICYmCisgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1RdWFsaXR5ID09IHF1YWxpdHkpIHsKICAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICBMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgcXVhbGl0eSAlZCBpcyBub3QgZm91bmQiLCBxdWFsaXR5KTsKKyAgICAgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC02NTcsMTMgKzcwMSwxOCBAQAogICAgIGlmICghc3RyY21wKCJhdWQuY2giLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjLT5tQ2hhbm5lbHM7CiAgICAgaWYgKCFzdHJjbXAoImF1ZC5oeiIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1TYW1wbGVSYXRlOwogCi0gICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIHBhcmFtIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgbmFtZSk7CisgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIHBhcmFtIGlkICVkIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgY2FtZXJhSWQsIG5hbWUpOwogICAgIHJldHVybiAtMTsKIH0KIAotVmVjdG9yPGludD4gTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoKSBjb25zdAorVmVjdG9yPGludD4gTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdAogewotICAgIHJldHVybiBtSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHM7ICAvLyBjb3B5IG91dAorICAgIFZlY3RvcjxpbnQ+IHJlc3VsdDsKKyAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqbGV2ZWxzID0gZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGNhbWVyYUlkKTsKKyAgICBpZiAobGV2ZWxzICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gbGV2ZWxzLT5tTGV2ZWxzOyAgLy8gY29weSBvdXQKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogTWVkaWFQcm9maWxlczo6fk1lZGlhUHJvZmlsZXMoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggYWY3ZjA3YS4uYzUxMTJhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNjYW5uZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZXRhZGF0YS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZXRhZGF0YS5jcHAKaW5kZXggMzVlYzZiMy4uYWVjOTZmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWV0YWRhdGEuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01ldGFkYXRhLmNwcApAQCAtMzIsNyArMzIsNyBAQAogLy8gQWxsIHRoZXNlIGNvbnN0YW50cyBiZWxvdyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIE1ldGFkYXRhLmphdmEuCiBlbnVtIE1ldGFkYXRhSWQgewogICAgIEZJUlNUX1NZU1RFTV9JRCA9IDEsCi0gICAgTEFTVF9TWVNURU1fSUQgPSAzMSwKKyAgICBMQVNUX1NZU1RFTV9JRCA9IDMyLAogICAgIEZJUlNUX0NVU1RPTV9JRCA9IDgxOTIKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvVmlzdWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmMmU5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCkBAIC0wLDAgKzEsMzIxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlzdWFsaXplciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8bWVkaWEvVmlzdWFsaXplci5oPgorCitleHRlcm4gdm9pZCBmaXhlZF9mZnRfcmVhbChpbnQgbiwgaW50MzJfdCAqdik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Zpc3VhbGl6ZXI6OlZpc3VhbGl6ZXIgKGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICA6ICAgQXVkaW9FZmZlY3QoU0xfSUlEX1ZJU1VBTElaQVRJT04sIE5VTEwsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCksCisgICAgICAgIG1DYXB0dXJlUmF0ZShDQVBUVVJFX1JBVEVfREVGKSwKKyAgICAgICAgbUNhcHR1cmVTaXplKENBUFRVUkVfU0laRV9ERUYpLAorICAgICAgICBtU2FtcGxlUmF0ZSg0NDEwMDAwMCksCisgICAgICAgIG1DYXB0dXJlQ2FsbEJhY2soTlVMTCksCisgICAgICAgIG1DYXB0dXJlQ2JrVXNlcihOVUxMKQoreworICAgIGluaXRDYXB0dXJlU2l6ZSgpOworfQorCitWaXN1YWxpemVyOjp+VmlzdWFsaXplcigpCit7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxDYXB0dXJlVGhyZWFkPiB0ID0gbUNhcHR1cmVUaHJlYWQ7CisgICAgaWYgKHQgIT0gMCkgeworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKHQtPmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodC0+cmVxdWVzdEV4aXRBbmRXYWl0KCkgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiVmlzdWFsaXplcjo6ZW5hYmxlKCkgY2FsbGVkIGZyb20gdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdC0+bUxvY2subG9jaygpOworICAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb0VmZmVjdDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdC0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSkKK3sKKyAgICBpZiAocmF0ZSA+IENBUFRVUkVfUkFURV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGlmIChtRW5hYmxlZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FwdHVyZVRocmVhZD4gdCA9IG1DYXB0dXJlVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2subG9jaygpOworICAgIH0KKyAgICBtQ2FwdHVyZVRocmVhZC5jbGVhcigpOworICAgIG1DYXB0dXJlQ2FsbEJhY2sgPSBjYms7CisgICAgbUNhcHR1cmVDYmtVc2VyID0gdXNlcjsKKyAgICBtQ2FwdHVyZUZsYWdzID0gZmxhZ3M7CisgICAgbUNhcHR1cmVSYXRlID0gcmF0ZTsKKworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgaWYgKGNiayAhPSBOVUxMKSB7CisgICAgICAgIG1DYXB0dXJlVGhyZWFkID0gbmV3IENhcHR1cmVUaHJlYWQoKnRoaXMsIHJhdGUsICgoZmxhZ3MgJiBDQVBUVVJFX0NBTExfSkFWQSkgIT0gMCkpOworICAgICAgICBpZiAobUNhcHR1cmVUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNyZWF0ZSBjYWxsYmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorICAgIExPR1YoInNldENhcHR1cmVDYWxsQmFjaygpIHJhdGU6ICVkIHRocmVhZCAlcCBmbGFncyAweCUwOHgiLAorICAgICAgICAgICAgcmF0ZSwgbUNhcHR1cmVUaHJlYWQuZ2V0KCksIG1DYXB0dXJlRmxhZ3MpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0Q2FwdHVyZVNpemUodWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCB8fAorICAgICAgICBzaXplIDwgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOIHx8CisgICAgICAgIEF1ZGlvU3lzdGVtOjpwb3BDb3VudChzaXplKSAhPSAxKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07CisgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilidWYzMjsKKworICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFOworICAgICooKGludDMyX3QgKilwLT5kYXRhICsgMSk9IHNpemU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UGFyYW1ldGVyKHApOworCisgICAgTE9HVigic2V0Q2FwdHVyZVNpemUgc2l6ZSAlZCAgc3RhdHVzICVkIHAtPnN0YXR1cyAlZCIsIHNpemUsIHN0YXR1cywgcC0+c3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1DYXB0dXJlU2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6Z2V0V2F2ZUZvcm0odWludDhfdCAqd2F2ZWZvcm0pCit7CisgICAgaWYgKHdhdmVmb3JtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1DYXB0dXJlU2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtRW5hYmxlZCkgeworICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBtQ2FwdHVyZVNpemU7CisgICAgICAgIHN0YXR1cyA9IGNvbW1hbmQoVklTVV9DTURfQ0FQVFVSRSwgMCwgTlVMTCwgJnJlcGx5U2l6ZSwgd2F2ZWZvcm0pOworICAgICAgICBMT0dWKCJnZXRXYXZlRm9ybSgpIGNvbW1hbmQgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgICAgICBpZiAocmVwbHlTaXplID09IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoImdldFdhdmVGb3JtKCkgZGlzYWJsZWQiKTsKKyAgICAgICAgbWVtc2V0KHdhdmVmb3JtLCAweDgwLCBtQ2FwdHVyZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBWaXN1YWxpemVyOjpnZXRGZnQodWludDhfdCAqZmZ0KQoreworICAgIGlmIChmZnQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobUNhcHR1cmVTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1FbmFibGVkKSB7CisgICAgICAgIHVpbnQ4X3QgYnVmW21DYXB0dXJlU2l6ZV07CisgICAgICAgIHN0YXR1cyA9IGdldFdhdmVGb3JtKGJ1Zik7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRvRmZ0KGZmdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChmZnQsIDAsIG1DYXB0dXJlU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OmRvRmZ0KHVpbnQ4X3QgKmZmdCwgdWludDhfdCAqd2F2ZWZvcm0pCit7CisgICAgaW50MzJfdCB3b3Jrc3BhY2VbbUNhcHR1cmVTaXplID4+IDFdOworICAgIGludDMyX3Qgbm9uemVybyA9IDA7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhcHR1cmVTaXplOyBpICs9IDIpIHsKKyAgICAgICAgd29ya3NwYWNlW2kgPj4gMV0gPSAod2F2ZWZvcm1baV0gXiAweDgwKSA8PCAyMzsKKyAgICAgICAgd29ya3NwYWNlW2kgPj4gMV0gfD0gKHdhdmVmb3JtW2kgKyAxXSBeIDB4ODApIDw8IDc7CisgICAgICAgIG5vbnplcm8gfD0gd29ya3NwYWNlW2kgPj4gMV07CisgICAgfQorCisgICAgaWYgKG5vbnplcm8pIHsKKyAgICAgICAgZml4ZWRfZmZ0X3JlYWwobUNhcHR1cmVTaXplID4+IDEsIHdvcmtzcGFjZSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYXB0dXJlU2l6ZTsgaSArPSAyKSB7CisgICAgICAgIGZmdFtpXSA9IHdvcmtzcGFjZVtpID4+IDFdID4+IDIzOworICAgICAgICBmZnRbaSArIDFdID0gd29ya3NwYWNlW2kgPj4gMV0gPj4gNzsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgVmlzdWFsaXplcjo6cGVyaW9kaWNDYXB0dXJlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIExPR1YoInBlcmlvZGljQ2FwdHVyZSgpICVwIG1DYXB0dXJlQ2FsbEJhY2sgJXAgbUNhcHR1cmVGbGFncyAweCUwOHgiLAorICAgICAgICAgICAgdGhpcywgbUNhcHR1cmVDYWxsQmFjaywgbUNhcHR1cmVGbGFncyk7CisgICAgaWYgKG1DYXB0dXJlQ2FsbEJhY2sgIT0gTlVMTCAmJgorICAgICAgICAobUNhcHR1cmVGbGFncyAmIChDQVBUVVJFX1dBVkVGT1JNfENBUFRVUkVfRkZUKSkgJiYKKyAgICAgICAgbUNhcHR1cmVTaXplICE9IDApIHsKKyAgICAgICAgdWludDhfdCB3YXZlZm9ybVttQ2FwdHVyZVNpemVdOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRXYXZlRm9ybSh3YXZlZm9ybSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGZmdFttQ2FwdHVyZVNpemVdOworICAgICAgICBpZiAobUNhcHR1cmVGbGFncyAmIENBUFRVUkVfRkZUKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBkb0ZmdChmZnQsIHdhdmVmb3JtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCAqd2F2ZVB0ciA9IE5VTEw7CisgICAgICAgIHVpbnQ4X3QgKmZmdFB0ciA9IE5VTEw7CisgICAgICAgIHVpbnQzMl90IHdhdmVTaXplID0gMDsKKyAgICAgICAgdWludDMyX3QgZmZ0U2l6ZSA9IDA7CisgICAgICAgIGlmIChtQ2FwdHVyZUZsYWdzICYgQ0FQVFVSRV9XQVZFRk9STSkgeworICAgICAgICAgICAgd2F2ZVB0ciA9IHdhdmVmb3JtOworICAgICAgICAgICAgd2F2ZVNpemUgPSBtQ2FwdHVyZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYXB0dXJlRmxhZ3MgJiBDQVBUVVJFX0ZGVCkgeworICAgICAgICAgICAgZmZ0UHRyID0gZmZ0OworICAgICAgICAgICAgZmZ0U2l6ZSA9IG1DYXB0dXJlU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZUNhbGxCYWNrKG1DYXB0dXJlQ2JrVXNlciwgd2F2ZVNpemUsIHdhdmVQdHIsIGZmdFNpemUsIGZmdFB0ciwgbVNhbXBsZVJhdGUpOworICAgIH0KK30KKwordWludDMyX3QgVmlzdWFsaXplcjo6aW5pdENhcHR1cmVTaXplKCkKK3sKKyAgICB1aW50MzJfdCBidWYzMltzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC8gc2l6ZW9mKHVpbnQzMl90KSArIDJdOworICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopYnVmMzI7CisKKyAgICBwLT5wc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICooaW50MzJfdCAqKXAtPmRhdGEgPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQYXJhbWV0ZXIocCk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IHAtPnN0YXR1czsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNpemUgPSAqKChpbnQzMl90ICopcC0+ZGF0YSArIDEpOworICAgIH0KKyAgICBtQ2FwdHVyZVNpemUgPSBzaXplOworCisgICAgTE9HVigiaW5pdENhcHR1cmVTaXplIHNpemUgJWQgc3RhdHVzICVkIiwgbUNhcHR1cmVTaXplLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWaXN1YWxpemVyOjpDYXB0dXJlVGhyZWFkOjpDYXB0dXJlVGhyZWFkKFZpc3VhbGl6ZXImIHJlY2VpdmVyLCB1aW50MzJfdCBjYXB0dXJlUmF0ZSwgYm9vbCBiQ2FuQ2FsbEphdmEpCisgICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKQoreworICAgIG1TbGVlcFRpbWVVcyA9IDEwMDAwMDAwMDAgLyBjYXB0dXJlUmF0ZTsKKyAgICBMT0dWKCJDYXB0dXJlVGhyZWFkIGNzdG9yICVwIGNhcHR1cmVSYXRlICVkIG1TbGVlcFRpbWVVcyAlZCIsIHRoaXMsIGNhcHR1cmVSYXRlLCBtU2xlZXBUaW1lVXMpOworfQorCitib29sIFZpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIExPR1YoIkNhcHR1cmVUaHJlYWQgJXAgZW50ZXIiLCB0aGlzKTsKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgeworICAgICAgICB1c2xlZXAobVNsZWVwVGltZVVzKTsKKyAgICAgICAgbVJlY2VpdmVyLnBlcmlvZGljQ2FwdHVyZSgpOworICAgIH0KKyAgICBMT0dWKCJDYXB0dXJlVGhyZWFkICVwIGV4aXRpbmciLCB0aGlzKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6OnJlYWR5VG9SdW4oKQoreworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBWaXN1YWxpemVyOjpDYXB0dXJlVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvZml4ZWRmZnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvZml4ZWRmZnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDk1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9maXhlZGZmdC5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBBIEZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uIG9mIEZhc3QgRm91cmllciBUcmFuc2Zvcm0gKEZGVCkuIENvbXBsZXggbnVtYmVycworICogYXJlIHJlcHJlc2VudGVkIGJ5IDMyLWJpdCBpbnRlZ2Vycywgd2hlcmUgaGlnaGVyIDE2IGJpdHMgYXJlIHJlYWwgcGFydCBhbmQKKyAqIGxvd2VyIG9uZXMgYXJlIGltYWdpbmFyeSBwYXJ0LiBGZXcgY29tcHJvbWlzZXMgYXJlIG1hZGUgYmV0d2VlbiBlZmZpY2llbmN5LAorICogYWNjdXJhY3ksIGFuZCBtYWludGFpbmFiaWxpdHkuIFRvIG1ha2UgaXQgZmFzdCwgYXJpdGhtZXRpYyBzaGlmdHMgYXJlIHVzZWQKKyAqIGluc3RlYWQgb2YgZGl2aXNpb25zLCBhbmQgYml0d2lzZSBpbnZlcnNlcyBhcmUgdXNlZCBpbnN0ZWFkIG9mIG5lZ2F0ZXMuIFRvCisgKiBrZWVwIGl0IHNtYWxsLCBvbmx5IHJhZGl4LTIgQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCwgYW5kIG9ubHkKKyAqIGhhbGYgb2YgdGhlIHR3aWRkbGUgZmFjdG9ycyBhcmUgc3RvcmVkLiBBbHRob3VnaCB0aGVyZSBhcmUgc3RpbGwgd2F5cyB0byBtYWtlCisgKiBpdCBldmVuIGZhc3RlciBvciBzbWFsbGVyLCBpdCBjb3N0cyB0b28gbXVjaCBvbiBvbmUgb2YgdGhlIGFzcGVjdHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZkZWYgX19hcm1fXworI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+CisjZW5kaWYKKworI2RlZmluZSBMT0dfRkZUX1NJWkUgMTAKKyNkZWZpbmUgTUFYX0ZGVF9TSVpFICgxIDw8IExPR19GRlRfU0laRSkKKworc3RhdGljIGNvbnN0IGludDMyX3QgdHdpZGRsZVtNQVhfRkZUX1NJWkUgLyA0XSA9IHsKKyAgICAweDAwMDA4MDAwLCAweGZmMzc4MDAxLCAweGZlNmU4MDAyLCAweGZkYTU4MDA2LCAweGZjZGM4MDBhLCAweGZjMTM4MDBmLAorICAgIDB4ZmI0YTgwMTYsIDB4ZmE4MTgwMWUsIDB4ZjliODgwMjcsIDB4ZjhlZjgwMzIsIDB4ZjgyNzgwM2UsIDB4Zjc1ZTgwNGIsCisgICAgMHhmNjk1ODA1OSwgMHhmNWNkODA2OCwgMHhmNTA1ODA3OSwgMHhmNDNjODA4YiwgMHhmMzc0ODA5ZSwgMHhmMmFjODBiMiwKKyAgICAweGYxZTQ4MGM4LCAweGYxMWM4MGRlLCAweGYwNTU4MGY2LCAweGVmOGQ4MTEwLCAweGVlYzY4MTJhLCAweGVkZmY4MTQ2LAorICAgIDB4ZWQzODgxNjMsIDB4ZWM3MTgxODEsIDB4ZWJhYjgxYTAsIDB4ZWFlNDgxYzEsIDB4ZWExZTgxZTIsIDB4ZTk1ODgyMDUsCisgICAgMHhlODkyODIyYSwgMHhlN2NkODI0ZiwgMHhlNzA3ODI3NiwgMHhlNjQyODI5ZCwgMHhlNTdkODJjNiwgMHhlNGI5ODJmMSwKKyAgICAweGUzZjQ4MzFjLCAweGUzMzA4MzQ5LCAweGUyNmQ4Mzc3LCAweGUxYTk4M2E2LCAweGUwZTY4M2Q2LCAweGUwMjM4NDA3LAorICAgIDB4ZGY2MTg0M2EsIDB4ZGU5ZTg0NmUsIDB4ZGRkYzg0YTMsIDB4ZGQxYjg0ZDksIDB4ZGM1OTg1MTEsIDB4ZGI5OTg1NDksCisgICAgMHhkYWQ4ODU4MywgMHhkYTE4ODViZSwgMHhkOTU4ODVmYSwgMHhkODk4ODYzNywgMHhkN2Q5ODY3NiwgMHhkNzFiODZiNiwKKyAgICAweGQ2NWM4NmY2LCAweGQ1OWU4NzM4LCAweGQ0ZTE4NzdiLCAweGQ0MjQ4N2MwLCAweGQzNjc4ODA1LCAweGQyYWI4ODRjLAorICAgIDB4ZDFlZjg4OTQsIDB4ZDEzNDg4ZGQsIDB4ZDA3OTg5MjcsIDB4Y2ZiZTg5NzIsIDB4Y2YwNDg5YmUsIDB4Y2U0YjhhMGMsCisgICAgMHhjZDkyOGE1YSwgMHhjY2Q5OGFhYSwgMHhjYzIxOGFmYiwgMHhjYjY5OGI0ZCwgMHhjYWIyOGJhMCwgMHhjOWZjOGJmNSwKKyAgICAweGM5NDY4YzRhLCAweGM4OTA4Y2ExLCAweGM3ZGI4Y2Y4LCAweGM3Mjc4ZDUxLCAweGM2NzM4ZGFiLCAweGM1YzA4ZTA2LAorICAgIDB4YzUwZDhlNjIsIDB4YzQ1YjhlYmYsIDB4YzNhOThmMWQsIDB4YzJmODhmN2QsIDB4YzI0ODhmZGQsIDB4YzE5ODkwM2UsCisgICAgMHhjMGU5OTBhMSwgMHhjMDNhOTEwNSwgMHhiZjhjOTE2OSwgMHhiZWRmOTFjZiwgMHhiZTMyOTIzNiwgMHhiZDg2OTI5ZSwKKyAgICAweGJjZGE5MzA3LCAweGJjMmY5MzcxLCAweGJiODU5M2RjLCAweGJhZGM5NDQ4LCAweGJhMzM5NGI1LCAweGI5OGI5NTIzLAorICAgIDB4YjhlMzk1OTIsIDB4YjgzYzk2MDMsIDB4Yjc5Njk2NzQsIDB4YjZmMTk2ZTYsIDB4YjY0Yzk3NTksIDB4YjVhODk3Y2UsCisgICAgMHhiNTA1OTg0MywgMHhiNDYyOThiOSwgMHhiM2MwOTkzMCwgMHhiMzFmOTlhOSwgMHhiMjdmOWEyMiwgMHhiMWRmOWE5YywKKyAgICAweGIxNDA5YjE3LCAweGIwYTI5Yjk0LCAweGIwMDU5YzExLCAweGFmNjg5YzhmLCAweGFlY2M5ZDBlLCAweGFlMzE5ZDhlLAorICAgIDB4YWQ5NzllMGYsIDB4YWNmZDllOTEsIDB4YWM2NTlmMTQsIDB4YWJjZDlmOTgsIDB4YWIzNmEwMWMsIDB4YWFhMGEwYTIsCisgICAgMHhhYTBhYTEyOSwgMHhhOTc2YTFiMCwgMHhhOGUyYTIzOCwgMHhhODRmYTJjMiwgMHhhN2JkYTM0YywgMHhhNzJjYTNkNywKKyAgICAweGE2OWNhNDYzLCAweGE2MGNhNGYwLCAweGE1N2VhNTdlLCAweGE0ZjBhNjBjLCAweGE0NjNhNjljLCAweGEzZDdhNzJjLAorICAgIDB4YTM0Y2E3YmQsIDB4YTJjMmE4NGYsIDB4YTIzOGE4ZTIsIDB4YTFiMGE5NzYsIDB4YTEyOWFhMGEsIDB4YTBhMmFhYTAsCisgICAgMHhhMDFjYWIzNiwgMHg5Zjk4YWJjZCwgMHg5ZjE0YWM2NSwgMHg5ZTkxYWNmZCwgMHg5ZTBmYWQ5NywgMHg5ZDhlYWUzMSwKKyAgICAweDlkMGVhZWNjLCAweDljOGZhZjY4LCAweDljMTFiMDA1LCAweDliOTRiMGEyLCAweDliMTdiMTQwLCAweDlhOWNiMWRmLAorICAgIDB4OWEyMmIyN2YsIDB4OTlhOWIzMWYsIDB4OTkzMGIzYzAsIDB4OThiOWI0NjIsIDB4OTg0M2I1MDUsIDB4OTdjZWI1YTgsCisgICAgMHg5NzU5YjY0YywgMHg5NmU2YjZmMSwgMHg5Njc0Yjc5NiwgMHg5NjAzYjgzYywgMHg5NTkyYjhlMywgMHg5NTIzYjk4YiwKKyAgICAweDk0YjViYTMzLCAweDk0NDhiYWRjLCAweDkzZGNiYjg1LCAweDkzNzFiYzJmLCAweDkzMDdiY2RhLCAweDkyOWViZDg2LAorICAgIDB4OTIzNmJlMzIsIDB4OTFjZmJlZGYsIDB4OTE2OWJmOGMsIDB4OTEwNWMwM2EsIDB4OTBhMWMwZTksIDB4OTAzZWMxOTgsCisgICAgMHg4ZmRkYzI0OCwgMHg4ZjdkYzJmOCwgMHg4ZjFkYzNhOSwgMHg4ZWJmYzQ1YiwgMHg4ZTYyYzUwZCwgMHg4ZTA2YzVjMCwKKyAgICAweDhkYWJjNjczLCAweDhkNTFjNzI3LCAweDhjZjhjN2RiLCAweDhjYTFjODkwLCAweDhjNGFjOTQ2LCAweDhiZjVjOWZjLAorICAgIDB4OGJhMGNhYjIsIDB4OGI0ZGNiNjksIDB4OGFmYmNjMjEsIDB4OGFhYWNjZDksIDB4OGE1YWNkOTIsIDB4OGEwY2NlNGIsCisgICAgMHg4OWJlY2YwNCwgMHg4OTcyY2ZiZSwgMHg4OTI3ZDA3OSwgMHg4OGRkZDEzNCwgMHg4ODk0ZDFlZiwgMHg4ODRjZDJhYiwKKyAgICAweDg4MDVkMzY3LCAweDg3YzBkNDI0LCAweDg3N2JkNGUxLCAweDg3MzhkNTllLCAweDg2ZjZkNjVjLCAweDg2YjZkNzFiLAorICAgIDB4ODY3NmQ3ZDksIDB4ODYzN2Q4OTgsIDB4ODVmYWQ5NTgsIDB4ODViZWRhMTgsIDB4ODU4M2RhZDgsIDB4ODU0OWRiOTksCisgICAgMHg4NTExZGM1OSwgMHg4NGQ5ZGQxYiwgMHg4NGEzZGRkYywgMHg4NDZlZGU5ZSwgMHg4NDNhZGY2MSwgMHg4NDA3ZTAyMywKKyAgICAweDgzZDZlMGU2LCAweDgzYTZlMWE5LCAweDgzNzdlMjZkLCAweDgzNDllMzMwLCAweDgzMWNlM2Y0LCAweDgyZjFlNGI5LAorICAgIDB4ODJjNmU1N2QsIDB4ODI5ZGU2NDIsIDB4ODI3NmU3MDcsIDB4ODI0ZmU3Y2QsIDB4ODIyYWU4OTIsIDB4ODIwNWU5NTgsCisgICAgMHg4MWUyZWExZSwgMHg4MWMxZWFlNCwgMHg4MWEwZWJhYiwgMHg4MTgxZWM3MSwgMHg4MTYzZWQzOCwgMHg4MTQ2ZWRmZiwKKyAgICAweDgxMmFlZWM2LCAweDgxMTBlZjhkLCAweDgwZjZmMDU1LCAweDgwZGVmMTFjLCAweDgwYzhmMWU0LCAweDgwYjJmMmFjLAorICAgIDB4ODA5ZWYzNzQsIDB4ODA4YmY0M2MsIDB4ODA3OWY1MDUsIDB4ODA2OGY1Y2QsIDB4ODA1OWY2OTUsIDB4ODA0YmY3NWUsCisgICAgMHg4MDNlZjgyNywgMHg4MDMyZjhlZiwgMHg4MDI3ZjliOCwgMHg4MDFlZmE4MSwgMHg4MDE2ZmI0YSwgMHg4MDBmZmMxMywKKyAgICAweDgwMGFmY2RjLCAweDgwMDZmZGE1LCAweDgwMDJmZTZlLCAweDgwMDFmZjM3LAorfTsKKworLyogUmV0dXJucyB0aGUgbXVsdGlwbGljYXRpb24gb2YgXGNvbmp7YX0gYW5kIHtifS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtdWx0KGludDMyX3QgYSwgaW50MzJfdCBiKQoreworI2lmIF9fQVJNX0FSQ0hfXyA+PSA2CisgICAgaW50MzJfdCB0ID0gYjsKKyAgICBfX2FzbV9fKCJzbXVhZCAgJTAsICUwLCAlMSIgICAgICAgICAgOiAiK3IiICh0KSA6ICJyIiAoYSkpOworICAgIF9fYXNtX18oInNtdXNkeCAlMCwgJTAsICUxIiAgICAgICAgICA6ICIrciIgKGIpIDogInIiIChhKSk7CisgICAgX19hc21fXygicGtodGIgICUwLCAlMCwgJTEsIEFTUiAjMTYiIDogIityIiAodCkgOiAiciIgKGIpKTsKKyAgICByZXR1cm4gdDsKKyNlbHNlCisgICAgcmV0dXJuICgoKGEgPj4gMTYpICogKGIgPj4gMTYpICsgKGludDE2X3QpYSAqIChpbnQxNl90KWIpICYgfjB4RkZGRikgfAorICAgICAgICAoKCgoYSA+PiAxNikgKiAoaW50MTZfdCliIC0gKGludDE2X3QpYSAqIChiID4+IDE2KSkgPj4gMTYpICYgMHhGRkZGKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgaGFsZihpbnQzMl90IGEpCit7CisjaWYgX19BUk1fQVJDSF9fID49IDYKKyAgICBfX2FzbV9fKCJzaGFkZDE2ICUwLCAlMCwgJTEiIDogIityIiAoYSkgOiAiciIgKDApKTsKKyAgICByZXR1cm4gYTsKKyNlbHNlCisgICAgcmV0dXJuICgoYSA+PiAxKSAmIH4weDgwMDApIHwgKGEgJiAweDgwMDApOworI2VuZGlmCit9CisKK3ZvaWQgZml4ZWRfZmZ0KGludCBuLCBpbnQzMl90ICp2KQoreworICAgIGludCBzY2FsZSA9IExPR19GRlRfU0laRSwgaSwgcCwgcjsKKworICAgIGZvciAociA9IDAsIGkgPSAxOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGZvciAocCA9IG47ICEocCAmIHIpOyBwID4+PSAxLCByIF49IHApOworICAgICAgICBpZiAoaSA8IHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgdCA9IHZbaV07CisgICAgICAgICAgICB2W2ldID0gdltyXTsKKyAgICAgICAgICAgIHZbcl0gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChwID0gMTsgcCA8IG47IHAgPDw9IDEpIHsKKyAgICAgICAgLS1zY2FsZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSBwIDw8IDEpIHsKKyAgICAgICAgICAgIGludDMyX3QgeCA9IGhhbGYodltpXSk7CisgICAgICAgICAgICBpbnQzMl90IHkgPSBoYWxmKHZbaSArIHBdKTsKKyAgICAgICAgICAgIHZbaV0gPSB4ICsgeTsKKyAgICAgICAgICAgIHZbaSArIHBdID0geCAtIHk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHIgPSAxOyByIDwgcDsgKytyKSB7CisgICAgICAgICAgICBpbnQzMl90IHcgPSBNQVhfRkZUX1NJWkUgLyA0IC0gKHIgPDwgc2NhbGUpOworICAgICAgICAgICAgaSA9IHcgPj4gMzE7CisgICAgICAgICAgICB3ID0gdHdpZGRsZVsodyBeIGkpIC0gaV0gXiAoaSA8PCAxNik7CisgICAgICAgICAgICBmb3IgKGkgPSByOyBpIDwgbjsgaSArPSBwIDw8IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHggPSBoYWxmKHZbaV0pOworICAgICAgICAgICAgICAgIGludDMyX3QgeSA9IG11bHQodywgdltpICsgcF0pOworICAgICAgICAgICAgICAgIHZbaV0gPSB4IC0geTsKKyAgICAgICAgICAgICAgICB2W2kgKyBwXSA9IHggKyB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZpeGVkX2ZmdF9yZWFsKGludCBuLCBpbnQzMl90ICp2KQoreworICAgIGludCBzY2FsZSA9IExPR19GRlRfU0laRSwgbSA9IG4gPj4gMSwgaTsKKworICAgIGZpeGVkX2ZmdChuLCB2KTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkgPDw9IDEsIC0tc2NhbGUpOworICAgIHZbMF0gPSBtdWx0KH52WzBdLCAweDgwMDA4MDAwKTsKKyAgICB2W21dID0gaGFsZih2W21dKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBuID4+IDE7ICsraSkgeworICAgICAgICBpbnQzMl90IHggPSBoYWxmKHZbaV0pOworICAgICAgICBpbnQzMl90IHogPSBoYWxmKHZbbiAtIGldKTsKKyAgICAgICAgaW50MzJfdCB5ID0geiAtICh4IF4gMHhGRkZGKTsKKyAgICAgICAgeCA9IGhhbGYoeCArICh6IF4gMHhGRkZGKSk7CisgICAgICAgIHkgPSBtdWx0KHksIHR3aWRkbGVbaSA8PCBzY2FsZV0pOworICAgICAgICB2W2ldID0geCAtIHk7CisgICAgICAgIHZbbiAtIGldID0gKHggKyB5KSBeIDB4RkZGRjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggYzZiYmJjYy4uY2M0MWU2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtNTUsNiArNTUsOCBAQAogICAgIG1MZWZ0Vm9sdW1lID0gbVJpZ2h0Vm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKKyAgICBtQXVkaW9TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBtU2VuZExldmVsID0gMDsKIH0KIAogTWVkaWFQbGF5ZXI6On5NZWRpYVBsYXllcigpCkBAIC0xMzcsNyArMTM5LDcgQEAKICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcigKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+Y3JlYXRlKGdldHBpZCgpLCB0aGlzLCB1cmwsIGhlYWRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+Y3JlYXRlKGdldHBpZCgpLCB0aGlzLCB1cmwsIGhlYWRlcnMsIG1BdWRpb1Nlc3Npb25JZCkpOwogICAgICAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZShwbGF5ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTUwLDcgKzE1Miw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUoZ2V0cGlkKCksIHRoaXMsIGZkLCBvZmZzZXQsIGxlbmd0aCkpOworICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUoZ2V0cGlkKCksIHRoaXMsIGZkLCBvZmZzZXQsIGxlbmd0aCwgbUF1ZGlvU2Vzc2lvbklkKSk7CiAgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2UocGxheWVyKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKQEAgLTI2OSw2ICsyNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUgfCBNRURJQV9QTEFZRVJfUEFVU0VEICkgKSApIHsKICAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7CiAgICAgICAgIG1QbGF5ZXItPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbVBsYXllci0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVJURUQ7CiAgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnN0YXJ0KCk7CiAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKQEAgLTUwMSw2ICs1MDQsNTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXRBdWRpb1Nlc3Npb25JZChpbnQgc2Vzc2lvbklkKQoreworICAgIExPR1YoIk1lZGlhUGxheWVyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9JRExFKSkgeworICAgICAgICBMT0dFKCJzZXRBdWRpb1Nlc3Npb25JZCBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitpbnQgTWVkaWFQbGF5ZXI6OmdldEF1ZGlvU2Vzc2lvbklkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpCit7CisgICAgTE9HVigiTWVkaWFQbGF5ZXI6OnNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBsZXZlbCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtU2VuZExldmVsID0gbGV2ZWw7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKK3sKKyAgICBMT0dWKCJNZWRpYVBsYXllcjo6YXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDAgfHwKKyAgICAgICAgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfSURMRSkgfHwKKyAgICAgICAgKG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SICkpIHsKKyAgICAgICAgTE9HRSgiYXR0YWNoQXV4RWZmZWN0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7Cit9CisKIHZvaWQgTWVkaWFQbGF5ZXI6Om5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCiB7CiAgICAgTE9HVigibWVzc2FnZSByZWNlaXZlZCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLCBtc2csIGV4dDEsIGV4dDIpOwpAQCAtNTIwLDcgKzU2OSw4IEBACiAgICAgICAgIGxvY2tlZCA9IHRydWU7CiAgICAgfQogCi0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgIC8vIEFsbG93cyBjYWxscyBmcm9tIEpOSSBpbiBpZGxlIHN0YXRlIHRvIG5vdGlmeSBlcnJvcnMKKyAgICBpZiAoIShtc2cgPT0gTUVESUFfRVJST1IgJiYgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVJfSURMRSkgJiYgbVBsYXllciA9PSAwKSB7CiAgICAgICAgIExPR1YoIm5vdGlmeSglZCwgJWQsICVkKSBjYWxsYmFjayBvbiBkaXNjb25uZWN0ZWQgbWVkaWFwbGF5ZXIiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsgICAvLyByZWxlYXNlIHRoZSBsb2NrIHdoZW4gZG9uZS4KICAgICAgICAgcmV0dXJuOwpAQCAtNTQxLDYgKzU5MSw5IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CiAgICAgICAgIExPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUl9JRExFKSB7CisgICAgICAgICAgICBMT0dFKCJwbGF5YmFjayBjb21wbGV0ZSBpbiBpZGxlIHN0YXRlIik7CisgICAgICAgIH0KICAgICAgICAgaWYgKCFtTG9vcCkgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURTsKICAgICAgICAgfQpAQCAtNjM2LDYxICs2ODksNCBAQAogCiB9CiAKLWV4dGVybiAiQyIgewotI2RlZmluZSBGTE9BVElOR19QT0lOVCAxCi0jaW5jbHVkZSAiZmZ0d3JhcC5oIgotfQotCi1zdGF0aWMgdm9pZCAqZmZ0dGFibGUgPSBOVUxMOwotCi0vLyBwZWVrcyBhdCB0aGUgYXVkaW8gZGF0YSBhbmQgZmlsbHMgJ2RhdGEnIHdpdGggdGhlIHJlcXVlc3RlZCBraW5kCi0vLyAoY3VycmVudGx5IGtpbmQ9MCByZXR1cm5zIG1vbm8gMTYgYml0IFBDTSBkYXRhLCBhbmQga2luZD0xIHJldHVybnMKLS8vIDI1NiBwb2ludCBGRlQgZGF0YSkuIFJldHVybiB2YWx1ZSBpcyBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCwKLS8vIHdoaWNoIG1heSBiZSAwLgotLypzdGF0aWMqLyBpbnQgTWVkaWFQbGF5ZXI6OnNub29wKHNob3J0KiBkYXRhLCBpbnQgbGVuLCBpbnQga2luZCkgewotCi0gICAgc3A8SU1lbW9yeT4gcDsKLSAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgLy8gVGFrZSBhIHBlZWsgYXQgdGhlIHdhdmVmb3JtLiBUaGUgcmV0dXJuZWQgZGF0YSBjb25zaXN0cyBvZiAxNiBiaXQgbW9ubyBQQ00gZGF0YS4KLSAgICAgICAgcCA9IHNlcnZpY2UtPnNub29wKCk7Ci0KLSAgICAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2luZCA9PSAwKSB7IC8vIHJldHVybiB3YXZlZm9ybSBkYXRhCi0gICAgICAgICAgICBpbnQgcGxlbiA9IHAtPnNpemUoKTsKLSAgICAgICAgICAgIGxlbiAqPSAyOyAvLyBudW1iZXIgb2Ygc2hvcnRzIC0+IG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgc2hvcnQgKnNyYyA9IChzaG9ydCopIHAtPnBvaW50ZXIoKTsKLSAgICAgICAgICAgIGlmIChwbGVuID4gbGVuKSB7Ci0gICAgICAgICAgICAgICAgcGxlbiA9IGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShkYXRhLCBzcmMsIHBsZW4pOwotICAgICAgICAgICAgcmV0dXJuIHBsZW4gLyBzaXplb2Yoc2hvcnQpOyAvLyByZXR1cm4gbnVtYmVyIG9mIHNhbXBsZXMKLSAgICAgICAgfSBlbHNlIGlmIChraW5kID09IDEpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhIG1vcmUgZWZmaWNpZW50IEZGVAotICAgICAgICAgICAgLy8gUmlnaHQgbm93IHRoaXMgdXNlcyB0aGUgc3BlZXggbGlicmFyeSwgd2hpY2ggaXMgY29tcGlsZWQgdG8gZG8gYSBmbG9hdCBGRlQKLSAgICAgICAgICAgIGlmICghZmZ0dGFibGUpIGZmdHRhYmxlID0gc3B4X2ZmdF9pbml0KDUxMik7Ci0gICAgICAgICAgICBzaG9ydCAqdXNyYyA9IChzaG9ydCopIHAtPnBvaW50ZXIoKTsKLSAgICAgICAgICAgIGZsb2F0IGZzcmNbNTEyXTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPDUxMjtpKyspCi0gICAgICAgICAgICAgICAgZnNyY1tpXSA9IHVzcmNbaV07Ci0gICAgICAgICAgICBmbG9hdCBmZHN0WzUxMl07Ci0gICAgICAgICAgICBzcHhfZmZ0X2Zsb2F0KGZmdHRhYmxlLCBmc3JjLCBmZHN0KTsKLSAgICAgICAgICAgIGlmIChsZW4gPiA1MTIpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSA1MTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW4gLz0gMjsgLy8gb25seSBoYWxmIHRoZSBvdXRwdXQgZGF0YSBpcyB2YWxpZAotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICAgICAgZGF0YVtpXSA9IGZkc3RbaV07Ci0gICAgICAgICAgICByZXR1cm4gbGVuOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBMT0dFKCJVbmFibGUgdG8gbG9jYXRlIG1lZGlhIHNlcnZpY2UiKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDVhZGMxMTYuLmUyMGUzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgICAgTE9HRSgic2V0T3V0cHV0Rm9ybWF0IGNhbGxlZCBpbiBhbiBpbnZhbGlkIHN0YXRlOiAlZCIsIG1DdXJyZW50U3RhdGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtSXNWaWRlb1NvdXJjZVNldCAmJiBvZiA+PSBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfU1RBUlQpIHsgLy9maXJzdCBub24tdmlkZW8gb3V0cHV0IGZvcm1hdAorICAgIGlmIChtSXNWaWRlb1NvdXJjZVNldCAmJiBvZiA+PSBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfU1RBUlQgJiYgb2YgIT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQICYmIG9mICE9IE9VVFBVVF9GT1JNQVRfTVBFRzJUUykgeyAvL2ZpcnN0IG5vbi12aWRlbyBvdXRwdXQgZm9ybWF0CiAgICAgICAgIExPR0UoIm91dHB1dCBmb3JtYXQgKCVkKSBpcyBtZWFudCBmb3IgYXVkaW8gcmVjb3JkaW5nIG9ubHkgYW5kIGluY29tcGF0aWJsZSB3aXRoIHZpZGVvIHJlY29yZGluZyIsIG9mKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggY2Y5N2IyMy4uNTU4NDZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTExLDIxICsxMSwxMSBAQAogICAgIE1lZGlhUGxheWVyU2VydmljZS5jcHAgICAgICBcCiAgICAgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIFwKICAgICBUZXN0UGxheWVyU3R1Yi5jcHAgICAgICAgICAgXAotICAgIFZvcmJpc1BsYXllci5jcHAgICAgICAgICAgICBcCi0gICAgVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKLSAgICBNaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIAlcCi0gICAgTWlkaUZpbGUuY3BwCi0KLWlmZXEgKCQoQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUKSx0cnVlKQotCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICAgICAgICAgXAotICAgIFN0YWdlZnJpZ2h0UGxheWVyLmNwcCAgICAgICAgICAgICAgIFwKKyAgICBNaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwICAgXAorICAgIE1pZGlGaWxlLmNwcCAgICAgICAgICAgICAgICBcCisgICAgU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwICAgICAgIFwKICAgICBTdGFnZWZyaWdodFJlY29yZGVyLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9XSVRIX0ZVTExfU1RBR0VGUklHSFQ9MQotCi1lbmRpZgotCiBpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQogTE9DQUxfTERMSUJTICs9IC1sZGwgLWxwdGhyZWFkCiBlbmRpZgpAQCAtMzcsMTIgKzI3LDE3IEBACiAJbGlidm9yYmlzaWRlYyAgICAgICAgIAkJCVwKIAlsaWJzb25pdm94ICAgICAgICAgICAgCQkJXAogCWxpYm1lZGlhICAgICAgICAgICAgICAJCQlcCisJbGliY2FtZXJhX2NsaWVudCAgICAgIAkJCVwKIAlsaWJhbmRyb2lkX3J1bnRpbWUgICAgCQkJXAogCWxpYnN0YWdlZnJpZ2h0ICAgICAgICAJCQlcCiAJbGlic3RhZ2VmcmlnaHRfb214ICAgIAkJCVwKLQlsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKKwlsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uICAgICAgICAgXAorCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICAgICAgICAgICAgICBcCiAJbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50CiAKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9ydHNwCisKIGlmbmVxICgkKEJVSUxEX1dJVEhPVVRfUFYpLHRydWUpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKIAlsaWJvcGVuY29yZV9wbGF5ZXIgICAgXApAQCAtNTgsOCArNTMsOSBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJJChKTklfSF9JTkNMVURFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAotCSQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbwogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggNmE2YWZhMS4uYzQzZTliYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTU2LDcgKzU2LDYgQEAKICNpbmNsdWRlICJNZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIgogCiAjaW5jbHVkZSAiTWlkaUZpbGUuaCIKLSNpbmNsdWRlICJWb3JiaXNQbGF5ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9QVlBsYXllci5oPgogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRQbGF5ZXIuaCIKQEAgLTE5Nyw4ICsxOTYsNiBAQAogICAgICAgICB7Ii5ydHR0bCIsIFNPTklWT1hfUExBWUVSfSwKICAgICAgICAgeyIucnR4IiwgU09OSVZPWF9QTEFZRVJ9LAogICAgICAgICB7Ii5vdGEiLCBTT05JVk9YX1BMQVlFUn0sCi0gICAgICAgIHsiLm9nZyIsIFZPUkJJU19QTEFZRVJ9LAotICAgICAgICB7Ii5vZ2EiLCBWT1JCSVNfUExBWUVSfSwKICNpZm5kZWYgTk9fT1BFTkNPUkUKICAgICAgICAgeyIud21hIiwgUFZfUExBWUVSfSwKICAgICAgICAgeyIud212IiwgUFZfUExBWUVSfSwKQEAgLTIyOCwxNCArMjI1LDEwIEBACiAKIHNwPElNZWRpYVJlY29yZGVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZU1lZGlhUmVjb3JkZXIocGlkX3QgcGlkKQogewotI2lmbmRlZiBOT19PUEVOQ09SRQogICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXJDbGllbnQodGhpcywgcGlkKTsKICAgICB3cDxNZWRpYVJlY29yZGVyQ2xpZW50PiB3ID0gcmVjb3JkZXI7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1NZWRpYVJlY29yZGVyQ2xpZW50cy5hZGQodyk7Ci0jZWxzZQotICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IHJlY29yZGVyID0gTlVMTDsKLSNlbmRpZgogICAgIExPR1YoIkNyZWF0ZSBuZXcgbWVkaWEgcmVjb3JkZXIgY2xpZW50IGZyb20gcGlkICVkIiwgcGlkKTsKICAgICByZXR1cm4gcmVjb3JkZXI7CiB9CkBAIC0yNTYsMTEgKzI0OSwxMiBAQAogCiBzcDxJTWVkaWFQbGF5ZXI+IE1lZGlhUGxheWVyU2VydmljZTo6Y3JlYXRlKAogICAgICAgICBwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgY29uc3QgY2hhciogdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsIGludCBhdWRpb1Nlc3Npb25JZCkKIHsKICAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOwotICAgIHNwPENsaWVudD4gYyA9IG5ldyBDbGllbnQodGhpcywgcGlkLCBjb25uSWQsIGNsaWVudCk7Ci0gICAgTE9HVigiQ3JlYXRlIG5ldyBjbGllbnQoJWQpIGZyb20gcGlkICVkLCB1cmw9JXMsIGNvbm5JZD0lZCIsIGNvbm5JZCwgcGlkLCB1cmwsIGNvbm5JZCk7CisgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCh0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50LCBhdWRpb1Nlc3Npb25JZCk7CisgICAgTE9HVigiQ3JlYXRlIG5ldyBjbGllbnQoJWQpIGZyb20gcGlkICVkLCB1cmw9JXMsIGNvbm5JZD0lZCwgYXVkaW9TZXNzaW9uSWQ9JWQiLAorICAgICAgICAgICAgY29ubklkLCBwaWQsIHVybCwgY29ubklkLCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgaWYgKE5PX0VSUk9SICE9IGMtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKSkKICAgICB7CiAgICAgICAgIGMuY2xlYXIoKTsKQEAgLTI3MywxMiArMjY3LDEyIEBACiB9CiAKIHNwPElNZWRpYVBsYXllcj4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGF1ZGlvU2Vzc2lvbklkKQogewogICAgIGludDMyX3QgY29ubklkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dENvbm5JZCk7Ci0gICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCh0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50KTsKLSAgICBMT0dWKCJDcmVhdGUgbmV3IGNsaWVudCglZCkgZnJvbSBwaWQgJWQsIGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgY29ubklkLCBwaWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCh0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50LCBhdWRpb1Nlc3Npb25JZCk7CisgICAgTE9HVigiQ3JlYXRlIG5ldyBjbGllbnQoJWQpIGZyb20gcGlkICVkLCBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkLCBhdWRpb1Nlc3Npb25JZD0lZCIsCisgICAgICAgICAgICBjb25uSWQsIHBpZCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgaWYgKE5PX0VSUk9SICE9IGMtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSkgewogICAgICAgICBjLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKQEAgLTMzNSw2ICszMjksMTAgQEAKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCiAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgbUxhdGVuY3kpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgYXV4IGVmZmVjdCBpZCglZCksIHNlbmQgbGV2ZWwgKCVmKVxuIiwKKyAgICAgICAgICAgIG1BdXhFZmZlY3RJZCwgbVNlbmRMZXZlbCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKICAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKQEAgLTUxNywxMSArNTE1LDE3IEBACiAgICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoYyAhPSAwKSBjLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVJlY29yZGVyQ2xpZW50XG4iKTsKLSAgICAgICAgICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IGMgPSBtTWVkaWFSZWNvcmRlckNsaWVudHNbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHBpZCglZClcblxuIiwgYy0+bVBpZCk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGlmIChtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgTm8gbWVkaWEgcmVjb3JkZXIgY2xpZW50XG5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gYyA9IG1NZWRpYVJlY29yZGVyQ2xpZW50c1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgTWVkaWFSZWNvcmRlckNsaWVudCBwaWQoJWQpXG4iLCBjLT5tUGlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKKyAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwpAQCAtNTMwLDggKzUzNCw5IEBACiAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKICAgICAgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOwotICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zZGNhcmQvIikgfHwKKyAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGJ1ZmZlciwgIiAvbW50L3NkY2FyZC8iKSB8fAogICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL21lZGlhLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTU2NSw4ICs1NzAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3NkY2FyZC8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvbW50L3NkY2FyZC8iKSA9PSBsaW5rdG8gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvZGF0YS8iKSA9PSBsaW5rdG8gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTYxMyw3ICs2MTksNyBAQAogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCwKLSAgICAgICAgaW50MzJfdCBjb25uSWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCkKKyAgICAgICAgaW50MzJfdCBjb25uSWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKQogewogICAgIExPR1YoIkNsaWVudCglZCkgY29uc3RydWN0b3IiLCBjb25uSWQpOwogICAgIG1QaWQgPSBwaWQ7CkBAIC02MjIsNiArNjI4LDggQEAKICAgICBtQ2xpZW50ID0gY2xpZW50OwogICAgIG1Mb29wID0gZmFsc2U7CiAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CisgICAgbUF1ZGlvU2Vzc2lvbklkID0gYXVkaW9TZXNzaW9uSWQ7CisKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgIExPR0QoImNyZWF0ZSBBbnRhZ29uaXplciIpOwogICAgIG1BbnRhZ29uaXplciA9IG5ldyBBbnRhZ29uaXplcihub3RpZnksIHRoaXMpOwpAQCAtNjY3LDM3ICs2NzUsOSBAQAogfQogCiBzdGF0aWMgcGxheWVyX3R5cGUgZ2V0RGVmYXVsdFBsYXllclR5cGUoKSB7Ci0jaWYgQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmVuYWJsZS1wbGF5ZXIiLCB2YWx1ZSwgTlVMTCkKLSAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7Ci0gICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gUFZfUExBWUVSOworICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CiB9CiAKLS8vIEJ5IGRlZmF1bHQgd2UgdXNlIHRoZSBWT1JCSVNfUExBWUVSIGZvciB2b3JiaXMgcGxheWJhY2sgKGR1aCEpLAotLy8gYnV0IGlmIHRoZSBtYWdpYyBwcm9wZXJ0eSBpcyBzZXQgd2Ugd2lsbCB1c2Ugb3VyIG5ldyBleHBlcmltZW50YWwKLS8vIHN0YWdlZnJpZ2h0IGNvZGUgaW5zdGVhZC4KLXN0YXRpYyBwbGF5ZXJfdHlwZSBPdmVycmlkZVN0YWdlZnJpZ2h0Rm9yVm9yYmlzKHBsYXllcl90eXBlIHBsYXllcikgewotICAgIGlmIChwbGF5ZXIgIT0gVk9SQklTX1BMQVlFUikgewotICAgICAgICByZXR1cm4gcGxheWVyOwotICAgIH0KLQotI2lmIEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtdm9yYmlzIiwgdmFsdWUsIE5VTEwpCi0gICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodmFsdWUsICJ0cnVlIikpKSB7Ci0gICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gVk9SQklTX1BMQVlFUjsKLX0KLQotCiBwbGF5ZXJfdHlwZSBnZXRQbGF5ZXJUeXBlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewogICAgIGNoYXIgYnVmWzIwXTsKQEAgLTcwOSw3ICs2ODksNyBAQAogCiAgICAgLy8gT2dnIHZvcmJpcz8KICAgICBpZiAoaWRlbnQgPT0gMHg1MzY3Njc0ZikgLy8gJ09nZ1MnCi0gICAgICAgIHJldHVybiBPdmVycmlkZVN0YWdlZnJpZ2h0Rm9yVm9yYmlzKFZPUkJJU19QTEFZRVIpOworICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwogCiAjaWZuZGVmIE5PX09QRU5DT1JFCiAgICAgaWYgKGlkZW50ID09IDB4NzViMjI2MzApIHsKQEAgLTc0NSwxMyArNzI1LDYgQEAKICAgICAgICAgcmV0dXJuIFRFU1RfUExBWUVSOwogICAgIH0KIAotICAgIGJvb2wgdXNlU3RhZ2VmcmlnaHRGb3JIVFRQID0gZmFsc2U7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmVuYWJsZS1odHRwIiwgdmFsdWUsIE5VTEwpCi0gICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgewotICAgICAgICB1c2VTdGFnZWZyaWdodEZvckhUVFAgPSB0cnVlOwotICAgIH0KLQogICAgIC8vIHVzZSBNaWRpRmlsZSBmb3IgTUlESSBleHRlbnNpb25zCiAgICAgaW50IGxlblVSTCA9IHN0cmxlbih1cmwpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkVMRU0oRklMRV9FWFRTKTsgKytpKSB7CkBAIC03NTksMjcgKzczMiwyMSBAQAogICAgICAgICBpbnQgc3RhcnQgPSBsZW5VUkwgLSBsZW47CiAgICAgICAgIGlmIChzdGFydCA+IDApIHsKICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAodXJsICsgc3RhcnQsIEZJTEVfRVhUU1tpXS5leHRlbnNpb24sIGxlbikpIHsKLSAgICAgICAgICAgICAgICBpZiAoRklMRV9FWFRTW2ldLnBsYXllcnR5cGUgPT0gVk9SQklTX1BMQVlFUgotICAgICAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCi0gICAgICAgICAgICAgICAgICAgICYmIHVzZVN0YWdlZnJpZ2h0Rm9ySFRUUCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gT3ZlcnJpZGVTdGFnZWZyaWdodEZvclZvcmJpcyhGSUxFX0VYVFNbaV0ucGxheWVydHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZJTEVfRVhUU1tpXS5wbGF5ZXJ0eXBlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykpIHsKLSAgICAgICAgaWYgKCF1c2VTdGFnZWZyaWdodEZvckhUVFApIHsKKyAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgInJ0c3A6Ly8iLCA3KSkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmVuYWJsZS1ydHNwIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICAgICAmJiAoc3RyY21wKHZhbHVlLCAiMSIpICYmIHN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7CisgICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSdyZSBnb2luZyB0byB1c2UgUFYgZm9yIHJ0c3AtYmFzZWQgcGxheWJhY2sKKyAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgdW50aWwgd2UgY2FuIGNsZWFyIHVwIGEgZmV3IG1vcmUgaXNzdWVzLgogICAgICAgICAgICAgcmV0dXJuIFBWX1BMQVlFUjsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFVzZSBQVl9QTEFZRVIgZm9yIHJ0c3AgZm9yIG5vdwotICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAicnRzcDovLyIsIDcpKSB7Ci0gICAgICAgIHJldHVybiBQVl9QTEFZRVI7Ci0gICAgfQotCiAgICAgcmV0dXJuIGdldERlZmF1bHRQbGF5ZXJUeXBlKCk7CiB9CiAKQEAgLTc5OCwxNiArNzY1LDEwIEBACiAgICAgICAgICAgICBMT0dWKCIgY3JlYXRlIE1pZGlGaWxlIik7CiAgICAgICAgICAgICBwID0gbmV3IE1pZGlGaWxlKCk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWT1JCSVNfUExBWUVSOgotICAgICAgICAgICAgTE9HVigiIGNyZWF0ZSBWb3JiaXNQbGF5ZXIiKTsKLSAgICAgICAgICAgIHAgPSBuZXcgVm9yYmlzUGxheWVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSNpZiBCVUlMRF9XSVRIX0ZVTExfU1RBR0VGUklHSFQKICAgICAgICAgY2FzZSBTVEFHRUZSSUdIVF9QTEFZRVI6CiAgICAgICAgICAgICBMT0dWKCIgY3JlYXRlIFN0YWdlZnJpZ2h0UGxheWVyIik7CiAgICAgICAgICAgICBwID0gbmV3IFN0YWdlZnJpZ2h0UGxheWVyOwogICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKICAgICAgICAgY2FzZSBURVNUX1BMQVlFUjoKICAgICAgICAgICAgIExPR1YoIkNyZWF0ZSBUZXN0IFBsYXllciBzdHViIik7CiAgICAgICAgICAgICBwID0gbmV3IFRlc3RQbGF5ZXJTdHViKCk7CkBAIC04NzAsNyArODMxLDcgQEAKICAgICAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICAgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQoKTsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQpOwogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAgICAgICAgIH0KIApAQCAtOTIwLDcgKzg4MSw3IEBACiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KCk7CisgICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKICAgICB9CiAKQEAgLTExMzgsNiArMTA5OSwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBMT0dWKCJbJWRdIHNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBtQ29ubklkLCBsZXZlbCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQoreworICAgIExPR1YoIlslZF0gYXR0YWNoQXV4RWZmZWN0KCVkKSIsIG1Db25uSWQsIGVmZmVjdElkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSByZXR1cm4gbUF1ZGlvT3V0cHV0LT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6bm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQogewpAQCAtMTMxNiwxMTEgKzEyOTIsMjIgQEAKICAgICByZXR1cm4gbWVtOwogfQogCi0vKgotICogQXZlcnQgeW91ciBleWVzLCB1Z2x5IGhhY2sgYWhlYWQuCi0gKiBUaGUgZm9sbG93aW5nIGlzIHRvIHN1cHBvcnQgbXVzaWMgdmlzdWFsaXphdGlvbnMuCi0gKi8KLQotc3RhdGljIGNvbnN0IGludCBOVU1WSVpCVUYgPSAzMjsKLXN0YXRpYyBjb25zdCBpbnQgVklaQlVGRlJBTUVTID0gMTAyNDsKLXN0YXRpYyBjb25zdCBpbnQgQlVGVElNRU1TRUMgPSBOVU1WSVpCVUYgKiBWSVpCVUZGUkFNRVMgKiAxMDAwIC8gNDQxMDA7Ci1zdGF0aWMgY29uc3QgaW50IFRPVEFMQlVGVElNRU1TRUMgPSBOVU1WSVpCVUYgKiBCVUZUSU1FTVNFQzsKLQotc3RhdGljIGJvb2wgZ290TWVtID0gZmFsc2U7Ci1zdGF0aWMgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXA7IAotc3RhdGljIHNwPE1lbW9yeUJhc2U+IG1lbVtOVU1WSVpCVUZdOwotc3RhdGljIHVpbnQ2NF90IGVuZFRpbWU7Ci1zdGF0aWMgdWludDY0X3QgbGFzdFJlYWRUaW1lOwotc3RhdGljIHVpbnQ2NF90IGxhc3RXcml0ZVRpbWU7Ci1zdGF0aWMgaW50IHdyaXRlSWR4ID0gMDsKLQotc3RhdGljIHZvaWQgYWxsb2NWaXpCdWZzKCkgewotICAgIGlmICghZ290TWVtKSB7Ci0gICAgICAgIGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoTlVNVklaQlVGICogVklaQlVGRlJBTUVTICogMiwgMCwgInNub29wZXIiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8TlVNVklaQlVGO2krKykgewotICAgICAgICAgICAgbWVtW2ldID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgVklaQlVGRlJBTUVTICogMiAqIGksIFZJWkJVRkZSQU1FUyAqIDIpOwotICAgICAgICB9Ci0gICAgICAgIGVuZFRpbWUgPSAwOwotICAgICAgICBnb3RNZW0gPSB0cnVlOwotICAgIH0KLX0KLQotCi0vKgotICogR2V0IGEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgdGhhdCBpcyBhYm91dCB0byBiZSBwbGF5ZWQuCi0gKiBXZSBkb24ndCBzeW5jaHJvbml6ZSB0aGlzIGJlY2F1c2UgaW4gcHJhY3RpY2UgdGhlIHdyaXRlcgotICogaXMgYWhlYWQgb2YgdGhlIHJlYWRlciwgYW5kIGV2ZW4gaWYgd2UgZGlkIGhhcHBlbiB0byBjYXRjaAotICogYSBidWZmZXIgd2hpbGUgaXQncyBiZWluZyB3cml0dGVuLCBpdCdzIGp1c3QgYSB2aXN1YWxpemF0aW9uLAotICogc28gbm8gaGFybSBkb25lLgotICovCi1zdGF0aWMgc3A8TWVtb3J5QmFzZT4gZ2V0Vml6QnVmZmVyKCkgewotCi0gICAgYWxsb2NWaXpCdWZzKCk7Ci0KLSAgICBsYXN0UmVhZFRpbWUgPSB1cHRpbWVNaWxsaXMoKTsKLQotICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlY2VudCBidWZmZXIgKHlldCksIGp1c3QgcmV0dXJuIGVtcHR5IGhhbmRlZAotICAgIGlmIChsYXN0V3JpdGVUaW1lICsgVE9UQUxCVUZUSU1FTVNFQyA8IGxhc3RSZWFkVGltZSkgewotICAgICAgICAvL0xPR0koIkBAQEAgICAgbm8gYXVkaW8gZGF0YSB0byBsb29rIGF0IHlldDogJWQgKyAlZCA8ICVkIiwgKGludClsYXN0V3JpdGVUaW1lLCBUT1RBTEJVRlRJTUVNU0VDLCAoaW50KWxhc3RSZWFkVGltZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGludCB0aW1lZGVsdGEgPSBlbmRUaW1lIC0gbGFzdFJlYWRUaW1lOwotICAgIGlmICh0aW1lZGVsdGEgPCAwKSB0aW1lZGVsdGEgPSAwOwotICAgIGludCBmcmFtZWRlbHRhID0gdGltZWRlbHRhICogNDQxMDAgLyAxMDAwOwotICAgIGludCBoZWFkSWR4ID0gKHdyaXRlSWR4IC0gZnJhbWVkZWx0YSkgLyBWSVpCVUZGUkFNRVMgLSAxOwotICAgIHdoaWxlIChoZWFkSWR4IDwgMCkgewotICAgICAgICBoZWFkSWR4ICs9IE5VTVZJWkJVRjsKLSAgICB9Ci0gICAgcmV0dXJuIG1lbVtoZWFkSWR4XTsKLX0KLQotLy8gQXBwZW5kIHRoZSBkYXRhIHRvIHRoZSB2aXp1YWxpemF0aW9uIGJ1ZmZlcgotc3RhdGljIHZvaWQgbWFrZVZpekJ1ZmZlcnMoY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbiwgdWludDY0X3QgdGltZSkgewotCi0gICAgYWxsb2NWaXpCdWZzKCk7Ci0KLSAgICB1aW50NjRfdCBzdGFydFRpbWUgPSB0aW1lOwotICAgIGNvbnN0IGludCBmcmFtZVNpemUgPSA0OyAvLyAxNiBiaXQgc3RlcmVvIHNhbXBsZSBpcyA0IGJ5dGVzCi0gICAgaW50IG9mZnNldCA9IHdyaXRlSWR4OwotICAgIGludCBtYXhvZmYgPSBoZWFwLT5nZXRTaXplKCkgLyAyOyAvLyBpbiBzaG9ydHMKLSAgICBzaG9ydCAqYmFzZSA9IChzaG9ydCopaGVhcC0+Z2V0QmFzZSgpOwotICAgIHNob3J0ICpzcmMgPSAoc2hvcnQqKWRhdGE7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgCi0gICAgICAgIC8vIERlZ3JhZGUgcXVhbGl0eSBieSBtaXhpbmcgdG8gbW9ubyBhbmQgY2xlYXJpbmcgdGhlIGxvd2VzdCAzIGJpdHMuCi0gICAgICAgIC8vIFRoaXMgc2hvdWxkIHN0aWxsIGJlIGdvb2QgZW5vdWdoIGZvciBhIHZpc3VhbGl6YXRpb24KLSAgICAgICAgYmFzZVtvZmZzZXQrK10gPSAoKGludChzcmNbMF0pICsgaW50KHNyY1sxXSkpID4+IDEpICYgfjB4NzsKLSAgICAgICAgc3JjICs9IDI7Ci0gICAgICAgIGxlbiAtPSBmcmFtZVNpemU7Ci0gICAgICAgIGlmIChvZmZzZXQgPj0gbWF4b2ZmKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHdyaXRlSWR4ID0gb2Zmc2V0OwotICAgIGVuZFRpbWUgPSB0aW1lICsgKGxlbiAvIGZyYW1lU2l6ZSkgLyA0NDsKLSAgICAvL0xPR0koIkBAQCBzdG9yZWQgYnVmZmVycyBmcm9tICVkIHRvICVkIiwgdWludDMyX3Qoc3RhcnRUaW1lKSwgdWludDMyX3QodGltZSkpOwotfQotCi1zcDxJTWVtb3J5PiBNZWRpYVBsYXllclNlcnZpY2U6OnNub29wKCkKLXsKLSAgICBzcDxNZW1vcnlCYXNlPiBtZW0gPSBnZXRWaXpCdWZmZXIoKTsKLSAgICByZXR1cm4gbWVtOwotfQotCiAKICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvU2luayIKLU1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQpCiAgICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCkgeworICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAorICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpIHsKKyAgICBMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwogICAgIG1UcmFjayA9IDA7CiAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6TVVTSUM7CiAgICAgbUxlZnRWb2x1bWUgPSAxLjA7CiAgICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwogICAgIG1MYXRlbmN5ID0gMDsKICAgICBtTXNlY3NQZXJGcmFtZSA9IDA7Ci0gICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1BdXhFZmZlY3RJZCA9IDA7CisgICAgbVNlbmRMZXZlbCA9IDAuMDsKICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwogfQogCkBAIC0xNTAzLDcgKzEzOTAsNyBAQAogICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKIAogICAgIH0KLSAgICBMT0dWKCJvcGVuKCV1LCAlZCwgJWQsICVkKSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBidWZmZXJDb3VudCk7CisgICAgTE9HVigib3BlbigldSwgJWQsICVkLCAlZCwgJWQpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGJ1ZmZlckNvdW50LG1TZXNzaW9uSWQpOwogICAgIGlmIChtVHJhY2spIGNsb3NlKCk7CiAgICAgaW50IGFmU2FtcGxlUmF0ZTsKICAgICBpbnQgYWZGcmFtZUNvdW50OwpAQCAtMTUyOCwxNCArMTQxNSwyMSBAQAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLywKICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAoY2hhbm5lbENvdW50ID09IDIpID8gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyA6IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05PLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICB9CiAKICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewpAQCAtMTU0NiwxMCArMTQ0MCwxMyBAQAogCiAgICAgTE9HVigic2V0Vm9sdW1lIik7CiAgICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworCiAgICAgbU1zZWNzUGVyRnJhbWUgPSAxLmUzIC8gKGZsb2F0KSBzYW1wbGVSYXRlOwogICAgIG1MYXRlbmN5ID0gdC0+bGF0ZW5jeSgpOwogICAgIG1UcmFjayA9IHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgdC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgIHJldHVybiB0LT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTs7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3RhcnQoKQpAQCAtMTU1NywzMSArMTQ1NCwxMSBAQAogICAgIExPR1YoInN0YXJ0Iik7CiAgICAgaWYgKG1UcmFjaykgewogICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgIG1UcmFjay0+c3RhcnQoKTsKLSAgICAgICAgbVRyYWNrLT5nZXRQb3NpdGlvbigmbU51bUZyYW1lc1dyaXR0ZW4pOwogICAgIH0KIH0KIAotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojpzbm9vcFdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBPbmx5IG1ha2UgdmlzdWFsaXphdGlvbiBidWZmZXJzIGlmIGFueW9uZSByZWNlbnRseSByZXF1ZXN0ZWQgdmlzdWFsaXphdGlvbiBkYXRhCi0gICAgdWludDY0X3Qgbm93ID0gdXB0aW1lTWlsbGlzKCk7Ci0gICAgaWYgKGxhc3RSZWFkVGltZSArIFRPVEFMQlVGVElNRU1TRUMgPj0gbm93KSB7Ci0gICAgICAgIC8vIEJhc2VkIG9uIHRoZSBjdXJyZW50IHBsYXkgY291bnRlciwgdGhlIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBhbmQKLSAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmVhbCB0aW1lIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIHJlYWwgc3RhcnQKLSAgICAgICAgLy8gdGltZSBvZiB0aGUgYnVmZmVyIHdlJ3JlIGFib3V0IHRvIHdyaXRlLgotICAgICAgICB1aW50MzJfdCBwb3M7Ci0gICAgICAgIG1UcmFjay0+Z2V0UG9zaXRpb24oJnBvcyk7Ci0KLSAgICAgICAgLy8gd2UncmUgd3JpdGluZyBhaGVhZCBieSB0aGlzIG1hbnkgZnJhbWVzOgotICAgICAgICBpbnQgYWhlYWQgPSBtTnVtRnJhbWVzV3JpdHRlbiAtIHBvczsKLSAgICAgICAgLy9MT0dJKCJAQEAgd3JpdHRlbjogJWQsIHBsYXlwb3M6ICVkLCBsYXRlbmN5OiAlZCIsIG1OdW1GcmFtZXNXcml0dGVuLCBwb3MsIG1UcmFjay0+bGF0ZW5jeSgpKTsKLSAgICAgICAgLy8gd2hpY2ggaXMgdGhpcyBtYW55IG1pbGxpc2Vjb25kcywgYXNzdW1pbmcgNDQxMDAgSHo6Ci0gICAgICAgIGFoZWFkIC89IDQ0OwotCi0gICAgICAgIG1ha2VWaXpCdWZmZXJzKChjb25zdCBjaGFyKilidWZmZXIsIHNpemUsIG5vdyArIGFoZWFkICsgbVRyYWNrLT5sYXRlbmN5KCkpOwotICAgICAgICBsYXN0V3JpdGVUaW1lID0gbm93OwotICAgIH0KLX0KIAogCiBzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCkBAIC0xNTkwLDkgKzE0NjcsNyBAQAogCiAgICAgLy9MT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrKSB7Ci0gICAgICAgIHNub29wV3JpdGUoYnVmZmVyLCBzaXplKTsKICAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IHJldCAvIDQ7IC8vIGFzc3VtZSAxNiBiaXQgc3RlcmVvCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTYwMiw3ICsxNDc3LDYgQEAKIHsKICAgICBMT0dWKCJzdG9wIik7CiAgICAgaWYgKG1UcmFjaykgbVRyYWNrLT5zdG9wKCk7Ci0gICAgbGFzdFdyaXRlVGltZSA9IDA7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Zmx1c2goKQpAQCAtMTYxNSw3ICsxNDg5LDYgQEAKIHsKICAgICBMT0dWKCJwYXVzZSIpOwogICAgIGlmIChtVHJhY2spIG1UcmFjay0+cGF1c2UoKTsKLSAgICBsYXN0V3JpdGVUaW1lID0gMDsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpjbG9zZSgpCkBAIC0xNjM1LDYgKzE1MDgsMjYgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOworICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKKyAgICBpZiAobVRyYWNrKSB7CisgICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKK3sKKyAgICBMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOworICAgIGlmIChtVHJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyBzdGF0aWMKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAogICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewpAQCAtMTY1MSw5ICsxNTQ0LDExIEBACiAKICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwogCi0gICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7Ci0gICAgICAgIG1lLT5zbm9vcFdyaXRlKGJ1ZmZlci0+cmF3LCBhY3R1YWxTaXplKTsKLSAgICB9Cit9CisKK2ludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKQoreworICAgIHJldHVybiBtU2Vzc2lvbklkOwogfQogCiAjdW5kZWYgTE9HX1RBRwpAQCAtMTg0Myw0ICsxNzM4LDkgQEAKICAgICBwLT5tU2lnbmFsLnNpZ25hbCgpOwogfQogCitpbnQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpnZXRTZXNzaW9uSWQoKQoreworICAgIHJldHVybiAwOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjQwOGM2Mi4uNDQ5MmUyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNjUsNyArNjUsNyBAQAogICAgIGNsYXNzIEF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb091dHB1dCgpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWR5KCkgY29uc3QgeyByZXR1cm4gbVRyYWNrICE9IE5VTEw7IH0KQEAgLTc3LDYgKzc3LDcgQEAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgbGF0ZW5jeSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgICAgICBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CisgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFNlc3Npb25JZCgpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwKQEAgLTkxLDYgKzkyLDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGludCBzdHJlYW1UeXBlKSB7IG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIGlzT25FbXVsYXRvcigpOwpAQCAtMTA4LDEzICsxMTEsMTIgQEAKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZTsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7Ci0KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKKyAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwogICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7ICAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0CiAKLSAgICAgICAgcHVibGljOiAvLyB2aXN1YWxpemF0aW9uIGhhY2sgc3VwcG9ydAotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc25vb3BXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KTsKICAgICB9OwogCiAgICAgY2xhc3MgQXVkaW9DYWNoZSA6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawpAQCAtMTMyLDYgKzEzNCw3IEBACiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGxhdGVuY3koKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBmbG9hdCAgICAgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pOworICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBvcGVuKAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGludCBmb3JtYXQsCkBAIC0xODUsMTIgKzE4OCwxMSBAQAogICAgIC8vIEhvdXNlIGtlZXBpbmcgZm9yIG1lZGlhIHBsYXllciBjbGllbnRzCiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+ICAgIGNyZWF0ZSgKICAgICAgICAgICAgIHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBjb25zdCBjaGFyKiB1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBzbm9vcCgpOwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC0yMjQsNiArMjI2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICpyZXBseSk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN1c3BlbmQoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzdW1lKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogCiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgIGNyZWF0ZVBsYXllcihwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKIApAQCAtMjM3LDEyICsyNDEsMTUgQEAKICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKSB7IHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7IH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCggY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50KCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5DbGllbnQoKTsKIApAQCAtMjcxLDYgKzI3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBtU3RhdHVzOwogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQ29ubklkOworICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwogCiAgICAgICAgIC8vIE1ldGFkYXRhIGZpbHRlcnMuCiAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggMTJkZTBkOS4uMTk5MTVmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtMjk0LDEzICsyOTQsMTEgQEAKICAgICBMT0dWKCJDbGllbnQgY29uc3RydWN0b3IiKTsKICAgICBtUGlkID0gcGlkOwogCi0jaWYgQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmVuYWJsZS1yZWNvcmQiLCB2YWx1ZSwgTlVMTCkKLSAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7CisgICAgaWYgKCFwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmVuYWJsZS1yZWNvcmQiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgfHwgIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkgewogICAgICAgICBtUmVjb3JkZXIgPSBuZXcgU3RhZ2VmcmlnaHRSZWNvcmRlcjsKICAgICB9IGVsc2UKLSNlbmRpZgogI2lmbmRlZiBOT19PUEVOQ09SRQogICAgIHsKICAgICAgICAgbVJlY29yZGVyID0gbmV3IFBWTWVkaWFSZWNvcmRlcigpOwpAQCAtMzIwLDcgKzMxOCw3IEBACiAgICAgcmVsZWFzZSgpOwogfQogCi1zdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBsaXN0ZW5lcikKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpCiB7CiAgICAgTE9HVigic2V0TGlzdGVuZXIiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0zMzEsNSArMzI5LDEyIEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgeworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCA4MDUwMDVkLi4xZDE5MTNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzIE1lZGlhUmVjb3JkZXJDbGllbnQgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbAkgICAgc3RhdHVzX3QJCXNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NvdXJjZShpbnQgdnMpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1NvdXJjZShpbnQgYXMpOwpAQCAtNDAsMjYgKzQwLDI3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcik7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmUoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgZ2V0TWF4QW1wbGl0dWRlKGludCogbWF4KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwotICAgIHZpcnR1YWwJICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBpbml0KCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIGNsb3NlKCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2UoKTsKIAorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCisgICAgZnJpZW5kIGNsYXNzICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCk7Ci0gICAgdmlydHVhbCAJCSAgICAgICAgIH5NZWRpYVJlY29yZGVyQ2xpZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVjb3JkZXJDbGllbnQoY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwgcGlkX3QgcGlkKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgfk1lZGlhUmVjb3JkZXJDbGllbnQoKTsKIAotICAgIHBpZF90CQkJIG1QaWQ7Ci0gICAgTXV0ZXgJCQkgbUxvY2s7Ci0gICAgTWVkaWFSZWNvcmRlckJhc2UgICAgICAgICAgICAqbVJlY29yZGVyOwotICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICAgbU1lZGlhUGxheWVyU2VydmljZTsKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgTWVkaWFSZWNvcmRlckJhc2UgICAgICAgICAgICptUmVjb3JkZXI7CisgICAgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiAgICAgIG1NZWRpYVBsYXllclNlcnZpY2U7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNTUwYjg0ZC4uMzlmY2U4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9QVk1ldGFkYXRhUmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+Ci0jaW5jbHVkZSAiVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIuaCIKICNpbmNsdWRlICJNaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCIKICNpbmNsdWRlICJNZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIgogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKQEAgLTEwMywzMCArMTAyLDE3IEBACiB7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHA7CiAgICAgc3dpdGNoIChwbGF5ZXJUeXBlKSB7Ci0jaWYgQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCiAgICAgICAgIGNhc2UgU1RBR0VGUklHSFRfUExBWUVSOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtbWV0YSIsIHZhbHVlLCBOVUxMKQotICAgICAgICAgICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgewotICAgICAgICAgICAgICAgIExPR1YoImNyZWF0ZSBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIik7Ci0gICAgICAgICAgICAgICAgcCA9IG5ldyBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIHAgPSBuZXcgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0jZW5kaWYKICNpZm5kZWYgTk9fT1BFTkNPUkUKICAgICAgICAgY2FzZSBQVl9QTEFZRVI6CiAgICAgICAgICAgICBMT0dWKCJjcmVhdGUgcHYgbWV0YWRhdGEgcmV0cmlldmVyIik7CiAgICAgICAgICAgICBwID0gbmV3IFBWTWV0YWRhdGFSZXRyaWV2ZXIoKTsKICAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCi0gICAgICAgIGNhc2UgVk9SQklTX1BMQVlFUjoKLSAgICAgICAgICAgIExPR1YoImNyZWF0ZSB2b3JiaXMgbWV0YWRhdGEgcmV0cmlldmVyIik7Ci0gICAgICAgICAgICBwID0gbmV3IFZvcmJpc01ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTT05JVk9YX1BMQVlFUjoKICAgICAgICAgICAgIExPR1YoImNyZWF0ZSBtaWRpIG1ldGFkYXRhIHJldHJpZXZlciIpOwogICAgICAgICAgICAgcCA9IG5ldyBNaWRpTWV0YWRhdGFSZXRyaWV2ZXIoKTsKQEAgLTI2Nyw2ICsyNTMsOCBAQAogICAgIGZyYW1lQ29weS0+bURpc3BsYXlXaWR0aCA9IGZyYW1lLT5tRGlzcGxheVdpZHRoOwogICAgIGZyYW1lQ29weS0+bURpc3BsYXlIZWlnaHQgPSBmcmFtZS0+bURpc3BsYXlIZWlnaHQ7CiAgICAgZnJhbWVDb3B5LT5tU2l6ZSA9IGZyYW1lLT5tU2l6ZTsKKyAgICBmcmFtZUNvcHktPm1Sb3RhdGlvbkFuZ2xlID0gZnJhbWUtPm1Sb3RhdGlvbkFuZ2xlOworICAgIExPR1YoInJvdGF0aW9uOiAlZCIsIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUpOwogICAgIGZyYW1lQ29weS0+bURhdGEgPSAodWludDhfdCAqKWZyYW1lQ29weSArIHNpemVvZihWaWRlb0ZyYW1lKTsKICAgICBtZW1jcHkoZnJhbWVDb3B5LT5tRGF0YSwgZnJhbWUtPm1EYXRhLCBmcmFtZS0+bVNpemUpOwogICAgIGRlbGV0ZSBmcmFtZTsgIC8vIEZpeCBtZW1vcnkgbGVha2FnZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggMmM5NmQ2ZC4uNmJkZWQwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC0xODAsNiArMTgwLDEwIEBACiAgICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAogICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUtfRk9SV0FSRCk7CiAKKyAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAorICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQXZhaWxhYmxlLAorICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspOworCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggNTMxZmQxMS4uNTUzNjQ4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjAsNjkgKzIwLDE0MiBAQAogCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgogCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1TdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkgeworU3RhZ2VmcmlnaHRSZWNvcmRlcjo6U3RhZ2VmcmlnaHRSZWNvcmRlcigpCisgICAgOiBtV3JpdGVyKE5VTEwpLAorICAgICAgbU91dHB1dEZkKC0xKSB7CisKKyAgICBMT0dWKCJDb25zdHJ1Y3RvciIpOwogICAgIHJlc2V0KCk7CiB9CiAKIFN0YWdlZnJpZ2h0UmVjb3JkZXI6On5TdGFnZWZyaWdodFJlY29yZGVyKCkgeworICAgIExPR1YoIkRlc3RydWN0b3IiKTsKICAgICBzdG9wKCk7Ci0KLSAgICBpZiAobU91dHB1dEZkID49IDApIHsKLSAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwotICAgICAgICBtT3V0cHV0RmQgPSAtMTsKLSAgICB9CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmluaXQoKSB7CisgICAgTE9HVigiaW5pdCIpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlIGFzKSB7Ci0gICAgbUF1ZGlvU291cmNlID0gYXM7CisgICAgTE9HVigic2V0QXVkaW9Tb3VyY2U6ICVkIiwgYXMpOworICAgIGlmIChhcyA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CisgICAgICAgIGFzID49IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBhcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGFzID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIG1BdWRpb1NvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gYXM7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRWaWRlb1NvdXJjZSh2aWRlb19zb3VyY2UgdnMpIHsKLSAgICBtVmlkZW9Tb3VyY2UgPSB2czsKKyAgICBMT0dWKCJzZXRWaWRlb1NvdXJjZTogJWQiLCB2cyk7CisgICAgaWYgKHZzIDwgVklERU9fU09VUkNFX0RFRkFVTFQgfHwKKyAgICAgICAgdnMgPj0gVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gc291cmNlOiAlZCIsIHZzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodnMgPT0gVklERU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgbVZpZGVvU291cmNlID0gVklERU9fU09VUkNFX0NBTUVSQTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVmlkZW9Tb3VyY2UgPSB2czsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZvcm1hdChvdXRwdXRfZm9ybWF0IG9mKSB7Ci0gICAgbU91dHB1dEZvcm1hdCA9IG9mOworICAgIExPR1YoInNldE91dHB1dEZvcm1hdDogJWQiLCBvZik7CisgICAgaWYgKG9mIDwgT1VUUFVUX0ZPUk1BVF9ERUZBVUxUIHx8CisgICAgICAgIG9mID49IE9VVFBVVF9GT1JNQVRfTElTVF9FTkQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBvdXRwdXQgZm9ybWF0OiAlZCIsIG9mKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAob2YgPT0gT1VUUFVUX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKKyAgICB9IGVsc2UgeworICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2Y7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb0VuY29kZXIoYXVkaW9fZW5jb2RlciBhZSkgewotICAgIG1BdWRpb0VuY29kZXIgPSBhZTsKKyAgICBMT0dWKCJzZXRBdWRpb0VuY29kZXI6ICVkIiwgYWUpOworICAgIGlmIChhZSA8IEFVRElPX0VOQ09ERVJfREVGQVVMVCB8fAorICAgICAgICBhZSA+PSBBVURJT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gZW5jb2RlcjogJWQiLCBhZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGFlID09IEFVRElPX0VOQ09ERVJfREVGQVVMVCkgeworICAgICAgICBtQXVkaW9FbmNvZGVyID0gQVVESU9fRU5DT0RFUl9BTVJfTkI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvRW5jb2RlciA9IGFlOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0VmlkZW9FbmNvZGVyKHZpZGVvX2VuY29kZXIgdmUpIHsKLSAgICBtVmlkZW9FbmNvZGVyID0gdmU7CisgICAgTE9HVigic2V0VmlkZW9FbmNvZGVyOiAlZCIsIHZlKTsKKyAgICBpZiAodmUgPCBWSURFT19FTkNPREVSX0RFRkFVTFQgfHwKKyAgICAgICAgdmUgPj0gVklERU9fRU5DT0RFUl9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHZpZGVvIGVuY29kZXI6ICVkIiwgdmUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICh2ZSA9PSBWSURFT19FTkNPREVSX0RFRkFVTFQpIHsKKyAgICAgICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfSDI2MzsKKyAgICB9IGVsc2UgeworICAgICAgICBtVmlkZW9FbmNvZGVyID0gdmU7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgTE9HVigic2V0VmlkZW9TaXplOiAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gc2l6ZTogJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIG9uIHRoZSBkaW1lbnNpb24gd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIKICAgICBtVmlkZW9XaWR0aCA9IHdpZHRoOwogICAgIG1WaWRlb0hlaWdodCA9IGhlaWdodDsKIApAQCAtOTAsMzUgKzE2Myw3MCBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpIHsKKyAgICBMT0dWKCJzZXRWaWRlb0ZyYW1lUmF0ZTogJWQiLCBmcmFtZXNfcGVyX3NlY29uZCk7CisgICAgaWYgKGZyYW1lc19wZXJfc2Vjb25kIDw9IDAgfHwgZnJhbWVzX3Blcl9zZWNvbmQgPiAzMCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHZpZGVvIGZyYW1lIHJhdGU6ICVkIiwgZnJhbWVzX3Blcl9zZWNvbmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIGZyYW1lIHJhdGUgd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIKICAgICBtRnJhbWVSYXRlID0gZnJhbWVzX3Blcl9zZWNvbmQ7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmY2FtZXJhKSB7Ci0gICAgbUNhbWVyYSA9IGNhbWVyYTsKKyAgICBMT0dWKCJzZXRDYW1lcmEiKTsKKyAgICBpZiAoY2FtZXJhID09IDApIHsKKyAgICAgICAgTE9HRSgiY2FtZXJhIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBtRmxhZ3MgJj0gfkZMQUdTX0hPVF9DQU1FUkE7CisgICAgbUNhbWVyYSA9IENhbWVyYTo6Y3JlYXRlKGNhbWVyYSk7CisgICAgaWYgKG1DYW1lcmEgPT0gMCkgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gY29ubmVjdCB0byBjYW1lcmEiKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgTE9HVigiQ29ubmVjdGVkIHRvIGNhbWVyYSIpOworICAgIGlmIChtQ2FtZXJhLT5wcmV2aWV3RW5hYmxlZCgpKSB7CisgICAgICAgIExPR1YoImNhbWVyYSBpcyBob3QiKTsKKyAgICAgICAgbUZsYWdzIHw9IEZMQUdTX0hPVF9DQU1FUkE7CisgICAgfQorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZTogJXAiLCBzdXJmYWNlLmdldCgpKTsKICAgICBtUHJldmlld1N1cmZhY2UgPSBzdXJmYWNlOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBMT0dFKCJzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqKSBtdXN0IG5vdCBiZSBjYWxsZWQiKTsKICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHRoaXMgYXQgYWxsLCBhcyB0aGUgbWVkaWFfc2VydmVyIHByb2Nlc3MKICAgICAvLyBubyBsb25nZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBmaWxlcy4KIAotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiAtRVBFUk07CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICBMT0dWKCJzZXRPdXRwdXRGaWxlOiAlZCwgJWxsZCwgJWxsZCIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgLy8gVGhlc2UgZG9uJ3QgbWFrZSBhbnkgc2Vuc2UsIGRvIHRoZXk/CiAgICAgQ0hFQ0tfRVEob2Zmc2V0LCAwKTsKICAgICBDSEVDS19FUShsZW5ndGgsIDApOwogCisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogJWQiLCBmZCk7CisgICAgICAgIHJldHVybiAtRUJBREY7CisgICAgfQorCiAgICAgaWYgKG1PdXRwdXRGZCA+PSAwKSB7CiAgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkKTsKICAgICB9CkBAIC0xMjcsMTMgKzIzNSwzODYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmcGFyYW1zKSB7Ci0gICAgbVBhcmFtcyA9IHBhcmFtczsKKy8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKKy8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCitzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgeworICAgIGNoYXIgKmVuZDsKKyAgICAqdmFsID0gc3RydG9sbChzLCAmZW5kLCAxMCk7CiAKKyAgICBpZiAoZW5kID09IHMgfHwgZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICB3aGlsZSAoaXNzcGFjZSgqZW5kKSkgeworICAgICAgICArK2VuZDsKKyAgICB9CisKKyAgICAvLyBGb3IgYSBzdWNjZXNzZnVsIHJldHVybiwgdGhlIHN0cmluZyBtdXN0IGNvbnRhaW4gbm90aGluZyBidXQgYSB2YWxpZAorICAgIC8vIGludDY0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UuCisKKyAgICByZXR1cm4gKmVuZCA9PSAnXDAnOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgaW4gWzAsIDB4MDA3RkZGRkZGRl0KK3N0YXRpYyBib29sIHNhZmVfc3RydG9pMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqdmFsKSB7CisgICAgaW50NjRfdCB0ZW1wOworICAgIGlmIChzYWZlX3N0cnRvaTY0KHMsICZ0ZW1wKSkgeworICAgICAgICBpZiAodGVtcCA+PSAwICYmIHRlbXAgPD0gMHgwMDdGRkZGRkZGKSB7CisgICAgICAgICAgICAqdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odGVtcCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFRyaW0gYm90aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KK3N0YXRpYyB2b2lkIFRyaW1TdHJpbmcoU3RyaW5nOCAqcykgeworICAgIHNpemVfdCBudW1fYnl0ZXMgPSBzLT5ieXRlcygpOworICAgIGNvbnN0IGNoYXIgKmRhdGEgPSBzLT5zdHJpbmcoKTsKKworICAgIHNpemVfdCBsZWFkaW5nX3NwYWNlID0gMDsKKyAgICB3aGlsZSAobGVhZGluZ19zcGFjZSA8IG51bV9ieXRlcyAmJiBpc3NwYWNlKGRhdGFbbGVhZGluZ19zcGFjZV0pKSB7CisgICAgICAgICsrbGVhZGluZ19zcGFjZTsKKyAgICB9CisKKyAgICBzaXplX3QgaSA9IG51bV9ieXRlczsKKyAgICB3aGlsZSAoaSA+IGxlYWRpbmdfc3BhY2UgJiYgaXNzcGFjZShkYXRhW2kgLSAxXSkpIHsKKyAgICAgICAgLS1pOworICAgIH0KKworICAgIHMtPnNldFRvKFN0cmluZzgoJmRhdGFbbGVhZGluZ19zcGFjZV0sIGkgLSBsZWFkaW5nX3NwYWNlKSk7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXVkaW9TYW1wbGluZ1JhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgTE9HVigic2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZTogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICBpZiAoc2FtcGxlUmF0ZSA8PSAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gc2FtcGxpbmcgcmF0ZTogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIG9uIHRoZSBzYW1wbGUgcmF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlci4KKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+ICZsaXN0ZW5lcikgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmVscykgeworICAgIExPR1YoInNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzOiAlZCIsIGNoYW5uZWxzKTsKKyAgICBpZiAoY2hhbm5lbHMgPD0gMCB8fCBjaGFubmVscyA+PSAzKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzOiAlZCIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIG9uIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIuCisgICAgbUF1ZGlvQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXVkaW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgTE9HVigic2V0UGFyYW1BdWRpb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICBpZiAoYml0UmF0ZSA8PSAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gZW5jb2RpbmcgYml0IHJhdGU6ICVkIiwgYml0UmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVGhlIHRhcmdldCBiaXQgcmF0ZSBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZC4KKyAgICAvLyBJdCBkZXBlbmRzIG9uIG1hbnkgZmFjdG9ycywgc3VjaCBhcyByYXRlIGNvbnRyb2wsIGFuZCB0aGUgYml0IHJhdGUKKyAgICAvLyByYW5nZSB0aGF0IGEgc3BlY2lmaWMgZW5jb2RlciBzdXBwb3J0cy4gVGhlIG1pc21hdGNoIGJldHdlZW4gdGhlCisgICAgLy8gdGhlIHRhcmdldCBhbmQgcmVxdWVzdGVkIGJpdCByYXRlIHdpbGwgTk9UIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgICAgbUF1ZGlvQml0UmF0ZSA9IGJpdFJhdGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSkgeworICAgIExPR1YoInNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGU6ICVkIiwgYml0UmF0ZSk7CisgICAgaWYgKGJpdFJhdGUgPD0gMCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHZpZGVvIGVuY29kaW5nIGJpdCByYXRlOiAlZCIsIGJpdFJhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRoZSB0YXJnZXQgYml0IHJhdGUgbWF5IG5vdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQuCisgICAgLy8gSXQgZGVwZW5kcyBvbiBtYW55IGZhY3RvcnMsIHN1Y2ggYXMgcmF0ZSBjb250cm9sLCBhbmQgdGhlIGJpdCByYXRlCisgICAgLy8gcmFuZ2UgdGhhdCBhIHNwZWNpZmljIGVuY29kZXIgc3VwcG9ydHMuIFRoZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZQorICAgIC8vIHRoZSB0YXJnZXQgYW5kIHJlcXVlc3RlZCBiaXQgcmF0ZSB3aWxsIE5PVCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLgorICAgIG1WaWRlb0JpdFJhdGUgPSBiaXRSYXRlOworICAgIHJldHVybiBPSzsKK30KKworLy8gQWx3YXlzIHJvdGF0ZSBjbG9ja3dpc2UsIGFuZCBvbmx5IHN1cHBvcnQgMCwgOTAsIDE4MCBhbmQgMjcwIGZvciBub3cuCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvUm90YXRpb24oaW50MzJfdCBkZWdyZWVzKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb1JvdGF0aW9uOiAlZCIsIGRlZ3JlZXMpOworICAgIGlmIChkZWdyZWVzIDwgMCB8fCBkZWdyZWVzICUgOTAgIT0gMCkgeworICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCB2aWRlbyByb3RhdGlvbiBhbmdsZTogJWQiLCBkZWdyZWVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVJvdGF0aW9uRGVncmVlcyA9IGRlZ3JlZXMgJSAzNjA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1NYXhGaWxlRHVyYXRpb25VczogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgaWYgKHRpbWVVcyA8PSAwKSB7CisgICAgICAgIExPR1coIk1heCBmaWxlIGR1cmF0aW9uIGlzIG5vdCBwb3NpdGl2ZTogJWxsZCB1cy4gRGlzYWJsaW5nIGR1cmF0aW9uIGxpbWl0LiIsIHRpbWVVcyk7CisgICAgICAgIHRpbWVVcyA9IDA7IC8vIERpc2FibGUgdGhlIGR1cmF0aW9uIGxpbWl0IGZvciB6ZXJvIG9yIG5lZ2F0aXZlIHZhbHVlcy4KKyAgICB9IGVsc2UgaWYgKHRpbWVVcyA8PSAxMDAwMDBMTCkgeyAgLy8gWFhYOiAxMDAgbWlsbGktc2Vjb25kcworICAgICAgICBMT0dFKCJNYXggZmlsZSBkdXJhdGlvbiBpcyB0b28gc2hvcnQ6ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IHRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhpbnQ2NF90IGJ5dGVzKSB7CisgICAgTE9HVigic2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzOiAlbGxkIGJ5dGVzIiwgYnl0ZXMpOworICAgIGlmIChieXRlcyA8PSAxMDI0KSB7ICAvLyBYWFg6IDEga0IKKyAgICAgICAgTE9HRSgiTWF4IGZpbGUgc2l6ZSBpcyB0b28gc21hbGw6ICVsbGQgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gYnl0ZXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUludGVybGVhdmVEdXJhdGlvbihpbnQzMl90IGR1cmF0aW9uVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUludGVybGVhdmVEdXJhdGlvbjogJWQiLCBkdXJhdGlvblVzKTsKKyAgICBpZiAoZHVyYXRpb25VcyA8PSA1MDAwMDApIHsgICAgICAgICAgIC8vICA1MDAgbXMKKyAgICAgICAgLy8gSWYgaW50ZXJsZWF2ZSBkdXJhdGlvbiBpcyB0b28gc21hbGwsIGl0IGlzIHZlcnkgaW5lZmZpY2llbnQgdG8gZG8KKyAgICAgICAgLy8gaW50ZXJsZWF2aW5nIHNpbmNlIHRoZSBtZXRhZGF0YSBvdmVyaGVhZCB3aWxsIGNvdW50IGZvciBhIHNpZ25pZmljYW50CisgICAgICAgIC8vIHBvcnRpb24gb2YgdGhlIHNhdmVkIGNvbnRlbnRzCisgICAgICAgIExPR0UoIkF1ZGlvL3ZpZGVvIGludGVybGVhdmUgZHVyYXRpb24gaXMgdG9vIHNtYWxsOiAlZCB1cyIsIGR1cmF0aW9uVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoZHVyYXRpb25VcyA+PSAxMDAwMDAwMCkgeyAgLy8gMTAgc2Vjb25kcworICAgICAgICAvLyBJZiBpbnRlcmxlYXZpbmcgZHVyYXRpb24gaXMgdG9vIGxhcmdlLCBpdCBjYW4gY2F1c2UgdGhlIHJlY29yZGluZworICAgICAgICAvLyBzZXNzaW9uIHRvIHVzZSB0b28gbXVjaCBtZW1vcnkgc2luY2Ugd2UgaGF2ZSB0byBzYXZlIHRoZSBvdXRwdXQKKyAgICAgICAgLy8gZGF0YSBiZWZvcmUgd2Ugd3JpdGUgdGhlbSBvdXQKKyAgICAgICAgTE9HRSgiQXVkaW8vdmlkZW8gaW50ZXJsZWF2ZSBkdXJhdGlvbiBpcyB0b28gbGFyZ2U6ICVkIHVzIiwgZHVyYXRpb25Vcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBJZiBzZWNvbmRzIDwgIDAsIG9ubHkgdGhlIGZpcnN0IGZyYW1lIGlzIEkgZnJhbWUsIGFuZCByZXN0IGFyZSBhbGwgUCBmcmFtZXMKKy8vIElmIHNlY29uZHMgPT0gMCwgYWxsIGZyYW1lcyBhcmUgZW5jb2RlZCBhcyBJIGZyYW1lcy4gTm8gUCBmcmFtZXMKKy8vIElmIHNlY29uZHMgPiAgMCwgaXQgaXMgdGhlIHRpbWUgc3BhY2luZyAoc2Vjb25kcykgYmV0d2VlbiAyIG5laWdoYm9yaW5nIEkgZnJhbWVzCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcykgeworICAgIExPR1YoInNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWw6ICVkIHNlY29uZHMiLCBzZWNvbmRzKTsKKyAgICBtSUZyYW1lc0ludGVydmFsU2VjID0gc2Vjb25kczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtNjRCaXRGaWxlT2Zmc2V0KGJvb2wgdXNlNjRCaXQpIHsKKyAgICBMT0dWKCJzZXRQYXJhbTY0Qml0RmlsZU9mZnNldDogJXMiLAorICAgICAgICB1c2U2NEJpdD8gInVzZSA2NCBiaXQgZmlsZSBvZmZzZXQiOiAidXNlIDMyIGJpdCBmaWxlIG9mZnNldCIpOworICAgIG1Vc2U2NEJpdEZpbGVPZmZzZXQgPSB1c2U2NEJpdDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9DYW1lcmFJZChpbnQzMl90IGNhbWVyYUlkKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb0NhbWVyYUlkOiAlZCIsIGNhbWVyYUlkKTsKKyAgICBpZiAoY2FtZXJhSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UcmFja1RpbWVTdGF0dXMoaW50NjRfdCB0aW1lRHVyYXRpb25VcykgeworICAgIExPR1YoInNldFBhcmFtVHJhY2tUaW1lU3RhdHVzOiAlbGxkIiwgdGltZUR1cmF0aW9uVXMpOworICAgIGlmICh0aW1lRHVyYXRpb25VcyA8IDIwMDAwKSB7ICAvLyBJbmZlYXNpYmxlIGlmIHNob3J0ZXIgdGhhbiAyMCBtcz8KKyAgICAgICAgTE9HRSgiVHJhY2tpbmcgdGltZSBkdXJhdGlvbiB0b28gc2hvcnQ6ICVsbGQgdXMiLCB0aW1lRHVyYXRpb25Vcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSB0aW1lRHVyYXRpb25VczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGU6ICVkIiwgcHJvZmlsZSk7CisKKyAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIHdpbGwgYmUgZG9uZSBsYXRlciB3aGVuIHdlIGxvYWQgdGhlIGVuY29kZXIuCisgICAgLy8gRm9yIG5vdywgd2UgYXJlIGFjY2VwdGluZyB2YWx1ZXMgZGVmaW5lZCBpbiBPcGVuTUFYIElMLgorICAgIG1WaWRlb0VuY29kZXJQcm9maWxlID0gcHJvZmlsZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoaW50MzJfdCBsZXZlbCkgeworICAgIExPR1YoInNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWw6ICVkIiwgbGV2ZWwpOworCisgICAgLy8gQWRkaXRpb25hbCBjaGVjayB3aWxsIGJlIGRvbmUgbGF0ZXIgd2hlbiB3ZSBsb2FkIHRoZSBlbmNvZGVyLgorICAgIC8vIEZvciBub3csIHdlIGFyZSBhY2NlcHRpbmcgdmFsdWVzIGRlZmluZWQgaW4gT3Blbk1BWCBJTC4KKyAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgPSBsZXZlbDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbU1vdmllVGltZVNjYWxlOiAlZCIsIHRpbWVTY2FsZSk7CisKKyAgICAvLyBUaGUgcmFuZ2UgaXMgc2V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBhdWRpbydzIHRpbWUgc2NhbGUgcmFuZ2UKKyAgICAvLyBzaW5jZSBhdWRpbydzIHRpbWUgc2NhbGUgaGFzIGEgd2lkZXIgcmFuZ2UuCisgICAgaWYgKHRpbWVTY2FsZSA8IDYwMCB8fCB0aW1lU2NhbGUgPiA5NjAwMCkgeworICAgICAgICBMT0dFKCJUaW1lIHNjYWxlICglZCkgZm9yIG1vdmllIGlzIG91dCBvZiByYW5nZSBbNjAwLCA5NjAwMF0iLCB0aW1lU2NhbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtTW92aWVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb1RpbWVTY2FsZTogJWQiLCB0aW1lU2NhbGUpOworCisgICAgLy8gNjAwMDAgaXMgY2hvc2VuIHRvIG1ha2Ugc3VyZSB0aGF0IGVhY2ggdmlkZW8gZnJhbWUgZnJvbSBhIDYwLWZwcworICAgIC8vIHZpZGVvIGhhcyAxMDAwIHRpY2tzLgorICAgIGlmICh0aW1lU2NhbGUgPCA2MDAgfHwgdGltZVNjYWxlID4gNjAwMDApIHsKKyAgICAgICAgTE9HRSgiVGltZSBzY2FsZSAoJWQpIGZvciB2aWRlbyBpcyBvdXQgb2YgcmFuZ2UgWzYwMCwgNjAwMDBdIiwgdGltZVNjYWxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVZpZGVvVGltZVNjYWxlID0gdGltZVNjYWxlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSkgeworICAgIExPR1YoInNldFBhcmFtQXVkaW9UaW1lU2NhbGU6ICVkIiwgdGltZVNjYWxlKTsKKworICAgIC8vIDk2MDAwIEh6IGlzIHRoZSBoaWdoZXN0IHNhbXBsaW5nIHJhdGUgc3VwcG9ydCBpbiBBQUMuCisgICAgaWYgKHRpbWVTY2FsZSA8IDYwMCB8fCB0aW1lU2NhbGUgPiA5NjAwMCkgeworICAgICAgICBMT0dFKCJUaW1lIHNjYWxlICglZCkgZm9yIGF1ZGlvIGlzIG91dCBvZiByYW5nZSBbNjAwLCA5NjAwMF0iLCB0aW1lU2NhbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQXVkaW9UaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKKyAgICBpZiAoa2V5ID09ICJtYXgtZHVyYXRpb24iKSB7CisgICAgICAgIGludDY0X3QgbWF4X2R1cmF0aW9uX21zOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJm1heF9kdXJhdGlvbl9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKDEwMDBMTCAqIG1heF9kdXJhdGlvbl9tcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAibWF4LWZpbGVzaXplIikgeworICAgICAgICBpbnQ2NF90IG1heF9maWxlc2l6ZV9ieXRlczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZtYXhfZmlsZXNpemVfYnl0ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzKG1heF9maWxlc2l6ZV9ieXRlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAiaW50ZXJsZWF2ZS1kdXJhdGlvbi11cyIpIHsKKyAgICAgICAgaW50MzJfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1JbnRlcmxlYXZlRHVyYXRpb24oZHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicGFyYW0tbW92aWUtdGltZS1zY2FsZSIpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdGltZVNjYWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtTW92aWVUaW1lU2NhbGUodGltZVNjYWxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS11c2UtNjRiaXQtb2Zmc2V0IikgeworICAgICAgICBpbnQzMl90IHVzZTY0Qml0T2Zmc2V0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnVzZTY0Qml0T2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtNjRCaXRGaWxlT2Zmc2V0KHVzZTY0Qml0T2Zmc2V0ICE9IDApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInBhcmFtLXRyYWNrLXRpbWUtc3RhdHVzIikgeworICAgICAgICBpbnQ2NF90IHRpbWVEdXJhdGlvblVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVEdXJhdGlvblVzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVHJhY2tUaW1lU3RhdHVzKHRpbWVEdXJhdGlvblVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJhdWRpby1wYXJhbS1zYW1wbGluZy1yYXRlIikgeworICAgICAgICBpbnQzMl90IHNhbXBsaW5nX3JhdGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmc2FtcGxpbmdfcmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlKHNhbXBsaW5nX3JhdGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gImF1ZGlvLXBhcmFtLW51bWJlci1vZi1jaGFubmVscyIpIHsKKyAgICAgICAgaW50MzJfdCBudW1iZXJfb2ZfY2hhbm5lbHM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmbnVtYmVyX29mX2NoYW5uZWxzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzKG51bWJlcl9vZl9jaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAiYXVkaW8tcGFyYW0tZW5jb2RpbmctYml0cmF0ZSIpIHsKKyAgICAgICAgaW50MzJfdCBhdWRpb19iaXRyYXRlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1ZGlvX2JpdHJhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdWRpb0VuY29kaW5nQml0UmF0ZShhdWRpb19iaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJhdWRpby1wYXJhbS10aW1lLXNjYWxlIikgeworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lU2NhbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdWRpb1RpbWVTY2FsZSh0aW1lU2NhbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiKSB7CisgICAgICAgIGludDMyX3QgdmlkZW9fYml0cmF0ZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ2aWRlb19iaXRyYXRlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUodmlkZW9fYml0cmF0ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tcm90YXRpb24tYW5nbGUtZGVncmVlcyIpIHsKKyAgICAgICAgaW50MzJfdCBkZWdyZWVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmRlZ3JlZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb1JvdGF0aW9uKGRlZ3JlZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWktZnJhbWVzLWludGVydmFsIikgeworICAgICAgICBpbnQzMl90IHNlY29uZHM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmc2Vjb25kcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKHNlY29uZHMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWVuY29kZXItcHJvZmlsZSIpIHsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKHByb2ZpbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWVuY29kZXItbGV2ZWwiKSB7CisgICAgICAgIGludDMyX3QgbGV2ZWw7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmbGV2ZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb0VuY29kZXJMZXZlbChsZXZlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tY2FtZXJhLWlkIikgeworICAgICAgICBpbnQzMl90IGNhbWVyYUlkOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmNhbWVyYUlkKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9DYW1lcmFJZChjYW1lcmFJZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tdGltZS1zY2FsZSIpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdGltZVNjYWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9UaW1lU2NhbGUodGltZVNjYWxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoInNldFBhcmFtZXRlcjogZmFpbGVkIHRvIGZpbmQga2V5ICVzIiwga2V5LnN0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICZwYXJhbXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXJzOiAlcyIsIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgY29uc3QgY2hhciAqY3BhcmFtcyA9IHBhcmFtcy5zdHJpbmcoKTsKKyAgICBjb25zdCBjaGFyICprZXlfc3RhcnQgPSBjcGFyYW1zOworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXF1YWxfcG9zID0gc3RyY2hyKGtleV9zdGFydCwgJz0nKTsKKyAgICAgICAgaWYgKGVxdWFsX3BvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJQYXJhbWV0ZXJzICVzIG1pc3MgYSB2YWx1ZSIsIGNwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IGtleShrZXlfc3RhcnQsIGVxdWFsX3BvcyAtIGtleV9zdGFydCk7CisgICAgICAgIFRyaW1TdHJpbmcoJmtleSk7CisgICAgICAgIGlmIChrZXkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiUGFyYW1ldGVycyAlcyBjb250YWlucyBhbiBlbXB0eSBrZXkiLCBjcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWVfc3RhcnQgPSBlcXVhbF9wb3MgKyAxOworICAgICAgICBjb25zdCBjaGFyICpzZW1pY29sb25fcG9zID0gc3RyY2hyKHZhbHVlX3N0YXJ0LCAnOycpOworICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICBpZiAoc2VtaWNvbG9uX3BvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICB2YWx1ZS5zZXRUbyh2YWx1ZV9zdGFydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZS5zZXRUbyh2YWx1ZV9zdGFydCwgc2VtaWNvbG9uX3BvcyAtIHZhbHVlX3N0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChzZW1pY29sb25fcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gUmVhY2hlcyB0aGUgZW5kCisgICAgICAgIH0KKyAgICAgICAga2V5X3N0YXJ0ID0gc2VtaWNvbG9uX3BvcyArIDE7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+ICZsaXN0ZW5lcikgewogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTQ0LDcgKzYyNSwxMCBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydCgpIHsKKyAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7CisKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CisgICAgICAgIExPR0UoIkZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCkBAIC0xNTgsNDAgKzY0Miw2NiBAQAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQU1SX1dCOgogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QU1SUmVjb3JkaW5nKCk7CiAKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CisgICAgICAgICAgICByZXR1cm4gc3RhcnRBQUNSZWNvcmRpbmcoKTsKKworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKKyAgICAgICAgICAgIHJldHVybiBzdGFydFJUUFJlY29yZGluZygpOworCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTOgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworCiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiB9CiAKLXNwPE1lZGlhU291cmNlPiBTdGFnZWZyaWdodFJlY29yZGVyOjpjcmVhdGVBTVJBdWRpb1NvdXJjZSgpIHsKLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0KLSAgICAgICAgbUF1ZGlvRW5jb2RlciA9PSBBVURJT19FTkNPREVSX0FNUl9OQiA/IDgwMDAgOiAxNjAwMDsKLQorc3A8TWVkaWFTb3VyY2U+IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNyZWF0ZUF1ZGlvU291cmNlKCkgewogICAgIHNwPEF1ZGlvU291cmNlPiBhdWRpb1NvdXJjZSA9CiAgICAgICAgIG5ldyBBdWRpb1NvdXJjZSgKICAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBtQXVkaW9DaGFubmVscyk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIExPR0UoImF1ZGlvIHNvdXJjZSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgZW5jTWV0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1BdWRpb0VuY29kZXIgPT0gQVVESU9fRU5DT0RFUl9BTVJfTkIKLSAgICAgICAgICAgICAgICA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzd2l0Y2ggKG1BdWRpb0VuY29kZXIpIHsKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9OQjoKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0RFRkFVTFQ6CisgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfV0I6CisgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUM6CisgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJVbmtub3duIGF1ZGlvIGVuY29kZXI6ICVkIiwgbUF1ZGlvRW5jb2Rlcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZW5jTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CiAgICAgQ0hFQ0soYXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAga0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpOwogCiAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAxKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUF1ZGlvQ2hhbm5lbHMpOworICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CisgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1BdWRpb0JpdFJhdGUpOworICAgIGlmIChtQXVkaW9UaW1lU2NhbGUgPiAwKSB7CisgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1BdWRpb1RpbWVTY2FsZSk7CisgICAgfQogCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CkBAIC0xOTksMTQ0ICs3MDksNTkzIEBACiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlciA9CiAgICAgICAgIE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBlbmNNZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgYXVkaW9Tb3VyY2UpOworICAgIG1BdWRpb1NvdXJjZU5vZGUgPSBhdWRpb1NvdXJjZTsKIAogICAgIHJldHVybiBhdWRpb0VuY29kZXI7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QUFDUmVjb3JkaW5nKCkgeworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BQUNfQURJRiB8fAorICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyk7CisKKyAgICBDSEVDSyhtQXVkaW9FbmNvZGVyID09IEFVRElPX0VOQ09ERVJfQUFDKTsKKyAgICBDSEVDSyhtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKTsKKworICAgIENIRUNLKDAgPT0gIkFBQ1dyaXRlciBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QU1SUmVjb3JkaW5nKCkgewotICAgIGlmIChtQXVkaW9Tb3VyY2UgPT0gQVVESU9fU09VUkNFX0xJU1RfRU5ECi0gICAgICAgIHx8IG1WaWRlb1NvdXJjZSAhPSBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAorICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOworCisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIpIHsKKyAgICAgICAgaWYgKG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9ERUZBVUxUICYmCisgICAgICAgICAgICBtQXVkaW9FbmNvZGVyICE9IEFVRElPX0VOQ09ERVJfQU1SX05CKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGVuY29kZXIgJWQgdXNlZCBmb3IgQU1STkIgcmVjb3JkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRW5jb2Rlcik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChtU2FtcGxlUmF0ZSAhPSA4MDAwKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQgdXNlZCBmb3IgQU1STkIgcmVjb3JkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyBtT3V0cHV0Rm9ybWF0IG11c3QgYmUgT1VUUFVUX0ZPUk1BVF9BTVJfV0IKKyAgICAgICAgaWYgKG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9BTVJfV0IpIHsKKyAgICAgICAgICAgIExPR0UoIkludmxhaWQgZW5jb2RlciAlZCB1c2VkIGZvciBBTVJXQiByZWNvcmRpbmciLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9FbmNvZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TYW1wbGVSYXRlICE9IDE2MDAwKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNhbXBsZSByYXRlICVkIHVzZWQgZm9yIEFNUldCIHJlY29yZGluZyIsCisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1BdWRpb0NoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgJWQgdXNlZCBmb3IgYW1yIHJlY29yZGluZyIsCisgICAgICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CCi0gICAgICAgICAgICAmJiBtQXVkaW9FbmNvZGVyICE9IEFVRElPX0VOQ09ERVJfREVGQVVMVAotICAgICAgICAgICAgJiYgbUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FNUl9OQikgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IKLSAgICAgICAgICAgICYmIG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9BTVJfV0IpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgaWYgKG1BdWRpb1NvdXJjZSA+PSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBhdWRpbyBzb3VyY2U6ICVkIiwgbUF1ZGlvU291cmNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0gY3JlYXRlQU1SQXVkaW9Tb3VyY2UoKTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKIAogICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7CiAgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOwogICAgIG1Xcml0ZXItPmFkZFNvdXJjZShhdWRpb0VuY29kZXIpOworCisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25VcyAhPSAwKSB7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOworICAgIH0KKyAgICBpZiAobU1heEZpbGVTaXplQnl0ZXMgIT0gMCkgeworICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CisgICAgfQorICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CiAgICAgbVdyaXRlci0+c3RhcnQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKTsKKworICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORAorICAgICAgICAgICAgICAgICYmIG1WaWRlb1NvdXJjZSAhPSBWSURFT19TT1VSQ0VfTElTVF9FTkQpCisgICAgICAgICAgICB8fCAobUF1ZGlvU291cmNlID09IEFVRElPX1NPVVJDRV9MSVNUX0VORAorICAgICAgICAgICAgICAgICYmIG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTElTVF9FTkQpKSB7CisgICAgICAgIC8vIE11c3QgaGF2ZSBleGFjdGx5IG9uZSBzb3VyY2UuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlOworCisgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgc291cmNlID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFZpZGVvRW5jb2Rlcigmc291cmNlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1Xcml0ZXIgPSBuZXcgQVJUUFdyaXRlcihkdXAobU91dHB1dEZkKSk7CisgICAgbVdyaXRlci0+YWRkU291cmNlKHNvdXJjZSk7CisgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKKworICAgIHJldHVybiBtV3JpdGVyLT5zdGFydCgpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUcyVFNSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKTsKKworICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihkdXAobU91dHB1dEZkKSk7CisKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBpZiAobUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FBQykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAorICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKyAgICAgICAgaWYgKG1WaWRlb0VuY29kZXIgIT0gVklERU9fRU5DT0RFUl9IMjY0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJmVuY29kZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKyAgICB9CisKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBpZiAobU1heEZpbGVTaXplQnl0ZXMgIT0gMCkgeworICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKKyAgICB9CisKKyAgICBtV3JpdGVyID0gd3JpdGVyOworCisgICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2xpcFZpZGVvRnJhbWVSYXRlKCkgeworICAgIExPR1YoImNsaXBWaWRlb0ZyYW1lUmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmZwcy5taW4iLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpbnQgbWF4RnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5mcHMubWF4IiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaWYgKG1GcmFtZVJhdGUgPCBtaW5GcmFtZVJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgcmF0ZSAoJWQgZnBzKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkIGZwcykiLCBtRnJhbWVSYXRlLCBtaW5GcmFtZVJhdGUpOworICAgICAgICBtRnJhbWVSYXRlID0gbWluRnJhbWVSYXRlOworICAgIH0gZWxzZSBpZiAobUZyYW1lUmF0ZSA+IG1heEZyYW1lUmF0ZSkgeworICAgICAgICBMT0dXKCJJbnRlbmRlZCB2aWRlbyBlbmNvZGluZyBmcmFtZSByYXRlICglZCBmcHMpIGlzIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICAiIGFuZCB3aWxsIGJlIHNldCB0byAoJWQgZnBzKSIsIG1GcmFtZVJhdGUsIG1heEZyYW1lUmF0ZSk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtYXhGcmFtZVJhdGU7CisgICAgfQorfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNsaXBWaWRlb0JpdFJhdGUoKSB7CisgICAgTE9HVigiY2xpcFZpZGVvQml0UmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5CaXRSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5icHMubWluIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaW50IG1heEJpdFJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmJwcy5tYXgiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpZiAobVZpZGVvQml0UmF0ZSA8IG1pbkJpdFJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGUgKCVkIGJwcykgaXMgdG9vIHNtYWxsIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCBicHMpIiwgbVZpZGVvQml0UmF0ZSwgbWluQml0UmF0ZSk7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBtaW5CaXRSYXRlOworICAgIH0gZWxzZSBpZiAobVZpZGVvQml0UmF0ZSA+IG1heEJpdFJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGUgKCVkIGJwcykgaXMgdG9vIGxhcmdlIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCBicHMpIiwgbVZpZGVvQml0UmF0ZSwgbWF4Qml0UmF0ZSk7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBtYXhCaXRSYXRlOworICAgIH0KK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZVdpZHRoKCkgeworICAgIExPR1YoImNsaXBWaWRlb0ZyYW1lV2lkdGg6IGVuY29kZXIgJWQiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpbnQgbWluRnJhbWVXaWR0aCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWluIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaW50IG1heEZyYW1lV2lkdGggPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtVmlkZW9XaWR0aCA8IG1pbkZyYW1lV2lkdGgpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgd2lkdGggKCVkKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkKSIsIG1WaWRlb1dpZHRoLCBtaW5GcmFtZVdpZHRoKTsKKyAgICAgICAgbVZpZGVvV2lkdGggPSBtaW5GcmFtZVdpZHRoOworICAgIH0gZWxzZSBpZiAobVZpZGVvV2lkdGggPiBtYXhGcmFtZVdpZHRoKSB7CisgICAgICAgIExPR1coIkludGVuZGVkIHZpZGVvIGVuY29kaW5nIGZyYW1lIHdpZHRoICglZCkgaXMgdG9vIGxhcmdlIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCkiLCBtVmlkZW9XaWR0aCwgbWF4RnJhbWVXaWR0aCk7CisgICAgICAgIG1WaWRlb1dpZHRoID0gbWF4RnJhbWVXaWR0aDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgeworICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKKyAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CisgICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKKworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGlmIChtQ2FtZXJhID09IDApIHsKKyAgICAgICAgbUNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdChtQ2FtZXJhSWQpOworICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJDYW1lcmEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuIik7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisgICAgICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKKyAgICAgICAgbUNhbWVyYS0+bG9jaygpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgYWN0dWFsIHZpZGVvIHJlY29yZGluZyBmcmFtZSBzaXplCisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgcGFyYW1zLnNldFByZXZpZXdGcmFtZVJhdGUobUZyYW1lUmF0ZSk7CisgICAgU3RyaW5nOCBzID0gcGFyYW1zLmZsYXR0ZW4oKTsKKyAgICBpZiAoT0sgIT0gbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhzKSkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3QgY2hhbmdlIHNldHRpbmdzLiIKKyAgICAgICAgICAgICAiIFNvbWVvbmUgZWxzZSBpcyB1c2luZyBjYW1lcmEgJWQ/IiwgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgQ2FtZXJhUGFyYW1ldGVycyBuZXdDYW1lcmFQYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKKworICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHNpemUKKyAgICBpbnQgZnJhbWVXaWR0aCA9IDAsIGZyYW1lSGVpZ2h0ID0gMDsKKyAgICBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld1NpemUoJmZyYW1lV2lkdGgsICZmcmFtZUhlaWdodCk7CisgICAgaWYgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAorICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgdGhlIHZpZGVvIGZyYW1lIHNpemUgdG8gJWR4JWQiLAorICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgcmF0ZQorICAgIGludCBmcmFtZVJhdGUgPSBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOworICAgIGlmIChmcmFtZVJhdGUgPCAwIHx8IChmcmFtZVJhdGUgLSBtRnJhbWVSYXRlKSAhPSAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgZnJhbWUgcmF0ZSB0byAlZCBmcHMuIFRoZSBhY3R1YWwgIgorICAgICAgICAgICAgICJmcmFtZSByYXRlIGlzICVkIiwgbUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIENIRUNLIGlzIGdvb2QsIHNpbmNlIHdlIGp1c3QgcGFzc2VkIHRoZSBsb2NrL3VubG9jaworICAgIC8vIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KG1QcmV2aWV3U3VyZmFjZSkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZUhlaWdodCgpIHsKKyAgICBMT0dWKCJjbGlwVmlkZW9GcmFtZUhlaWdodDogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5GcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1pbiIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtYXhGcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1heCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtVmlkZW9IZWlnaHQgPCBtaW5GcmFtZUhlaWdodCkgeworICAgICAgICBMT0dXKCJJbnRlbmRlZCB2aWRlbyBlbmNvZGluZyBmcmFtZSBoZWlnaHQgKCVkKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkKSIsIG1WaWRlb0hlaWdodCwgbWluRnJhbWVIZWlnaHQpOworICAgICAgICBtVmlkZW9IZWlnaHQgPSBtaW5GcmFtZUhlaWdodDsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb0hlaWdodCA+IG1heEZyYW1lSGVpZ2h0KSB7CisgICAgICAgIExPR1coIkludGVuZGVkIHZpZGVvIGVuY29kaW5nIGZyYW1lIGhlaWdodCAoJWQpIGlzIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICAiIGFuZCB3aWxsIGJlIHNldCB0byAoJWQpIiwgbVZpZGVvSGVpZ2h0LCBtYXhGcmFtZUhlaWdodCk7CisgICAgICAgIG1WaWRlb0hlaWdodCA9IG1heEZyYW1lSGVpZ2h0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKKyAgICBzb3VyY2UtPmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBDSEVDSyhjYW1lcmFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1GcmFtZVJhdGUpOworCisgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9NUEVHXzRfU1A6CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bnN1cHBvcnRlZCB2aWRlbyBlbmNvZGluZy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOworCisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgIGlmIChtVmlkZW9UaW1lU2NhbGUgPiAwKSB7CisgICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOworICAgIH0KKyAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKKyAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKKyAgICB9CisgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgeworICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgfQorCisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAorICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UpOworICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgKnNvdXJjZSA9IGVuY29kZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKSB7CisgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlcjsKKyAgICBzd2l0Y2gobUF1ZGlvRW5jb2RlcikgeworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX1dCOgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDOgorICAgICAgICAgICAgYXVkaW9FbmNvZGVyID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB3cml0ZXItPmFkZFNvdXJjZShhdWRpb0VuY29kZXIpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKLSAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKKyAgICBpbnQzMl90IHRvdGFsQml0UmF0ZSA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihkdXAobU91dHB1dEZkKSk7CiAKKyAgICAvLyBBZGQgYXVkaW8gc291cmNlIGZpcnN0IGlmIGl0IGV4aXN0cworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgewotICAgICAgICBDSEVDSyhtQ2FtZXJhICE9IE5VTEwpOwotCi0gICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0KLSAgICAgICAgICAgIENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUlDYW1lcmEobUNhbWVyYSk7Ci0KLSAgICAgICAgQ0hFQ0soY2FtZXJhU291cmNlICE9IE5VTEwpOwotCi0gICAgICAgIGNhbWVyYVNvdXJjZS0+c2V0UHJldmlld1N1cmZhY2UobVByZXZpZXdTdXJmYWNlKTsKLQotICAgICAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgewotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjM6Ci0gICAgICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKLSAgICAgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjQ6Ci0gICAgICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bnN1cHBvcnRlZCB2aWRlbyBlbmNvZGluZy4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICAgICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgT0spOwotCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KLSAgICAgICAgICAgIE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlKTsKLQotICAgICAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7Ci0gICAgICAgIG1Xcml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKCZlbmNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7CisgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPSBjcmVhdGVBTVJBdWRpb1NvdXJjZSgpOwotCi0gICAgICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBtV3JpdGVyLT5hZGRTb3VyY2UoYXVkaW9FbmNvZGVyKTsKKyAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgeworICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAgICAgfQogCi0gICAgbVdyaXRlci0+c3RhcnQoKTsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKKyAgICB9CisgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CisgICAgfQorICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzeXN0ZW1UaW1lKCkgLyAxMDAwKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOworICAgIG1ldGEtPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CisgICAgfQorICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgeworICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICB9CisgICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb25EZWdyZWUsIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgIH0KKyAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgbVdyaXRlciA9IHdyaXRlcjsKKyAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgeworICAgIExPR1YoInBhdXNlIik7CisgICAgaWYgKG1Xcml0ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVdyaXRlci0+cGF1c2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0b3AoKSB7Ci0gICAgaWYgKG1Xcml0ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBMT0dWKCJzdG9wIik7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICB9CiAKLSAgICBtV3JpdGVyLT5zdG9wKCk7Ci0gICAgbVdyaXRlciA9IE5VTEw7CisgICAgaWYgKG1DYW1lcmEgIT0gMCkgeworICAgICAgICBMT0dWKCJEaXNjb25uZWN0IGNhbWVyYSIpOworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgaWYgKChtRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSA9PSAwKSB7CisgICAgICAgICAgICBMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7CisgICAgICAgICAgICBtQ2FtZXJhLT5zdG9wUHJldmlldygpOworICAgICAgICB9CisgICAgICAgIG1DYW1lcmEtPnVubG9jaygpOworICAgICAgICBtQ2FtZXJhLmNsZWFyKCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBtRmxhZ3MgPSAwOworICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICBpZiAobU91dHB1dEZkID49IDApIHsKKyAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOworICAgICAgICBtT3V0cHV0RmQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbG9zZSgpIHsKKyAgICBMT0dWKCJjbG9zZSIpOwogICAgIHN0b3AoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cmVzZXQoKSB7CisgICAgTE9HVigicmVzZXQiKTsKICAgICBzdG9wKCk7CiAKKyAgICAvLyBObyBhdWRpbyBvciB2aWRlbyBzb3VyY2UgYnkgZGVmYXVsdAogICAgIG1BdWRpb1NvdXJjZSA9IEFVRElPX1NPVVJDRV9MSVNUX0VORDsKICAgICBtVmlkZW9Tb3VyY2UgPSBWSURFT19TT1VSQ0VfTElTVF9FTkQ7Ci0gICAgbU91dHB1dEZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfTElTVF9FTkQ7Ci0gICAgbUF1ZGlvRW5jb2RlciA9IEFVRElPX0VOQ09ERVJfTElTVF9FTkQ7Ci0gICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfTElTVF9FTkQ7Ci0gICAgbVZpZGVvV2lkdGggPSAtMTsKLSAgICBtVmlkZW9IZWlnaHQgPSAtMTsKLSAgICBtRnJhbWVSYXRlID0gLTE7CisKKyAgICAvLyBEZWZhdWx0IHBhcmFtZXRlcnMKKyAgICBtT3V0cHV0Rm9ybWF0ICA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOworICAgIG1BdWRpb0VuY29kZXIgID0gQVVESU9fRU5DT0RFUl9BTVJfTkI7CisgICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0gyNjM7CisgICAgbVZpZGVvV2lkdGggICAgPSAxNzY7CisgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CisgICAgbUZyYW1lUmF0ZSAgICAgPSAyMDsKKyAgICBtVmlkZW9CaXRSYXRlICA9IDE5MjAwMDsKKyAgICBtU2FtcGxlUmF0ZSAgICA9IDgwMDA7CisgICAgbUF1ZGlvQ2hhbm5lbHMgPSAxOworICAgIG1BdWRpb0JpdFJhdGUgID0gMTIyMDA7CisgICAgbUludGVybGVhdmVEdXJhdGlvblVzID0gMDsKKyAgICBtSUZyYW1lc0ludGVydmFsU2VjID0gMTsKKyAgICBtQXVkaW9Tb3VyY2VOb2RlID0gMDsKKyAgICBtVXNlNjRCaXRGaWxlT2Zmc2V0ID0gZmFsc2U7CisgICAgbU1vdmllVGltZVNjYWxlICA9IC0xOworICAgIG1BdWRpb1RpbWVTY2FsZSAgPSAtMTsKKyAgICBtVmlkZW9UaW1lU2NhbGUgID0gLTE7CisgICAgbUNhbWVyYUlkICAgICAgICA9IDA7CisgICAgbVZpZGVvRW5jb2RlclByb2ZpbGUgPSAtMTsKKyAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgICA9IC0xOworICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CisgICAgbU1heEZpbGVTaXplQnl0ZXMgPSAwOworICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOworICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIG1FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOworCiAgICAgbU91dHB1dEZkID0gLTE7CisgICAgbUZsYWdzID0gMDsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KSB7Ci0gICAgKm1heCA9IDA7CisgICAgTE9HVigiZ2V0TWF4QW1wbGl0dWRlIik7CisKKyAgICBpZiAobWF4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTnVsbCBwb2ludGVyIGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICAqbWF4ID0gbUF1ZGlvU291cmNlTm9kZS0+Z2V0TWF4QW1wbGl0dWRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1heCA9IDA7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKKyAgICBMT0dWKCJkdW1wIik7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgaWYgKG1Xcml0ZXIgIT0gMCkgeworICAgICAgICBtV3JpdGVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBObyBmaWxlIHdyaXRlclxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgUmVjb3JkZXI6ICVwXG4iLCB0aGlzKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBPdXRwdXQgZmlsZSAoZmQgJWQpOlxuIiwgbU91dHB1dEZkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIGZvcm1hdDogJWRcbiIsIG1PdXRwdXRGb3JtYXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJWxsZFxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIGR1cmF0aW9uICh1cyk6ICVsbGRcbiIsIG1NYXhGaWxlRHVyYXRpb25Vcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBvZmZzZXQgbGVuZ3RoIChiaXRzKTogJWRcbiIsIG1Vc2U2NEJpdEZpbGVPZmZzZXQ/IDY0OiAzMik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgSW50ZXJsZWF2ZSBkdXJhdGlvbiAodXMpOiAlZFxuIiwgbUludGVybGVhdmVEdXJhdGlvblVzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBQcm9ncmVzcyBub3RpZmljYXRpb246ICVsbGQgdXNcbiIsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBBdWRpb1xuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgU291cmNlOiAlZFxuIiwgbUF1ZGlvU291cmNlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyOiAlZFxuIiwgbUF1ZGlvRW5jb2Rlcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtQXVkaW9CaXRSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBTYW1wbGluZyByYXRlIChoeik6ICVkXG4iLCBtU2FtcGxlUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgbUF1ZGlvQ2hhbm5lbHMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBhbXBsaXR1ZGU6ICVkXG4iLCBtQXVkaW9Tb3VyY2VOb2RlID09IDA/IDA6IG1BdWRpb1NvdXJjZU5vZGUtPmdldE1heEFtcGxpdHVkZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgVmlkZW9cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFNvdXJjZTogJWRcbiIsIG1WaWRlb1NvdXJjZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQ2FtZXJhIElkOiAlZFxuIiwgbUNhbWVyYUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBDYW1lcmEgZmxhZ3M6ICVkXG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEVuY29kZXI6ICVkXG4iLCBtVmlkZW9FbmNvZGVyKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyIHByb2ZpbGU6ICVkXG4iLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlciBsZXZlbDogJWRcbiIsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgSSBmcmFtZXMgaW50ZXJ2YWwgKHMpOiAlZFxuIiwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgc2l6ZSAocGl4ZWxzKTogJWR4JWRcbiIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZyYW1lIHJhdGUgKGZwcyk6ICVkXG4iLCBtRnJhbWVSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBCaXQgcmF0ZSAoYnBzKTogJWRcbiIsIG1WaWRlb0JpdFJhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBPSzsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCA3ZWM0MTJkLi5lNDJkZjJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTIzLDggKzIzLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgQ2FtZXJhOwogc3RydWN0IE1lZGlhU291cmNlOwogc3RydWN0IE1lZGlhV3JpdGVyOworc3RydWN0IEF1ZGlvU291cmNlOworY2xhc3MgTWVkaWFQcm9maWxlczsKIAogc3RydWN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgOiBwdWJsaWMgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoKTsKQEAgLTQzLDMzICs0Niw5MiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgbGlzdGVuZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzcDxJQ2FtZXJhPiBtQ2FtZXJhOworICAgIGVudW0gQ2FtZXJhRmxhZ3MgeworICAgICAgICBGTEFHU19TRVRfQ0FNRVJBID0gMUwgPDwgMCwKKyAgICAgICAgRkxBR1NfSE9UX0NBTUVSQSA9IDFMIDw8IDEsCisgICAgfTsKKworICAgIHNwPENhbWVyYT4gbUNhbWVyYTsKICAgICBzcDxJU3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwotICAgIHNwPElNZWRpYVBsYXllckNsaWVudD4gbUxpc3RlbmVyOworICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CisgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CiAKICAgICBhdWRpb19zb3VyY2UgbUF1ZGlvU291cmNlOwogICAgIHZpZGVvX3NvdXJjZSBtVmlkZW9Tb3VyY2U7CiAgICAgb3V0cHV0X2Zvcm1hdCBtT3V0cHV0Rm9ybWF0OwogICAgIGF1ZGlvX2VuY29kZXIgbUF1ZGlvRW5jb2RlcjsKICAgICB2aWRlb19lbmNvZGVyIG1WaWRlb0VuY29kZXI7Ci0gICAgaW50IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7Ci0gICAgaW50IG1GcmFtZVJhdGU7CisgICAgYm9vbCBtVXNlNjRCaXRGaWxlT2Zmc2V0OworICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKKyAgICBpbnQzMl90IG1GcmFtZVJhdGU7CisgICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbUF1ZGlvQml0UmF0ZTsKKyAgICBpbnQzMl90IG1BdWRpb0NoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CisgICAgaW50MzJfdCBtSUZyYW1lc0ludGVydmFsU2VjOworICAgIGludDMyX3QgbUNhbWVyYUlkOworICAgIGludDMyX3QgbVZpZGVvRW5jb2RlclByb2ZpbGU7CisgICAgaW50MzJfdCBtVmlkZW9FbmNvZGVyTGV2ZWw7CisgICAgaW50MzJfdCBtTW92aWVUaW1lU2NhbGU7CisgICAgaW50MzJfdCBtVmlkZW9UaW1lU2NhbGU7CisgICAgaW50MzJfdCBtQXVkaW9UaW1lU2NhbGU7CisgICAgaW50NjRfdCBtTWF4RmlsZVNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1NYXhGaWxlRHVyYXRpb25VczsKKyAgICBpbnQ2NF90IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXM7CisgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOyAgLy8gQ2xvY2t3aXNlCisKICAgICBTdHJpbmc4IG1QYXJhbXM7CiAgICAgaW50IG1PdXRwdXRGZDsKKyAgICBpbnQzMl90IG1GbGFnczsKKworICAgIE1lZGlhUHJvZmlsZXMgKm1FbmNvZGVyUHJvZmlsZXM7CiAKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKLSAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQU1SQXVkaW9Tb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc3RhcnRNUEVHMlRTUmVjb3JkaW5nKCk7CisgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7CisgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOworCisgICAgLy8gRW5jb2RpbmcgcGFyYW1ldGVyIGhhbmRsaW5nIHV0aWxpdGllcworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJMZXZlbChpbnQzMl90IGxldmVsKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvQ2FtZXJhSWQoaW50MzJfdCBjYW1lcmFJZCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb1JvdGF0aW9uKGludDMyX3QgZGVncmVlcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1UcmFja1RpbWVTdGF0dXMoaW50NjRfdCB0aW1lRHVyYXRpb25Vcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1JbnRlcmxlYXZlRHVyYXRpb24oaW50MzJfdCBkdXJhdGlvblVzKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbTY0Qml0RmlsZU9mZnNldChib29sIHVzZTY0Qml0RmlsZU9mZnNldCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1NYXhGaWxlRHVyYXRpb25VcyhpbnQ2NF90IHRpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzKGludDY0X3QgYnl0ZXMpOworICAgIHN0YXR1c190IHNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHZvaWQgY2xpcFZpZGVvQml0UmF0ZSgpOworICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CisgICAgdm9pZCBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CisgICAgdm9pZCBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOwogCiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBTdGFnZWZyaWdodFJlY29yZGVyICYpOwogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIgJm9wZXJhdG9yPShjb25zdCBTdGFnZWZyaWdodFJlY29yZGVyICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzc0ZmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJWb3JiaXNNZXRhZGF0YVJldHJpZXZlci5oIgotI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KLSMKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIFZvcmJpc01ldGFkYXRhUmV0cmlldmVyOjpjbGVhck1ldGFkYXRhVmFsdWVzKCkKLXsKLSAgICBMT0dWKCJjbGVlYXJNZXRhZGF0YVZhbHVlcyIpOwotICAgIG1NZXRhZGF0YVZhbHVlc1swXVswXSA9ICdcMCc7Ci19Ci0KLXN0YXR1c190IFZvcmJpc01ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCkKLXsKLSAgICBMT0dWKCJzZXREYXRhU291cmNlOiB1cmwoJXMpIiwgdXJsPyB1cmw6ICJOVUxMIHBvaW50ZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgY2xlYXJNZXRhZGF0YVZhbHVlcygpOwotICAgIGlmIChtVm9yYmlzUGxheWVyID09IDApIHsKLSAgICAgICAgbVZvcmJpc1BsYXllciA9IG5ldyBWb3JiaXNQbGF5ZXIoKTsKLSAgICB9Ci0gICAgLy8gVE9ETzogc3VwcG9ydCBoZWFkZXJzIGluIE1ldGFkYXRhUmV0cmlldmVyIGludGVyZmFjZSEKLSAgICByZXR1cm4gbVZvcmJpc1BsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIE5VTEwgLyogaGVhZGVycyAqLyk7Ci19Ci0KLXN0YXR1c190IFZvcmJpc01ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotewotICAgIExPR1YoInNldERhdGFTb3VyY2U6IGZkKCVkKSwgb2Zmc2V0KCVsbGQpLCBhbmQgbGVuZ3RoKCVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgY2xlYXJNZXRhZGF0YVZhbHVlcygpOwotICAgIGlmIChtVm9yYmlzUGxheWVyID09IDApIHsKLSAgICAgICAgbVZvcmJpc1BsYXllciA9IG5ldyBWb3JiaXNQbGF5ZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Wb3JiaXNQbGF5ZXItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKLX0KLQotY29uc3QgY2hhciogVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXI6OmV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkKLXsKLSAgICBMT0dWKCJleHRyYWN0TWV0YWRhdGE6IGtleSglZCkiLCBrZXlDb2RlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1Wb3JiaXNQbGF5ZXIgPT0gMCB8fCBtVm9yYmlzUGxheWVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJubyB2b3JiaXMgcGxheWVyIGlzIGluaXRpYWxpemVkIHlldCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgY2FzZSBNRVRBREFUQV9LRVlfRFVSQVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGFWYWx1ZXNbMF1bMF0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChtVm9yYmlzUGxheWVyLT5nZXREdXJhdGlvbigmZHVyYXRpb24pICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBnZXQgZHVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNucHJpbnRmKG1NZXRhZGF0YVZhbHVlc1swXSwgTUFYX01FVEFEQVRBX1NUUklOR19MRU5HVEgsICIlZCIsIGR1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR1YoImR1cmF0aW9uOiAlcyBtcyIsIG1NZXRhZGF0YVZhbHVlc1swXSk7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhVmFsdWVzWzBdOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQga2V5IGNvZGUgKCVkKSIsIGtleUNvZGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLX07Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTdmZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfVk9SQklTTUVUQURBVEFSRVRSSUVWRVJfSAotI2RlZmluZSBBTkRST0lEX1ZPUkJJU01FVEFEQVRBUkVUUklFVkVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJWb3JiaXNQbGF5ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBWb3JiaXNNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIoKSB7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Vm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9NRVRBREFUQV9TVFJJTkdfTEVOR1RIID0gMTI4OwotICAgIHZvaWQgY2xlYXJNZXRhZGF0YVZhbHVlcygpOwotCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICBzcDxWb3JiaXNQbGF5ZXI+ICAgIG1Wb3JiaXNQbGF5ZXI7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBtTWV0YWRhdGFWYWx1ZXNbMV1bTUFYX01FVEFEQVRBX1NUUklOR19MRU5HVEhdOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVk9SQklTTUVUQURBVEFSRVRSSUVWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4MTk5OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzUGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzUGxheWVyIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotCi0jaW5jbHVkZSAiVm9yYmlzUGxheWVyLmgiCi0KLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRPRE86IERldGVybWluZSBhcHByb3ByaWF0ZSByZXR1cm4gY29kZXMKLXN0YXRpYyBzdGF0dXNfdCBFUlJPUl9OT1RfT1BFTiA9IC0xOwotc3RhdGljIHN0YXR1c190IEVSUk9SX09QRU5fRkFJTEVEID0gLTI7Ci1zdGF0aWMgc3RhdHVzX3QgRVJST1JfQUxMT0NBVEVfRkFJTEVEID0gLTQ7Ci1zdGF0aWMgc3RhdHVzX3QgRVJST1JfTk9UX1NVUFBPUlRFRCA9IC04Owotc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9SRUFEWSA9IC0xNjsKLXN0YXRpYyBzdGF0dXNfdCBTVEFURV9JTklUID0gMDsKLXN0YXRpYyBzdGF0dXNfdCBTVEFURV9FUlJPUiA9IDE7Ci1zdGF0aWMgc3RhdHVzX3QgU1RBVEVfT1BFTiA9IDI7Ci0KLQotVm9yYmlzUGxheWVyOjpWb3JiaXNQbGF5ZXIoKSA6Ci0gICAgbUF1ZGlvQnVmZmVyKE5VTEwpLCBtUGxheVRpbWUoLTEpLCBtRHVyYXRpb24oLTEpLCBtU3RhdGUoU1RBVEVfRVJST1IpLAotICAgIG1TdHJlYW1UeXBlKEF1ZGlvU3lzdGVtOjpNVVNJQyksIG1Mb29wKGZhbHNlKSwgbUFuZHJvaWRMb29wKGZhbHNlKSwKLSAgICBtRXhpdChmYWxzZSksIG1QYXVzZWQoZmFsc2UpLCBtUmVuZGVyKGZhbHNlKSwgbVJlbmRlclRpZCgtMSkKLXsKLSAgICBMT0dWKCJjb25zdHJ1Y3RvclxuIik7Ci0gICAgbWVtc2V0KCZtVm9yYmlzRmlsZSwgMCwgc2l6ZW9mIG1Wb3JiaXNGaWxlKTsKLX0KLQotdm9pZCBWb3JiaXNQbGF5ZXI6Om9uRmlyc3RSZWYoKQotewotICAgIExPR1YoIm9uRmlyc3RSZWYiKTsKLSAgICAvLyBjcmVhdGUgcGxheWJhY2sgdGhyZWFkCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBjcmVhdGVUaHJlYWRFdGMocmVuZGVyVGhyZWFkLCB0aGlzLCAidm9yYmlzIGRlY29kZXIiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICBpZiAobVJlbmRlclRpZCA+IDApIHsKLSAgICAgICAgTE9HVigicmVuZGVyIHRocmVhZCglZCkgc3RhcnRlZCIsIG1SZW5kZXJUaWQpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjppbml0Q2hlY2soKQotewotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfRVJST1IpIHJldHVybiBOT19FUlJPUjsKLSAgICByZXR1cm4gRVJST1JfTk9UX1JFQURZOwotfQotCi1Wb3JiaXNQbGF5ZXI6On5Wb3JiaXNQbGF5ZXIoKSB7Ci0gICAgTE9HVigiVm9yYmlzUGxheWVyIGRlc3RydWN0b3JcbiIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgcmV0dXJuIHNldGRhdGFzb3VyY2UodXJpLCAtMSwgMCwgMHg3ZmZmZmZmZmZmZmZmZmZMTCk7IC8vIGludGVudGlvbmFsbHkgbGVzcyB0aGFuIExPTkdfTUFYCi19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLXsKLSAgICByZXR1cm4gc2V0ZGF0YXNvdXJjZShOVUxMLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotfQotCi1zaXplX3QgVm9yYmlzUGxheWVyOjp2cF9mcmVhZCh2b2lkICpidWYsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIHZvaWQgKm1lKSB7Ci0gICAgVm9yYmlzUGxheWVyICpzZWxmID0gKFZvcmJpc1BsYXllciopIG1lOwotCi0gICAgbG9uZyBjdXJwb3MgPSB2cF9mdGVsbChtZSk7Ci0gICAgd2hpbGUgKG5tZW1iICE9IDAgJiYgKGN1cnBvcyArIHNpemUgKiBubWVtYikgPiBzZWxmLT5tTGVuZ3RoKSB7Ci0gICAgICAgIG5tZW1iLS07Ci0gICAgfQotICAgIHJldHVybiBmcmVhZChidWYsIHNpemUsIG5tZW1iLCBzZWxmLT5tRmlsZSk7Ci19Ci0KLWludCBWb3JiaXNQbGF5ZXI6OnZwX2ZzZWVrKHZvaWQgKm1lLCBvZ2dfaW50NjRfdCBvZmYsIGludCB3aGVuY2UpIHsKLSAgICBWb3JiaXNQbGF5ZXIgKnNlbGYgPSAoVm9yYmlzUGxheWVyKikgbWU7Ci0gICAgaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkKLSAgICAgICAgcmV0dXJuIGZzZWVrKHNlbGYtPm1GaWxlLCBvZmYgKyBzZWxmLT5tT2Zmc2V0LCB3aGVuY2UpOwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSBTRUVLX0NVUikKLSAgICAgICAgcmV0dXJuIGZzZWVrKHNlbGYtPm1GaWxlLCBvZmYsIHdoZW5jZSk7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IFNFRUtfRU5EKQotICAgICAgICByZXR1cm4gZnNlZWsoc2VsZi0+bUZpbGUsIHNlbGYtPm1PZmZzZXQgKyBzZWxmLT5tTGVuZ3RoICsgb2ZmLCBTRUVLX1NFVCk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQgVm9yYmlzUGxheWVyOjp2cF9mY2xvc2Uodm9pZCAqbWUpIHsKLSAgICBMT0dWKCJ2cF9mY2xvc2UiKTsKLSAgICBWb3JiaXNQbGF5ZXIgKnNlbGYgPSAoVm9yYmlzUGxheWVyKikgbWU7Ci0gICAgaW50IHJldCA9IGZjbG9zZSAoc2VsZi0+bUZpbGUpOwotICAgIHNlbGYtPm1GaWxlID0gTlVMTDsKLSAgICByZXR1cm4gcmV0OwotfQotCi1sb25nIFZvcmJpc1BsYXllcjo6dnBfZnRlbGwodm9pZCAqbWUpIHsKLSAgICBWb3JiaXNQbGF5ZXIgKnNlbGYgPSAoVm9yYmlzUGxheWVyKikgbWU7Ci0gICAgcmV0dXJuIGZ0ZWxsKHNlbGYtPm1GaWxlKSAtIHNlbGYtPm1PZmZzZXQ7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c2V0ZGF0YXNvdXJjZShjb25zdCBjaGFyICpwYXRoLCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLXsKLSAgICBMT0dWKCJzZXREYXRhU291cmNlIHVybD0lcywgZmQ9JWRcbiIsIHBhdGgsIGZkKTsKLQotICAgIC8vIGZpbGUgc3RpbGwgb3Blbj8KLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXNldF9ub3N5bmMoKTsKLSAgICB9Ci0KLSAgICAvLyBvcGVuIGZpbGUgYW5kIHNldCBwYXVzZWQgc3RhdGUKLSAgICBpZiAocGF0aCkgewotICAgICAgICBtRmlsZSA9IGZvcGVuKHBhdGgsICJyIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZpbGUgPSBmZG9wZW4oZHVwKGZkKSwgInIiKTsKLSAgICB9Ci0gICAgaWYgKG1GaWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09QRU5fRkFJTEVEOwotICAgIH0KLQotICAgIHN0cnVjdCBzdGF0IHNiOwotICAgIGludCByZXQ7Ci0gICAgaWYgKHBhdGgpIHsKLSAgICAgICAgcmV0ID0gc3RhdChwYXRoLCAmc2IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IGZzdGF0KGZkLCAmc2IpOwotICAgIH0KLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PUEVOX0ZBSUxFRDsKLSAgICB9Ci0gICAgaWYgKHNiLnN0X3NpemUgPiAobGVuZ3RoICsgb2Zmc2V0KSkgewotICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1MZW5ndGggPSBzYi5zdF9zaXplIC0gb2Zmc2V0OwotICAgIH0KLQotICAgIG92X2NhbGxiYWNrcyBjYWxsYmFja3MgPSB7Ci0gICAgICAgIChzaXplX3QgKCopKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIHZvaWQgKikpICB2cF9mcmVhZCwKLSAgICAgICAgKGludCAoKikodm9pZCAqLCBvZ2dfaW50NjRfdCwgaW50KSkgICAgICAgICAgIHZwX2ZzZWVrLAotICAgICAgICAoaW50ICgqKSh2b2lkICopKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBfZmNsb3NlLAotICAgICAgICAobG9uZyAoKikodm9pZCAqKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBfZnRlbGwKLSAgICB9OwotCi0gICAgbU9mZnNldCA9IG9mZnNldDsKLSAgICBmc2VlayhtRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0KLSAgICBpbnQgcmVzdWx0ID0gb3Zfb3Blbl9jYWxsYmFja3ModGhpcywgJm1Wb3JiaXNGaWxlLCBOVUxMLCAwLCBjYWxsYmFja3MpOwotICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgIExPR0UoIm92X29wZW4oKSBmYWlsZWQ6IFslZF1cbiIsIChpbnQpcmVzdWx0KTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PUEVOX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvLyBsb29rIGZvciB0aGUgYW5kcm9pZCBsb29wIHRhZyAgKGZvciByaW5ndG9uZXMpCi0gICAgY2hhciAqKnB0ciA9IG92X2NvbW1lbnQoJm1Wb3JiaXNGaWxlLC0xKS0+dXNlcl9jb21tZW50czsKLSAgICB3aGlsZSgqcHRyKSB7Ci0gICAgICAgIC8vIGRvZXMgdGhlIGNvbW1lbnQgc3RhcnQgd2l0aCBBTkRST0lEX0xPT1BfVEFHCi0gICAgICAgIGlmKHN0cm5jbXAoKnB0ciwgQU5EUk9JRF9MT09QX1RBRywgc3RybGVuKEFORFJPSURfTE9PUF9UQUcpKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyByZWFkIHRoZSB2YWx1ZSBvZiB0aGUgdGFnCi0gICAgICAgICAgICBjaGFyICp2YWwgPSAqcHRyICsgc3RybGVuKEFORFJPSURfTE9PUF9UQUcpICsgMTsKLSAgICAgICAgICAgIG1BbmRyb2lkTG9vcCA9IChzdHJuY21wKHZhbCwgInRydWUiLCA0KSA9PSAwKTsKLSAgICAgICAgfQotICAgICAgICAvLyB3ZSBrZWVwIHBhcnNpbmcgZXZlbiBhZnRlciBmaW5kaW5nIG9uZSBvY2N1cmVuY2Ugb2YgQU5EUk9JRF9MT09QX1RBRywKLSAgICAgICAgLy8gYXMgd2UgY291bGQgZmluZCBhbm90aGVyIG9uZSAgKHRoZSB0YWcgbWlnaHQgaGF2ZSBiZWVuIGFwcGVuZGVkIG1vcmUgdGhhbiBvbmNlKS4KLSAgICAgICAgKytwdHI7Ci0gICAgfQotICAgIExPR1ZfSUYobUFuZHJvaWRMb29wLCAibG9vcGVkIHNvdW5kIik7Ci0KLSAgICBtU3RhdGUgPSBTVEFURV9PUEVOOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpwcmVwYXJlKCkKLXsKLSAgICBMT0dWKCJwcmVwYXJlXG4iKTsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4gKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfT1BFTjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICBMT0dWKCJwcmVwYXJlQXN5bmNcbiIpOwotICAgIC8vIGNhbid0IGhvbGQgdGhlIGxvY2sgaGVyZSBiZWNhdXNlIG9mIHRoZSBjYWxsYmFjawotICAgIC8vIGl0J3Mgc2FmZSBiZWNhdXNlIHdlIGRvbid0IGNoYW5nZSBzdGF0ZQotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTiApIHsKLSAgICAgICAgc2VuZEV2ZW50KE1FRElBX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBzZW5kRXZlbnQoTUVESUFfUFJFUEFSRUQpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpzdGFydCgpCi17Ci0gICAgTE9HVigic3RhcnRcbiIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9PUEVOKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfT1BFTjsKLSAgICB9Ci0KLSAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgbVJlbmRlciA9IHRydWU7Ci0KLSAgICAvLyB3YWtlIHVwIHJlbmRlciB0aHJlYWQKLSAgICBMT0dWKCIgIHdha2V1cCByZW5kZXIgdGhyZWFkXG4iKTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpzdG9wKCkKLXsKLSAgICBMT0dWKCJzdG9wXG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIG1SZW5kZXIgPSBmYWxzZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c2Vla1RvKGludCBwb3NpdGlvbikKLXsKLSAgICBMT0dWKCJzZWVrVG8gJWRcbiIsIHBvc2l0aW9uKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotCi0gICAgaW50IHJlc3VsdCA9IG92X3RpbWVfc2VlaygmbVZvcmJpc0ZpbGUsIHBvc2l0aW9uKTsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgTE9HRSgib3ZfdGltZV9zZWVrKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHNlbmRFdmVudChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6cGF1c2UoKQotewotICAgIExPR1YoInBhdXNlXG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYm9vbCBWb3JiaXNQbGF5ZXI6OmlzUGxheWluZygpCi17Ci0gICAgTE9HVigiaXNQbGF5aW5nXG4iKTsKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmV0dXJuIG1SZW5kZXI7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50KiBwb3NpdGlvbikKLXsKLSAgICBMT0dWKCJnZXRDdXJyZW50UG9zaXRpb25cbiIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9PUEVOKSB7Ci0gICAgICAgIExPR0UoImdldEN1cnJlbnRQb3NpdGlvbigpOiBmaWxlIG5vdCBvcGVuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfT1BFTjsKLSAgICB9Ci0gICAgKnBvc2l0aW9uID0gb3ZfdGltZV90ZWxsKCZtVm9yYmlzRmlsZSk7Ci0gICAgaWYgKCpwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgTE9HRSgiZ2V0Q3VycmVudFBvc2l0aW9uKCk6IG92X3RpbWVfdGVsbCByZXR1cm5lZCAlZCIsICpwb3NpdGlvbik7Ci0gICAgICAgIHJldHVybiAqcG9zaXRpb247Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpnZXREdXJhdGlvbihpbnQqIGR1cmF0aW9uKQotewotICAgIExPR1YoImdldER1cmF0aW9uXG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotCi0gICAgaW50IHJldCA9IG92X3RpbWVfdG90YWwoJm1Wb3JiaXNGaWxlLCAtMSk7Ci0gICAgaWYgKHJldCA9PSBPVl9FSU5WQUwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgICpkdXJhdGlvbiA9IHJldDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6cmVsZWFzZSgpCi17Ci0gICAgTE9HVigicmVsZWFzZVxuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICByZXNldF9ub3N5bmMoKTsKLQotICAgIC8vIFRPRE86IHRpbWVvdXQgd2hlbiB0aHJlYWQgd29uJ3QgZXhpdAotICAgIC8vIHdhaXQgZm9yIHJlbmRlciB0aHJlYWQgdG8gZXhpdAotICAgIGlmIChtUmVuZGVyVGlkID4gMCkgewotICAgICAgICBtRXhpdCA9IHRydWU7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6cmVzZXQoKQotewotICAgIExPR1YoInJlc2V0XG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIHJldHVybiByZXNldF9ub3N5bmMoKTsKLX0KLQotLy8gYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQKLXN0YXR1c190IFZvcmJpc1BsYXllcjo6cmVzZXRfbm9zeW5jKCkKLXsKLSAgICAvLyBjbG9zZSBmaWxlCi0gICAgaWYgKG1GaWxlICE9IE5VTEwpIHsKLSAgICAgICAgb3ZfY2xlYXIoJm1Wb3JiaXNGaWxlKTsgLy8gdGhpcyBhbHNvIGNsb3NlcyB0aGUgRklMRQotICAgICAgICBpZiAobUZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgTE9HVigiT09QUyEgVm9yYmlzIGRpZG4ndCBjbG9zZSB0aGUgZmlsZSIpOwotICAgICAgICAgICAgZmNsb3NlKG1GaWxlKTsKLSAgICAgICAgICAgIG1GaWxlID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtU3RhdGUgPSBTVEFURV9FUlJPUjsKLQotICAgIG1QbGF5VGltZSA9IC0xOwotICAgIG1EdXJhdGlvbiA9IC0xOwotICAgIG1Mb29wID0gZmFsc2U7Ci0gICAgbUFuZHJvaWRMb29wID0gZmFsc2U7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIG1SZW5kZXIgPSBmYWxzZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkKLXsKLSAgICBMT0dWKCJzZXRMb29waW5nXG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIG1Mb29wID0gKGxvb3AgIT0gMCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OmNyZWF0ZU91dHB1dFRyYWNrKCkgewotICAgIC8vIG9wZW4gYXVkaW8gdHJhY2sKLSAgICB2b3JiaXNfaW5mbyAqdmkgPSBvdl9pbmZvKCZtVm9yYmlzRmlsZSwgLTEpOwotCi0gICAgTE9HVigiQ3JlYXRlIEF1ZGlvVHJhY2sgb2JqZWN0OiByYXRlPSVsZCwgY2hhbm5lbHM9JWRcbiIsCi0gICAgICAgICAgICB2aS0+cmF0ZSwgdmktPmNoYW5uZWxzKTsKLSAgICBpZiAobUF1ZGlvU2luay0+b3Blbih2aS0+cmF0ZSwgdmktPmNoYW5uZWxzLCBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoIm1BdWRpb1Npbmsgb3BlbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09QRU5fRkFJTEVEOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWludCBWb3JiaXNQbGF5ZXI6OnJlbmRlclRocmVhZCh2b2lkKiBwKSB7Ci0gICAgcmV0dXJuICgoVm9yYmlzUGxheWVyKilwKS0+cmVuZGVyKCk7Ci19Ci0KLSNkZWZpbmUgQVVESU9CVUZGRVJfU0laRSA0MDk2Ci0KLWludCBWb3JiaXNQbGF5ZXI6OnJlbmRlcigpIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IHRlbXA7Ci0gICAgaW50IGN1cnJlbnRfc2VjdGlvbiA9IDA7Ci0gICAgYm9vbCBhdWRpb1N0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIExPR1YoInJlbmRlclxuIik7Ci0KLSAgICAvLyBhbGxvY2F0ZSByZW5kZXIgYnVmZmVyCi0gICAgbUF1ZGlvQnVmZmVyID0gbmV3IGNoYXJbQVVESU9CVUZGRVJfU0laRV07Ci0gICAgaWYgKCFtQXVkaW9CdWZmZXIpIHsKLSAgICAgICAgTE9HRSgibUF1ZGlvQnVmZmVyIGFsbG9jYXRlIGZhaWxlZFxuIik7Ci0gICAgICAgIGdvdG8gdGhyZWFkRXhpdDsKLSAgICB9Ci0KLSAgICAvLyBsZXQgbWFpbiB0aHJlYWQga25vdyB3ZSdyZSByZWFkeQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVJlbmRlclRpZCA9IG15VGlkKCk7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbG9uZyBudW1yZWFkID0gMDsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLQotICAgICAgICAgICAgLy8gcGF1c2luZz8KLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPnJlYWR5KCkpIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgbVJlbmRlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGF1ZGlvU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIHJlbmRlciwgd2FpdCBmb3IgY2xpZW50IHRocmVhZCB0byB3YWtlIHVzIHVwCi0gICAgICAgICAgICBpZiAoIW1FeGl0ICYmICFtUmVuZGVyKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigicmVuZGVyIC0gc2lnbmFsIHdhaXRcbiIpOwotICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgICAgIExPR1YoInJlbmRlciAtIHNpZ25hbCByeCdkXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRXhpdCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFdlIGNvdWxkIGVuZCB1cCBoZXJlIGlmIHN0YXJ0KCkgaXMgY2FsbGVkLCBhbmQgYmVmb3JlIHdlIGdldCBhCi0gICAgICAgICAgICAvLyBjaGFuY2UgdG8gcnVuLCB0aGUgYXBwIGNhbGxzIHN0b3AoKSBvciByZXNldCgpLiBSZS1jaGVjayByZW5kZXIKLSAgICAgICAgICAgIC8vIGZsYWcgc28gd2UgZG9uJ3QgdHJ5IHRvIHJlbmRlciBpbiBzdG9wIG9yIHJlc2V0IHN0YXRlLgotICAgICAgICAgICAgaWYgKCFtUmVuZGVyKSBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gcmVuZGVyIHZvcmJpcyBkYXRhIGludG8gdGhlIGlucHV0IGJ1ZmZlcgotICAgICAgICAgICAgbnVtcmVhZCA9IG92X3JlYWQoJm1Wb3JiaXNGaWxlLCBtQXVkaW9CdWZmZXIsIEFVRElPQlVGRkVSX1NJWkUsICZjdXJyZW50X3NlY3Rpb24pOwotICAgICAgICAgICAgaWYgKG51bXJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBmaWxlLCBkbyB3ZSBuZWVkIHRvIGxvb3A/Ci0gICAgICAgICAgICAgICAgLy8gLi4uCi0gICAgICAgICAgICAgICAgaWYgKG1Mb29wIHx8IG1BbmRyb2lkTG9vcCkgewotICAgICAgICAgICAgICAgICAgICBvdl90aW1lX3NlZWsoJm1Wb3JiaXNGaWxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbnVtcmVhZCA9IG92X3JlYWQoJm1Wb3JiaXNGaWxlLCBtQXVkaW9CdWZmZXIsIEFVRElPQlVGRkVSX1NJWkUsICZjdXJyZW50X3NlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1SZW5kZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbmRwb3MgPSBvdl90aW1lX3RlbGwoJm1Wb3JiaXNGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZW5kIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCB3ZSdyZSBzdGFydGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIExPR1YoInBsYXliYWNrIGNvbXBsZXRlIC0gd2FpdCBmb3Igc2lnbmFsIik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgICAgICAgICBMT0dWKCJwbGF5YmFjayBjb21wbGV0ZSAtIHNpZ25hbCByeCdkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRXhpdCkgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgc3RpbGwgYXQgdGhlIGVuZCwgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9PUEVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VycG9zID0gb3ZfdGltZV90ZWxsKCZtVm9yYmlzRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycG9zID09IGVuZHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92X3RpbWVfc2VlaygmbVZvcmJpc0ZpbGUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bXJlYWQgPSBvdl9yZWFkKCZtVm9yYmlzRmlsZSwgbUF1ZGlvQnVmZmVyLCBBVURJT0JVRkZFUl9TSVpFLCAmY3VycmVudF9zZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvZGVjIHJldHVybnMgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yCi0gICAgICAgIGlmIChudW1yZWFkIDwgMCkgewotICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gVm9yYmlzIGRlY29kZXIiKTsKLSAgICAgICAgICAgIHNlbmRFdmVudChNRURJQV9FUlJPUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBvdXRwdXQgdHJhY2sgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmICghbUF1ZGlvU2luay0+cmVhZHkoKSkgewotICAgICAgICAgICAgTE9HVigicmVuZGVyIC0gY3JlYXRlIG91dHB1dCB0cmFja1xuIik7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlT3V0cHV0VHJhY2soKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIGRhdGEgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgIGlmICgodGVtcCA9IG1BdWRpb1NpbmstPndyaXRlKG1BdWRpb0J1ZmZlciwgbnVtcmVhZCkpIDwgMCkgewotICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gd3JpdGluZzolZCIsdGVtcCk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0ZW1wOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGFydCBhdWRpbyBvdXRwdXQgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmICghYXVkaW9TdGFydGVkICYmICFtUGF1c2VkICYmICFtRXhpdCkgewotICAgICAgICAgICAgTE9HVigicmVuZGVyIC0gc3RhcnRpbmcgYXVkaW9cbiIpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgICAgIGF1ZGlvU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXRocmVhZEV4aXQ6Ci0gICAgbUF1ZGlvU2luay5jbGVhcigpOwotICAgIGlmIChtQXVkaW9CdWZmZXIpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1BdWRpb0J1ZmZlcjsKLSAgICAgICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyB0ZWxsIG1haW4gdGhyZWFkIGdvb2RieWUKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIG1SZW5kZXJUaWQgPSAtMTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzUGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTA4MzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZPUkJJU1BMQVlFUl9ICi0jZGVmaW5lIEFORFJPSURfVk9SQklTUExBWUVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotCi0jaW5jbHVkZSAiaXZvcmJpc2NvZGVjLmgiCi0jaW5jbHVkZSAiaXZvcmJpc2ZpbGUuaCIKLQotI2RlZmluZSBBTkRST0lEX0xPT1BfVEFHICJBTkRST0lEX0xPT1AiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVm9yYmlzUGxheWVyIDogcHVibGljIE1lZGlhUGxheWVySW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFZvcmJpc1BsYXllcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgflZvcmJpc1BsYXllcigpOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50KiBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldER1cmF0aW9uKGludCogbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCkgeyByZXR1cm4gVk9SQklTX1BMQVlFUjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkge3JldHVybiBJTlZBTElEX09QRVJBVElPTjt9Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRkYXRhc291cmNlKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIHJlc2V0X25vc3luYygpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgY3JlYXRlT3V0cHV0VHJhY2soKTsKLSAgICBzdGF0aWMgIGludCAgICAgICAgIHJlbmRlclRocmVhZCh2b2lkKik7Ci0gICAgICAgICAgICBpbnQgICAgICAgICByZW5kZXIoKTsKLQotICAgIHN0YXRpYyAgc2l6ZV90ICAgICAgdnBfZnJlYWQodm9pZCAqLCBzaXplX3QsIHNpemVfdCwgdm9pZCAqKTsKLSAgICBzdGF0aWMgIGludCAgICAgICAgIHZwX2ZzZWVrKHZvaWQgKiwgb2dnX2ludDY0X3QsIGludCk7Ci0gICAgc3RhdGljICBpbnQgICAgICAgICB2cF9mY2xvc2Uodm9pZCAqKTsKLSAgICBzdGF0aWMgIGxvbmcgICAgICAgIHZwX2Z0ZWxsKHZvaWQgKik7Ci0KLSAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKLSAgICBDb25kaXRpb24gICAgICAgICAgIG1Db25kaXRpb247Ci0gICAgRklMRSogICAgICAgICAgICAgICBtRmlsZTsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgIG1PZmZzZXQ7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBtTGVuZ3RoOwotICAgIE9nZ1ZvcmJpc19GaWxlICAgICAgbVZvcmJpc0ZpbGU7Ci0gICAgY2hhciogICAgICAgICAgICAgICBtQXVkaW9CdWZmZXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtUGxheVRpbWU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtRHVyYXRpb247Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICBtU3RhdGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICBib29sICAgICAgICAgICAgICAgIG1Mb29wOwotICAgIGJvb2wgICAgICAgICAgICAgICAgbUFuZHJvaWRMb29wOwotICAgIHZvbGF0aWxlIGJvb2wgICAgICAgbUV4aXQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VkOwotICAgIHZvbGF0aWxlIGJvb2wgICAgICAgbVJlbmRlcjsKLSAgICBwaWRfdCAgICAgICAgICAgICAgIG1SZW5kZXJUaWQ7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9WT1JCSVNQTEFZRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggMGZlYTcyZS4uMWIwNTUyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpIHsKICAgICBTdHJpbmc4IG1pbWVUeXBlOwogICAgIGZsb2F0IGNvbmZpZGVuY2U7Ci0gICAgaWYgKCFTbmlmZkFNUihtRGF0YVNvdXJjZSwgJm1pbWVUeXBlLCAmY29uZmlkZW5jZSkpIHsKKyAgICBpZiAoIVNuaWZmQU1SKG1EYXRhU291cmNlLCAmbWltZVR5cGUsICZjb25maWRlbmNlLCBOVUxMKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMTIsNyArMjEyLDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gMjAwMDBsbDsgIC8vIDIwbXMgcGVyIGZyYW1lLgogICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIDIwMDAwbGw7CiAgICAgICAgIG1PZmZzZXQgPSBzZWVrRnJhbWUgKiBtRnJhbWVTaXplICsgKG1Jc1dpZGUgPyA5IDogNik7CkBAIC0yNjIsNiArMjYzLDcgQEAKIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZSk7CiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKQEAgLTI3NCw3ICsyNzYsOCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBTbmlmZkFNUigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKICAgICBjaGFyIGhlYWRlcls5XTsKIAogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKaW5kZXggYmY0NDI0Yi4uYzBiMWFiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCkBAIC0xNSwyNiArMTUsMzIgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQU1SV3JpdGVyOjpBTVJXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgIndiIikpLAogICAgICAgbUluaXRDaGVjayhtRmlsZSAhPSBOVUxMID8gT0sgOiBOT19JTklUKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZXN1bWVkKGZhbHNlKSB7CiB9CiAKIEFNUldyaXRlcjo6QU1SV3JpdGVyKGludCBmZCkKICAgICA6IG1GaWxlKGZkb3BlbihmZCwgIndiIikpLAogICAgICAgbUluaXRDaGVjayhtRmlsZSAhPSBOVUxMID8gT0sgOiBOT19JTklUKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZXN1bWVkKGZhbHNlKSB7CiB9CiAKIEFNUldyaXRlcjo6fkFNUldyaXRlcigpIHsKQEAgLTUzLDggKzU5LDYgQEAKIH0KIAogc3RhdHVzX3QgQU1SV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtOTQsMTcgKzk4LDI0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBTVJXcml0ZXI6OnN0YXJ0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KK3N0YXR1c190IEFNUldyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KIAotICAgIGlmIChtU3RhcnRlZCB8fCBtU291cmNlID09IE5VTEwpIHsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChtU3RhcnRlZCAmJiBtUGF1c2VkKSB7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgbVJlc3VtZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtU3RhcnRlZCkgeworICAgICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQsIGRvZXMgbm90aGluZworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTEyNiw0NyArMTM3LDEwOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBTVJXcml0ZXI6OnN0b3AoKSB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1Eb25lID0gdHJ1ZTsKK3N0YXR1c190IEFNUldyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SV3JpdGVyOjpzdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1Eb25lID0gdHJ1ZTsKIAogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCi0gICAgbVNvdXJjZS0+c3RvcCgpOworICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKKyAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQU1SV3JpdGVyOjpleGNlZWRzRmlsZVNpemVMaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPj0gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBBTVJXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+PSBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKIH0KIAogLy8gc3RhdGljCiB2b2lkICpBTVJXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKLSAgICBzdGF0aWNfY2FzdDxBTVJXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKHZvaWQgKikgc3RhdGljX2Nhc3Q8QU1SV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwogfQogCi12b2lkIEFNUldyaXRlcjo6dGhyZWFkRnVuYygpIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBBTVJXcml0ZXI6OnRocmVhZEZ1bmMoKSB7CisgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSAwOworICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPSAwOworICAgIGJvb2wgc3RvcHBlZFByZW1hdHVyZWx5ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisgICAgaW50NjRfdCBtYXhUaW1lc3RhbXBVcyA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICAgICAgaWYgKG1Eb25lKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBTVJXcml0ZXIiLCAwLCAwLCAwKTsKKyAgICB3aGlsZSAoIW1Eb25lKSB7CiAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIGlmIChleGNlZWRzRmlsZVNpemVMaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1Fc3RpbWF0ZWREdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVzdW1lZCkgeworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9ICh0aW1lc3RhbXBVcyAtIG1heFRpbWVzdGFtcFVzIC0gMjAwMDApOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgIExPR1YoInRpbWUgc3RhbXA6ICVsbGQsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJWxsZCIsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBzc2l6ZV90IG4gPSBmd3JpdGUoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgMSwKQEAgLTE4MCwxNiArMjUzLDMwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIC8vIFhYWDogSG93IHRvIHRlbGwgaXQgaXMgc3RvcHBlZCBwcmVtYXR1cmVseT8KKyAgICAgICAgaWYgKHN0b3BwZWRQcmVtYXR1cmVseSkgeworICAgICAgICAgICAgc3RvcHBlZFByZW1hdHVyZWx5ID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fQ09NUExFVElPTl9TVEFUVVMsIFVOS05PV05fRVJST1IpOworICAgIH0KKworICAgIGZmbHVzaChtRmlsZSk7CisgICAgZmNsb3NlKG1GaWxlKTsKKyAgICBtRmlsZSA9IE5VTEw7CiAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIGJvb2wgQU1SV3JpdGVyOjpyZWFjaGVkRU9TKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1SZWFjaGVkRU9TOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCBjZjVjM2NhLi5kNjc0NTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEsNTcgKzEsNTUgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgXAotICAgICAgICBNZWRpYUJ1ZmZlci5jcHAgICAgICAgICAgIFwKLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cC5jcHAgICAgICBcCi0gICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgXAotICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgIFwKLSAgICAgICAgTWV0YURhdGEuY3BwICAgICAgICAgICAgICBcCi0gICAgICAgIE9NWENvZGVjLmNwcCAgICAgICAgICAgICAgXAotICAgICAgICBVdGlscy5jcHAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgT01YQ2xpZW50LmNwcAoraW5jbHVkZSBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKIAotaWZlcSAoJChCVUlMRF9XSVRIX0ZVTExfU1RBR0VGUklHSFQpLHRydWUpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFNUkV4dHJhY3Rvci5jcHAgICAgICAgICAgXAotICAgICAgICBBTVJXcml0ZXIuY3BwICAgICAgICAgICAgIFwKLSAgICAgICAgQXVkaW9QbGF5ZXIuY3BwICAgICAgICAgICBcCi0gICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgXAotICAgICAgICBBd2Vzb21lUGxheWVyLmNwcCAgICAgICAgIFwKLSAgICAgICAgQ2FjaGluZ0RhdGFTb3VyY2UuY3BwICAgICBcCi0gICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgXAotICAgICAgICBEYXRhU291cmNlLmNwcCAgICAgICAgICAgIFwKLSAgICAgICAgRFJNRXh0cmFjdG9yLmNwcCAgICAgICAgICBcCi0gICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgXAotICAgICAgICBIVFRQRGF0YVNvdXJjZS5jcHAgICAgICAgIFwKLSAgICAgICAgSFRUUFN0cmVhbS5jcHAgICAgICAgICAgICBcCi0gICAgICAgIEpQRUdTb3VyY2UuY3BwICAgICAgICAgICAgXAotICAgICAgICBNUDNFeHRyYWN0b3IuY3BwICAgICAgICAgIFwKLSAgICAgICAgTVBFRzRFeHRyYWN0b3IuY3BwICAgICAgICBcCi0gICAgICAgIE1QRUc0V3JpdGVyLmNwcCAgICAgICAgICAgXAotICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgIFwKLSAgICAgICAgT2dnRXh0cmFjdG9yLmNwcCAgICAgICAgICBcCi0gICAgICAgIFByZWZldGNoZXIuY3BwICAgICAgICAgICAgXAotICAgICAgICBTYW1wbGVJdGVyYXRvci5jcHAgICAgICAgIFwKLSAgICAgICAgU2FtcGxlVGFibGUuY3BwICAgICAgICAgICBcCi0gICAgICAgIFNob3V0Y2FzdFNvdXJjZS5jcHAgICAgICAgXAotICAgICAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgXAotICAgICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBcCi0gICAgICAgIFRpbWVTb3VyY2UuY3BwICAgICAgICAgICAgXAotICAgICAgICBUaW1lZEV2ZW50UXVldWUuY3BwICAgICAgIFwKLSAgICAgICAgV0FWRXh0cmFjdG9yLmNwcCAgICAgICAgICBcCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFNUkV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFNUldyaXRlci5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEF1ZGlvUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERSTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEhUVFBTdHJlYW0uY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEpQRUdTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1QM0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1QRUcyVFNXcml0ZXIuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1QRUc0RXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1QRUc0V3JpdGVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE51Q2FjaGVkU291cmNlMi5jcHAgICAgICAgICAgICAgICBcCisgICAgICAgIE51SFRUUERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIE9NWENsaWVudC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9NWENvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9nZ0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNhbXBsZUl0ZXJhdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIFNhbXBsZVRhYmxlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNob3V0Y2FzdFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCisgICAgICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCAgICAgICBcCisgICAgICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwICBcCisgICAgICAgIFRocmVhZGVkU291cmNlLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIFRocm90dGxlZFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCisgICAgICAgIFRpbWVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRpbWVkRXZlbnRRdWV1ZS5jcHAgICAgICAgICAgICAgICBcCisgICAgICAgIFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdBVkV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2Y191dGlscy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0cmluZy5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCi1lbmRpZgotCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvYW5kcm9pZCBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYmJpbmRlciAgICAgICAgIFwKQEAgLTY3LDI0ICs2NSwzMSBAQAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZvcmJpc2RlYworICAgICAgICBsaWJzdGFnZWZyaWdodF92b3JiaXNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZweGRlYyBcCisgICAgICAgIGxpYnZweCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21wZWcydHMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3J0c3AgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9pZDMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9nNzExZGVjIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24KLQotaWZlcSAoJChCVUlMRF9XSVRIX0ZVTExfU1RBR0VGUklHSFQpLHRydWUpCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9pZDMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNfY29tbW9uIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKQEAgLTk3LDggKzEwMiw2IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCiBlbmRpZgogCi1lbmRpZgotCiBpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQogICAgICAgICBMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCiBlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGJjZjI0NjMuLjVmZjkzNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTIzLDEyICsyMywxNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCisjaW5jbHVkZSAiaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQXVkaW9QbGF5ZXI6OkF1ZGlvUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKQorQXVkaW9QbGF5ZXI6OkF1ZGlvUGxheWVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKKyAgICAgICAgQXdlc29tZVBsYXllciAqb2JzZXJ2ZXIpCiAgICAgOiBtQXVkaW9UcmFjayhOVUxMKSwKICAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKICAgICAgIG1TYW1wbGVSYXRlKDApLApAQCAtNDEsMTIgKzQ2LDE2IEBACiAgICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCiAgICAgICBtRmluYWxTdGF0dXMoT0spLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUF1ZGlvU2luayhhdWRpb1NpbmspIHsKKyAgICAgIG1Jc0ZpcnN0QnVmZmVyKGZhbHNlKSwKKyAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdChPSyksCisgICAgICBtRmlyc3RCdWZmZXIoTlVMTCksCisgICAgICBtQXVkaW9TaW5rKGF1ZGlvU2luayksCisgICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpIHsKIH0KIAogQXVkaW9QbGF5ZXI6On5BdWRpb1BsYXllcigpIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOworICAgICAgICByZXNldCgpOwogICAgIH0KIH0KIApAQCAtNjgsNiArNzcsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIGFsbG93IGFuIG9wdGlvbmFsIElORk9fRk9STUFUX0NIQU5HRUQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgLy8gb2YgcGxheWJhY2ssIGlmIHRoZXJlIGlzIG9uZSwgZ2V0Rm9ybWF0IGJlbG93IHdpbGwgcmV0cmlldmUgdGhlCisgICAgLy8gdXBkYXRlZCBmb3JtYXQsIGlmIHRoZXJlIGlzbid0LCB3ZSdsbCBzdGFzaCBhd2F5IHRoZSB2YWxpZCBidWZmZXIKKyAgICAvLyBvZiBkYXRhIHRvIGJlIHVzZWQgb24gdGhlIGZpcnN0IGF1ZGlvIGNhbGxiYWNrLgorCisgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOworCisgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmbUZpcnN0QnVmZmVyKTsKKyAgICBpZiAobUZpcnN0QnVmZmVyUmVzdWx0ID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgTE9HVigiSU5GT19GT1JNQVRfQ0hBTkdFRCEhISIpOworCisgICAgICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gT0s7CisgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSB0cnVlOworICAgIH0KKwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGJvb2wgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CkBAIC04Nyw3ICsxMTQsMTQgQEAKICAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKICAgICAgICAgICAgICAgICAmQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLCB0aGlzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtMTA4LDcgKzE0MiwxNCBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb1RyYWNrOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBOVUxMOwogCi0gICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC0xMjQsMTMgKzE2NSwyMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6cGF1c2UoKSB7Cit2b2lkIEF1ZGlvUGxheWVyOjpwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcykgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICBpZiAocGxheVBlbmRpbmdTYW1wbGVzKSB7CisgICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOworICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE0NCw3ICsxOTMsNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6c3RvcCgpIHsKK3ZvaWQgQXVkaW9QbGF5ZXI6OnJlc2V0KCkgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAogICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKQEAgLTE1OSw2ICsyMDgsMTIgQEAKIAogICAgIC8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIGFueSBidWZmZXIgd2UgaG9sZCBvbnRvIHNvIHRoYXQgdGhlCiAgICAgLy8gc291cmNlIGlzIGFibGUgdG8gc3RvcCgpLgorCisgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgIH0KKwogICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICBMT0dWKCJBdWRpb1BsYXllciByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwogCkBAIC0yNDMsNiArMjk4LDE0IEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgICAgICAgICBpZiAobVNlZWtpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7CiAKICAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKQEAgLTI1MSwxMSArMzE0LDI0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZvcHRpb25zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKworICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbUZpcnN0QnVmZmVyOworICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgZXJyID0gbUZpcnN0QnVmZmVyUmVzdWx0OworCisgICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKChlcnIgPT0gT0sgJiYgbUlucHV0QnVmZmVyICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgfHwgKGVyciAhPSBPSyAmJiBtSW5wdXRCdWZmZXIgPT0gTlVMTCkpOwpAQCAtMjYzLDYgKzMzOSwxMCBAQAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgJiYgIW1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvRU9TKCk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1GaW5hbFN0YXR1cyA9IGVycjsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM1MSw2ICs0MzEsMTIgQEAKICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwogICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKIAorICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBlZGFiYWY5Li4yOWYxNmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1NvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgpAQCAtMjEsMTYgKzI1LDMzIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCiAgICAgICAgIGludCBpbnB1dFNvdXJjZSwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbHMpCi0gICAgOiBtUmVjb3JkKG5ldyBBdWRpb1JlY29yZCgKLSAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsIGNoYW5uZWxzKSksCi0gICAgICBtSW5pdENoZWNrKG1SZWNvcmQtPmluaXRDaGVjaygpKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICA6IG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpLAorICAgICAgbVByZXZTYW1wbGVUaW1lVXMoMCksCisgICAgICBtVG90YWxMb3N0RnJhbWVzKDApLAorICAgICAgbVByZXZMb3N0Qnl0ZXMoMCksCiAgICAgICBtR3JvdXAoTlVMTCkgeworCisgICAgTE9HVigic2FtcGxlUmF0ZTogJWQsIGNoYW5uZWxzOiAlZCIsIHNhbXBsZVJhdGUsIGNoYW5uZWxzKTsKKyAgICBDSEVDSyhjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDIpOworICAgIHVpbnQzMl90IGZsYWdzID0gQXVkaW9SZWNvcmQ6OlJFQ09SRF9BR0NfRU5BQkxFIHwKKyAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkOjpSRUNPUkRfTlNfRU5BQkxFICB8CisgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZDo6UkVDT1JEX0lJUl9FTkFCTEU7CisKKyAgICBtUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAorICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICBjaGFubmVscyA+IDE/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX1NURVJFTzogQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICA0ICoga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCksIC8qIEVuYWJsZSBwaW5nLXBvbmcgYnVmZmVycyAqLworICAgICAgICAgICAgICAgIGZsYWdzKTsKKworICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKIH0KIAogQXVkaW9Tb3VyY2U6On5BdWRpb1NvdXJjZSgpIHsKQEAgLTUxLDYgKzcyLDI0IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5yZWNvcmQtc3RhdHMiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7CisgICAgICAgIG1Db2xsZWN0U3RhdHMgPSB0cnVlOworICAgIH0KKworICAgIG1UcmFja01heEFtcGxpdHVkZSA9IGZhbHNlOworICAgIG1NYXhBbXBsaXR1ZGUgPSAwOworICAgIG1Jbml0aWFsUmVhZFRpbWVVcyA9IDA7CisgICAgbVN0YXJ0VGltZVVzID0gMDsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CisgICAgfQogICAgIHN0YXR1c190IGVyciA9IG1SZWNvcmQtPnN0YXJ0KCk7CiAKICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC02OCw2ICsxMDcsMTAgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCiAgICAgbVJlY29yZC0+c3RvcCgpOwogCiAgICAgZGVsZXRlIG1Hcm91cDsKQEAgLTc1LDEwICsxMTgsMTkgQEAKIAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKKyAgICBpZiAobUNvbGxlY3RTdGF0cykgeworICAgICAgICBMT0dJKCJUb3RhbCBsb3N0IGF1ZGlvIGZyYW1lczogJWxsZCIsCisgICAgICAgICAgICBtVG90YWxMb3N0RnJhbWVzICsgKG1QcmV2TG9zdEJ5dGVzID4+IDEpKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKIHNwPE1ldGFEYXRhPiBBdWRpb1NvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwogICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtUmVjb3JkLT5nZXRTYW1wbGVSYXRlKCkpOwpAQCAtODgsMzUgKzE0MCwyMjUgQEAKICAgICByZXR1cm4gbWV0YTsKIH0KIAorLyoKKyAqIFJldHVybnMgLTEgaWYgZnJhbWUgc2tpcHBpbmcgcmVxdWVzdCBpcyB0b28gbG9uZy4KKyAqIFJldHVybnMgIDAgaWYgdGhlcmUgaXMgbm8gbmVlZCB0byBza2lwIGZyYW1lcy4KKyAqIFJldHVybnMgIDEgaWYgd2UgbmVlZCB0byBza2lwIGZyYW1lcy4KKyAqLworc3RhdGljIGludCBza2lwRnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICBpbnQ2NF90IHNraXBGcmFtZVVzOworICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy0+Z2V0U2tpcEZyYW1lKCZza2lwRnJhbWVVcykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNraXBGcmFtZVVzIDw9IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFNhZmUgZ3VhcmQgYWdhaW5zdCB0aGUgYWJ1c2Ugb2YgdGhlIGtTa2lwRnJhbWVfT3B0aW9uLgorICAgIGlmIChza2lwRnJhbWVVcyAtIHRpbWVzdGFtcFVzID49IDFFNikgeworICAgICAgICBMT0dFKCJGcmFtZSBza2lwcGluZyByZXF1ZXN0ZWQgaXMgd2F5IHRvbyBsb25nOiAlbGxkIHVzIiwKKyAgICAgICAgICAgIHNraXBGcmFtZVVzIC0gdGltZXN0YW1wVXMpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBMT0dWKCJza2lwRnJhbWU6ICVsbGQgdXMgPiB0aW1lc3RhbXA6ICVsbGQgdXMiLAorICAgICAgICBza2lwRnJhbWVVcywgdGltZXN0YW1wVXMpOworCisgICAgcmV0dXJuIDE7CisKK30KKwordm9pZCBBdWRpb1NvdXJjZTo6cmFtcFZvbHVtZSgKKyAgICAgICAgaW50MzJfdCBzdGFydEZyYW1lLCBpbnQzMl90IHJhbXBEdXJhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDhfdCAqZGF0YSwgICBzaXplX3QgYnl0ZXMpIHsKKworICAgIGNvbnN0IGludDMyX3Qga1NoaWZ0ID0gMTQ7CisgICAgaW50MzJfdCBmaXhlZE11bHRpcGxpZXIgPSAoc3RhcnRGcmFtZSA8PCBrU2hpZnQpIC8gcmFtcER1cmF0aW9uRnJhbWVzOworICAgIGNvbnN0IGludDMyX3QgbkNoYW5uZWxzID0gbVJlY29yZC0+Y2hhbm5lbENvdW50KCk7CisgICAgaW50MzJfdCBzdG9wRnJhbWUgPSBzdGFydEZyYW1lICsgYnl0ZXMgLyBzaXplb2YoaW50MTZfdCk7CisgICAgaW50MTZfdCAqZnJhbWUgPSAoaW50MTZfdCAqKSBkYXRhOworICAgIGlmIChzdG9wRnJhbWUgPiByYW1wRHVyYXRpb25GcmFtZXMpIHsKKyAgICAgICAgc3RvcEZyYW1lID0gcmFtcER1cmF0aW9uRnJhbWVzOworICAgIH0KKworICAgIHdoaWxlIChzdGFydEZyYW1lIDwgc3RvcEZyYW1lKSB7CisgICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeyAgLy8gbW9ubworICAgICAgICAgICAgZnJhbWVbMF0gPSAoZnJhbWVbMF0gKiBmaXhlZE11bHRpcGxpZXIpID4+IGtTaGlmdDsKKyAgICAgICAgICAgICsrZnJhbWU7CisgICAgICAgICAgICArK3N0YXJ0RnJhbWU7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgLy8gc3RlcmVvCisgICAgICAgICAgICBmcmFtZVswXSA9IChmcmFtZVswXSAqIGZpeGVkTXVsdGlwbGllcikgPj4ga1NoaWZ0OworICAgICAgICAgICAgZnJhbWVbMV0gPSAoZnJhbWVbMV0gKiBmaXhlZE11bHRpcGxpZXIpID4+IGtTaGlmdDsKKyAgICAgICAgICAgIGZyYW1lICs9IDI7CisgICAgICAgICAgICBzdGFydEZyYW1lICs9IDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgdGhlIG11bHRpcGxpZXIgZXZlcnkgNCBmcmFtZXMKKyAgICAgICAgaWYgKChzdGFydEZyYW1lICYgMykgPT0gMCkgeworICAgICAgICAgICAgZml4ZWRNdWx0aXBsaWVyID0gKHN0YXJ0RnJhbWUgPDwga1NoaWZ0KSAvIHJhbXBEdXJhdGlvbkZyYW1lczsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW50NjRfdCByZWFkVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CiAgICAgQ0hFQ0tfRVEobUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgT0spOwogCi0gICAgdWludDMyX3QgbnVtRnJhbWVzUmVjb3JkZWQ7Ci0gICAgbVJlY29yZC0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1JlY29yZGVkKTsKKyAgICBpbnQgZXJyID0gMDsKKyAgICB3aGlsZSAobVN0YXJ0ZWQpIHsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAga0tleVRpbWUsCi0gICAgICAgICAgICAoMTAwMDAwMGxsICogbnVtRnJhbWVzUmVjb3JkZWQpIC8gbVJlY29yZC0+Z2V0U2FtcGxlUmF0ZSgpCi0gICAgICAgICAgICAtIG1SZWNvcmQtPmxhdGVuY3koKSAqIDEwMDApOworICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNSZWNvcmRlZDsKKyAgICAgICAgbVJlY29yZC0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1JlY29yZGVkKTsKIAotICAgIHNzaXplX3QgbiA9IG1SZWNvcmQtPnJlYWQoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIGlmIChuIDwgMCkgewotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKG51bUZyYW1lc1JlY29yZGVkID09IDAgJiYgbVByZXZTYW1wbGVUaW1lVXMgPT0gMCkgeworICAgICAgICAgICAgbUluaXRpYWxSZWFkVGltZVVzID0gcmVhZFRpbWVVczsKKyAgICAgICAgICAgIC8vIEluaXRpYWwgZGVsYXkKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPiAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gcmVhZFRpbWVVcyAtIG1TdGFydFRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGxhdGVuY3kgaXMgY29uc3RhbnQuCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzICs9IG1SZWNvcmQtPmxhdGVuY3koKSAqIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldlNhbXBsZVRpbWVVcyA9IG1TdGFydFRpbWVVczsKKyAgICAgICAgfQogCi0gICAgICAgIHJldHVybiAoc3RhdHVzX3QpbjsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1SZWNvcmQtPmdldFNhbXBsZVJhdGUoKTsKKworICAgICAgICAvLyBJbnNlcnQgbnVsbCBmcmFtZXMgd2hlbiBsb3N0IGZyYW1lcyBhcmUgZGV0ZWN0ZWQuCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSBtUHJldlNhbXBsZVRpbWVVczsKKyAgICAgICAgdWludDMyX3QgbnVtTG9zdEJ5dGVzID0gbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCkgPDwgMTsKKyAgICAgICAgbnVtTG9zdEJ5dGVzICs9IG1QcmV2TG9zdEJ5dGVzOworI2lmIDAKKyAgICAgICAgLy8gU2ltdWxhdGUgbG9zdCBmcmFtZXMKKyAgICAgICAgbnVtTG9zdEJ5dGVzID0gKChyYW5kKCkgKiAxLjAgLyBSQU5EX01BWCkpICogMiAqIGtNYXhCdWZmZXJTaXplOworICAgICAgICBudW1Mb3N0Qnl0ZXMgJj0gMHhGRkZGRkZGRTsgLy8gQWxpZ25tZW50IHJlcXVpcmVtZW50CisKKyAgICAgICAgLy8gUmVkdWNlIHRoZSBjaGFuY2UgdG8gbG9zZQorICAgICAgICBpZiAocmFuZCgpICogMS4wIC8gUkFORF9NQVggPj0gMC4wNSkgeworICAgICAgICAgICAgbnVtTG9zdEJ5dGVzID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CisgICAgICAgICAgICBpZiAobnVtTG9zdEJ5dGVzID4ga01heEJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtUHJldkxvc3RCeXRlcyA9IG51bUxvc3RCeXRlcyAtIGtNYXhCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIG51bUxvc3RCeXRlcyA9IGtNYXhCdWZmZXJTaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJldkxvc3RCeXRlcyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLX0VRKG51bUxvc3RCeXRlcyAmIDEsIDApOworICAgICAgICAgICAgdGltZXN0YW1wVXMgKz0gKCgxMDAwMDAwTEwgKiAobnVtTG9zdEJ5dGVzID4+IDEpKSArCisgICAgICAgICAgICAgICAgICAgIChzYW1wbGVSYXRlID4+IDEpKSAvIHNhbXBsZVJhdGU7CisKKyAgICAgICAgICAgIENIRUNLKHRpbWVzdGFtcFVzID4gbVByZXZTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxMb3N0RnJhbWVzICs9IChudW1Mb3N0Qnl0ZXMgPj4gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVyciA9IHNraXBGcmFtZSh0aW1lc3RhbXBVcywgb3B0aW9ucykpID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLT5kYXRhKCksIDAsIG51bUxvc3RCeXRlcyk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBudW1Mb3N0Qnl0ZXMpOworICAgICAgICAgICAgaWYgKG51bUZyYW1lc1JlY29yZGVkID09IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5QW5jaG9yVGltZSwgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtU3RhcnRUaW1lVXMgKyBtUHJldlNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCByZWFkVGltZVVzIC0gbUluaXRpYWxSZWFkVGltZVVzKTsKKyAgICAgICAgICAgIG1QcmV2U2FtcGxlVGltZVVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbVJlY29yZC0+cmVhZChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIChzdGF0dXNfdCluOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNvcmREdXJhdGlvblVzID0gKDEwMDAwMDBMTCAqIG4gPj4gMSkgLyBzYW1wbGVSYXRlOworICAgICAgICB0aW1lc3RhbXBVcyArPSByZWNvcmREdXJhdGlvblVzOworICAgICAgICBpZiAoKGVyciA9IHNraXBGcmFtZSh0aW1lc3RhbXBVcywgb3B0aW9ucykpID09IC0xKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUHJldlNhbXBsZVRpbWVVcyAtIG1TdGFydFRpbWVVcyA8IGtBdXRvUmFtcFN0YXJ0VXMpIHsKKyAgICAgICAgICAgIC8vIE11dGUgdGhlIGluaXRpYWwgdmlkZW8gcmVjb3JkaW5nIHNpZ25hbAorICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopIGJ1ZmZlci0+ZGF0YSgpLCAwLCBuKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUHJldlNhbXBsZVRpbWVVcyAtIG1TdGFydFRpbWVVcyA8IGtBdXRvUmFtcFN0YXJ0VXMgKyBrQXV0b1JhbXBEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBpbnQzMl90IGF1dG9SYW1wRHVyYXRpb25GcmFtZXMgPQorICAgICAgICAgICAgICAgICAgICAoa0F1dG9SYW1wRHVyYXRpb25VcyAqIHNhbXBsZVJhdGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisKKyAgICAgICAgICAgIGludDMyX3QgYXV0b1JhbXBTdGFydEZyYW1lcyA9CisgICAgICAgICAgICAgICAgICAgIChrQXV0b1JhbXBTdGFydFVzICogc2FtcGxlUmF0ZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKKworICAgICAgICAgICAgaW50MzJfdCBuRnJhbWVzID0gbnVtRnJhbWVzUmVjb3JkZWQgLSBhdXRvUmFtcFN0YXJ0RnJhbWVzOworICAgICAgICAgICAgcmFtcFZvbHVtZShuRnJhbWVzLCBhdXRvUmFtcER1cmF0aW9uRnJhbWVzLCAodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UcmFja01heEFtcGxpdHVkZSkgeworICAgICAgICAgICAgdHJhY2tNYXhBbXBsaXR1ZGUoKGludDE2X3QgKikgYnVmZmVyLT5kYXRhKCksIG4gPj4gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtRnJhbWVzUmVjb3JkZWQgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleUFuY2hvclRpbWUsIG1TdGFydFRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbVN0YXJ0VGltZVVzICsgbVByZXZTYW1wbGVUaW1lVXMpOworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCByZWFkVGltZVVzIC0gbUluaXRpYWxSZWFkVGltZVVzKTsKKyAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPiBtUHJldlNhbXBsZVRpbWVVcyk7CisgICAgICAgIG1QcmV2U2FtcGxlVGltZVVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIExPR1YoImluaXRpYWwgZGVsYXk6ICVsbGQsIHNhbXBsZSByYXRlOiAlZCwgdGltZXN0YW1wOiAlbGxkIiwKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMsIHNhbXBsZVJhdGUsIHRpbWVzdGFtcFVzKTsKKworICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKKworICAgICAgICAqb3V0ID0gYnVmZmVyOworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIEF1ZGlvU291cmNlOjp0cmFja01heEFtcGxpdHVkZShpbnQxNl90ICpkYXRhLCBpbnQgblNhbXBsZXMpIHsKKyAgICBmb3IgKGludCBpID0gblNhbXBsZXM7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgaW50MTZfdCB2YWx1ZSA9ICpkYXRhKys7CisgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gLXZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChtTWF4QW1wbGl0dWRlIDwgdmFsdWUpIHsKKyAgICAgICAgICAgIG1NYXhBbXBsaXR1ZGUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50MTZfdCBBdWRpb1NvdXJjZTo6Z2V0TWF4QW1wbGl0dWRlKCkgeworICAgIC8vIEZpcnN0IGNhbGwgYWN0aXZhdGVzIHRoZSB0cmFja2luZy4KKyAgICBpZiAoIW1UcmFja01heEFtcGxpdHVkZSkgeworICAgICAgICBtVHJhY2tNYXhBbXBsaXR1ZGUgPSB0cnVlOworICAgIH0KKyAgICBpbnQxNl90IHZhbHVlID0gbU1heEFtcGxpdHVkZTsKKyAgICBtTWF4QW1wbGl0dWRlID0gMDsKKyAgICBMT0dWKCJtYXggYW1wbGl0dWRlIHNpbmNlIGxhc3QgY2FsbDogJWQiLCB2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCA3ODFlM2ZjLi4wYmM0MDYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMjAsMTMgKzIwLDIxIEBACiAKICNpbmNsdWRlIDxkbGZjbi5oPgogCisjaW5jbHVkZSAiaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1ByZWZldGNoZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0xpdmVTb3VyY2UuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJBUlRQU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiVURQUHVzaGVyLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMzksOCArNDcsMTMgQEAKIAogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgaW50NjRfdCBrTG93V2F0ZXJNYXJrVXMgPSAyMDAwMDAwbGw7ICAvLyAyc2Vjcworc3RhdGljIGludDY0X3Qga0hpZ2hXYXRlck1hcmtVcyA9IDEwMDAwMDAwbGw7ICAvLyAxMHNlY3MKKwogc3RydWN0IEF3ZXNvbWVFdmVudCA6IHB1YmxpYyBUaW1lZEV2ZW50UXVldWU6OkV2ZW50IHsKICAgICBBd2Vzb21lRXZlbnQoCiAgICAgICAgICAgICBBd2Vzb21lUGxheWVyICpwbGF5ZXIsCkBAIC05MCwxMiArMTAzLDE0IEBACiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpCisgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKQogICAgICAgICA6IG1UYXJnZXQoTlVMTCksCiAgICAgICAgICAgbUxpYkhhbmRsZShOVUxMKSB7CiAgICAgICAgICAgICBpbml0KHByZXZpZXdPbmx5LCBjb21wb25lbnROYW1lLAogICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCwgc3VyZmFjZSwgZGlzcGxheVdpZHRoLAotICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyk7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHJlbmRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CkBAIC0xMjgsNyArMTQzLDggQEAKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAogICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCk7CisgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKTsKIAogICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKGNvbnN0IEF3ZXNvbWVMb2NhbFJlbmRlcmVyICYpOwogICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZUxvY2FsUmVuZGVyZXIgJik7OwpAQCAtMTQwLDcgKzE1Niw4IEBACiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAogICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkgeworICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCwKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXMpIHsKICAgICBpZiAoIXByZXZpZXdPbmx5KSB7CiAgICAgICAgIC8vIFdlIHdpbGwgc3RpY2sgdG8gdGhlIHZhbmlsbGEgc29mdHdhcmUtY29sb3ItY29udmVydGluZyByZW5kZXJlcgogICAgICAgICAvLyBmb3IgInByZXZpZXdPbmx5IiBtb2RlLCB0byBhdm9pZCB1bm5lY2Nlc3NhcmlseSBzd2l0Y2hpbmcgb3ZlcmxheXMKQEAgLTE0OSw2ICsxNjYsMTQgQEAKICAgICAgICAgbUxpYkhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHRody5zbyIsIFJUTERfTk9XKTsKIAogICAgICAgICBpZiAobUxpYkhhbmRsZSkgeworICAgICAgICAgICAgdHlwZWRlZiBWaWRlb1JlbmRlcmVyICooKkNyZWF0ZVJlbmRlcmVyV2l0aFJvdGF0aW9uRnVuYykoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXMpOworCiAgICAgICAgICAgICB0eXBlZGVmIFZpZGVvUmVuZGVyZXIgKigqQ3JlYXRlUmVuZGVyZXJGdW5jKSgKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLApAQCAtMTU2LDE3ICsxODEsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIAotICAgICAgICAgICAgQ3JlYXRlUmVuZGVyZXJGdW5jIGZ1bmMgPQotICAgICAgICAgICAgICAgIChDcmVhdGVSZW5kZXJlckZ1bmMpZGxzeW0oCisgICAgICAgICAgICBDcmVhdGVSZW5kZXJlcldpdGhSb3RhdGlvbkZ1bmMgZnVuY1dpdGhSb3RhdGlvbiA9CisgICAgICAgICAgICAgICAgKENyZWF0ZVJlbmRlcmVyV2l0aFJvdGF0aW9uRnVuYylkbHN5bSgKICAgICAgICAgICAgICAgICAgICAgICAgIG1MaWJIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiX1oxNGNyZWF0ZVJlbmRlcmVyUktON2FuZHJvaWQyc3BJTlNfOElTdXJmYWNlRUVFUEtjMjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiT01YX0NPTE9SX0ZPUk1BVFRZUEVqampqIik7CisgICAgICAgICAgICAgICAgICAgICAgICAiX1oyNmNyZWF0ZVJlbmRlcmVyV2l0aFJvdGF0aW9uUktON2FuZHJvaWQyc3BJTlNfOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJJU3VyZmFjZUVFRVBLYzIwT01YX0NPTE9SX0ZPUk1BVFRZUEVqampqaSIpOwogCi0gICAgICAgICAgICBpZiAoZnVuYykgeworICAgICAgICAgICAgaWYgKGZ1bmNXaXRoUm90YXRpb24pIHsKICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICgqZnVuY1dpdGhSb3RhdGlvbikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygicmVuZGVyZXIgZG9lcyBub3Qgc3VwcG9ydCByb3RhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDcmVhdGVSZW5kZXJlckZ1bmMgZnVuYyA9CisgICAgICAgICAgICAgICAgICAgIChDcmVhdGVSZW5kZXJlckZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpYkhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX1oxNGNyZWF0ZVJlbmRlcmVyUktON2FuZHJvaWQyc3BJTlNfOElTdXJmYWNlRUVFUEtjMjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9NWF9DT0xPUl9GT1JNQVRUWVBFampqaiIpOworCisgICAgICAgICAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKmZ1bmMpKHN1cmZhY2UsIGNvbXBvbmVudE5hbWUsIGNvbG9yRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE3NCw3ICsyMTgsNyBAQAogICAgIGlmIChtVGFyZ2V0ID09IE5VTEwpIHsKICAgICAgICAgbVRhcmdldCA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0LCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsIHJvdGF0aW9uRGVncmVlcyk7CiAgICAgfQogfQogCkBAIC0yOTcsNiArMzQxLDI4IEBACiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChjb25zdCBzcDxNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvcikgeworICAgIC8vIEF0dGVtcHQgdG8gYXBwcm94aW1hdGUgb3ZlcmFsbCBzdHJlYW0gYml0cmF0ZSBieSBzdW1taW5nIGFsbAorICAgIC8vIHRyYWNrcycgaW5kaXZpZHVhbCBiaXRyYXRlcywgaWYgbm90IGFsbCBvZiB0aGVtIGFkdmVydGlzZSBiaXRyYXRlLAorICAgIC8vIHdlIGhhdmUgdG8gZmFpbC4KKworICAgIGludDY0X3QgdG90YWxCaXRSYXRlID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICB0b3RhbEJpdFJhdGUgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxCaXRSYXRlICs9IGJpdHJhdGU7CisgICAgfQorCisgICAgbUJpdHJhdGUgPSB0b3RhbEJpdFJhdGU7CisKKyAgICBMT0dWKCJtQml0cmF0ZSA9ICVsbGQgYml0cy9zZWMiLCBtQml0cmF0ZSk7CisKICAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgewpAQCAtMzExLDYgKzM3NywxOSBAQAogICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBmb3Igdm9yYmlzIGF1ZGlvLCBub25lIG9mIHRoZSBvdGhlciBhdWRpbworICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgZXZlbiBzdXBwb3J0IHRoaXMgcmluZ3RvbmUgc3BlY2lmaWMgaGFjayBhbmQKKyAgICAgICAgICAgICAgICAvLyByZXRyaWV2aW5nIHRoZSBtZXRhZGF0YSBvbiBzb21lIGV4dHJhY3RvcnMgbWF5IHR1cm4gb3V0CisgICAgICAgICAgICAgICAgLy8gdG8gYmUgdmVyeSBleHBlbnNpdmUuCisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcDsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVVE9fTE9PUElORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewpAQCAtMzU0LDExICs0MzMsNyBAQAogCiAgICAgY2FuY2VsUGxheWVyRXZlbnRzKCk7CiAKLSAgICBpZiAobVByZWZldGNoZXIgIT0gTlVMTCkgewotICAgICAgICBDSEVDS19FUShtUHJlZmV0Y2hlci0+Z2V0U3Ryb25nQ291bnQoKSwgMSk7Ci0gICAgfQotICAgIG1QcmVmZXRjaGVyLmNsZWFyKCk7Ci0KKyAgICBtQ2FjaGVkU291cmNlLmNsZWFyKCk7CiAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKICAgICBtVmlkZW9UcmFjay5jbGVhcigpOwogCkBAIC0zNzUsOSArNDUwLDYgQEAKICAgICB9CiAgICAgbUF1ZGlvU291cmNlLmNsZWFyKCk7CiAKLSAgICBpZiAobVRpbWVTb3VyY2UgIT0gbUF1ZGlvUGxheWVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGltZVNvdXJjZTsKLSAgICB9CiAgICAgbVRpbWVTb3VyY2UgPSBOVUxMOwogCiAgICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKQEAgLTM5NSw2ICs0NjcsMTUgQEAKICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKICAgICB9CiAKKyAgICBpZiAobVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJUU1BDb250cm9sbGVyLT5kaXNjb25uZWN0KCk7CisgICAgICAgIG1SVFNQQ29udHJvbGxlci5jbGVhcigpOworICAgIH0KKworICAgIG1SVFBQdXNoZXIuY2xlYXIoKTsKKyAgICBtUlRDUFB1c2hlci5jbGVhcigpOworICAgIG1SVFBTZXNzaW9uLmNsZWFyKCk7CisKICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVZpZGVvU291cmNlLT5zdG9wKCk7CiAKQEAgLTQyNyw2ICs1MDgsOCBAQAogCiAgICAgZGVsZXRlIG1TdXNwZW5zaW9uU3RhdGU7CiAgICAgbVN1c3BlbnNpb25TdGF0ZSA9IE5VTEw7CisKKyAgICBtQml0cmF0ZSA9IC0xOwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CkBAIC00MzksNiArNTIyLDQwIEBACiAgICAgfQogfQogCitib29sIEF3ZXNvbWVQbGF5ZXI6OmdldEJpdHJhdGUoaW50NjRfdCAqYml0cmF0ZSkgeworICAgIG9mZl90IHNpemU7CisgICAgaWYgKG1EdXJhdGlvblVzID49IDAgJiYgbUNhY2hlZFNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgeworICAgICAgICAqYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsgIC8vIGluIGJpdHMvc2VjCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChtQml0cmF0ZSA+PSAwKSB7CisgICAgICAgICpiaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgICpiaXRyYXRlID0gMDsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmZiBjYWNoZWQgZHVyYXRpb24gaXMgYXZhaWxhYmxlL2FwcGxpY2FibGUuCitib29sIEF3ZXNvbWVQbGF5ZXI6OmdldENhY2hlZER1cmF0aW9uX2woaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSB7CisgICAgaW50NjRfdCBiaXRyYXRlOworCisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gbVJUU1BDb250cm9sbGVyLT5nZXRRdWV1ZUR1cmF0aW9uVXMoZW9zKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwgJiYgZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKKyAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKGVvcyk7CisgICAgICAgICpkdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpvbkJ1ZmZlcmluZ1VwZGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbUJ1ZmZlcmluZ0V2ZW50UGVuZGluZykgewpAQCAtNDQ2LDI5ICs1NjMsMTE4IEBACiAgICAgfQogICAgIG1CdWZmZXJpbmdFdmVudFBlbmRpbmcgPSBmYWxzZTsKIAotICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGJvb2wgZW9zOworICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmVvcyk7CisKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCAxMDApOworICAgICAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyByZWFjaGVkIEVPUywgcHJlcGFyZSBpcyBkb25lLiIpOworICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGU7CisgICAgICAgICAgICBpZiAoZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkU2l6ZSA9IG1DYWNoZWRTb3VyY2UtPmNhY2hlZFNpemUoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWRTaXplICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKworICAgICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiAoZG91YmxlKWNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUgb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBsaW1pdHMgdG8gbWFpbnRhaW4gdGhlIGNhY2hlLgorCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtMb3dXYXRlck1hcmtCeXRlcyA9IDQwMDAwOworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrSGlnaFdhdGVyTWFya0J5dGVzID0gMjAwMDAwOworCisgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBQTEFZSU5HKSAmJiAhZW9zCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJWQpICwgcGF1c2luZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtMb3dXYXRlck1hcmtCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBDQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgcGF1c2VfbCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJUKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVvcyB8fCBjYWNoZWREYXRhUmVtYWluaW5nID4ga0hpZ2hXYXRlck1hcmtCeXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCBwcmVwYXJlIGlzIGRvbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXM7CisgICAgYm9vbCBlb3M7CisgICAgaWYgKGdldENhY2hlZER1cmF0aW9uX2woJmNhY2hlZER1cmF0aW9uVXMsICZlb3MpKSB7CisgICAgICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgIWVvcworICAgICAgICAgICAgICAgICYmIChjYWNoZWREdXJhdGlvblVzIDwga0xvd1dhdGVyTWFya1VzKSkgeworICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKCUuMmYgc2VjcykgLCBwYXVzaW5nLiIsCisgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgcGF1c2VfbCgpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZER1cmF0aW9uVXMgPiBrSGlnaFdhdGVyTWFya1VzKSB7CisgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBoYXMgZmlsbGVkIHVwICglLjJmIHNlY3MpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyBmaWxsZWQgdXAgKCUuMmYgc2VjcyksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKK30KKwordm9pZCBBd2Vzb21lUGxheWVyOjpwYXJ0aWFsX3Jlc2V0X2woKSB7CisgICAgLy8gT25seSByZXNldCB0aGUgdmlkZW8gcmVuZGVyZXIgYW5kIHNodXQgZG93biB0aGUgdmlkZW8gZGVjb2Rlci4KKyAgICAvLyBUaGVuIGluc3RhbnRpYXRlIGEgbmV3IHZpZGVvIGRlY29kZXIgYW5kIHJlc3VtZSB2aWRlbyBwbGF5YmFjay4KKworICAgIG1WaWRlb1JlbmRlcmVyLmNsZWFyKCk7CisKKyAgICBpZiAobUxhc3RWaWRlb0J1ZmZlcikgeworICAgICAgICBtTGFzdFZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1MYXN0VmlkZW9CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKKyAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CisgICAgfQorCiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1pc2NTdGF0ZUxvY2spOwotICAgICAgICBkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisgICAgICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAorICAgICAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5CisgICAgICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgorICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOworICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgdXNsZWVwKDEwMDApOworICAgICAgICB9CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAKLSAgICBpZiAoZHVyYXRpb25VcyA+PSAwKSB7Ci0gICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IG1QcmVmZXRjaGVyLT5nZXRDYWNoZWREdXJhdGlvblVzKCk7Ci0KLSAgICAgICAgTE9HVigiY2FjaGUgaG9sZHMgJS4yZiBzZWNzIHdvcnRoIG9mIGRhdGEuIiwgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7Ci0KLSAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgICAgICBnZXRQb3NpdGlvbigmcG9zaXRpb25Vcyk7Ci0KLSAgICAgICAgY2FjaGVkRHVyYXRpb25VcyArPSBwb3NpdGlvblVzOwotCi0gICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gKGRvdWJsZSljYWNoZWREdXJhdGlvblVzIC8gZHVyYXRpb25VczsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlICogMTAwLjApOwotCi0gICAgICAgIHBvc3RCdWZmZXJpbmdFdmVudF9sKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HRSgiTm90IHNlbmRpbmcgYnVmZmVyaW5nIHN0YXR1cyBiZWNhdXNlIGR1cmF0aW9uIGlzIHVua25vd24uIik7Ci0gICAgfQorICAgIENIRUNLX0VRKE9LLCBpbml0VmlkZW9EZWNvZGVyKE9NWENvZGVjOjprSWdub3JlQ29kZWNTcGVjaWZpY0RhdGEpKTsKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUoKSB7CkBAIC00ODAsMjQgKzY4Niw1MSBAQAogICAgIH0KICAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwogCi0gICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0gJiYgKG1GbGFncyAmIExPT1BJTkcpKSB7CisgICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAvLyBUaGlzIHNwZWNpYWwgc3RhdHVzIGlzIHJldHVybmVkIGJlY2F1c2UgYW4gaHR0cCBsaXZlIHN0cmVhbSdzCisgICAgICAgIC8vIHZpZGVvIHN0cmVhbSBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBiYW5kd2lkdGggYXQgdGhpcyBwb2ludAorICAgICAgICAvLyBhbmQgZnV0dXJlIGRhdGEgbWF5IGhhdmUgYmVlbiBlbmNvZGVkIHVzaW5nIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBUaGlzIHJlcXVpcmVzIHVzIHRvIHNodXRkb3duIHRoZSB2aWRlbyBkZWNvZGVyIGFuZCByZWluc3RhbnRpYXRlCisgICAgICAgIC8vIGEgZnJlc2ggb25lLgorCisgICAgICAgIExPR1YoIklORk9fRElTQ09OVElOVUlUWSIpOworCisgICAgICAgIENIRUNLKG1WaWRlb1NvdXJjZSAhPSBOVUxMKTsKKworICAgICAgICBwYXJ0aWFsX3Jlc2V0X2woKTsKKyAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtU3RyZWFtRG9uZVN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOworCisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKKworICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKKworICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYm9vbCBhbGxEb25lID0KKyAgICAgICAgKG1WaWRlb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKQorICAgICAgICAgICAgJiYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpKTsKKworICAgIGlmICghYWxsRG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1GbGFncyAmIChMT09QSU5HIHwgQVVUT19MT09QSU5HKSkgewogICAgICAgICBzZWVrVG9fbCgwKTsKIAogICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU3RyZWFtRG9uZVN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJNRURJQV9FUlJPUiAlZCIsIG1TdHJlYW1Eb25lU3RhdHVzKTsKKyAgICAgICAgTE9HVigiTUVESUFfUExBWUJBQ0tfQ09NUExFVEUiKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBtU3RyZWFtRG9uZVN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXVzZV9sKCk7CisgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwogCiAgICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CiAgICAgfQpAQCAtNTA1LDYgKzczOCw5IEBACiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBsYXkoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisKICAgICByZXR1cm4gcGxheV9sKCk7CiB9CiAKQEAgLTUzNiw3ICs3NzIsNyBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIobUF1ZGlvU2luayk7CisgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKG1BdWRpb1NpbmssIHRoaXMpOwogICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIE1lZGlhU291cmNlIGluIG9yZGVyIHRvIGVuYWJsZQpAQCAtNTU4LDcgKzc5NCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1UaW1lU291cmNlOwogICAgICAgICAgICAgICAgIG1UaW1lU291cmNlID0gbUF1ZGlvUGxheWVyOwogCiAgICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwpAQCAtNTY5LDEyICs4MDQsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7CiAgICAgICAgIH0KLQotICAgICAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woKTsKICAgICB9CiAKICAgICBpZiAobVRpbWVTb3VyY2UgPT0gTlVMTCAmJiBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICBtVGltZVNvdXJjZSA9IG5ldyBTeXN0ZW1UaW1lU291cmNlOworICAgICAgICBtVGltZVNvdXJjZSA9ICZtU3lzdGVtVGltZVNvdXJjZTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKQEAgLTYwOSw2ICs4NDIsMTIgQEAKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmRlY29kZWRXaWR0aCkpOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmRlY29kZWRIZWlnaHQpKTsKIAorICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKCFtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICAgICAgfQorCiAgICAgICAgIG1WaWRlb1JlbmRlcmVyLmNsZWFyKCk7CiAKICAgICAgICAgLy8gTXVzdCBlbnN1cmUgdGhhdCBtVmlkZW9SZW5kZXJlcidzIGRlc3RydWN0b3IgaXMgYWN0dWFsbHkgZXhlY3V0ZWQKQEAgLTYyNCw3ICs4NjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLCBjb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcykpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgZGVjb2RlcnMgYXJlIGluc3RhbnRpYXRlZCBsb2NhbGx5IGFuZCBhcyBhIGNvbnNlcXVlbmNlCiAgICAgICAgICAgICAvLyBhbGxvY2F0ZSB0aGVpciBidWZmZXJzIGluIGxvY2FsIGFkZHJlc3Mgc3BhY2UuCkBAIC02MzQsMTcgKzg3NCwyMCBAQAogICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCiAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAogICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAgICAgZGVjb2RlZFdpZHRoLCBkZWNvZGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsIHJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBhdXNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworCiAgICAgcmV0dXJuIHBhdXNlX2woKTsKIH0KIAotc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGF1c2VfbCgpIHsKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBhdXNlX2woYm9vbCBhdF9lb3MpIHsKICAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtNjUyLDcgKzg5NSwxNCBAQAogICAgIGNhbmNlbFBsYXllckV2ZW50cyh0cnVlIC8qIGtlZXBCdWZmZXJpbmdHb2luZyAqLyk7CiAKICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOworICAgICAgICBpZiAoYXRfZW9zKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBwbGF5ZWQgdGhlIGF1ZGlvIHN0cmVhbSB0byBjb21wbGV0aW9uIHdlCisgICAgICAgICAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBzYW1wbGVzIHJlbWFpbmluZyBpbiB0aGUgYXVkaW8KKyAgICAgICAgICAgIC8vIHRyYWNrJ3MgcXVldWUgYXJlIHBsYXllZCBvdXQuCisgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKHRydWUgLyogcGxheVBlbmRpbmdTYW1wbGVzICovKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1GbGFncyAmPSB+UExBWUlORzsKQEAgLTY2Niw3ICs5MTYsNyBAQAogfQogCiBib29sIEF3ZXNvbWVQbGF5ZXI6OmlzUGxheWluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZsYWdzICYgUExBWUlORzsKKyAgICByZXR1cm4gKG1GbGFncyAmIFBMQVlJTkcpIHx8IChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTik7CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0SVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSkgewpAQCAtNzA3LDcgKzk1NywxMCBAQAogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKSB7Ci0gICAgaWYgKG1TZWVraW5nKSB7CisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgICpwb3NpdGlvblVzID0gbVJUU1BDb250cm9sbGVyLT5nZXROb3JtYWxQbGF5VGltZVVzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1TZWVraW5nKSB7CiAgICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7CiAgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1pc2NTdGF0ZUxvY2spOwpAQCAtNzIyLDkgKzk3NSw3IEBACiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVVcykgewotICAgIGlmIChtRXh0cmFjdG9yRmxhZ3MKLSAgICAgICAgICAgICYgKE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFS19GT1JXQVJECi0gICAgICAgICAgICAgICAgfCBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUtfQkFDS1dBUkQpKSB7CisgICAgaWYgKG1FeHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFSykgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICByZXR1cm4gc2Vla1RvX2wodGltZVVzKTsKICAgICB9CkBAIC03MzIsMTEgKzk4MywzMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLy8gc3RhdGljCit2b2lkIEF3ZXNvbWVQbGF5ZXI6Ok9uUlRTUFNlZWtEb25lV3JhcHBlcih2b2lkICpjb29raWUpIHsKKyAgICBzdGF0aWNfY2FzdDxBd2Vzb21lUGxheWVyICo+KGNvb2tpZSktPm9uUlRTUFNlZWtEb25lKCk7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6b25SVFNQU2Vla0RvbmUoKSB7CisgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOworfQorCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZWVrVG9fbChpbnQ2NF90IHRpbWVVcykgeworICAgIGlmIChtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgeworICAgICAgICBtUlRTUENvbnRyb2xsZXItPnNlZWtBc3luYyh0aW1lVXMsIE9uUlRTUFNlZWtEb25lV3JhcHBlciwgdGhpcyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgcGxheV9sKCk7CisgICAgfQorCiAgICAgbVNlZWtpbmcgPSB0cnVlOwogICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwogICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+QVRfRU9TOworICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7CiAKICAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAKQEAgLTc4NSwxMCArMTA1Niw2IEBACiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldEF1ZGlvU291cmNlKHNwPE1lZGlhU291cmNlPiBzb3VyY2UpIHsKICAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CiAKLSAgICBpZiAobVByZWZldGNoZXIgIT0gTlVMTCkgewotICAgICAgICBzb3VyY2UgPSBtUHJlZmV0Y2hlci0+YWRkU291cmNlKHNvdXJjZSk7Ci0gICAgfQotCiAgICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7CiB9CiAKQEAgLTgzNSwxOCArMTEwMiwxNSBAQAogdm9pZCBBd2Vzb21lUGxheWVyOjpzZXRWaWRlb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKSB7CiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCi0gICAgaWYgKG1QcmVmZXRjaGVyICE9IE5VTEwpIHsKLSAgICAgICAgc291cmNlID0gbVByZWZldGNoZXItPmFkZFNvdXJjZShzb3VyY2UpOwotICAgIH0KLQogICAgIG1WaWRlb1RyYWNrID0gc291cmNlOwogfQogCi1zdGF0dXNfdCBBd2Vzb21lUGxheWVyOjppbml0VmlkZW9EZWNvZGVyKCkgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6aW5pdFZpZGVvRGVjb2Rlcih1aW50MzJfdCBmbGFncykgewogICAgIG1WaWRlb1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCiAgICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCksCiAgICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlRW5jb2RlcgotICAgICAgICAgICAgbVZpZGVvVHJhY2spOworICAgICAgICAgICAgbVZpZGVvVHJhY2ssCisgICAgICAgICAgICBOVUxMLCBmbGFncyk7CiAKICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwpAQCAtODcxLDYgKzExMzUsMzIgQEAKICAgICByZXR1cm4gbVZpZGVvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6ZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpIHsKKyAgICBpZiAoIW1TZWVraW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHRpbWVVcywgdGltZVVzIC8gMUU2KTsKKworICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmlkZW8gdGltZSwgc2VlayBhdWRpbyB0byB0aGUgb3JpZ2luYWxseQorICAgICAgICAvLyByZXF1ZXN0ZWQgc2VlayB0aW1lIGluc3RlYWQuCisKKyAgICAgICAgbUF1ZGlvUGxheWVyLT5zZWVrVG8odmlkZW9UaW1lVXMgPCAwID8gbVNlZWtUaW1lVXMgOiB2aWRlb1RpbWVVcyk7CisgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7CisgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIW1TZWVrTm90aWZpY2F0aW9uU2VudCkgeworICAgICAgICAvLyBJZiB3ZSdyZSBwbGF5aW5nIHZpZGVvIG9ubHksIHJlcG9ydCBzZWVrIGNvbXBsZXRlIG5vdywKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGF1ZGlvIHBsYXllciB3aWxsIG5vdGlmeSB1cyBsYXRlci4KKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICB9CisKKyAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpvblZpZGVvRXZlbnQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1WaWRlb0V2ZW50UGVuZGluZykgewpAQCAtODkwLDYgKzExODAsMjEgQEAKICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlZWsgdGhlIHZpZGVvIHNvdXJjZSBmaXJzdCwgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzb3VyY2UuCisgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBqdW1wcyBpbiB0aGUgRGF0YVNvdXJjZSBvZmZzZXQgY2F1c2VkIGJ5CisgICAgICAgICAgICAvLyB0aGUgYXVkaW8gY29kZWMgcHJlZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBvbGQgbG9jYXRpb25zCisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgdmlkZW8gY29kZWMgaXMgYWxyZWFkeSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV3CisgICAgICAgICAgICAvLyBsb2NhdGlvbnMsIHdlJ2xsICJwYXVzZSIgdGhlIGF1ZGlvIHNvdXJjZSwgY2F1c2luZyBpdCB0bworICAgICAgICAgICAgLy8gc3RvcCByZWFkaW5nIGlucHV0IGRhdGEgdW50aWwgYSBzdWJzZXF1ZW50IHNlZWsuCisKKyAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CkBAIC04OTcsNyArMTIwMiw4IEBACiAgICAgICAgIGlmIChtU2Vla2luZykgewogICAgICAgICAgICAgTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsIG1TZWVrVGltZVVzIC8gMUU2KTsKIAotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOworICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCisgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwpAQCAtOTE2LDYgKzEyMjIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgLy8gU28gdmlkZW8gcGxheWJhY2sgaXMgY29tcGxldGUsIGJ1dCB3ZSBtYXkgc3RpbGwgaGF2ZQorICAgICAgICAgICAgICAgIC8vIGEgc2VlayByZXF1ZXN0IHBlbmRpbmcgdGhhdCBuZWVkcyB0byBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGF1ZGlvIHRyYWNrLgorICAgICAgICAgICAgICAgIGlmIChtU2Vla2luZykgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJ2aWRlbyBzdHJlYW0gZW5kZWQgd2hpbGUgc2Vla2luZyEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KC0xKTsKKworICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7CiAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtOTQxLDQ3ICsxMjU2LDM5IEBACiAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKICAgICB9CiAKLSAgICBpZiAobVNlZWtpbmcpIHsKLSAgICAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICVsbGQgdXMgKCUuMmYgc2VjcykuIiwgdGltZVVzLCB0aW1lVXMgLyAxRTYpOworICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSh0aW1lVXMpOwogCi0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNlZWtUbyh0aW1lVXMpOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIHBsYXlpbmcgdmlkZW8gb25seSwgcmVwb3J0IHNlZWsgY29tcGxldGUgbm93LAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGF1ZGlvIHBsYXllciB3aWxsIG5vdGlmeSB1cyBsYXRlci4KLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgIH0KKyAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7CiAKLSAgICAgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLQotICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6UEFVU0UsIDApOwotICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIHRpbWVVcyAvIDEwMDApOwotICAgICAgICB9CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIHRpbWVVcyAvIDEwMDApOwogICAgIH0KIAogICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewogICAgICAgICBtRmxhZ3MgJj0gfkZJUlNUX0ZSQU1FOwogCi0gICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IG1UaW1lU291cmNlLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CisgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CiAgICAgfQogCiAgICAgaW50NjRfdCByZWFsVGltZVVzLCBtZWRpYVRpbWVVczsKLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwKKyAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19BVF9FT1MpICYmIG1BdWRpb1BsYXllciAhPSBOVUxMCiAgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygmcmVhbFRpbWVVcywgJm1lZGlhVGltZVVzKSkgewogICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXM7CiAgICAgfQogCi0gICAgaW50NjRfdCBub3dVcyA9IG1UaW1lU291cmNlLT5nZXRSZWFsVGltZVVzKCkgLSBtVGltZVNvdXJjZURlbHRhVXM7CisgICAgaW50NjRfdCBub3dVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSBtVGltZVNvdXJjZURlbHRhVXM7CiAKICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKIAorICAgIGlmIChtUlRQU2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdlJ2xsIGNvbXBsZXRlbHkgaWdub3JlIHRpbWVzdGFtcHMgZm9yIGd0YWxrIHZpZGVvY2hhdAorICAgICAgICAvLyBhbmQgd2UnbGwgcGxheSBpbmNvbWluZyB2aWRlbyBhcyBmYXN0IGFzIHdlIGdldCBpdC4KKyAgICAgICAgbGF0ZW5lc3NVcyA9IDA7CisgICAgfQorCiAgICAgaWYgKGxhdGVuZXNzVXMgPiA0MDAwMCkgewogICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gNDBtcyBsYXRlLgogICAgICAgICBMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLCBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKQEAgLTEwNDAsMTAgKzEzNDcsNiBAQAogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RCdWZmZXJpbmdFdmVudF9sKCkgewotICAgIGlmIChtUHJlZmV0Y2hlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBpZiAobUJ1ZmZlcmluZ0V2ZW50UGVuZGluZykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTA1Niw3ICsxMzU5LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobUNoZWNrQXVkaW9TdGF0dXNFdmVudCwgMTAwMDAwbGwpOworICAgIG1RdWV1ZS5wb3N0RXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudCk7CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6b25DaGVja0F1ZGlvU3RhdHVzKCkgewpAQCAtMTA4MywxMCArMTM4NiwxMCBAQAogICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwogICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOworICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOworICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CiAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7CiAgICAgfQotCi0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7CiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnByZXBhcmUoKSB7CkBAIC0xMTUxLDEwICsxNDU0LDEwIEBACiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZTsKIAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBtVXJpLnN0cmluZygpLCA3KSkgewotICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBuZXcgSFRUUERhdGFTb3VyY2UobVVyaSwgJm1VcmlIZWFkZXJzKTsKKyAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IE51SFRUUERhdGFTb3VyY2U7CiAKICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdCgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmNvbm5lY3QobVVyaSwgJm1VcmlIZWFkZXJzKTsKICAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTExNjQsMTAgKzE0NjcsMTYyIEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgZGF0YVNvdXJjZSA9IG5ldyBDYWNoaW5nRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UsIDY0ICogMTAyNCwgMTApOwotCisjaWYgMAorICAgICAgICBtQ2FjaGVkU291cmNlID0gbmV3IE51Q2FjaGVkU291cmNlMigKKyAgICAgICAgICAgICAgICBuZXcgVGhyb3R0bGVkU291cmNlKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UsIDUwICogMTAyNCAvKiBieXRlcy9zZWMgKi8pKTsKKyNlbHNlCisgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBuZXcgTnVDYWNoZWRTb3VyY2UyKG1Db25uZWN0aW5nRGF0YVNvdXJjZSk7CisjZW5kaWYKICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLmNsZWFyKCk7CisKKyAgICAgICAgZGF0YVNvdXJjZSA9IG1DYWNoZWRTb3VyY2U7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobVVyaS5zdHJpbmcoKSwgImh0dHBsaXZlOi8vIiwgMTEpKSB7CisgICAgICAgIFN0cmluZzggdXJpKCJodHRwOi8vIik7CisgICAgICAgIHVyaS5hcHBlbmQobVVyaS5zdHJpbmcoKSArIDExKTsKKworICAgICAgICBzcDxMaXZlU291cmNlPiBsaXZlU291cmNlID0gbmV3IExpdmVTb3VyY2UodXJpLnN0cmluZygpKTsKKworICAgICAgICBtQ2FjaGVkU291cmNlID0gbmV3IE51Q2FjaGVkU291cmNlMihsaXZlU291cmNlKTsKKyAgICAgICAgZGF0YVNvdXJjZSA9IG1DYWNoZWRTb3VyY2U7CisKKyAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CisgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKworICAgICAgICBzdGF0aWNfY2FzdDxNUEVHMlRTRXh0cmFjdG9yICo+KGV4dHJhY3Rvci5nZXQoKSkKKyAgICAgICAgICAgIC0+c2V0TGl2ZVNvdXJjZShsaXZlU291cmNlKTsKKworICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CisgICAgfSBlbHNlIGlmICghc3RybmNtcCgicnRzcDovL2d0YWxrLyIsIG1Vcmkuc3RyaW5nKCksIDEzKSkgeworICAgICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJndGFsayBydHAiKTsKKyAgICAgICAgICAgIG1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ISUdIRVNUKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0T2ZDb2RlY1N0cmluZyA9ICZtVXJpLnN0cmluZygpWzEzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RhcnRPZlNsYXNoMSA9IHN0cmNocihzdGFydE9mQ29kZWNTdHJpbmcsICcvJyk7CisgICAgICAgIGlmIChzdGFydE9mU2xhc2gxID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqc3RhcnRPZldpZHRoU3RyaW5nID0gJnN0YXJ0T2ZTbGFzaDFbMV07CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0T2ZTbGFzaDIgPSBzdHJjaHIoc3RhcnRPZldpZHRoU3RyaW5nLCAnLycpOworICAgICAgICBpZiAoc3RhcnRPZlNsYXNoMiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0T2ZIZWlnaHRTdHJpbmcgPSAmc3RhcnRPZlNsYXNoMlsxXTsKKworICAgICAgICBTdHJpbmc4IGNvZGVjU3RyaW5nKHN0YXJ0T2ZDb2RlY1N0cmluZywgc3RhcnRPZlNsYXNoMSAtIHN0YXJ0T2ZDb2RlY1N0cmluZyk7CisgICAgICAgIFN0cmluZzggd2lkdGhTdHJpbmcoc3RhcnRPZldpZHRoU3RyaW5nLCBzdGFydE9mU2xhc2gyIC0gc3RhcnRPZldpZHRoU3RyaW5nKTsKKyAgICAgICAgU3RyaW5nOCBoZWlnaHRTdHJpbmcoc3RhcnRPZkhlaWdodFN0cmluZyk7CisKKyNpZiAwCisgICAgICAgIG1SVFBQdXNoZXIgPSBuZXcgVURQUHVzaGVyKCIvZGF0YS9taXNjL3J0cG91dC5iaW4iLCA1NDM0KTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBQdXNoZXIpOworCisgICAgICAgIG1SVENQUHVzaGVyID0gbmV3IFVEUFB1c2hlcigiL2RhdGEvbWlzYy9ydGNwb3V0LmJpbiIsIDU0MzUpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJUQ1BQdXNoZXIpOworI2VuZGlmCisKKyAgICAgICAgbVJUUFNlc3Npb24gPSBuZXcgQVJUUFNlc3Npb247CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUlRQU2Vzc2lvbik7CisKKyNpZiAwCisgICAgICAgIC8vIE15IEFNUiBTRFAKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnJhdyA9CisgICAgICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAgICAgInM9UXVpY2tUaW1lXHJcbiIKKyAgICAgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICAgICAiYT1yYW5nZTpucHQ9MC0zMTVcclxuIgorICAgICAgICAgICAgImE9aXNtYS1jb21wbGlhbmNlOjIsMi4wLDJcclxuIgorICAgICAgICAgICAgIm09YXVkaW8gNTQzNCBSVFAvQVZQIDk3XHJcbiIKKyAgICAgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAgICAgImI9QVM6MzBcclxuIgorICAgICAgICAgICAgImE9cnRwbWFwOjk3IEFNUi84MDAwLzFcclxuIgorICAgICAgICAgICAgImE9Zm10cDo5NyBvY3RldC1hbGlnblxyXG4iOworI2VsaWYgMQorICAgICAgICBTdHJpbmc4IHNkcDsKKyAgICAgICAgc2RwLmFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICJ2PTBcclxuIgorICAgICAgICAgICAgIm89LSA2NCAyMzM1NzI5NDQgSU4gSVA0IDEyNy4wLjAuMFxyXG4iCisgICAgICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAgICAgInQ9MCAwXHJcbiIKKyAgICAgICAgICAgICJhPXJhbmdlOm5wdD0wLTMxNVxyXG4iCisgICAgICAgICAgICAiYT1pc21hLWNvbXBsaWFuY2U6MiwyLjAsMlxyXG4iCisgICAgICAgICAgICAibT12aWRlbyA1NDM0IFJUUC9BVlAgOTdcclxuIgorICAgICAgICAgICAgImM9SU4gSVA0IDEyNy4wLjAuMVxyXG4iCisgICAgICAgICAgICAiYj1BUzozMFxyXG4iCisgICAgICAgICAgICAiYT1ydHBtYXA6OTcgJXMvOTAwMDBcclxuIgorICAgICAgICAgICAgImE9Y2xpcHJlY3Q6MCwwLCVzLCVzXHJcbiIKKyAgICAgICAgICAgICJhPWZyYW1lc2l6ZTo5NyAlcy0lc1xyXG4iLAorCisgICAgICAgICAgICBjb2RlY1N0cmluZy5zdHJpbmcoKSwKKyAgICAgICAgICAgIGhlaWdodFN0cmluZy5zdHJpbmcoKSwgd2lkdGhTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICB3aWR0aFN0cmluZy5zdHJpbmcoKSwgaGVpZ2h0U3RyaW5nLnN0cmluZygpCisgICAgICAgICAgICApOworICAgICAgICBjb25zdCBjaGFyICpyYXcgPSBzZHAuc3RyaW5nKCk7CisKKyNlbmRpZgorCisgICAgICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IGRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKKyAgICAgICAgQ0hFQ0soZGVzYy0+c2V0VG8ocmF3LCBzdHJsZW4ocmF3KSkpOworCisgICAgICAgIENIRUNLX0VRKG1SVFBTZXNzaW9uLT5zZXR1cChkZXNjKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICBpZiAobVJUUFB1c2hlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUlRQUHVzaGVyLT5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1SVENQUHVzaGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SVENQUHVzaGVyLT5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEobVJUUFNlc3Npb24tPmNvdW50VHJhY2tzKCksIDF1KTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1SVFBTZXNzaW9uLT50cmFja0F0KDApOworCisjaWYgMAorICAgICAgICBib29sIGVvczsKKyAgICAgICAgd2hpbGUgKCgoQVBhY2tldFNvdXJjZSAqKXNvdXJjZS5nZXQoKSkKKyAgICAgICAgICAgICAgICAtPmdldFF1ZXVlZER1cmF0aW9uKCZlb3MpIDwgNTAwMDAwMGxsICYmICFlb3MpIHsKKyAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgc2V0VmlkZW9Tb3VyY2Uoc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpOworICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2Uoc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHRyYWN0b3JGbGFncyA9IE1lZGlhRXh0cmFjdG9yOjpDQU5fUEFVU0U7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykpIHsKKyAgICAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtUlRTUENvbnRyb2xsZXIgPSBuZXcgQVJUU1BDb250cm9sbGVyKG1Mb29wZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtUlRTUENvbnRyb2xsZXItPmNvbm5lY3QobVVyaS5zdHJpbmcoKSk7CisKKyAgICAgICAgTE9HSSgiQVJUU1BDb250cm9sbGVyOjpjb25uZWN0IHJldHVybmVkICVkIiwgZXJyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtUlRTUENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gbVJUU1BDb250cm9sbGVyLmdldCgpOworICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVyaS5zdHJpbmcoKSwgJm1VcmlIZWFkZXJzKTsKICAgICB9CkBAIC0xMTg4LDEwICsxNjQzLDYgQEAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgRVJST1JfTk9fTElDRU5TRSk7CiAgICAgfQogCi0gICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZykgewotICAgICAgICBtUHJlZmV0Y2hlciA9IG5ldyBQcmVmZXRjaGVyOwotICAgIH0KLQogICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKIH0KIApAQCAtMTIxNiw4NSArMTY2Nyw2OSBAQAogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om9uUHJlcGFyZUFzeW5jRXZlbnQoKSB7Ci0gICAgc3A8UHJlZmV0Y2hlcj4gcHJlZmV0Y2hlcjsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpIHsKLSAgICAgICAgICAgIExPR0koInByZXBhcmUgd2FzIGNhbmNlbGxlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmciKTsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVXJpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGluaXRWaWRlb0RlY29kZXIoKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0QXVkaW9EZWNvZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmVmZXRjaGVyID0gbVByZWZldGNoZXI7Ci0gICAgfQotCi0gICAgaWYgKHByZWZldGNoZXIgIT0gTlVMTCkgewotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7Ci0gICAgICAgICAgICAgICAgTE9HSSgicHJlcGFyZSB3YXMgY2FuY2VsbGVkIGJlZm9yZSBwcmVwYXJpbmcgdGhlIHByZWZldGNoZXIiKTsKLQotICAgICAgICAgICAgICAgIHByZWZldGNoZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTE9HSSgiY2FsbGluZyBwcmVmZXRjaGVyLT5wcmVwYXJlKCkiKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0KLSAgICAgICAgICAgIHByZWZldGNoZXItPnByZXBhcmUoJkF3ZXNvbWVQbGF5ZXI6OkNvbnRpbnVlUHJlcGFyYXRpb24sIHRoaXMpOwotCi0gICAgICAgIHByZWZldGNoZXIuY2xlYXIoKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICBMT0dJKCJwcmVmZXRjaGVyIGlzIGRvbmUgcHJlcGFyaW5nIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgICAgICBDSEVDS19FUShyZXN1bHQsIC1FSU5UUik7Ci0KLSAgICAgICAgICAgIExPR0koInByZWZldGNoZXItPnByZXBhcmUoKSB3YXMgY2FuY2VsbGVkIGVhcmx5LiIpOwotICAgICAgICAgICAgYWJvcnRQcmVwYXJlKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgeworICAgICAgICBMT0dJKCJwcmVwYXJlIHdhcyBjYW5jZWxsZWQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIik7CisgICAgICAgIGFib3J0UHJlcGFyZShVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtVXJpLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTCAmJiBtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0VmlkZW9EZWNvZGVyKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0QXVkaW9EZWNvZGVyKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMIHx8IG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgIHBvc3RCdWZmZXJpbmdFdmVudF9sKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKKyAgICB9Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7CiAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewogICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICAgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgbVZpZGVvSGVpZ2h0LCBtVmlkZW9XaWR0aCk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKQEAgLTEzMDUsOCArMTc0MCw2IEBACiAgICAgbUZsYWdzIHw9IFBSRVBBUkVEOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CiAgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotCi0gICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c3VzcGVuZCgpIHsKQEAgLTEzNDYsMjYgKzE3NzksMzUgQEAKICAgICBzdGF0ZS0+bVVyaUhlYWRlcnMgPSBtVXJpSGVhZGVyczsKICAgICBzdGF0ZS0+bUZpbGVTb3VyY2UgPSBtRmlsZVNvdXJjZTsKIAotICAgIHN0YXRlLT5tRmxhZ3MgPSBtRmxhZ3MgJiAoUExBWUlORyB8IExPT1BJTkcgfCBBVF9FT1MpOworICAgIHN0YXRlLT5tRmxhZ3MgPSBtRmxhZ3MgJiAoUExBWUlORyB8IEFVVE9fTE9PUElORyB8IExPT1BJTkcgfCBBVF9FT1MpOwogICAgIGdldFBvc2l0aW9uKCZzdGF0ZS0+bVBvc2l0aW9uVXMpOwogCiAgICAgaWYgKG1MYXN0VmlkZW9CdWZmZXIpIHsKICAgICAgICAgc2l6ZV90IHNpemUgPSBtTGFzdFZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKwogICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgc3RhdGUtPm1MYXN0VmlkZW9GcmFtZVNpemUgPSBzaXplOwotICAgICAgICAgICAgc3RhdGUtPm1MYXN0VmlkZW9GcmFtZSA9IG1hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIG1lbWNweShzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lLAotICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUxhc3RWaWRlb0J1ZmZlci0+ZGF0YSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0VmlkZW9CdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgaW50MzJfdCB1bnJlYWRhYmxlOworICAgICAgICAgICAgaWYgKCFtTGFzdFZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAga0tleUlzVW5yZWFkYWJsZSwgJnVucmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgIHx8IHVucmVhZGFibGUgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5tTGFzdFZpZGVvRnJhbWVTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lID0gbWFsbG9jKHNpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1MYXN0VmlkZW9CdWZmZXItPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3RWaWRlb0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwogCi0gICAgICAgICAgICBzdGF0ZS0+bVZpZGVvV2lkdGggPSBtVmlkZW9XaWR0aDsKLSAgICAgICAgICAgIHN0YXRlLT5tVmlkZW9IZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb1dpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb0hlaWdodCA9IG1WaWRlb0hlaWdodDsKIAotICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnN0YXRlLT5tQ29sb3JGb3JtYXQpKTsKLSAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZzdGF0ZS0+bURlY29kZWRXaWR0aCkpOwotICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZzdGF0ZS0+bURlY29kZWRIZWlnaHQpKTsKKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnN0YXRlLT5tQ29sb3JGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmc3RhdGUtPm1EZWNvZGVkV2lkdGgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnN0YXRlLT5tRGVjb2RlZEhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJVbmFibGUgdG8gc2F2ZSBsYXN0IHZpZGVvIGZyYW1lLCB3ZSBoYXZlIG5vIGFjY2VzcyB0byAiCisgICAgICAgICAgICAgICAgICAgICAidGhlIGRlY29kZWQgdmlkZW8gZGF0YS4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQwNyw3ICsxODQ5LDcgQEAKIAogICAgIHNlZWtUb19sKHN0YXRlLT5tUG9zaXRpb25Vcyk7CiAKLSAgICBtRmxhZ3MgPSBzdGF0ZS0+bUZsYWdzICYgKExPT1BJTkcgfCBBVF9FT1MpOworICAgIG1GbGFncyA9IHN0YXRlLT5tRmxhZ3MgJiAoQVVUT19MT09QSU5HIHwgTE9PUElORyB8IEFUX0VPUyk7CiAKICAgICBpZiAoc3RhdGUtPm1MYXN0VmlkZW9GcmFtZSAmJiBtSVN1cmZhY2UgIT0gTlVMTCkgewogICAgICAgICBtVmlkZW9SZW5kZXJlciA9CkBAIC0xNDE5LDcgKzE4NjEsOCBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tRGVjb2RlZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIDApOwogCiAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gdHJ1ZTsKIApAQCAtMTQ0MSw1ICsxODg0LDEzIEBACiAgICAgcmV0dXJuIG1FeHRyYWN0b3JGbGFnczsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0QXVkaW9FT1MoKSB7CisgICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCkgeworICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTQ2M2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DYWNoaW5nRGF0YVNvdXJjZTo6Q2FjaGluZ0RhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCBwYWdlU2l6ZSwgaW50IG51bVBhZ2VzKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbURhdGEobWFsbG9jKHBhZ2VTaXplICogbnVtUGFnZXMpKSwKLSAgICAgIG1QYWdlU2l6ZShwYWdlU2l6ZSksCi0gICAgICBtRmlyc3QoTlVMTCksCi0gICAgICBtTGFzdChOVUxMKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QYWdlczsgKytpKSB7Ci0gICAgICAgIFBhZ2UgKnBhZ2UgPSBuZXcgUGFnZTsKLSAgICAgICAgcGFnZS0+bVByZXYgPSBtTGFzdDsKLSAgICAgICAgcGFnZS0+bU5leHQgPSBOVUxMOwotCi0gICAgICAgIGlmIChtTGFzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlyc3QgPSBwYWdlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxhc3QtPm1OZXh0ID0gcGFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1MYXN0ID0gcGFnZTsKLQotICAgICAgICBwYWdlLT5tT2Zmc2V0ID0gLTE7Ci0gICAgICAgIHBhZ2UtPm1MZW5ndGggPSAwOwotICAgICAgICBwYWdlLT5tRGF0YSA9IChjaGFyICopbURhdGEgKyBtUGFnZVNpemUgKiBpOwotICAgIH0KLX0KLQotQ2FjaGluZ0RhdGFTb3VyY2U6On5DYWNoaW5nRGF0YVNvdXJjZSgpIHsKLSAgICBQYWdlICpwYWdlID0gbUZpcnN0OwotICAgIHdoaWxlIChwYWdlICE9IE5VTEwpIHsKLSAgICAgICAgUGFnZSAqbmV4dCA9IHBhZ2UtPm1OZXh0OwotICAgICAgICBkZWxldGUgcGFnZTsKLSAgICAgICAgcGFnZSA9IG5leHQ7Ci0gICAgfQotICAgIG1GaXJzdCA9IG1MYXN0ID0gTlVMTDsKLQotICAgIGZyZWUobURhdGEpOwotICAgIG1EYXRhID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgQ2FjaGluZ0RhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Ci19Ci0KLXN0YXR1c190IENhY2hpbmdEYXRhU291cmNlOjpnZXRTaXplKG9mZl90ICpzaXplKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IENhY2hpbmdEYXRhU291cmNlOjpmbGFncygpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKLX0KLQotc3NpemVfdCBDYWNoaW5nRGF0YVNvdXJjZTo6cmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgUGFnZSAqcGFnZSA9IG1GaXJzdDsKLSAgICAgICAgd2hpbGUgKHBhZ2UgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHBhZ2UtPm1PZmZzZXQgPj0gMCAmJiBvZmZzZXQgPj0gcGFnZS0+bU9mZnNldAotICAgICAgICAgICAgICAgICYmIG9mZnNldCA8IHBhZ2UtPm1PZmZzZXQgKyAob2ZmX3QpcGFnZS0+bUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFnZSA9IHBhZ2UtPm1OZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhZ2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcGFnZSA9IGFsbG9jYXRlX3BhZ2UoKTsKLSAgICAgICAgICAgIHBhZ2UtPm1PZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQgJSBtUGFnZVNpemU7Ci0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQocGFnZS0+bU9mZnNldCwgcGFnZS0+bURhdGEsIG1QYWdlU2l6ZSk7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBwYWdlLT5tTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFnZS0+bUxlbmd0aCA9IChzaXplX3QpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaXJzdC0+bVByZXYgPSBwYWdlOwotICAgICAgICAgICAgcGFnZS0+bU5leHQgPSBtRmlyc3Q7Ci0gICAgICAgICAgICBwYWdlLT5tUHJldiA9IE5VTEw7Ci0gICAgICAgICAgICBtRmlyc3QgPSBwYWdlOwotCi0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBwYWdlLT5tT2Zmc2V0ICsgKG9mZl90KXBhZ2UtPm1MZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE1vdmUgInBhZ2UiIHRvIHRoZSBmcm9udCBpbiBMUlUgb3JkZXIuCi0gICAgICAgICAgICBpZiAocGFnZS0+bU5leHQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBhZ2UtPm1OZXh0LT5tUHJldiA9IHBhZ2UtPm1QcmV2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTGFzdCA9IHBhZ2UtPm1QcmV2OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFnZS0+bVByZXYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBhZ2UtPm1QcmV2LT5tTmV4dCA9IHBhZ2UtPm1OZXh0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRmlyc3QgPSBwYWdlLT5tTmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUZpcnN0LT5tUHJldiA9IHBhZ2U7Ci0gICAgICAgICAgICBwYWdlLT5tTmV4dCA9IG1GaXJzdDsKLSAgICAgICAgICAgIHBhZ2UtPm1QcmV2ID0gTlVMTDsKLSAgICAgICAgICAgIG1GaXJzdCA9IHBhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IHBhZ2UtPm1MZW5ndGggLSAob2Zmc2V0IC0gcGFnZS0+bU9mZnNldCk7Ci0gICAgICAgIGlmIChjb3B5ID4gc2l6ZSkgewotICAgICAgICAgICAgY29weSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGRhdGEsKGNvbnN0IGNoYXIgKilwYWdlLT5tRGF0YSArIChvZmZzZXQgLSBwYWdlLT5tT2Zmc2V0KSwKLSAgICAgICAgICAgICAgIGNvcHkpOwotCi0gICAgICAgIHRvdGFsICs9IGNvcHk7Ci0KLSAgICAgICAgaWYgKHBhZ2UtPm1MZW5ndGggPCBtUGFnZVNpemUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBmaW5hbCBwYWdlLiBUaGVyZSBpcyBubyBtb3JlIGRhdGEgYmV5b25kIGl0LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgKz0gY29weTsKLSAgICAgICAgc2l6ZSAtPSBjb3B5OwotICAgICAgICBkYXRhID0gKGNoYXIgKilkYXRhICsgY29weTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG90YWw7Ci19Ci0KLUNhY2hpbmdEYXRhU291cmNlOjpQYWdlICpDYWNoaW5nRGF0YVNvdXJjZTo6YWxsb2NhdGVfcGFnZSgpIHsKLSAgICAvLyBUaGUgbGFzdCBwYWdlIGlzIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkLCBpLmUuIG9sZGVzdC4KLQotICAgIFBhZ2UgKnBhZ2UgPSBtTGFzdDsKLQotICAgIHBhZ2UtPm1QcmV2LT5tTmV4dCA9IE5VTEw7Ci0gICAgbUxhc3QgPSBwYWdlLT5tUHJldjsKLSAgICBwYWdlLT5tUHJldiA9IE5VTEw7Ci0KLSAgICByZXR1cm4gcGFnZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDA3NWIxZTMuLjg5Y2IxMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0yNyw0NiArMjcsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlIDx1aS9PdmVybGF5Lmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgaW50NjRfdCBnZXROb3dVcygpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLQotICAgIHJldHVybiAoaW50NjRfdCl0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMDsKLX0KLQotc3RydWN0IER1bW15U3VyZmFjZSA6IHB1YmxpYyBCblN1cmZhY2UgewotICAgIER1bW15U3VyZmFjZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIHNwPEdyYXBoaWNCdWZmZXI+IHJlcXVlc3RCdWZmZXIoaW50IGJ1ZmZlcklkeCwgaW50IHVzYWdlKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXJzKGNvbnN0IEJ1ZmZlckhlYXAgJmJ1ZmZlcnMpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBwb3N0QnVmZmVyKHNzaXplX3Qgb2Zmc2V0KSB7fQotICAgIHZpcnR1YWwgdm9pZCB1bnJlZ2lzdGVyQnVmZmVycygpIHt9Ci0KLSAgICB2aXJ0dWFsIHNwPE92ZXJsYXlSZWY+IGNyZWF0ZU92ZXJsYXkoCi0gICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBvcmllbnRhdGlvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EdW1teVN1cmZhY2UoKSB7fQotCi0gICAgRHVtbXlTdXJmYWNlKGNvbnN0IER1bW15U3VyZmFjZSAmKTsKLSAgICBEdW1teVN1cmZhY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVN1cmZhY2UgJik7Ci19OwotCiBzdHJ1Y3QgQ2FtZXJhU291cmNlTGlzdGVuZXIgOiBwdWJsaWMgQ2FtZXJhTGlzdGVuZXIgewogICAgIENhbWVyYVNvdXJjZUxpc3RlbmVyKGNvbnN0IHNwPENhbWVyYVNvdXJjZT4gJnNvdXJjZSk7CiAKQEAgLTEwMCwyMiArNjUsNDMgQEAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIpIHsKICAgICBMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7Ci0KLSAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwotICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhVGltZXN0YW1wKAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgewotICAgIExPR1YoInBvc3REYXRhVGltZXN0YW1wKCVsbGQsICVkLCBwdHI6JXAsIHNpemU6JWQpIiwKLSAgICAgICAgIHRpbWVzdGFtcCwgbXNnVHlwZSwgZGF0YVB0ci0+cG9pbnRlcigpLCBkYXRhUHRyLT5zaXplKCkpOworCisgICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICBpZiAoc291cmNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgc291cmNlLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLzEwMDAsIG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KK30KKworc3RhdGljIGludDMyX3QgZ2V0Q29sb3JGb3JtYXQoY29uc3QgY2hhciogY29sb3JGb3JtYXQpIHsKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMlNQKSkgeworICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQKSkgeworICAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoY29sb3JGb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJJKSkgeworICAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlDYllDcjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQjU2NSkpIHsKKyAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OworICAgIH0KKworICAgIExPR0UoIlVrbm93biBjb2xvciBmb3JtYXQgKCVzKSwgcGxlYXNlIGFkZCBpdCB0byAiCisgICAgICAgICAiQ2FtZXJhU291cmNlOjpnZXRDb2xvckZvcm1hdCIsIGNvbG9yRm9ybWF0KTsKKworICAgIENIRUNLX0VRKDAsICJVbmtub3duIGNvbG9yIGZvcm1hdCIpOwogfQogCiAvLyBzdGF0aWMKIENhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGUoKSB7Ci0gICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QoKTsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdCgwKTsKIAogICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyNSw5ICsxMTEsNyBAQAogfQogCiAvLyBzdGF0aWMKLUNhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tSUNhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmaWNhbWVyYSkgewotICAgIHNwPENhbWVyYT4gY2FtZXJhID0gQ2FtZXJhOjpjcmVhdGUoaWNhbWVyYSk7Ci0KK0NhbWVyYVNvdXJjZSAqQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkgewogICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMzcsMjMgKzEyMSw1MCBAQAogCiBDYW1lcmFTb3VyY2U6OkNhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpCiAgICAgOiBtQ2FtZXJhKGNhbWVyYSksCi0gICAgICBtV2lkdGgoMCksCi0gICAgICBtSGVpZ2h0KDApLAogICAgICAgbUZpcnN0RnJhbWVUaW1lVXMoMCksCi0gICAgICBtTnVtRnJhbWVzKDApLAorICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKDApLAorICAgICAgbU51bUZyYW1lc1JlY2VpdmVkKDApLAorICAgICAgbU51bUZyYW1lc0VuY29kZWQoMCksCisgICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKKyAgICAgIG1OdW1HbGl0Y2hlcygwKSwKKyAgICAgIG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKDIwMDAwMCksCisgICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmhhcmR3YXJlIiwgdmFsdWUsIE5VTEwpICYmICFzdHJjbXAodmFsdWUsICJzaG9sZXMiKSkgewotICAgICAgICAvLyBUaGUgaGFyZHdhcmUgZW5jb2RlcihzKSBkbyBub3Qgc3VwcG9ydCB5dXY0MjAsIGJ1dCBvbmx5IFlDYllDciwKLSAgICAgICAgLy8gZm9ydHVuYXRlbHkgdGhlIGNhbWVyYSBhbHNvIHN1cHBvcnRzIHRoaXMsIHNvIHdlIG5lZWRuJ3QgdHJhbnNjb2RlLgotICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoInByZXZpZXctZm9ybWF0PXl1djQyMmkteXV5diIpKTsKLSAgICB9CiAKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKICAgICBwcmludGYoInBhcmFtczogXCIlc1wiXG4iLCBzLnN0cmluZygpKTsKIAorICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodDsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKLSAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJm1XaWR0aCwgJm1IZWlnaHQpOworICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmd2lkdGgsICZoZWlnaHQpOworCisgICAgLy8gQ2FsY3VsYXRlIGdsaXRjaCBkdXJhdG9uIHRocmVzaG9sZCBiYXNlZCBvbiBmcmFtZSByYXRlCisgICAgaW50MzJfdCBmcmFtZVJhdGUgPSBwYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOworICAgIGludDY0X3QgZ2xpdGNoRHVyYXRpb25VcyA9ICgxMDAwMDAwTEwgLyBmcmFtZVJhdGUpOworICAgIGlmIChnbGl0Y2hEdXJhdGlvblVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKKyAgICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMgPSBnbGl0Y2hEdXJhdGlvblVzOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmNvbG9yRm9ybWF0U3RyID0gcGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fRlJBTUVfRk9STUFUKTsKKyAgICBDSEVDSyhjb2xvckZvcm1hdFN0ciAhPSBOVUxMKTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gZ2V0Q29sb3JGb3JtYXQoY29sb3JGb3JtYXRTdHIpOworCisgICAgLy8gWFhYOiBxdWVyeSBjYW1lcmEgZm9yIHRoZSBzdHJpZGUgYW5kIHNsaWNlIGhlaWdodAorICAgIC8vIHdoZW4gdGhlIGNhcGFiaWxpdHkgYmVjb21lcyBhdmFpbGFibGUuCisgICAgc3RyaWRlID0gd2lkdGg7CisgICAgc2xpY2VIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7CisKIH0KIAogQ2FtZXJhU291cmNlOjp+Q2FtZXJhU291cmNlKCkgewpAQCAtMTYyLDYwICsxNzMsMTA2IEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYVNvdXJjZTo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgbVByZXZpZXdTdXJmYWNlID0gc3VyZmFjZTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqKSB7CitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5yZWNvcmQtc3RhdHMiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSB7CisgICAgICAgIG1Db2xsZWN0U3RhdHMgPSB0cnVlOworICAgIH0KKworICAgIG1TdGFydFRpbWVVcyA9IDA7CisgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICBpZiAobWV0YSAmJiBtZXRhLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CisgICAgfQorCisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKLQotICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KAotICAgICAgICAgICAgICAgIG1QcmV2aWV3U3VyZmFjZSAhPSBOVUxMID8gbVByZXZpZXdTdXJmYWNlIDogbmV3IER1bW15U3VyZmFjZSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICBtQ2FtZXJhLT5zZXRQcmV2aWV3Q2FsbGJhY2tGbGFncygKLSAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0sKLSAgICAgICAgICAgIHwgRlJBTUVfQ0FMTEJBQ0tfRkxBR19DT1BZX09VVF9NQVNLKTsKLQotICAgIGVyciA9IG1DYW1lcmEtPnN0YXJ0UHJldmlldygpOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKLQogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIG1DYW1lcmEtPnN0b3BQcmV2aWV3KCk7Ci0KKyAgICBMT0dWKCJzdG9wIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIAorICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOworICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7CisgICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HSSgiV2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLnNpemUoKSk7CisgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKyAgICBtQ2FtZXJhID0gTlVMTDsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIGlmIChtQ29sbGVjdFN0YXRzKSB7CisgICAgICAgIExPR0koIkZyYW1lcyByZWNlaXZlZC9lbmNvZGVkL2Ryb3BwZWQ6ICVkLyVkLyVkIGluICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQsIG1OdW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKKyAgICB9CisKKyAgICBDSEVDS19FUShtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkICsgbU51bUZyYW1lc0Ryb3BwZWQpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3A8TWV0YURhdGE+IENhbWVyYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKK3ZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUXVldWVkRnJhbWVzKCkgeworICAgIExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQ7CisgICAgd2hpbGUgKCFtRnJhbWVzUmVjZWl2ZWQuZW1wdHkoKSkgeworICAgICAgICBpdCA9IG1GcmFtZXNSZWNlaXZlZC5iZWdpbigpOworICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkLmVyYXNlKGl0KTsKKyAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKKyAgICB9Cit9CiAKLSAgICByZXR1cm4gbWV0YTsKK3NwPE1ldGFEYXRhPiBDYW1lcmFTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbU1ldGE7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBMT0dWKCJzaWduYWxCdWZmZXJSZXR1cm5lZDogJXAiLCBidWZmZXItPmRhdGEoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBmb3IgKExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQgPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+cG9pbnRlcigpID09ICBidWZmZXItPmRhdGEoKSkgeworCisgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoKCppdCkpOworICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5lcmFzZShpdCk7CisgICAgICAgICAgICArK21OdW1GcmFtZXNFbmNvZGVkOworICAgICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcigwKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUZyYW1lQ29tcGxldGVDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfRVEoMCwgInNpZ25hbEJ1ZmZlclJldHVybmVkOiBib2d1cyBidWZmZXIiKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7CisgICAgTE9HVigicmVhZCIpOwogCiAgICAgKmJ1ZmZlciA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKQEAgLTIyNCwzOCArMjgxLDg5IEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIHdoaWxlIChtRnJhbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgd2hpbGUgKG1TdGFydGVkKSB7CisgICAgICAgICAgICB3aGlsZShtRnJhbWVzUmVjZWl2ZWQuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWUgPSAqbUZyYW1lc1JlY2VpdmVkLmJlZ2luKCk7CisgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQuZXJhc2UobUZyYW1lc1JlY2VpdmVkLmJlZ2luKCkpOworCisgICAgICAgICAgICBmcmFtZVRpbWUgPSAqbUZyYW1lVGltZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1GcmFtZVRpbWVzLmVyYXNlKG1GcmFtZVRpbWVzLmJlZ2luKCkpOworICAgICAgICAgICAgaW50NjRfdCBza2lwVGltZVVzOworICAgICAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLT5nZXRTa2lwRnJhbWUoJnNraXBUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgc2tpcFRpbWVVcyA9IGZyYW1lVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChza2lwVGltZVVzID4gZnJhbWVUaW1lKSB7CisgICAgICAgICAgICAgICAgTE9HVigic2tpcFRpbWVVczogJWxsZCB1cyA+IGZyYW1lVGltZTogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgIHNraXBUaW1lVXMsIGZyYW1lVGltZSk7CisgICAgICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICAgICAgICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOworICAgICAgICAgICAgICAgIC8vIFNhZmVndWFyZCBhZ2FpbnN0IHRoZSBhYnVzZSBvZiB0aGUga1NraXBGcmFtZV9PcHRpb24uCisgICAgICAgICAgICAgICAgaWYgKHNraXBUaW1lVXMgLSBmcmFtZVRpbWUgPj0gMUU2KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZyYW1lIHNraXBwaW5nIHJlcXVlc3RlZCBpcyB3YXkgdG9vIGxvbmc6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRpbWVVcyAtIGZyYW1lVGltZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5wdXNoX2JhY2soZnJhbWUpOworICAgICAgICAgICAgICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWUtPnBvaW50ZXIoKSwgZnJhbWUtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGZyYW1lID0gKm1GcmFtZXMuYmVnaW4oKTsKLSAgICAgICAgbUZyYW1lcy5lcmFzZShtRnJhbWVzLmJlZ2luKCkpOwotCi0gICAgICAgIGZyYW1lVGltZSA9ICptRnJhbWVUaW1lcy5iZWdpbigpOwotICAgICAgICBtRnJhbWVUaW1lcy5lcmFzZShtRnJhbWVUaW1lcy5iZWdpbigpKTsKICAgICB9Ci0KLSAgICAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lLT5zaXplKCkpOwotICAgIG1lbWNweSgoKmJ1ZmZlciktPmRhdGEoKSwgZnJhbWUtPnBvaW50ZXIoKSwgZnJhbWUtPnNpemUoKSk7Ci0gICAgKCpidWZmZXIpLT5zZXRfcmFuZ2UoMCwgZnJhbWUtPnNpemUoKSk7Ci0KLSAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5jbGVhcigpOwotICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOwotCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKK3ZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogdGltZXN0YW1wICVsbGQgdXMiLCB0aW1lc3RhbXBVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGludDY0X3Qgbm93VXMgPSBnZXROb3dVcygpOwotICAgIGlmIChtTnVtRnJhbWVzID09IDApIHsKLSAgICAgICAgbUZpcnN0RnJhbWVUaW1lVXMgPSBub3dVczsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKKyAgICAgICAgKyttTnVtRnJhbWVzUmVjZWl2ZWQ7CisgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgKyttTnVtRnJhbWVzOwogCi0gICAgbUZyYW1lcy5wdXNoX2JhY2soZGF0YSk7Ci0gICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKG5vd1VzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOworICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPiAwICYmCisgICAgICAgIHRpbWVzdGFtcFVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKKyAgICAgICAgaWYgKG1OdW1HbGl0Y2hlcyAlIDEwID09IDApIHsgIC8vIERvbid0IHNwYW0gdGhlIGxvZworICAgICAgICAgICAgTE9HVygiTG9uZyBkZWxheSBkZXRlY3RlZCBpbiB2aWRlbyByZWNvcmRpbmciKTsKKyAgICAgICAgfQorICAgICAgICArK21OdW1HbGl0Y2hlczsKKyAgICB9CisKKyAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgbUZpcnN0RnJhbWVUaW1lVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgLy8gSW5pdGlhbCBkZWxheQorICAgICAgICBpZiAobVN0YXJ0VGltZVVzID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFVzIDwgbVN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gRnJhbWUgd2FzIGNhcHR1cmVkIGJlZm9yZSByZWNvcmRpbmcgd2FzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAvLyBEcm9wIGl0IHdpdGhvdXQgdXBkYXRpbmcgdGhlIHN0YXRpc3RpY2FsIGRhdGEuCisgICAgICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzIC0gbVN0YXJ0VGltZVVzOworICAgICAgICB9CisgICAgfQorICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOworCisgICAgbUZyYW1lc1JlY2VpdmVkLnB1c2hfYmFjayhkYXRhKTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKKyAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sodGltZVVzKTsKKyAgICBMT0dWKCJpbml0aWFsIGRlbGF5OiAlbGxkLCBjdXJyZW50IHRpbWUgc3RhbXA6ICVsbGQiLAorICAgICAgICBtU3RhcnRUaW1lVXMsIHRpbWVVcyk7CiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcAppbmRleCA4YWE1YmI0Li5hYTlhZDIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAKQEAgLTI3Myw3ICsyNzMsOCBAQAogCiBzdGF0aWMgTXV0ZXggZ0RSTVNuaWZmZXJNdXRleDsKIGJvb2wgU25pZmZEUk0oCi0gICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdEUk1TbmlmZmVyTXV0ZXgpOwogICAgICAgICBpZiAoZ0RybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCAyM2M0NzkwLi4wYjg5OTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcApAQCAtMTksMTIgKzE5LDE2IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvV0FWRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC01NiwxOSArNjAsMjMgQEAKIE11dGV4IERhdGFTb3VyY2U6OmdTbmlmZmVyTXV0ZXg7CiBMaXN0PERhdGFTb3VyY2U6OlNuaWZmZXJGdW5jPiBEYXRhU291cmNlOjpnU25pZmZlcnM7CiAKLWJvb2wgRGF0YVNvdXJjZTo6c25pZmYoU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7Citib29sIERhdGFTb3VyY2U6OnNuaWZmKAorICAgICAgICBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSkgewogICAgICptaW1lVHlwZSA9ICIiOwogICAgICpjb25maWRlbmNlID0gMC4wZjsKKyAgICBtZXRhLT5jbGVhcigpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdTbmlmZmVyTXV0ZXgpOwogICAgIGZvciAoTGlzdDxTbmlmZmVyRnVuYz46Oml0ZXJhdG9yIGl0ID0gZ1NuaWZmZXJzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBnU25pZmZlcnMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgU3RyaW5nOCBuZXdNaW1lVHlwZTsKICAgICAgICAgZmxvYXQgbmV3Q29uZmlkZW5jZTsKLSAgICAgICAgaWYgKCgqaXQpKHRoaXMsICZuZXdNaW1lVHlwZSwgJm5ld0NvbmZpZGVuY2UpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdNZXRhOworICAgICAgICBpZiAoKCppdCkodGhpcywgJm5ld01pbWVUeXBlLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEpKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKm1pbWVUeXBlID0gbmV3TWltZVR5cGU7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOworICAgICAgICAgICAgICAgICptZXRhID0gbmV3TWV0YTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTkyLDExICsxMDAsMTMgQEAKIAogLy8gc3RhdGljCiB2b2lkIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCkgewotICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QMyk7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTVBFRzQpOwotICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZkFNUik7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmV0FWKTsKKyAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZNYXRyb3NrYSk7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmT2dnKTsKKyAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZXQVYpOworICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZkFNUik7CisgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTVBFRzJUUyk7CisgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTVAzKTsKIAogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBpZiAocHJvcGVydHlfZ2V0KCJkcm0uc2VydmljZS5lbmFibGVkIiwgdmFsdWUsIE5VTEwpCkBAIC0xMTIsMTEgKzEyMiwxMSBAQAogICAgIGlmICghc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmksIDcpKSB7CiAgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSArIDcpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSkgewotICAgICAgICBzcDxIVFRQRGF0YVNvdXJjZT4gaHR0cFNvdXJjZSA9IG5ldyBIVFRQRGF0YVNvdXJjZSh1cmksIGhlYWRlcnMpOwotICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCgpICE9IE9LKSB7CisgICAgICAgIHNwPE51SFRUUERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgaWYgKGh0dHBTb3VyY2UtPmNvbm5lY3QodXJpLCBoZWFkZXJzKSAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgc291cmNlID0gbmV3IENhY2hpbmdEYXRhU291cmNlKGh0dHBTb3VyY2UsIDY0ICogMTAyNCwgMTApOworICAgICAgICBzb3VyY2UgPSBuZXcgTnVDYWNoZWRTb3VyY2UyKGh0dHBTb3VyY2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCiAgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmluZGV4IDZiODUwNDguLmI0NmQ4ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCkBAIC02NSw2ICs2NSwxMCBAQAogfQogCiBzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1GaWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtTGVuZ3RoID49IDApIHsKQEAgLTkyLDYgKzk2LDEwIEBACiB9CiAKIHN0YXR1c190IEZpbGVTb3VyY2U6OmdldFNpemUob2ZmX3QgKnNpemUpIHsKKyAgICBpZiAobUZpbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKICAgICBpZiAobUxlbmd0aCA+PSAwKSB7CiAgICAgICAgICpzaXplID0gbUxlbmd0aDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjFjM2M4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJIVFRQRGF0YVNvdXJjZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvc3RhZ2VmcmlnaHRfc3RyaW5nLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQU3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgSFRUUERhdGFTb3VyY2U6OmNvbm5lY3RXaXRoUmVkaXJlY3RzQW5kUmFuZ2Uob2ZmX3QgcmFuZ2VTdGFydCkgewotICAgIHN0cmluZyBob3N0ID0gbVN0YXJ0aW5nSG9zdC5zdHJpbmcoKTsKLSAgICBzdHJpbmcgcGF0aCA9IG1TdGFydGluZ1BhdGguc3RyaW5nKCk7Ci0gICAgaW50IHBvcnQgPSBtU3RhcnRpbmdQb3J0OwotCi0gICAgTE9HVigiQ29ubmVjdGluZyB0byBob3N0ICclcycsIHBvcnQgJWQsIHBhdGggJyVzJyIsCi0gICAgICAgICBob3N0LmNfc3RyKCksIHBvcnQsIHBhdGguY19zdHIoKSk7Ci0KLSAgICBpbnQgbnVtUmVkaXJlY3RzUmVtYWluaW5nID0gNTsKLSAgICB3aGlsZSAobnVtUmVkaXJlY3RzUmVtYWluaW5nLS0gPiAwKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSHR0cC0+Y29ubmVjdChob3N0LmNfc3RyKCksIHBvcnQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmc4IHJlcXVlc3Q7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJHRVQgIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKHBhdGguY19zdHIoKSk7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgSFRUUC8xLjFcclxuIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKG1IZWFkZXJzKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkhvc3Q6ICIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChob3N0LmNfc3RyKCkpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIGlmIChyYW5nZVN0YXJ0ID4gMCkgewotICAgICAgICAgICAgY2hhciByYW5nZVsxMjhdOwotICAgICAgICAgICAgc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtXHJcbiIsIHJhbmdlU3RhcnQpOwotCi0gICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChyYW5nZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIGVyciA9IG1IdHRwLT5zZW5kKHJlcXVlc3Quc3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaHR0cFN0YXR1czsKLSAgICAgICAgZXJyID0gbUh0dHAtPnJlY2VpdmVfaGVhZGVyKCZodHRwU3RhdHVzKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBTdGF0dXMgPj0gMjAwICYmIGh0dHBTdGF0dXMgPCAzMDApIHsKLSAgICAgICAgICAgIGFwcGx5VGltZW91dFJlc3BvbnNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaHR0cFN0YXR1cyAhPSAzMDEgJiYgaHR0cFN0YXR1cyAhPSAzMDIpIHsKLSAgICAgICAgICAgIExPR0UoIkhUVFAgcmVxdWVzdCBmYWlsZWQgdy8gaHR0cCBzdGF0dXMgJWQiLCBodHRwU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZyBsb2NhdGlvbjsKLSAgICAgICAgQ0hFQ0sobUh0dHAtPmZpbmRfaGVhZGVyX3ZhbHVlKCJMb2NhdGlvbiIsICZsb2NhdGlvbikpOwotCi0gICAgICAgIENIRUNLKHN0cmluZyhsb2NhdGlvbiwgMCwgNykgPT0gImh0dHA6Ly8iKTsKLSAgICAgICAgbG9jYXRpb24uZXJhc2UoMCwgNyk7Ci0gICAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoUG9zID0gbG9jYXRpb24uZmluZCgnLycpOwotICAgICAgICBpZiAoc2xhc2hQb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBzbGFzaFBvcyA9IGxvY2F0aW9uLnNpemUoKTsKLSAgICAgICAgICAgIGxvY2F0aW9uICs9ICcvJzsKLSAgICAgICAgfQotCi0gICAgICAgIG1IdHRwLT5kaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgTE9HVigiUmVkaXJlY3RpbmcgdG8gJXNcbiIsIGxvY2F0aW9uLmNfc3RyKCkpOwotCi0gICAgICAgIGhvc3QgPSBzdHJpbmcobG9jYXRpb24sIDAsIHNsYXNoUG9zKTsKLQotICAgICAgICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvblBvcyA9IGhvc3QuZmluZCgnOicpOwotICAgICAgICBpZiAoY29sb25Qb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCA9IGhvc3QuY19zdHIoKSArIGNvbG9uUG9zICsgMTsKLSAgICAgICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgICAgIGxvbmcgdG1wID0gc3RydG9sKHN0YXJ0LCAmZW5kLCAxMCk7Ci0gICAgICAgICAgICBDSEVDSyhlbmQgPiBzdGFydCAmJiAoKmVuZCA9PSAnXDAnKSk7Ci0KLSAgICAgICAgICAgIHBvcnQgPSAodG1wID49IDAgJiYgdG1wIDwgNjU1MzYpID8gKGludCl0bXAgOiA4MDsKLQotICAgICAgICAgICAgaG9zdC5lcmFzZShjb2xvblBvcywgaG9zdC5zaXplKCkgLSBjb2xvblBvcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3J0ID0gODA7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXRoID0gc3RyaW5nKGxvY2F0aW9uLCBzbGFzaFBvcyk7Ci0KLSAgICAgICAgbVN0YXJ0aW5nSG9zdCA9IGhvc3QuY19zdHIoKTsKLSAgICAgICAgbVN0YXJ0aW5nUGF0aCA9IHBhdGguY19zdHIoKTsKLSAgICAgICAgbVN0YXJ0aW5nUG9ydCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVSUk9SX0lPOwotfQotCi12b2lkIEhUVFBEYXRhU291cmNlOjphcHBseVRpbWVvdXRSZXNwb25zZSgpIHsKLSAgICBzdHJpbmcgdGltZW91dDsKLSAgICBpZiAobUh0dHAtPmZpbmRfaGVhZGVyX3ZhbHVlKCJYLVNvY2tldFRpbWVvdXQiLCAmdGltZW91dCkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqcyA9IHRpbWVvdXQuY19zdHIoKTsKLSAgICAgICAgY2hhciAqZW5kOwotICAgICAgICBsb25nIHRtcCA9IHN0cnRvbChzLCAmZW5kLCAxMCk7Ci0gICAgICAgIGlmIChlbmQgPT0gcyB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgICAgIExPR1coIklsbGVnYWwgWC1Tb2NrZXRUaW1lb3V0IHZhbHVlIGdpdmVuLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HSSgib3ZlcnJpZGluZyBkZWZhdWx0IHRpbWVvdXQsIG5ldyB0aW1lb3V0IGlzICVsZCBzZWNvbmRzIiwgdG1wKTsKLSAgICAgICAgbUh0dHAtPnNldFJlY2VpdmVUaW1lb3V0KHRtcCk7Ci0gICAgfQotfQotCi1IVFRQRGF0YVNvdXJjZTo6SFRUUERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBDSEVDSyghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpKTsKLQotICAgIHN0cmluZyBob3N0OwotICAgIHN0cmluZyBwYXRoOwotICAgIGludCBwb3J0OwotCi0gICAgY29uc3QgY2hhciAqc2xhc2ggPSBzdHJjaHIodXJpICsgNywgJy8nKTsKLSAgICBpZiAoc2xhc2ggPT0gTlVMTCkgewotICAgICAgICBob3N0ID0gdXJpICsgNzsKLSAgICAgICAgcGF0aCA9ICIvIjsKLSAgICB9IGVsc2UgewotICAgICAgICBob3N0ID0gc3RyaW5nKHVyaSArIDcsIHNsYXNoIC0gKHVyaSArIDcpKTsKLSAgICAgICAgcGF0aCA9IHNsYXNoOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKmNvbG9uID0gc3RyY2hyKGhvc3QuY19zdHIoKSwgJzonKTsKLSAgICBpZiAoY29sb24gPT0gTlVMTCkgewotICAgICAgICBwb3J0ID0gODA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqZW5kOwotICAgICAgICBsb25nIHRtcCA9IHN0cnRvbChjb2xvbiArIDEsICZlbmQsIDEwKTsKLSAgICAgICAgQ0hFQ0soZW5kID4gY29sb24gKyAxKTsKLSAgICAgICAgQ0hFQ0sodG1wID4gMCAmJiB0bXAgPCA2NTUzNik7Ci0gICAgICAgIHBvcnQgPSB0bXA7Ci0KLSAgICAgICAgaG9zdCA9IHN0cmluZyhob3N0LCAwLCBjb2xvbiAtIGhvc3QuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgbVN0YXJ0aW5nSG9zdCA9IGhvc3QuY19zdHIoKTsKLSAgICBtU3RhcnRpbmdQYXRoID0gcGF0aC5jX3N0cigpOwotICAgIG1TdGFydGluZ1BvcnQgPSBwb3J0OwotCi0gICAgaW5pdChoZWFkZXJzKTsKLX0KLQotSFRUUERhdGFTb3VyY2U6OkhUVFBEYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICpfaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKl9wYXRoLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIG1TdGFydGluZ0hvc3QgPSBfaG9zdDsKLSAgICBtU3RhcnRpbmdQYXRoID0gX3BhdGg7Ci0gICAgbVN0YXJ0aW5nUG9ydCA9IHBvcnQ7Ci0KLSAgICBpbml0KGhlYWRlcnMpOwotfQotCi12b2lkIEhUVFBEYXRhU291cmNlOjppbml0KGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIG1IdHRwID0gbmV3IEhUVFBTdHJlYW07Ci0KLSAgICBpbml0SGVhZGVycyhoZWFkZXJzKTsKLQotICAgIG1CdWZmZXIgPSBtYWxsb2Moa0J1ZmZlclNpemUpOwotCi0gICAgbU51bVJldHJpZXNMZWZ0ID0ga01heE51bVJldHJpZXM7Ci19Ci0KLXN0YXR1c190IEhUVFBEYXRhU291cmNlOjpjb25uZWN0KCkgewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0ZUxvY2spOwotCi0gICAgICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQUxSRUFEWV9DT05ORUNURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwotICAgIH0KLQotICAgIG1CdWZmZXJMZW5ndGggPSAwOwotICAgIG1CdWZmZXJPZmZzZXQgPSAwOwotICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSBmYWxzZTsKLQotICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RXaXRoUmVkaXJlY3RzQW5kUmFuZ2UoMCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLQotICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAgIExPR1YoImNvbm5lY3QoKSBjYW5jZWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzdHJpbmcgdmFsdWU7Ci0gICAgaWYgKG1IdHRwLT5maW5kX2hlYWRlcl92YWx1ZSgiQ29udGVudC1MZW5ndGgiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgbUNvbnRlbnRMZW5ndGggPSBzdHJ0b3VsbCh2YWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0gICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSB0cnVlOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICAvLyBkaXNjb25uZWN0IHdhcyBjYWxsZWQgd2hlbiB3ZSBoYWQganVzdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLgotICAgICAgICBMT0dWKCJjb25uZWN0KCkgY2FuY2VsbGVkICh3ZSBoYWQganVzdCBzdWNjZWVkZWQgY29ubmVjdGluZykiKTsKLQotICAgICAgICBtSHR0cC0+ZGlzY29ubmVjdCgpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0ZUxvY2spOwotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HIHx8IG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKLSAgICAgICAgbUh0dHAtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIH0KLX0KLQotc3RhdHVzX3QgSFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0KLSAgICByZXR1cm4gKG1TdGF0ZSA9PSBDT05ORUNURUQpID8gKHN0YXR1c190KU9LIDogRVJST1JfTk9UX0NPTk5FQ1RFRDsKLX0KLQotc3RhdHVzX3QgSFRUUERhdGFTb3VyY2U6OmdldFNpemUob2ZmX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9OT1RfQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtQ29udGVudExlbmd0aFZhbGlkKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1Db250ZW50TGVuZ3RoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1IVFRQRGF0YVNvdXJjZTo6fkhUVFBEYXRhU291cmNlKCkgewotICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgIGRlbGV0ZSBtSHR0cDsKLSAgICBtSHR0cCA9IE5VTEw7Ci0KLSAgICBmcmVlKG1CdWZmZXIpOwotICAgIG1CdWZmZXIgPSBOVUxMOwotfQotCi1zc2l6ZV90IEhUVFBEYXRhU291cmNlOjpzZW5kUmFuZ2VSZXF1ZXN0KHNpemVfdCBvZmZzZXQpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0V2l0aFJlZGlyZWN0c0FuZFJhbmdlKG9mZnNldCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc3RyaW5nIHZhbHVlOwotICAgIGlmICghbUh0dHAtPmZpbmRfaGVhZGVyX3ZhbHVlKCJDb250ZW50LUxlbmd0aCIsICZ2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGtCdWZmZXJTaXplOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICB1bnNpZ25lZCBsb25nIGNvbnRlbnRMZW5ndGggPSBzdHJ0b3VsKHZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIHJldHVybiBjb250ZW50TGVuZ3RoOwotfQotCi1zc2l6ZV90IEhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIExPR1YoInJlYWRBdCAlbGQsIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOwotCi1yaW5zZV9yZXBlYXQ6Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvZmZzZXQgPj0gbUJ1ZmZlck9mZnNldAotICAgICAgICAgICAgJiYgb2Zmc2V0IDwgKG9mZl90KShtQnVmZmVyT2Zmc2V0ICsgbUJ1ZmZlckxlbmd0aCkpIHsKLSAgICAgICAgc2l6ZV90IG51bV9ieXRlc19hdmFpbGFibGUgPSBtQnVmZmVyTGVuZ3RoIC0gKG9mZnNldCAtIG1CdWZmZXJPZmZzZXQpOwotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gbnVtX2J5dGVzX2F2YWlsYWJsZTsKLSAgICAgICAgaWYgKGNvcHkgPiBzaXplKSB7Ci0gICAgICAgICAgICBjb3B5ID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShkYXRhLCAoY29uc3QgY2hhciAqKW1CdWZmZXIgKyAob2Zmc2V0IC0gbUJ1ZmZlck9mZnNldCksIGNvcHkpOwotCi0gICAgICAgIGlmIChjb3B5IDwgc2l6ZSkgewotICAgICAgICAgICAgTE9HVigic2hvcnQgcmVhZCAoMSksIHJldHVybmluZyAlZCB2cy4gJWQgcmVxdWVzdGVkIiwgY29weSwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29weTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGNvbnRlbnRMZW5ndGggPSAwOwotICAgIGlmIChvZmZzZXQgIT0gKG9mZl90KShtQnVmZmVyT2Zmc2V0ICsgbUJ1ZmZlckxlbmd0aCkpIHsKLSAgICAgICAgTE9HVigibmV3IHJhbmdlIG9mZnNldD0lbGQgKG9sZD0lbGQpIiwKLSAgICAgICAgICAgICBvZmZzZXQsIG1CdWZmZXJPZmZzZXQgKyBtQnVmZmVyTGVuZ3RoKTsKLQotICAgICAgICBtSHR0cC0+ZGlzY29ubmVjdCgpOwotCi0gICAgICAgIGNvbnRlbnRMZW5ndGggPSBzZW5kUmFuZ2VSZXF1ZXN0KG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPiBrQnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgY29udGVudExlbmd0aCA9IGtCdWZmZXJTaXplOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29udGVudExlbmd0aCA9IGtCdWZmZXJTaXplOwotICAgIH0KLQotICAgIG1CdWZmZXJPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZAotICAgICAgICAgICAgJiYgbUJ1ZmZlck9mZnNldCArIGNvbnRlbnRMZW5ndGggPj0gKG9mZl90KW1Db250ZW50TGVuZ3RoKSB7Ci0gICAgICAgIC8vIElmIHdlIG5ldmVyIHRyaWdnZXJlZCBhIHJhbmdlIHJlcXVlc3QgYnV0IGtub3cgdGhlIGNvbnRlbnQgbGVuZ3RoLAotICAgICAgICAvLyBtYWtlIHN1cmUgdG8gbm90IHJlYWQgbW9yZSBkYXRhIHRoYW4gdGhlcmUgY291bGQgYmUsIG90aGVyd2lzZQotICAgICAgICAvLyB3ZSdkIGJsb2NrIGluZGVmaW5pdGVseSBpZiB0aGUgc2VydmVyIGRvZXNuJ3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0KLSAgICAgICAgY29udGVudExlbmd0aCA9IG1Db250ZW50TGVuZ3RoIC0gbUJ1ZmZlck9mZnNldDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGVudExlbmd0aCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50TGVuZ3RoOwotICAgIH0KLQotICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlY2VpdmVkID0gbUh0dHAtPnJlY2VpdmUobUJ1ZmZlciwgY29udGVudExlbmd0aCk7Ci0KLSAgICBpZiAobnVtX2J5dGVzX3JlY2VpdmVkIDwgMAotICAgICAgICAgICAgfHwgKG1Db250ZW50TGVuZ3RoVmFsaWQgJiYgbnVtX2J5dGVzX3JlY2VpdmVkIDwgY29udGVudExlbmd0aCkpIHsKLSAgICAgICAgaWYgKG1OdW1SZXRyaWVzTGVmdC0tID4gMCkgewotICAgICAgICAgICAgbUh0dHAtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIG1CdWZmZXJMZW5ndGggPSAwOwotICAgICAgICAgICAgbnVtX2J5dGVzX3JlY2VpdmVkID0gY29ubmVjdFdpdGhSZWRpcmVjdHNBbmRSYW5nZShtQnVmZmVyT2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVjZWl2ZWQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBMT0dJKCJyZXRyeWluZyBjb25uZWN0aW9uIHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIHJpbnNlX3JlcGVhdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0UoInJldHJ5aW5nIGNvbm5lY3Rpb24gZmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVmZmVyTGVuZ3RoID0gMDsKLQotICAgICAgICByZXR1cm4gbnVtX2J5dGVzX3JlY2VpdmVkOwotICAgIH0KLQotICAgIG1CdWZmZXJMZW5ndGggPSAoc2l6ZV90KW51bV9ieXRlc19yZWNlaXZlZDsKLQotICAgIHNpemVfdCBjb3B5ID0gbUJ1ZmZlckxlbmd0aDsKLSAgICBpZiAoY29weSA+IHNpemUpIHsKLSAgICAgICAgY29weSA9IHNpemU7Ci0gICAgfQotCi0gICAgbWVtY3B5KGRhdGEsIG1CdWZmZXIsIGNvcHkpOwotCi0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLXZvaWQgSFRUUERhdGFTb3VyY2U6OmluaXRIZWFkZXJzKAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzKSB7Ci0gICAgbUhlYWRlcnMgPSBTdHJpbmc4KCk7Ci0KLSAgICBtSGVhZGVycy5hcHBlbmQoIlVzZXItQWdlbnQ6IHN0YWdlZnJpZ2h0LzEuMCAoTGludXg7QW5kcm9pZCAiKTsKLQotI2lmIChQUk9QRVJUWV9WQUxVRV9NQVggPCA4KQotI2Vycm9yICJQUk9QRVJUWV9WQUxVRV9NQVggbXVzdCBiZSBhdCBsZWFzdCA4IgotI2VuZGlmCi0KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiLCB2YWx1ZSwgIlVua25vd24iKTsKLSAgICBtSGVhZGVycy5hcHBlbmQodmFsdWUpOwotICAgIG1IZWFkZXJzLmFwcGVuZCgiKVxyXG4iKTsKLQotICAgIGlmIChvdmVycmlkZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdmVycmlkZXMtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzggbGluZTsKLSAgICAgICAgbGluZS5hcHBlbmQob3ZlcnJpZGVzLT5rZXlBdChpKSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCI6ICIpOwotICAgICAgICBsaW5lLmFwcGVuZChvdmVycmlkZXMtPnZhbHVlQXQoaSkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIG1IZWFkZXJzLmFwcGVuZChsaW5lKTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEhUVFBEYXRhU291cmNlOjpmbGFncygpIHsKLSAgICB1aW50MzJfdCBmID0ga1dhbnRzUHJlZmV0Y2hpbmc7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobVN0YXJ0aW5nSG9zdC5zdHJpbmcoKSwgImxvY2FsaG9zdCIpCi0gICAgICAgICAgICB8fCAhc3RyY21wKG1TdGFydGluZ0hvc3Quc3RyaW5nKCksICIxMjcuMC4wLjEiKSkgewotICAgICAgICBmIHw9IGtTdHJlYW1lZEZyb21Mb2NhbEhvc3Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIGY7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUFN0cmVhbS5jcHAKaW5kZXggOWM5OTg2Ni4uY2NjNmEzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUFN0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUFN0cmVhbS5jcHAKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgc2V0UmVjZWl2ZVRpbWVvdXQoNSk7ICAvLyBUaW1lIG91dCByZWFkcyBhZnRlciA1IHNlY3MgYnkgZGVmYXVsdAorICAgIHNldFJlY2VpdmVUaW1lb3V0KDMwKTsgIC8vIFRpbWUgb3V0IHJlYWRzIGFmdGVyIDMwIHNlY3MgYnkgZGVmYXVsdAogCiAgICAgbVN0YXRlID0gQ09OTkVDVElORzsKIApAQCAtMTU4LDcgKzE1OCw3IEBACiAvLyBUaGUgd29ya2Fyb3VuZCBhY2NlcHRzIGJvdGggYmVoYXZpb3VycyBidXQgY291bGQgcG90ZW50aWFsbHkgYnJlYWsKIC8vIGxlZ2l0aW1hdGUgcmVzcG9uc2VzIHRoYXQgdXNlIGEgc2luZ2xlIG5ld2xpbmUgdG8gImZvbGQiIGhlYWRlcnMsIHdoaWNoIGlzCiAvLyB3aHkgaXQncyBub3QgeWV0IG9uIGJ5IGRlZmF1bHQuCi0jZGVmaW5lIFdPUktBUk9VTkRfRk9SX01JU1NJTkdfQ1IgICAgICAgMAorI2RlZmluZSBXT1JLQVJPVU5EX0ZPUl9NSVNTSU5HX0NSICAgICAgIDEKIAogc3RhdHVzX3QgSFRUUFN0cmVhbTo6cmVjZWl2ZV9saW5lKGNoYXIgKmxpbmUsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5jcHAKaW5kZXggYTRiZTJkZC4uZWM4MTA5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5jcHAKQEAgLTExMiw3ICsxMTIsOCBAQAogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAppbmRleCBmOTI1MWUxLi44MmMwNDI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvSUQzLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgpAQCAtNDU2LDYwICs0NTcsNzggQEAKICAgICBNUDNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUDNTb3VyY2UgJik7CiB9OwogCi1NUDNFeHRyYWN0b3I6Ok1QM0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKK01QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKICAgICAgIG1GaXhlZEhlYWRlcigwKSwKICAgICAgIG1CeXRlTnVtYmVyKDApIHsKICAgICBvZmZfdCBwb3MgPSAwOwogICAgIHVpbnQzMl90IGhlYWRlcjsKLSAgICBib29sIHN1Y2Nlc3MgPSBSZXN5bmMobURhdGFTb3VyY2UsIDAsICZwb3MsICZoZWFkZXIpOwotICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIGJvb2wgc3VjY2VzczsKIAotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOwotICAgICAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7CisgICAgaW50NjRfdCBtZXRhX29mZnNldDsKKyAgICB1aW50MzJfdCBtZXRhX2hlYWRlcjsKKyAgICBpZiAobWV0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50NjQoIm9mZnNldCIsICZtZXRhX29mZnNldCkKKyAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMigiaGVhZGVyIiwgKGludDMyX3QgKikmbWV0YV9oZWFkZXIpKSB7CisgICAgICAgIC8vIFRoZSBzbmlmZmVyIGhhcyBhbHJlYWR5IGRvbmUgYWxsIHRoZSBoYXJkIHdvcmsgZm9yIHVzLCBzaW1wbHkKKyAgICAgICAgLy8gYWNjZXB0IGl0cyBqdWRnZW1lbnQuCisgICAgICAgIHBvcyA9IChvZmZfdCltZXRhX29mZnNldDsKKyAgICAgICAgaGVhZGVyID0gbWV0YV9oZWFkZXI7CiAKLSAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7Ci0gICAgICAgIGludCBzYW1wbGVfcmF0ZTsKLSAgICAgICAgaW50IG51bV9jaGFubmVsczsKLSAgICAgICAgaW50IGJpdHJhdGU7Ci0gICAgICAgIGdldF9tcDNfZnJhbWVfc2l6ZSgKLSAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VjY2VzcyA9IFJlc3luYyhtRGF0YVNvdXJjZSwgMCwgJnBvcywgJmhlYWRlcik7CisgICAgfQogCi0gICAgICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAvLyBtSW5pdENoZWNrIHdpbGwgcmVtYWluIE5PX0lOSVQKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOworICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKIAotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICBwYXJzZV94aW5nX2hlYWRlcigKLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MsIE5VTEwsICZtQnl0ZU51bWJlciwKLSAgICAgICAgICAgICAgICBtVGFibGVPZkNvbnRlbnRzLCBOVUxMLCAmZHVyYXRpb24pOwotICAgICAgICBpZiAoZHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmZfdCBmaWxlU2l6ZTsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmZmlsZVNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbU1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgODAwMExMICogKGZpbGVTaXplIC0gbUZpcnN0RnJhbWVQb3MpIC8gYml0cmF0ZSk7Ci0gICAgICAgICAgICB9CisgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBudW1fY2hhbm5lbHM7CisgICAgaW50IGJpdHJhdGU7CisgICAgZ2V0X21wM19mcmFtZV9zaXplKAorICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSk7CisKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKKworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIHBhcnNlX3hpbmdfaGVhZGVyKAorICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zLCBOVUxMLCAmbUJ5dGVOdW1iZXIsCisgICAgICAgICAgICBtVGFibGVPZkNvbnRlbnRzLCBOVUxMLCAmZHVyYXRpb24pOworICAgIGlmIChkdXJhdGlvbiA+IDApIHsKKyAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZl90IGZpbGVTaXplOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmZpbGVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgbU1ldGEtPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIDgwMDBMTCAqIChmaWxlU2l6ZSAtIG1GaXJzdEZyYW1lUG9zKSAvIGJpdHJhdGUpOwogICAgICAgICB9CiAgICAgfQotfQogCi1NUDNFeHRyYWN0b3I6On5NUDNFeHRyYWN0b3IoKSB7CisgICAgbUluaXRDaGVjayA9IE9LOwogfQogCiBzaXplX3QgTVAzRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gKG1GaXJzdEZyYW1lUG9zIDwgMCkgPyAwIDogMTsKKyAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOwogfQogCiBzcDxNZWRpYVNvdXJjZT4gTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAobUZpcnN0RnJhbWVQb3MgPCAwIHx8IGluZGV4ICE9IDApIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNTE5LDcgKzUzOCw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIGlmIChtRmlyc3RGcmFtZVBvcyA8IDAgfHwgaW5kZXggIT0gMCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC01ODYsNyArNjA1LDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKICAgICAgICAgaWYgKCFtTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKICAgICAgICAgICAgIC8vIGJpdHJhdGUgaXMgaW4gYml0cy9zZWMuCkBAIC02MzQsNiArNjU0LDcgQEAKICAgICB9CiAKICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgYml0cmF0ZTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlci0+ZGF0YSgpLCA0KTsKICAgICAgICAgaWYgKG4gPCA0KSB7CkBAIC02NDYsNyArNjY3LDcgQEAKICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gVTMyX0FUKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkpOwogCiAgICAgICAgIGlmICgoaGVhZGVyICYga01hc2spID09IChtRml4ZWRIZWFkZXIgJiBrTWFzaykKLSAgICAgICAgICAgICYmIGdldF9tcDNfZnJhbWVfc2l6ZShoZWFkZXIsICZmcmFtZV9zaXplKSkgeworICAgICAgICAgICAgJiYgZ2V0X21wM19mcmFtZV9zaXplKGhlYWRlciwgJmZyYW1lX3NpemUsIE5VTEwsIE5VTEwsICZiaXRyYXRlKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjgxLDkgKzcwMiwxMCBAQAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lX3NpemUpOwogCiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKLSAgICBtQ3VycmVudFRpbWVVcyArPSAxMTUyICogMTAwMDAwMCAvIDQ0MTAwOworICAgIG1DdXJyZW50VGltZVVzICs9IGZyYW1lX3NpemUgKiA4MDAwbGwgLyBiaXRyYXRlOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIApAQCAtNjkzLDcgKzcxNSw3IEBACiBzcDxNZXRhRGF0YT4gTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKIAotICAgIGlmIChtRmlyc3RGcmFtZVBvcyA8IDApIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKQEAgLTc1NiwxNSArNzc4LDIwIEBACiB9CiAKIGJvb2wgU25pZmZNUDMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKKyAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSkgewogICAgIG9mZl90IHBvcyA9IDA7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgICptZXRhID0gbmV3IEFNZXNzYWdlOworICAgICgqbWV0YSktPnNldEludDY0KCJvZmZzZXQiLCBwb3MpOworICAgICgqbWV0YSktPnNldEludDMyKCJoZWFkZXIiLCBoZWFkZXIpOworCiAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAqY29uZmlkZW5jZSA9IDAuM2Y7CisgICAgKmNvbmZpZGVuY2UgPSAwLjJmOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTJiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtMCwwICsxLDgxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzJUU1dyaXRlciIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbyA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgU291cmNlSW5mbyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2b2lkIHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKyAgICB2b2lkIHN0b3AoKTsKKworICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBpbmNyZW1lbnRDb250aW51aXR5Q291bnRlcigpOworCisgICAgZW51bSB7CisgICAgICAgIGtOb3RpZnlTdGFydEZhaWxlZCwKKyAgICAgICAga05vdGlmeUJ1ZmZlciwKKyAgICAgICAga05vdGlmeVJlYWNoZWRFT1MsCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIH5Tb3VyY2VJbmZvKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U3RhcnQgPSAnc3RydCcsCisgICAgICAgIGtXaGF0UmVhZCAgPSAncmVhZCcsCisgICAgfTsKKworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisKKyAgICBzcDxBQnVmZmVyPiBtQUFDQ29kZWNTcGVjaWZpY0RhdGE7CisKKyAgICBzcDxBQnVmZmVyPiBtQUFDQnVmZmVyOworCisgICAgdW5zaWduZWQgbVN0cmVhbVR5cGU7CisgICAgdW5zaWduZWQgbUNvbnRpbnVpdHlDb3VudGVyOworCisgICAgdm9pZCBleHRyYWN0Q29kZWNTcGVjaWZpY0RhdGEoKTsKKworICAgIHZvaWQgYXBwZW5kQUFDRnJhbWVzKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZvaWQgZmx1c2hBQUNGcmFtZXMoKTsKKworICAgIHZvaWQgcG9zdEFWQ0ZyYW1lKE1lZGlhQnVmZmVyICpidWZmZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlSW5mbyk7Cit9OworCitNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpTb3VyY2VJbmZvKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtU3RyZWFtVHlwZSgwKSwKKyAgICAgIG1Db250aW51aXR5Q291bnRlcigwKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZSgiTVBFRzJUU1dyaXRlciBzb3VyY2UiKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IDB4MGY7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gMHgxYjsKKyAgICB9IGVsc2UgeworICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6flNvdXJjZUluZm8oKSB7Cit9CisKK3Vuc2lnbmVkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OnN0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJlYW1UeXBlOworfQorCit1bnNpZ25lZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjppbmNyZW1lbnRDb250aW51aXR5Q291bnRlcigpIHsKKyAgICBpZiAoKyttQ29udGludWl0eUNvdW50ZXIgPT0gMTYpIHsKKyAgICAgICAgbUNvbnRpbnVpdHlDb3VudGVyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbUNvbnRpbnVpdHlDb3VudGVyOworfQorCit2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OnN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICBtTm90aWZ5ID0gbm90aWZ5OworCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpzdG9wKCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgIG1Mb29wZXItPnN0b3AoKTsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpleHRyYWN0Q29kZWNTcGVjaWZpY0RhdGEoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAvLyBDb2RlYyBzcGVjaWZpYyBkYXRhIGJldHRlciBiZSBpbiB0aGUgZmlyc3QgZGF0YSBidWZmZXIuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpjb2RlY19zcGVjaWZpY19kYXRhOworICAgICAgICBzaXplX3QgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOworICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAorICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKSZjb2RlY19zcGVjaWZpY19kYXRhLCAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKKworICAgICAgICBDSEVDS19HRShjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsIDJ1KTsKKworICAgICAgICBtQUFDQ29kZWNTcGVjaWZpY0RhdGEgPSBuZXcgQUJ1ZmZlcihjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOworCisgICAgICAgIG1lbWNweShtQUFDQ29kZWNTcGVjaWZpY0RhdGEtPmRhdGEoKSwgY29kZWNfc3BlY2lmaWNfZGF0YSwKKyAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAvLyBDb2RlYyBzcGVjaWZpYyBkYXRhIGJldHRlciBiZSBwYXJ0IG9mIHRoZSBkYXRhIHN0cmVhbSB0aGVuLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gb3V0ID0gbmV3IEFCdWZmZXIoMTAyNCk7CisgICAgb3V0LT5zZXRSYW5nZSgwLCAwKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIHNpemVfdCBudW1TZXFQYXJhbWV0ZXJTZXRzID0gcHRyWzVdICYgMzE7CisKKyAgICBwdHIgKz0gNjsKKyAgICBzaXplIC09IDY7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlcVBhcmFtZXRlclNldHM7ICsraSkgeworICAgICAgICBDSEVDSyhzaXplID49IDIpOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICBDSEVDSyhzaXplID49IGxlbmd0aCk7CisKKyAgICAgICAgQ0hFQ0tfTEUob3V0LT5zaXplKCkgKyA0ICsgbGVuZ3RoLCBvdXQtPmNhcGFjaXR5KCkpOworICAgICAgICBtZW1jcHkob3V0LT5kYXRhKCkgKyBvdXQtPnNpemUoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKyAgICAgICAgbWVtY3B5KG91dC0+ZGF0YSgpICsgb3V0LT5zaXplKCkgKyA0LCBwdHIsIGxlbmd0aCk7CisgICAgICAgIG91dC0+c2V0UmFuZ2UoMCwgb3V0LT5zaXplKCkgKyBsZW5ndGggKyA0KTsKKworICAgICAgICBwdHIgKz0gbGVuZ3RoOworICAgICAgICBzaXplIC09IGxlbmd0aDsKKyAgICB9CisKKyAgICBDSEVDSyhzaXplID49IDEpOworICAgIHNpemVfdCBudW1QaWN0dXJlUGFyYW1ldGVyU2V0cyA9ICpwdHI7CisgICAgKytwdHI7CisgICAgLS1zaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QaWN0dXJlUGFyYW1ldGVyU2V0czsgKytpKSB7CisgICAgICAgIENIRUNLKHNpemUgPj0gMik7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIENIRUNLKHNpemUgPj0gbGVuZ3RoKTsKKworICAgICAgICBDSEVDS19MRShvdXQtPnNpemUoKSArIDQgKyBsZW5ndGgsIG91dC0+Y2FwYWNpdHkoKSk7CisgICAgICAgIG1lbWNweShvdXQtPmRhdGEoKSArIG91dC0+c2l6ZSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICBtZW1jcHkob3V0LT5kYXRhKCkgKyBvdXQtPnNpemUoKSArIDQsIHB0ciwgbGVuZ3RoKTsKKyAgICAgICAgb3V0LT5zZXRSYW5nZSgwLCBvdXQtPnNpemUoKSArIGxlbmd0aCArIDQpOworCisgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgIH0KKworICAgIG91dC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga05vdGlmeUJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRPYmplY3QoImJ1ZmZlciIsIG91dCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6cG9zdEFWQ0ZyYW1lKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtOb3RpZnlCdWZmZXIpOworCisgICAgc3A8QUJ1ZmZlcj4gY29weSA9CisgICAgICAgIG5ldyBBQnVmZmVyKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIG1lbWNweShjb3B5LT5kYXRhKCksCisgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkKKyAgICAgICAgICAgICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBjb3B5LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgaW50MzJfdCBpc1N5bmM7CisgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpCisgICAgICAgICAgICAmJiBpc1N5bmMgIT0gMCkgeworICAgICAgICBjb3B5LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCB0cnVlKTsKKyAgICB9CisKKyAgICBub3RpZnktPnNldE9iamVjdCgiYnVmZmVyIiwgY29weSk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6YXBwZW5kQUFDRnJhbWVzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAobUFBQ0J1ZmZlciAhPSBOVUxMCisgICAgICAgICAgICAmJiBtQUFDQnVmZmVyLT5zaXplKCkgKyA3ICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICA+IG1BQUNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgZmx1c2hBQUNGcmFtZXMoKTsKKyAgICB9CisKKyAgICBpZiAobUFBQ0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHNpemVfdCBhbGxvYyA9IDQwOTY7CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgNyA+IGFsbG9jKSB7CisgICAgICAgICAgICBhbGxvYyA9IDcgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgbUFBQ0J1ZmZlciA9IG5ldyBBQnVmZmVyKGFsbG9jKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICAgICAgbUFBQ0J1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgbUFBQ0J1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgdHJ1ZSk7CisKKyAgICAgICAgbUFBQ0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqY29kZWNfc3BlY2lmaWNfZGF0YSA9IG1BQUNDb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpOworCisgICAgdW5zaWduZWQgcHJvZmlsZSA9IChjb2RlY19zcGVjaWZpY19kYXRhWzBdID4+IDMpIC0gMTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPQorICAgICAgICAoKGNvZGVjX3NwZWNpZmljX2RhdGFbMF0gJiA3KSA8PCAxKQorICAgICAgICB8IChjb2RlY19zcGVjaWZpY19kYXRhWzFdID4+IDcpOworCisgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0KKyAgICAgICAgKGNvZGVjX3NwZWNpZmljX2RhdGFbMV0gPj4gMykgJiAweDBmOworCisgICAgdWludDhfdCAqcHRyID0gbUFBQ0J1ZmZlci0+ZGF0YSgpICsgbUFBQ0J1ZmZlci0+c2l6ZSgpOworCisgICAgY29uc3QgdWludDMyX3QgYWFjX2ZyYW1lX2xlbmd0aCA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyA3OworCisgICAgKnB0cisrID0gMHhmZjsKKyAgICAqcHRyKysgPSAweGYxOyAgLy8gYjExMTEwMDAxLCBJRD0wLCBsYXllcj0wLCBwcm90ZWN0aW9uX2Fic2VudD0xCisKKyAgICAqcHRyKysgPQorICAgICAgICBwcm9maWxlIDw8IDYKKyAgICAgICAgfCBzYW1wbGluZ19mcmVxX2luZGV4IDw8IDIKKyAgICAgICAgfCAoKGNoYW5uZWxfY29uZmlndXJhdGlvbiA+PiAyKSAmIDEpOyAgLy8gcHJpdmF0ZV9iaXQ9MAorCisgICAgLy8gb3JpZ2luYWxfY29weT0wLCBob21lPTAsIGNvcHlyaWdodF9pZF9iaXQ9MCwgY29weXJpZ2h0X2lkX3N0YXJ0PTAKKyAgICAqcHRyKysgPQorICAgICAgICAoY2hhbm5lbF9jb25maWd1cmF0aW9uICYgMykgPDwgNgorICAgICAgICB8IGFhY19mcmFtZV9sZW5ndGggPj4gMTE7CisgICAgKnB0cisrID0gKGFhY19mcmFtZV9sZW5ndGggPj4gMykgJiAweGZmOworICAgICpwdHIrKyA9IChhYWNfZnJhbWVfbGVuZ3RoICYgNykgPDwgNTsKKworICAgIC8vIGFkdHNfYnVmZmVyX2Z1bGxuZXNzPTAsIG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWU9MAorICAgICpwdHIrKyA9IDA7CisKKyAgICBtZW1jcHkocHRyLAorICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBwdHIgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIG1BQUNCdWZmZXItPnNldFJhbmdlKDAsIHB0ciAtIG1BQUNCdWZmZXItPmRhdGEoKSk7Cit9CisKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6Zmx1c2hBQUNGcmFtZXMoKSB7CisgICAgaWYgKG1BQUNCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrTm90aWZ5QnVmZmVyKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgiYnVmZmVyIiwgbUFBQ0J1ZmZlcik7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICBtQUFDQnVmZmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtOb3RpZnlTdGFydEZhaWxlZCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4dHJhY3RDb2RlY1NwZWNpZmljRGF0YSgpOworCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWFkOgorICAgICAgICB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZSA9PSAweDBmKSB7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoQUFDRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrTm90aWZ5UmVhY2hlZEVPUyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic3RhdHVzIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZSA9PSAweDBmICYmIG1BQUNDb2RlY1NwZWNpZmljRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBidWZmZXIgY29udGFpbnMgY29kZWMgc3BlY2lmaWMgZGF0YS4KKworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShidWZmZXItPnJhbmdlX2xlbmd0aCgpLCAydSk7CisKKyAgICAgICAgICAgICAgICAgICAgbUFBQ0NvZGVjU3BlY2lmaWNEYXRhID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1BQUNDb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1UeXBlID09IDB4MGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEFBQ0ZyYW1lcyhidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFWQ0ZyYW1lKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNUEVHMlRTV3JpdGVyOjpNUEVHMlRTV3JpdGVyKGludCBmZCkKKyAgICA6IG1GaWxlKGZkb3BlbihmZCwgIndiIikpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbU51bVNvdXJjZXNEb25lKDApLAorICAgICAgbU51bVRTUGFja2V0c1dyaXR0ZW4oMCksCisgICAgICBtTnVtVFNQYWNrZXRzQmVmb3JlTWV0YSgwKSB7CisgICAgaW5pdCgpOworfQorCitNUEVHMlRTV3JpdGVyOjpNUEVHMlRTV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1OdW1Tb3VyY2VzRG9uZSgwKSwKKyAgICAgIG1OdW1UU1BhY2tldHNXcml0dGVuKDApLAorICAgICAgbU51bVRTUGFja2V0c0JlZm9yZU1ldGEoMCkgeworICAgIGluaXQoKTsKK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjppbml0KCkgeworICAgIENIRUNLKG1GaWxlICE9IE5VTEwpOworCisgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Mb29wZXItPnNldE5hbWUoIk1QRUcyVFNXcml0ZXIiKTsKKworICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8TVBFRzJUU1dyaXRlcj4odGhpcyk7CisKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisgICAgbUxvb3Blci0+c3RhcnQoKTsKK30KKworTVBFRzJUU1dyaXRlcjo6fk1QRUcyVFNXcml0ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7CisKKyAgICBmY2xvc2UobUZpbGUpOworICAgIG1GaWxlID0gTlVMTDsKK30KKworc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKKyAgICAgICAgICAgICYmIHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc3A8U291cmNlSW5mbz4gaW5mbyA9IG5ldyBTb3VyY2VJbmZvKHNvdXJjZSk7CisKKyAgICBtU291cmNlcy5wdXNoKGluZm8pOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW0pIHsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1OdW1Tb3VyY2VzRG9uZSA9IDA7CisgICAgbU51bVRTUGFja2V0c1dyaXR0ZW4gPSAwOworICAgIG1OdW1UU1BhY2tldHNCZWZvcmVNZXRhID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9CisgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworCisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNvdXJjZS1pbmRleCIsIGkpOworCisgICAgICAgIG1Tb3VyY2VzLmVkaXRJdGVtQXQoaSktPnN0YXJ0KG5vdGlmeSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpzdG9wKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbVNvdXJjZXMuZWRpdEl0ZW1BdChpKS0+c3RvcCgpOworICAgIH0KKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpwYXVzZSgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTVBFRzJUU1dyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gIW1TdGFydGVkIHx8IChtTnVtU291cmNlc0RvbmUgPT0gbVNvdXJjZXMuc2l6ZSgpID8gdHJ1ZSA6IGZhbHNlKTsKK30KKworc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTb3VyY2VOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3Qgc291cmNlSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic291cmNlLWluZGV4IiwgJnNvdXJjZUluZGV4KSk7CisKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgICAgICAgICAgaWYgKHdoYXQgPT0gU291cmNlSW5mbzo6a05vdGlmeVJlYWNoZWRFT1MKKyAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBTb3VyY2VJbmZvOjprTm90aWZ5U3RhcnRGYWlsZWQpIHsKKyAgICAgICAgICAgICAgICArK21OdW1Tb3VyY2VzRG9uZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBTb3VyY2VJbmZvOjprTm90aWZ5QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOworCisgICAgICAgICAgICAgICAgd3JpdGVUUygpOworCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIHdyaXRlQWNjZXNzVW5pdChzb3VyY2VJbmRleCwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit2b2lkIE1QRUcyVFNXcml0ZXI6OndyaXRlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoKSB7CisgICAgLy8gMHg0NworICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAorICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQorICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCisgICAgLy8gUElEID0gYjAwMDAwMDAwMDAwMDAgKDEzIGJpdHMpCisgICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAorICAgIC8vIGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9IGIwMSAobm8gYWRhcHRhdGlvbiBmaWVsZCwgcGF5bG9hZCBvbmx5KQorICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/CisgICAgLy8gc2tpcCA9IDB4MDAKKyAgICAvLyAtLS0gcGF5bG9hZCBmb2xsb3dzCisgICAgLy8gdGFibGVfaWQgPSAweDAwCisgICAgLy8gc2VjdGlvbl9zeW50YXhfaW5kaWNhdG9yID0gYjEKKyAgICAvLyBtdXN0X2JlX3plcm8gPSBiMAorICAgIC8vIHJlc2VydmVkID0gYjExCisgICAgLy8gc2VjdGlvbl9sZW5ndGggPSAweDAwZAorICAgIC8vIHRyYW5zcG9ydF9zdHJlYW1faWQgPSAweDAwMDAKKyAgICAvLyByZXNlcnZlZCA9IGIxMQorICAgIC8vIHZlcnNpb25fbnVtYmVyID0gYjAwMDAxCisgICAgLy8gY3VycmVudF9uZXh0X2luZGljYXRvciA9IGIxCisgICAgLy8gc2VjdGlvbl9udW1iZXIgPSAweDAwCisgICAgLy8gbGFzdF9zZWN0aW9uX251bWJlciA9IDB4MDAKKyAgICAvLyAgIG9uZSBwcm9ncmFtIGZvbGxvd3M6CisgICAgLy8gICBwcm9ncmFtX251bWJlciA9IDB4MDAwMQorICAgIC8vICAgcmVzZXJ2ZWQgPSBiMTExCisgICAgLy8gICBwcm9ncmFtX21hcF9QSUQgPSAweDAxZTAgKDEzIGJpdHMhKQorICAgIC8vIENSQyA9IDB4Pz8/Pz8/Pz8KKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7CisgICAgICAgIDB4NDcsCisgICAgICAgIDB4NDAsIDB4MDAsIDB4MTAsIDB4MDAsICAvLyBiMDEwMCAwMDAwIDAwMDAgMDAwMCAwMDAxID8/Pz8gMDAwMCAwMDAwCisgICAgICAgIDB4MDAsIDB4YjAsIDB4MGQsIDB4MDAsICAvLyBiMDAwMCAwMDAwIDEwMTEgMDAwMCAwMDAwIDExMDEgMDAwMCAwMDAwCisgICAgICAgIDB4MDAsIDB4YzMsIDB4MDAsIDB4MDAsICAvLyBiMDAwMCAwMDAwIDExMDAgMDAxMSAwMDAwIDAwMDAgMDAwMCAwMDAwCisgICAgICAgIDB4MDAsIDB4MDEsIDB4ZTEsIDB4ZTAsICAvLyBiMDAwMCAwMDAwIDAwMDAgMDAwMSAxMTEwIDAwMDEgMTExMCAwMDAwCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAvLyBiPz8/PyA/Pz8/ID8/Pz8gPz8/PyA/Pz8/ID8/Pz8gPz8/PyA/Pz8/CisgICAgfTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDE4OCk7CisgICAgbWVtc2V0KGJ1ZmZlci0+ZGF0YSgpLCAwLCBidWZmZXItPnNpemUoKSk7CisgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBrRGF0YSwgc2l6ZW9mKGtEYXRhKSk7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0NvbnRpbnVpdHlDb3VudGVyID0gNTsKKyAgICBidWZmZXItPmRhdGEoKVszXSB8PSBrQ29udGludWl0eUNvdW50ZXI7CisKKyAgICBDSEVDS19FUShmd3JpdGUoYnVmZmVyLT5kYXRhKCksIDEsIGJ1ZmZlci0+c2l6ZSgpLCBtRmlsZSksIGJ1ZmZlci0+c2l6ZSgpKTsKK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjp3cml0ZVByb2dyYW1NYXAoKSB7CisgICAgLy8gMHg0NworICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAorICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQorICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCisgICAgLy8gUElEID0gYjAgMDAwMSAxMTEwIDAwMDAgKDEzIGJpdHMpIFsweDFlMF0KKyAgICAvLyB0cmFuc3BvcnRfc2NyYW1ibGluZ19jb250cm9sID0gYjAwCisgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYjAxIChubyBhZGFwdGF0aW9uIGZpZWxkLCBwYXlsb2FkIG9ubHkpCisgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYj8/Pz8KKyAgICAvLyBza2lwID0gMHgwMAorICAgIC8vIC0tIHBheWxvYWQgZm9sbG93cworICAgIC8vIHRhYmxlX2lkID0gMHgwMgorICAgIC8vIHNlY3Rpb25fc3ludGF4X2luZGljYXRvciA9IGIxCisgICAgLy8gbXVzdF9iZV96ZXJvID0gYjAKKyAgICAvLyByZXNlcnZlZCA9IGIxMQorICAgIC8vIHNlY3Rpb25fbGVuZ3RoID0gMHg/Pz8KKyAgICAvLyBwcm9ncmFtX251bWJlciA9IDB4MDAwMQorICAgIC8vIHJlc2VydmVkID0gYjExCisgICAgLy8gdmVyc2lvbl9udW1iZXIgPSBiMDAwMDEKKyAgICAvLyBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gYjEKKyAgICAvLyBzZWN0aW9uX251bWJlciA9IDB4MDAKKyAgICAvLyBsYXN0X3NlY3Rpb25fbnVtYmVyID0gMHgwMAorICAgIC8vIHJlc2VydmVkID0gYjExMQorICAgIC8vIFBDUl9QSUQgPSBiPyA/Pz8/ID8/Pz8gPz8/PyAoMTMgYml0cykKKyAgICAvLyByZXNlcnZlZCA9IGIxMTExCisgICAgLy8gcHJvZ3JhbV9pbmZvX2xlbmd0aCA9IDB4MDAwCisgICAgLy8gICBvbmUgb3IgbW9yZSBlbGVtZW50YXJ5IHN0cmVhbSBkZXNjcmlwdGlvbnMgZm9sbG93OgorICAgIC8vICAgc3RyZWFtX3R5cGUgPSAweD8/CisgICAgLy8gICByZXNlcnZlZCA9IGIxMTEKKyAgICAvLyAgIGVsZW1lbnRhcnlfUElEID0gYj8gPz8/PyA/Pz8/ID8/Pz8gKDEzIGJpdHMpCisgICAgLy8gICByZXNlcnZlZCA9IGIxMTExCisgICAgLy8gICBFU19pbmZvX2xlbmd0aCA9IDB4MDAwCisgICAgLy8gQ1JDID0gMHg/Pz8/Pz8/PworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFbXSA9IHsKKyAgICAgICAgMHg0NywKKyAgICAgICAgMHg0MSwgMHhlMCwgMHgxMCwgMHgwMCwgIC8vIGIwMTAwIDAwMDEgMTExMCAwMDAwIDAwMDEgPz8/PyAwMDAwIDAwMDAKKyAgICAgICAgMHgwMiwgMHhiMCwgMHgwMCwgMHgwMCwgIC8vIGIwMDAwIDAwMTAgMTAxMSA/Pz8/ID8/Pz8gPz8/PyAwMDAwIDAwMDAKKyAgICAgICAgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgIC8vIGIwMDAwIDAwMDEgMTEwMCAwMDExIDAwMDAgMDAwMCAwMDAwIDAwMDAKKyAgICAgICAgMHhlMCwgMHgwMCwgMHhmMCwgMHgwMCAgIC8vIGIxMTE/ID8/Pz8gPz8/PyA/Pz8/IDExMTEgMDAwMCAwMDAwIDAwMDAKKyAgICB9OworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMTg4KTsKKyAgICBtZW1zZXQoYnVmZmVyLT5kYXRhKCksIDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQ29udGludWl0eUNvdW50ZXIgPSA1OworICAgIGJ1ZmZlci0+ZGF0YSgpWzNdIHw9IGtDb250aW51aXR5Q291bnRlcjsKKworICAgIHNpemVfdCBzZWN0aW9uX2xlbmd0aCA9IDUgKiBtU291cmNlcy5zaXplKCkgKyA0ICsgOTsKKyAgICBidWZmZXItPmRhdGEoKVs2XSB8PSBzZWN0aW9uX2xlbmd0aCA+PiA4OworICAgIGJ1ZmZlci0+ZGF0YSgpWzddID0gc2VjdGlvbl9sZW5ndGggJiAweGZmOworCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtQQ1JfUElEID0gMHgxZTE7CisgICAgYnVmZmVyLT5kYXRhKClbMTNdIHw9IChrUENSX1BJRCA+PiA4KSAmIDB4MWY7CisgICAgYnVmZmVyLT5kYXRhKClbMTRdID0ga1BDUl9QSUQgJiAweGZmOworCisgICAgdWludDhfdCAqcHRyID0gJmJ1ZmZlci0+ZGF0YSgpW3NpemVvZihrRGF0YSldOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgKnB0cisrID0gbVNvdXJjZXMuZWRpdEl0ZW1BdChpKS0+c3RyZWFtVHlwZSgpOworCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIEVTX1BJRCA9IDB4MWUwICsgaSArIDE7CisgICAgICAgICpwdHIrKyA9IDB4ZTAgfCAoRVNfUElEID4+IDgpOworICAgICAgICAqcHRyKysgPSBFU19QSUQgJiAweGZmOworICAgICAgICAqcHRyKysgPSAweGYwOworICAgICAgICAqcHRyKysgPSAweDAwOworICAgIH0KKworICAgICpwdHIrKyA9IDB4MDA7CisgICAgKnB0cisrID0gMHgwMDsKKyAgICAqcHRyKysgPSAweDAwOworICAgICpwdHIrKyA9IDB4MDA7CisKKyAgICBDSEVDS19FUShmd3JpdGUoYnVmZmVyLT5kYXRhKCksIDEsIGJ1ZmZlci0+c2l6ZSgpLCBtRmlsZSksIGJ1ZmZlci0+c2l6ZSgpKTsKK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjp3cml0ZUFjY2Vzc1VuaXQoCisgICAgICAgIGludDMyX3Qgc291cmNlSW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgLy8gMHg0NworICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAorICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQorICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCisgICAgLy8gUElEID0gYjAgMDAwMSAxMTEwID8/Pz8gKDEzIGJpdHMpIFsweDFlMCArIDEgKyBzb3VyY2VJbmRleF0KKyAgICAvLyB0cmFuc3BvcnRfc2NyYW1ibGluZ19jb250cm9sID0gYjAwCisgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYjAxIChubyBhZGFwdGF0aW9uIGZpZWxkLCBwYXlsb2FkIG9ubHkpCisgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYj8/Pz8KKyAgICAvLyAtLSBwYXlsb2FkIGZvbGxvd3MKKyAgICAvLyBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IDB4MDAwMDAxCisgICAgLy8gc3RyZWFtX2lkID0gMHg/PyAoMHhlMCBmb3IgYXZjIHZpZGVvLCAweGMwIGZvciBhYWMgYXVkaW8pCisgICAgLy8gUEVTX3BhY2tldF9sZW5ndGggPSAweD8/Pz8KKyAgICAvLyByZXNlcnZlZCA9IGIxMAorICAgIC8vIFBFU19zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKKyAgICAvLyBQRVNfcHJpb3JpdHkgPSBiMAorICAgIC8vIGRhdGFfYWxpZ25tZW50X2luZGljYXRvciA9IGIxCisgICAgLy8gY29weXJpZ2h0ID0gYjAKKyAgICAvLyBvcmlnaW5hbF9vcl9jb3B5ID0gYjAKKyAgICAvLyBQVFNfRFRTX2ZsYWdzID0gYjEwICAoUFRTIG9ubHkpCisgICAgLy8gRVNDUl9mbGFnID0gYjAKKyAgICAvLyBFU19yYXRlX2ZsYWcgPSBiMAorICAgIC8vIERTTV90cmlja19tb2RlX2ZsYWcgPSBiMAorICAgIC8vIGFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWcgPSBiMAorICAgIC8vIFBFU19DUkNfZmxhZyA9IGIwCisgICAgLy8gUEVTX2V4dGVuc2lvbl9mbGFnID0gYjAKKyAgICAvLyBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gMHgwNQorICAgIC8vIHJlc2VydmVkID0gYjAwMTAgKFBUUykKKyAgICAvLyBQVFNbMzIuLjMwXSA9IGI/Pz8KKyAgICAvLyByZXNlcnZlZCA9IGIxCisgICAgLy8gUFRTWzI5Li4xNV0gPSBiPz8/ID8/Pz8gPz8/PyA/Pz8/ICgxNSBiaXRzKQorICAgIC8vIHJlc2VydmVkID0gYjEKKyAgICAvLyBQVFNbMTQuLjBdID0gYj8/PyA/Pz8/ID8/Pz8gPz8/PyAoMTUgYml0cykKKyAgICAvLyByZXNlcnZlZCA9IGIxCisgICAgLy8gdGhlIGZpcnN0IGZyYWdtZW50IG9mICJidWZmZXIiIGZvbGxvd3MKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDE4OCk7CisgICAgbWVtc2V0KGJ1ZmZlci0+ZGF0YSgpLCAwLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBQSUQgPSAweDFlMCArIHNvdXJjZUluZGV4ICsgMTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciA9CisgICAgICAgIG1Tb3VyY2VzLmVkaXRJdGVtQXQoc291cmNlSW5kZXgpLT5pbmNyZW1lbnRDb250aW51aXR5Q291bnRlcigpOworCisgICAgLy8gWFhYIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdHJlYW1zIG9mIGEga2luZCAobW9yZSB0aGFuIDEgYXVkaW8gb3IKKyAgICAvLyBtb3JlIHRoYW4gMSB2aWRlbykgdGhleSBuZWVkIGRpc3RpbmN0IHN0cmVhbV9pZHMuCisgICAgY29uc3QgdW5zaWduZWQgc3RyZWFtX2lkID0KKyAgICAgICAgbVNvdXJjZXMuZWRpdEl0ZW1BdChzb3VyY2VJbmRleCktPnN0cmVhbVR5cGUoKSA9PSAweDBmID8gMHhjMCA6IDB4ZTA7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgdWludDMyX3QgUFRTID0gKHRpbWVVcyAqIDlsbCkgLyAxMDBsbDsKKworICAgIHNpemVfdCBQRVNfcGFja2V0X2xlbmd0aCA9IGFjY2Vzc1VuaXQtPnNpemUoKSArIDg7CisKKyAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPj0gNjU1MzYpIHsKKyAgICAgICAgLy8gVGhpcyByZWFsbHkgc2hvdWxkIG9ubHkgaGFwcGVuIGZvciB2aWRlby4KKyAgICAgICAgQ0hFQ0tfRVEoc3RyZWFtX2lkLCAweGUwdSk7CisKKyAgICAgICAgLy8gSXQncyB2YWxpZCB0byBzZXQgdGhpcyB0byAwIGZvciB2aWRlbyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNzLgorICAgICAgICBQRVNfcGFja2V0X2xlbmd0aCA9IDA7CisgICAgfQorCisgICAgdWludDhfdCAqcHRyID0gYnVmZmVyLT5kYXRhKCk7CisgICAgKnB0cisrID0gMHg0NzsKKyAgICAqcHRyKysgPSAweDQwIHwgKFBJRCA+PiA4KTsKKyAgICAqcHRyKysgPSBQSUQgJiAweGZmOworICAgICpwdHIrKyA9IDB4MTAgfCBjb250aW51aXR5X2NvdW50ZXI7CisgICAgKnB0cisrID0gMHgwMDsKKyAgICAqcHRyKysgPSAweDAwOworICAgICpwdHIrKyA9IDB4MDE7CisgICAgKnB0cisrID0gc3RyZWFtX2lkOworICAgICpwdHIrKyA9IFBFU19wYWNrZXRfbGVuZ3RoID4+IDg7CisgICAgKnB0cisrID0gUEVTX3BhY2tldF9sZW5ndGggJiAweGZmOworICAgICpwdHIrKyA9IDB4ODQ7CisgICAgKnB0cisrID0gMHg4MDsKKyAgICAqcHRyKysgPSAweDA1OworICAgICpwdHIrKyA9IDB4MjAgfCAoKChQVFMgPj4gMzApICYgNykgPDwgMSkgfCAxOworICAgICpwdHIrKyA9IChQVFMgPj4gMjIpICYgMHhmZjsKKyAgICAqcHRyKysgPSAoKChQVFMgPj4gMTUpICYgMHg3ZikgPDwgMSkgfCAxOworICAgICpwdHIrKyA9IChQVFMgPj4gNykgJiAweGZmOworICAgICpwdHIrKyA9ICgoUFRTICYgMHg3ZikgPDwgMSkgfCAxOworCisgICAgc2l6ZV90IHNpemVMZWZ0ID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKSAtIHB0cjsKKyAgICBzaXplX3QgY29weSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKyAgICBpZiAoY29weSA+IHNpemVMZWZ0KSB7CisgICAgICAgIGNvcHkgPSBzaXplTGVmdDsKKyAgICB9CisKKyAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCksIGNvcHkpOworCisgICAgQ0hFQ0tfRVEoZndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCAxLCBidWZmZXItPnNpemUoKSwgbUZpbGUpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gY29weTsKKyAgICB3aGlsZSAob2Zmc2V0IDwgYWNjZXNzVW5pdC0+c2l6ZSgpKSB7CisgICAgICAgIC8vIGZvciBzdWJzZXF1ZW50IGZyYWdtZW50cyBvZiAiYnVmZmVyIjoKKyAgICAgICAgLy8gMHg0NworICAgICAgICAvLyB0cmFuc3BvcnRfZXJyb3JfaW5kaWNhdG9yID0gYjAKKyAgICAgICAgLy8gcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciA9IGIwCisgICAgICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCisgICAgICAgIC8vIFBJRCA9IGIwIDAwMDEgMTExMCA/Pz8/ICgxMyBiaXRzKSBbMHgxZTAgKyAxICsgc291cmNlSW5kZXhdCisgICAgICAgIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKKyAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYjAxIChubyBhZGFwdGF0aW9uIGZpZWxkLCBwYXlsb2FkIG9ubHkpCisgICAgICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/CisgICAgICAgIC8vIHRoZSBmcmFnbWVudCBvZiAiYnVmZmVyIiBmb2xsb3dzLgorCisgICAgICAgIG1lbXNldChidWZmZXItPmRhdGEoKSwgMCwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciA9CisgICAgICAgICAgICBtU291cmNlcy5lZGl0SXRlbUF0KHNvdXJjZUluZGV4KS0+aW5jcmVtZW50Q29udGludWl0eUNvdW50ZXIoKTsKKworICAgICAgICBwdHIgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgKnB0cisrID0gMHg0NzsKKyAgICAgICAgKnB0cisrID0gMHgwMCB8IChQSUQgPj4gOCk7CisgICAgICAgICpwdHIrKyA9IFBJRCAmIDB4ZmY7CisgICAgICAgICpwdHIrKyA9IDB4MTAgfCBjb250aW51aXR5X2NvdW50ZXI7CisKKyAgICAgICAgc2l6ZV90IHNpemVMZWZ0ID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKSAtIHB0cjsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBhY2Nlc3NVbml0LT5zaXplKCkgLSBvZmZzZXQ7CisgICAgICAgIGlmIChjb3B5ID4gc2l6ZUxlZnQpIHsKKyAgICAgICAgICAgIGNvcHkgPSBzaXplTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShwdHIsIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgY29weSk7CisgICAgICAgIENIRUNLX0VRKGZ3cml0ZShidWZmZXItPmRhdGEoKSwgMSwgYnVmZmVyLT5zaXplKCksIG1GaWxlKSwKKyAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgIG9mZnNldCArPSBjb3B5OworICAgIH0KK30KKwordm9pZCBNUEVHMlRTV3JpdGVyOjp3cml0ZVRTKCkgeworICAgIGlmIChtTnVtVFNQYWNrZXRzV3JpdHRlbiA+PSBtTnVtVFNQYWNrZXRzQmVmb3JlTWV0YSkgeworICAgICAgICB3cml0ZVByb2dyYW1Bc3NvY2lhdGlvblRhYmxlKCk7CisgICAgICAgIHdyaXRlUHJvZ3JhbU1hcCgpOworCisgICAgICAgIG1OdW1UU1BhY2tldHNCZWZvcmVNZXRhID0gbU51bVRTUGFja2V0c1dyaXR0ZW4gKyAyNTAwOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IGQ0OTY5NmEuLjAzNjgyZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTI3LDExICsyNywxMSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KQEAgLTYxMSw2ICs2MTEsMTQgQEAKICAgICAgICAgfQogICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOwogICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7CisgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgY2hhciBjaHVua1s1XTsKQEAgLTY2NywxNCArNjc1LDE1IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2YnLCAncicsICdhJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2snLCAnaScgLCdwJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7CiAgICAgICAgICAgICAgICAgTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJWQgYnl0ZXMgbG9uZy4iLCAoc2l6ZV90KWNodW5rX3NpemUpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a1dhbnRzUHJlZmV0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgKERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc3A8TVBFRzREYXRhU291cmNlPiBjYWNoZWRTb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1QRUc0RGF0YVNvdXJjZShtRGF0YVNvdXJjZSk7CiAKQEAgLTc1Nyw1NSArNzY2LDExIEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrSGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50NjRfdCBjdGltZSwgbXRpbWUsIGR1cmF0aW9uOwotICAgICAgICAgICAgaW50MzJfdCBpZDsKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplICE9IDM2ICsgNjApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlclszNiArIDYwXTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3RpbWUgPSBVNjRfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgICAgICAgICAgbXRpbWUgPSBVNjRfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICAgICAgICAgIGlkID0gVTMyX0FUKCZidWZmZXJbMjBdKTsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBVMzJfQVQoJmJ1ZmZlcls4OF0pOwotICAgICAgICAgICAgICAgIGhlaWdodCA9IFUzMl9BVCgmYnVmZmVyWzkyXSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gMjQgKyA2MCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzI0ICsgNjBdOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgICAgICAgICAgbXRpbWUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTMyX0FUKCZidWZmZXJbMjBdKTsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IFUzMl9BVCgmYnVmZmVyWzc2XSk7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbODBdKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDUzLDcgKzEwMTgsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IG1heF9zaXplOwotICAgICAgICAgICAgQ0hFQ0tfRVEobUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmdldE1heFNhbXBsZVNpemUoJm1heF9zaXplKSwgT0spOworICAgICAgICAgICAgZXJyID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmdldE1heFNhbXBsZVNpemUoJm1heF9zaXplKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgZ2l2ZW4gYnVmZmVyIG9ubHkgY29udGFpbnMgYXQgbW9zdCAxMCBmcmFnbWVudHMsCiAgICAgICAgICAgICAvLyBlYWNoIGZyYWdtZW50IG9yaWdpbmFsbHkgcHJlZml4ZWQgd2l0aCBhIDIgYnl0ZSBsZW5ndGggd2lsbApAQCAtMTI2Miw2ICsxMjMxLDkxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VUcmFja0hlYWRlcigKKyAgICAgICAgb2ZmX3QgZGF0YV9vZmZzZXQsIG9mZl90IGRhdGFfc2l6ZSkgeworICAgIGlmIChkYXRhX3NpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCB2ZXJzaW9uOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBzaXplX3QgZHluU2l6ZSA9ICh2ZXJzaW9uID09IDEpID8gMzYgOiAyNDsKKworICAgIHVpbnQ4X3QgYnVmZmVyWzM2ICsgNjBdOworCisgICAgaWYgKGRhdGFfc2l6ZSAhPSAob2ZmX3QpZHluU2l6ZSArIDYwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgZGF0YV9zaXplKSA8IChzc2l6ZV90KWRhdGFfc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDY0X3QgY3RpbWUsIG10aW1lLCBkdXJhdGlvbjsKKyAgICBpbnQzMl90IGlkOworCisgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICBjdGltZSA9IFU2NF9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgbXRpbWUgPSBVNjRfQVQoJmJ1ZmZlclsxMl0pOworICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZidWZmZXJbMjhdKTsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICBjdGltZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgbXRpbWUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgIGlkID0gVTMyX0FUKCZidWZmZXJbMTJdKTsKKyAgICAgICAgZHVyYXRpb24gPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOworICAgIH0KKworICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisKKyAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OworICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CisgICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7CisgICAgaW50MzJfdCBkeCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDhdKTsKKyAgICBpbnQzMl90IGExMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDEyXSk7CisgICAgaW50MzJfdCBhMTEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxNl0pOworICAgIGludDMyX3QgZHkgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAyMF0pOworCisjaWYgMAorICAgIExPR0koIngnID0gJS4yZiAqIHggKyAlLjJmICogeSArICUuMmYiLAorICAgICAgICAgYTAwIC8gNjU1MzYuMGYsIGEwMSAvIDY1NTM2LjBmLCBkeCAvIDY1NTM2LjBmKTsKKyAgICBMT0dJKCJ5JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKKyAgICAgICAgIGExMCAvIDY1NTM2LjBmLCBhMTEgLyA2NTUzNi4wZiwgZHkgLyA2NTUzNi4wZik7CisjZW5kaWYKKworICAgIHVpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXhlZE9uZSA9IDB4MTAwMDA7CisgICAgaWYgKGEwMCA9PSBrRml4ZWRPbmUgJiYgYTAxID09IDAgJiYgYTEwID09IDAgJiYgYTExID09IGtGaXhlZE9uZSkgeworICAgICAgICAvLyBJZGVudGl0eSwgbm8gcm90YXRpb24KKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9IGVsc2UgaWYgKGEwMCA9PSAwICYmIGEwMSA9PSBrRml4ZWRPbmUgJiYgYTEwID09IC1rRml4ZWRPbmUgJiYgYTExID09IDApIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gOTA7CisgICAgfSBlbHNlIGlmIChhMDAgPT0gMCAmJiBhMDEgPT0gLWtGaXhlZE9uZSAmJiBhMTAgPT0ga0ZpeGVkT25lICYmIGExMSA9PSAwKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDI3MDsKKyAgICB9IGVsc2UgaWYgKGEwMCA9PSAta0ZpeGVkT25lICYmIGEwMSA9PSAwICYmIGExMCA9PSAwICYmIGExMSA9PSAta0ZpeGVkT25lKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDE4MDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJXZSBvbmx5IHN1cHBvcnQgMCw5MCwxODAsMjcwIGRlZ3JlZSByb3RhdGlvbiBtYXRyaWNlcyIpOworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQorCisjaWYgMAorICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlTWV0YURhdGEob2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChzaXplIDwgNCkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTQ2OCw2ICsxNTIyLDE0IEBACiAgICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKICNlbmRpZgogCisgICAgaWYgKGNzZF9zaXplID09IDApIHsKKyAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBtcGVnNCBoZWFkZXJzCisgICAgICAgIC8vIGlzIGFjY3VyYXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgaWYgKGNzZF9zaXplIDwgMikgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KQEAgLTE1NjcsNyArMTYyOSw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIAogICAgICAgICBDSEVDSyhzaXplID49IDcpOwotICAgICAgICBDSEVDS19FUShwdHJbMF0sIDEpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCiAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCiAgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKQEAgLTE2NjIsMTIgKzE3MjQsNDUgQEAKIAogICAgICpvdXQgPSBOVUxMOwogCisgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMTsKKwogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQWZ0ZXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRDbG9zZXN0U2FtcGxlKAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCiAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwLAotICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgU2FtcGxlVGFibGU6OmtTeW5jU2FtcGxlX0ZsYWcpOworICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKKworICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgY2xvc2VzdCBzYW1wbGUgYWxyZWFkeSwgbm93IHdlIHdhbnQgdGhlIHN5bmMKKyAgICAgICAgICAgIC8vIHNhbXBsZSBwcmVjZWRpbmcgaXQgKG9yIHRoZSBzYW1wbGUgaXRzZWxmIG9mIGNvdXJzZSksIGV2ZW4KKyAgICAgICAgICAgIC8vIGlmIHRoZSBzdWJzZXF1ZW50IHN5bmMgc2FtcGxlIGlzIGNsb3Nlci4KKyAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKQEAgLTE2ODEsNyArMTc3NiwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSBzYW1wbGVJbmRleDsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpKTsKKworICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOworICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc3luY1NhbXBsZVRpbWUpKTsKKworICAgICAgICBMT0dJKCJzZWVrIHRvIHRpbWUgJWxsZCB1cyA9PiBzYW1wbGUgYXQgdGltZSAlbGxkIHVzLCAiCisgICAgICAgICAgICAgInN5bmMgc2FtcGxlIGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICBzYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSwKKyAgICAgICAgICAgICBzeW5jU2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUpOworI2VuZGlmCisKKyAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CkBAIC0xNjkzLDEzICsxODA4LDE0IEBACiAgICAgb2ZmX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwogICAgIHVpbnQzMl90IGR0czsKKyAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZkdHMpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmR0cywgJmlzU3luY1NhbXBsZSk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE3MDgsNyArMTgyNCw3IEBACiAgICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIENIRUNLX0VRKG1CdWZmZXIsIE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzMwLDYgKzE4NDYsMTYgQEAKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOwogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWR0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCkBAIC0xODM4LDYgKzE5NjQsMTYgQEAKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWR0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgIH0KKwogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CkBAIC0xODQ3LDcgKzE5ODMsNyBAQAogICAgIH0KIH0KIAotYm9vbCBTbmlmZk1QRUc0KAorc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNCgKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKQEAgLTE4NjMsNyArMTk5OSw3IEBACiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00QSAiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBmNHYgIiwgOCkKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwa2RkaSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00VlAiLCA4KSkgewogICAgICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7Ci0gICAgICAgICpjb25maWRlbmNlID0gMC4xOworICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKIAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xODcxLDUgKzIwMDcsODQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sIGlzQ29tcGF0aWJsZUJyYW5kKHVpbnQzMl90IGZvdXJjYykgeworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ29tcGF0aWJsZUJyYW5kc1tdID0geworICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJ20nKSwKKyAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICcyJyksCisgICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKKyAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCisgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgIGkgPCBzaXplb2Yoa0NvbXBhdGlibGVCcmFuZHMpIC8gc2l6ZW9mKGtDb21wYXRpYmxlQnJhbmRzWzBdKTsKKyAgICAgICAgICsraSkgeworICAgICAgICBpZiAoa0NvbXBhdGlibGVCcmFuZHNbaV0gPT0gZm91cmNjKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gQXR0ZW1wdCB0byBhY3R1YWxseSBwYXJzZSB0aGUgJ2Z0eXAnIGF0b20gYW5kIGRldGVybWluZSBpZiBhIHN1aXRhYmxlCisvLyBjb21wYXRpYmxlIGJyYW5kIGlzIHByZXNlbnQuCitzdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICB1aW50OF90IGhlYWRlclsxMl07CisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgMTIpICE9IDEyCisgICAgICAgICAgICB8fCBtZW1jbXAoImZ0eXAiLCAmaGVhZGVyWzRdLCA0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGF0b21TaXplID0gVTMyX0FUKCZoZWFkZXJbMF0pOworICAgIGlmIChhdG9tU2l6ZSA8IDE2IHx8IChhdG9tU2l6ZSAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIGlmIChpc0NvbXBhdGlibGVCcmFuZChVMzJfQVQoJmhlYWRlcls4XSkpKSB7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGF0b21TaXplIC0gMTYpIC8gNDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db21wYXRpYmxlQnJhbmRzOyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wWzRdOworICAgICAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDE2ICsgaSAqIDQsIHRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZUJyYW5kKFUzMl9BVCgmdG1wWzBdKSkpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OworICAgICpjb25maWRlbmNlID0gMC40ZjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNuaWZmTVBFRzQoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKKyAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIG1pbWVUeXBlLCBjb25maWRlbmNlKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIG1pbWVUeXBlLCBjb25maWRlbmNlKSkgeworICAgICAgICBMT0dXKCJJZGVudGlmaWVkIHN1cHBvcnRlZCBtcGVnNCB0aHJvdWdoIExlZ2FjeVNuaWZmTVBFRzQuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDJjZjBkZGYuLmNiYjE2MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTE0LDU2ICsxNCwyMDAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzRXcml0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXgzMkJpdEZpbGVTaXplID0gMHgwMDdmZmZmZmZmTEw7CitzdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCA9IDB4MDc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCA9IDB4MDg7CisKKy8vIFVzaW5nIGxvbmdlciBhZGp1c3RtZW50IHBlcmlvZCB0byBzdXBwcmVzcyBmbHVjdHVhdGlvbnMgaW4KKy8vIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRocworc3RhdGljIGNvbnN0IGludDY0X3Qga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzID0gNjAwMDAwMDAwTEw7ICAvLyAxMCBtaW51dGVzCisKIGNsYXNzIE1QRUc0V3JpdGVyOjpUcmFjayB7CiBwdWJsaWM6CiAgICAgVHJhY2soTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKICAgICB+VHJhY2soKTsKIAotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdm9pZCBzdG9wKCk7CisgICAgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworICAgIHN0YXR1c190IHBhdXNlKCk7CiAgICAgYm9vbCByZWFjaGVkRU9TKCk7CiAKICAgICBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSBjb25zdDsKLSAgICB2b2lkIHdyaXRlVHJhY2tIZWFkZXIoaW50MzJfdCB0cmFja0lEKTsKKyAgICBpbnQ2NF90IGdldEVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzKCkgY29uc3Q7CisgICAgdm9pZCB3cml0ZVRyYWNrSGVhZGVyKGludDMyX3QgdHJhY2tJRCwgYm9vbCB1c2UzMkJpdE9mZnNldCA9IHRydWUpOworICAgIHZvaWQgYnVmZmVyQ2h1bmsoaW50NjRfdCB0aW1lc3RhbXBVcyk7CisgICAgYm9vbCBpc0F2YygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YzsgfQorICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CisgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KKyAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZl90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIE1QRUc0V3JpdGVyICptT3duZXI7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CisgICAgYm9vbCBtSXNBdmM7CisgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBib29sIG1Jc01QRUc0OworICAgIGludDY0X3QgbVRyYWNrRHVyYXRpb25VczsKKworICAgIC8vIEZvciByZWFsdGltZSBhcHBsaWNhdGlvbnMsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBtZWRpYSBjbG9jaworICAgIC8vIGZvciB2aWRlbyB0cmFjayBiYXNlZCBvbiB0aGUgYXVkaW8gbWVkaWEgY2xvY2sKKyAgICBib29sIG1Jc1JlYWxUaW1lUmVjb3JkaW5nOwogICAgIGludDY0X3QgbU1heFRpbWVTdGFtcFVzOworICAgIGludDY0X3QgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbU1kYXRTaXplQnl0ZXM7CisgICAgaW50MzJfdCBtVGltZVNjYWxlOwogCiAgICAgcHRocmVhZF90IG1UaHJlYWQ7CiAKLSAgICBzdHJ1Y3QgU2FtcGxlSW5mbyB7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBvZmZfdCBvZmZzZXQ7Ci0gICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgIC8vIG1OdW1TYW1wbGVzIGlzIHVzZWQgdG8gdHJhY2sgaG93IG1hbnkgc2FtcGxlcyBpbiBtU2FtcGxlU2l6ZXMgTGlzdC4KKyAgICAvLyBUaGlzIGlzIHRvIHJlZHVjZSB0aGUgY29zdCBhc3NvY2lhdGVkIHdpdGggbVNhbXBsZVNpemVzLnNpemUoKSBjYWxsLAorICAgIC8vIHNpbmNlIGl0IGlzIE8obikuIElkZWFsbHksIHRoZSBmaXggc2hvdWxkIGJlIGluIExpc3QgY2xhc3MuCisgICAgc2l6ZV90ICAgICAgICAgICAgICBtTnVtU2FtcGxlczsKKyAgICBMaXN0PHNpemVfdD4gICAgICAgIG1TYW1wbGVTaXplczsKKyAgICBib29sICAgICAgICAgICAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplOworCisgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtQ2h1bmtTYW1wbGVzOworCisgICAgc2l6ZV90ICAgICAgICAgICAgICBtTnVtU3Rjb1RhYmxlRW50cmllczsKKyAgICBMaXN0PG9mZl90PiAgICAgICAgIG1DaHVua09mZnNldHM7CisKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1OdW1TdHNjVGFibGVFbnRyaWVzOworICAgIHN0cnVjdCBTdHNjVGFibGVFbnRyeSB7CisKKyAgICAgICAgU3RzY1RhYmxlRW50cnkodWludDMyX3QgY2h1bmssIHVpbnQzMl90IHNhbXBsZXMsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBmaXJzdENodW5rKGNodW5rKSwKKyAgICAgICAgICAgICAgc2FtcGxlc1BlckNodW5rKHNhbXBsZXMpLAorICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbklkKGlkKSB7fQorCisgICAgICAgIHVpbnQzMl90IGZpcnN0Q2h1bms7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNQZXJDaHVuazsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlRGVzY3JpcHRpb25JZDsKICAgICB9OwotICAgIExpc3Q8U2FtcGxlSW5mbz4gbVNhbXBsZUluZm9zOworICAgIExpc3Q8U3RzY1RhYmxlRW50cnk+IG1TdHNjVGFibGVFbnRyaWVzOworCisgICAgc2l6ZV90ICAgICAgICBtTnVtU3Rzc1RhYmxlRW50cmllczsKKyAgICBMaXN0PGludDMyX3Q+IG1TdHNzVGFibGVFbnRyaWVzOworCisgICAgc2l6ZV90ICAgICAgICBtTnVtU3R0c1RhYmxlRW50cmllczsKKyAgICBzdHJ1Y3QgU3R0c1RhYmxlRW50cnkgeworCisgICAgICAgIFN0dHNUYWJsZUVudHJ5KHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBkdXJhdGlvblVzKQorICAgICAgICAgICAgOiBzYW1wbGVDb3VudChjb3VudCksIHNhbXBsZUR1cmF0aW9uVXMoZHVyYXRpb25Vcykge30KKworICAgICAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb25VczsKKyAgICB9OworICAgIExpc3Q8U3R0c1RhYmxlRW50cnk+IG1TdHRzVGFibGVFbnRyaWVzOworCisgICAgLy8gU2VxdWVuY2UgcGFyYW1ldGVyIHNldCBvciBwaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAgICBzdHJ1Y3QgQVZDUGFyYW1TZXQgeworICAgICAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCisgICAgICAgICAgICA6IG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKworICAgICAgICB1aW50MTZfdCBtTGVuZ3RoOworICAgICAgICBjb25zdCB1aW50OF90ICptRGF0YTsKKyAgICB9OworICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1TZXFQYXJhbVNldHM7CisgICAgTGlzdDxBVkNQYXJhbVNldD4gbVBpY1BhcmFtU2V0czsKKyAgICB1aW50OF90IG1Qcm9maWxlSWRjOworICAgIHVpbnQ4X3QgbVByb2ZpbGVDb21wYXRpYmxlOworICAgIHVpbnQ4X3QgbUxldmVsSWRjOwogCiAgICAgdm9pZCAqbUNvZGVjU3BlY2lmaWNEYXRhOwogICAgIHNpemVfdCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplOworICAgIGJvb2wgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhOworICAgIGJvb2wgbVRyYWNraW5nUHJvZ3Jlc3NTdGF0dXM7CiAKICAgICBib29sIG1SZWFjaGVkRU9TOworICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50NjRfdCBtUHJldmlvdXNUcmFja1RpbWVVczsKKyAgICBpbnQ2NF90IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXM7CisKKyAgICAvLyBIYXMgdGhlIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBmb3IgdmlkZW8gc3RhcnRlZD8KKyAgICBib29sICAgIG1Jc01lZGlhVGltZUFkanVzdG1lbnRPbjsKKyAgICAvLyBUaGUgdGltZSBzdGFtcCB3aGVuIHByZXZpb3VzIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBwZXJpb2Qgc3RhcnRzCisgICAgaW50NjRfdCBtUHJldk1lZGlhVGltZUFkanVzdFRpbWVzdGFtcFVzOworICAgIC8vIE51bWJlciBvZiB2aWRvZSBmcmFtZXMgd2hvc2UgdGltZSBzdGFtcCBtYXkgYmUgYWRqdXN0ZWQKKyAgICBpbnQ2NF90IG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXM7CisgICAgLy8gVGhlIHNhbXBsZSBudW1iZXIgd2hlbiBwcmV2aW91cyBtZWlkYSB0aW1lIGFkanVzdG1uZXQgcGVyaW9kIHN0YXJ0cworICAgIGludDY0X3QgbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGU7CisgICAgLy8gVGhlIHRvdGFsIGFjY3VtdWxhdGVkIGRyaWZ0IHRpbWUgd2l0aGluIGEgcGVyaW9kIG9mCisgICAgLy8ga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLgorICAgIGludDY0X3QgbVRvdGFsRHJpZnRUaW1lVG9BZGp1c3RVczsKKyAgICAvLyBUaGUgdG90YWwgYWNjdW1hbGF0ZWQgZHJpZnQgdGltZSBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZGluZworICAgIC8vIGV4Y2x1ZGluZyB0aGUgY3VycmVudCB0aW1lIGFkanVzdG1lbnQgcGVyaW9kCisgICAgaW50NjRfdCBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVczsKKworICAgIC8vIFVwZGF0ZSB0aGUgYXVkaW8gdHJhY2sncyBkcmlmdCBpbmZvcm1hdGlvbi4KKyAgICB2b2lkIHVwZGF0ZURyaWZ0VGltZShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOworCisgICAgLy8gQWRqdXN0IHRoZSB0aW1lIHN0YW1wIG9mIHRoZSB2aWRlbyB0cmFjayBhY2NvcmRpbmcgdG8KKyAgICAvLyB0aGUgZHJpZnQgdGltZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhdWRpbyB0cmFjay4KKyAgICB2b2lkIGFkanVzdE1lZGlhVGltZShpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CiAKICAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICptZSk7Ci0gICAgdm9pZCB0aHJlYWRFbnRyeSgpOworICAgIHN0YXR1c190IHRocmVhZEVudHJ5KCk7CisKKyAgICBjb25zdCB1aW50OF90ICpwYXJzZVBhcmFtU2V0KAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgdHlwZSwgc2l6ZV90ICpwYXJhbVNldExlbik7CisKKyAgICBzdGF0dXNfdCBtYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgY29weUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgdm9pZCB0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CisgICAgdm9pZCBpbml0VHJhY2tpbmdQcm9ncmVzc1N0YXR1cyhNZXRhRGF0YSAqcGFyYW1zKTsKKworICAgIHZvaWQgZ2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCk7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHRyYWNrIHRpbWUgc2NhbGUKKyAgICAvLyBJZiBpdCBpcyBhbiBhdWRpbyB0cmFjaywgdHJ5IHRvIHVzZSB0aGUgc2FtcGxpbmcgcmF0ZSBhcworICAgIC8vIHRoZSB0aW1lIHNjYWxlOyBob3dldmVyLCBpZiB1c2VyIGNob29zZXMgdGhlIG92ZXJ3cml0ZQorICAgIC8vIHZhbHVlLCB0aGUgdXNlci1zdXBwbGllZCB0aW1lIHNjYWxlIHdpbGwgYmUgdXNlZC4KKyAgICB2b2lkIHNldFRpbWVTY2FsZSgpOworCisgICAgLy8gU2ltcGxlIHZhbGlkYXRpb24gb24gdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBzdGF0dXNfdCBjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkgY29uc3Q7CisgICAgaW50MzJfdCBtUm90YXRpb247CisKKyAgICB2b2lkIHVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCk7CisgICAgdm9pZCBhZGRPbmVTdHNjVGFibGVFbnRyeShzaXplX3QgY2h1bmtJZCwgc2l6ZV90IHNhbXBsZUlkKTsKKyAgICB2b2lkIGFkZE9uZVN0c3NUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVJZCk7CisgICAgdm9pZCBhZGRPbmVTdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDY0X3QgZHVyYXRpb25Vcyk7CiAKICAgICBUcmFjayhjb25zdCBUcmFjayAmKTsKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwpAQCAtNzEsMjggKzIxNSw3NSBAQAogCiBNUEVHNFdyaXRlcjo6TVBFRzRXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgIndiIikpLAorICAgICAgbVVzZTRCeXRlTmFsTGVuZ3RoKHRydWUpLAorICAgICAgbVVzZTMyQml0T2Zmc2V0KHRydWUpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtT2Zmc2V0KDApLAotICAgICAgbU1kYXRPZmZzZXQoMCkgeworICAgICAgbU1kYXRPZmZzZXQoMCksCisgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUoMCksCisgICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCkgewogICAgIENIRUNLKG1GaWxlICE9IE5VTEwpOwogfQogCiBNUEVHNFdyaXRlcjo6TVBFRzRXcml0ZXIoaW50IGZkKQogICAgIDogbUZpbGUoZmRvcGVuKGZkLCAid2IiKSksCisgICAgICBtVXNlNEJ5dGVOYWxMZW5ndGgodHJ1ZSksCisgICAgICBtVXNlMzJCaXRPZmZzZXQodHJ1ZSksCisgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZChmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTWRhdE9mZnNldCgwKSB7CisgICAgICBtTWRhdE9mZnNldCgwKSwKKyAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSgwKSwKKyAgICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcygxMDAwMDAwKSB7CiAgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CiAgICAgc3RvcCgpOwogCi0gICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICB3aGlsZSAoIW1UcmFja3MuZW1wdHkoKSkgeworICAgICAgICBMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgZGVsZXRlICppdDsKKyAgICAgICAgKCppdCkgPSBOVUxMOworICAgICAgICBtVHJhY2tzLmVyYXNlKGl0KTsKICAgICB9CiAgICAgbVRyYWNrcy5jbGVhcigpOwogfQogCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgTVBFRzRXcml0ZXIgJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIG1TdGFydGVkOiAlc1xuIiwgbVN0YXJ0ZWQ/ICJ0cnVlIjogImZhbHNlIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgKCppdCktPmR1bXAoZmQsIGFyZ3MpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAlcyB0cmFja1xuIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgcmVhY2hlZCBFT1M6ICVzXG4iLAorICAgICAgICAgICAgbVJlYWNoZWRFT1M/ICJ0cnVlIjogImZhbHNlIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgVHJhY2sgKnRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHNvdXJjZSk7CiAgICAgbVRyYWNrcy5wdXNoX2JhY2sodHJhY2spOwpAQCAtMTAwLDIzICsyOTEsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0V3JpdGVyOjpzdGFydCgpIHsKLSAgICBpZiAobUZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBiZWdpbkJveCgiZnR5cCIpOwotICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOwotICAgIGVuZEJveCgpOwotCi0gICAgbU1kYXRPZmZzZXQgPSBtT2Zmc2V0OwotICAgIHdyaXRlKCJceDAwXHgwMFx4MDBceDAxbWRhdD8/Pz8/Pz8/IiwgMTYpOwotCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c3RhcnRUcmFja3MoTWV0YURhdGEgKnBhcmFtcykgewogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9ICgqaXQpLT5zdGFydCgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKml0KS0+c3RhcnQocGFyYW1zKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0MiA9IG1UcmFja3MuYmVnaW4oKTsKQEAgLTEyNywzNCArMzA1LDMyNCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6c3RvcCgpIHsKLSAgICBpZiAobUZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CitpbnQ2NF90IE1QRUc0V3JpdGVyOjplc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSkgeworICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC9oZXVyaXNpdGljLgorICAgIC8vCisgICAgLy8gU3RhdGlzdGljYWwgYW5hbHlzaXMgc2hvd3MgdGhhdCBtZXRhZGF0YSB1c3VhbGx5IGFjY291bnRzCisgICAgLy8gZm9yIGEgc21hbGwgcG9ydGlvbiBvZiB0aGUgdG90YWwgZmlsZSBzaXplLCB1c3VhbGx5IDwgMC42JS4KKworICAgIC8vIFRoZSBkZWZhdWx0IE1JTl9NT09WX0JPWF9TSVpFIGlzIHNldCB0byAwLjYlIHggMU1CIC8gMiwKKyAgICAvLyB3aGVyZSAxTUIgaXMgdGhlIGNvbW1vbiBmaWxlIHNpemUgbGltaXQgZm9yIE1NUyBhcHBsaWNhdGlvbi4KKyAgICAvLyBUaGUgZGVmYXVsdCBNQVggX01PT1ZfQk9YX1NJWkUgdmFsdWUgaXMgYmFzZWQgb24gYWJvdXQgMworICAgIC8vIG1pbnV0ZSB2aWRlbyByZWNvcmRpbmcgd2l0aCBhIGJpdCByYXRlIGFib3V0IDMgTWJwcywgYmVjYXVzZQorICAgIC8vIHN0YXRpc3RpY3MgYWxzbyBzaG93IHRoYXQgbW9zdCBvZiB0aGUgdmlkZW8gY2FwdHVyZWQgYXJlIGdvaW5nCisgICAgLy8gdG8gYmUgbGVzcyB0aGFuIDMgbWludXRlcy4KKworICAgIC8vIElmIHRoZSBlc3RpbWF0aW9uIGlzIHdyb25nLCB3ZSB3aWxsIHBheSB0aGUgcHJpY2Ugb2Ygd2FzdGluZworICAgIC8vIHNvbWUgcmVzZXJ2ZWQgc3BhY2UuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc28gb2Z0ZW4gc3RhdGlzdGljYWxseS4KKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBmYWN0b3IgPSBtVXNlMzJCaXRPZmZzZXQ/IDE6IDI7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUlOX01PT1ZfQk9YX1NJWkUgPSAzICogMTAyNDsgIC8vIDMgS0IKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBNQVhfTU9PVl9CT1hfU0laRSA9ICgxODAgKiAzMDAwMDAwICogNkxMIC8gODAwMCk7CisgICAgaW50NjRfdCBzaXplID0gTUlOX01PT1ZfQk9YX1NJWkU7CisKKyAgICAvLyBNYXggZmlsZSBzaXplIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDAgJiYgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSA9IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgKiA2IC8gMTAwMDsKICAgICB9CiAKLSAgICBpbnQ2NF90IG1heF9kdXJhdGlvbiA9IDA7Ci0gICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgKCppdCktPnN0b3AoKTsKLQotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gKCppdCktPmdldER1cmF0aW9uVXMoKTsKLSAgICAgICAgaWYgKGR1cmF0aW9uID4gbWF4X2R1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAvLyBNYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgIT0gMCkgeworICAgICAgICBpZiAoYml0UmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2l6ZTIgPQorICAgICAgICAgICAgICAgICgobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgKiBiaXRSYXRlICogNikgLyAxMDAwIC8gODAwMDAwMCk7CisgICAgICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwICYmIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGZpbGUgc2l6ZSBhbmQgZHVyYXRpb24gbGltaXRzIGFyZSBzZXQsCisgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRoZSBzbWFsbGVyIGxpbWl0IG9mIHRoZSB0d28uCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBzaXplMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG1heCBmaWxlIGR1cmF0aW9uIGxpbWl0IGlzIHNldAorICAgICAgICAgICAgICAgIHNpemUgPSBzaXplMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChzaXplIDwgTUlOX01PT1ZfQk9YX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1JTl9NT09WX0JPWF9TSVpFOworICAgIH0KKworICAgIC8vIEFueSBsb25nIGR1cmF0aW9uIHJlY29yZGluZyB3aWxsIGJlIHByb2JhYmx5IGVuZCB1cCB3aXRoCisgICAgLy8gbm9uLXN0cmVhbWFibGUgbXA0IGZpbGUuCisgICAgaWYgKHNpemUgPiBNQVhfTU9PVl9CT1hfU0laRSkgeworICAgICAgICBzaXplID0gTUFYX01PT1ZfQk9YX1NJWkU7CisgICAgfQorCisgICAgTE9HSSgibGltaXRzOiAlbGxkLyVsbGQgYnl0ZXMvdXMsIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSBlc3RpbWF0ZWQiCisgICAgICAgICAiIG1vb3Ygc2l6ZSAlbGxkIGJ5dGVzIiwKKyAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzLCBiaXRSYXRlLCBzaXplKTsKKyAgICByZXR1cm4gZmFjdG9yICogc2l6ZTsKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbSkgeworICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgbU1heEZpbGVTaXplTGltaXRCeXRlcyBhdCB0aGUgYmVnaW5uaW5nCisgICAgICogc2luY2UgbU1heEZpbGVTaXplTGltaXRCeXRlcyBtYXkgYmUgaW1wbGljaXRseQorICAgICAqIGNoYW5nZWQgbGF0ZXIgZm9yIDMyLWJpdCBmaWxlIG9mZnNldCBldmVuIGlmCisgICAgICogdXNlciBkb2VzIG5vdCBhc2sgdG8gc2V0IGl0IGV4cGxpY2l0bHkuCisgICAgICovCisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCkgeworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IHRydWU7CisgICAgfQorCisgICAgaW50MzJfdCB1c2U2NEJpdE9mZnNldDsKKyAgICBpZiAocGFyYW0gJiYKKyAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCAmdXNlNjRCaXRPZmZzZXQpICYmCisgICAgICAgIHVzZTY0Qml0T2Zmc2V0KSB7CisgICAgICAgIG1Vc2UzMkJpdE9mZnNldCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtVXNlMzJCaXRPZmZzZXQpIHsKKyAgICAgICAgLy8gSW1wbGljaXQgMzIgYml0IGZpbGUgc2l6ZSBsaW1pdAorICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBmaWxlIHNpemUgaXMgc2V0IHRvIGJlIGxhcmdlciB0aGFuIHRoZSAzMiBiaXQgZmlsZQorICAgICAgICAvLyBzaXplIGxpbWl0LCB0cmVhdCBpdCBhcyBhbiBlcnJvci4KKyAgICAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPiBrTWF4MzJCaXRGaWxlU2l6ZSkgeworICAgICAgICAgICAgTE9HVygiMzItYml0IGZpbGUgc2l6ZSBsaW1pdCAoJWxsZCBieXRlcykgdG9vIGJpZy4gIgorICAgICAgICAgICAgICAgICAiSXQgaXMgY2hhbmdlZCB0byAlbGxkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBrTWF4MzJCaXRGaWxlU2l6ZSk7CisgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHVzZTJCeXRlTmFsTGVuZ3RoOworICAgIGlmIChwYXJhbSAmJgorICAgICAgICBwYXJhbS0+ZmluZEludDMyKGtLZXkyQnl0ZU5hbExlbmd0aCwgJnVzZTJCeXRlTmFsTGVuZ3RoKSAmJgorICAgICAgICB1c2UyQnl0ZU5hbExlbmd0aCkgeworICAgICAgICBtVXNlNEJ5dGVOYWxMZW5ndGggPSBmYWxzZTsKKyAgICB9CisKKyAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xOworCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRUcmFja3MocGFyYW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoIXBhcmFtIHx8CisgICAgICAgICFwYXJhbS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZtVGltZVNjYWxlKSkgeworICAgICAgICBtVGltZVNjYWxlID0gMTAwMDsKKyAgICB9CisgICAgQ0hFQ0sobVRpbWVTY2FsZSA+IDApOworICAgIExPR1YoIm1vdmllIHRpbWUgc2NhbGU6ICVkIiwgbVRpbWVTY2FsZSk7CisKKyAgICBtU3RyZWFtYWJsZUZpbGUgPSB0cnVlOworICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IGZhbHNlOworICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKKyAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICBiZWdpbkJveCgiZnR5cCIpOworICAgICAgeworICAgICAgICBpbnQzMl90IGZpbGVUeXBlOworICAgICAgICBpZiAocGFyYW0gJiYgcGFyYW0tPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZmaWxlVHlwZSkgJiYKKyAgICAgICAgICAgIGZpbGVUeXBlICE9IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygiM2dwNCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd3JpdGVJbnQzMigwKTsKKyAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgICB3cml0ZUZvdXJjYygiM2dwNCIpOworICAgIGVuZEJveCgpOworCisgICAgbUZyZWVCb3hPZmZzZXQgPSBtT2Zmc2V0OworCisgICAgaWYgKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA9PSAwKSB7CisgICAgICAgIGludDMyX3QgYml0UmF0ZSA9IC0xOworICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICAgICAgfQorICAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUgPSBlc3RpbWF0ZU1vb3ZCb3hTaXplKGJpdFJhdGUpOworICAgIH0KKyAgICBDSEVDSyhtRXN0aW1hdGVkTW9vdkJveFNpemUgPj0gOCk7CisgICAgZnNlZWtvKG1GaWxlLCBtRnJlZUJveE9mZnNldCwgU0VFS19TRVQpOworICAgIHdyaXRlSW50MzIobUVzdGltYXRlZE1vb3ZCb3hTaXplKTsKKyAgICB3cml0ZSgiZnJlZSIsIDQpOworCisgICAgbU1kYXRPZmZzZXQgPSBtRnJlZUJveE9mZnNldCArIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZTsKKyAgICBtT2Zmc2V0ID0gbU1kYXRPZmZzZXQ7CisgICAgZnNlZWtvKG1GaWxlLCBtTWRhdE9mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChtVXNlMzJCaXRPZmZzZXQpIHsKKyAgICAgICAgd3JpdGUoIj8/Pz9tZGF0IiwgOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGUoIlx4MDBceDAwXHgwMFx4MDFtZGF0Pz8/Pz8/Pz8iLCAxNik7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRXcml0ZXJUaHJlYWQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gc3RhcnRUcmFja3MocGFyYW0pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1QRUc0V3JpdGVyOjp1c2UzMkJpdEZpbGVPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2UzMkJpdE9mZnNldDsKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCppdCktPnBhdXNlKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpzdG9wV3JpdGVyVGhyZWFkKCkgeworICAgIExPR1YoInN0b3BXcml0ZXJUaHJlYWQiKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKworICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgIG1DaHVua1JlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KKworICAgIHZvaWQgKmR1bW15OworICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOworfQorCisvKgorICogTVA0IGZpbGUgc3RhbmRhcmQgZGVmaW5lcyBhIGNvbXBvc2l0aW9uIG1hdHJpeDoKKyAqIHwgYSAgYiAgdSB8CisgKiB8IGMgIGQgIHYgfAorICogfCB4ICB5ICB3IHwKKyAqCisgKiB0aGUgZWxlbWVudCBpbiB0aGUgbWF0cml4IGlzIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nCisgKiBvcmRlcjoge2EsIGIsIHUsIGMsIGQsIHYsIHgsIHksIHd9LAorICogd2hlcmUgYSwgYiwgYywgZCwgeCwgYW5kIHkgaXMgaW4gMTYuMTYgZm9ybWF0LCB3aGlsZQorICogdSwgdiBhbmQgdyBpcyBpbiAyLjMwIGZvcm1hdC4KKyAqLwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVDb21wb3NpdGlvbk1hdHJpeChpbnQgZGVncmVlcykgeworICAgIExPR1YoIndyaXRlQ29tcG9zaXRpb25NYXRyaXgiKTsKKyAgICB1aW50MzJfdCBhID0gMHgwMDAxMDAwMDsKKyAgICB1aW50MzJfdCBiID0gMDsKKyAgICB1aW50MzJfdCBjID0gMDsKKyAgICB1aW50MzJfdCBkID0gMHgwMDAxMDAwMDsKKyAgICBzd2l0Y2ggKGRlZ3JlZXMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICBhID0gMDsKKyAgICAgICAgICAgIGIgPSAweDAwMDEwMDAwOworICAgICAgICAgICAgYyA9IDB4RkZGRjAwMDA7CisgICAgICAgICAgICBkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIGEgPSAweEZGRkYwMDAwOworICAgICAgICAgICAgZCA9IDB4RkZGRjAwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBhID0gMDsKKyAgICAgICAgICAgIGIgPSAweEZGRkYwMDAwOworICAgICAgICAgICAgYyA9IDB4MDAwMTAwMDA7CisgICAgICAgICAgICBkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyB1bmtub3duIHJvdGF0aW9uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB3cml0ZUludDMyKGEpOyAgICAgICAgICAgLy8gYQorICAgIHdyaXRlSW50MzIoYik7ICAgICAgICAgICAvLyBiCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHUKKyAgICB3cml0ZUludDMyKGMpOyAgICAgICAgICAgLy8gYworICAgIHdyaXRlSW50MzIoZCk7ICAgICAgICAgICAvLyBkCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHYKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgLy8geAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB5CisgICAgd3JpdGVJbnQzMigweDQwMDAwMDAwKTsgIC8vIHcKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0b3AoKSB7CisgICAgaWYgKG1GaWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludDY0X3QgbWF4RHVyYXRpb25VcyA9IDA7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCppdCktPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9ICgqaXQpLT5nZXREdXJhdGlvblVzKCk7CisgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgeworICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdG9wV3JpdGVyVGhyZWFkKCk7CisKKyAgICAvLyBEbyBub3Qgd3JpdGUgb3V0IG1vdmllIGhlYWRlciBvbiBlcnJvci4KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZmbHVzaChtRmlsZSk7CisgICAgICAgIGZjbG9zZShtRmlsZSk7CisgICAgICAgIG1GaWxlID0gTlVMTDsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICAvLyBGaXggdXAgdGhlIHNpemUgb2YgdGhlICdtZGF0JyBjaHVuay4KLSAgICBmc2VlayhtRmlsZSwgbU1kYXRPZmZzZXQgKyA4LCBTRUVLX1NFVCk7Ci0gICAgaW50NjRfdCBzaXplID0gbU9mZnNldCAtIG1NZGF0T2Zmc2V0OwotICAgIHNpemUgPSBodG9uNjQoc2l6ZSk7Ci0gICAgZndyaXRlKCZzaXplLCAxLCA4LCBtRmlsZSk7Ci0gICAgZnNlZWsobUZpbGUsIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAobVVzZTMyQml0T2Zmc2V0KSB7CisgICAgICAgIGZzZWVrbyhtRmlsZSwgbU1kYXRPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgaW50MzJfdCBzaXplID0gaHRvbmwoc3RhdGljX2Nhc3Q8aW50MzJfdD4obU9mZnNldCAtIG1NZGF0T2Zmc2V0KSk7CisgICAgICAgIGZ3cml0ZSgmc2l6ZSwgMSwgNCwgbUZpbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZzZWVrbyhtRmlsZSwgbU1kYXRPZmZzZXQgKyA4LCBTRUVLX1NFVCk7CisgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1PZmZzZXQgLSBtTWRhdE9mZnNldDsKKyAgICAgICAgc2l6ZSA9IGh0b242NChzaXplKTsKKyAgICAgICAgZndyaXRlKCZzaXplLCAxLCA4LCBtRmlsZSk7CisgICAgfQorICAgIGZzZWVrbyhtRmlsZSwgbU9mZnNldCwgU0VFS19TRVQpOwogCiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgICAgY29uc3Qgb2ZmX3QgbW9vdk9mZnNldCA9IG1PZmZzZXQ7CisgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gdHJ1ZTsKKyAgICBtTW9vdkJveEJ1ZmZlciA9ICh1aW50OF90ICopIG1hbGxvYyhtRXN0aW1hdGVkTW9vdkJveFNpemUpOworICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKKyAgICBDSEVDSyhtTW9vdkJveEJ1ZmZlciAhPSBOVUxMKTsKKyAgICBpbnQzMl90IGR1cmF0aW9uID0gKG1heER1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKIAogICAgIGJlZ2luQm94KCJtb292Iik7CiAKQEAgLTE2MiwyMiArNjMwLDE0IEBACiAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAogICAgICAgICB3cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCiAgICAgICAgIHdyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgIHdyaXRlSW50MzIoMTAwMCk7ICAgICAgICAgIC8vIHRpbWVzY2FsZQotICAgICAgICB3cml0ZUludDMyKG1heF9kdXJhdGlvbiAvIDEwMDApOwotICAgICAgICB3cml0ZUludDMyKDB4MTAwMDApOyAgICAgICAvLyByYXRlCisgICAgICAgIHdyaXRlSW50MzIobVRpbWVTY2FsZSk7ICAgIC8vIG12aGQgdGltZXNjYWxlCisgICAgICAgIHdyaXRlSW50MzIoZHVyYXRpb24pOworICAgICAgICB3cml0ZUludDMyKDB4MTAwMDApOyAgICAgICAvLyByYXRlOiAxLjAKICAgICAgICAgd3JpdGVJbnQxNigweDEwMCk7ICAgICAgICAgLy8gdm9sdW1lCiAgICAgICAgIHdyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIHdyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIG1hdHJpeAotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDB4MTAwMDApOwotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDApOwotICAgICAgICB3cml0ZUludDMyKDB4NDAwMDAwMDApOworICAgICAgICB3cml0ZUNvbXBvc2l0aW9uTWF0cml4KDApOwogICAgICAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCiAgICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKICAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZApAQCAtMTkwLDE5ICs2NTAsNTUgQEAKICAgICAgIGludDMyX3QgaWQgPSAxOwogICAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCwgKytpZCkgewotICAgICAgICAgICgqaXQpLT53cml0ZVRyYWNrSGVhZGVyKGlkKTsKKyAgICAgICAgICAoKml0KS0+d3JpdGVUcmFja0hlYWRlcihpZCwgbVVzZTMyQml0T2Zmc2V0KTsKICAgICAgIH0KICAgICBlbmRCb3goKTsgIC8vIG1vb3YKIAorICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IGZhbHNlOworICAgIGlmIChtU3RyZWFtYWJsZUZpbGUpIHsKKyAgICAgICAgQ0hFQ0sobU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyA4IDw9IG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisKKyAgICAgICAgLy8gTW9vdiBib3gKKyAgICAgICAgZnNlZWtvKG1GaWxlLCBtRnJlZUJveE9mZnNldCwgU0VFS19TRVQpOworICAgICAgICBtT2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQ7CisgICAgICAgIHdyaXRlKG1Nb292Qm94QnVmZmVyLCAxLCBtTW9vdkJveEJ1ZmZlck9mZnNldCwgbUZpbGUpOworCisgICAgICAgIC8vIEZyZWUgYm94CisgICAgICAgIGZzZWVrbyhtRmlsZSwgbU9mZnNldCwgU0VFS19TRVQpOworICAgICAgICB3cml0ZUludDMyKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSAtIG1Nb292Qm94QnVmZmVyT2Zmc2V0KTsKKyAgICAgICAgd3JpdGUoImZyZWUiLCA0KTsKKworICAgICAgICAvLyBGcmVlIHRlbXAgbWVtb3J5CisgICAgICAgIGZyZWUobU1vb3ZCb3hCdWZmZXIpOworICAgICAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dJKCJUaGUgbXA0IGZpbGUgd2lsbCBub3QgYmUgc3RyZWFtYWJsZS4iKTsKKyAgICB9CisKICAgICBDSEVDSyhtQm94ZXMuZW1wdHkoKSk7CiAKKyAgICBmZmx1c2gobUZpbGUpOwogICAgIGZjbG9zZShtRmlsZSk7CiAgICAgbUZpbGUgPSBOVUxMOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIGVycjsKIH0KIAotb2ZmX3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpzZXRJbnRlcmxlYXZlRHVyYXRpb24odWludDMyX3QgZHVyYXRpb25VcykgeworICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQogCit2b2lkIE1QRUc0V3JpdGVyOjpsb2NrKCkgeworICAgIG1Mb2NrLmxvY2soKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6dW5sb2NrKCkgeworICAgIG1Mb2NrLnVubG9jaygpOworfQorCitvZmZfdCBNUEVHNFdyaXRlcjo6YWRkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewogICAgIG9mZl90IG9sZF9vZmZzZXQgPSBtT2Zmc2V0OwogCiAgICAgZndyaXRlKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLApAQCAtMjEzLDMxICs3MDksODkgQEAKICAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIAotb2ZmX3QgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworc3RhdGljIHZvaWQgU3RyaXBTdGFydGNvZGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgNCkgeworICAgICAgICByZXR1cm47CisgICAgfQogCisgICAgY29uc3QgdWludDhfdCAqcHRyID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpZiAoIW1lbWNtcChwdHIsICJceDAwXHgwMFx4MDBceDAxIiwgNCkpIHsKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIDQsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKKyAgICB9Cit9CisKK29mZl90IE1QRUc0V3JpdGVyOjphZGRMZW5ndGhQcmVmaXhlZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKICAgICBvZmZfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKIAogICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIENIRUNLKGxlbmd0aCA8IDY1NTM2KTsKIAotICAgIHVpbnQ4X3QgeCA9IGxlbmd0aCA+PiA4OwotICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOwotICAgIHggPSBsZW5ndGggJiAweGZmOwotICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOworICAgIGlmIChtVXNlNEJ5dGVOYWxMZW5ndGgpIHsKKyAgICAgICAgdWludDhfdCB4ID0gbGVuZ3RoID4+IDI0OworICAgICAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKKyAgICAgICAgeCA9IChsZW5ndGggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CisgICAgICAgIHggPSAobGVuZ3RoID4+IDgpICYgMHhmZjsKKyAgICAgICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CisgICAgICAgIHggPSBsZW5ndGggJiAweGZmOworICAgICAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKIAotICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgMSwgbGVuZ3RoLCBtRmlsZSk7CisgICAgICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAxLCBsZW5ndGgsIG1GaWxlKTsKKyAgICAgICAgbU9mZnNldCArPSBsZW5ndGggKyA0OworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKGxlbmd0aCA8IDY1NTM2KTsKIAotICAgIG1PZmZzZXQgKz0gbGVuZ3RoICsgMjsKKyAgICAgICAgdWludDhfdCB4ID0gbGVuZ3RoID4+IDg7CisgICAgICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOworICAgICAgICB4ID0gbGVuZ3RoICYgMHhmZjsKKyAgICAgICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CisgICAgICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAxLCBsZW5ndGgsIG1GaWxlKTsKKyAgICAgICAgbU9mZnNldCArPSBsZW5ndGggKyAyOworICAgIH0KIAogICAgIHJldHVybiBvbGRfb2Zmc2V0OwogfQogCitzaXplX3QgTVBFRzRXcml0ZXI6OndyaXRlKAorICAgICAgICBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIEZJTEUgKnN0cmVhbSkgeworCisgICAgY29uc3Qgc2l6ZV90IGJ5dGVzID0gc2l6ZSAqIG5tZW1iOworICAgIGlmIChtV3JpdGVNb292Qm94VG9NZW1vcnkpIHsKKyAgICAgICAgb2ZmX3QgbW9vdkJveFNpemUgPSA4ICsgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyBieXRlczsKKyAgICAgICAgaWYgKG1vb3ZCb3hTaXplID4gbUVzdGltYXRlZE1vb3ZCb3hTaXplKSB7CisgICAgICAgICAgICBmb3IgKExpc3Q8b2ZmX3Q+OjppdGVyYXRvciBpdCA9IG1Cb3hlcy5iZWdpbigpOworICAgICAgICAgICAgICAgICBpdCAhPSBtQm94ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAoKml0KSArPSBtT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnNlZWtvKG1GaWxlLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBmd3JpdGUobU1vb3ZCb3hCdWZmZXIsIDEsIG1Nb292Qm94QnVmZmVyT2Zmc2V0LCBzdHJlYW0pOworICAgICAgICAgICAgZndyaXRlKHB0ciwgc2l6ZSwgbm1lbWIsIHN0cmVhbSk7CisgICAgICAgICAgICBtT2Zmc2V0ICs9IChieXRlcyArIG1Nb292Qm94QnVmZmVyT2Zmc2V0KTsKKyAgICAgICAgICAgIGZyZWUobU1vb3ZCb3hCdWZmZXIpOworICAgICAgICAgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOworICAgICAgICAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgICAgICAgICBtU3RyZWFtYWJsZUZpbGUgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtTW9vdkJveEJ1ZmZlciArIG1Nb292Qm94QnVmZmVyT2Zmc2V0LCBwdHIsIGJ5dGVzKTsKKyAgICAgICAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ICs9IGJ5dGVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZndyaXRlKHB0ciwgc2l6ZSwgbm1lbWIsIHN0cmVhbSk7CisgICAgICAgIG1PZmZzZXQgKz0gYnl0ZXM7CisgICAgfQorICAgIHJldHVybiBieXRlczsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6YmVnaW5Cb3goY29uc3QgY2hhciAqZm91cmNjKSB7CiAgICAgQ0hFQ0tfRVEoc3RybGVuKGZvdXJjYyksIDQpOwogCi0gICAgbUJveGVzLnB1c2hfYmFjayhtT2Zmc2V0KTsKKyAgICBtQm94ZXMucHVzaF9iYWNrKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeT8KKyAgICAgICAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0OiBtT2Zmc2V0KTsKIAogICAgIHdyaXRlSW50MzIoMCk7CiAgICAgd3JpdGVGb3VyY2MoZm91cmNjKTsKQEAgLTI0OSw1MSArODAzLDgyIEBACiAgICAgb2ZmX3Qgb2Zmc2V0ID0gKi0tbUJveGVzLmVuZCgpOwogICAgIG1Cb3hlcy5lcmFzZSgtLW1Cb3hlcy5lbmQoKSk7CiAKLSAgICBmc2VlayhtRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgd3JpdGVJbnQzMihtT2Zmc2V0IC0gb2Zmc2V0KTsKLSAgICBtT2Zmc2V0IC09IDQ7Ci0gICAgZnNlZWsobUZpbGUsIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7CisgICAgICAgaW50MzJfdCB4ID0gaHRvbmwobU1vb3ZCb3hCdWZmZXJPZmZzZXQgLSBvZmZzZXQpOworICAgICAgIG1lbWNweShtTW9vdkJveEJ1ZmZlciArIG9mZnNldCwgJngsIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZzZWVrbyhtRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIHdyaXRlSW50MzIobU9mZnNldCAtIG9mZnNldCk7CisgICAgICAgIG1PZmZzZXQgLT0gNDsKKyAgICAgICAgZnNlZWtvKG1GaWxlLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgfQogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUludDgoaW50OF90IHgpIHsKLSAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKLSAgICArK21PZmZzZXQ7CisgICAgd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbnQxNihpbnQxNl90IHgpIHsKICAgICB4ID0gaHRvbnMoeCk7Ci0gICAgZndyaXRlKCZ4LCAxLCAyLCBtRmlsZSk7Ci0gICAgbU9mZnNldCArPSAyOworICAgIHdyaXRlKCZ4LCAxLCAyLCBtRmlsZSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSW50MzIoaW50MzJfdCB4KSB7CiAgICAgeCA9IGh0b25sKHgpOwotICAgIGZ3cml0ZSgmeCwgMSwgNCwgbUZpbGUpOwotICAgIG1PZmZzZXQgKz0gNDsKKyAgICB3cml0ZSgmeCwgMSwgNCwgbUZpbGUpOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUludDY0KGludDY0X3QgeCkgewogICAgIHggPSBodG9uNjQoeCk7Ci0gICAgZndyaXRlKCZ4LCAxLCA4LCBtRmlsZSk7Ci0gICAgbU9mZnNldCArPSA4OworICAgIHdyaXRlKCZ4LCAxLCA4LCBtRmlsZSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ1N0cmluZyhjb25zdCBjaGFyICpzKSB7CiAgICAgc2l6ZV90IG4gPSBzdHJsZW4ocyk7Ci0KLSAgICBmd3JpdGUocywgMSwgbiArIDEsIG1GaWxlKTsKLSAgICBtT2Zmc2V0ICs9IG4gKyAxOworICAgIHdyaXRlKHMsIDEsIG4gKyAxLCBtRmlsZSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlRm91cmNjKGNvbnN0IGNoYXIgKnMpIHsKICAgICBDSEVDS19FUShzdHJsZW4ocyksIDQpOwotICAgIGZ3cml0ZShzLCAxLCA0LCBtRmlsZSk7Ci0gICAgbU9mZnNldCArPSA0OworICAgIHdyaXRlKHMsIDEsIDQsIG1GaWxlKTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBmd3JpdGUoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOwotICAgIG1PZmZzZXQgKz0gc2l6ZTsKKyAgICB3cml0ZShkYXRhLCAxLCBzaXplLCBtRmlsZSk7Cit9CisKK2Jvb2wgTVBFRzRXcml0ZXI6OmlzRmlsZVN0cmVhbWFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJlYW1hYmxlRmlsZTsKK30KKworYm9vbCBNUEVHNFdyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgLy8gTm8gbGltaXQKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5Ub3RhbEJ5dGVzRXN0aW1hdGUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihtRXN0aW1hdGVkTW9vdkJveFNpemUpOworICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIG5Ub3RhbEJ5dGVzRXN0aW1hdGUgKz0gKCppdCktPmdldEVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzKCk7CisgICAgfQorCisgICAgcmV0dXJuIChuVG90YWxCeXRlc0VzdGltYXRlID49IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworfQorCitib29sIE1QRUc0V3JpdGVyOjpleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSB7CisgICAgLy8gTm8gbGltaXQKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5nZXREdXJhdGlvblVzKCkgPj0gbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBNUEVHNFdyaXRlcjo6cmVhY2hlZEVPUygpIHsKQEAgLTMwOSw2ICs4OTQsMjYgQEAKICAgICByZXR1cm4gYWxsRG9uZTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6c2V0U3RhcnRUaW1lc3RhbXBVcyhpbnQ2NF90IHRpbWVVcykgeworICAgIExPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICVsbGQiLCB0aW1lVXMpOworICAgIENIRUNLKHRpbWVVcyA+PSAwKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtU3RhcnRUaW1lc3RhbXBVcyA8IDAgfHwgbVN0YXJ0VGltZXN0YW1wVXMgPiB0aW1lVXMpIHsKKyAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSB0aW1lVXM7CisgICAgICAgIExPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICVsbGQiLCBtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgfQorfQorCitpbnQ2NF90IE1QRUc0V3JpdGVyOjpnZXRTdGFydFRpbWVzdGFtcFVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TdGFydFRpbWVzdGFtcFVzOworfQorCitzaXplX3QgTVBFRzRXcml0ZXI6Om51bVRyYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRXcml0ZXI6OlRyYWNrOjpUcmFjaygKQEAgLTMxNywxMCArOTIyLDEyNSBAQAogICAgICAgbU1ldGEoc291cmNlLT5nZXRGb3JtYXQoKSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtRG9uZShmYWxzZSksCi0gICAgICBtTWF4VGltZVN0YW1wVXMoMCksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZXN1bWVkKGZhbHNlKSwKKyAgICAgIG1UcmFja0R1cmF0aW9uVXMoMCksCisgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoMCksCisgICAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSh0cnVlKSwKICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YShOVUxMKSwKICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUoMCksCi0gICAgICBtUmVhY2hlZEVPUyhmYWxzZSkgeworICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKKyAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSwKKyAgICAgIG1Sb3RhdGlvbigwKSB7CisgICAgZ2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBtSXNBdmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKyAgICBtSXNNUEVHNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAorICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIHNldFRpbWVTY2FsZSgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7CisKKyAgICBpbnQ2NF90IHN0Y29Cb3hTaXplQnl0ZXMgPSBtT3duZXItPnVzZTMyQml0RmlsZU9mZnNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbU51bVN0Y29UYWJsZUVudHJpZXMgKiA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbU51bVN0Y29UYWJsZUVudHJpZXMgKiA4OworCisgICAgaW50NjRfdCBzdHN6Qm94U2l6ZUJ5dGVzID0gbVNhbXBsZXNIYXZlU2FtZVNpemU/IDQ6IChtTnVtU2FtcGxlcyAqIDQpOworCisgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gbU1kYXRTaXplQnl0ZXM7ICAvLyBtZWRpYSBkYXRhIHNpemUKKyAgICBpZiAoIW1Pd25lci0+aXNGaWxlU3RyZWFtYWJsZSgpKSB7CisgICAgICAgIC8vIFJlc2VydmVkIGZyZWUgc3BhY2UgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkCisgICAgICAgIC8vIGFsbCBtZXRhIGRhdGEgYW5kIHRodXMgd2FzdGVkLgorICAgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgKz0gbU51bVN0c2NUYWJsZUVudHJpZXMgKiAxMiArICAvLyBzdHNjIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjb0JveFNpemVCeXRlcyArICAgICAgICAgICAvLyBzdGNvIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHN6Qm94U2l6ZUJ5dGVzOyAgICAgICAgICAgIC8vIHN0c3ogYm94IHNpemUKKyAgICB9Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVTdHNjVGFibGVFbnRyeSgKKyAgICAgICAgc2l6ZV90IGNodW5rSWQsIHNpemVfdCBzYW1wbGVJZCkgeworCisgICAgICAgIFN0c2NUYWJsZUVudHJ5IHN0c2NFbnRyeShjaHVua0lkLCBzYW1wbGVJZCwgMSk7CisgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzLnB1c2hfYmFjayhzdHNjRW50cnkpOworICAgICAgICArK21OdW1TdHNjVGFibGVFbnRyaWVzOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lU3Rzc1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUlkKSB7CisgICAgbVN0c3NUYWJsZUVudHJpZXMucHVzaF9iYWNrKHNhbXBsZUlkKTsKKyAgICArK21OdW1TdHNzVGFibGVFbnRyaWVzOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lU3R0c1RhYmxlRW50cnkoCisgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50NjRfdCBkdXJhdGlvblVzKSB7CisKKyAgICBTdHRzVGFibGVFbnRyeSBzdHRzRW50cnkoc2FtcGxlQ291bnQsIGR1cmF0aW9uVXMpOworICAgIG1TdHRzVGFibGVFbnRyaWVzLnB1c2hfYmFjayhzdHRzRW50cnkpOworICAgICsrbU51bVN0dHNUYWJsZUVudHJpZXM7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRDaHVua09mZnNldChvZmZfdCBvZmZzZXQpIHsKKyAgICArK21OdW1TdGNvVGFibGVFbnRyaWVzOworICAgIG1DaHVua09mZnNldHMucHVzaF9iYWNrKG9mZnNldCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpzZXRUaW1lU2NhbGUoKSB7CisgICAgTE9HVigic2V0VGltZVNjYWxlIik7CisgICAgLy8gRGVmYXVsdCB0aW1lIHNjYWxlCisgICAgbVRpbWVTY2FsZSA9IDkwMDAwOworCisgICAgaWYgKG1Jc0F1ZGlvKSB7CisgICAgICAgIC8vIFVzZSB0aGUgc2FtcGxpbmcgcmF0ZSBhcyB0aGUgZGVmYXVsdCB0aW1lIHNjYWxlIGZvciBhdWRpbyB0cmFjay4KKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgICAgIENIRUNLKHN1Y2Nlc3MpOworICAgICAgICBtVGltZVNjYWxlID0gc2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICAvLyBJZiBzb21lb25lIHdvdWxkIGxpa2UgdG8gb3ZlcndyaXRlIHRoZSB0aW1lc2NhbGUsIHVzZSB1c2VyLXN1cHBsaWVkIHZhbHVlLgorICAgIGludDMyX3QgdGltZVNjYWxlOworICAgIGlmIChtTWV0YS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZ0aW1lU2NhbGUpKSB7CisgICAgICAgIG1UaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgfQorCisgICAgQ0hFQ0sobVRpbWVTY2FsZSA+IDApOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKHNpemUpOworICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIG1Hb3RBbGxDb2RlY1NwZWNpZmljRGF0YSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQorICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1NZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIEVTRFMgZXNkcyhkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZkYXRhLCAmc2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1Db2RlY1NwZWNpZmljRGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogTVBFRzRXcml0ZXI6OlRyYWNrOjp+VHJhY2soKSB7CkBAIC0zMzIsOSArMTA1MiwxOTYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RhcnQoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjppbml0VHJhY2tpbmdQcm9ncmVzc1N0YXR1cyhNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTE9HVigiaW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMiKTsKKyAgICBtUHJldmlvdXNUcmFja1RpbWVVcyA9IC0xOworICAgIG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzID0gZmFsc2U7CisgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IDA7CisgICAgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCAmdGltZVVzKSkgeworICAgICAgICAgICAgTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gdGltZVVzOworICAgICAgICAgICAgbVRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQogCisvLyBzdGF0aWMKK3ZvaWQgKk1QRUc0V3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgTE9HVigiVGhyZWFkV3JhcHBlcjogJXAiLCBtZSk7CisgICAgTVBFRzRXcml0ZXIgKndyaXRlciA9IHN0YXRpY19jYXN0PE1QRUc0V3JpdGVyICo+KG1lKTsKKyAgICB3cml0ZXItPnRocmVhZEZ1bmMoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6YnVmZmVyQ2h1bmsoY29uc3QgQ2h1bmsmIGNodW5rKSB7CisgICAgTE9HVigiYnVmZmVyQ2h1bms6ICVwIiwgY2h1bmsubVRyYWNrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIENIRUNLX0VRKG1Eb25lLCBmYWxzZSk7CisKKyAgICBmb3IgKExpc3Q8Q2h1bmtJbmZvPjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtJbmZvcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbUNodW5rSW5mb3MuZW5kKCk7ICsraXQpIHsKKworICAgICAgICBpZiAoY2h1bmsubVRyYWNrID09IGl0LT5tVHJhY2spIHsgIC8vIEZvdW5kIG93bmVyCisgICAgICAgICAgICBpdC0+bUNodW5rcy5wdXNoX2JhY2soY2h1bmspOworICAgICAgICAgICAgbUNodW5rUmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDSygiUmVjZWl2ZWQgYSBjaHVuayBmb3IgYSB1bmtub3duIHRyYWNrIiA9PSAwKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVGaXJzdENodW5rKENodW5rSW5mbyogaW5mbykgeworICAgIExPR1YoIndyaXRlRmlyc3RDaHVuazogJXAiLCBpbmZvLT5tVHJhY2spOworCisgICAgTGlzdDxDaHVuaz46Oml0ZXJhdG9yIGNodW5rSXQgPSBpbmZvLT5tQ2h1bmtzLmJlZ2luKCk7CisgICAgZm9yIChMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IGNodW5rSXQtPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjaHVua0l0LT5tU2FtcGxlcy5lbmQoKTsgKytpdCkgeworCisgICAgICAgIG9mZl90IG9mZnNldCA9IGluZm8tPm1UcmFjay0+aXNBdmMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbCgqaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRTYW1wbGVfbCgqaXQpOworICAgICAgICBpZiAoaXQgPT0gY2h1bmtJdC0+bVNhbXBsZXMuYmVnaW4oKSkgeworICAgICAgICAgICAgaW5mby0+bVRyYWNrLT5hZGRDaHVua09mZnNldChvZmZzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG9uZSB3aXRoIHRoZSBjdXJyZW50IGNodW5rLgorICAgIC8vIFJlbGVhc2UgYWxsIHRoZSBzYW1wbGVzIGluIHRoaXMgY2h1bmsuCisgICAgd2hpbGUgKCFjaHVua0l0LT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8TWVkaWFCdWZmZXIgKj46Oml0ZXJhdG9yIGl0ID0gY2h1bmtJdC0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKKyAgICAgICAgKCppdCkgPSBOVUxMOworICAgICAgICBjaHVua0l0LT5tU2FtcGxlcy5lcmFzZShpdCk7CisgICAgfQorICAgIGNodW5rSXQtPm1TYW1wbGVzLmNsZWFyKCk7CisgICAgaW5mby0+bUNodW5rcy5lcmFzZShjaHVua0l0KTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVDaHVua3MoKSB7CisgICAgTE9HVigid3JpdGVDaHVua3MiKTsKKyAgICBzaXplX3Qgb3V0c3RhbmRpbmdDaHVua3MgPSAwOworICAgIHdoaWxlICghbUNodW5rSW5mb3MuZW1wdHkoKSkgeworICAgICAgICBMaXN0PENodW5rSW5mbz46Oml0ZXJhdG9yIGl0ID0gbUNodW5rSW5mb3MuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKCFpdC0+bUNodW5rcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDSEVDS19FUShPSywgd3JpdGVPbmVDaHVuaygpKTsKKyAgICAgICAgICAgICsrb3V0c3RhbmRpbmdDaHVua3M7CisgICAgICAgIH0KKyAgICAgICAgaXQtPm1UcmFjayA9IE5VTEw7CisgICAgICAgIG1DaHVua0luZm9zLmVyYXNlKGl0KTsKKyAgICB9CisgICAgbUNodW5rSW5mb3MuY2xlYXIoKTsKKyAgICBMT0dEKCIlZCBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjp3cml0ZU9uZUNodW5rKCkgeworICAgIExPR1YoIndyaXRlT25lQ2h1bmsiKTsKKworICAgIC8vIEZpbmQgdGhlIHNtYWxsZXN0IHRpbWVzdGFtcCwgYW5kIHdyaXRlIHRoYXQgY2h1bmsgb3V0CisgICAgLy8gWFhYOiBXaGF0IGlmIHNvbWUgdHJhY2sgaXMganVzdCB0b28gc2xvdz8KKyAgICBpbnQ2NF90IG1pblRpbWVzdGFtcFVzID0gMHg3RkZGRkZGRkZGRkZGRkZGTEw7CisgICAgVHJhY2sgKnRyYWNrID0gTlVMTDsKKyAgICBmb3IgKExpc3Q8Q2h1bmtJbmZvPjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtJbmZvcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbUNodW5rSW5mb3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCFpdC0+bUNodW5rcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBMaXN0PENodW5rPjo6aXRlcmF0b3IgY2h1bmtJdCA9IGl0LT5tQ2h1bmtzLmJlZ2luKCk7CisgICAgICAgICAgICBpZiAoY2h1bmtJdC0+bVRpbWVTdGFtcFVzIDwgbWluVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXBVcyA9IGNodW5rSXQtPm1UaW1lU3RhbXBVczsKKyAgICAgICAgICAgICAgICB0cmFjayA9IGl0LT5tVHJhY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICBMT0dWKCJOb3RoaW5nIHRvIGJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUlzRmlyc3RDaHVuaykgeworICAgICAgICBtSXNGaXJzdENodW5rID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoTGlzdDxDaHVua0luZm8+OjppdGVyYXRvciBpdCA9IG1DaHVua0luZm9zLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtQ2h1bmtJbmZvcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPm1UcmFjayA9PSB0cmFjaykgeworICAgICAgICAgICAgd3JpdGVGaXJzdENodW5rKCYoKml0KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp0aHJlYWRGdW5jKCkgeworICAgIExPR1YoInRocmVhZEZ1bmMiKTsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiTVBFRzRXcml0ZXIiLCAwLCAwLCAwKTsKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgICAgICBtQ2h1bmtSZWFkeUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIENIRUNLX0VRKHdyaXRlT25lQ2h1bmsoKSwgT0spOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICAvLyBXcml0ZSBBTEwgc2FtcGxlcworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICB3cml0ZUNodW5rcygpOworICAgIH0KK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0YXJ0V3JpdGVyVGhyZWFkKCkgeworICAgIExPR1YoInN0YXJ0V3JpdGVyVGhyZWFkIik7CisKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1Jc0ZpcnN0Q2h1bmsgPSB0cnVlOworICAgIG1EcmlmdFRpbWVVcyA9IDA7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQ2h1bmtJbmZvIGluZm87CisgICAgICAgIGluZm8ubVRyYWNrID0gKml0OworICAgICAgICBtQ2h1bmtJbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgfQorCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgcmV0dXJuIE9LOworfQorCisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmICghbURvbmUgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgaWYgKHBhcmFtcyA9PSBOVUxMIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICBzdGFydFRpbWVVcyA9IDA7CisgICAgfQorCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKCFtSXNBdWRpbyAmJiBwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVJvdGF0aW9uRGVncmVlLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICBtUm90YXRpb24gPSByb3RhdGlvbkRlZ3JlZXM7CisgICAgfQorCisgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcgPSB0cnVlOworICAgIHsKKyAgICAgICAgaW50MzJfdCBpc05vdFJlYWxUaW1lOworICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlOb3RSZWFsVGltZSwgJmlzTm90UmVhbFRpbWUpKSB7CisgICAgICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IChpc05vdFJlYWxUaW1lID09IDApOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMocGFyYW1zKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQobWV0YS5nZXQoKSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRG9uZSA9IG1SZWFjaGVkRU9TID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTM0NSw4ICsxMjUyLDIwIEBACiAgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CiAKICAgICBtRG9uZSA9IGZhbHNlOwotICAgIG1NYXhUaW1lU3RhbXBVcyA9IDA7CisgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7CiAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOworICAgIG1OdW1TdGNvVGFibGVFbnRyaWVzID0gMDsKKyAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyA9IDA7CisgICAgbU51bVN0c2NUYWJsZUVudHJpZXMgPSAwOworICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzID0gMDsKKyAgICBtTWRhdFNpemVCeXRlcyA9IDA7CisgICAgbUlzTWVkaWFUaW1lQWRqdXN0bWVudE9uID0gZmFsc2U7CisgICAgbVByZXZNZWRpYVRpbWVBZGp1c3RUaW1lc3RhbXBVcyA9IDA7CisgICAgbU1lZGlhVGltZUFkanVzdE51bUZyYW1lcyA9IDA7CisgICAgbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGUgPSAwOworICAgIG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgPSAwOworICAgIG1QcmV2VG90YWxBY2N1bURyaWZ0VGltZVVzID0gMDsKIAogICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CiAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwpAQCAtMzU0LDkgKzEyNzMsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpzdG9wKCkgeworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpwYXVzZSgpIHsKKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RvcCgpIHsKICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgbURvbmUgPSB0cnVlOwpAQCAtMzY0LDcgKzEyODgsMTYgQEAKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKIAotICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworCisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6cmVhY2hlZEVPUygpIHsKQEAgLTM3NSwxNzMgKzEzMDgsODIzIEBACiB2b2lkICpNUEVHNFdyaXRlcjo6VHJhY2s6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKICAgICBUcmFjayAqdHJhY2sgPSBzdGF0aWNfY2FzdDxUcmFjayAqPihtZSk7CiAKLSAgICB0cmFjay0+dGhyZWFkRW50cnkoKTsKLQotICAgIHJldHVybiBOVUxMOworICAgIHN0YXR1c190IGVyciA9IHRyYWNrLT50aHJlYWRFbnRyeSgpOworICAgIHJldHVybiAodm9pZCAqKSBlcnI7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0aHJlYWRFbnRyeSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7Ci0gICAgYm9vbCBpc19tcGVnNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICBib29sIGlzX2F2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgaW50MzJfdCBjb3VudCA9IDA7CitzdGF0aWMgdm9pZCBnZXROYWxVbml0VHlwZSh1aW50OF90IGJ5dGUsIHVpbnQ4X3QqIHR5cGUpIHsKKyAgICBMT0dWKCJnZXROYWxVbml0VHlwZTogJWQiLCBieXRlKTsKIAorICAgIC8vIG5hbF91bml0X3R5cGU6IDUtYml0IHVuc2lnbmVkIGludGVnZXIKKyAgICAqdHlwZSA9IChieXRlICYgMHgxRik7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTmV4dFN0YXJ0Q29kZSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkgeworCisgICAgTE9HVigiZmluZE5leHRTdGFydENvZGU6ICVwICVkIiwgZGF0YSwgbGVuZ3RoKTsKKworICAgIHNpemVfdCBieXRlc0xlZnQgPSBsZW5ndGg7CisgICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgICYmCisgICAgICAgICAgICBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdLCA0KSkgeworICAgICAgICAtLWJ5dGVzTGVmdDsKKyAgICB9CisgICAgaWYgKGJ5dGVzTGVmdCA8PSA0KSB7CisgICAgICAgIGJ5dGVzTGVmdCA9IDA7IC8vIExhc3QgcGFyYW1ldGVyIHNldAorICAgIH0KKyAgICByZXR1cm4gJmRhdGFbbGVuZ3RoIC0gYnl0ZXNMZWZ0XTsKK30KKworY29uc3QgdWludDhfdCAqTVBFRzRXcml0ZXI6OlRyYWNrOjpwYXJzZVBhcmFtU2V0KAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgdHlwZSwgc2l6ZV90ICpwYXJhbVNldExlbikgeworCisgICAgTE9HVigicGFyc2VQYXJhbVNldCIpOworICAgIENIRUNLKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgfHwKKyAgICAgICAgICB0eXBlID09IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0KTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBmaW5kTmV4dFN0YXJ0Q29kZShkYXRhLCBsZW5ndGgpOworICAgICpwYXJhbVNldExlbiA9IG5leHRTdGFydENvZGUgLSBkYXRhOworICAgIGlmICgqcGFyYW1TZXRMZW4gPT0gMCkgeworICAgICAgICBMT0dFKCJQYXJhbSBzZXQgaXMgbWFsZm9ybWVkLCBzaW5jZSBpdHMgbGVuZ3RoIGlzIDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQVZDUGFyYW1TZXQgcGFyYW1TZXQoKnBhcmFtU2V0TGVuLCBkYXRhKTsKKyAgICBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCkgeworICAgICAgICBpZiAoKnBhcmFtU2V0TGVuIDwgNCkgeworICAgICAgICAgICAgTE9HRSgiU2VxIHBhcmFtZXRlciBzZXQgbWFsZm9ybWVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlcVBhcmFtU2V0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtUHJvZmlsZUlkYyA9IGRhdGFbMV07CisgICAgICAgICAgICBtUHJvZmlsZUNvbXBhdGlibGUgPSBkYXRhWzJdOworICAgICAgICAgICAgbUxldmVsSWRjID0gZGF0YVszXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZUlkYyAhPSBkYXRhWzFdIHx8CisgICAgICAgICAgICAgICAgbVByb2ZpbGVDb21wYXRpYmxlICE9IGRhdGFbMl0gfHwKKyAgICAgICAgICAgICAgICBtTGV2ZWxJZGMgIT0gZGF0YVszXSkgeworICAgICAgICAgICAgICAgIExPR0UoIkluY29uc2lzdGVudCBwcm9maWxlL2xldmVsIGZvdW5kIGluIHNlcSBwYXJhbWV0ZXIgc2V0cyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TZXFQYXJhbVNldHMucHVzaF9iYWNrKHBhcmFtU2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGljUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7CisgICAgfQorICAgIHJldHVybiBuZXh0U3RhcnRDb2RlOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmNvcHlBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBMT0dWKCJjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEiKTsKKworICAgIC8vIDIgYnl0ZXMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGZpZWxkCisgICAgLy8gcGx1cyB0aGUgNyBieXRlcyBmb3IgdGhlIGhlYWRlcgorICAgIGlmIChzaXplIDwgNCArIDcpIHsKKyAgICAgICAgTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlZCIsIHNpemUpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPSBzaXplOworICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6cGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKworICAgIExPR1YoInBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEiKTsKKyAgICAvLyBEYXRhIHN0YXJ0cyB3aXRoIGEgc3RhcnQgY29kZS4KKyAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc2VwYXJhdGVkIHdpdGggc3RhcnQgY29kZXMuCisgICAgLy8gQWxzbywgU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTCisgICAgdWludDhfdCB0eXBlID0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQ7CisgICAgYm9vbCBnb3RTcHMgPSBmYWxzZTsKKyAgICBib29sIGdvdFBwcyA9IGZhbHNlOworICAgIGNvbnN0IHVpbnQ4X3QgKnRtcCA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqbmV4dFN0YXJ0Q29kZSA9IGRhdGE7CisgICAgc2l6ZV90IGJ5dGVzTGVmdCA9IHNpemU7CisgICAgc2l6ZV90IHBhcmFtU2V0TGVuID0gMDsKKyAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gMDsKKyAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAmJiAhbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgdG1wLCA0KSkgeworICAgICAgICBnZXROYWxVbml0VHlwZSgqKHRtcCArIDQpLCAmdHlwZSk7CisgICAgICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7CisgICAgICAgICAgICBpZiAoZ290UHBzKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ290U3BzKSB7CisgICAgICAgICAgICAgICAgZ290U3BzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsICZwYXJhbVNldExlbik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCkgeworICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTUFMgbXVzdCBjb21lIGJlZm9yZSBQUFMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFnb3RQcHMpIHsKKyAgICAgICAgICAgICAgICBnb3RQcHMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dFN0YXJ0Q29kZSA9IHBhcnNlUGFyYW1TZXQodG1wICsgNCwgYnl0ZXNMZWZ0IC0gNCwgdHlwZSwgJnBhcmFtU2V0TGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk9ubHkgU1BTIGFuZCBQUFMgTmFsIHVuaXRzIGFyZSBleHBlY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXh0U3RhcnRDb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIG9uIHRvIGZpbmQgdGhlIG5leHQgcGFyYW1ldGVyIHNldAorICAgICAgICBieXRlc0xlZnQgLT0gbmV4dFN0YXJ0Q29kZSAtIHRtcDsKKyAgICAgICAgdG1wID0gbmV4dFN0YXJ0Q29kZTsKKyAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArPSAoMiArIHBhcmFtU2V0TGVuKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIENoZWNrIG9uIHRoZSBudW1iZXIgb2Ygc2VxIHBhcmFtZXRlciBzZXRzCisgICAgICAgIHNpemVfdCBuU2VxUGFyYW1TZXRzID0gbVNlcVBhcmFtU2V0cy5zaXplKCk7CisgICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID09IDApIHsKKyAgICAgICAgICAgIExPR0UoIkNvdW5kIG5vdCBmaW5kIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKKyAgICAgICAgICAgIExPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHBpYyBwYXJhbWV0ZXIgc2V0cworICAgICAgICBzaXplX3QgblBpY1BhcmFtU2V0cyA9IG1QaWNQYXJhbVNldHMuc2l6ZSgpOworICAgICAgICBpZiAoblBpY1BhcmFtU2V0cyA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VuZCBub3QgZmluZCBwaWN0dXJlIHBhcmFtZXRlciBzZXQiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7CisgICAgICAgICAgICBMT0dFKCJUb28gbWFueSBwaWMgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5QaWNQYXJhbVNldHMpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgb24gdGhlIHByb2ZpbGVzCisgICAgICAgIC8vIFRoZXNlIHByb2ZpbGVzIHJlcXVpcmVzIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHNldCBleHRlbnNpb25zCisgICAgICAgIGlmIChtUHJvZmlsZUlkYyA9PSAxMDAgfHwgbVByb2ZpbGVJZGMgPT0gMTEwIHx8CisgICAgICAgICAgICBtUHJvZmlsZUlkYyA9PSAxMjIgfHwgbVByb2ZpbGVJZGMgPT0gMTQ0KSB7CisgICAgICAgICAgICBMT0dFKCJTb3JyeSwgbm8gc3VwcG9ydCBmb3IgcHJvZmlsZV9pZGM6ICVkISIsIG1Qcm9maWxlSWRjKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6bWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworCisgICAgaWYgKG1Db2RlY1NwZWNpZmljRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIExPR0UoIkFscmVhZHkgaGF2ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIExPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBEYXRhIGlzIGluIHRoZSBmb3JtIG9mIEFWQ0NvZGVjU3BlY2lmaWNEYXRhCisgICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7CisgICAgICAgIHJldHVybiBjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBJU08gMTQ0OTYtMTU6IEFWQyBmaWxlIGZvcm1hdAorICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKz0gNzsgIC8vIDcgbW9yZSBieXRlcyBpbiB0aGUgaGVhZGVyCisgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgIHVpbnQ4X3QgKmhlYWRlciA9ICh1aW50OF90ICopbUNvZGVjU3BlY2lmaWNEYXRhOworICAgIGhlYWRlclswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgIGhlYWRlclsxXSA9IG1Qcm9maWxlSWRjOyAgICAgICAgICAgLy8gcHJvZmlsZSBpbmRpY2F0aW9uCisgICAgaGVhZGVyWzJdID0gbVByb2ZpbGVDb21wYXRpYmxlOyAgICAvLyBwcm9maWxlIGNvbXBhdGliaWxpdHkKKyAgICBoZWFkZXJbM10gPSBtTGV2ZWxJZGM7CisKKyAgICAvLyA2LWJpdCAnMTExMTExJyBmb2xsb3dlZCBieSAyLWJpdCB0byBsZW5ndGhTaXplTWludXVzT25lCisgICAgaWYgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpKSB7CisgICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAzOyAgLy8gbGVuZ3RoIHNpemUgPT0gNCBieXRlcworICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAxOyAgLy8gbGVuZ3RoIHNpemUgPT0gMiBieXRlcworICAgIH0KKworICAgIC8vIDMtYml0ICcxMTEnIGZvbGxvd2VkIGJ5IDUtYml0IG51bVNlcXVlbmNlUGFyYW1ldGVyU2V0cworICAgIGludCBuU2VxdWVuY2VQYXJhbVNldHMgPSBtU2VxUGFyYW1TZXRzLnNpemUoKTsKKyAgICBoZWFkZXJbNV0gPSAweGUwIHwgblNlcXVlbmNlUGFyYW1TZXRzOworICAgIGhlYWRlciArPSA2OworICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gbVNlcVBhcmFtU2V0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVNlcVBhcmFtU2V0cy5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyAxNi1iaXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBsZW5ndGgKKyAgICAgICAgdWludDE2X3Qgc2VxUGFyYW1TZXRMZW5ndGggPSBpdC0+bUxlbmd0aDsKKyAgICAgICAgaGVhZGVyWzBdID0gc2VxUGFyYW1TZXRMZW5ndGggPj4gODsKKyAgICAgICAgaGVhZGVyWzFdID0gc2VxUGFyYW1TZXRMZW5ndGggJiAweGZmOworCisgICAgICAgIC8vIFNQUyBOQUwgdW5pdCAoc2VxdWVuY2UgcGFyYW1ldGVyIGxlbmd0aCBieXRlcykKKyAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgc2VxUGFyYW1TZXRMZW5ndGgpOworICAgICAgICBoZWFkZXIgKz0gKDIgKyBzZXFQYXJhbVNldExlbmd0aCk7CisgICAgfQorCisgICAgLy8gOC1iaXQgblBpY3R1cmVQYXJhbWV0ZXJTZXRzCisgICAgaW50IG5QaWN0dXJlUGFyYW1TZXRzID0gbVBpY1BhcmFtU2V0cy5zaXplKCk7CisgICAgaGVhZGVyWzBdID0gblBpY3R1cmVQYXJhbVNldHM7CisgICAgaGVhZGVyICs9IDE7CisgICAgZm9yIChMaXN0PEFWQ1BhcmFtU2V0Pjo6aXRlcmF0b3IgaXQgPSBtUGljUGFyYW1TZXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtUGljUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIC8vIDE2LWJpdCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHVpbnQxNl90IHBpY1BhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7CisgICAgICAgIGhlYWRlclswXSA9IHBpY1BhcmFtU2V0TGVuZ3RoID4+IDg7CisgICAgICAgIGhlYWRlclsxXSA9IHBpY1BhcmFtU2V0TGVuZ3RoICYgMHhmZjsKKworICAgICAgICAvLyBQUFMgTmFsIHVuaXQgKHBpY3R1cmUgcGFyYW1ldGVyIHNldCBsZW5ndGggYnl0ZXMpCisgICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHBpY1BhcmFtU2V0TGVuZ3RoKTsKKyAgICAgICAgaGVhZGVyICs9ICgyICsgcGljUGFyYW1TZXRMZW5ndGgpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyogVGhlIHZpZGVvIHRyYWNrJ3MgbWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zCisqIGlzIGRlc2NyaWJlZCBhcyBmb2xsb3dzOgorKgorKiBGaXJzdCwgdGhlIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBpcyBkb25lIGZvciBldmVyeSBwZXJpb2Qgb2YKKyoga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMKKyogaXMgY3VycmVudGx5IGEgZml4ZWQgdmFsdWUgY2hvc2VuIGhldXJpc3RpY2FsbHkuIFRoZSB2YWx1ZSBvZgorKiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMgc2hvdWxkIG5vdCBiZSB2ZXJ5IGxhcmdlIG9yIHZlcnkgc21hbGwKKyogZm9yIHR3byBjb25zaWRlcmF0aW9uczogb24gb25lIGhhbmQsIGEgcmVsYXRpdmVseSBsYXJnZSB2YWx1ZQorKiBoZWxwcyByZWR1Y2UgbGFyZ2UgZmx1Y3R1YXRpb24gb2YgZHJpZnQgdGltZSBpbiB0aGUgYXVkaW8gZW5jb2RpbmcKKyogcGF0aDsgd2hpbGUgb24gdGhlIG90aGVyIGhhbmQsIGEgcmVsYXRpdmVseSBzbWFsbCB2YWx1ZSBoZWxwcyBrZWVwCisqIHJlc3RvcmluZyBzeW5jaHJvbml6YXRpb24gaW4gYXVkaW8vdmlkZW8gbW9yZSBmcmVxdWVudGx5LiBOb3RlIGZvciB0aGUKKyogdmVyeSBmaXJzdCBwZXJpb2Qgb2Yga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLCB0aGVyZSBpcworKiBubyBtZWRpYSB0aW1lIGFkanVzdG1lbnQgZm9yIHRoZSB2aWRlbyB0cmFjay4KKyoKKyogU2Vjb25kLCB0aGUgdG90YWwgYWNjdW11bGF0ZWQgYXVkaW8gdHJhY2sgdGltZSBkcmlmdCBmb3VuZAorKiBpbiBhIHBlcmlvZCBvZiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMgaXMgZGlzdHJpYnV0ZWQKKyogb3ZlciBhIHN0cmVhbSBvZiBpbmNvbWluZyB2aWRlbyBmcmFtZXMuIFRoZSBudW1iZXIgb2YgdmlkZW8gZnJhbWVzCisqIGFmZmVjdGVkIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIG51bWJlciBvZiByZWNvcmRlZCB2aWRlbyBmcmFtZXMKKyogd2l0aGluIHRoZSBwYXN0IGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVcyBwZXJpb2QuCisqIFdlIGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBkcmlmdCB0aW1lIG92ZXIgb25seSBhIHBvcnRpb24KKyogKHJhdGhlciB0aGFuIGFsbCkgb2YgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRlZCB2aWRlbyBmcmFtZXMKKyogaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZpZGVvIHRyYWNrIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBpcworKiBjb21wbGV0ZWQgZm9yIHRoZSBjdXJyZW50IHBlcmlvZCBiZWZvcmUgdGhlIG5leHQgdmlkZW8gdHJhY2sgbWVkaWEKKyogdGltZSBhZGp1c3RtZW50IHBlcmlvZCBzdGFydHMuIEN1cnJlbnRseSwgdGhlIHBvcnRpb24gY2hvc2VuIGlzIGEKKyogaGFsZiAoMC41KS4KKyoKKyogTGFzdCwgdmFyaW91cyBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHRvIGVuc3VyZSB0aGF0CisqIHRoZSBhY3R1YWwgYXVkaW8gZW5jb2RpbmcgcGF0aCBkb2VzIG5vdCBoYXZlIHRvbyBtdWNoIGRyaWZ0LgorKiBJbiBwYXJ0aWN1bGFyLCAxKSB3ZSB3YW50IHRvIGxpbWl0IHRoZSBhdmVyYWdlIGluY3JlbWVudGFsIHRpbWUKKyogYWRqdXN0bWVudCBmb3IgZWFjaCB2aWRlbyBmcmFtZSB0byBiZSBsZXNzIHRoYW4gYSB0aHJlc2hvbGQKKyogZm9yIGEgc2luZ2xlIHBlcmlvZCBvZiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMuCisqIEN1cnJlbnRseSwgdGhlIHRocmVzaG9sZCBpcyBzZXQgdG8gNSBtcy4gSWYgdGhlIGF2ZXJhZ2UgaW5jcmVtZW50YWwKKyogbWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciBhIHZpZGVvIGZyYW1lIGlzIGxhcmdlciB0aGFuIHRoZQorKiB0aHJlc2hvbGQsIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRoIGhhcyB0b28gbXVjaCB0aW1lIGRyaWZ0LgorKiAyKSBXZSBhbHNvIHdhbnQgdG8gbGltaXQgdGhlIHRvdGFsIHRpbWUgZHJpZnQgaW4gdGhlIGF1ZGlvCisqIGVuY29kaW5nIHBhdGggdG8gYmUgbGVzcyB0aGFuIGEgdGhyZXNob2xkIGZvciBhIHBlcmlvZCBvZgorKiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMuIEN1cnJlbnRseSwgdGhlIHRocmVzaG9sZAorKiBpcyAwLjUlIG9mIGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVcy4gSWYgdGhlIHRpbWUgZHJpZnQgb2YKKyogdGhlIGF1ZGlvIGVuY29kaW5nIHBhdGggaXMgbGFyZ2VyIHRoYW4gdGhlIHRocmVzaG9sZCwgdGhlIGF1ZGlvCisqIGVuY29kaW5nIHBhdGggaGFzIHRvbyBtdWNoIHRpbWUgZHJpZnQuIFdlIHRyZWF0IHRoZSBsYXJnZSB0aW1lCisqIGRyaWZ0IG9mIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRoIGFzIGVycm9ycywgc2luY2UgdGhlcmUgaXMgbm8KKyogd2F5IHRvIGtlZXAgYXVkaW8vdmlkZW8gaW4gc3luY2hyb25pemF0aW9uIGZvciByZWFsLXRpbWUKKyogYXBwbGljYXRpb25zIGlmIHRoZSB0aW1lIGRyaWZ0IGlzIHRvbyBsYXJnZSB1bmxlc3Mgd2UgZHJvcCBzb21lCisqIHZpZGVvIGZyYW1lcywgd2hpY2ggaGFzIGl0cyBvd24gcHJvYmxlbXMgdGhhdCB3ZSBkb24ndCB3YW50CisqIHRvIGdldCBpbnRvIGZvciB0aGUgdGltZSBiZWluZy4KKyovCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRqdXN0TWVkaWFUaW1lKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKCp0aW1lc3RhbXBVcyAtIG1QcmV2TWVkaWFUaW1lQWRqdXN0VGltZXN0YW1wVXMgPj0KKyAgICAgICAga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzKSB7CisKKyAgICAgICAgTE9HVigiTmV3IG1lZGlhIHRpbWUgYWRqdXN0bWVudCBwZXJpb2QgYXQgJWxsZCB1cyIsICp0aW1lc3RhbXBVcyk7CisgICAgICAgIG1Jc01lZGlhVGltZUFkanVzdG1lbnRPbiA9IHRydWU7CisgICAgICAgIG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXMgPQorICAgICAgICAgICAgICAgIChtTnVtU2FtcGxlcyAtIG1QcmV2TWVkaWFUaW1lQWRqdXN0U2FtcGxlKSA+PiAxOworCisgICAgICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0VGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7CisgICAgICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0U2FtcGxlID0gbU51bVNhbXBsZXM7CisgICAgICAgIGludDY0X3QgdG90YWxBY2N1bURyaWZ0VGltZVVzID0gbU93bmVyLT5nZXREcmlmdFRpbWVVcygpOworICAgICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzID0KKyAgICAgICAgICAgICAgICB0b3RhbEFjY3VtRHJpZnRUaW1lVXMgLSBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVczsKKworICAgICAgICBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyA9IHRvdGFsQWNjdW1EcmlmdFRpbWVVczsKKworICAgICAgICAvLyBDaGVjayBvbiBpbmNyZW1lbnRhbCBhZGp1c3RlZCB0aW1lIHBlciBmcmFtZQorICAgICAgICBpbnQ2NF90IGFkanVzdFRpbWVQZXJGcmFtZVVzID0KKyAgICAgICAgICAgICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzIC8gbU1lZGlhVGltZUFkanVzdE51bUZyYW1lczsKKworICAgICAgICBpZiAoYWRqdXN0VGltZVBlckZyYW1lVXMgPCAwKSB7CisgICAgICAgICAgICBhZGp1c3RUaW1lUGVyRnJhbWVVcyA9IC1hZGp1c3RUaW1lUGVyRnJhbWVVczsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRqdXN0VGltZVBlckZyYW1lVXMgPj0gNTAwMCkgeworICAgICAgICAgICAgTE9HRSgiQWRqdXN0ZWQgdGltZSBwZXIgdmlkZW8gZnJhbWUgaXMgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgYWRqdXN0VGltZVBlckZyYW1lVXMpOworICAgICAgICAgICAgQ0hFQ0soISJWaWRlbyBmcmFtZSB0aW1lIGFkanVzdG1lbnQgaXMgdG9vIGxhcmdlISIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgb24gdG90YWwgYWNjdW11bGF0ZWQgdGltZSBkcmlmdCB3aXRoaW4gYSBwZXJpb2Qgb2YKKyAgICAgICAgLy8ga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLgorICAgICAgICBpbnQ2NF90IGRyaWZ0UGVyY2VudGFnZSA9IChtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzICogMTAwMCkKKyAgICAgICAgICAgICAgICAvIGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVczsKKworICAgICAgICBpZiAoZHJpZnRQZXJjZW50YWdlIDwgMCkgeworICAgICAgICAgICAgZHJpZnRQZXJjZW50YWdlID0gLWRyaWZ0UGVyY2VudGFnZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHJpZnRQZXJjZW50YWdlID4gNSkgeworICAgICAgICAgICAgTE9HRSgiQXVkaW8gdHJhY2sgaGFzIHRpbWUgZHJpZnQgJWxsZCB1cyBvdmVyICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMsCisgICAgICAgICAgICAgICAga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzKTsKKworICAgICAgICAgICAgQ0hFQ0soISJUaGUgYXVkaW8gdHJhY2sgbWVkaWEgdGltZSBkcmlmdHMgdG9vIG11Y2ghIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGlmIChtSXNNZWRpYVRpbWVBZGp1c3RtZW50T24pIHsKKyAgICAgICAgaWYgKG1OdW1TYW1wbGVzIC0gbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGUgPD0KKyAgICAgICAgICAgIG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXMpIHsKKworICAgICAgICAgICAgLy8gRG8gbWVkaWEgdGltZSBpbmNyZW1lbnRhbCBhZGp1c3RtZW50CisgICAgICAgICAgICBpbnQ2NF90IGluY3JlbWVudGFsQWRqdXN0VGltZVVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bVNhbXBsZXMgLSBtUHJldk1lZGlhVGltZUFkanVzdFNhbXBsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbU1lZGlhVGltZUFkanVzdE51bUZyYW1lczsKKworICAgICAgICAgICAgKnRpbWVzdGFtcFVzICs9CisgICAgICAgICAgICAgICAgKGluY3JlbWVudGFsQWRqdXN0VGltZVVzICsgbVByZXZUb3RhbEFjY3VtRHJpZnRUaW1lVXMpOworCisgICAgICAgICAgICBMT0dWKCJJbmNyZW1lbnRhbCB2aWRlbyBmcmFtZSBtZWRpYSB0aW1lIGFkanVzdG1lbnQ6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIChpbmNyZW1lbnRhbEFkanVzdFRpbWVVcyArIG1QcmV2VG90YWxBY2N1bURyaWZ0VGltZVVzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXaXRoaW4gdGhlIHJlbWFpbmluZyBhZGp1c3RtZW50IHBlcmlvZCwKKyAgICAgICAgICAgIC8vIG5vIGluY3JlbWVudGFsIGFkanVzdG1lbnQgaXMgbmVlZGVkLgorICAgICAgICAgICAgKnRpbWVzdGFtcFVzICs9CisgICAgICAgICAgICAgICAgKG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgKyBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyk7CisKKyAgICAgICAgICAgIExPR1YoIkZpeGVkIHZpZGVvIGZyYW1lIG1lZGlhIHRpbWUgYWRqdXN0bWVudDogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgKG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgKyBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcykpOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogVXBkYXRlcyB0aGUgZHJpZnQgdGltZSBmcm9tIHRoZSBhdWRpbyB0cmFjayBzbyB0aGF0CisgKiB0aGUgdmlkZW8gdHJhY2sgY2FuIGdldCB0aGUgdXBkYXRlZCBkcmlmdCB0aW1lIGluZm9ybWF0aW9uCisgKiBmcm9tIHRoZSBmaWxlIHdyaXRlci4gVGhlIGZsdWN0dWF0aW9uIG9mIHRoZSBkcmlmdCB0aW1lIG9mIHRoZSBhdWRpbworICogZW5jb2RpbmcgcGF0aCBpcyBzbW9vdGhlZCBvdXQgd2l0aCBhIHNpbXBsZSBmaWx0ZXIgYnkgZ2l2aW5nIGEgbGFyZ2VyCisgKiB3ZWlnaHQgdG8gbW9yZSByZWNlbnRseSBkcmlmdCB0aW1lLiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cywgMC41IGFuZCAwLjUsCisgKiBhcmUgaGV1cmlzdGljYWxseSBkZXRlcm1pbmVkLgorICovCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlRHJpZnRUaW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSkgeworICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleURyaWZ0VGltZSwgJmRyaWZ0VGltZVVzKSkgeworICAgICAgICBpbnQ2NF90IHByZXZEcmlmdFRpbWVVcyA9IG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKTsKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAoZHJpZnRUaW1lVXMgKyBwcmV2RHJpZnRUaW1lVXMpID4+IDE7CisgICAgICAgIG1Pd25lci0+c2V0RHJpZnRUaW1lVXModGltZVVzKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6dGhyZWFkRW50cnkoKSB7CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgY29uc3QgaW50NjRfdCBpbnRlcmxlYXZlRHVyYXRpb25VcyA9IG1Pd25lci0+aW50ZXJsZWF2ZUR1cmF0aW9uKCk7CisgICAgaW50NjRfdCBjaHVua1RpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQzMl90IG5DaHVua3MgPSAwOworICAgIGludDMyX3Qgblplcm9MZW5ndGhGcmFtZXMgPSAwOworICAgIGludDY0X3QgbGFzdFRpbWVzdGFtcFVzID0gMDsgIC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wIGluIG1zCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7ICAgLy8gQmV0d2VlbiB0aGUgcHJldmlvdXMgdHdvIHNhbXBsZXMgaW4gbXMKKyAgICBpbnQ2NF90IGN1cnJEdXJhdGlvblRpY2tzID0gMDsgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDY0X3QgbGFzdER1cmF0aW9uVGlja3MgPSAwOyAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50MzJfdCBzYW1wbGVDb3VudCA9IDE7ICAgICAgLy8gU2FtcGxlIGNvdW50IGluIHRoZSBjdXJyZW50IHN0dHMgdGFibGUgZW50cnkKKyAgICB1aW50MzJfdCBwcmV2aW91c1NhbXBsZVNpemUgPSAwOyAgLy8gU2l6ZSBvZiB0aGUgcHJldmlvdXMgc2FtcGxlCisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisKKyAgICBpZiAobUlzQXVkaW8pIHsKKyAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBdWRpb1RyYWNrRW5jb2RpbmciLCAwLCAwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIlZpZGVvVHJhY2tFbmNvZGluZyIsIDAsIDAsIDApOworICAgIH0KKyAgICBzcDxNZXRhRGF0YT4gbWV0YV9kYXRhOworCisgICAgbU51bVNhbXBsZXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKCFtRG9uZSAmJiBtU291cmNlLT5yZWFkKCZidWZmZXIpID09IE9LKSB7CisgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgKytuWmVyb0xlbmd0aEZyYW1lczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIHlldCwgZGVsYXkgcGF1c2UuCisgICAgICAgIC8vIEFmdGVyIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhIGlzIHJlY2VpdmVkLCBkaXNjYXJkIHdoYXQgd2UgcmVjZWl2ZWQKKyAgICAgICAgLy8gd2hlbiB0aGUgdHJhY2sgaXMgdG8gYmUgcGF1c2VkLgorICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgKytjb3VudDsKIAotICAgICAgICBpZiAoaXNfYXZjICYmIGNvdW50IDwgMykgewotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBpbnQzMl90IGlzQ29kZWNDb25maWc7CisgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKQorICAgICAgICAgICAgICAgICYmIGlzQ29kZWNDb25maWcpIHsKKyAgICAgICAgICAgIENIRUNLKCFtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEpOwogCi0gICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjU3BlY2lmaWNEYXRhLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKHNpemUgKyA4KTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaGVhZGVyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclswXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSA9IDB4NDI7ICAvLyBwcm9maWxlCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MWU7ICAvLyBsZXZlbAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMzsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzVdID0gMHhlMCB8IDE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls2XSA9IHNpemUgPj4gODsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzddID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmaGVhZGVyWzhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPSBzaXplICsgODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IG1Db2RlY1NwZWNpZmljRGF0YVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKz0gc2l6ZSArIDM7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IHJlYWxsb2MobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaGVhZGVyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcltvZmZzZXRdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyW29mZnNldCArIDFdID0gc2l6ZSA+PiA4OwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbb2Zmc2V0ICsgMl0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZoZWFkZXJbb2Zmc2V0ICsgM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNBdmMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc01QRUc0KSB7CisgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShtQ29kZWNTcGVjaWZpY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCisgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhID09IE5VTEwgJiYgaXNfbXBlZzQpIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKG9mZnNldCArIDMgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMAotICAgICAgICAgICAgICAgICAgICAmJiBkYXRhW29mZnNldCArIDJdID09IDB4MDEgJiYgZGF0YVtvZmZzZXQgKyAzXSA9PSAweGI2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrb2Zmc2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDSEVDSyhvZmZzZXQgKyAzIDwgc2l6ZSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgMyA+PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgLy8gWFhYIGFzc3VtZSB0aGUgZW50aXJlIGZpcnN0IGNodW5rIG9mIGRhdGEgaXMgdGhlIGNvZGVjIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgLy8gZGF0YS4KLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gb2Zmc2V0OwotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKG9mZnNldCk7Ci0gICAgICAgICAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBvZmZzZXQpOwotCi0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZl90IG9mZnNldCA9IGlzX2F2YyA/IG1Pd25lci0+YWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGUoYnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtT3duZXItPmFkZFNhbXBsZShidWZmZXIpOwotCi0gICAgICAgIFNhbXBsZUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5zaXplID0gaXNfYXZjID8gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDIgOiBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBpbmZvLm9mZnNldCA9IG9mZnNldDsKLQotICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOwotCi0gICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1NYXhUaW1lU3RhbXBVcykgewotICAgICAgICAgICAgbU1heFRpbWVTdGFtcFVzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPdXIgdGltZXN0YW1wIGlzIGluIG1zLgotICAgICAgICBpbmZvLnRpbWVzdGFtcCA9ICh0aW1lc3RhbXBVcyArIDUwMCkgLyAxMDAwOwotCi0gICAgICAgIG1TYW1wbGVJbmZvcy5wdXNoX2JhY2soaW5mbyk7Ci0KKyAgICAgICAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiB0aGUgTWVkaWFCdWZmZXIgYW5kIE1ldGFkYXRhIGFuZCByZWxlYXNlCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBhcyBzb29uIGFzIHdlIGNhbgorICAgICAgICBNZWRpYUJ1ZmZlciAqY29weSA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGNvcHktPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWV0YV9kYXRhID0gbmV3IE1ldGFEYXRhKCpidWZmZXItPm1ldGFfZGF0YSgpLmdldCgpKTsKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1Jc0F2YykgU3RyaXBTdGFydGNvZGUoY29weSk7CisKKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemUgPSBjb3B5LT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKG1Jc0F2YykgeworICAgICAgICAgICAgaWYgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSArPSA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVTaXplICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXggZmlsZSBzaXplIG9yIGR1cmF0aW9uIGhhbmRsaW5nCisgICAgICAgIG1NZGF0U2l6ZUJ5dGVzICs9IHNhbXBsZVNpemU7CisgICAgICAgIHVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCk7CisKKyAgICAgICAgaWYgKG1Pd25lci0+ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSkgeworICAgICAgICAgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobU93bmVyLT5leGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSkgeworICAgICAgICAgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50MzJfdCBpc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgbWV0YV9kYXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgb3JpZ2luYWwgdGltZXN0YW1wIGZvdW5kIGluIHRoZSBkYXRhIGJ1ZmZlciB3aWxsIGJlIG1vZGlmaWVkIGFzIGJlbG93OgorICAgICAgICAgKgorICAgICAgICAgKiBUaGVyZSBpcyBhIHBsYXliYWNrIG9mZnNldCBpbnRvIHRoaXMgdHJhY2sgaWYgdGhlIHRyYWNrJ3Mgc3RhcnQgdGltZQorICAgICAgICAgKiBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG1vdmllIHN0YXJ0IHRpbWUsIHdoaWNoIHdpbGwgYmUgcmVjb3JkZWQgaW4gZWRzdAorICAgICAgICAgKiBib3ggb2YgdGhlIG91dHB1dCBmaWxlLiBUaGUgcGxheWJhY2sgb2Zmc2V0IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAgICAgKiBzdGFydGluZyB0aW1lIG9mIHRoZSBhdWRpby92aWRlbyB0cmFja3MgYXJlIHN5bmNocm9uaXplZC4gQWx0aG91Z2ggdGhlCisgICAgICAgICAqIHRyYWNrJ3MgbWVkaWEgdGltZXN0YW1wIG1heSBiZSBzdWJqZWN0IHRvIHZhcmlvdXMgbW9kaWZpY2F0aW9ucworICAgICAgICAgKiBhcyBvdXRsaW5lZCBiZWxvdywgdGhlIHRyYWNrJ3MgcGxheWJhY2sgb2Zmc2V0IHRpbWUgcmVtYWlucyB1bmNoYW5nZWQKKyAgICAgICAgICogb25jZSB0aGUgZmlyc3QgZGF0YSBidWZmZXIgb2YgdGhlIHRyYWNrIGlzIHJlY2VpdmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbWVkaWEgdGltZSBzdGFtcCB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3RpbmcgdGhlIHBsYXliYWNrIG9mZnNldAorICAgICAgICAgKiAoYW5kIHBvdGVudGlhbCBwYXVzZSBkdXJhdGlvbnMpIGZyb20gdGhlIG9yaWdpbmFsIHRpbWVzdGFtcCBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGlzIHRyYWNrIGlzIGEgdmlkZW8gdHJhY2sgZm9yIGEgcmVhbC10aW1lIHJlY29yZGluZyBhcHBsaWNhdGlvbiB3aXRoCisgICAgICAgICAqIGJvdGggYXVkaW8gYW5kIHZpZGVvIHRyYWNrcywgaXRzIG1lZGlhIHRpbWVzdGFtcCB3aWxsIHN1YmplY3QgdG8gZnVydGhlcgorICAgICAgICAgKiBtb2RpZmljYXRpb24gYmFzZWQgb24gdGhlIG1lZGlhIGNsb2NrIG9mIHRoZSBhdWRpbyB0cmFjay4gVGhpcyBtb2RpZmljYXRpb24KKyAgICAgICAgICogaXMgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBtYWludGFpbmluZyBnb29kIGF1ZGlvL3ZpZGVvIHN5bmNocm9uaXphdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIHJlY29yZGluZyBzZXNzaW9uIGlzIHBhdXNlZCBhbmQgcmVzdW1lZCBtdWx0aXBsZSB0aW1lcywgdGhlIHRyYWNrCisgICAgICAgICAqIG1lZGlhIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIGFzIGlmIHRoZSAgcmVjb3JkaW5nIHNlc3Npb24gaGFkIG5ldmVyIGJlZW4KKyAgICAgICAgICogcGF1c2VkIGF0IGFsbCBkdXJpbmcgcGxheWJhY2sgb2YgdGhlIHJlY29yZGVkIG91dHB1dCBmaWxlLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICogdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSBubyBtZW1vcnkgb2YgcGF1c2UvcmVzdW1lIGR1cmF0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIENIRUNLKG1ldGFfZGF0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgTE9HVigiJXMgdGltZXN0YW1wVXM6ICVsbGQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICBpZiAobVNhbXBsZVNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICBtT3duZXItPnNldFN0YXJ0VGltZXN0YW1wVXMobVN0YXJ0VGltZXN0YW1wVXMpOworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDSyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMCk7CisgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0socGF1c2VkRHVyYXRpb25VcyA+PSBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPj0gMCk7CisKKyAgICAgICAgLy8gTWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zCisgICAgICAgIGlmIChtSXNSZWFsVGltZVJlY29yZGluZykgeworICAgICAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJpZnRUaW1lKG1ldGFfZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkanVzdE1lZGlhVGltZSgmdGltZXN0YW1wVXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPj0gMCk7CisgICAgICAgIGlmIChtTnVtU2FtcGxlcyA+IDEpIHsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA8PSBsYXN0VGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJGcmFtZSBhcnJpdmVzIHRvbyBsYXRlISIpOworICAgICAgICAgICAgICAgIC8vIERvbid0IGRyb3AgdGhlIGxhdGUgZnJhbWUsIHNpbmNlIGRyb3BwaW5nIGEgZnJhbWUgbWF5IGNhdXNlCisgICAgICAgICAgICAgICAgLy8gcHJvYmxlbXMgbGF0ZXIgZHVyaW5nIHBsYXliYWNrCisKKyAgICAgICAgICAgICAgICAvLyBUaGUgaWRlYSBoZXJlIGlzIHRvIGF2b2lkIGhhdmluZyB0d28gb3IgbW9yZSBzYW1wbGVzIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gc2FtZSB0aW1lc3RhbXAgaW4gdGhlIG91dHB1dCBmaWxlLgorICAgICAgICAgICAgICAgIGlmIChtVGltZVNjYWxlID49IDEwMDAwMDBMTCkgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RUaW1lc3RhbXBVcyArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgPSBsYXN0VGltZXN0YW1wVXMgKyAoMTAwMDAwMExMICsgKG1UaW1lU2NhbGUgPj4gMSkpIC8gbVRpbWVTY2FsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlbGxkIGFuZCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb24gJWxsZCIsCisgICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKworICAgICAgICBtU2FtcGxlU2l6ZXMucHVzaF9iYWNrKHNhbXBsZVNpemUpOworICAgICAgICArK21OdW1TYW1wbGVzOworICAgICAgICBpZiAobU51bVNhbXBsZXMgPiAyKSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgdGltZSBzY2FsZSBiYXNlZCB0aWNrcywgcmF0aGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyB0aW1lc3RhbXAgaXRzZWxmIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgdG8gdXNlIGEgbmV3CisgICAgICAgICAgICAvLyBzdHRzIGVudHJ5LCBzaW5jZSB3ZSBtYXkgaGF2ZSByb3VuZGluZyBlcnJvcnMuCisgICAgICAgICAgICAvLyBUaGUgY2FsY3VsYXRpb24gaXMgaW50ZW5kZWQgdG8gcmVkdWNlIHRoZSBhY2N1bXVsYXRlZAorICAgICAgICAgICAgLy8gcm91bmRpbmcgZXJyb3JzLgorICAgICAgICAgICAgY3VyckR1cmF0aW9uVGlja3MgPQorICAgICAgICAgICAgICAgICAgICAgKCh0aW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwgLQorICAgICAgICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOworCisgICAgICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpIHsKKyAgICAgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKKyAgICAgICAgICAgIGlmIChtTnVtU2FtcGxlcyA+PSAyICYmIHByZXZpb3VzU2FtcGxlU2l6ZSAhPSBzYW1wbGVTaXplKSB7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZpb3VzU2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSBjdXJyRHVyYXRpb25UaWNrczsKKyAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisKKyAgICAgICAgaWYgKGlzU3luYyAhPSAwKSB7CisgICAgICAgICAgICBhZGRPbmVTdHNzVGFibGVFbnRyeShtTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChtUHJldmlvdXNUcmFja1RpbWVVcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNrUHJvZ3Jlc3NTdGF0dXModGltZXN0YW1wVXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtT3duZXItPm51bVRyYWNrcygpID09IDEpIHsKKyAgICAgICAgICAgIG9mZl90IG9mZnNldCA9IG1Jc0F2Yz8gbU93bmVyLT5hZGRMZW5ndGhQcmVmaXhlZFNhbXBsZV9sKGNvcHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSk7CisgICAgICAgICAgICBpZiAobUNodW5rT2Zmc2V0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYWRkQ2h1bmtPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNvcHkgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtQ2h1bmtTYW1wbGVzLnB1c2hfYmFjayhjb3B5KTsKKyAgICAgICAgaWYgKGludGVybGVhdmVEdXJhdGlvblVzID09IDApIHsKKyAgICAgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KCsrbkNodW5rcywgMSk7CisgICAgICAgICAgICBidWZmZXJDaHVuayh0aW1lc3RhbXBVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2h1bmtUaW1lc3RhbXBVcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2h1bmtUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wVXMgLSBjaHVua1RpbWVzdGFtcFVzID4gaW50ZXJsZWF2ZUR1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKytuQ2h1bmtzOworICAgICAgICAgICAgICAgICAgICBpZiAobkNodW5rcyA9PSAxIHx8ICAvLyBGaXJzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgKC0tKG1TdHNjVGFibGVFbnRyaWVzLmVuZCgpKSktPnNhbXBsZXNQZXJDaHVuayAhPQorICAgICAgICAgICAgICAgICAgICAgICAgIG1DaHVua1NhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeShuQ2h1bmtzLCBtQ2h1bmtTYW1wbGVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBjaHVua1RpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICB9CiAKKyAgICBpZiAobVNhbXBsZVNpemVzLmVtcHR5KCkgfHwgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2FtcGxlcyB3cml0dGVuCisgICAgICAgICghbUlzQXVkaW8gJiYgbU51bVN0c3NUYWJsZUVudHJpZXMgPT0gMCkgfHwgIC8vIG5vIHN5bmMgZnJhbWVzIGZvciB2aWRlbworICAgICAgICAoT0sgIT0gY2hlY2tDb2RlY1NwZWNpZmljRGF0YSgpKSkgeyAgICAgICAgICAvLyBubyBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKHRoaXMsIC0xLCBlcnIpOworCisgICAgLy8gTGFzdCBjaHVuaworICAgIGlmIChtT3duZXItPm51bVRyYWNrcygpID09IDEpIHsKKyAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoMSwgbU51bVNhbXBsZXMpOworICAgIH0gZWxzZSBpZiAoIW1DaHVua1NhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgrK25DaHVua3MsIG1DaHVua1NhbXBsZXMuc2l6ZSgpKTsKKyAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOworICAgIH0KKworICAgIC8vIFdlIGRvbid0IHJlYWxseSBrbm93IGhvdyBsb25nIHRoZSBsYXN0IGZyYW1lIGxhc3RzLCBzaW5jZQorICAgIC8vIHRoZXJlIGlzIG5vIGZyYW1lIHRpbWUgYWZ0ZXIgaXQsIGp1c3QgcmVwZWF0IHRoZSBwcmV2aW91cworICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCisgICAgaWYgKG1OdW1TYW1wbGVzID09IDEpIHsKKyAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KKyAgICB9IGVsc2UgeworICAgICAgICArK3NhbXBsZUNvdW50OyAgLy8gQ291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZQorICAgIH0KKyAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVXMpOworICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CiAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworICAgIExPR0koIlJlY2VpdmVkIHRvdGFsLzAtbGVuZ3RoICglZC8lZCkgYnVmZmVycyBhbmQgZW5jb2RlZCAlZCBmcmFtZXMuIC0gJXMiLAorICAgICAgICAgICAgY291bnQsIG5aZXJvTGVuZ3RoRnJhbWVzLCBtTnVtU2FtcGxlcywgbUlzQXVkaW8/ICJhdWRpbyI6ICJ2aWRlbyIpOworICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICBMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlbGxkIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dHJhY2tQcm9ncmVzc1N0YXR1cyhpbnQ2NF90IHRpbWVVcywgc3RhdHVzX3QgZXJyKSB7CisgICAgTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwICYmCisgICAgICAgIHRpbWVVcyAtIG1QcmV2aW91c1RyYWNrVGltZVVzID49IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpIHsKKyAgICAgICAgTE9HVigiRmlyZSB0aW1lIHRyYWNraW5nIHByb2dyZXNzIHN0YXR1cyBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICAgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKHRoaXMsIHRpbWVVcyAtIG1QcmV2aW91c1RyYWNrVGltZVVzLCBlcnIpOworICAgICAgICBtUHJldmlvdXNUcmFja1RpbWVVcyA9IHRpbWVVczsKKyAgICB9Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OnRyYWNrUHJvZ3Jlc3NTdGF0dXMoCisgICAgICAgIGNvbnN0IE1QRUc0V3JpdGVyOjpUcmFjayogdHJhY2ssIGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaW50MzJfdCBuVHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CisgICAgQ0hFQ0soblRyYWNrcyA+PSAxKTsKKyAgICBDSEVDSyhuVHJhY2tzIDwgNjQpOyAgLy8gQXJiaXRyYXJ5IG51bWJlcgorCisgICAgaW50MzJfdCB0cmFja051bSA9IDA7CisgICAgQ0hFQ0sodHJhY2tOdW0gPCBuVHJhY2tzKTsKKyAgICB0cmFja051bSA8PD0gMTY7CisKKyAgICAvLyBFcnJvciBub3RpZmljYXRpb24KKyAgICAvLyBEbyBub3QgY29uc2lkZXIgRVJST1JfRU5EX09GX1NUUkVBTSBhbiBlcnJvcgorICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0VSUk9SLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9FUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aW1lVXMgPT0gLTEpIHsKKyAgICAgICAgLy8gU2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbgorICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywKKyAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUywKKyAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTZW5kIHByb2dyZXNzIHN0YXR1cworICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywKKyAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfSU5GT19QUk9HUkVTU19USU1FX1NUQVRVUywKKyAgICAgICAgICAgICAgIHRpbWVVcyAvIDEwMDApOworICAgIH0KK30KKwordm9pZCBNUEVHNFdyaXRlcjo6c2V0RHJpZnRUaW1lVXMoaW50NjRfdCBkcmlmdFRpbWVVcykgeworICAgIExPR1YoInNldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgZHJpZnRUaW1lVXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgbURyaWZ0VGltZVVzID0gZHJpZnRUaW1lVXM7Cit9CisKK2ludDY0X3QgTVBFRzRXcml0ZXI6OmdldERyaWZ0VGltZVVzKCkgeworICAgIExPR1YoImdldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgbURyaWZ0VGltZVVzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIHJldHVybiBtRHJpZnRUaW1lVXM7Cit9CisKK2Jvb2wgTVBFRzRXcml0ZXI6OnVzZU5hbExlbmd0aEZvdXIoKSB7CisgICAgcmV0dXJuIG1Vc2U0Qnl0ZU5hbExlbmd0aDsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmJ1ZmZlckNodW5rKGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBMT0dWKCJidWZmZXJDaHVuayIpOworCisgICAgQ2h1bmsgY2h1bmsodGhpcywgdGltZXN0YW1wVXMsIG1DaHVua1NhbXBsZXMpOworICAgIG1Pd25lci0+YnVmZmVyQ2h1bmsoY2h1bmspOworICAgIG1DaHVua1NhbXBsZXMuY2xlYXIoKTsKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldER1cmF0aW9uVXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1NYXhUaW1lU3RhbXBVczsKKyAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VczsKIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlVHJhY2tIZWFkZXIoaW50MzJfdCB0cmFja0lEKSB7CitpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlczsKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtaW1lKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkgfHwKKyAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgeworICAgICAgICBpZiAoIW1Db2RlY1NwZWNpZmljRGF0YSB8fAorICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJNaXNzaW5nIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhIHx8CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCkgeworICAgICAgICAgICAgTE9HRSgiVW5leGVwZWN0ZWQgY29kZWMgc3BlY2lmaWMgZGF0YSBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKAorICAgICAgICBpbnQzMl90IHRyYWNrSUQsIGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgIGJvb2wgaXNfYXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworICAgIExPR1YoIiVzIHRyYWNrIHRpbWUgc2NhbGU6ICVkIiwKKyAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIG1UaW1lU2NhbGUpOwogCiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICBpbnQ2NF90IHRyYWtEdXJhdGlvblVzID0gZ2V0RHVyYXRpb25VcygpOwogCiAgICAgbU93bmVyLT5iZWdpbkJveCgidHJhayIpOwogCiAgICAgICBtT3duZXItPmJlZ2luQm94KCJ0a2hkIik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgICAgIC8vIEZsYWdzID0gNyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFjayBpcyBlbmFibGVkLCBhbmQKKyAgICAgICAgLy8gcGFydCBvZiB0aGUgcHJlc2VudGF0aW9uCisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDA3KTsgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz03CiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gY3JlYXRpb24gdGltZQogICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMih0cmFja0lEKTsKICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoZ2V0RHVyYXRpb25VcygpIC8gMTAwMCk7CisgICAgICAgIGludDMyX3QgdGtoZER1cmF0aW9uID0KKyAgICAgICAgICAgICh0cmFrRHVyYXRpb25VcyAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBtT3duZXItPndyaXRlSW50MzIodGtoZER1cmF0aW9uKTsgIC8vIGluIG12aGQgdGltZXNjYWxlCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIGxheWVyCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGdyb3VwCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihpc19hdWRpbyA/IDB4MTAwIDogMCk7ICAvLyB2b2x1bWUKKyAgICAgICAgbU93bmVyLT53cml0ZUludDE2KG1Jc0F1ZGlvID8gMHgxMDAgOiAwKTsgIC8vIHZvbHVtZQogICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MTAwMDApOyAgICAgICAvLyBtYXRyaXgKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MTAwMDApOwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMHg0MDAwMDAwMCk7CisgICAgICAgIG1Pd25lci0+d3JpdGVDb21wb3NpdGlvbk1hdHJpeChtUm90YXRpb24pOwogCi0gICAgICAgIGlmIChpc19hdWRpbykgeworICAgICAgICBpZiAobUlzQXVkaW8pIHsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTU1MCw0NiArMjEzMyw2NiBAQAogICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKICAgICAgICAgICAgIENIRUNLKHN1Y2Nlc3MpOwogCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIod2lkdGgpOwotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGhlaWdodCk7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIod2lkdGggPDwgMTYpOyAgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQorICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGhlaWdodCA8PCAxNik7ICAvLyAzMi1iaXQgZml4ZWQtcG9pbnQgdmFsdWUKICAgICAgICAgfQogICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHRraGQKIAorICAgICAgaW50NjRfdCBtb292U3RhcnRUaW1lVXMgPSBtT3duZXItPmdldFN0YXJ0VGltZXN0YW1wVXMoKTsKKyAgICAgIGlmIChtU3RhcnRUaW1lc3RhbXBVcyAhPSBtb292U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVsc3QiKTsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MDogMzItYml0IHRpbWUKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigyKTsgICAgICAgICAgIC8vIG5ldmVyIGVuZHMgd2l0aCBhbiBlbXB0eSBsaXN0CisKKyAgICAgICAgICAgIC8vIEZpcnN0IGVsc3QgZW50cnk6IHNwZWNpZnkgdGhlIHN0YXJ0aW5nIHRpbWUgb2Zmc2V0CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldFVzID0gbVN0YXJ0VGltZXN0YW1wVXMgLSBtb292U3RhcnRUaW1lVXM7CisgICAgICAgICAgICBMT0dWKCJPZmZzZXRVczogJWxsZCIsIG9mZnNldFVzKTsKKyAgICAgICAgICAgIGludDMyX3Qgc2VnID0gKG9mZnNldFVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoc2VnKTsgICAgICAgICAvLyBpbiBtdmhkIHRpbWVjYWxlCisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoLTEpOyAgICAgICAgICAvLyBzdGFydGluZyB0aW1lIG9mZnNldAorICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgICAgLy8gcmF0ZSA9IDEuMAorCisgICAgICAgICAgICAvLyBTZWNvbmQgZWxzdCBlbnRyeTogc3BlY2lmeSB0aGUgdHJhY2sgZHVyYXRpb24KKyAgICAgICAgICAgIHNlZyA9ICh0cmFrRHVyYXRpb25VcyAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHNlZyk7ICAgICAgICAgLy8gaW4gbXZoZCB0aW1lc2NhbGUKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxIDw8IDE2KTsKKyAgICAgICAgICBtT3duZXItPmVuZEJveCgpOworICAgICAgICBtT3duZXItPmVuZEJveCgpOworICAgICAgfQorCiAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CiAKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWRoZCIpOwogICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZQotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxMDAwKTsgICAgICAgICAgLy8gdGltZXNjYWxlCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGdldER1cmF0aW9uVXMoKSAvIDEwMDApOwotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZSBYWFgKKyAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobVRpbWVTY2FsZSk7ICAgIC8vIG1lZGlhIHRpbWVzY2FsZQorICAgICAgICAgIGludDMyX3QgbWRoZER1cmF0aW9uID0gKHRyYWtEdXJhdGlvblVzICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1kaGREdXJhdGlvbik7ICAvLyB1c2UgbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgLy8gTGFuZ3VhZ2UgZm9sbG93cyB0aGUgdGhyZWUgbGV0dGVyIHN0YW5kYXJkIElTTy02MzktMi9UCisgICAgICAgICAgLy8gJ2UnLCAnbicsICdnJyBmb3IgIkVuZ2xpc2giLCBmb3IgaW5zdGFuY2UuCisgICAgICAgICAgLy8gRWFjaCBjaGFyYWN0ZXIgaXMgcGFja2VkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaXRzIEFTQ0lJIHZhbHVlIGFuZCAweDYwLgorICAgICAgICAgIC8vIEZvciAiRW5nbGlzaCIsIHRoZXNlIGFyZSAwMDEwMSwgMDExMTAsIDAwMTExLgorICAgICAgICAgIC8vIFhYWDogV2hlcmUgaXMgdGhlIHBhZGRpbmcgYml0IGxvY2F0ZWQ6IDB4MTVDNz8KKyAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIGxhbmd1YWdlIGNvZGUKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKIAogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJoZGxyIik7CiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKLSAgICAgICAgICBtT3duZXItPndyaXRlRm91cmNjKGlzX2F1ZGlvID8gInNvdW4iIDogInZpZGUiKTsKKyAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0eXBlOiBzaG91bGQgYmUgbWhscgorICAgICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MobUlzQXVkaW8gPyAic291biIgOiAidmlkZSIpOyAgLy8gY29tcG9uZW50IHN1YnR5cGUKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICBtT3duZXItPndyaXRlQ1N0cmluZygiIik7ICAgICAgICAgIC8vIG5hbWUKKyAgICAgICAgICAvLyBSZW1vdmluZyAiciIgZm9yIHRoZSBuYW1lIHN0cmluZyBqdXN0IG1ha2VzIHRoZSBzdHJpbmcgNCBieXRlIGFsaWduZWQKKyAgICAgICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtSXNBdWRpbyA/ICJTb3VuZEhhbmRsZSI6ICJWaWRlb0hhbmRsZSIpOyAgLy8gbmFtZQogICAgICAgICBtT3duZXItPmVuZEJveCgpOwogCiAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1pbmYiKTsKLQotICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImRpbmYiKTsKLSAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImRyZWYiKTsKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MQotICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gdXJsCi0gICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZHJlZgotICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkaW5mCi0KLSAgICAgICAgICBpZiAoaXNfYXVkaW8pIHsKKyAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic21oZCIpOwogICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gYmFsYW5jZQpAQCAtNTk3LDI2ICsyMjAwLDM5IEBACiAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgidm1oZCIpOwotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMHgwMDAwMDAwMSk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTEKKyAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MDEpOyAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0xCiAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIGdyYXBoaWNzIG1vZGUKICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gb3Bjb2xvcgogICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7CiAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKICAgICAgICAgICB9Ci0gICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtaW5mCisKKyAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkaW5mIik7CisgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkcmVmIik7CisgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAvLyBlbnRyeSBjb3VudCAoZWl0aGVyIHVybCBvciB1cm4pCisgICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBpbmRleCBoZXJlIHJlZmVycyB0byB0aGUgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4CisgICAgICAgICAgICAgIC8vIGluIHRoZSBzYW1wbGUgdGFibGUgZW50cmllcy4KKyAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOworICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MSAoc2VsZi1jb250YWluZWQpCisgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB1cmwKKyAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkcmVmCisgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGRpbmYKIAogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdGJsIik7CiAKICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHNkIik7CiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAgICAgICAgICAgICAgLy8gZW50cnkgY291bnQKLSAgICAgICAgICAgIGlmIChpc19hdWRpbykgeworICAgICAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm91cmNjID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtaW1lKSkgewogICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSAic2FtciI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1pbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvdXJjYyA9ICJzYXdiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbWltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91cmNjID0gIm1wNGEiOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCEic2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG1pbWUgdHlwZS4iKTsKQEAgLTYyNSwxMCArMjI0MSwxMiBAQAogICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgICAgICAgLy8gYXVkaW8gZm9ybWF0CiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CisgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHgxKTsgICAgICAgICAvLyBkYXRhIHJlZiBpbmRleAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMik7ICAgICAgICAgICAvLyBjaGFubmVsIGNvdW50CisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFubmVsczsKKyAgICAgICAgICAgICAgICAgIENIRUNLX0VRKHRydWUsIG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpOworICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KG5DaGFubmVscyk7ICAgLy8gY2hhbm5lbCBjb3VudAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDE2KTsgICAgICAgICAgLy8gc2FtcGxlIHNpemUKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCkBAIC02MzYsOCArMjI1NCw1MSBAQAogICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOwogICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpOwogICAgICAgICAgICAgICAgICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzYW1wbGVyYXRlIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMyk7ICAgLy8gRVNfRGVzY3JUYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsvLyBFU19JRAorICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDQpOyAgIC8vIERlY29kZXJDb25maWdEZXNjclRhZworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4NDApOyAgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgorICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgxNSk7ICAgLy8gc3RyZWFtVHlwZSBBdWRpb1N0cmVhbQorCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMyk7ICAvLyBYWFgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOyAgIC8vIGJ1ZmZlciBzaXplIDI0LWJpdAorICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gbWF4IGJpdCByYXRlCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBhdmcgYml0IHJhdGUKKworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAgLy8gRGVjb2RlclNwZWNpZmljSW5mb1RhZworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMltdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsICAvLyBTTENvbmZpZ0Rlc2NyaXB0b3JUYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlKGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworCisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBlc2RzCisgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvLyAzZ3BwMiBTcGVjIEFNUlNhbXBsZUVudHJ5IGZpZWxkcworICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkYW1yIik7CisgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUNTdHJpbmcoIiAgICIpOyAgLy8gdmVuZG9yOiA0IGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gZGVjb2RlciB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4ODNGRik7ICAgLy8gbW9kZSBzZXQ6IGFsbCBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gbW9kZSBjaGFuZ2UgcGVyaW9kCisgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMSk7ICAgICAgICAgLy8gZnJhbWVzIHBlciBzYW1wbGUKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CkBAIC02NTMsNyArMjMxNCw3IEBACiAKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKKyAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigxKTsgICAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZApAQCAtNjc4LDYgKzIzMzksOCBAQAogICAgICAgICAgICAgICAgICAgQ0hFQ0soMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDwgMTI4KTsKIAogICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA+IDApOwogICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCkBAIC02OTgsNyArMjM2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMywgMHhlOCwgMHgwMAogICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoa0RhdGEsIHNpemVvZihrRGF0YSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgLy8gRGVjb2RlclNwZWNpZmljSW5mb1RhZwogCiAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKQEAgLTcyMiw2NCArMjM4NSwxMDIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkMjYzCiAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOworICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPj0gNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAvLyBQYXRjaCBhdmNjJ3MgbGVuZ3RoU2l6ZSBmaWVsZCB0byBtYXRjaCB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYnl0ZXMgd2UgdXNlIHRvIGluZGljYXRlIHRoZSBzaXplIG9mIGEgbmFsIHVuaXQuCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgcHRyWzRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0cls0XSAmIDB4ZmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobU93bmVyLT51c2VOYWxMZW5ndGhGb3VyKCkgPyAzIDogMSk7CisKICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJhdmNDIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGF2Y0MKICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgicGFzcCIpOworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgcGl4ZWwgaXMgbm90IHNxdWFyZQorICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSA8PCAxNik7ICAvLyBoc3BhY2luZworICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSA8PCAxNik7ICAvLyB2c3BhY2luZworICAgICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHBhc3AKICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbXA0diwgczI2MyBvciBhdmMxCiAgICAgICAgICAgICB9CiAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0c2QKIAogICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0dHMiKTsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1TYW1wbGVJbmZvcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3R0c1RhYmxlRW50cmllcyk7CisgICAgICAgICAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBmb3IgKExpc3Q8U3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1TdHRzVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVDb3VudCk7CiAKLSAgICAgICAgICAgIExpc3Q8U2FtcGxlSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVNhbXBsZUluZm9zLmJlZ2luKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGxhc3QgPSAoKml0KS50aW1lc3RhbXA7Ci0gICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1TYW1wbGVJbmZvcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKCppdCkudGltZXN0YW1wIC0gbGFzdCk7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgYXJlIGNhbGN1bGF0aW5nIHRoZSBzYW1wbGUgZHVyYXRpb24gdGhlIGV4YWN0bHkKKyAgICAgICAgICAgICAgICAvLyBzYW1lIHdheSBhcyB3ZSBtYWRlIGRlY2lzaW9uIG9uIGhvdyB0byBjcmVhdGUgc3R0cyBlbnRyaWVzLgorICAgICAgICAgICAgICAgIGludDY0X3QgY3VyclRpbWVzdGFtcFVzID0gcHJldlRpbWVzdGFtcFVzICsgaXQtPnNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkdXIgPSAoKGN1cnJUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2VGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMKTsKKyAgICAgICAgICAgICAgICBwcmV2VGltZXN0YW1wVXMgKz0gKGl0LT5zYW1wbGVDb3VudCAqIGl0LT5zYW1wbGVEdXJhdGlvblVzKTsKIAotICAgICAgICAgICAgICAgIGxhc3QgPSAoKml0KS50aW1lc3RhbXA7Ci0KLSAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCiAKKyAgICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHNzIik7CisgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0c3NUYWJsZUVudHJpZXMpOyAgLy8gbnVtYmVyIG9mIHN5bmMgZnJhbWVzCisgICAgICAgICAgICAgIGZvciAoTGlzdDxpbnQzMl90Pjo6aXRlcmF0b3IgaXQgPSBtU3Rzc1RhYmxlRW50cmllcy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgIGl0ICE9IG1TdHNzVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKml0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0c3MKKyAgICAgICAgICB9CisKICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHN6Iik7CiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIGRlZmF1bHQgc2FtcGxlIHNpemUKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtU2FtcGxlSW5mb3Muc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTGlzdDxTYW1wbGVJbmZvPjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlSW5mb3MuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgaXQgIT0gbVNhbXBsZUluZm9zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCgqaXQpLnNpemUpOworICAgICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7CisgICAgICAgICAgICAgICAgTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOworICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOyAgLy8gZGVmYXVsdCBzYW1wbGUgc2l6ZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVNhbXBsZXMpOworICAgICAgICAgICAgaWYgKCFtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgeworICAgICAgICAgICAgICAgIGZvciAoTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbVNhbXBsZVNpemVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzegogCiAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic3RzYyIpOwogICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobVNhbXBsZUluZm9zLnNpemUoKSk7Ci0gICAgICAgICAgICBpbnQzMl90IG4gPSAxOwotICAgICAgICAgICAgZm9yIChMaXN0PFNhbXBsZUluZm8+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVJbmZvcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtU2FtcGxlSW5mb3MuZW5kKCk7ICsraXQsICsrbikgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihuKTsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1OdW1TdHNjVGFibGVFbnRyaWVzKTsKKyAgICAgICAgICAgIGZvciAoTGlzdDxTdHNjVGFibGVFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbVN0c2NUYWJsZUVudHJpZXMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgaXQgIT0gbVN0c2NUYWJsZUVudHJpZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPmZpcnN0Q2h1bmspOworICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlc1BlckNodW5rKTsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZURlc2NyaXB0aW9uSWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNjCi0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJjbzY0Iik7CisgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCh1c2UzMkJpdE9mZnNldD8gInN0Y28iOiAiY282NCIpOwogICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobVNhbXBsZUluZm9zLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U2FtcGxlSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVNhbXBsZUluZm9zLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgIGl0ICE9IG1TYW1wbGVJbmZvcy5lbmQoKTsgKytpdCwgKytuKSB7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDY0KCgqaXQpLm9mZnNldCk7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0Y29UYWJsZUVudHJpZXMpOworICAgICAgICAgICAgZm9yIChMaXN0PG9mZl90Pjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtPZmZzZXRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1DaHVua09mZnNldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlMzJCaXRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KCppdCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ2NCgoKml0KSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBjbzY0CisgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0Y28gb3IgY282NAogCiAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdGJsCisgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1pbmYKICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtZGlhCiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHRyYWsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDRiMzgxM2IuLjc2NDhkNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHID0gImltYWdlL2pwZWciOwogCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUFggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MyA9ICJ2aWRlby8zZ3BwIjsKQEAgLTMxLDEwICszMiwxNCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDID0gImF1ZGlvL21wNGEtbGF0bSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCA9ICJhdWRpby9xY2VscCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMgPSAiYXVkaW8vdm9yYmlzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0ID0gInZpZGVvL21wZWc0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8vd2F2IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXBwbGljYXRpb24vb2dnIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSA9ICJ2aWRlby94LW1hdHJvc2thIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTID0gInZpZGVvL21wMnRzIjsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA0N2ZkNjk4Li45NjVjMzcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMyw4ICsyMywxMiBAQAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKIAorI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CkBAIC0zOCwxNiArNDIsMTggQEAKIH0KIAogdWludDMyX3QgTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fUEFVU0U7CisgICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwogfQogCiAvLyBzdGF0aWMKIHNwPE1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisKICAgICBTdHJpbmc4IHRtcDsKICAgICBpZiAobWltZSA9PSBOVUxMKSB7CiAgICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7Ci0gICAgICAgIGlmICghc291cmNlLT5zbmlmZigmdG1wLCAmY29uZmlkZW5jZSkpIHsKKyAgICAgICAgaWYgKCFzb3VyY2UtPnNuaWZmKCZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKICAgICAgICAgICAgIExPR1YoIkZBSUxFRCB0byBhdXRvZGV0ZWN0IG1lZGlhIGNvbnRlbnQuIik7CiAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzQsNyArODAsNyBAQAogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgImF1ZGlvL21wNCIpKSB7CiAgICAgICAgIHJldHVybiBuZXcgTVBFRzRFeHRyYWN0b3Ioc291cmNlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7CiAgICAgICAgIHJldHVybiBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7CkBAIC04Miw2ICs4OCwxMCBAQAogICAgICAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRykpIHsKICAgICAgICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYUV4dHJhY3Rvcihzb3VyY2UpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpKSB7CisgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0KIAogICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCmluZGV4IGVjODliNzQuLmI0ZWYzMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKQEAgLTMyLDIzICszMiw0MyBAQAogICAgIG1PcHRpb25zID0gMDsKICAgICBtU2Vla1RpbWVVcyA9IDA7CiAgICAgbUxhdGVuZXNzVXMgPSAwOworICAgIG1Ta2lwRnJhbWVVbnRpbFRpbWVVcyA9IDA7CiB9CiAKLXZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7Cit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewogICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOwogICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOwogfQogCiB2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7CiAgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwogICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKIH0KIAotYm9vbCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzKSBjb25zdCB7Citib29sIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgewogICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CiAgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOwogfQogCit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Y2xlYXJTa2lwRnJhbWUoKSB7CisgICAgbU9wdGlvbnMgJj0gfmtTa2lwRnJhbWVfT3B0aW9uOworICAgIG1Ta2lwRnJhbWVVbnRpbFRpbWVVcyA9IDA7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRTa2lwRnJhbWUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2tpcEZyYW1lX09wdGlvbjsKKyAgICBtU2tpcEZyYW1lVW50aWxUaW1lVXMgPSB0aW1lVXM7Cit9CisKK2Jvb2wgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXRTa2lwRnJhbWUoaW50NjRfdCAqdGltZVVzKSBjb25zdCB7CisgICAgKnRpbWVVcyA9IG1Ta2lwRnJhbWVVbnRpbFRpbWVVczsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NraXBGcmFtZV9PcHRpb24pICE9IDA7Cit9CisKIHZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cykgewogICAgIG1MYXRlbmVzc1VzID0gbGF0ZW5lc3NfdXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjcwMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTnVDYWNoZWRTb3VyY2UyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFBhZ2VDYWNoZSB7CisgICAgUGFnZUNhY2hlKHNpemVfdCBwYWdlU2l6ZSk7CisgICAgflBhZ2VDYWNoZSgpOworCisgICAgc3RydWN0IFBhZ2UgeworICAgICAgICB2b2lkICptRGF0YTsKKyAgICAgICAgc2l6ZV90IG1TaXplOworICAgIH07CisKKyAgICBQYWdlICphY3F1aXJlUGFnZSgpOworICAgIHZvaWQgcmVsZWFzZVBhZ2UoUGFnZSAqcGFnZSk7CisKKyAgICB2b2lkIGFwcGVuZFBhZ2UoUGFnZSAqcGFnZSk7CisgICAgc2l6ZV90IHJlbGVhc2VGcm9tU3RhcnQoc2l6ZV90IG1heEJ5dGVzKTsKKworICAgIHNpemVfdCB0b3RhbFNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVG90YWxTaXplOworICAgIH0KKworICAgIHZvaWQgY29weShzaXplX3QgZnJvbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICAgIHNpemVfdCBtUGFnZVNpemU7CisgICAgc2l6ZV90IG1Ub3RhbFNpemU7CisKKyAgICBMaXN0PFBhZ2UgKj4gbUFjdGl2ZVBhZ2VzOworICAgIExpc3Q8UGFnZSAqPiBtRnJlZVBhZ2VzOworCisgICAgdm9pZCBmcmVlUGFnZXMoTGlzdDxQYWdlICo+ICpsaXN0KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhZ2VDYWNoZSk7Cit9OworCitQYWdlQ2FjaGU6OlBhZ2VDYWNoZShzaXplX3QgcGFnZVNpemUpCisgICAgOiBtUGFnZVNpemUocGFnZVNpemUpLAorICAgICAgbVRvdGFsU2l6ZSgwKSB7Cit9CisKK1BhZ2VDYWNoZTo6flBhZ2VDYWNoZSgpIHsKKyAgICBmcmVlUGFnZXMoJm1BY3RpdmVQYWdlcyk7CisgICAgZnJlZVBhZ2VzKCZtRnJlZVBhZ2VzKTsKK30KKwordm9pZCBQYWdlQ2FjaGU6OmZyZWVQYWdlcyhMaXN0PFBhZ2UgKj4gKmxpc3QpIHsKKyAgICBMaXN0PFBhZ2UgKj46Oml0ZXJhdG9yIGl0ID0gbGlzdC0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbGlzdC0+ZW5kKCkpIHsKKyAgICAgICAgUGFnZSAqcGFnZSA9ICppdDsKKworICAgICAgICBmcmVlKHBhZ2UtPm1EYXRhKTsKKyAgICAgICAgZGVsZXRlIHBhZ2U7CisgICAgICAgIHBhZ2UgPSBOVUxMOworCisgICAgICAgICsraXQ7CisgICAgfQorfQorCitQYWdlQ2FjaGU6OlBhZ2UgKlBhZ2VDYWNoZTo6YWNxdWlyZVBhZ2UoKSB7CisgICAgaWYgKCFtRnJlZVBhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgTGlzdDxQYWdlICo+OjppdGVyYXRvciBpdCA9IG1GcmVlUGFnZXMuYmVnaW4oKTsKKyAgICAgICAgUGFnZSAqcGFnZSA9ICppdDsKKyAgICAgICAgbUZyZWVQYWdlcy5lcmFzZShpdCk7CisKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorCisgICAgUGFnZSAqcGFnZSA9IG5ldyBQYWdlOworICAgIHBhZ2UtPm1EYXRhID0gbWFsbG9jKG1QYWdlU2l6ZSk7CisgICAgcGFnZS0+bVNpemUgPSAwOworCisgICAgcmV0dXJuIHBhZ2U7Cit9CisKK3ZvaWQgUGFnZUNhY2hlOjpyZWxlYXNlUGFnZShQYWdlICpwYWdlKSB7CisgICAgcGFnZS0+bVNpemUgPSAwOworICAgIG1GcmVlUGFnZXMucHVzaF9iYWNrKHBhZ2UpOworfQorCit2b2lkIFBhZ2VDYWNoZTo6YXBwZW5kUGFnZShQYWdlICpwYWdlKSB7CisgICAgbVRvdGFsU2l6ZSArPSBwYWdlLT5tU2l6ZTsKKyAgICBtQWN0aXZlUGFnZXMucHVzaF9iYWNrKHBhZ2UpOworfQorCitzaXplX3QgUGFnZUNhY2hlOjpyZWxlYXNlRnJvbVN0YXJ0KHNpemVfdCBtYXhCeXRlcykgeworICAgIHNpemVfdCBieXRlc1JlbGVhc2VkID0gMDsKKworICAgIHdoaWxlIChtYXhCeXRlcyA+IDAgJiYgIW1BY3RpdmVQYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtQWN0aXZlUGFnZXMuYmVnaW4oKTsKKworICAgICAgICBQYWdlICpwYWdlID0gKml0OworCisgICAgICAgIGlmIChtYXhCeXRlcyA8IHBhZ2UtPm1TaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3RpdmVQYWdlcy5lcmFzZShpdCk7CisKKyAgICAgICAgbWF4Qnl0ZXMgLT0gcGFnZS0+bVNpemU7CisgICAgICAgIGJ5dGVzUmVsZWFzZWQgKz0gcGFnZS0+bVNpemU7CisKKyAgICAgICAgcmVsZWFzZVBhZ2UocGFnZSk7CisgICAgfQorCisgICAgbVRvdGFsU2l6ZSAtPSBieXRlc1JlbGVhc2VkOworICAgIHJldHVybiBieXRlc1JlbGVhc2VkOworfQorCit2b2lkIFBhZ2VDYWNoZTo6Y29weShzaXplX3QgZnJvbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBMT0dWKCJjb3B5IGZyb20gJWQgc2l6ZSAlZCIsIGZyb20sIHNpemUpOworCisgICAgQ0hFQ0tfTEUoZnJvbSArIHNpemUsIG1Ub3RhbFNpemUpOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgTGlzdDxQYWdlICo+OjppdGVyYXRvciBpdCA9IG1BY3RpdmVQYWdlcy5iZWdpbigpOworICAgIHdoaWxlIChmcm9tID49IG9mZnNldCArICgqaXQpLT5tU2l6ZSkgeworICAgICAgICBvZmZzZXQgKz0gKCppdCktPm1TaXplOworICAgICAgICArK2l0OworICAgIH0KKworICAgIHNpemVfdCBkZWx0YSA9IGZyb20gLSBvZmZzZXQ7CisgICAgc2l6ZV90IGF2YWlsID0gKCppdCktPm1TaXplIC0gZGVsdGE7CisKKyAgICBpZiAoYXZhaWwgPj0gc2l6ZSkgeworICAgICAgICBtZW1jcHkoZGF0YSwgKGNvbnN0IHVpbnQ4X3QgKikoKml0KS0+bURhdGEgKyBkZWx0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkoZGF0YSwgKGNvbnN0IHVpbnQ4X3QgKikoKml0KS0+bURhdGEgKyBkZWx0YSwgYXZhaWwpOworICAgICsraXQ7CisgICAgZGF0YSA9ICh1aW50OF90ICopZGF0YSArIGF2YWlsOworICAgIHNpemUgLT0gYXZhaWw7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSAoKml0KS0+bVNpemU7CisgICAgICAgIGlmIChjb3B5ID4gc2l6ZSkgeworICAgICAgICAgICAgY29weSA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRhdGEsICgqaXQpLT5tRGF0YSwgY29weSk7CisgICAgICAgIGRhdGEgPSAodWludDhfdCAqKWRhdGEgKyBjb3B5OworICAgICAgICBzaXplIC09IGNvcHk7CisgICAgICAgICsraXQ7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitOdUNhY2hlZFNvdXJjZTI6Ok51Q2FjaGVkU291cmNlMihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVJlZmxlY3RvcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8TnVDYWNoZWRTb3VyY2UyPih0aGlzKSksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1DYWNoZShuZXcgUGFnZUNhY2hlKGtQYWdlU2l6ZSkpLAorICAgICAgbUNhY2hlT2Zmc2V0KDApLAorICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKKyAgICAgIG1MYXN0QWNjZXNzUG9zKDApLAorICAgICAgbUZldGNoaW5nKHRydWUpLAorICAgICAgbUxhc3RGZXRjaFRpbWVVcygtMSksCisgICAgICBtU3VzcGVuZGVkKGZhbHNlKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVDYWNoZWRTb3VyY2UyIik7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworfQorCitOdUNhY2hlZFNvdXJjZTI6On5OdUNhY2hlZFNvdXJjZTIoKSB7CisgICAgbUxvb3Blci0+c3RvcCgpOworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOworCisgICAgZGVsZXRlIG1DYWNoZTsKKyAgICBtQ2FjaGUgPSBOVUxMOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0U2l6ZShvZmZfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgeworICAgIHJldHVybiAobVNvdXJjZS0+ZmxhZ3MoKSAmIH5rV2FudHNQcmVmZXRjaGluZykgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZTsKK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0RmV0Y2hNb3JlOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZldGNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWFkOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlYWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN1c3BlbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU3VzcGVuZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpmZXRjaEludGVybmFsKCkgeworICAgIExPR1YoImZldGNoSW50ZXJuYWwiKTsKKworICAgIENIRUNLX0VRKG1GaW5hbFN0YXR1cywgKHN0YXR1c190KU9LKTsKKworICAgIFBhZ2VDYWNoZTo6UGFnZSAqcGFnZSA9IG1DYWNoZS0+YWNxdWlyZVBhZ2UoKTsKKworICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCksIHBhZ2UtPm1EYXRhLCBrUGFnZVNpemUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChuIDwgMCkgeworICAgICAgICBMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJWxkIiwgbik7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IG47CisgICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7CisgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOworICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2UtPm1TaXplID0gbjsKKyAgICAgICAgbUNhY2hlLT5hcHBlbmRQYWdlKHBhZ2UpOworICAgIH0KK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6Om9uRmV0Y2goKSB7CisgICAgTE9HVigib25GZXRjaCIpOworCisgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgeworICAgICAgICBMT0dWKCJFT1MgcmVhY2hlZCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7CisgICAgICAgIG1GZXRjaGluZyA9IGZhbHNlOworICAgIH0KKworICAgIGJvb2wga2VlcEFsaXZlID0KKyAgICAgICAgIW1GZXRjaGluZworICAgICAgICAgICAgJiYgIW1TdXNwZW5kZWQKKyAgICAgICAgICAgICYmIG1GaW5hbFN0YXR1cyA9PSBPSworICAgICAgICAgICAgJiYgQUxvb3Blcjo6R2V0Tm93VXMoKSA+PSBtTGFzdEZldGNoVGltZVVzICsga0tlZXBBbGl2ZUludGVydmFsVXM7CisKKyAgICBpZiAobUZldGNoaW5nIHx8IGtlZXBBbGl2ZSkgeworICAgICAgICBpZiAoa2VlcEFsaXZlKSB7CisgICAgICAgICAgICBMT0dJKCJLZWVwIGFsaXZlIik7CisgICAgICAgIH0KKworICAgICAgICBmZXRjaEludGVybmFsKCk7CisKKyAgICAgICAgbUxhc3RGZXRjaFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICAgICAgaWYgKG1GZXRjaGluZyAmJiBtQ2FjaGUtPnRvdGFsU2l6ZSgpID49IGtIaWdoV2F0ZXJUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIExPR0koIkNhY2hlIGZ1bGwsIGRvbmUgcHJlZmV0Y2hpbmcgZm9yIG5vdyIpOworICAgICAgICAgICAgbUZldGNoaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFtU3VzcGVuZGVkKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgpOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgKKyAgICAgICAgICAgIG1GZXRjaGluZyA/IDAgOiAxMDAwMDBsbCk7Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBMT0dWKCJvblJlYWQiKTsKKworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJvZmZzZXQiLCAmb2Zmc2V0KSk7CisKKyAgICB2b2lkICpkYXRhOworICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRhdGEiLCAmZGF0YSkpOworCisgICAgc2l6ZV90IHNpemU7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSk7CisKKyAgICBzc2l6ZV90IHJlc3VsdCA9IHJlYWRJbnRlcm5hbChvZmZzZXQsIGRhdGEsIHNpemUpOworCisgICAgaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOworCisgICAgbUFzeW5jUmVzdWx0ID0gbmV3IEFNZXNzYWdlOworICAgIG1Bc3luY1Jlc3VsdC0+c2V0SW50MzIoInJlc3VsdCIsIHJlc3VsdCk7CisKKyAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6cmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0dyYXlBcmVhID0gMjU2ICogMTAyNDsKKworICAgIGlmIChtRmV0Y2hpbmcgfHwgbUZpbmFsU3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSAtIG1MYXN0QWNjZXNzUG9zCisgICAgICAgICAgICA+PSBrTG93V2F0ZXJUaHJlc2hvbGQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBtYXhCeXRlcyA9IG1MYXN0QWNjZXNzUG9zIC0gbUNhY2hlT2Zmc2V0OworICAgIGlmIChtYXhCeXRlcyA8IGtHcmF5QXJlYSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWF4Qnl0ZXMgLT0ga0dyYXlBcmVhOworCisgICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKKyAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7CisKKyAgICBMT0dJKCJyZXN0YXJ0aW5nIHByZWZldGNoZXIsIHRvdGFsU2l6ZSA9ICVkIiwgbUNhY2hlLT50b3RhbFNpemUoKSk7CisgICAgbUZldGNoaW5nID0gdHJ1ZTsKK30KKworc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKKworICAgIExPR1YoInJlYWRBdCBvZmZzZXQgJWxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAvLyBJZiB0aGUgcmVxdWVzdCBjYW4gYmUgY29tcGxldGVseSBzYXRpc2ZpZWQgZnJvbSB0aGUgY2FjaGUsIGRvIHNvLgorCisgICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVPZmZzZXQKKyAgICAgICAgICAgICYmIG9mZnNldCArIHNpemUgPD0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSkgeworICAgICAgICBzaXplX3QgZGVsdGEgPSBvZmZzZXQgLSBtQ2FjaGVPZmZzZXQ7CisgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgbUxhc3RBY2Nlc3NQb3MgPSBvZmZzZXQgKyBzaXplOworCisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBtc2ctPnNldEludDY0KCJvZmZzZXQiLCBvZmZzZXQpOworICAgIG1zZy0+c2V0UG9pbnRlcigiZGF0YSIsIGRhdGEpOworICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOworCisgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaW50MzJfdCByZXN1bHQ7CisgICAgQ0hFQ0sobUFzeW5jUmVzdWx0LT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgIG1Bc3luY1Jlc3VsdC5jbGVhcigpOworCisgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgbUxhc3RBY2Nlc3NQb3MgPSBvZmZzZXQgKyByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIChzc2l6ZV90KXJlc3VsdDsKK30KKworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6Y2FjaGVkU2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKGJvb2wgKmVvcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChlb3MpOworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2woYm9vbCAqZW9zKSB7CisgICAgKmVvcyA9IChtRmluYWxTdGF0dXMgIT0gT0spOworICAgIG9mZl90IGxhc3RCeXRlUG9zQ2FjaGVkID0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKKyAgICBpZiAobUxhc3RBY2Nlc3NQb3MgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgeworICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBtTGFzdEFjY2Vzc1BvczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkSW50ZXJuYWwob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIExPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxkIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChvZmZzZXQgPCBtQ2FjaGVPZmZzZXQKKyAgICAgICAgICAgIHx8IG9mZnNldCA+PSAob2ZmX3QpKG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBvZmZfdCBrUGFkZGluZyA9IDMyNzY4OworCisgICAgICAgIC8vIEluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBkZWNvZGVkIHN0cmVhbXMsIG9uY2Ugb2YgdGhlbSB3aWxsCisgICAgICAgIC8vIHRyaWdnZXIgdGhpcyBzZWVrIHJlcXVlc3QsIHRoZSBvdGhlciBvbmUgd2lsbCByZXF1ZXN0IGRhdGEgIm5lYXJieSIKKyAgICAgICAgLy8gc29vbiwgYWRqdXN0IHRoZSBzZWVrIHBvc2l0aW9uIHNvIHRoYXQgdGhhdCBzdWJzZXF1ZW50IHJlcXVlc3QKKyAgICAgICAgLy8gZG9lcyBub3QgdHJpZ2dlciBhbm90aGVyIHNlZWsuCisgICAgICAgIG9mZl90IHNlZWtPZmZzZXQgPSAob2Zmc2V0ID4ga1BhZGRpbmcpID8gb2Zmc2V0IC0ga1BhZGRpbmcgOiAwOworCisgICAgICAgIHNlZWtJbnRlcm5hbF9sKHNlZWtPZmZzZXQpOworICAgIH0KKworICAgIHNpemVfdCBkZWx0YSA9IG9mZnNldCAtIG1DYWNoZU9mZnNldDsKKworICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgaWYgKGRlbHRhID49IG1DYWNoZS0+dG90YWxTaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmluYWxTdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpIC0gZGVsdGE7CisgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgYXZhaWwpOworCisgICAgICAgIHJldHVybiBhdmFpbDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7CisgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgTE9HVigiZGVmZXJyaW5nIHJlYWQiKTsKKworICAgIHJldHVybiAtRUFHQUlOOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OnNlZWtJbnRlcm5hbF9sKG9mZl90IG9mZnNldCkgeworICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OworCisgICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVPZmZzZXQKKyAgICAgICAgICAgICYmIG9mZnNldCA8PSAob2ZmX3QpKG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBMT0dJKCJuZXcgcmFuZ2U6IG9mZnNldD0gJWxkIiwgb2Zmc2V0KTsKKworICAgIG1DYWNoZU9mZnNldCA9IG9mZnNldDsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpOworICAgIENIRUNLX0VRKG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydCh0b3RhbFNpemUpLCB0b3RhbFNpemUpOworCisgICAgbUZpbmFsU3RhdHVzID0gT0s7CisgICAgbUZldGNoaW5nID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmNsZWFyQ2FjaGVBbmRSZXN1bWUoKSB7CisgICAgTE9HVigiY2xlYXJDYWNoZUFuZFJlc3VtZSIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKG1TdXNwZW5kZWQpOworCisgICAgbUNhY2hlT2Zmc2V0ID0gMDsKKyAgICBtRmluYWxTdGF0dXMgPSBPSzsKKyAgICBtTGFzdEFjY2Vzc1BvcyA9IDA7CisgICAgbUxhc3RGZXRjaFRpbWVVcyA9IC0xOworCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IG1DYWNoZS0+dG90YWxTaXplKCk7CisgICAgQ0hFQ0tfRVEobUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KHRvdGFsU2l6ZSksIHRvdGFsU2l6ZSk7CisKKyAgICBtRmV0Y2hpbmcgPSB0cnVlOworICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6OnN1c3BlbmQoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN1c3BlbmQsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworCisgICAgd2hpbGUgKCFtU3VzcGVuZGVkKSB7CisgICAgICAgIHVzbGVlcCgxMDAwMCk7CisgICAgfQorfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6b25TdXNwZW5kKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtRmV0Y2hpbmcgPSBmYWxzZTsKKyAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQzYjJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVIVFRQRGF0YVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKKyAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgbG9uZyAqeCkgeworICAgIGNoYXIgKmVuZDsKKyAgICAqeCA9IHN0cnRvdWwoZnJvbSwgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBmcm9tIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFBhcnNlVVJMKAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIFN0cmluZzggKmhvc3QsIHVuc2lnbmVkICpwb3J0LCBTdHJpbmc4ICpwYXRoKSB7CisgICAgaG9zdC0+c2V0VG8oIiIpOworICAgICpwb3J0ID0gMDsKKyAgICBwYXRoLT5zZXRUbygiIik7CisKKyAgICBpZiAoc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cmNocigmdXJsWzddLCAnLycpOworCisgICAgaWYgKHNsYXNoUG9zID09IE5VTEwpIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSk7CisgICAgICAgIHBhdGgtPnNldFRvKCIvIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSwgc2xhc2hQb3MgLSAmdXJsWzddKTsKKyAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOworCisgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB4OworICAgICAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKGNvbG9uUG9zICsgMSwgJngpIHx8IHggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICpwb3J0ID0geDsKKworICAgICAgICBzaXplX3QgY29sb25PZmZzZXQgPSBjb2xvblBvcyAtIGhvc3QtPnN0cmluZygpOworICAgICAgICBTdHJpbmc4IHRtcChob3N0LT5zdHJpbmcoKSwgY29sb25PZmZzZXQpOworICAgICAgICAqaG9zdCA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcG9ydCA9IDgwOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitOdUhUVFBEYXRhU291cmNlOjpOdUhUVFBEYXRhU291cmNlKCkKKyAgICA6IG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbVBvcnQoMCksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUNvbnRlbnRMZW5ndGgoMCksCisgICAgICBtQ29udGVudExlbmd0aFZhbGlkKGZhbHNlKSB7Cit9CisKK051SFRUUERhdGFTb3VyY2U6On5OdUhUVFBEYXRhU291cmNlKCkgeworfQorCitzdGF0dXNfdCBOdUhUVFBEYXRhU291cmNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMsCisgICAgICAgIG9mZl90IG9mZnNldCkgeworICAgIFN0cmluZzggaGVhZGVyczsKKyAgICBNYWtlRnVsbEhlYWRlcnMob3ZlcnJpZGVzLCAmaGVhZGVycyk7CisKKyAgICByZXR1cm4gY29ubmVjdCh1cmksIGhlYWRlcnMsIG9mZnNldCk7Cit9CisKK3N0YXR1c190IE51SFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmaGVhZGVycywKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgU3RyaW5nOCBob3N0LCBwYXRoOworICAgIHVuc2lnbmVkIHBvcnQ7CisgICAgaWYgKCFQYXJzZVVSTCh1cmksICZob3N0LCAmcG9ydCwgJnBhdGgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvbm5lY3QoaG9zdCwgcG9ydCwgcGF0aCwgaGVhZGVycywgb2Zmc2V0KTsKK30KKworc3RhdGljIGJvb2wgSXNSZWRpcmVjdFN0YXR1c0NvZGUoaW50IGh0dHBTdGF0dXMpIHsKKyAgICByZXR1cm4gaHR0cFN0YXR1cyA9PSAzMDEgfHwgaHR0cFN0YXR1cyA9PSAzMDIKKyAgICAgICAgfHwgaHR0cFN0YXR1cyA9PSAzMDMgfHwgaHR0cFN0YXR1cyA9PSAzMDc7Cit9CisKK3N0YXR1c190IE51SFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsCisgICAgICAgIG9mZl90IG9mZnNldCkgeworICAgIExPR0koImNvbm5lY3QgdG8gJXM6JXUlcyBAJWxkIiwgaG9zdCwgcG9ydCwgcGF0aCwgb2Zmc2V0KTsKKworICAgIGJvb2wgbmVlZHNUb1JlY29ubmVjdCA9IHRydWU7CisKKyAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBob3N0ID09IG1Ib3N0ICYmIHBvcnQgPT0gbVBvcnQKKyAgICAgICAgICAgICYmIG9mZnNldCA9PSBtT2Zmc2V0KSB7CisgICAgICAgIGlmIChtQ29udGVudExlbmd0aFZhbGlkICYmIG1PZmZzZXQgPT0gbUNvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgICAgIExPR0koIkRpZG4ndCBoYXZlIHRvIHJlY29ubmVjdCwgb2xkIG9uZSdzIHN0aWxsIGdvb2QuIik7CisgICAgICAgICAgICBuZWVkc1RvUmVjb25uZWN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtSG9zdCA9IGhvc3Q7CisgICAgbVBvcnQgPSBwb3J0OworICAgIG1QYXRoID0gcGF0aDsKKyAgICBtSGVhZGVycyA9IGhlYWRlcnM7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CisKKyAgICBpZiAobmVlZHNUb1JlY29ubmVjdCkgeworICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7CisgICAgICAgIGVyciA9IG1IVFRQLmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgeworICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKworICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtQ29udGVudExlbmd0aCA9IDA7CisgICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmc4IHJlcXVlc3QoIkdFVCAiKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQobVBhdGgpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIEhUVFAvMS4xXHJcbiIpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiSG9zdDogIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1Ib3N0KTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIgcmFuZ2VIZWFkZXJbMTI4XTsKKyAgICAgICAgICAgIHNwcmludGYocmFuZ2VIZWFkZXIsICJSYW5nZTogYnl0ZXM9JWxkLVxyXG4iLCBvZmZzZXQpOworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocmFuZ2VIZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQobUhlYWRlcnMpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGludCBodHRwU3RhdHVzOworICAgICAgICBpZiAoKGVyciA9IG1IVFRQLnNlbmQocmVxdWVzdC5zdHJpbmcoKSwgcmVxdWVzdC5zaXplKCkpKSAhPSBPSworICAgICAgICAgICAgICAgIHx8IChlcnIgPSBtSFRUUC5yZWNlaXZlX2hlYWRlcigmaHR0cFN0YXR1cykpICE9IE9LKSB7CisgICAgICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElzUmVkaXJlY3RTdGF0dXNDb2RlKGh0dHBTdGF0dXMpKSB7CisgICAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgICBDSEVDSyhtSFRUUC5maW5kX2hlYWRlcl92YWx1ZSgiTG9jYXRpb24iLCAmdmFsdWUpKTsKKworICAgICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworCisgICAgICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBjb25uZWN0KHZhbHVlLmNfc3RyKCksIGhlYWRlcnMsIG9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFN0YXR1cyA8IDIwMCB8fCBodHRwU3RhdHVzID49IDMwMCkgeworICAgICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgICAgICAgICAgbUhUVFAuZGlzY29ubmVjdCgpOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBhcHBseVRpbWVvdXRSZXNwb25zZSgpOworCisgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB4OworICAgICAgICAgICAgaWYgKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKHN0cmluZygiQ29udGVudC1MZW5ndGgiKSwgJnZhbHVlKQorICAgICAgICAgICAgICAgICAgICAmJiBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZyh2YWx1ZS5jX3N0cigpLCAmeCkpIHsKKyAgICAgICAgICAgICAgICBtQ29udGVudExlbmd0aCA9IChvZmZfdCl4OworICAgICAgICAgICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB4OworICAgICAgICAgICAgaWYgKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKHN0cmluZygiQ29udGVudC1SYW5nZSIpLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJjaHIodmFsdWUuY19zdHIoKSwgJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xhc2hQb3MgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgUGFyc2VTaW5nbGVVbnNpZ25lZExvbmcoc2xhc2hQb3MgKyAxLCAmeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRMZW5ndGggPSB4OworICAgICAgICAgICAgICAgICAgICBtQ29udGVudExlbmd0aFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51SFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HIHx8IG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKKyAgICAgICAgbUhUVFAuZGlzY29ubmVjdCgpOworICAgIH0KKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Cit9CisKK3N0YXR1c190IE51SFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RFRCA/IE9LIDogTk9fSU5JVDsKK30KKworc3NpemVfdCBOdUhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIExPR1YoInJlYWRBdCBvZmZzZXQgJWxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAob2Zmc2V0ICE9IG1PZmZzZXQpIHsKKyAgICAgICAgU3RyaW5nOCBob3N0ID0gbUhvc3Q7CisgICAgICAgIFN0cmluZzggcGF0aCA9IG1QYXRoOworICAgICAgICBTdHJpbmc4IGhlYWRlcnMgPSBtSGVhZGVyczsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdChob3N0LCBtUG9ydCwgcGF0aCwgaGVhZGVycywgb2Zmc2V0KTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0KKyAgICAgICAgICAgIChvZmZzZXQgPj0gbUNvbnRlbnRMZW5ndGgpID8gMCA6IG1Db250ZW50TGVuZ3RoIC0gb2Zmc2V0OworCisgICAgICAgIGlmIChzaXplID4gYXZhaWwpIHsKKyAgICAgICAgICAgIHNpemUgPSBhdmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNzaXplX3QgbiA9CisgICAgICAgICAgICBtSFRUUC5yZWNlaXZlKCh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgc2l6ZSAtIG51bUJ5dGVzUmVhZCk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSAoc2l6ZV90KW47CisKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHRoZSBjb250ZW50IGxlbmd0aCBhbmQgbWFkZSBzdXJlIG5vdCB0byByZWFkIGJleW9uZAorICAgICAgICAgICAgICAgIC8vIGl0IGFuZCB5ZXQgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gb24gdXMuCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PZmZzZXQgKz0gbnVtQnl0ZXNSZWFkOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgTnVIVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmZfdCAqc2l6ZSkgeworICAgICpzaXplID0gMDsKKworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZCkgeworICAgICAgICAqc2l6ZSA9IG1Db250ZW50TGVuZ3RoOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCit1aW50MzJfdCBOdUhUVFBEYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmc7Cit9CisKKy8vIHN0YXRpYwordm9pZCBOdUhUVFBEYXRhU291cmNlOjpNYWtlRnVsbEhlYWRlcnMoCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMsIFN0cmluZzggKmhlYWRlcnMpIHsKKyAgICBoZWFkZXJzLT5zZXRUbygiIik7CisKKyAgICBoZWFkZXJzLT5hcHBlbmQoIlVzZXItQWdlbnQ6IHN0YWdlZnJpZ2h0LzEuMSAoTGludXg7QW5kcm9pZCAiKTsKKworI2lmIChQUk9QRVJUWV9WQUxVRV9NQVggPCA4KQorI2Vycm9yICJQUk9QRVJUWV9WQUxVRV9NQVggbXVzdCBiZSBhdCBsZWFzdCA4IgorI2VuZGlmCisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiLCB2YWx1ZSwgIlVua25vd24iKTsKKyAgICBoZWFkZXJzLT5hcHBlbmQodmFsdWUpOworICAgIGhlYWRlcnMtPmFwcGVuZCgiKVxyXG4iKTsKKworICAgIGlmIChvdmVycmlkZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdmVycmlkZXMtPnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzggbGluZTsKKyAgICAgICAgbGluZS5hcHBlbmQob3ZlcnJpZGVzLT5rZXlBdChpKSk7CisgICAgICAgIGxpbmUuYXBwZW5kKCI6ICIpOworICAgICAgICBsaW5lLmFwcGVuZChvdmVycmlkZXMtPnZhbHVlQXQoaSkpOworICAgICAgICBsaW5lLmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGhlYWRlcnMtPmFwcGVuZChsaW5lKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6YXBwbHlUaW1lb3V0UmVzcG9uc2UoKSB7CisgICAgc3RyaW5nIHRpbWVvdXQ7CisgICAgaWYgKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKCJYLVNvY2tldFRpbWVvdXQiLCAmdGltZW91dCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IHRpbWVvdXQuY19zdHIoKTsKKyAgICAgICAgY2hhciAqZW5kOworICAgICAgICBsb25nIHRtcCA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CisgICAgICAgIGlmIChlbmQgPT0gcyB8fCAqZW5kICE9ICdcMCcpIHsKKyAgICAgICAgICAgIExPR1coIklsbGVnYWwgWC1Tb2NrZXRUaW1lb3V0IHZhbHVlIGdpdmVuLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTE9HSSgib3ZlcnJpZGluZyBkZWZhdWx0IHRpbWVvdXQsIG5ldyB0aW1lb3V0IGlzICVsZCBzZWNvbmRzIiwgdG1wKTsKKyAgICAgICAgbUhUVFAuc2V0UmVjZWl2ZVRpbWVvdXQodG1wKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNjlkYTdlZi4uOTgwZGE3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTksMTMgKzE5LDE5IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0FBQ0RlY29kZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0FBQ0VuY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0FNUk5CRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQU1STkJFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BTVJXQkRlY29kZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0FNUldCRW5jb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQVZDRGVjb2Rlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQVZDRW5jb2Rlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvRzcxMURlY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL000dkgyNjNEZWNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NNHZIMjYzRW5jb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVAzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvVm9yYmlzRGVjb2Rlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvVlBYRGVjb2Rlci5oIgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKQEAgLTQ2LDYgKzUyLDggQEAKICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAKKyNpbmNsdWRlICJpbmNsdWRlL1RocmVhZGVkU291cmNlLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGludCBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMDsKQEAgLTYwLDYgKzY4LDExIEBACiAgICAgcmV0dXJuIG5ldyBuYW1lKHNvdXJjZSk7IFwKIH0KIAorI2RlZmluZSBGQUNUT1JZX0NSRUFURV9FTkNPREVSKG5hbWUpIFwKK3N0YXRpYyBzcDxNZWRpYVNvdXJjZT4gTWFrZSMjbmFtZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKSB7IFwKKyAgICByZXR1cm4gbmV3IG5hbWUoc291cmNlLCBtZXRhKTsgXAorfQorCiAjZGVmaW5lIEZBQ1RPUllfUkVGKG5hbWUpIHsgI25hbWUsIE1ha2UjI25hbWUgfSwKIAogRkFDVE9SWV9DUkVBVEUoTVAzRGVjb2RlcikKQEAgLTY3LDkgKzgwLDQwIEBACiBGQUNUT1JZX0NSRUFURShBTVJXQkRlY29kZXIpCiBGQUNUT1JZX0NSRUFURShBQUNEZWNvZGVyKQogRkFDVE9SWV9DUkVBVEUoQVZDRGVjb2RlcikKK0ZBQ1RPUllfQ1JFQVRFKEc3MTFEZWNvZGVyKQogRkFDVE9SWV9DUkVBVEUoTTR2SDI2M0RlY29kZXIpCiBGQUNUT1JZX0NSRUFURShWb3JiaXNEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoQU1STkJFbmNvZGVyKQorRkFDVE9SWV9DUkVBVEUoVlBYRGVjb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQU1STkJFbmNvZGVyKQorRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJXQkVuY29kZXIpCitGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFBQ0VuY29kZXIpCitGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFWQ0VuY29kZXIpCitGQUNUT1JZX0NSRUFURV9FTkNPREVSKE00dkgyNjNFbmNvZGVyKQorCitzdGF0aWMgc3A8TWVkaWFTb3VyY2U+IEluc3RhbnRpYXRlU29mdHdhcmVFbmNvZGVyKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKSB7CisgICAgc3RydWN0IEZhY3RvcnlJbmZvIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICgqQ3JlYXRlRnVuYykoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICYsIGNvbnN0IHNwPE1ldGFEYXRhPiAmKTsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IEZhY3RvcnlJbmZvIGtGYWN0b3J5SW5mb1tdID0geworICAgICAgICBGQUNUT1JZX1JFRihBTVJOQkVuY29kZXIpCisgICAgICAgIEZBQ1RPUllfUkVGKEFNUldCRW5jb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoQUFDRW5jb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoQVZDRW5jb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoTTR2SDI2M0VuY29kZXIpCisgICAgfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgIGkgPCBzaXplb2Yoa0ZhY3RvcnlJbmZvKSAvIHNpemVvZihrRmFjdG9yeUluZm9bMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwga0ZhY3RvcnlJbmZvW2ldLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKCprRmFjdG9yeUluZm9baV0uQ3JlYXRlRnVuYykoc291cmNlLCBtZXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQogCiBzdGF0aWMgc3A8TWVkaWFTb3VyY2U+IEluc3RhbnRpYXRlU29mdHdhcmVDb2RlYygKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKQEAgLTg0LDEzICsxMjgsMTggQEAKICAgICAgICAgRkFDVE9SWV9SRUYoQU1SV0JEZWNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihBQUNEZWNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihBVkNEZWNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihHNzExRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoTTR2SDI2M0RlY29kZXIpCiAgICAgICAgIEZBQ1RPUllfUkVGKFZvcmJpc0RlY29kZXIpCi0gICAgICAgIEZBQ1RPUllfUkVGKEFNUk5CRW5jb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoVlBYRGVjb2RlcikKICAgICB9OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOwogICAgICAgICAgaSA8IHNpemVvZihrRmFjdG9yeUluZm8pIC8gc2l6ZW9mKGtGYWN0b3J5SW5mb1swXSk7ICsraSkgewogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBrRmFjdG9yeUluZm9baV0ubmFtZSkpIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJWUFhEZWNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRocmVhZGVkU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgKCprRmFjdG9yeUluZm9baV0uQ3JlYXRlRnVuYykoc291cmNlKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKCprRmFjdG9yeUluZm9baV0uQ3JlYXRlRnVuYykoc291cmNlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExNSwzNCArMTY0LDU1IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5QVi5hYWNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJHNzExRGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgIkc3MTFEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguU0VDLk1QRUc0LkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGRlYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmgyNjMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlNFQy5IMjYzLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiTTR2SDI2M0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2RlYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlNFQy5BVkMuRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5QVi5hdmNkZWMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJWb3JiaXNEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlBYLCAiVlBYRGVjb2RlciIgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBDb2RlY0luZm8ga0VuY29kZXJJbmZvW10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguVEkuQU1SLmVuY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIkFNUk5CRW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5USS5XQkFNUi5lbmNvZGUiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJBTVJXQkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmVuY29kZSIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5QVi5hYWNlbmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJBQUNFbmNvZGVyIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguUFYuYWFjZW5jIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguUFYubXBlZzRlbmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5TRUMuTVBFRzQuRW5jb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0VuY29kZXIiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlBWLm1wZWc0ZW5jIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguVEkuVmlkZW8uZW5jb2RlciIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2VuYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguU0VDLkgyNjMuRW5jb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJNNHZIMjYzRW5jb2RlciIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5QVi5oMjYzZW5jIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5lbmNvZGVyLmF2YyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguUFYuYXZjZW5jIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlNFQy5BVkMuRW5jb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0VuY29kZXIiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5QVi5hdmNlbmMiIH0sCiB9OwogCiAjdW5kZWYgT1BUSU9OQUwKQEAgLTI3Niw3ICszNDYsOCBAQAogfQogCiAvLyBzdGF0aWMKLXVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewordWludDMyX3QgT01YQ29kZWM6OmdldENvbXBvbmVudFF1aXJrcygKKyAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgYm9vbCBpc0VuY29kZXIpIHsKICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwogCiAgICAgaWYgKCFzdHJjbXAoY29tcG9uZW50TmFtZSwgIk9NWC5QVi5hdmNkZWMiKSkgewpAQCAtMjk1LDExICszNjYsMjcgQEAKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0xvYWRlZFRvSWRsZUFmdGVyQWxsb2NhdGlvbjsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgICAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjIiwgMjYpKSB7CisKKyAgICAgICAgICAgIC8vIFRoZSBBVkMgZW5jb2RlciBhZHZlcnRpc2VzIHRoZSBzaXplIG9mIG91dHB1dCBidWZmZXJzCisgICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgaW5wdXQgdmlkZW8gcmVzb2x1dGlvbiBhbmQgYXNzdW1lcworICAgICAgICAgICAgLy8gdGhlIHdvcnN0L2xlYXN0IGNvbXByZXNzaW9uIHJhdGlvIGlzIDAuNS4gSXQgaXMgZm91bmQgdGhhdAorICAgICAgICAgICAgLy8gc29tZXRpbWVzLCB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGlzIGxhcmdlciB0aGFuCisgICAgICAgICAgICAvLyBzaXplIGFkdmVydGlzZWQgYnkgdGhlIGVuY29kZXIuCisgICAgICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzTGFyZ2VyRW5jb2Rlck91dHB1dEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci4iLCAyOCkpIHsKICAgICB9CiAgICAgaWYgKCFzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLiIsIDIzKSkgewogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogICAgICAgICBxdWlya3MgfD0ga0RlZmVyc091dHB1dEJ1ZmZlckFsbG9jYXRpb247CiAgICAgfQorICAgIGlmICghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLiIsIDI4KSkgeworICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7CisgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CisgICAgICAgIHF1aXJrcyB8PSBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbjsKKyAgICB9CiAKICAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5USS4iLCA3KSkgewogICAgICAgICAvLyBBcHBhcmVudGx5IEkgbXVzdCBub3QgdXNlIE9NWF9Vc2VCdWZmZXIgb24gZWl0aGVyIGlucHV0IG9yCkBAIC0zMDksMTIgKzM5NiwyOSBAQAogCiAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKKyAgICAgICAgaWYgKCFzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguVEkuVmlkZW8uZW5jb2RlciIsIDIwKSkgeworICAgICAgICAgICAgcXVpcmtzIHw9IGtBdm9pZE1lbWNvcHlJbnB1dFJlY29yZGluZ0ZyYW1lczsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguVEkuVmlkZW8uRGVjb2RlciIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrSW5wdXRCdWZmZXJTaXplc0FyZUJvZ3VzOwogICAgIH0KIAorICAgIGlmICghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLlNFQy4iLCA4KSAmJiAhaXNFbmNvZGVyKSB7CisgICAgICAgIC8vIFRoZXNlIG91dHB1dCBidWZmZXJzIGNvbnRhaW4gbm8gdmlkZW8gZGF0YSwganVzdCBzb21lCisgICAgICAgIC8vIG9wYXF1ZSBpbmZvcm1hdGlvbiB0aGF0IGFsbG93cyB0aGUgb3ZlcmxheSB0byBkaXNwbGF5IHRoZWlyCisgICAgICAgIC8vIGNvbnRlbnRzLgorICAgICAgICBxdWlya3MgfD0ga091dHB1dEJ1ZmZlcnNBcmVVbnJlYWRhYmxlOworICAgIH0KKworICAgIGlmICghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLlNFQy4iLCA4KSAmJiBpc0VuY29kZXIpIHsKKyAgICAgICAgLy8gVGhlc2UgaW5wdXQgYnVmZmVycyBjb250YWluIG1ldGEgZGF0YSAoZm9yIGluc3RhbmNlLAorICAgICAgICAvLyBpbmZvcm1hdGlvbiBoZWxwcyBsb2NhdGUgdGhlIGFjdHVhbCBZVVYgZGF0YSwgb3IKKyAgICAgICAgLy8gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFlVViBkYXRhKS4KKyAgICAgICAgcXVpcmtzIHw9IGtTdG9yZU1ldGFEYXRhSW5JbnB1dFZpZGVvQnVmZmVyczsKKyAgICB9CisKICAgICByZXR1cm4gcXVpcmtzOwogfQogCkBAIC0zODQsOCArNDg4LDggQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXS5zdHJpbmcoKTsKIAotI2lmIEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc29mdHdhcmVDb2RlYyA9CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb2Z0d2FyZUNvZGVjID0gY3JlYXRlRW5jb2Rlcj8KKyAgICAgICAgICAgIEluc3RhbnRpYXRlU29mdHdhcmVFbmNvZGVyKGNvbXBvbmVudE5hbWUsIHNvdXJjZSwgbWV0YSk6CiAgICAgICAgICAgICBJbnN0YW50aWF0ZVNvZnR3YXJlQ29kZWMoY29tcG9uZW50TmFtZSwgc291cmNlKTsKIAogICAgICAgICBpZiAoc29mdHdhcmVDb2RlYyAhPSBOVUxMKSB7CkBAIC0zOTMsMjIgKzQ5NywzOCBAQAogCiAgICAgICAgICAgICByZXR1cm4gc29mdHdhcmVDb2RlYzsKICAgICAgICAgfQotI2VuZGlmCiAKICAgICAgICAgTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKKyAgICAgICAgdWludDMyX3QgcXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUVuY29kZXIpOworCisgICAgICAgIGlmICghY3JlYXRlRW5jb2RlcgorICAgICAgICAgICAgICAgICYmIChxdWlya3MgJiBrT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGUpCisgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYga0NsaWVudE5lZWRzRnJhbWVidWZmZXIpKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLlNFQy4iLCA4KSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBPTVguU0VDLiogZGVjb2RlcnMgd2UgY2FuIGVuYWJsZSBhIHNwZWNpYWwgbW9kZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdGhlIGNsaWVudCBhY2Nlc3MgdG8gdGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLgorCisgICAgICAgICAgICAgICAgTE9HVygiQ29tcG9uZW50ICclcycgZG9lcyBub3QgZ2l2ZSB0aGUgY2xpZW50IGFjY2VzcyB0byAiCisgICAgICAgICAgICAgICAgICAgICAidGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLiBTa2lwcGluZy4iLAorICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSk7CisKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKGNvbXBvbmVudE5hbWUsIG9ic2VydmVyLCAmbm9kZSk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIExPR1YoIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgT01YIG5vZGUgJyVzJyIsIGNvbXBvbmVudE5hbWUpOwogCiAgICAgICAgICAgICBzcDxPTVhDb2RlYz4gY29kZWMgPSBuZXcgT01YQ29kZWMoCi0gICAgICAgICAgICAgICAgICAgIG9teCwgbm9kZSwgZ2V0Q29tcG9uZW50UXVpcmtzKGNvbXBvbmVudE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBvbXgsIG5vZGUsIHF1aXJrcywKICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW5jb2RlciwgbWltZSwgY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgICAgICAgICAgc291cmNlKTsKIAogICAgICAgICAgICAgb2JzZXJ2ZXItPnNldENvZGVjKGNvZGVjKTsKIAotICAgICAgICAgICAgZXJyID0gY29kZWMtPmNvbmZpZ3VyZUNvZGVjKG1ldGEpOworICAgICAgICAgICAgZXJyID0gY29kZWMtPmNvbmZpZ3VyZUNvZGVjKG1ldGEsIGZsYWdzKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlYzsKQEAgLTQyMSwxMTcgKzU0MSwxMjUgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdHVzX3QgT01YQ29kZWM6OmNvbmZpZ3VyZUNvZGVjKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkgewotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCBPSyk7CitzdGF0dXNfdCBPTVhDb2RlYzo6Y29uZmlndXJlQ29kZWMoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCB1aW50MzJfdCBmbGFncykgeworICAgIGlmICghKGZsYWdzICYga0lnbm9yZUNvZGVjU3BlY2lmaWNEYXRhKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCBPSyk7CiAKLSAgICAgICAgY29uc3Qgdm9pZCAqY29kZWNfc3BlY2lmaWNfZGF0YTsKLSAgICAgICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKLSAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YSwgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpjb2RlY19zcGVjaWZpY19kYXRhOworICAgICAgICAgICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oCisgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhLCAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKIAotICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIC8vIFBhcnNlIHRoZSBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGEsIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQKIAotICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKLSAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKLSAgICAgICAgQ0hFQ0tfRVEocHRyWzBdLCAxKTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLSAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzNdOworICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKKyAgICAgICAgICAgIENIRUNLX0VRKHB0clswXSwgMSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGUgPSBwdHJbMV07CisgICAgICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzNdOwogCi0gICAgICAgIC8vIFRoZXJlIGlzIGRlY29kYWJsZSBjb250ZW50IG91dCB0aGVyZSB0aGF0IGZhaWxzIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgLy8gYXNzZXJ0aW9uLCBsZXQncyBiZSBsZW5pZW50IGZvciBub3cuLi4KLSAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBkZWNvZGFibGUgY29udGVudCBvdXQgdGhlcmUgdGhhdCBmYWlscyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgorICAgICAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgc2l6ZV90IGxlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgICAgICAgICAgc2l6ZV90IGxlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogCi0gICAgICAgIC8vIGNvbW1lbnRlZCBvdXQgY2hlY2sgYmVsb3cgYXMgSDI2NF9RVkdBXzUwMF9OT19BVURJTy4zZ3AKLSAgICAgICAgLy8gdmlvbGF0ZXMgaXQuLi4KLSAgICAgICAgLy8gQ0hFQ0soKHB0cls1XSA+PiA1KSA9PSA3KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAvLyBjb21tZW50ZWQgb3V0IGNoZWNrIGJlbG93IGFzIEgyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwCisgICAgICAgICAgICAvLyB2aW9sYXRlcyBpdC4uLgorICAgICAgICAgICAgLy8gQ0hFQ0soKHB0cls1XSA+PiA1KSA9PSA3KTsgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgc2l6ZV90IG51bVNlcVBhcmFtZXRlclNldHMgPSBwdHJbNV0gJiAzMTsKKyAgICAgICAgICAgIHNpemVfdCBudW1TZXFQYXJhbWV0ZXJTZXRzID0gcHRyWzVdICYgMzE7CiAKLSAgICAgICAgcHRyICs9IDY7Ci0gICAgICAgIHNpemUgLT0gNjsKKyAgICAgICAgICAgIHB0ciArPSA2OworICAgICAgICAgICAgc2l6ZSAtPSA2OwogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VxUGFyYW1ldGVyU2V0czsgKytpKSB7Ci0gICAgICAgICAgICBDSEVDSyhzaXplID49IDIpOwotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXFQYXJhbWV0ZXJTZXRzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhzaXplID49IDIpOworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKIAotICAgICAgICAgICAgcHRyICs9IDI7Ci0gICAgICAgICAgICBzaXplIC09IDI7CisgICAgICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSAyOwogCi0gICAgICAgICAgICBDSEVDSyhzaXplID49IGxlbmd0aCk7CisgICAgICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSBsZW5ndGgpOwogCi0gICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEocHRyLCBsZW5ndGgpOwogCi0gICAgICAgICAgICBwdHIgKz0gbGVuZ3RoOwotICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHIgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgICAgICAgICAgfQogCi0gICAgICAgIENIRUNLKHNpemUgPj0gMSk7Ci0gICAgICAgIHNpemVfdCBudW1QaWN0dXJlUGFyYW1ldGVyU2V0cyA9ICpwdHI7Ci0gICAgICAgICsrcHRyOwotICAgICAgICAtLXNpemU7CisgICAgICAgICAgICBDSEVDSyhzaXplID49IDEpOworICAgICAgICAgICAgc2l6ZV90IG51bVBpY3R1cmVQYXJhbWV0ZXJTZXRzID0gKnB0cjsKKyAgICAgICAgICAgICsrcHRyOworICAgICAgICAgICAgLS1zaXplOwogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGljdHVyZVBhcmFtZXRlclNldHM7ICsraSkgewotICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSAyKTsKLSAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGljdHVyZVBhcmFtZXRlclNldHM7ICsraSkgeworICAgICAgICAgICAgICAgIENIRUNLKHNpemUgPj0gMik7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwogCi0gICAgICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgICAgIHNpemUgLT0gMjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICBzaXplIC09IDI7CiAKLSAgICAgICAgICAgIENIRUNLKHNpemUgPj0gbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhzaXplID49IGxlbmd0aCk7CiAKLSAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHB0ciwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7CiAKLSAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgTE9HVigiQVZDIHByb2ZpbGUgPSAlZCAoJXMpLCBsZXZlbCA9ICVkIiwKLSAgICAgICAgICAgICAoaW50KXByb2ZpbGUsIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwgKGludClsZXZlbCAvIDEwKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoCisgICAgICAgICAgICAgICAgICAgICJBVkMgcHJvZmlsZSA9ICVkICglcyksIGxldmVsID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAoaW50KXByb2ZpbGUsIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwgbGV2ZWwpOwogCi0gICAgICAgIGlmICghc3RyY21wKG1Db21wb25lbnROYW1lLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiKQotICAgICAgICAgICAgJiYgKHByb2ZpbGUgIT0ga0FWQ1Byb2ZpbGVCYXNlbGluZSB8fCBsZXZlbCA+IDM5KSkgewotICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gZXhjZWVkcyB0aGUgZGVjb2RlcidzIGNhcGFiaWxpdGllcy4gVGhlIGRlY29kZXIKLSAgICAgICAgICAgIC8vIGRvZXMgbm90IGhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgYW5kIHdvdWxkIGNsb2JiZXIgdGhlIGhlYXAKLSAgICAgICAgICAgIC8vIGFuZCB3cmVhayBoYXZvYyBpbnN0ZWFkLi4uCisgICAgICAgICAgICBpZiAoIXN0cmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5USS5WaWRlby5EZWNvZGVyIikKKyAgICAgICAgICAgICAgICAmJiAocHJvZmlsZSAhPSBrQVZDUHJvZmlsZUJhc2VsaW5lIHx8IGxldmVsID4gMzApKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gZXhjZWVkcyB0aGUgZGVjb2RlcidzIGNhcGFiaWxpdGllcy4gVGhlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBoYW5kbGUgdGhpcyBncmFjZWZ1bGx5IGFuZCB3b3VsZCBjbG9iYmVyIHRoZSBoZWFwCisgICAgICAgICAgICAgICAgLy8gYW5kIHdyZWFrIGhhdm9jIGluc3RlYWQuLi4KIAotICAgICAgICAgICAgTE9HRSgiUHJvZmlsZSBhbmQvb3IgbGV2ZWwgZXhjZWVkIHRoZSBkZWNvZGVyJ3MgY2FwYWJpbGl0aWVzLiIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIExPR0UoIlByb2ZpbGUgYW5kL29yIGxldmVsIGV4Y2VlZCB0aGUgZGVjb2RlcidzIGNhcGFiaWxpdGllcy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IGJpdFJhdGUgPSAwOworICAgIGlmIChtSXNFbmNvZGVyKSB7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpKTsKKyAgICB9CiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbU1JTUUpKSB7Ci0gICAgICAgIHNldEFNUkZvcm1hdChmYWxzZSAvKiBpc1dBTVIgKi8pOworICAgICAgICBzZXRBTVJGb3JtYXQoZmFsc2UgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKICAgICB9CiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbU1JTUUpKSB7Ci0gICAgICAgIHNldEFNUkZvcm1hdCh0cnVlIC8qIGlzV0FNUiAqLyk7CisgICAgICAgIHNldEFNUkZvcm1hdCh0cnVlIC8qIGlzV0FNUiAqLywgYml0UmF0ZSk7CiAgICAgfQogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1NSU1FKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKIAotICAgICAgICBzZXRBQUNGb3JtYXQobnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgICAgICBzZXRBQUNGb3JtYXQobnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdFJhdGUpOwogICAgIH0KKwogICAgIGlmICghc3RybmNhc2VjbXAobU1JTUUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIGJvb2wgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7Ci0gICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKLSAgICAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKICAgICAgICAgaWYgKG1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgIHNldFZpZGVvSW5wdXRGb3JtYXQobU1JTUUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgc2V0VmlkZW9JbnB1dEZvcm1hdChtTUlNRSwgbWV0YSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgICAgICAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRWaWRlb091dHB1dEZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgbU1JTUUsIHdpZHRoLCBoZWlnaHQpOwogCkBAIC01NzAsMTIgKzY5OCw0MCBAQAogICAgIH0KIAogICAgIGlmICghc3RyY21wKG1Db21wb25lbnROYW1lLCAiT01YLlRJLkFNUi5lbmNvZGUiKQotICAgICAgICB8fCAhc3RyY21wKG1Db21wb25lbnROYW1lLCAiT01YLlRJLldCQU1SLmVuY29kZSIpKSB7CisgICAgICAgIHx8ICFzdHJjbXAobUNvbXBvbmVudE5hbWUsICJPTVguVEkuV0JBTVIuZW5jb2RlIikKKyAgICAgICAgfHwgIXN0cmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5USS5BQUMuZW5jb2RlIikpIHsKICAgICAgICAgc2V0TWluQnVmZmVyU2l6ZShrUG9ydEluZGV4T3V0cHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAogICAgIGluaXRPdXRwdXRGb3JtYXQobWV0YSk7CiAKKyAgICBpZiAoKGZsYWdzICYga0NsaWVudE5lZWRzRnJhbWVidWZmZXIpCisgICAgICAgICAgICAmJiAhc3RybmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5TRUMuIiwgOCkpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbU9NWC0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAiT01YLlNFQy5pbmRleC5UaHVtYm5haWxNb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gT01YX1RSVUU7CisgICAgICAgIGVyciA9IG1PTVgtPnNldENvbmZpZyhtTm9kZSwgaW5kZXgsICZlbmFibGUsIHNpemVvZihlbmFibGUpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBDT0RFQ19MT0dFKCJzZXRDb25maWcoJ09NWC5TRUMuaW5kZXguVGh1bWJuYWlsTW9kZScpICIKKyAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGVycm9yIDB4JTA4eCIsIGVycik7CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBtUXVpcmtzICY9IH5rT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGU7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02ODMsNiArODM5LDcgQEAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMjsKIAorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgICAgICByZXR1cm4gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOwogCkBAIC02OTIsOSArODQ5LDc4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBPTVhDb2RlYzo6ZmluZFRhcmdldENvbG9yRm9ybWF0KAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIE9NWF9DT0xPUl9GT1JNQVRUWVBFICpjb2xvckZvcm1hdCkgeworICAgIExPR1YoImZpbmRUYXJnZXRDb2xvckZvcm1hdCIpOworICAgIENIRUNLKG1Jc0VuY29kZXIpOworCisgICAgKmNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgaW50MzJfdCB0YXJnZXRDb2xvckZvcm1hdDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnRhcmdldENvbG9yRm9ybWF0KSkgeworICAgICAgICAqY29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpIHRhcmdldENvbG9yRm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcCgiT01YLlRJLlZpZGVvLmVuY29kZXIiLCBtQ29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgICAgICpjb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZQ2JZQ3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgY29sb3IgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICByZXR1cm4gaXNDb2xvckZvcm1hdFN1cHBvcnRlZCgqY29sb3JGb3JtYXQsIGtQb3J0SW5kZXhJbnB1dCk7Cit9CisKK3N0YXR1c190IE9NWENvZGVjOjppc0NvbG9yRm9ybWF0U3VwcG9ydGVkKAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwgaW50IHBvcnRJbmRleCkgeworICAgIExPR1YoImlzQ29sb3JGb3JtYXRTdXBwb3J0ZWQ6ICVkIiwgc3RhdGljX2Nhc3Q8aW50Pihjb2xvckZvcm1hdCkpOworCisgICAgLy8gRW51bWVyYXRlIGFsbCB0aGUgY29sb3IgZm9ybWF0cyBzdXBwb3J0ZWQgYnkKKyAgICAvLyB0aGUgb214IGNvbXBvbmVudCB0byBzZWUgd2hldGhlciB0aGUgZ2l2ZW4KKyAgICAvLyBjb2xvciBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSBwb3J0Rm9ybWF0OworICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOworICAgIHBvcnRGb3JtYXQublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKyAgICBPTVhfVTMyIGluZGV4ID0gMDsKKyAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsCisgICAgICAgICAgICAgICAgJnBvcnRGb3JtYXQsIHNpemVvZihwb3J0Rm9ybWF0KSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG9teCBjb21wb25lbnQgZG9lcyBub3Qgb3ZlcndyaXRlCisgICAgICAgIC8vIHRoZSBpbmNyZW1lbnRlZCBpbmRleCAoYnVnIDI4OTc0MTMpLgorICAgICAgICBDSEVDS19FUShpbmRleCwgcG9ydEZvcm1hdC5uSW5kZXgpOworICAgICAgICBpZiAoKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID09IGNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgTE9HVigiRm91bmQgc3VwcG9ydGVkIGNvbG9yIGZvcm1hdDogJWQiLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7ICAvLyBjb2xvckZvcm1hdCBpcyBzdXBwb3J0ZWQhCisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgcG9ydEZvcm1hdC5uSW5kZXggPSBpbmRleDsKKworICAgICAgICAvLyBPTVggU3BlYyBkZWZpbmVzIGxlc3MgdGhhbiA1MCBjb2xvciBmb3JtYXRzCisgICAgICAgIC8vIDEwMDAgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgdXMgdG8gdGVsbCB3aGV0aGVyIHRoZSBvbXgKKyAgICAgICAgLy8gY29tcG9uZW50IGluIHF1ZXN0aW9uIGlzIGJ1Z2d5IG9yIG5vdC4KKyAgICAgICAgaWYgKGluZGV4ID49IDEwMDApIHsKKyAgICAgICAgICAgIExPR0UoIk1vcmUgdGhhbiAlbGQgY29sb3IgZm9ybWF0cyBhcmUgc3VwcG9ydGVkPz8/IiwgaW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCJjb2xvciBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCIsIGNvbG9yRm9ybWF0KTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKwogdm9pZCBPTVhDb2RlYzo6c2V0VmlkZW9JbnB1dEZvcm1hdCgKLSAgICAgICAgY29uc3QgY2hhciAqbWltZSwgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpIHsKLSAgICBDT0RFQ19MT0dWKCJzZXRWaWRlb0lucHV0Rm9ybWF0IHdpZHRoPSVsZCwgaGVpZ2h0PSVsZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgZnJhbWVSYXRlLCBiaXRSYXRlLCBzdHJpZGUsIHNsaWNlSGVpZ2h0OworICAgIGJvb2wgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisgICAgQ0hFQ0soc3RyaWRlICE9IDApOwogCiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CkBAIC03MDgsNDMgKzkzNCwxOCBAQAogICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4gTm90IGEgc3VwcG9ydGVkIHZpZGVvIG1pbWUgdHlwZS4iKTsKICAgICB9CiAKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOwotICAgIGlmICghc3RyY2FzZWNtcCgiT01YLlRJLlZpZGVvLmVuY29kZXIiLCBtQ29tcG9uZW50TmFtZSkpIHsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyOwotICAgIH0KKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdDsKKyAgICBDSEVDS19FUShPSywgZmluZFRhcmdldENvbG9yRm9ybWF0KG1ldGEsICZjb2xvckZvcm1hdCkpOwogCisgICAgc3RhdHVzX3QgZXJyOworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZkZWYuZm9ybWF0LnZpZGVvOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElucHV0IHBvcnQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIENIRUNLX0VRKHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCiAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsCiAgICAgICAgICAgICBjb2xvckZvcm1hdCksIE9LKTsKIAotICAgIENIRUNLX0VRKHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCi0gICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBjb21wcmVzc2lvbkZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFVudXNlZCksCi0gICAgICAgICAgICBPSyk7Ci0KLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKLSAgICBJbml0T01YUGFyYW1zKCZkZWYpOwotICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZkZWYuZm9ybWF0LnZpZGVvOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKLQotICAgIENIRUNLX0VRKGVyciwgT0spOwotICAgIENIRUNLX0VRKGRlZi5lRG9tYWluLCBPTVhfUG9ydERvbWFpblZpZGVvKTsKLQotICAgIHZpZGVvX2RlZi0+bkZyYW1lV2lkdGggPSB3aWR0aDsKLSAgICB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCA9IGhlaWdodDsKLQotICAgIHZpZGVvX2RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gY29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgdmlkZW9fZGVmLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwotCi0gICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKLSAgICBDSEVDS19FUShlcnIsIE9LKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CiAgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CiAKQEAgLTc1MiwzNSArOTUzLDY2IEBACiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCi0gICAgZGVmLm5CdWZmZXJTaXplID0gZ2V0RnJhbWVTaXplKGNvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBDT0RFQ19MT0dWKCJTZXR0aW5nIG5CdWZmZXJTaXplID0gJWxkIiwgZGVmLm5CdWZmZXJTaXplKTsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBnZXRGcmFtZVNpemUoY29sb3JGb3JtYXQsCisgICAgICAgICAgICBzdHJpZGUgPiAwPyBzdHJpZGU6IC1zdHJpZGUsIHNsaWNlSGVpZ2h0KTsKIAogICAgIENIRUNLX0VRKGRlZi5lRG9tYWluLCBPTVhfUG9ydERvbWFpblZpZGVvKTsKIAogICAgIHZpZGVvX2RlZi0+bkZyYW1lV2lkdGggPSB3aWR0aDsKICAgICB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCA9IGhlaWdodDsKKyAgICB2aWRlb19kZWYtPm5TdHJpZGUgPSBzdHJpZGU7CisgICAgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPSBzbGljZUhlaWdodDsKKyAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAoZnJhbWVSYXRlIDw8IDE2KTsgIC8vIFExNiBmb3JtYXQKICAgICB2aWRlb19kZWYtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CiAgICAgdmlkZW9fZGVmLT5lQ29sb3JGb3JtYXQgPSBjb2xvckZvcm1hdDsKIAotICAgIHZpZGVvX2RlZi0+eEZyYW1lcmF0ZSA9IDI0IDw8IDE2OyAgLy8gWFhYIGNydWNpYWwhCi0KICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE91dHB1dCBwb3J0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBDSEVDS19FUShzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAorICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgY29tcHJlc3Npb25Gb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQpLAorICAgICAgICAgICAgT0spOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKGRlZi5lRG9tYWluLCBPTVhfUG9ydERvbWFpblZpZGVvKTsKKworICAgIHZpZGVvX2RlZi0+bkZyYW1lV2lkdGggPSB3aWR0aDsKKyAgICB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCA9IGhlaWdodDsKKyAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAwOyAgICAgIC8vIE5vIG5lZWQgZm9yIG91dHB1dCBwb3J0CisgICAgdmlkZW9fZGVmLT5uQml0cmF0ZSA9IGJpdFJhdGU7ICAvLyBRMTYgZm9ybWF0CisgICAgdmlkZW9fZGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBjb21wcmVzc2lvbkZvcm1hdDsKKyAgICB2aWRlb19kZWYtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgaWYgKG1RdWlya3MgJiBrUmVxdWlyZXNMYXJnZXJFbmNvZGVyT3V0cHV0QnVmZmVyKSB7CisgICAgICAgIC8vIEluY3JlYXNlcyB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICAgIGRlZi5uQnVmZmVyU2l6ZSA9ICgoZGVmLm5CdWZmZXJTaXplICogMykgPj4gMSk7CisgICAgfQorCisgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICBDSEVDS19FUShlcnIsIE9LKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8gQ29kZWMtc3BlY2lmaWMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgc3dpdGNoIChjb21wcmVzc2lvbkZvcm1hdCkgewogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdNUEVHNDoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKCksIE9LKTsKKyAgICAgICAgICAgIENIRUNLX0VRKHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhtZXRhKSwgT0spOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdIMjYzOgorICAgICAgICAgICAgQ0hFQ0tfRVEoc2V0dXBIMjYzRW5jb2RlclBhcmFtZXRlcnMobWV0YSksIE9LKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0FWQzoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycygpLCBPSyk7CisgICAgICAgICAgICBDSEVDS19FUShzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKG1ldGEpLCBPSyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC03OTAsNyArMTAyMiwxNjkgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoKSB7CitzdGF0aWMgT01YX1UzMiBzZXRQRnJhbWVzU3BhY2luZyhpbnQzMl90IGlGcmFtZXNJbnRlcnZhbCwgaW50MzJfdCBmcmFtZVJhdGUpIHsKKyAgICBpZiAoaUZyYW1lc0ludGVydmFsIDwgMCkgeworICAgICAgICByZXR1cm4gMHhGRkZGRkZGRjsKKyAgICB9IGVsc2UgaWYgKGlGcmFtZXNJbnRlcnZhbCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBPTVhfVTMyIHJldCA9IGZyYW1lUmF0ZSAqIGlGcmFtZXNJbnRlcnZhbDsKKyAgICBDSEVDSyhyZXQgPiAxKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6c2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCkgeworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmZXJyb3JDb3JyZWN0aW9uVHlwZSk7CisgICAgZXJyb3JDb3JyZWN0aW9uVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uLAorICAgICAgICAgICAgJmVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihlcnJvckNvcnJlY3Rpb25UeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBMT0dXKCJFcnJvciBjb3JyZWN0aW9uIHBhcmFtIHF1ZXJ5IGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOyAgLy8gT3B0aW9uYWwgZmVhdHVyZS4gSWdub3JlIHRoaXMgZmFpbHVyZQorICAgIH0KKworICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZUhFQyA9IE9NWF9GQUxTRTsKKyAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVSZXN5bmMgPSBPTVhfVFJVRTsKKyAgICBlcnJvckNvcnJlY3Rpb25UeXBlLm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IDI1NjsKKyAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gT01YX0ZBTFNFOworICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZVJWTEMgPSBPTVhfRkFMU0U7CisKKyAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwKKyAgICAgICAgICAgICZlcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoZXJyb3JDb3JyZWN0aW9uVHlwZSkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgTE9HVygiRXJyb3IgY29ycmVjdGlvbiBwYXJhbSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICAvLyBPcHRpb25hbCBmZWF0dXJlLiBJZ25vcmUgdGhlIGZhaWx1cmUuCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6c2V0dXBCaXRSYXRlKGludDMyX3QgYml0UmF0ZSkgeworICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSBiaXRyYXRlVHlwZTsKKyAgICBJbml0T01YUGFyYW1zKCZiaXRyYXRlVHlwZSk7CisgICAgYml0cmF0ZVR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCisgICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworCisgICAgYml0cmF0ZVR5cGUuZUNvbnRyb2xSYXRlID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7CisgICAgYml0cmF0ZVR5cGUublRhcmdldEJpdHJhdGUgPSBiaXRSYXRlOworCisgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlLAorICAgICAgICAgICAgJmJpdHJhdGVUeXBlLCBzaXplb2YoYml0cmF0ZVR5cGUpKTsKKyAgICBDSEVDS19FUShlcnIsIE9LKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9NWENvZGVjOjpnZXRWaWRlb1Byb2ZpbGVMZXZlbCgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLAorICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCYgZGVmYXVsdFByb2ZpbGVMZXZlbCwKKyAgICAgICAgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCkgeworICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJWxkLCBsZXZlbCAlbGQiLAorICAgICAgICAgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwpOworCisgICAgLy8gQXJlIHRoZSBkZWZhdWx0IHByb2ZpbGUgYW5kIGxldmVsIG92ZXJ3cml0ZW4/CisgICAgaW50MzJfdCBwcm9maWxlLCBsZXZlbDsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGRlZmF1bHRQcm9maWxlTGV2ZWwubVByb2ZpbGU7CisgICAgfQorICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmbGV2ZWwpKSB7CisgICAgICAgIGxldmVsID0gZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWw7CisgICAgfQorICAgIENPREVDX0xPR1YoIlRhcmdldCBwcm9maWxlOiAlZCwgbGV2ZWw6ICVkIiwgcHJvZmlsZSwgbGV2ZWwpOworCisgICAgLy8gQXJlIHRoZSB0YXJnZXQgcHJvZmlsZSBhbmQgbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoZSBlbmNvZGVyPworICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHBhcmFtOworICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtKTsKKyAgICBwYXJhbS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBmb3IgKHBhcmFtLm5Qcm9maWxlSW5kZXggPSAwOzsgKytwYXJhbS5uUHJvZmlsZUluZGV4KSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgYnJlYWs7CisKKyAgICAgICAgaW50MzJfdCBzdXBwb3J0ZWRQcm9maWxlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGFyYW0uZVByb2ZpbGUpOworICAgICAgICBpbnQzMl90IHN1cHBvcnRlZExldmVsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGFyYW0uZUxldmVsKTsKKyAgICAgICAgQ09ERUNfTE9HVigiU3VwcG9ydGVkIHByb2ZpbGU6ICVkLCBsZXZlbCAlZCIsCisgICAgICAgICAgICBzdXBwb3J0ZWRQcm9maWxlLCBzdXBwb3J0ZWRMZXZlbCk7CisKKyAgICAgICAgaWYgKHByb2ZpbGUgPT0gc3VwcG9ydGVkUHJvZmlsZSAmJgorICAgICAgICAgICAgbGV2ZWwgPD0gc3VwcG9ydGVkTGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbiBmdXJ0aGVyIGNoZWNrIHdoZXRoZXIgdGhlIGxldmVsIGlzIGEgdmFsaWQKKyAgICAgICAgICAgIC8vIHZhbHVlOyBidXQgd2Ugd2lsbCBsZWF2ZSB0aGF0IHRvIHRoZSBvbXggZW5jb2RlciBjb21wb25lbnQKKyAgICAgICAgICAgIC8vIHZpYSBPTVhfU2V0UGFyYW1ldGVyIGNhbGwuCisgICAgICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgQ09ERUNfTE9HRSgiVGFyZ2V0IHByb2ZpbGUgKCVkKSBhbmQgbGV2ZWwgKCVkKSBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6c2V0dXBIMjYzRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgYml0UmF0ZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZVJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgaDI2M3R5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmaDI2M3R5cGUpOworICAgIGgyNjN0eXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAmaDI2M3R5cGUsIHNpemVvZihoMjYzdHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworCisgICAgaDI2M3R5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPQorICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKKworICAgIGgyNjN0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lc0ludGVydmFsLCBmcmFtZVJhdGUpOworICAgIGlmIChoMjYzdHlwZS5uUEZyYW1lcyA9PSAwKSB7CisgICAgICAgIGgyNjN0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSTsKKyAgICB9CisgICAgaDI2M3R5cGUubkJGcmFtZXMgPSAwOworCisgICAgLy8gQ2hlY2sgcHJvZmlsZSBhbmQgbGV2ZWwgcGFyYW1ldGVycworICAgIENvZGVjUHJvZmlsZUxldmVsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbDsKKyAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlID0gaDI2M3R5cGUuZVByb2ZpbGU7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBoMjYzdHlwZS5lTGV2ZWw7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIGgyNjN0eXBlLmVQcm9maWxlID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRT4ocHJvZmlsZUxldmVsLm1Qcm9maWxlKTsKKyAgICBoMjYzdHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSDI2M0xFVkVMVFlQRT4ocHJvZmlsZUxldmVsLm1MZXZlbCk7CisKKyAgICBoMjYzdHlwZS5iUExVU1BUWVBFQWxsb3dlZCA9IE9NWF9GQUxTRTsKKyAgICBoMjYzdHlwZS5iRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gPSBPTVhfRkFMU0U7CisgICAgaDI2M3R5cGUublBpY3R1cmVIZWFkZXJSZXBldGl0aW9uID0gMDsKKyAgICBoMjYzdHlwZS5uR09CSGVhZGVySW50ZXJ2YWwgPSAwOworCisgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAmaDI2M3R5cGUsIHNpemVvZihoMjYzdHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworCisgICAgQ0hFQ0tfRVEoc2V0dXBCaXRSYXRlKGJpdFJhdGUpLCBPSyk7CisgICAgQ0hFQ0tfRVEoc2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCksIE9LKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT01YQ29kZWM6OnNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBpbnQzMl90IGlGcmFtZXNJbnRlcnZhbCwgZnJhbWVSYXRlLCBiaXRSYXRlOworICAgIGJvb2wgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsICZpRnJhbWVzSW50ZXJ2YWwpOworICAgIENIRUNLKHN1Y2Nlc3MpOwogICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgbXBlZzR0eXBlOwogICAgIEluaXRPTVhQYXJhbXMoJm1wZWc0dHlwZSk7CiAgICAgbXBlZzR0eXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwpAQCAtODA2LDkgKzEyMDAsMTEgQEAKICAgICBtcGVnNHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPQogICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKIAotICAgIG1wZWc0dHlwZS5uUEZyYW1lcyA9IDIzOworICAgIG1wZWc0dHlwZS5uUEZyYW1lcyA9IHNldFBGcmFtZXNTcGFjaW5nKGlGcmFtZXNJbnRlcnZhbCwgZnJhbWVSYXRlKTsKKyAgICBpZiAobXBlZzR0eXBlLm5QRnJhbWVzID09IDApIHsKKyAgICAgICAgbXBlZzR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSTsKKyAgICB9CiAgICAgbXBlZzR0eXBlLm5CRnJhbWVzID0gMDsKLQogICAgIG1wZWc0dHlwZS5uSURDVkxDVGhyZXNob2xkID0gMDsKICAgICBtcGVnNHR5cGUuYkFDUHJlZCA9IE9NWF9UUlVFOwogICAgIG1wZWc0dHlwZS5uTWF4UGFja2V0U2l6ZSA9IDI1NjsKQEAgLTgxNiw1OCArMTIxMiwzMiBAQAogICAgIG1wZWc0dHlwZS5uSGVhZGVyRXh0ZW5zaW9uID0gMDsKICAgICBtcGVnNHR5cGUuYlJldmVyc2libGVWTEMgPSBPTVhfRkFMU0U7CiAKLSAgICBtcGVnNHR5cGUuZVByb2ZpbGUgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZTsKLSAgICBtcGVnNHR5cGUuZUxldmVsID0gT01YX1ZJREVPX01QRUc0TGV2ZWwyOworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IG1wZWc0dHlwZS5lUHJvZmlsZTsKKyAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1MZXZlbCA9IG1wZWc0dHlwZS5lTGV2ZWw7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIG1wZWc0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFPihwcm9maWxlTGV2ZWwubVByb2ZpbGUpOworICAgIG1wZWc0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+KHByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgJm1wZWc0dHlwZSwgc2l6ZW9mKG1wZWc0dHlwZSkpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOwotICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKLSAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwKLSAgICAgICAgICAgICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKLSAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IDEwMDAwMDA7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCi0gICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgZXJyb3JDb3JyZWN0aW9uVHlwZTsKLSAgICBJbml0T01YUGFyYW1zKCZlcnJvckNvcnJlY3Rpb25UeXBlKTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotCi0gICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sCi0gICAgICAgICAgICAmZXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKGVycm9yQ29ycmVjdGlvblR5cGUpKTsKLSAgICBDSEVDS19FUShlcnIsIE9LKTsKLQotICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZUhFQyA9IE9NWF9GQUxTRTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVSZXN5bmMgPSBPTVhfVFJVRTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IDI1NjsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gT01YX0ZBTFNFOwotICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZVJWTEMgPSBPTVhfRkFMU0U7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwKLSAgICAgICAgICAgICZlcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoZXJyb3JDb3JyZWN0aW9uVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKHNldHVwQml0UmF0ZShiaXRSYXRlKSwgT0spOworICAgIENIRUNLX0VRKHNldHVwRXJyb3JDb3JyZWN0aW9uUGFyYW1ldGVycygpLCBPSyk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKCkgeworc3RhdHVzX3QgT01YQ29kZWM6OnNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgYml0UmF0ZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZVJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKwogICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIGgyNjR0eXBlOwogICAgIEluaXRPTVhQYXJhbXMoJmgyNjR0eXBlKTsKICAgICBoMjY0dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKQEAgLTg4MCw0NyArMTI1MCw1MSBAQAogICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKIAogICAgIGgyNjR0eXBlLm5TbGljZUhlYWRlclNwYWNpbmcgPSAwOwotICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gMDsKLSAgICBoMjY0dHlwZS5iVXNlSGFkYW1hcmQgPSBPTVhfVFJVRTsKLSAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKLSAgICBoMjY0dHlwZS5uUmVmSWR4MTBBY3RpdmVNaW51czEgPSAwOwotICAgIGgyNjR0eXBlLm5SZWZJZHgxMUFjdGl2ZU1pbnVzMSA9IDA7CisgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOyAgIC8vIE5vIEIgZnJhbWVzIHN1cHBvcnQgeWV0CisgICAgaDI2NHR5cGUublBGcmFtZXMgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgaWYgKGgyNjR0eXBlLm5QRnJhbWVzID09IDApIHsKKyAgICAgICAgaDI2NHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPSBPTVhfVklERU9fUGljdHVyZVR5cGVJOworICAgIH0KKworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IGgyNjR0eXBlLmVQcm9maWxlOworICAgIGRlZmF1bHRQcm9maWxlTGV2ZWwubUxldmVsID0gaDI2NHR5cGUuZUxldmVsOworICAgIGVyciA9IGdldFZpZGVvUHJvZmlsZUxldmVsKG1ldGEsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRT4ocHJvZmlsZUxldmVsLm1Qcm9maWxlKTsKKyAgICBoMjY0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fQVZDTEVWRUxUWVBFPihwcm9maWxlTGV2ZWwubUxldmVsKTsKKworICAgIGlmIChoMjY0dHlwZS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKSB7CisgICAgICAgIGgyNjR0eXBlLmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOworICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgaDI2NHR5cGUublJlZklkeDExQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKKyAgICAgICAgaDI2NHR5cGUuYldlaWdodGVkUFByZWRpY3Rpb24gPSBPTVhfRkFMU0U7CisgICAgICAgIGgyNjR0eXBlLmJjb25zdElwcmVkID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5uQ2FiYWNJbml0SWRjID0gMDsKKyAgICB9CisKKyAgICBpZiAoaDI2NHR5cGUubkJGcmFtZXMgIT0gMCkgeworICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyB8PSBPTVhfVklERU9fUGljdHVyZVR5cGVCOworICAgIH0KKwogICAgIGgyNjR0eXBlLmJFbmFibGVVRVAgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuYkVuYWJsZUZNTyA9IE9NWF9GQUxTRTsKICAgICBoMjY0dHlwZS5iRW5hYmxlQVNPID0gT01YX0ZBTFNFOwogICAgIGgyNjR0eXBlLmJFbmFibGVSUyA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgaDI2NHR5cGUuZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMWI7CiAgICAgaDI2NHR5cGUuYkZyYW1lTUJzT25seSA9IE9NWF9UUlVFOwogICAgIGgyNjR0eXBlLmJNQkFGRiA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5iRW50cm9weUNvZGluZ0NBQkFDID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJXZWlnaHRlZFBQcmVkaWN0aW9uID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJjb25zdElwcmVkID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJEaXJlY3Q4eDhJbmZlcmVuY2UgPSBPTVhfRkFMU0U7Ci0gICAgaDI2NHR5cGUuYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5uQ2FiYWNJbml0SWRjID0gMDsKICAgICBoMjY0dHlwZS5lTG9vcEZpbHRlck1vZGUgPSBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZTsKIAogICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAmaDI2NHR5cGUsIHNpemVvZihoMjY0dHlwZSkpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCi0gICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOwotICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKLSAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwKLSAgICAgICAgICAgICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKLSAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IDEwMDAwMDA7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCi0gICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKHNldHVwQml0UmF0ZShiaXRSYXRlKSwgT0spOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTA1Nyw3ICsxNDMxLDExIEBACiAgICAgICBtTm9Nb3JlT3V0cHV0RGF0YShmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQoZmFsc2UpLAogICAgICAgbVNlZWtUaW1lVXMoLTEpLAotICAgICAgbUxlZnRPdmVyQnVmZmVyKE5VTEwpIHsKKyAgICAgIG1TZWVrTW9kZShSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpLAorICAgICAgbVRhcmdldFRpbWVVcygtMSksCisgICAgICBtU2tpcFRpbWVVcygtMSksCisgICAgICBtTGVmdE92ZXJCdWZmZXIoTlVMTCksCisgICAgICBtUGF1c2VkKGZhbHNlKSB7CiAgICAgbVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSA9IEVOQUJMRUQ7CiAgICAgbVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0gPSBFTkFCTEVEOwogCkBAIC0xMTMzLDYgKzE1MTEsOCBAQAogfQogCiBPTVhDb2RlYzo6fk9NWENvZGVjKCkgeworICAgIG1Tb3VyY2UuY2xlYXIoKTsKKwogICAgIENIRUNLKG1TdGF0ZSA9PSBMT0FERUQgfHwgbVN0YXRlID09IEVSUk9SKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmZyZWVOb2RlKG1Ob2RlKTsKQEAgLTEyMTAsNiArMTU5MCwxMCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIENPREVDX0xPR0koImFsbG9jYXRpbmcgJWx1IGJ1ZmZlcnMgb2Ygc2l6ZSAlbHUgb24gJXMgcG9ydCIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBkZWYubkJ1ZmZlclNpemUsCisgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKwogICAgIHNpemVfdCB0b3RhbFNpemUgPSBkZWYubkJ1ZmZlckNvdW50QWN0dWFsICogZGVmLm5CdWZmZXJTaXplOwogICAgIG1EZWFsZXJbcG9ydEluZGV4XSA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiT01YQ29kZWMiKTsKIApAQCAtMTMxOCw3ICsxNzAyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAiYW4gRU1QVFlfQlVGRkVSX0RPTkUuIiwgYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5tT3duZWRCeUNvbXBvbmVudCA9IGZhbHNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmYnVmZmVycy0+ZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tT3duZWRCeUNvbXBvbmVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tTWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyB0aW1lIHRvIHJlbGVhc2UgdGhlIG1lZGlhIGJ1ZmZlcnMgc3RvcmluZyBtZXRhIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSA9PSBESVNBQkxJTkcpIHsKICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CkBAIC0xNDAwLDYgKzE3OTIsMTQgQEAKIAogICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBpbmZvLT5tTWVkaWFCdWZmZXI7CiAKKyAgICAgICAgICAgICAgICBpZiAobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2Vfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gYnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29kZWMgbGllZCBhYm91dCBpdHMgYnVmZmVyIHNpemUgcmVxdWlyZW1lbnRzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRpbmcgYSBidWZmZXIgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZlcnRpc2VkIHNpemUgaW4gRklMTF9CVUZGRVJfRE9ORSEiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGgpOwpAQCAtMTQxNiw2ICsxODE2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAobVF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRQb2ludGVyKAogICAgICAgICAgICAgICAgICAgICAgICAga0tleVBsYXRmb3JtUHJpdmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUpOwpAQCAtMTQyNCwxMyArMTgyOCwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAga0tleUJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKIAotICAgICAgICAgICAgICAgIG1GaWxsZWRCdWZmZXJzLnB1c2hfYmFjayhpKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyRmlsbGVkLnNpZ25hbCgpOwotCiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CiAgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIk5vIG1vcmUgb3V0cHV0IGRhdGEuIik7CiAgICAgICAgICAgICAgICAgICAgIG1Ob01vcmVPdXRwdXREYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA8PSBtVGFyZ2V0VGltZVVzKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wIDwgbVRhcmdldFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBwaW5nIG91dHB1dCBidWZmZXIgYXQgdGltZXN0YW1wICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3V0cHV0QnVmZmVyKGluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgb3V0cHV0IGJ1ZmZlciBhdCB0YXJnZXQgdGltZXN0YW1wICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKKworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUZpbGxlZEJ1ZmZlcnMucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgIG1CdWZmZXJGaWxsZWQuc2lnbmFsKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ1NCw3ICsxODc4LDcgQEAKIAogICAgICAgICBjYXNlIE9NWF9FdmVudEVycm9yOgogICAgICAgICB7Ci0gICAgICAgICAgICBMT0dFKCJFUlJPUigweCUwOGx4LCAlbGQpIiwgZGF0YTEsIGRhdGEyKTsKKyAgICAgICAgICAgIENPREVDX0xPR0UoIkVSUk9SKDB4JTA4bHgsICVsZCkiLCBkYXRhMSwgZGF0YTIpOwogCiAgICAgICAgICAgICBzZXRTdGF0ZShFUlJPUik7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE2NDcsNiArMjA3MSw5IEBACiAgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIkZpbmlzaGVkIGZsdXNoaW5nIGJvdGggcG9ydHMsIG5vdyBjb250aW51aW5nIGZyb20iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZWVrLXRpbWUuIik7CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaW1wbGljaXRseSByZXN1bWUgcHVsbGluZyBvbiBvdXIgdXBzdHJlYW0gc291cmNlLgorICAgICAgICAgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisKICAgICAgICAgICAgICAgICAgICAgZHJhaW5JbnB1dEJ1ZmZlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgZmlsbE91dHB1dEJ1ZmZlcnMoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNzkwLDYgKzIyMTcsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfRVEoaW5mby0+bU1lZGlhQnVmZmVyLT5yZWZjb3VudCgpLCAwKTsKIAogICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBpbmZvLT5tTWVkaWFCdWZmZXIgPSBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgYnVmZmVycy0+cmVtb3ZlQXQoaSk7CkBAIC0xOTQ2LDYgKzIzNzQsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAKICAgICBib29sIHNpZ25hbEVPUyA9IGZhbHNlOwpAQCAtMTk1NSwyNiArMjM4Nyw0MCBAQAogICAgIGludDMyX3QgbiA9IDA7CiAgICAgZm9yICg7OykgewogICAgICAgICBNZWRpYUJ1ZmZlciAqc3JjQnVmZmVyOworICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgaWYgKG1Ta2lwVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0U2tpcEZyYW1lKG1Ta2lwVGltZVVzKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVNlZWtUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgaWYgKG1MZWZ0T3ZlckJ1ZmZlcikgewogICAgICAgICAgICAgICAgIG1MZWZ0T3ZlckJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1MZWZ0T3ZlckJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOworICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMsIG1TZWVrTW9kZSk7CiAKICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gLTE7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM7CiAgICAgICAgICAgICBtQnVmZmVyRmlsbGVkLnNpZ25hbCgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzcmNCdWZmZXIsICZvcHRpb25zKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChzcmNCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0YXJnZXRUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gdGFyZ2V0VGltZVVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobUxlZnRPdmVyQnVmZmVyKSB7CiAgICAgICAgICAgICBzcmNCdWZmZXIgPSBtTGVmdE92ZXJCdWZmZXI7CiAgICAgICAgICAgICBtTGVmdE92ZXJCdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJnNyY0J1ZmZlcik7CisgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzcmNCdWZmZXIsICZvcHRpb25zKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIwMDQsMTMgKzI0NTAsMjcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY0J1ZmZlci0+ZGF0YSgpICsgc3JjQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIHNyY0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAvLyBEbyBub3QgcmVsZWFzZSB0aGUgbWVkaWEgYnVmZmVyIGlmIGl0IHN0b3JlcyBtZXRhIGRhdGEKKyAgICAgICAgLy8gaW5zdGVhZCBvZiBZVVYgZGF0YS4gVGhlIHJlbGVhc2UgaXMgZGVsYXllZCB1bnRpbAorICAgICAgICAvLyBFTVBUWV9CVUZGRVJfRE9ORSBjYWxsYmFjayBpcyByZWNlaXZlZC4KKyAgICAgICAgYm9vbCByZWxlYXNlQnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Jc0VuY29kZXIgJiYgKG1RdWlya3MgJiBrQXZvaWRNZW1jb3B5SW5wdXRSZWNvcmRpbmdGcmFtZXMpKSB7CisgICAgICAgICAgICBDSEVDSyhtT01YTGl2ZXNMb2NhbGx5ICYmIG9mZnNldCA9PSAwKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgaW5mby0+bUJ1ZmZlcjsKKyAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlciA9IChPTVhfVTggKikgc3JjQnVmZmVyLT5kYXRhKCkgKyBzcmNCdWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1RdWlya3MgJiBrU3RvcmVNZXRhRGF0YUluSW5wdXRWaWRlb0J1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQnVmZmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyID0gc3JjQnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjQnVmZmVyLT5kYXRhKCkgKyBzcmNCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgbGFzdEJ1ZmZlclRpbWVVczsKICAgICAgICAgQ0hFQ0soc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbGFzdEJ1ZmZlclRpbWVVcykpOwotICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKKyAgICAgICAgQ0hFQ0sobGFzdEJ1ZmZlclRpbWVVcyA+PSAwKTsKIAogICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gbGFzdEJ1ZmZlclRpbWVVczsKQEAgLTIwMTgsOCArMjQ3OCwxMCBAQAogCiAgICAgICAgIG9mZnNldCArPSBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCi0gICAgICAgIHNyY0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBzcmNCdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAocmVsZWFzZUJ1ZmZlcikgeworICAgICAgICAgICAgc3JjQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBzcmNCdWZmZXIgPSBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgKytuOwogCkBAIC0yMTI4LDExICsyNTkwLDI0IEBACiAKIHZvaWQgT01YQ29kZWM6OnNldFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKSB7CisKKyAgICAvLyBwb3J0IGRlZmluaXRpb24KKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworICAgIENIRUNLX0VRKG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwKKyAgICAgICAgICAgICZkZWYsIHNpemVvZihkZWYpKSwgT0spOworCisgICAgLy8gcGNtIHBhcmFtCiAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHBjbVBhcmFtczsKICAgICBJbml0T01YUGFyYW1zKCZwY21QYXJhbXMpOwogICAgIHBjbVBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAmcGNtUGFyYW1zLCBzaXplb2YocGNtUGFyYW1zKSk7CiAKICAgICBDSEVDS19FUShlcnIsIE9LKTsKQEAgLTIxNTksNyArMjYzNCw1MSBAQAogICAgIENIRUNLX0VRKGVyciwgT0spOwogfQogCi12b2lkIE9NWENvZGVjOjpzZXRBTVJGb3JtYXQoYm9vbCBpc1dBTVIpIHsKK3N0YXRpYyBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHBpY2tNb2RlRnJvbUJpdFJhdGUoYm9vbCBpc0FNUldCLCBpbnQzMl90IGJwcykgeworICAgIGlmIChpc0FNUldCKSB7CisgICAgICAgIGlmIChicHMgPD0gNjYwMCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMDsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gODg1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMTsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gMTI2NTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjI7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDE0MjUwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0IzOworICAgICAgICB9IGVsc2UgaWYgKGJwcyA8PSAxNTg1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNDsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gMTgyNTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjU7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDE5ODUwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0I2OworICAgICAgICB9IGVsc2UgaWYgKGJwcyA8PSAyMzA1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDIzODUwIGJwcworICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0I4OworICAgIH0gZWxzZSB7ICAvLyBBTVJOQgorICAgICAgICBpZiAoYnBzIDw9IDQ3NTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjA7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDUxNTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjE7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDU5MDApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjI7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDY3MDApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjM7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDc0MDApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjQ7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDc5NTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjU7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDEwMjAwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlTkI2OworICAgICAgICB9CisKKyAgICAgICAgLy8gMTIyMDAgYnBzCisgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjc7CisgICAgfQorfQorCit2b2lkIE9NWENvZGVjOjpzZXRBTVJGb3JtYXQoYm9vbCBpc1dBTVIsIGludDMyX3QgYml0UmF0ZSkgewogICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gbUlzRW5jb2RlciA/IGtQb3J0SW5kZXhPdXRwdXQgOiBrUG9ydEluZGV4SW5wdXQ7CiAKICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSBkZWY7CkBAIC0yMTcyLDkgKzI2OTEsOCBAQAogICAgIENIRUNLX0VRKGVyciwgT0spOwogCiAgICAgZGVmLmVBTVJGcmFtZUZvcm1hdCA9IE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEZTRjsKLSAgICBkZWYuZUFNUkJhbmRNb2RlID0KLSAgICAgICAgaXNXQU1SID8gT01YX0FVRElPX0FNUkJhbmRNb2RlV0IwIDogT01YX0FVRElPX0FNUkJhbmRNb2RlTkIwOwogCisgICAgZGVmLmVBTVJCYW5kTW9kZSA9IHBpY2tNb2RlRnJvbUJpdFJhdGUoaXNXQU1SLCBiaXRSYXRlKTsKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsICZkZWYsIHNpemVvZihkZWYpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKIApAQCAtMjE5MSw5ICsyNzA5LDYxIEBACiAgICAgfQogfQogCi12b2lkIE9NWENvZGVjOjpzZXRBQUNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKSB7Cit2b2lkIE9NWENvZGVjOjpzZXRBQUNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGJpdFJhdGUpIHsKKyAgICBDSEVDSyhudW1DaGFubmVscyA9PSAxIHx8IG51bUNoYW5uZWxzID09IDIpOwogICAgIGlmIChtSXNFbmNvZGVyKSB7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8gaW5wdXQgcG9ydCAvLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICBzZXRSYXdBdWRpb0Zvcm1hdChrUG9ydEluZGV4SW5wdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vIG91dHB1dCBwb3J0IC8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIGZvcm1hdAorICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgZm9ybWF0OworICAgICAgICBmb3JtYXQublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIGZvcm1hdC5uSW5kZXggPSAwOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB3aGlsZSAoT01YX0Vycm9yTm9uZSA9PSBlcnIpIHsKKyAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSwgT0spOworICAgICAgICAgICAgaWYgKGZvcm1hdC5lRW5jb2RpbmcgPT0gT01YX0FVRElPX0NvZGluZ0FBQykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0Lm5JbmRleCsrOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKE9LLCBlcnIpOworICAgICAgICBDSEVDS19FUShtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0LAorICAgICAgICAgICAgICAgICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSwgT0spOworCisgICAgICAgIC8vIHBvcnQgZGVmaW5pdGlvbgorICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICAgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgICAgICAgICAgICAgJmRlZiwgc2l6ZW9mKGRlZikpLCBPSyk7CisgICAgICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX1RSVUU7CisgICAgICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ0FBQzsKKyAgICAgICAgQ0hFQ0tfRVEobU9NWC0+c2V0UGFyYW1ldGVyKG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICZkZWYsIHNpemVvZihkZWYpKSwgT0spOworCisgICAgICAgIC8vIHByb2ZpbGUKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnByb2ZpbGUpOworICAgICAgICBwcm9maWxlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsCisgICAgICAgICAgICAgICAgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSksIE9LKTsKKyAgICAgICAgcHJvZmlsZS5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICAgICAgcHJvZmlsZS5lQ2hhbm5lbE1vZGUgPSAobnVtQ2hhbm5lbHMgPT0gMT8KKyAgICAgICAgICAgICAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNb25vOiBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW8pOworICAgICAgICBwcm9maWxlLm5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgcHJvZmlsZS5uQml0UmF0ZSA9IGJpdFJhdGU7CisgICAgICAgIHByb2ZpbGUubkF1ZGlvQmFuZFdpZHRoID0gMDsKKyAgICAgICAgcHJvZmlsZS5uRnJhbWVMZW5ndGggPSAwOworICAgICAgICBwcm9maWxlLm5BQUN0b29scyA9IE9NWF9BVURJT19BQUNUb29sQWxsOworICAgICAgICBwcm9maWxlLm5BQUNFUnRvb2xzID0gT01YX0FVRElPX0FBQ0VSTm9uZTsKKyAgICAgICAgcHJvZmlsZS5lQUFDUHJvZmlsZSA9IE9NWF9BVURJT19BQUNPYmplY3RMQzsKKyAgICAgICAgcHJvZmlsZS5lQUFDU3RyZWFtRm9ybWF0ID0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOworICAgICAgICBDSEVDS19FUShtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsCisgICAgICAgICAgICAgICAgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSksIE9LKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSBwcm9maWxlOwogICAgICAgICBJbml0T01YUGFyYW1zKCZwcm9maWxlKTsKQEAgLTIzMjgsNyArMjg5OCw3IEBACiAgICAgbUNvZGVjU3BlY2lmaWNEYXRhSW5kZXggPSAwOwogfQogCi1zdGF0dXNfdCBPTVhDb2RlYzo6c3RhcnQoTWV0YURhdGEgKikgeworc3RhdHVzX3QgT01YQ29kZWM6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gTE9BREVEKSB7CkBAIC0yMzM5LDYgKzI5MDksMTQgQEAKICAgICBpZiAobVF1aXJrcyAmIGtXYW50c05BTEZyYWdtZW50cykgewogICAgICAgICBwYXJhbXMtPnNldEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgdHJ1ZSk7CiAgICAgfQorICAgIGlmIChtZXRhKSB7CisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAwOworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdGltZVVzOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKKyAgICB9CiAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zLmdldCgpKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIzNTEsNyArMjkyOSwxMCBAQAogICAgIG1Ob01vcmVPdXRwdXREYXRhID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0hhdmVDaGFuZ2VkID0gZmFsc2U7CiAgICAgbVNlZWtUaW1lVXMgPSAtMTsKKyAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM7CisgICAgbVRhcmdldFRpbWVVcyA9IC0xOwogICAgIG1GaWxsZWRCdWZmZXJzLmNsZWFyKCk7CisgICAgbVBhdXNlZCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIGluaXQoKTsKIH0KQEAgLTI0NDQsOSArMzAyNSwxNiBAQAogCiAgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CiAgICAgICAgIHNlZWtpbmcgPSB0cnVlOwogICAgIH0KKyAgICBpbnQ2NF90IHNraXBUaW1lVXM7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2tpcEZyYW1lKCZza2lwVGltZVVzKSkgeworICAgICAgICBtU2tpcFRpbWVVcyA9IHNraXBUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNraXBUaW1lVXMgPSAtMTsKKyAgICB9CiAKICAgICBpZiAobUluaXRpYWxCdWZmZXJTdWJtaXQpIHsKICAgICAgICAgbUluaXRpYWxCdWZmZXJTdWJtaXQgPSBmYWxzZTsKQEAgLTI0NTQsMTAgKzMwNDIsMTIgQEAKICAgICAgICAgaWYgKHNlZWtpbmcpIHsKICAgICAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBzZWVrTW9kZTsKIAogICAgICAgICAgICAgLy8gVGhlcmUncyBubyByZWFzb24gdG8gdHJpZ2dlciB0aGUgY29kZSBiZWxvdywgdGhlcmUncwogICAgICAgICAgICAgLy8gbm90aGluZyB0byBmbHVzaCB5ZXQuCiAgICAgICAgICAgICBzZWVraW5nID0gZmFsc2U7CisgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBkcmFpbklucHV0QnVmZmVycygpOwpAQCAtMjQ3Niw2ICszMDY2LDcgQEAKIAogICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwogICAgICAgICBtU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgICAgIG1TZWVrTW9kZSA9IHNlZWtNb2RlOwogCiAgICAgICAgIG1GaWxsZWRCdWZmZXJzLmNsZWFyKCk7CiAKQEAgLTI4NzAsNiArMzQ2MSwxMiBAQAogdm9pZCBPTVhDb2RlYzo6aW5pdE91dHB1dEZvcm1hdChjb25zdCBzcDxNZXRhRGF0YT4gJmlucHV0Rm9ybWF0KSB7CiAgICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCBtQ29tcG9uZW50TmFtZSk7CisgICAgaWYgKG1Jc0VuY29kZXIpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIGlmIChpbnB1dEZvcm1hdC0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZ0aW1lU2NhbGUpKSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCB0aW1lU2NhbGUpOworICAgICAgICB9CisgICAgfQogCiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKQEAgLTI5NjIsNiArMzU1OSwxMyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChhdWRpb19kZWYtPmVFbmNvZGluZyA9PSBPTVhfQVVESU9fQ29kaW5nQUFDKSB7CiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0Q1N0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBiaXRSYXRlOworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdFJhdGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4gVW5rbm93biBhdWRpbyBlbmNvZGluZy4iKTsKICAgICAgICAgICAgIH0KQEAgLTMwMTEsNiArMzYxNSwxNCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgT01YQ29kZWM6OnBhdXNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtUGF1c2VkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdHVzX3QgUXVlcnlDb2RlY3MoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBkMGQxYjE0Li40MzkzOGIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKQEAgLTc2LDcgKzc2LDkgQEAKICAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmX3Qgb2Zmc2V0KTsKICAgICBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CiAKLSAgICB2b2lkIGluaXQoKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGFEYXRhKCkgeyByZXR1cm4gbUZpbGVNZXRhOyB9CiAKIHByaXZhdGU6CiAgICAgc3RydWN0IFBhZ2UgewpAQCAtOTEsNyArOTMsMTAgQEAKICAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogICAgIG9mZl90IG1PZmZzZXQ7CiAgICAgUGFnZSBtQ3VycmVudFBhZ2U7CisgICAgdWludDY0X3QgbVByZXZHcmFudWxlUG9zaXRpb247CiAgICAgc2l6ZV90IG1DdXJyZW50UGFnZVNpemU7CisgICAgYm9vbCBtRmlyc3RQYWNrZXRJblBhZ2U7CisgICAgdWludDY0X3QgbUN1cnJlbnRQYWdlU2FtcGxlczsKICAgICBzaXplX3QgbU5leHRMYWNlSW5kZXg7CiAKICAgICBvZmZfdCBtRmlyc3REYXRhT2Zmc2V0OwpAQCAtMTAwLDEzICsxMDUsMTkgQEAKICAgICB2b3JiaXNfY29tbWVudCBtVmM7CiAKICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKIAogICAgIHNzaXplX3QgcmVhZFBhZ2Uob2ZmX3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKICAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmX3Qgc3RhcnRPZmZzZXQsIG9mZl90ICpwYWdlT2Zmc2V0KTsKIAotICAgIHZvaWQgdmVyaWZ5SGVhZGVyKAorICAgIHN0YXR1c190IHZlcmlmeUhlYWRlcigKICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKKyAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgdm9pZCBleHRyYWN0QWxidW1BcnQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdWludDY0X3QgZmluZFByZXZHcmFudWxlUG9zaXRpb24ob2ZmX3QgcGFnZU9mZnNldCk7CisKICAgICBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBNeVZvcmJpc0V4dHJhY3RvciAmKTsKICAgICBNeVZvcmJpc0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15Vm9yYmlzRXh0cmFjdG9yICYpOwogfTsKQEAgLTE0OSw5ICsxNjAsMTAgQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgb2ZmX3QgcG9zID0gc2Vla1RpbWVVcyAqIG1FeHRyYWN0b3ItPm1JbXBsLT5hcHByb3hCaXRyYXRlKCkgLyA4MDAwMDAwbGw7Ci0gICAgICAgIExPR0koInNlZWtpbmcgdG8gb2Zmc2V0ICVsZCIsIHBvcyk7CisgICAgICAgIExPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsZCIsIHBvcyk7CiAKICAgICAgICAgaWYgKG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9PZmZzZXQocG9zKSAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC0xNzQsNiArMTg2LDggQEAKICAgICB9CiAjZW5kaWYKIAorICAgIHBhY2tldC0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisKICAgICAqb3V0ID0gcGFja2V0OwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTg0LDEzICsxOTgsMjEgQEAKIE15Vm9yYmlzRXh0cmFjdG9yOjpNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbUN1cnJlbnRQYWdlU2l6ZSgwKSwKKyAgICAgIG1GaXJzdFBhY2tldEluUGFnZSh0cnVlKSwKKyAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMoMCksCiAgICAgICBtTmV4dExhY2VJbmRleCgwKSwKICAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpIHsKICAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKKworICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7CisgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKIH0KIAogTXlWb3JiaXNFeHRyYWN0b3I6On5NeVZvcmJpc0V4dHJhY3RvcigpIHsKKyAgICB2b3JiaXNfY29tbWVudF9jbGVhcigmbVZjKTsKKyAgICB2b3JiaXNfaW5mb19jbGVhcigmbVZpKTsKIH0KIAogc3A8TWV0YURhdGE+IE15Vm9yYmlzRXh0cmFjdG9yOjpnZXRGb3JtYXQoKSBjb25zdCB7CkBAIC0yMjQsNiArMjQ2LDUyIEBACiAgICAgfQogfQogCisvLyBHaXZlbiB0aGUgb2Zmc2V0IG9mIHRoZSAiY3VycmVudCIgcGFnZSwgZmluZCB0aGUgcGFnZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcKKy8vIGl0IChpZiBhbnkpIGFuZCByZXR1cm4gaXRzIGdyYW51bGUgcG9zaXRpb24uCisvLyBUbyBkbyB0aGlzIHdlIGJhY2sgdXAgZnJvbSB0aGUgImN1cnJlbnQiIHBhZ2UncyBvZmZzZXQgdW50aWwgd2UgZmluZCBhbnkKKy8vIHBhZ2UgcHJlY2VkaW5nIGl0IGFuZCB0aGVuIHNjYW4gZm9yd2FyZCB0byBqdXN0IGJlZm9yZSB0aGUgY3VycmVudCBwYWdlLgordWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKG9mZl90IHBhZ2VPZmZzZXQpIHsKKyAgICBvZmZfdCBwcmV2UGFnZU9mZnNldCA9IDA7CisgICAgb2ZmX3QgcHJldkd1ZXNzID0gcGFnZU9mZnNldDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChwcmV2R3Vlc3MgPj0gNTAwMCkgeworICAgICAgICAgICAgcHJldkd1ZXNzIC09IDUwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2R3Vlc3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgTE9HVigiYmFja2luZyB1cCAlbGQgYnl0ZXMiLCBwYWdlT2Zmc2V0IC0gcHJldkd1ZXNzKTsKKworICAgICAgICBDSEVDS19FUShmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgIGlmIChwcmV2UGFnZU9mZnNldCA8IHBhZ2VPZmZzZXQgfHwgcHJldkd1ZXNzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXZQYWdlT2Zmc2V0ID09IHBhZ2VPZmZzZXQpIHsKKyAgICAgICAgLy8gV2UgZGlkIG5vdCBmaW5kIGEgcGFnZSBwcmVjZWRpbmcgdGhpcyBvbmUuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIExPR1YoInByZXZQYWdlT2Zmc2V0IGF0ICVsZCwgcGFnZU9mZnNldCBhdCAlbGQiLCBwcmV2UGFnZU9mZnNldCwgcGFnZU9mZnNldCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFBhZ2UgcHJldlBhZ2U7CisgICAgICAgIHNzaXplX3QgbiA9IHJlYWRQYWdlKHByZXZQYWdlT2Zmc2V0LCAmcHJldlBhZ2UpOworCisgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHJldlBhZ2VPZmZzZXQgKz0gbjsKKworICAgICAgICBpZiAocHJldlBhZ2VPZmZzZXQgPT0gcGFnZU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZQYWdlLm1HcmFudWxlUG9zaXRpb247CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmX3Qgb2Zmc2V0KSB7CiAgICAgaWYgKG1GaXJzdERhdGFPZmZzZXQgPj0gMCAmJiBvZmZzZXQgPCBtRmlyc3REYXRhT2Zmc2V0KSB7CiAgICAgICAgIC8vIE9uY2Ugd2Uga25vdyB3aGVyZSB0aGUgYWN0dWFsIGF1ZGlvIGRhdGEgc3RhcnRzIChwYXN0IHRoZSBoZWFkZXJzKQpAQCAtMjM4LDkgKzMwNiwxNiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIC8vIFdlIGZvdW5kIHRoZSBwYWdlIHdlIHdhbnRlZCB0byBzZWVrIHRvLCBidXQgd2UnbGwgYWxzbyBuZWVkCisgICAgLy8gdGhlIHBhZ2UgcHJlY2VkaW5nIGl0IHRvIGRldGVybWluZSBob3cgbWFueSB2YWxpZCBzYW1wbGVzIGFyZSBvbgorICAgIC8vIHRoaXMgcGFnZS4KKyAgICBtUHJldkdyYW51bGVQb3NpdGlvbiA9IGZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKHBhZ2VPZmZzZXQpOworCiAgICAgbU9mZnNldCA9IHBhZ2VPZmZzZXQ7CiAKICAgICBtQ3VycmVudFBhZ2VTaXplID0gMDsKKyAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSB0cnVlOworICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPSAwOwogICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwogICAgIG1OZXh0TGFjZUluZGV4ID0gMDsKIApAQCAtMjUzLDcgKzMyOCw3IEBACiAgICAgdWludDhfdCBoZWFkZXJbMjddOwogICAgIGlmIChtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDhseCIsIHNpemVvZihoZWFkZXIpLCBvZmZzZXQpOworICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDhseCIsIHNpemVvZihoZWFkZXIpLCBvZmZzZXQpOwogCiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CkBAIC0yOTcsNiArMzcyLDcgQEAKICAgICAgICAgdG90YWxTaXplICs9IHBhZ2UtPm1MYWNlW2ldOwogICAgIH0KIAorI2lmIDAKICAgICBTdHJpbmc4IHRtcDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UtPm1OdW1TZWdtZW50czsgKytpKSB7CiAgICAgICAgIGNoYXIgeFszMl07CkBAIC0zMDYsNiArMzgyLDcgQEAKICAgICB9CiAKICAgICBMT0dWKCIlYyAlcyIsIHBhZ2UtPm1GbGFncyAmIDEgPyAnKycgOiAnICcsIHRtcC5zdHJpbmcoKSk7CisjZW5kaWYKIAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KQEAgLTM1MSw3ICs0MjgsMTMgQEAKICAgICAgICAgICAgICAgICAvLyBYWFggTm90IG9ubHkgaXMgdGhpcyBub3QgdGVjaG5pY2FsbHkgdGhlIGNvcnJlY3QgdGltZSBmb3IKICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhY2tldCwgd2UgYWxzbyBzdGFtcCBldmVyeSBwYWNrZXQgaW4gdGhpcyBwYWdlCiAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSB0aW1lLiBUaGlzIG5lZWRzIGZpeGluZyBsYXRlci4KLSAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworCisgICAgICAgICAgICAgICAgaWYgKG1WaS5yYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJhdGUgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0IGlmIHdlJ3JlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhY2tldHMuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9ydHVuYXRlbHksIHRoZSB0aW1lc3RhbXAgZG9lc24ndCBtYXR0ZXIgZm9yIHRob3NlLgorICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKQEAgLTM2Miw3ICs0NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgMHglMDhseCIsIHBhY2tldFNpemUsIGRhdGFPZmZzZXQpOworICAgICAgICAgICAgICAgIExPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IDB4JTA4bHgiLCBwYWNrZXRTaXplLCBkYXRhT2Zmc2V0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTM3Nyw2ICs0NjAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBhY2tldEluUGFnZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTM5NiwxMSArNDg1LDE3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgTE9HRSgicmVhZFBhZ2UgcmV0dXJuZWQgJWxkIiwgbik7CisgICAgICAgICAgICBMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlbGQiLCBuKTsKIAogICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKKyAgICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcyA9CisgICAgICAgICAgICBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIG1QcmV2R3JhbnVsZVBvc2l0aW9uOworICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSB0cnVlOworCisgICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb247CisKICAgICAgICAgbUN1cnJlbnRQYWdlU2l6ZSA9IG47CiAgICAgICAgIG1OZXh0TGFjZUluZGV4ID0gMDsKIApAQCAtNDEzLDYgKzUwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOworCiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTQyMSw0NyArNTIwLDYwIEBACiAgICAgfQogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjppbml0KCkgewotICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7Ci0KLSAgICB2b3JiaXNfY29tbWVudCBtVmM7Ci0KK3N0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjppbml0KCkgewogICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOwogICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKIAogICAgIE1lZGlhQnVmZmVyICpwYWNrZXQ7Ci0gICAgQ0hFQ0tfRVEocmVhZE5leHRQYWNrZXQoJnBhY2tldCksIE9LKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgdmVyaWZ5SGVhZGVyKHBhY2tldCwgMSk7CisgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMSk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCi0gICAgQ0hFQ0tfRVEocmVhZE5leHRQYWNrZXQoJnBhY2tldCksIE9LKTsKKyAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KICAgICBMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKLSAgICB2ZXJpZnlIZWFkZXIocGFja2V0LCAzKTsKKyAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAzKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKLSAgICBDSEVDS19FUShyZWFkTmV4dFBhY2tldCgmcGFja2V0KSwgT0spOworICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogICAgIExPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOworICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAogICAgIG1GaXJzdERhdGFPZmZzZXQgPSBtT2Zmc2V0ICsgbUN1cnJlbnRQYWdlU2l6ZTsKKworICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAorc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCi0gICAgQ0hFQ0soc2l6ZSA+PSA3KTsKLQotICAgIENIRUNLX0VRKGRhdGFbMF0sIHR5cGUpOwotICAgIENIRUNLKCFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSk7CisgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIG9nZ19idWZmZXIgYnVmOwogICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNTA4LDE4ICs2MjAsMjYgQEAKIAogICAgICAgICBjYXNlIDM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKTsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSA1OgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLCBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpOworICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbU1ldGEtPnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBkYXRhLCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiB1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIHsKQEAgLTUzMCw2ICs2NTAsMTk2IEBACiAgICAgcmV0dXJuIChtVmkuYml0cmF0ZV9sb3dlciArIG1WaS5iaXRyYXRlX3VwcGVyKSAvIDI7CiB9CiAKK3ZvaWQgTXlWb3JiaXNFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgeworICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRmlsZU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKKworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIHVpbnQzMl90IG1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgIkFSVElTVCIsIGtLZXlBcnRpc3QgfSwKKyAgICAgICAgeyAiQUxCVU0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiQ09NUE9TRVIiLCBrS2V5Q29tcG9zZXIgfSwKKyAgICAgICAgeyAiR0VOUkUiLCBrS2V5R2VucmUgfSwKKyAgICAgICAgeyAiQVVUSE9SIiwga0tleUF1dGhvciB9LAorICAgICAgICB7ICJUUkFDS05VTUJFUiIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCisgICAgICAgIHsgIkRJU0NOVU1CRVIiLCBrS2V5RGlzY051bWJlciB9LAorICAgICAgICB7ICJEQVRFIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCisgICAgfTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKKyAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCisgICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBbGJ1bUFydCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXSAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBdXRvTG9vcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0Q1N0cmluZyhrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZiAwCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgeworICAgICAgICBMT0dJKCJjb21tZW50ICMlZDogJyVzJyIsIGkgKyAxLCBtVmMudXNlcl9jb21tZW50c1tpXSk7CisgICAgfQorI2VuZGlmCit9CisKKy8vIFRoZSByZXR1cm5lZCBidWZmZXIgc2hvdWxkIGJlIGZyZWUoKWQuCitzdGF0aWMgdWludDhfdCAqRGVjb2RlQmFzZTY0KGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplLCBzaXplX3QgKm91dFNpemUpIHsKKyAgICAqb3V0U2l6ZSA9IDA7CisKKyAgICBpZiAoKHNpemUgJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCBuID0gc2l6ZTsKKyAgICBzaXplX3QgcGFkZGluZyA9IDA7CisgICAgaWYgKG4gPj0gMSAmJiBzW24gLSAxXSA9PSAnPScpIHsKKyAgICAgICAgcGFkZGluZyA9IDE7CisKKyAgICAgICAgaWYgKG4gPj0gMiAmJiBzW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG91dExlbiA9IDMgKiBzaXplIC8gNCAtIHBhZGRpbmc7CisKKyAgICAqb3V0U2l6ZSA9IG91dExlbjsKKworICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhvdXRMZW4pOworCisgICAgdWludDhfdCAqb3V0ID0gKHVpbnQ4X3QgKilidWZmZXI7CisgICAgc2l6ZV90IGogPSAwOworICAgIHVpbnQzMl90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyIGMgPSBzW2ldOworICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMjYgKyBjIC0gJ2EnOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDUyICsgYyAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MjsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MzsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGFjY3VtID0gKGFjY3VtIDw8IDYpIHwgdmFsdWU7CisKKyAgICAgICAgaWYgKCgoaSArIDEpICUgNCkgPT0gMCkgeworICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gMTYpOworCisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gYWNjdW0gJiAweGZmOyB9CisKKyAgICAgICAgICAgIGFjY3VtID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAodWludDhfdCAqKWJ1ZmZlcjsKK30KKwordm9pZCBNeVZvcmJpc0V4dHJhY3Rvcjo6ZXh0cmFjdEFsYnVtQXJ0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7CisKKyAgICBzaXplX3QgZmxhY1NpemU7CisgICAgdWludDhfdCAqZmxhYyA9IERlY29kZUJhc2U2NCgoY29uc3QgY2hhciAqKWRhdGEsIHNpemUsICZmbGFjU2l6ZSk7CisKKyAgICBpZiAoZmxhYyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlZCIsIGZsYWNTaXplKTsKKworICAgIHVpbnQzMl90IHBpY1R5cGU7CisgICAgdWludDMyX3QgdHlwZUxlbjsKKyAgICB1aW50MzJfdCBkZXNjTGVuOworICAgIHVpbnQzMl90IGRhdGFMZW47CisgICAgY2hhciB0eXBlWzEyOF07CisKKyAgICBpZiAoZmxhY1NpemUgPCA4KSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOworCisgICAgaWYgKHBpY1R5cGUgIT0gMykgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgorICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7CisgICAgaWYgKHR5cGVMZW4gKyAxID4gc2l6ZW9mKHR5cGUpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBpZiAoZmxhY1NpemUgPCA4ICsgdHlwZUxlbikgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKKyAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKKworICAgIExPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKKworICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiArIHR5cGVMZW4gKyBkZXNjTGVuKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOworCisgICAgaWYgKGZsYWNTaXplIDwgMzIgKyB0eXBlTGVuICsgZGVzY0xlbiArIGRhdGFMZW4pIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIExPR1YoImdvdCBpbWFnZSBkYXRhLCAlZCB0cmFpbGluZyBieXRlcyIsCisgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKKworICAgIG1GaWxlTWV0YS0+c2V0RGF0YSgKKyAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgMCwgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7CisKKyAgICBtRmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7CisKK2V4aXQ6CisgICAgZnJlZShmbGFjKTsKKyAgICBmbGFjID0gTlVMTDsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKQEAgLTUzNywxMCArODQ3LDExIEBACiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUltcGwoTlVMTCkgewogICAgIG1JbXBsID0gbmV3IE15Vm9yYmlzRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKLSAgICBDSEVDS19FUShtSW1wbC0+c2Vla1RvT2Zmc2V0KDApLCBPSyk7Ci0gICAgbUltcGwtPmluaXQoKTsKKyAgICBtSW5pdENoZWNrID0gbUltcGwtPnNlZWtUb09mZnNldCgwKTsKIAotICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPmluaXQoKTsKKyAgICB9CiB9CiAKIE9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKQEAgLTU3MCwxOSArODgxLDEyIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwotCi0gICAgcmV0dXJuIG1ldGE7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEoKTsKIH0KIAogYm9vbCBTbmlmZk9nZygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKICAgICBjaGFyIHRtcFs0XTsKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9QcmVmZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ByZWZldGNoZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTBhOWY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ByZWZldGNoZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlByZWZldGNoZXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1ByZWZldGNoZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgUHJlZmV0Y2hlZFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgUHJlZmV0Y2hlZFNvdXJjZSgKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QcmVmZXRjaGVkU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBQcmVmZXRjaGVyOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzaXplX3QgbUluZGV4OwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgYm9vbCBtUmVhY2hlZEVPUzsKLSAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICBpbnQ2NF90IG1DYWNoZUR1cmF0aW9uVXM7Ci0gICAgc2l6ZV90IG1DYWNoZVNpemVCeXRlczsKLSAgICBib29sIG1QcmVmZXRjaGVyU3RvcHBlZDsKLSAgICBib29sIG1DdXJyZW50bHlQcmVmZXRjaGluZzsKLQotICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUNhY2hlZEJ1ZmZlcnM7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHNvdXJjZSBpcyBjdXJyZW50bHkgY2FjaGluZy4KLSAgICBib29sIGdldENhY2hlRHVyYXRpb25VcyhpbnQ2NF90ICpkdXJhdGlvblVzLCBzaXplX3QgKnRvdGFsU2l6ZSA9IE5VTEwpOwotCi0gICAgdm9pZCB1cGRhdGVDYWNoZUR1cmF0aW9uX2woKTsKLSAgICB2b2lkIGNsZWFyQ2FjaGVfbCgpOwotCi0gICAgdm9pZCBjYWNoZU1vcmUoKTsKLSAgICB2b2lkIG9uUHJlZmV0Y2hlclN0b3BwZWQoKTsKLQotICAgIFByZWZldGNoZWRTb3VyY2UoY29uc3QgUHJlZmV0Y2hlZFNvdXJjZSAmKTsKLSAgICBQcmVmZXRjaGVkU291cmNlICZvcGVyYXRvcj0oY29uc3QgUHJlZmV0Y2hlZFNvdXJjZSAmKTsKLX07Ci0KLVByZWZldGNoZXI6OlByZWZldGNoZXIoKQotICAgIDogbURvbmUoZmFsc2UpLAotICAgICAgbVRocmVhZEV4aXRlZChmYWxzZSkgewotICAgIHN0YXJ0VGhyZWFkKCk7Ci19Ci0KLVByZWZldGNoZXI6On5QcmVmZXRjaGVyKCkgewotICAgIHN0b3BUaHJlYWQoKTsKLX0KLQotc3A8TWVkaWFTb3VyY2U+IFByZWZldGNoZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBwc291cmNlID0KLSAgICAgICAgbmV3IFByZWZldGNoZWRTb3VyY2UobVNvdXJjZXMuc2l6ZSgpLCBzb3VyY2UpOwotCi0gICAgbVNvdXJjZXMuYWRkKHBzb3VyY2UpOwotCi0gICAgcmV0dXJuIHBzb3VyY2U7Ci19Ci0KLXZvaWQgUHJlZmV0Y2hlcjo6c3RhcnRUaHJlYWQoKSB7Ci0gICAgbVRocmVhZEV4aXRlZCA9IGZhbHNlOwotICAgIG1Eb25lID0gZmFsc2U7Ci0KLSAgICBpbnQgcmVzID0gYW5kcm9pZENyZWF0ZVRocmVhZEV0YygKLSAgICAgICAgICAgIFRocmVhZFdyYXBwZXIsIHRoaXMsICJQcmVmZXRjaGVyIiwKLSAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfREVGQVVMVCwgMCwgJm1UaHJlYWQpOwotCi0gICAgQ0hFQ0tfRVEocmVzLCAxKTsKLX0KLQotdm9pZCBQcmVmZXRjaGVyOjpzdG9wVGhyZWFkKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB3aGlsZSAoIW1UaHJlYWRFeGl0ZWQpIHsKLSAgICAgICAgbURvbmUgPSB0cnVlOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1pbnQgUHJlZmV0Y2hlcjo6VGhyZWFkV3JhcHBlcih2b2lkICptZSkgewotICAgIHN0YXRpY19jYXN0PFByZWZldGNoZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gQ2FjaGUgYXQgbW9zdCAxIG1pbiBmb3IgZWFjaCBzb3VyY2UuCi1zdGF0aWMgaW50NjRfdCBrTWF4Q2FjaGVEdXJhdGlvblVzID0gNjAgKiAxMDAwMDAwbGw7Ci0KLS8vIEF0IHRoZSBzYW1lIHRpbWUgY2FjaGUgYXQgbW9zdCA1TUIgcGVyIHNvdXJjZS4KLXN0YXRpYyBzaXplX3Qga01heENhY2hlU2l6ZUJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0OwotCi0vLyBJZiB0aGUgYW1vdW50IG9mIGNhY2hlZCBkYXRhIGRyb3BzIGJlbG93IHRoaXMsCi0vLyBmaWxsIHRoZSBjYWNoZSB1cCB0byB0aGUgbWF4IGR1cmF0aW9uIGFnYWluLgotc3RhdGljIGludDY0X3Qga0xvd1dhdGVyRHVyYXRpb25VcyA9IDUwMDAwMDBsbDsKLQotdm9pZCBQcmVmZXRjaGVyOjp0aHJlYWRGdW5jKCkgewotICAgIGJvb2wgZmlsbGluZ0NhY2hlID0gZmFsc2U7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNwPFByZWZldGNoZWRTb3VyY2U+IG1pblNvdXJjZTsKLSAgICAgICAgaW50NjRfdCBtaW5DYWNoZUR1cmF0aW9uVXMgPSAtMTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgaWYgKG1Eb25lKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdFJlbGF0aXZlKAotICAgICAgICAgICAgICAgICAgICBtTG9jaywgZmlsbGluZ0NhY2hlID8gMWxsIDogMTAwMDAwMDAwMGxsKTsKLQotCi0gICAgICAgICAgICBzc2l6ZV90IG1pbkluZGV4ID0gLTE7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc3A8UHJlZmV0Y2hlZFNvdXJjZT4gc291cmNlID0gbVNvdXJjZXNbaV0ucHJvbW90ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDY0X3QgY2FjaGVEdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIHNpemVfdCBjYWNoZVNpemVCeXRlczsKLSAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS0+Z2V0Q2FjaGVEdXJhdGlvblVzKCZjYWNoZUR1cmF0aW9uVXMsICZjYWNoZVNpemVCeXRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNhY2hlU2l6ZUJ5dGVzID4ga01heENhY2hlU2l6ZUJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0koIm1heCBjYWNoZSBzaXplIHJlYWNoZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSA+IDEgJiYgY2FjaGVEdXJhdGlvblVzID49IGtNYXhDYWNoZUR1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HSSgibWF4IGR1cmF0aW9uIHJlYWNoZWQsIHNpemUgPSAlZCBieXRlcyIsIGNhY2hlU2l6ZUJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1pbkluZGV4IDwgMCB8fCBjYWNoZUR1cmF0aW9uVXMgPCBtaW5DYWNoZUR1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluQ2FjaGVEdXJhdGlvblVzID0gY2FjaGVEdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIG1pblNvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtaW5JbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsbGluZ0NhY2hlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoIlslcF0gZG9uZSBmaWxsaW5nIHRoZSBjYWNoZSwgYWJvdmUgaGlnaCB3YXRlciBtYXJrLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxpbmdDYWNoZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZmlsbGluZ0NhY2hlICYmIG1pbkNhY2hlRHVyYXRpb25VcyA8IGtMb3dXYXRlckR1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIExPR0koIlslcF0gY2FjaGUgYmVsb3cgbG93IHdhdGVyIG1hcmssIGZpbGxpbmcgY2FjaGUuIiwgdGhpcyk7Ci0gICAgICAgICAgICBmaWxsaW5nQ2FjaGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGxpbmdDYWNoZSkgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBob2xkIHRoZSBsb2NrIHdoaWxlIGNhbGxpbmcgaW50byB0aGUgc291cmNlLgotICAgICAgICAgICAgLy8gVGhlIGxvY2sgZ3VhcmRzIHRoZSBsaXN0IG9mIHNvdXJjZXMsIG5vdCB0aGUgaW5kaXZpZHVhbCBzb3VyY2VzCi0gICAgICAgICAgICAvLyB0aGVtc2VsdmVzLgotICAgICAgICAgICAgbWluU291cmNlLT5jYWNoZU1vcmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBzb3VyY2UgPSBtU291cmNlc1tpXS5wcm9tb3RlKCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvdXJjZS0+b25QcmVmZXRjaGVyU3RvcHBlZCgpOwotICAgIH0KLQotICAgIG1UaHJlYWRFeGl0ZWQgPSB0cnVlOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLWludDY0X3QgUHJlZmV0Y2hlcjo6Z2V0Q2FjaGVkRHVyYXRpb25Vcyhib29sICpub01vcmVEYXRhKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGludDY0X3QgbWluQ2FjaGVEdXJhdGlvblVzID0gLTE7Ci0gICAgc3NpemVfdCBtaW5JbmRleCA9IC0xOwotICAgIGJvb2wgYW55U291cmNlQWN0aXZlID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBpbnQ2NF90IGNhY2hlRHVyYXRpb25VczsKLSAgICAgICAgc3A8UHJlZmV0Y2hlZFNvdXJjZT4gc291cmNlID0gbVNvdXJjZXNbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS0+Z2V0Q2FjaGVEdXJhdGlvblVzKCZjYWNoZUR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBhbnlTb3VyY2VBY3RpdmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1pbkluZGV4IDwgMCB8fCBjYWNoZUR1cmF0aW9uVXMgPCBtaW5DYWNoZUR1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgIG1pbkNhY2hlRHVyYXRpb25VcyA9IGNhY2hlRHVyYXRpb25VczsKLSAgICAgICAgICAgIG1pbkluZGV4ID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChub01vcmVEYXRhKSB7Ci0gICAgICAgICpub01vcmVEYXRhID0gIWFueVNvdXJjZUFjdGl2ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWluQ2FjaGVEdXJhdGlvblVzIDwgMCA/IDAgOiBtaW5DYWNoZUR1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IFByZWZldGNoZXI6OnByZXBhcmUoCi0gICAgICAgIGJvb2wgKCpjb250aW51ZUZ1bmMpKHZvaWQgKmNvb2tpZSksIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIEZpbGwgdGhlIGNhY2hlLgotCi0gICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICBib29sIG5vTW9yZURhdGE7Ci0gICAgZG8gewotICAgICAgICB1c2xlZXAoMTAwMDAwKTsKLQotICAgICAgICBpZiAoY29udGludWVGdW5jICYmICEoKmNvbnRpbnVlRnVuYykoY29va2llKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5UUjsKLSAgICAgICAgfQotCi0gICAgICAgIGR1cmF0aW9uID0gZ2V0Q2FjaGVkRHVyYXRpb25Vcygmbm9Nb3JlRGF0YSk7Ci0gICAgfSB3aGlsZSAoIW5vTW9yZURhdGEgJiYgZHVyYXRpb24gPCAyMDAwMDAwbGwpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1QcmVmZXRjaGVkU291cmNlOjpQcmVmZXRjaGVkU291cmNlKAotICAgICAgICBzaXplX3QgaW5kZXgsCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUluZGV4KGluZGV4KSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSwKLSAgICAgIG1TZWVrVGltZVVzKDApLAotICAgICAgbUNhY2hlRHVyYXRpb25VcygwKSwKLSAgICAgIG1DYWNoZVNpemVCeXRlcygwKSwKLSAgICAgIG1QcmVmZXRjaGVyU3RvcHBlZChmYWxzZSksCi0gICAgICBtQ3VycmVudGx5UHJlZmV0Y2hpbmcoZmFsc2UpIHsKLX0KLQotUHJlZmV0Y2hlZFNvdXJjZTo6flByZWZldGNoZWRTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZWZldGNoZWRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmVmZXRjaGVkU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB3aGlsZSAobUN1cnJlbnRseVByZWZldGNoaW5nKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgY2xlYXJDYWNoZV9sKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUHJlZmV0Y2hlZFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLQotICAgICAgICBjbGVhckNhY2hlX2woKTsKLQotICAgICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgICAgICBtU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgfQotCi0gICAgd2hpbGUgKCFtUHJlZmV0Y2hlclN0b3BwZWQgJiYgIW1SZWFjaGVkRU9TICYmIG1DYWNoZWRCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAobUNhY2hlZEJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gbVJlYWNoZWRFT1MgPyBtRmluYWxTdGF0dXMgOiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgICpvdXQgPSAqbUNhY2hlZEJ1ZmZlcnMuYmVnaW4oKTsKLSAgICBtQ2FjaGVkQnVmZmVycy5lcmFzZShtQ2FjaGVkQnVmZmVycy5iZWdpbigpKTsKLSAgICB1cGRhdGVDYWNoZUR1cmF0aW9uX2woKTsKLSAgICBtQ2FjaGVTaXplQnl0ZXMgLT0gKCpvdXQpLT5zaXplKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBQcmVmZXRjaGVkU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotfQotCi1ib29sIFByZWZldGNoZWRTb3VyY2U6OmdldENhY2hlRHVyYXRpb25VcygKLSAgICAgICAgaW50NjRfdCAqZHVyYXRpb25Vcywgc2l6ZV90ICp0b3RhbFNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKmR1cmF0aW9uVXMgPSBtQ2FjaGVEdXJhdGlvblVzOwotICAgIGlmICh0b3RhbFNpemUgIT0gTlVMTCkgewotICAgICAgICAqdG90YWxTaXplID0gbUNhY2hlU2l6ZUJ5dGVzOwotICAgIH0KLQotICAgIGlmICghbVN0YXJ0ZWQgfHwgbVJlYWNoZWRFT1MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFByZWZldGNoZWRTb3VyY2U6OmNhY2hlTW9yZSgpIHsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQ3VycmVudGx5UHJlZmV0Y2hpbmcgPSB0cnVlOwotCi0gICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOwotICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIH0KLQotICAgIC8vIEVuc3VyZSBvdXIgb2JqZWN0IGRvZXMgbm90IGdvIGF3YXkgd2hpbGUgd2UncmUgbm90IGhvbGRpbmcKLSAgICAvLyB0aGUgbG9jay4KLSAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBtZSA9IHRoaXM7Ci0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpOwotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbUN1cnJlbnRseVByZWZldGNoaW5nID0gZmFsc2U7Ci0gICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKLSAgICAgICAgbUZpbmFsU3RhdHVzID0gZXJyOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqY29weSA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICBtZW1jcHkoY29weS0+ZGF0YSgpLAotICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gZnJvbSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgc3A8TWV0YURhdGE+IHRvID0gY29weS0+bWV0YV9kYXRhKCk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpZiAoZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgewotICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgYnVmZmVyID0gTlVMTDsKLQotICAgIG1DYWNoZWRCdWZmZXJzLnB1c2hfYmFjayhjb3B5KTsKLSAgICB1cGRhdGVDYWNoZUR1cmF0aW9uX2woKTsKLSAgICBtQ2FjaGVTaXplQnl0ZXMgKz0gY29weS0+c2l6ZSgpOwotCi0gICAgbUN1cnJlbnRseVByZWZldGNoaW5nID0gZmFsc2U7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBQcmVmZXRjaGVkU291cmNlOjp1cGRhdGVDYWNoZUR1cmF0aW9uX2woKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJzLnNpemUoKSA8IDIpIHsKLSAgICAgICAgbUNhY2hlRHVyYXRpb25VcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcywgbGFzdFRpbWVVczsKLSAgICAgICAgQ0hFQ0soKCptQ2FjaGVkQnVmZmVycy5iZWdpbigpKS0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICZmaXJzdFRpbWVVcykpOwotICAgICAgICBDSEVDSygoKi0tbUNhY2hlZEJ1ZmZlcnMuZW5kKCkpLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJmxhc3RUaW1lVXMpKTsKLQotICAgICAgICBtQ2FjaGVEdXJhdGlvblVzID0gbGFzdFRpbWVVcyAtIGZpcnN0VGltZVVzOwotICAgIH0KLX0KLQotdm9pZCBQcmVmZXRjaGVkU291cmNlOjpjbGVhckNhY2hlX2woKSB7Ci0gICAgTGlzdDxNZWRpYUJ1ZmZlciAqPjo6aXRlcmF0b3IgaXQgPSBtQ2FjaGVkQnVmZmVycy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBtQ2FjaGVkQnVmZmVycy5lbmQoKSkgewotICAgICAgICAoKml0KS0+cmVsZWFzZSgpOwotCi0gICAgICAgIGl0ID0gbUNhY2hlZEJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgIH0KLQotICAgIHVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpOwotICAgIG1DYWNoZVNpemVCeXRlcyA9IDA7Ci19Ci0KLXZvaWQgUHJlZmV0Y2hlZFNvdXJjZTo6b25QcmVmZXRjaGVyU3RvcHBlZCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1QcmVmZXRjaGVyU3RvcHBlZCA9IHRydWU7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAppbmRleCA4OWE1MjJlLi4yN2ZhZjRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCkBAIC01NSw2ICs1NSw4IEBACiAgICAgICBtVGltZVRvU2FtcGxlKE5VTEwpLAogICAgICAgbVN5bmNTYW1wbGVPZmZzZXQoLTEpLAogICAgICAgbU51bVN5bmNTYW1wbGVzKDApLAorICAgICAgbVN5bmNTYW1wbGVzKE5VTEwpLAorICAgICAgbUxhc3RTeW5jU2FtcGxlSW5kZXgoMCksCiAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMoTlVMTCkgewogICAgIG1TYW1wbGVJdGVyYXRvciA9IG5ldyBTYW1wbGVJdGVyYXRvcih0aGlzKTsKIH0KQEAgLTYzLDYgKzY1LDkgQEAKICAgICBkZWxldGVbXSBtU2FtcGxlVG9DaHVua0VudHJpZXM7CiAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzID0gTlVMTDsKIAorICAgIGRlbGV0ZVtdIG1TeW5jU2FtcGxlczsKKyAgICBtU3luY1NhbXBsZXMgPSBOVUxMOworCiAgICAgZGVsZXRlW10gbVRpbWVUb1NhbXBsZTsKICAgICBtVGltZVRvU2FtcGxlID0gTlVMTDsKIApAQCAtMjc4LDYgKzI4MywxOCBAQAogICAgIGlmIChtTnVtU3luY1NhbXBsZXMgPCAyKSB7CiAgICAgICAgIExPR1coIlRhYmxlIG9mIHN5bmMgc2FtcGxlcyBpcyBlbXB0eSBvciBoYXMgb25seSBhIHNpbmdsZSBlbnRyeSEiKTsKICAgICB9CisKKyAgICBtU3luY1NhbXBsZXMgPSBuZXcgdWludDMyX3RbbU51bVN5bmNTYW1wbGVzXTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1OdW1TeW5jU2FtcGxlcyAqIHNpemVvZih1aW50MzJfdCk7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQobVN5bmNTYW1wbGVPZmZzZXQgKyA4LCBtU3luY1NhbXBsZXMsIHNpemUpCisgICAgICAgICAgICAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1TeW5jU2FtcGxlczsgKytpKSB7CisgICAgICAgIG1TeW5jU2FtcGxlc1tpXSA9IG50b2hsKG1TeW5jU2FtcGxlc1tpXSkgLSAxOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzE0LDggKzMzMSwxMCBAQAogICAgIHJldHVybiB0aW1lMSA+IHRpbWUyID8gdGltZTEgLSB0aW1lMiA6IHRpbWUyIC0gdGltZTE7CiB9CiAKLXN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kQ2xvc2VzdFNhbXBsZSgKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU2FtcGxlQXRUaW1lKAogICAgICAgICB1aW50MzJfdCByZXFfdGltZSwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAqc2FtcGxlX2luZGV4ID0gMDsKKwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICB1aW50MzJfdCBjdXJfc2FtcGxlID0gMDsKQEAgLTMzMCwxNiArMzQ5LDM3IEBACiAgICAgICAgICAgICB1aW50MzJfdCB0aW1lMSA9IHRpbWUgKyBqICogZGVsdGE7CiAgICAgICAgICAgICB1aW50MzJfdCB0aW1lMiA9IHRpbWUxICsgZGVsdGE7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICBpZiAoaSsxID09IG1UaW1lVG9TYW1wbGVDb3VudAogICAgICAgICAgICAgICAgICAgICB8fCAoYWJzX2RpZmZlcmVuY2UocmVxX3RpbWUsIHRpbWUxKQogICAgICAgICAgICAgICAgICAgICAgICAgPCBhYnNfZGlmZmVyZW5jZShyZXFfdGltZSwgdGltZTIpKSkgewogICAgICAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBjdXJfc2FtcGxlICsgajsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gdGltZTE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBjdXJfc2FtcGxlICsgaiArIDE7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IHRpbWUyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBrU3luY1NhbXBsZV9GbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRDbG9zZXN0U3luY1NhbXBsZV9sKCpzYW1wbGVfaW5kZXgsIHNhbXBsZV9pbmRleCk7CisgICAgICAgICAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gcmVxX3RpbWUgJiYgKnNhbXBsZV9pbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tKnNhbXBsZV9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA8IHJlcV90aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKnNhbXBsZV9pbmRleCArIDEgPCBtTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrKnNhbXBsZV9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMzUyLDggKzM5MiwxMCBAQAogICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiB9CiAKLXN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kQ2xvc2VzdFN5bmNTYW1wbGVfbCgKLSAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4KSB7CitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKwogICAgICpzYW1wbGVfaW5kZXggPSAwOwogCiAgICAgaWYgKG1TeW5jU2FtcGxlT2Zmc2V0IDwgMCkgewpAQCAtMzYyLDI5ICs0MDQsMTA0IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICB1aW50MzJfdCB4OwotICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVN5bmNTYW1wbGVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgdWludDMyX3QgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgIGlmIChtTnVtU3luY1NhbXBsZXMgPT0gMCkgeworICAgICAgICAqc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KIAotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNTYW1wbGVPZmZzZXQgKyA4ICsgbWlkICogNCwgJngsIDQpICE9IDQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB1aW50MzJfdCBsZWZ0ID0gMDsKKyAgICB3aGlsZSAobGVmdCA8IG1OdW1TeW5jU2FtcGxlcykgeworICAgICAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOworCisgICAgICAgIGlmICh4ID49IHN0YXJ0X3NhbXBsZV9pbmRleCkgeworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICB4ID0gbnRvaGwoeCk7CisgICAgICAgICsrbGVmdDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHggPCAoc3RhcnRfc2FtcGxlX2luZGV4ICsgMSkpIHsKLSAgICAgICAgICAgIGxlZnQgPSBtaWQgKyAxOwotICAgICAgICB9IGVsc2UgaWYgKHggPiAoc3RhcnRfc2FtcGxlX2luZGV4ICsgMSkpIHsKLSAgICAgICAgICAgIHJpZ2h0ID0gbWlkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7CisgICAgLS1sZWZ0OworICAgIHVpbnQzMl90IHg7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgbVN5bmNTYW1wbGVPZmZzZXQgKyA4ICsgbGVmdCAqIDQsICZ4LCA0KSAhPSA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICB4ID0gbnRvaGwoeCk7CisgICAgLS14OworCisgICAgaWYgKGxlZnQgKyAxIDwgbU51bVN5bmNTYW1wbGVzKSB7CisgICAgICAgIHVpbnQzMl90IHkgPSBtU3luY1NhbXBsZXNbbGVmdCArIDFdOworCisgICAgICAgIC8vIG91ciBzYW1wbGUgbGllcyBiZXR3ZWVuIHN5bmMgc2FtcGxlcyB4IGFuZCB5LgorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHN0YXJ0X3NhbXBsZV9pbmRleCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHhfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHhfdGltZSwgc2FtcGxlX3RpbWUpCisgICAgICAgICAgICAgICAgPiBhYnNfZGlmZmVyZW5jZSh5X3RpbWUsIHNhbXBsZV90aW1lKSkgeworICAgICAgICAgICAgLy8gUGljayB0aGUgc3luYyBzYW1wbGUgY2xvc2VzdCAodGltZXdpc2UpIHRvIHRoZSBzdGFydC1zYW1wbGUuCisgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgICAgICsrbGVmdDsKICAgICAgICAgfQogICAgIH0KIAotICAgICpzYW1wbGVfaW5kZXggPSB4IC0gMTsKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4ID4gc3RhcnRfc2FtcGxlX2luZGV4KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobGVmdCA+IDApOworCisgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTYW1wbGVPZmZzZXQgKyA4ICsgKGxlZnQgLSAxKSAqIDQsICZ4LCA0KSAhPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB4ID0gbnRvaGwoeCk7CisgICAgICAgICAgICAgICAgLS14OworCisgICAgICAgICAgICAgICAgQ0hFQ0soeCA8PSBzdGFydF9zYW1wbGVfaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4IDwgc3RhcnRfc2FtcGxlX2luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgKyAxID49IG1OdW1TeW5jU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHggPSBtU3luY1NhbXBsZXNbbGVmdCArIDFdOworCisgICAgICAgICAgICAgICAgQ0hFQ0soeCA+PSBzdGFydF9zYW1wbGVfaW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAqc2FtcGxlX2luZGV4ID0geDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQxMiwxMyArNTI5LDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1NjYW47ICsraSkgewotICAgICAgICB1aW50MzJfdCB4OwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNTYW1wbGVPZmZzZXQgKyA4ICsgaSAqIDQsICZ4LCA0KSAhPSA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgeCA9IG50b2hsKHgpOwotICAgICAgICAtLXg7CisgICAgICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbaV07CiAKICAgICAgICAgLy8gTm93IHggaXMgYSBzYW1wbGUgaW5kZXguCiAgICAgICAgIHNpemVfdCBzYW1wbGVTaXplOwpAQCAtNDQ4LDcgKzU1OSw4IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICBvZmZfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpkZWNvZGluZ1RpbWUpIHsKKyAgICAgICAgdWludDMyX3QgKmRlY29kaW5nVGltZSwKKyAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IGVycjsKQEAgLTQ2OCw2ICs1ODAsMjggQEAKICAgICAgICAgKmRlY29kaW5nVGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogICAgIH0KIAorICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgKmlzU3luY1NhbXBsZSA9IGZhbHNlOworICAgICAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAvLyBFdmVyeSBzYW1wbGUgaXMgYSBzeW5jIHNhbXBsZS4KKyAgICAgICAgICAgICppc1N5bmNTYW1wbGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGkgPSAobUxhc3RTeW5jU2FtcGxlSW5kZXggPCBtTnVtU3luY1NhbXBsZXMpCisgICAgICAgICAgICAgICAgICAgICYmIChtU3luY1NhbXBsZXNbbUxhc3RTeW5jU2FtcGxlSW5kZXhdIDw9IHNhbXBsZUluZGV4KQorICAgICAgICAgICAgICAgID8gbUxhc3RTeW5jU2FtcGxlSW5kZXggOiAwOworCisgICAgICAgICAgICB3aGlsZSAoaSA8IG1OdW1TeW5jU2FtcGxlcyAmJiBtU3luY1NhbXBsZXNbaV0gPCBzYW1wbGVJbmRleCkgeworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPCBtTnVtU3luY1NhbXBsZXMgJiYgbVN5bmNTYW1wbGVzW2ldID09IHNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgKmlzU3luY1NhbXBsZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0U3luY1NhbXBsZUluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Nob3V0Y2FzdFNvdXJjZS5jcHAKaW5kZXggZWMyNTQzMC4uMjNiNzY4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaG91dGNhc3RTb3VyY2UuY3BwCkBAIC05Myw3ICs5Myw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCAyMzE4ODQ0Li44NDI2ZWU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yNiwxMCArMjYsNiBAQAogLy8gU29uaXZveCBpbmNsdWRlcwogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+CiAKLS8vIE9nZyBWb3JiaXMgaW5jbHVkZXMKLSNpbmNsdWRlIDxUcmVtb2xvL2l2b3JiaXNjb2RlYy5oPgotI2luY2x1ZGUgPFRyZW1vbG8vaXZvcmJpc2ZpbGUuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6U3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIoKQpAQCAtNDIsNyArMzgsOCBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICprVmFsaWRFeHRlbnNpb25zW10gPSB7CiAgICAgICAgICIubXAzIiwgIi5tcDQiLCAiLm00YSIsICIuM2dwIiwgIi4zZ3BwIiwgIi4zZzIiLCAiLjNncHAyIiwKICAgICAgICAgIi5tcGVnIiwgIi5vZ2ciLCAiLm1pZCIsICIuc21mIiwgIi5pbXkiLCAiLndtYSIsICIuYWFjIiwKLSAgICAgICAgIi53YXYiLCAiLmFtciIsICIubWlkaSIsICIueG1mIiwgIi5ydHR0bCIsICIucnR4IiwgIi5vdGEiCisgICAgICAgICIud2F2IiwgIi5hbXIiLCAiLm1pZGkiLCAiLnhtZiIsICIucnR0dGwiLCAiLnJ0eCIsICIub3RhIiwKKyAgICAgICAgIi5ta3YiLCAiLm1rYSIsICIud2VibSIsICIudHMiCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1WYWxpZEV4dGVuc2lvbnMgPQogICAgICAgICBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9ucykgLyBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9uc1swXSk7CkBAIC0xMDIsNDggKzk5LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyBzdGF0dXNfdCBIYW5kbGVPR0coCi0gICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBNZWRpYVNjYW5uZXJDbGllbnQgKmNsaWVudCkgewotICAgIGludCBkdXJhdGlvbjsKLQotICAgIEZJTEUgKmZpbGUgPSBmb3BlbihmaWxlbmFtZSwiciIpOwotICAgIGlmICghZmlsZSkKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0KLSAgICBPZ2dWb3JiaXNfRmlsZSB2ZjsKLSAgICBpZiAob3Zfb3BlbihmaWxlLCAmdmYsIE5VTEwsIDApIDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjaGFyICoqcHRyPW92X2NvbW1lbnQoJnZmLC0xKS0+dXNlcl9jb21tZW50czsKLSAgICB3aGlsZSgqcHRyKXsKLSAgICAgICAgY2hhciAqdmFsID0gc3Ryc3RyKCpwdHIsICI9Iik7Ci0gICAgICAgIGlmICh2YWwpIHsKLSAgICAgICAgICAgIGludCBrZXlsZW4gPSB2YWwrKyAtICpwdHI7Ci0gICAgICAgICAgICBjaGFyIGtleVtrZXlsZW4gKyAxXTsKLSAgICAgICAgICAgIHN0cm5jcHkoa2V5LCAqcHRyLCBrZXlsZW4pOwotICAgICAgICAgICAga2V5W2tleWxlbl0gPSAwOwotICAgICAgICAgICAgaWYgKCFjbGllbnQtPmFkZFN0cmluZ1RhZyhrZXksIHZhbCkpIGdvdG8gZmFpbHVyZTsKLSAgICAgICAgfQotICAgICAgICArK3B0cjsKLSAgICB9Ci0KLSAgICAvLyBEdXJhdGlvbgotICAgIGR1cmF0aW9uID0gb3ZfdGltZV90b3RhbCgmdmYsIC0xKTsKLSAgICBpZiAoZHVyYXRpb24gPiAwKSB7Ci0gICAgICAgIGNoYXIgYnVmZmVyWzIwXTsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIlZCIsIGR1cmF0aW9uKTsKLSAgICAgICAgaWYgKCFjbGllbnQtPmFkZFN0cmluZ1RhZygiZHVyYXRpb24iLCBidWZmZXIpKSBnb3RvIGZhaWx1cmU7Ci0gICAgfQotCi0gICAgb3ZfY2xlYXIoJnZmKTsgLy8gdGhpcyBhbHNvIGNsb3NlcyB0aGUgRklMRQotICAgIHJldHVybiBPSzsKLQotZmFpbHVyZToKLSAgICBvdl9jbGVhcigmdmYpOyAvLyB0aGlzIGFsc28gY2xvc2VzIHRoZSBGSUxFCi0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci19Ci0KIHN0YXR1c190IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZSgKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50KSB7CkBAIC0xNzYsMTEgKzEzMSw2IEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5vZ2ciKSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBIYW5kbGVPR0cocGF0aCwgJmNsaWVudCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UocGF0aCkgPT0gT0sKICAgICAgICAgICAgICYmIG1SZXRyaWV2ZXItPnNldE1vZGUoCiAgICAgICAgICAgICAgICAgTUVUQURBVEFfTU9ERV9NRVRBREFUQV9SRVRSSUVWQUxfT05MWSkgPT0gT0spIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMjU4YmU3NC4uOWIyZGVjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0KICAgICAgICAgT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgICAgICBjbGllbnQtPmludGVyZmFjZSgpLCBzb3VyY2UtPmdldEZvcm1hdCgpLCBmYWxzZSwgc291cmNlLAotICAgICAgICAgICAgICAgIE5VTEwsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBOVUxMLCBmbGFncyB8IE9NWENvZGVjOjprQ2xpZW50TmVlZHNGcmFtZWJ1ZmZlcik7CiAKICAgICBpZiAoZGVjb2Rlci5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIExPR1YoInVuYWJsZSB0byBpbnN0YW50aWF0ZSB2aWRlbyBkZWNvZGVyLiIpOwpAQCAtMTU5LDYgKzE1OSwyMCBAQAogCiAgICAgTE9HVigic3VjY2Vzc2Z1bGx5IGRlY29kZWQgdmlkZW8gZnJhbWUuIik7CiAKKyAgICBpbnQzMl90IHVucmVhZGFibGU7CisgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCAmdW5yZWFkYWJsZSkKKyAgICAgICAgICAgICYmIHVucmVhZGFibGUgIT0gMCkgeworICAgICAgICBMT0dWKCJ2aWRlbyBmcmFtZSBpcyB1bnJlYWRhYmxlLCBkZWNvZGVyIGRvZXMgbm90IGdpdmUgdXMgYWNjZXNzICIKKyAgICAgICAgICAgICAidG8gdGhlIHZpZGVvIGRhdGEuIik7CisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgZGVjb2Rlci0+c3RvcCgpOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogICAgIGlmICh0aHVtYk5haWxUaW1lID49IDApIHsKQEAgLTE3Nyw2ICsxOTEsMTEgQEAKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwogCisgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKKyAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgorICAgIH0KKwogICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gbmV3IFZpZGVvRnJhbWU7CiAgICAgZnJhbWUtPm1XaWR0aCA9IHdpZHRoOwogICAgIGZyYW1lLT5tSGVpZ2h0ID0gaGVpZ2h0OwpAQCAtMTg0LDYgKzIwMyw3IEBACiAgICAgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OwogICAgIGZyYW1lLT5tU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMjsKICAgICBmcmFtZS0+bURhdGEgPSBuZXcgdWludDhfdFtmcmFtZS0+bVNpemVdOworICAgIGZyYW1lLT5tUm90YXRpb25BbmdsZSA9IHJvdGF0aW9uQW5nbGU7CiAKICAgICBpbnQzMl90IHNyY0Zvcm1hdDsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CkBAIC0zNzgsNiArMzk4LDI0IEBACiAgICAgLy8gVGhlIGR1cmF0aW9uIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZHVyYXRpb24gaW4gbXMuCiAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRFVSQVRJT04sIFN0cmluZzgodG1wKSk7CisKKyAgICBpZiAobnVtVHJhY2tzID09IDEpIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZU1JTUU7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJmZpbGVNSU1FKSk7CisKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKGZpbGVNSU1FLCAidmlkZW8veC1tYXRyb3NrYSIpKSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgwKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRyYWNrTUlNRTsKKyAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdHJhY2tNSU1FKSk7CisKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIHRyYWNrTUlNRSwgNikpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF0cm9za2EgZmlsZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIGF1ZGlvIHRyYWNrLAorICAgICAgICAgICAgICAgIC8vIHJld3JpdGUgaXRzIG1pbWUgdHlwZS4KKyAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX01JTUVUWVBFLCBTdHJpbmc4KCJhdWRpby94LW1hdHJvc2thIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RocmVhZGVkU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RocmVhZGVkU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGM2ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyZWFkZWRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaHJlYWRlZFNvdXJjZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvVGhyZWFkZWRTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhRdWV1ZVNpemUgPSAyOworCitUaHJlYWRlZFNvdXJjZTo6VGhyZWFkZWRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxUaHJlYWRlZFNvdXJjZT4odGhpcykpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKK30KKworVGhyZWFkZWRTb3VyY2U6On5UaHJlYWRlZFNvdXJjZSgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgVGhyZWFkZWRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRmluYWxSZXN1bHQgPSBPSzsKKyAgICBtU2Vla1RpbWVVcyA9IC0xOworICAgIG1EZWNvZGVQZW5kaW5nID0gZmFsc2U7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHBvc3REZWNvZGVNb3JlX2woKTsKKworICAgIENIRUNLX0VRKG1Mb29wZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFRocmVhZGVkU291cmNlOjpzdG9wKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIENIRUNLX0VRKG1Mb29wZXItPnN0b3AoKSwgKHN0YXR1c190KU9LKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgY2xlYXJRdWV1ZV9sKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3A8TWV0YURhdGE+IFRocmVhZGVkU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBUaHJlYWRlZFNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgaW50MzJfdCBzZWVrQ29tcGxldGUgPSAwOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIm1vZGUiLCBzZWVrTW9kZSk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcigiY29tcGxldGUiLCAmc2Vla0NvbXBsZXRlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisKKyAgICAgICAgd2hpbGUgKCFzZWVrQ29tcGxldGUpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAobVF1ZXVlLmVtcHR5KCkgJiYgbUZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKCFtUXVldWUuZW1wdHkoKSkgeworICAgICAgICAqYnVmZmVyID0gKm1RdWV1ZS5iZWdpbigpOworICAgICAgICBtUXVldWUuZXJhc2UobVF1ZXVlLmJlZ2luKCkpOworCisgICAgICAgIGlmIChtRmluYWxSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgIHBvc3REZWNvZGVNb3JlX2woKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbmFsUmVzdWx0OworfQorCit2b2lkIFRocmVhZGVkU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlZWs6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbVNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLX0dFKG1TZWVrVGltZVVzLCAwbGwpOworCisgICAgICAgICAgICBpbnQzMl90IHg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZ4KSk7CisgICAgICAgICAgICBtU2Vla01vZGUgPSAoUmVhZE9wdGlvbnM6OlNlZWtNb2RlKXg7CisKKyAgICAgICAgICAgIGludDMyX3QgKnNlZWtDb21wbGV0ZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImNvbXBsZXRlIiwgKHZvaWQgKiopJnNlZWtDb21wbGV0ZSkpOworCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgY2xlYXJRdWV1ZV9sKCk7CisgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBPSzsKKworICAgICAgICAgICAgKnNlZWtDb21wbGV0ZSA9IDE7CisgICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgICAgICAgICBwb3N0RGVjb2RlTW9yZV9sKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXREZWNvZGVNb3JlOgorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRGVjb2RlUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1RdWV1ZS5zaXplKCkgPT0ga01heFF1ZXVlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOworICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywgbVNlZWtNb2RlKTsKKyAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xbGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIsICZvcHRpb25zKTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOworCisgICAgICAgICAgICAgICAgaWYgKG1RdWV1ZS5zaXplKCkgPCBrTWF4UXVldWVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc3REZWNvZGVNb3JlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFRocmVhZGVkU291cmNlOjpwb3N0RGVjb2RlTW9yZV9sKCkgeworICAgIGlmIChtRGVjb2RlUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbURlY29kZVBlbmRpbmcgPSB0cnVlOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREZWNvZGVNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBUaHJlYWRlZFNvdXJjZTo6Y2xlYXJRdWV1ZV9sKCkgeworICAgIHdoaWxlICghbVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9ICptUXVldWUuYmVnaW4oKTsKKyAgICAgICAgbVF1ZXVlLmVyYXNlKG1RdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyb3R0bGVkU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzExZjdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyb3R0bGVkU291cmNlLmNwcApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKyAgICByZXR1cm4gKGludDY0X3QpdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDBsbDsKK30KKworVGhyb3R0bGVkU291cmNlOjpUaHJvdHRsZWRTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGludDMyX3QgYmFuZHdpZHRoTGltaXRCeXRlc1BlclNlY29uZCkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1CYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kKGJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQpLAorICAgICAgbVN0YXJ0VGltZVVzKC0xKSwKKyAgICAgIG1Ub3RhbFRyYW5zZmVycmVkKDApIHsKKyAgICBDSEVDSyhtQmFuZHdpZHRoTGltaXRCeXRlc1BlclNlY29uZCA+IDApOworfQorCitzdGF0dXNfdCBUaHJvdHRsZWRTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Cit9CisKK3NzaXplX3QgVGhyb3R0bGVkU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKworICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgbVRvdGFsVHJhbnNmZXJyZWQgKz0gbjsKKworICAgIGludDY0X3Qgbm93VXMgPSBnZXROb3dVcygpOworCisgICAgaWYgKG1TdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gbm93VXM7CisgICAgfQorCisgICAgLy8gSG93IGxvbmcgd291bGQgaXQgaGF2ZSB0YWtlbiB0byB0cmFuc2ZlciBldmVyeXRoaW5nIHdlIGV2ZXIKKyAgICAvLyB0cmFuc2ZlcnJlZCBnaXZlbiB0aGUgbGltaXRlZCBiYW5kd2lkdGguCisgICAgaW50NjRfdCBkdXJhdGlvblVzID0KKyAgICAgICAgbVRvdGFsVHJhbnNmZXJyZWQgKiAxMDAwMDAwbGwgLyBtQmFuZHdpZHRoTGltaXRCeXRlc1BlclNlY29uZDsKKworICAgIGludDY0X3Qgd2hlblVzID0gbVN0YXJ0VGltZVVzICsgZHVyYXRpb25VczsKKworICAgIGlmICh3aGVuVXMgPiBub3dVcykgeworICAgICAgICB1c2xlZXAod2hlblVzIC0gbm93VXMpOworICAgIH0KKworICAgIHJldHVybiBuOworfQorCitzdGF0dXNfdCBUaHJvdHRsZWRTb3VyY2U6OmdldFNpemUob2ZmX3QgKnNpemUpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKK30KKwordWludDMyX3QgVGhyb3R0bGVkU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggMGRhY2I1My4uNWE0NTNlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIgogCisjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgorCiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KQEAgLTIwOSw2ICsyMTEsOCBAQAogI2VuZGlmCiAKICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgc2V0X3NjaGVkX3BvbGljeShhbmRyb2lkR2V0VGlkKCksIFNQX0ZPUkVHUk9VTkQpOworCiAgICAgc3RhdGljX2Nhc3Q8VGltZWRFdmVudFF1ZXVlICo+KG1lKS0+dGhyZWFkRW50cnkoKTsKIAogI2lmZGVmIEFORFJPSURfU0lNVUxBVE9SCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAppbmRleCA3MzY1ZGZhLi5hZmYwNmJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTMxLDcgKzMxLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIHVpbnQxNl90IFdBVkVfRk9STUFUX1BDTSA9IDE7CitlbnVtIHsKKyAgICBXQVZFX0ZPUk1BVF9QQ00gPSAxLAorICAgIFdBVkVfRk9STUFUX0FMQVcgPSA2LAorICAgIFdBVkVfRk9STUFUX01VTEFXID0gNywKK307CiAKIHN0YXRpYyB1aW50MzJfdCBVMzJfTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CiAgICAgcmV0dXJuIHB0clszXSA8PCAyNCB8IHB0clsyXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzBdOwpAQCAtNDUsNiArNDksNyBAQAogICAgIFdBVlNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAorICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKICAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCkBAIC02Myw2ICs2OCw3IEBACiAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwpAQCAtMTA4LDcgKzExNCw3IEBACiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOworICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKIH0KIAogc3A8TWV0YURhdGE+IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKQEAgLTE2MCw4ICsxNjYsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDE2X3QgZm9ybWF0ID0gVTE2X0xFX0FUKGZvcm1hdFNwZWMpOwotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0ID0gVTE2X0xFX0FUKGZvcm1hdFNwZWMpOworICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX1BDTQorICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9BTEFXCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCkBAIC0xNzgsOSArMTg2LDE3IEBACiAKICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzE0XSk7CiAKLSAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSA4ICYmIG1CaXRzUGVyU2FtcGxlICE9IDE2Ci0gICAgICAgICAgICAgICAgJiYgbUJpdHNQZXJTYW1wbGUgIT0gMjQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDggJiYgbUJpdHNQZXJTYW1wbGUgIT0gMTYKKyAgICAgICAgICAgICAgICAgICAgJiYgbUJpdHNQZXJTYW1wbGUgIT0gMjQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVVMQVcKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0FMQVcpOworICAgICAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1WYWxpZEZvcm1hdCA9IHRydWU7CkBAIC0xOTAsNyArMjA2LDIzIEBACiAgICAgICAgICAgICAgICAgbURhdGFTaXplID0gY2h1bmtTaXplOwogCiAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAobVdhdmVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9QQ006CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgorICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS0+c2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtV2F2ZUZvcm1hdCwgV0FWRV9GT1JNQVRfTVVMQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS0+c2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwogCkBAIC0yMTcsMTAgKzI0OSwxMiBAQAogV0FWU291cmNlOjpXQVZTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCisgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKICAgICAgICAgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCisgICAgICBtV2F2ZUZvcm1hdCh3YXZlRm9ybWF0KSwKICAgICAgIG1TYW1wbGVSYXRlKDApLAogICAgICAgbU51bUNoYW5uZWxzKDApLAogICAgICAgbUJpdHNQZXJTYW1wbGUoYml0c1BlclNhbXBsZSksCkBAIC0yODIsNyArMzE2LDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGludDY0X3QgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogMjsKICAgICAgICAgaWYgKHBvcyA+IG1TaXplKSB7CiAgICAgICAgICAgICBwb3MgPSBtU2l6ZTsKQEAgLTI5Niw5ICszMzEsMjAgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQorICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiBrTWF4RnJhbWVTaXplOworCisgICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICAgICAgKG1DdXJyZW50UG9zIC0gbU9mZnNldCA+PSAob2ZmX3QpbVNpemUpCisgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOworCisgICAgaWYgKG1heEJ5dGVzVG9SZWFkID4gbWF4Qnl0ZXNBdmFpbGFibGUpIHsKKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtYXhCeXRlc0F2YWlsYWJsZTsKKyAgICB9CisKICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgbUN1cnJlbnRQb3MsIGJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGtNYXhGcmFtZVNpemUgLyAyIDoga01heEZyYW1lU2l6ZSk7CisgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCk7CiAKICAgICBpZiAobiA8PSAwKSB7CiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMzExLDQzICszNTcsNDUgQEAKIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCisgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgeworICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgeworICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCiAKLSAgICAgICAgTWVkaWFCdWZmZXIgKnRtcDsKLSAgICAgICAgQ0hFQ0tfRVEobUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wKSwgT0spOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKnRtcDsKKyAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIE9LKTsKIAotICAgICAgICAvLyBUaGUgbmV3IGJ1ZmZlciBob2xkcyB0aGUgc2FtcGxlIG51bWJlciBvZiBzYW1wbGVzLCBidXQgZWFjaAotICAgICAgICAvLyBvbmUgaXMgMiBieXRlcyB3aWRlLgotICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7CisgICAgICAgICAgICAvLyBUaGUgbmV3IGJ1ZmZlciBob2xkcyB0aGUgc2FtcGxlIG51bWJlciBvZiBzYW1wbGVzLCBidXQgZWFjaAorICAgICAgICAgICAgLy8gb25lIGlzIDIgYnl0ZXMgd2lkZS4KKyAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKIAotICAgICAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKXRtcC0+ZGF0YSgpOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICB3aGlsZSAobi0tID4gMCkgewotICAgICAgICAgICAgKmRzdCsrID0gKChpbnQxNl90KSgqc3JjKSAtIDEyOCkgKiAyNTY7Ci0gICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgIGludDE2X3QgKmRzdCA9IChpbnQxNl90ICopdG1wLT5kYXRhKCk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAoKGludDE2X3QpKCpzcmMpIC0gMTI4KSAqIDI1NjsKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSB0bXA7CisgICAgICAgIH0gZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgMjQtYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgICAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKXNyYzsKKworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC8gMzsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB4ID0gKGludDMyX3QpKHNyY1swXSB8IHNyY1sxXSA8PCA4IHwgc3JjWzJdIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB4ID0gKHggPDwgOCkgPj4gODsgIC8vIHNpZ24gZXh0ZW5zaW9uCisKKyAgICAgICAgICAgICAgICB4ID0geCA+PiA4OworICAgICAgICAgICAgICAgICpkc3QrKyA9IChpbnQxNl90KXg7CisgICAgICAgICAgICAgICAgc3JjICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSB0bXA7Ci0gICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilzcmM7Ci0KLSAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC8gMzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgICAgIGludDMyX3QgeCA9IChpbnQzMl90KShzcmNbMF0gfCBzcmNbMV0gPDwgOCB8IHNyY1syXSA8PCAxNik7Ci0gICAgICAgICAgICB4ID0gKHggPDwgOCkgPj4gODsgIC8vIHNpZ24gZXh0ZW5zaW9uCi0KLSAgICAgICAgICAgIHggPSB4ID4+IDg7Ci0gICAgICAgICAgICAqZHN0KysgPSAoaW50MTZfdCl4OwotICAgICAgICAgICAgc3JjICs9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAyICogbnVtU2FtcGxlcyk7CiAgICAgfQogCiAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKQEAgLTM1Nyw2ICs0MDUsNyBAQAogICAgICAgICAgICAgMTAwMDAwMExMICogKG1DdXJyZW50UG9zIC0gbU9mZnNldCkKICAgICAgICAgICAgICAgICAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSkgLyBtU2FtcGxlUmF0ZSk7CiAKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIApAQCAtMzY2LDcgKzQxNSw4IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIFNuaWZmV0FWKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgewogICAgIGNoYXIgaGVhZGVyWzEyXTsKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhlNDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordW5zaWduZWQgcGFyc2VVRShBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIG51bVplcm9lcyA9IDA7CisgICAgd2hpbGUgKGJyLT5nZXRCaXRzKDEpID09IDApIHsKKyAgICAgICAgKytudW1aZXJvZXM7CisgICAgfQorCisgICAgdW5zaWduZWQgeCA9IGJyLT5nZXRCaXRzKG51bVplcm9lcyk7CisKKyAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKK30KKworLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgordm9pZCBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgQUJpdFJlYWRlciBicihzZXFQYXJhbVNldC0+ZGF0YSgpICsgMSwgc2VxUGFyYW1TZXQtPnNpemUoKSAtIDEpOworCisgICAgdW5zaWduZWQgcHJvZmlsZV9pZGMgPSBici5nZXRCaXRzKDgpOworICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICBwYXJzZVVFKCZicik7ICAvLyBzZXFfcGFyYW1ldGVyX3NldF9pZAorCisgICAgdW5zaWduZWQgY2hyb21hX2Zvcm1hdF9pZGMgPSAxOyAgLy8gNDoyOjAgY2hyb21hIGZvcm1hdAorCisgICAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMTAKKyAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDEyMiB8fCBwcm9maWxlX2lkYyA9PSAyNDQKKyAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8IHByb2ZpbGVfaWRjID09IDgzIHx8IHByb2ZpbGVfaWRjID09IDg2KSB7CisgICAgICAgIGNocm9tYV9mb3JtYXRfaWRjID0gcGFyc2VVRSgmYnIpOworICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKKyAgICAgICAgfQorICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKKyAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKKyAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMHUpOyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworICAgIH0KKworICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKKyAgICB1bnNpZ25lZCBwaWNfb3JkZXJfY250X3R5cGUgPSBwYXJzZVVFKCZicik7CisKKyAgICBpZiAocGljX29yZGVyX2NudF90eXBlID09IDApIHsKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0CisgICAgfSBlbHNlIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMSkgeworICAgICAgICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljLCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgYW5kCisgICAgICAgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lIGFyZSB0ZWNobmljYWxseSBzZSh2KSwgYnV0IHNpbmNlIHdlIGFyZQorICAgICAgICAvLyBqdXN0IHNraXBwaW5nIG92ZXIgdGhlbSB0aGUgbWlkcG9pbnQgZG9lcyBub3QgbWF0dGVyLgorCisgICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZworICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljCisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAorCisgICAgICAgIHVuc2lnbmVkIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBwYXJzZVVFKCZicik7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyArK2kpIHsKKyAgICAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJzZVVFKCZicik7ICAvLyBudW1fcmVmX2ZyYW1lcworICAgIGJyLmdldEJpdHMoMSk7ICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKKworICAgIHVuc2lnbmVkIHBpY193aWR0aF9pbl9tYnNfbWludXMxID0gcGFyc2VVRSgmYnIpOworICAgIHVuc2lnbmVkIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHBhcnNlVUUoJmJyKTsKKyAgICB1bnNpZ25lZCBmcmFtZV9tYnNfb25seV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICp3aWR0aCA9IHBpY193aWR0aF9pbl9tYnNfbWludXMxICogMTYgKyAxNjsKKworICAgICpoZWlnaHQgPSAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpCisgICAgICAgICogKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSAqIDE2ICsgMTYpOworCisgICAgaWYgKCFmcmFtZV9tYnNfb25seV9mbGFnKSB7CisgICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCisgICAgfQorCisgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcKKworICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmcmFtZV9jcm9wcGluZ19mbGFnCisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBwYXJzZVVFKCZicik7CisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gcGFyc2VVRSgmYnIpOworICAgICAgICB1bnNpZ25lZCBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBwYXJzZVVFKCZicik7CisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IHBhcnNlVUUoJmJyKTsKKworICAgICAgICB1bnNpZ25lZCBjcm9wVW5pdFgsIGNyb3BVbml0WTsKKyAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDAgIC8qIG1vbm9jaHJvbWUgKi8pIHsKKyAgICAgICAgICAgIGNyb3BVbml0WCA9IDE7CisgICAgICAgICAgICBjcm9wVW5pdFkgPSAyIC0gZnJhbWVfbWJzX29ubHlfZmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHN1YldpZHRoQyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSA/IDEgOiAyOworICAgICAgICAgICAgdW5zaWduZWQgc3ViSGVpZ2h0QyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSA/IDIgOiAxOworCisgICAgICAgICAgICBjcm9wVW5pdFggPSBzdWJXaWR0aEM7CisgICAgICAgICAgICBjcm9wVW5pdFkgPSBzdWJIZWlnaHRDICogKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIExPR1YoImZyYW1lX2Nyb3AgPSAoJXUsICV1LCAldSwgJXUpLCBjcm9wVW5pdFggPSAldSwgY3JvcFVuaXRZID0gJXUiLAorICAgICAgICAgICAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQsIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0LAorICAgICAgICAgICAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0LAorICAgICAgICAgICAgIGNyb3BVbml0WCwgY3JvcFVuaXRZKTsKKworICAgICAgICAqd2lkdGggLT0KKyAgICAgICAgICAgIChmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ICsgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpICogY3JvcFVuaXRYOworICAgICAgICAqaGVpZ2h0IC09CisgICAgICAgICAgICAoZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ICsgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSAqIGNyb3BVbml0WTsKKyAgICB9Cit9CisKK3N0YXR1c190IGdldE5leHROQUxVbml0KAorICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAorICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKl9kYXRhOworICAgIHNpemVfdCBzaXplID0gKl9zaXplOworCisgICAgKm5hbFN0YXJ0ID0gTlVMTDsKKyAgICAqbmFsU2l6ZSA9IDA7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIC8vIFNraXAgYW55IG51bWJlciBvZiBsZWFkaW5nIDB4MDAuCisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSAmJiBkYXRhW29mZnNldF0gPT0gMHgwMCkgeworICAgICAgICArK29mZnNldDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgLy8gQSB2YWxpZCBzdGFydGNvZGUgY29uc2lzdHMgb2YgYXQgbGVhc3QgdHdvIDB4MDAgYnl0ZXMgZm9sbG93ZWQgYnkgMHgwMS4KKworICAgIGlmIChvZmZzZXQgPCAyIHx8IGRhdGFbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKytvZmZzZXQ7CisKKyAgICBzaXplX3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplICYmIGRhdGFbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgeworICAgICAgICAgICAgaWYgKHN0YXJ0Q29kZUZvbGxvd3MpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplICsgMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YVtvZmZzZXQgLSAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMl0gPT0gMHgwMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICArK29mZnNldDsKKyAgICB9CisKKyAgICBzaXplX3QgZW5kT2Zmc2V0ID0gb2Zmc2V0IC0gMjsKKyAgICB3aGlsZSAoZGF0YVtlbmRPZmZzZXQgLSAxXSA9PSAweDAwKSB7CisgICAgICAgIC0tZW5kT2Zmc2V0OworICAgIH0KKworICAgICpuYWxTdGFydCA9ICZkYXRhW3N0YXJ0T2Zmc2V0XTsKKyAgICAqbmFsU2l6ZSA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OworCisgICAgaWYgKG9mZnNldCArIDIgPCBzaXplKSB7CisgICAgICAgICpfZGF0YSA9ICZkYXRhW29mZnNldCAtIDJdOworICAgICAgICAqX3NpemUgPSBzaXplIC0gb2Zmc2V0ICsgMjsKKyAgICB9IGVsc2UgeworICAgICAgICAqX2RhdGEgPSBOVUxMOworICAgICAgICAqX3NpemUgPSAwOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlLAorICAgICAgICBzaXplX3QgKnN0b3BPZmZzZXQpIHsKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBpZiAoKG5hbFN0YXJ0WzBdICYgMHgxZikgPT0gbmFsVHlwZSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIobmFsU2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG5hbFN0YXJ0LCBuYWxTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3A8TWV0YURhdGE+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBhY2Nlc3NVbml0LT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBhY2Nlc3NVbml0LT5zaXplKCk7CisKKyAgICBzcDxBQnVmZmVyPiBzZXFQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgNywgTlVMTCk7CisgICAgaWYgKHNlcVBhcmFtU2V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIEZpbmRBVkNEaW1lbnNpb25zKHNlcVBhcmFtU2V0LCAmd2lkdGgsICZoZWlnaHQpOworCisgICAgc2l6ZV90IHN0b3BPZmZzZXQ7CisgICAgc3A8QUJ1ZmZlcj4gcGljUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDgsICZzdG9wT2Zmc2V0KTsKKyAgICBDSEVDSyhwaWNQYXJhbVNldCAhPSBOVUxMKTsKKworICAgIHNpemVfdCBjc2RTaXplID0KKyAgICAgICAgMSArIDMgKyAxICsgMQorICAgICAgICArIDIgKiAxICsgc2VxUGFyYW1TZXQtPnNpemUoKQorICAgICAgICArIDEgKyAyICogMSArIHBpY1BhcmFtU2V0LT5zaXplKCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKKyAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKKworICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgorICAgIG1lbWNweShvdXQsIHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCAzKTsgIC8vIHByb2ZpbGUvbGV2ZWwuLi4KKyAgICBvdXQgKz0gMzsKKyAgICAqb3V0KysgPSAoMHgzZiA8PCAyKSB8IDE7ICAvLyBsZW5ndGhTaXplID09IDIgYnl0ZXMKKyAgICAqb3V0KysgPSAweGUwIHwgMTsKKworICAgICpvdXQrKyA9IHNlcVBhcmFtU2V0LT5zaXplKCkgPj4gODsKKyAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpICYgMHhmZjsKKyAgICBtZW1jcHkob3V0LCBzZXFQYXJhbVNldC0+ZGF0YSgpLCBzZXFQYXJhbVNldC0+c2l6ZSgpKTsKKyAgICBvdXQgKz0gc2VxUGFyYW1TZXQtPnNpemUoKTsKKworICAgICpvdXQrKyA9IDE7CisKKyAgICAqb3V0KysgPSBwaWNQYXJhbVNldC0+c2l6ZSgpID4+IDg7CisgICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7CisgICAgbWVtY3B5KG91dCwgcGljUGFyYW1TZXQtPmRhdGEoKSwgcGljUGFyYW1TZXQtPnNpemUoKSk7CisKKyNpZiAwCisgICAgTE9HSSgiQVZDIHNlcSBwYXJhbSBzZXQiKTsKKyAgICBoZXhkdW1wKHNlcVBhcmFtU2V0LT5kYXRhKCksIHNlcVBhcmFtU2V0LT5zaXplKCkpOworI2VuZGlmCisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIDAsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgIExPR0koImZvdW5kIEFWQyBjb2RlYyBjb25maWcgKCVkIHggJWQpIiwgd2lkdGgsIGhlaWdodCk7CisKKyAgICByZXR1cm4gbWV0YTsKK30KKworYm9vbCBJc0lEUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBib29sIGZvdW5kSURSID0gZmFsc2U7CisKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBDSEVDS19HVChuYWxTaXplLCAwdSk7CisKKyAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKKworICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICBmb3VuZElEUiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmb3VuZElEUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAKaW5kZXggMmJjNDQ0OC4uZjU4YzE2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgIkFBQ0RlY29kZXIuaCIKKyNkZWZpbmUgTE9HX1RBRyAiQUFDRGVjb2RlciIKIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvRVNEUy5oIgogCkBAIC0zNiwyNiArMzcsMzMgQEAKICAgICAgIG1BbmNob3JUaW1lVXMoMCksCiAgICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKICAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSB7Ci19CiAKLUFBQ0RlY29kZXI6On5BQUNEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7CisgICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworCisgICAgLy8gV2UnbGwgYWx3YXlzIG91dHB1dCBzdGVyZW8sIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgY2hhbm5lbHMgYXJlCisgICAgLy8gcHJlc2VudCBpbiB0aGUgaW5wdXQgZHVlIHRvIGRlY29kZXIgbGltaXRhdGlvbnMuCisgICAgbU1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwogICAgIH0KKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFBQ0RlY29kZXIiKTsKIAotICAgIGRlbGV0ZSBtQ29uZmlnOwotICAgIG1Db25maWcgPSBOVUxMOworICAgIG1Jbml0Q2hlY2sgPSBpbml0Q2hlY2soKTsKIH0KIAotc3RhdHVzX3QgQUFDRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDIwNDggKiAyKSk7Ci0KK3N0YXR1c190IEFBQ0RlY29kZXI6OmluaXRDaGVjaygpIHsKKyAgICBtZW1zZXQobUNvbmZpZywgMCwgc2l6ZW9mKHRQVk1QNEF1ZGlvRGVjb2RlckV4dGVybmFsKSk7CiAgICAgbUNvbmZpZy0+b3V0cHV0Rm9ybWF0ID0gT1VUUFVURk9STUFUXzE2UENNX0lOVEVSTEVBVkVEOwotICAgIG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yID0gMDsKLSAgICBtQ29uZmlnLT5hYWNQbHVzRW5hYmxlZCA9IGZhbHNlOworICAgIG1Db25maWctPmFhY1BsdXNFbmFibGVkID0gMTsKIAogICAgIC8vIFRoZSBzb2Z0d2FyZSBkZWNvZGVyIGRvZXNuJ3QgcHJvcGVybHkgc3VwcG9ydCBtb25vIG91dHB1dCBvbgogICAgIC8vIEFBQ3BsdXMgZmlsZXMuIEFsd2F5cyBvdXRwdXQgc3RlcmVvLgpAQCAtNjQsOCArNzIsMTEgQEAKICAgICBVSW50MzIgbWVtUmVxdWlyZW1lbnRzID0gUFZNUDRBdWRpb0RlY29kZXJHZXRNZW1SZXF1aXJlbWVudHMoKTsKICAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOwogCi0gICAgQ0hFQ0tfRVEoUFZNUDRBdWRpb0RlY29kZXJJbml0TGlicmFyeShtQ29uZmlnLCBtRGVjb2RlckJ1ZiksCi0gICAgICAgICAgICAgTVA0QVVERUNfU1VDQ0VTUyk7CisgICAgc3RhdHVzX3QgZXJyID0gUFZNUDRBdWRpb0RlY29kZXJJbml0TGlicmFyeShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisgICAgaWYgKGVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIE1QNCBhdWRpbyBkZWNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KIAogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKQEAgLTgzLDI0ICs5NCwzNyBAQAogICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSAoVUNoYXIgKiljb2RlY19zcGVjaWZpY19kYXRhOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKLSAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKLSAgICAgICAgbUNvbmZpZy0+cmVtYWluZGVyQml0cyA9IDA7Ci0KLSAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXJfcGx1cyA9IE5VTEw7Ci0gICAgICAgIG1Db25maWctPnJlcG9zaXRpb25GbGFnID0gZmFsc2U7CiAKICAgICAgICAgaWYgKFBWTVA0QXVkaW9EZWNvZGVyQ29uZmlnKG1Db25maWcsIG1EZWNvZGVyQnVmKQogICAgICAgICAgICAgICAgICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK0FBQ0RlY29kZXI6On5BQUNEZWNvZGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorCisgICAgZGVsZXRlIG1Db25maWc7CisgICAgbUNvbmZpZyA9IE5VTEw7Cit9CisKK3N0YXR1c190IEFBQ0RlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcig0MDk2ICogMikpOwogCiAgICAgbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgIG1BbmNob3JUaW1lVXMgPSAwOwogICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgbU51bURlY29kZWRCdWZmZXJzID0gMDsKKyAgICBtVXBzYW1wbGluZ0ZhY3RvciA9IDI7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMjcsMjggKzE1MSw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBBQUNEZWNvZGVyOjpnZXRGb3JtYXQoKSB7Ci0gICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0KLSAgICAvLyBXZSdsbCBhbHdheXMgb3V0cHV0IHN0ZXJlbywgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBjaGFubmVscyBhcmUKLSAgICAvLyBwcmVzZW50IGluIHRoZSBpbnB1dCBkdWUgdG8gZGVjb2RlciBsaW1pdGF0aW9ucy4KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAyKTsKLQotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQUFDRGVjb2RlciIpOwotCi0gICAgcmV0dXJuIG1ldGE7CisgICAgcmV0dXJuIG1NZXRhOwogfQogCiBzdGF0dXNfdCBBQUNEZWNvZGVyOjpyZWFkKApAQCAtMTU4LDcgKzE2MSw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAKICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwpAQCAtMTY3LDYgKzE3MSwxMCBAQAogICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwogICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIFBWTVA0QXVkaW9EZWNvZGVyUmVzZXRCdWZmZXIobURlY29kZXJCdWYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNlZWtUaW1lVXMgPSAtMTsKICAgICB9CkBAIC0yMDAsMTMgKzIwOCw3NSBAQAogICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOwogCiAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHN0YXRpY19jYXN0PEludDE2ICo+KGJ1ZmZlci0+ZGF0YSgpKTsKLSAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSBOVUxMOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXJfcGx1cyA9ICZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzIwNDhdOwogICAgIG1Db25maWctPnJlcG9zaXRpb25GbGFnID0gZmFsc2U7CiAKICAgICBJbnQgZGVjb2RlckVyciA9IFBWTVA0QXVkaW9EZWNvZGVGcmFtZShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAKKyAgICAvKgorICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICoKKyAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICoKKyAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICovCisgICAgaWYgKCsrbU51bURlY29kZWRCdWZmZXJzIDw9IDIpIHsKKyAgICAgICAgTE9HVigiYXVkaW8vZXh0ZW5kZWQgYXVkaW8gb2JqZWN0IHR5cGU6ICVkICsgJWQiLAorICAgICAgICAgICAgbUNvbmZpZy0+YXVkaW9PYmplY3RUeXBlLCBtQ29uZmlnLT5leHRlbmRlZEF1ZGlvT2JqZWN0VHlwZSk7CisgICAgICAgIExPR1YoImFhYysgdXBzYW1wbGluZyBmYWN0b3I6ICVkIGRlc2lyZWQgY2hhbm5lbHM6ICVkIiwKKyAgICAgICAgICAgIG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yLCBtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHMpOworCisgICAgICAgIENIRUNLKG1OdW1EZWNvZGVkQnVmZmVycyA+IDApOworICAgICAgICBpZiAobU51bURlY29kZWRCdWZmZXJzID09IDEpIHsKKyAgICAgICAgICAgIG1VcHNhbXBsaW5nRmFjdG9yID0gbUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3I7CisgICAgICAgICAgICAvLyBDaGVjayBvbiB0aGUgc2FtcGxpbmcgcmF0ZSB0byBzZWUgd2hldGhlciBpdCBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBMT0dXKCJTYW1wbGUgcmF0ZSB3YXMgJWQgSHosIGJ1dCBub3cgaXMgJWQgSHoiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBJTkZPX0ZPUk1BVF9DSEFOR0VEOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAgLy8gbU51bURlY29kZWRCdWZmZXJzID09IDIKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5leHRlbmRlZEF1ZGlvT2JqZWN0VHlwZSA9PSBNUDRBVURJT19BQUNfTEMgfHwKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5leHRlbmRlZEF1ZGlvT2JqZWN0VHlwZSA9PSBNUDRBVURJT19MVFApIHsKKyAgICAgICAgICAgICAgICBpZiAobVVwc2FtcGxpbmdGYWN0b3IgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RyZWFtIHR1cm5zIG91dCB0byBiZSBub3QgYWFjUGx1cyBtb2RlIGFueXdheQorICAgICAgICAgICAgICAgICAgICBMT0dXKCJEaXNhYmxlIEFBQysvZUFBQysgc2luY2UgZXh0ZW5kZWQgYXVkaW8gb2JqZWN0IHR5cGUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLT5hYWNQbHVzRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVVwc2FtcGxpbmdGYWN0b3IgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhYWNQbHVzIG1vZGUgZG9lcyBub3QgYnV5IHVzIGFueXRoaW5nLCBidXQgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gMS4gQ1BVIGxvYWQgdG8gaW5jcmVhc2UsIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAyLiBhIGhhbGYgc3BlZWQgb2YgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiRGlzYWJsZSBBQUMrL2VBQUMrIHNpbmNlIHVwc2FtcGxpbmcgZmFjdG9yIGlzIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CiAgICAgICAgIG1Db25maWctPmZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzOworICAgIGlmIChtVXBzYW1wbGluZ0ZhY3RvciA9PSAyKSB7CisgICAgICAgIGlmIChtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgbWVtY3B5KCZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzEwMjRdLCAmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsyMDQ4XSwgbnVtT3V0Qnl0ZXMgKiAyKTsKKyAgICAgICAgfQorICAgICAgICBudW1PdXRCeXRlcyAqPSAyOworICAgIH0KIAogICAgIGlmIChkZWNvZGVyRXJyICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKICAgICAgICAgTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgJWQsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjlmMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUFDRW5jb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBQ0VuY29kZXIuaCIKKyNpbmNsdWRlICJ2b0FBQy5oIgorI2luY2x1ZGUgImNtbk1lbW9yeS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQUFDRW5jb2Rlcjo6QUFDRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXIoTlVMTCksCisgICAgICBtRW5jb2RlckhhbmRsZShOVUxMKSwKKyAgICAgIG1BcGlIYW5kbGUoTlVMTCksCisgICAgICBtTWVtT3BlcmF0b3IoTlVMTCkgeworfQorCitzdGF0dXNfdCBBQUNFbmNvZGVyOjppbml0Q2hlY2soKSB7CisgICAgQ0hFQ0sobUFwaUhhbmRsZSA9PSBOVUxMICYmIG1FbmNvZGVySGFuZGxlID09IE5VTEwpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVscykpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZtQml0UmF0ZSkpOworCisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBDSEVDSyhtQXBpSGFuZGxlKTsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSB2b0dldEFBQ0VuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKKyAgICBDSEVDSyhtTWVtT3BlcmF0b3IgIT0gTlVMTCk7CisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBQUMsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXQgQUFDIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChPSyAhPSBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgQUFDIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIEFBQyBlbmNvZGVyJAorICAgIEFBQ0VOQ19QQVJBTSBwYXJhbXM7CisgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKyAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIHBhcmFtcy5iaXRSYXRlID0gbUJpdFJhdGU7CisgICAgcGFyYW1zLm5DaGFubmVscyA9IG1DaGFubmVsczsKKyAgICBwYXJhbXMuYWR0c1VzZWQgPSAwOyAgLy8gRm9yIE1QNCBmaWxlLCBkb24ndCB1c2UgYWR0cyBmb3JtYXQkCisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAgJnBhcmFtcykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCAmaW5kZXgpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgY29uc3QgaW50MzJfdCB0YWJsZVNpemUgPSBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZSkgLyBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZVswXSk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFibGVTaXplOyArK2kpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0ga1NhbXBsZVJhdGVUYWJsZVtpXSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiU2FtcGxpbmcgcmF0ZSAlZCBicHMgaXMgbm90IHN1cHBvcnRlZCIsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworfQorCitzdGF0dXNfdCBBQUNFbmNvZGVyOjpzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpIHsKKyAgICBMT0dWKCJzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YTogJWQgaHosICVkIGJwcywgYW5kICVkIGNoYW5uZWxzIiwKKyAgICAgICAgIG1TYW1wbGVSYXRlLCBtQml0UmF0ZSwgbUNoYW5uZWxzKTsKKworICAgIGludDMyX3QgaW5kZXg7CisgICAgQ0hFQ0tfRVEoT0ssIGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KG1TYW1wbGVSYXRlLCBpbmRleCkpOworICAgIGlmIChtQ2hhbm5lbHMgPiAyIHx8IG1DaGFubmVscyA8PSAwKSB7CisgICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyglZCkiLCBtQ2hhbm5lbHMpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBPTVhfQVVESU9fQUFDT2JqZWN0TEMKKyAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMF0gPSAoKDB4MDIgPDwgMykgfCAoaW5kZXggPj4gMSkpOworICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVsxXSA9ICgoaW5kZXggJiAweDAxKSA8PCA3KSB8IChtQ2hhbm5lbHMgPDwgMyk7CisgICAgcmV0dXJuIE9LOworfQorCitBQUNFbmNvZGVyOjp+QUFDRW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQUFDRW5jb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigyMDQ4KSk7CisKKyAgICBDSEVDS19FUShPSywgaW5pdENoZWNrKCkpOworCisgICAgbU51bUlucHV0U2FtcGxlcyA9IDA7CisgICAgbUFuY2hvclRpbWVVcyA9IDA7CisgICAgbUZyYW1lQ291bnQgPSAwOworICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFBQ0VuY29kZXI6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0b3AoKSB3aGVuIGVuY29kZXIgaGFzIG5vdCBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUShWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7CisgICAgICAgIG1FbmNvZGVySGFuZGxlID0gTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIG1BcGlIYW5kbGU7CisgICAgbUFwaUhhbmRsZSA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQUFDRW5jb2Rlcjo6Z2V0Rm9ybWF0KCkgeworICAgIHNwPE1ldGFEYXRhPiBzcmNGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBQUNFbmNvZGVyIik7CisKKyAgICByZXR1cm4gbU1ldGE7Cit9CisKK3N0YXR1c190IEFBQ0VuY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHN0YXR1c190IGVycjsKKworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpOworCisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpLCBPSyk7CisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKKyAgICBib29sIHJlYWRGcm9tU291cmNlID0gZmFsc2U7CisgICAgaW50NjRfdCB3YWxsQ2xvY2tUaW1lVXMgPSAtMTsKKworICAgIGlmIChtRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1lbWNweShvdXRQdHIsIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSwgMik7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIpOworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgdHJ1ZSk7CisgICAgICAgICpvdXQgPSBidWZmZXI7CisgICAgICAgICsrbUZyYW1lQ291bnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1GcmFtZUNvdW50ID09IDEpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIGZhbHNlKTsKKyAgICB9CisKKyAgICB3aGlsZSAobU51bUlucHV0U2FtcGxlcyA8IGtOdW1TYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkgKiAoa051bVNhbXBsZXNQZXJGcmFtZSAtIG1OdW1JbnB1dFNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGFsaWduID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAlIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIENIRUNLX0VRKGFsaWduLCAwKTsKKworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgd2FsbENsb2NrVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5QW5jaG9yVGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgY29weSA9CisgICAgICAgICAgICAoa051bVNhbXBsZXNQZXJGcmFtZSAtIG1OdW1JbnB1dFNhbXBsZXMpICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAorICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikgbUlucHV0QnVmZmVyLT5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgY29weSk7CisKKyAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UoCisgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKKyAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKKworICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbU51bUlucHV0U2FtcGxlcyArPSBjb3B5IC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAobU51bUlucHV0U2FtcGxlcyA+PSBrTnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzICU9IGtOdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZPX0NPREVDQlVGRkVSIGlucHV0RGF0YTsKKyAgICBtZW1zZXQoJmlucHV0RGF0YSwgMCwgc2l6ZW9mKGlucHV0RGF0YSkpOworICAgIGlucHV0RGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworICAgIENIRUNLKFZPX0VSUl9OT05FID09IG1BcGlIYW5kbGUtPlNldElucHV0RGF0YShtRW5jb2RlckhhbmRsZSwmaW5wdXREYXRhKSk7CisKKyAgICBWT19DT0RFQ0JVRkZFUiBvdXRwdXREYXRhOworICAgIG1lbXNldCgmb3V0cHV0RGF0YSwgMCwgc2l6ZW9mKG91dHB1dERhdGEpKTsKKyAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dHB1dEluZm87CisgICAgbWVtc2V0KCZvdXRwdXRJbmZvLCAwLCBzaXplb2Yob3V0cHV0SW5mbykpOworCisgICAgVk9fVTMyIHJldCA9IFZPX0VSUl9OT05FOworICAgIG91dHB1dERhdGEuQnVmZmVyID0gb3V0UHRyOworICAgIG91dHB1dERhdGEuTGVuZ3RoID0gYnVmZmVyLT5zaXplKCk7CisgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBDSEVDSyhyZXQgPT0gVk9fRVJSX05PTkUgfHwgcmV0ID09IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOworICAgIENIRUNLKG91dHB1dERhdGEuTGVuZ3RoICE9IDApOworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG91dHB1dERhdGEuTGVuZ3RoKTsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPQorICAgICAgICAoKG1GcmFtZUNvdW50IC0gMSkgKiAxMDAwMDAwTEwgKiBrTnVtU2FtcGxlc1BlckZyYW1lKSAvIG1TYW1wbGVSYXRlOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbWVkaWFUaW1lVXMpOworICAgIGlmIChyZWFkRnJvbVNvdXJjZSAmJiB3YWxsQ2xvY2tUaW1lVXMgIT0gLTEpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgbWVkaWFUaW1lVXMgLSB3YWxsQ2xvY2tUaW1lVXMpOworICAgIH0KKyAgICArK21GcmFtZUNvdW50OworCisgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNGY5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDg3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBiYXNpY19vcC9iYXNpY29wMi5jIGJhc2ljX29wL29wZXJfMzJiLmMKKworTE9DQUxfU1JDX0ZJTEVTICs9IFwKKwlBQUNFbmNvZGVyLmNwcCBcCisJc3JjL2FhY19yb20uYyBcCisJc3JjL2FhY2VuYy5jIFwKKwlzcmMvYWFjZW5jX2NvcmUuYyBcCisJc3JjL2Fkal90aHIuYyBcCisJc3JjL2JhbmRfbnJnLmMgXAorCXNyYy9iaXRfY250LmMgXAorCXNyYy9iaXRidWZmZXIuYyBcCisJc3JjL2JpdGVuYy5jIFwKKwlzcmMvYmxvY2tfc3dpdGNoLmMgXAorCXNyYy9jaGFubmVsX21hcC5jIFwKKwlzcmMvZHluX2JpdHMuYyBcCisJc3JjL2dycF9kYXRhLmMgXAorCXNyYy9pbnRlcmZhY2UuYyBcCisJc3JjL2xpbmVfcGUuYyBcCisJc3JjL21zX3N0ZXJlby5jIFwKKwlzcmMvcHJlX2VjaG9fY29udHJvbC5jIFwKKwlzcmMvcHN5X2NvbmZpZ3VyYXRpb24uYyBcCisJc3JjL3BzeV9tYWluLmMgXAorCXNyYy9xY19tYWluLmMgXAorCXNyYy9xdWFudGl6ZS5jIFwKKwlzcmMvc2ZfZXN0aW0uYyBcCisJc3JjL3NwcmVhZGluZy5jIFwKKwlzcmMvc3RhdF9iaXRzLmMgXAorCXNyYy90bnMuYyBcCisJc3JjL3RyYW5zZm9ybS5jIFwKKwlzcmMvbWVtYWxpZ24uYworCitpZmVxICgkKFZPVFQpLCB2NSkKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisJc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucyBcCisJc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucyBcCisJc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NykKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisJc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucyBcCisJc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zIFwKKwlzcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zIFwKKwlzcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCitlbmRpZgorCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYWFjZW5jCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCisJJChMT0NBTF9QQVRIKS9zcmMgXAorCSQoTE9DQUxfUEFUSCkvaW5jIFwKKwkkKExPQ0FMX1BBVEgpL2Jhc2ljX29wCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKKworaWZlcSAoJChWT1RUKSwgdjUpCitMT0NBTF9DRkxBR1MgKz0gLURBUk1WNUUgLURBUk1fSU5BU00gLURBUk1WNV9JTkFTTQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NykKK0xPQ0FMX0NGTEFHUyArPSAtREFSTVY1RSAtREFSTVY3TmVvbiAtREFSTV9JTkFTTSAtREFSTVY1X0lOQVNNCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNUUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQwMTJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJQUFDX0VfU0FNUExFUy5oDQorDQorCUNvbnRlbnQ6CXNhbXBsZSBjb2RlIGZvciBBQUMgZW5jb2Rlcg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUJCTxkbGZjbi5oPg0KKyNpbmNsdWRlCQk8c3RkaW8uaD4NCisjaW5jbHVkZQkJPHN0ZGxpYi5oPg0KKyNpbmNsdWRlCQk8c3RyaW5nLmg+DQorI2luY2x1ZGUJCTx0aW1lLmg+DQorI2luY2x1ZGUJCSJ2b0FBQy5oIg0KKyNpbmNsdWRlCQkiY21uTWVtb3J5LmgiDQorDQorI2RlZmluZSAgVk9fQUFDX0VfT1VUUFVUCSAgMQ0KKyNkZWZpbmUgUkVBRF9TSVpFCSgxMDI0KjgpCQ0KK3Vuc2lnbmVkIGNoYXIgb3V0QnVmWzEwMjQqOF07DQordW5zaWduZWQgY2hhciBpbkJ1ZltSRUFEX1NJWkVdOw0KKw0KK2NvbnN0IGNoYXIqIEhlbHBTdHJpbmcgPSANCisiVmlzdWFsT24gQUFDIGVuY29kZXIgVXNhZ2U6XG4iDQorInZvQUFDRW5jVGVzdCAtaWYgPGlucHV0ZmlsZS5wY20+IC1vZiA8b3V0cHV0ZmlsZS5hYWM+IC1zciA8c2FtcGxlcmF0ZT4gLWNoIDxjaGFubmVsPiAtYnIgPGJpdHJhdGU+IC1hZHRzIDxhZHRzPiBcbiINCisiLWlmIGlucHV0IGZpbGUgbmFtZSBcbiINCisiLW9mIG91dHB1dCBmaWxlIG5hbWUgXG4iDQorIi1zciBpbnB1dCBwY20gc2FtcGxlcmF0ZSwgZGVmYXVsdCA0NDEwMCBcbiINCisiLWNoIGlucHV0IHBjbSBjaGFubmVsLCBkZWZhdWx0IDIgY2hhbm5lbCBcbiINCisiLWJyIGVuY29kZWQgYWFjIGJpdHJhdGUsIGRlZmF1bHQgNjQwMDAgKiAoc2FtcGxlcmF0ZS8xMDApKmNoYW5uZWwvNDQxKDQ4MClcbiINCisiLWFkdHMgYWRkIG9yIG5vIGFkdHMgaGVhZGVyLCBkZWZhdWx0IGFkZCBhZHRzIGhlYWRlclxuIg0KKyJGb3IgZXhhbXBsZTogXG4iDQorIi4vdm9BQUNFbmNUZXN0IC1pZiByYXcucGNtIC1vZiByYXcuYWFjIC1zciA0NDEwMCAtY2ggMiAtYnIgMTI4MDAwXG4iOw0KKw0KK3N0YXRpYyBpbnQgcGFyc2VjbWRsaW5lKGludCBhcmdjLCBjaGFyICoqYXJndixjaGFyICAqKmlucHV0X2ZpbGVuYW1lLCBjaGFyICAqKm91dHB1dF9maWxlbmFtZSwgQUFDRU5DX1BBUkFNICpwYXJhbSkNCit7DQorCS8vIG5vdGljZSB0aGF0Og0KKwkvLyBiaXRSYXRlL25DaGFubmVscyA+IDgwMDANCisJLy8gYml0UmF0ZS9uQ2hhbm5lbHMgPCAxNjAwMDAgDQorCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgc2FtcGxlUmF0ZSo2DQorCXBhcmFtLT5hZHRzVXNlZCA9IDE7DQorCXBhcmFtLT5iaXRSYXRlID0gMDsNCisJcGFyYW0tPm5DaGFubmVscyA9IDI7DQorCXBhcmFtLT5zYW1wbGVSYXRlID0gNDQxMDA7DQorDQorCWlmKGFyZ2MgPCA1IHx8IGFyZ2MgPiAxMykNCisJew0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCWFyZ2MtLTsNCisJYXJndisrOw0KKwl3aGlsZSAoYXJnYyA+IDApDQorCXsNCisJCWlmICghc3RyY21wKCphcmd2LCAiLWlmIikpDQorCQl7DQorCQkJYXJndisrOw0KKwkJCWFyZ2MtLTsNCisJCQkqaW5wdXRfZmlsZW5hbWUgPSAqYXJndjsgDQorCQl9DQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLW9mIikpDQorCQl7DQorCQkJYXJndisrOw0KKwkJCWFyZ2MtLTsNCisJCQkqb3V0cHV0X2ZpbGVuYW1lID0gKmFyZ3Y7DQorCQl9DQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLXNyIikpDQorCQl7DQorCQkJYXJndisrOw0KKwkJCWFyZ2MtLTsNCisJCQlwYXJhbS0+c2FtcGxlUmF0ZSA9IGF0b2koKmFyZ3YpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1jaCIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJcGFyYW0tPm5DaGFubmVscyA9IGF0b2koKmFyZ3YpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1iciIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJcGFyYW0tPmJpdFJhdGUgPSBhdG9pKCphcmd2KTsNCisJCX0NCisJCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1hZHRzIikpDQorCQl7DQorCQkJYXJndisrOw0KKwkJCWFyZ2MtLTsNCisJCQlwYXJhbS0+YWR0c1VzZWQgPSBhdG9pKCphcmd2KTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorDQorCQlhcmd2Kys7DQorCQlhcmdjLS07DQorCX0NCisNCisJaWYocGFyYW0tPmJpdFJhdGUgPT0gMCkNCisJew0KKwkJaW50IHNjYWxlID0gNDQxOw0KKwkJaWYocGFyYW0tPnNhbXBsZVJhdGUlODAwMCA9PSAwKQ0KKwkJCXNjYWxlID0gNDgwOw0KKwkJcGFyYW0tPmJpdFJhdGUgPSA2NDAqcGFyYW0tPm5DaGFubmVscypwYXJhbS0+c2FtcGxlUmF0ZS9zY2FsZTsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IFJlYWRGaWxlMkJ1ZihGSUxFKiBpbmZpbGUsdW5zaWduZWQgY2hhciogZGVzdCxpbnQgcmVhZFNpemUpDQorew0KKwlpbnQgcmVhZEJ5dGVzID0gMDsNCisJcmVhZEJ5dGVzID0gZnJlYWQoZGVzdCwgMSwgcmVhZFNpemUsIGluZmlsZSk7DQorCXJldHVybiByZWFkQnl0ZXM7DQorfQ0KKw0KK3R5cGVkZWYgaW50IChWT19BUEkgKiBWT0dFVEFVRElPREVDQVBJKSAoVk9fQVVESU9fQ09ERUNBUEkgKiBwRGVjSGFuZGxlKTsNCisNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQorew0KKwlGSUxFCQkJCQkJKmluZmlsZSwgKm91dGZpbGU7DQorCWludAkJCQkJCQl0MSwgdDI7DQorCVZPX0FVRElPX0NPREVDQVBJCQkJQXVkaW9BUEk7DQorCVZPX01FTV9PUEVSQVRPUgkJCQltb3BlcjsNCisJVk9fQ09ERUNfSU5JVF9VU0VSREFUQQkJdXNlRGF0YTsNCisJVk9fSEFORExFCQkJCQloQ29kZWM7DQorCVZPX0NPREVDQlVGRkVSCQkJCWluRGF0YTsNCisJVk9fQ09ERUNCVUZGRVIJCQkJb3V0RGF0YTsNCisJVk9fQVVESU9fT1VUUFVUSU5GTwkJCW91dEluZm87DQorICAgIGludAkJCQkJCQlmaXJzdFdyaXRlID0gMTsNCisJaW50CQkJCQkJCWVvZkZpbGUgPSAwOw0KKwlpbnQJCQkJCQkJKmluZm89KGludCopaW5CdWY7DQorCWludAkJCQkJCQlieXRlc0xlZnQsIG5SZWFkOw0KKwlpbnQJCQkJCQkJRW5jb2RlcmRGcmFtZSA9IDA7DQorCWludAkJCQkJCQl0b3RhbCA9IDA7DQorCWludAkJCQkJCQlpc091dHB1dCA9IDE7DQorCWludAkJCQkJCQlyZXR1cm5Db2RlOw0KKwlBQUNFTkNfUEFSQU0JCQkJYWFjcGFyYTsNCisJdm9pZAkJCQkJCSpoYW5kbGU7DQorCXZvaWQJCQkJCQkqcGZ1bmM7DQorCVZPR0VUQVVESU9ERUNBUEkJCQlwR2V0QVBJOw0KKwljb25zdCBjaGFyCQkJCQkqaW5maWxlTmFtZSA9IE5VTEw7DQorICAgIGNvbnN0IGNoYXIJCQkJCSpvdXRmaWxlTmFtZSA9IE5VTEw7DQorDQorCXJldHVybkNvZGUgPSBwYXJzZWNtZGxpbmUoYXJnYyxhcmd2LCAmaW5maWxlTmFtZSwgJm91dGZpbGVOYW1lLCAmYWFjcGFyYSk7DQorCWlmKHJldHVybkNvZGUpDQorCXsNCisJCXByaW50ZigiJXMiLCBIZWxwU3RyaW5nKTsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCS8qIG9wZW4gaW5wdXQgZmlsZSAqLw0KKwlpbmZpbGUgPSBmb3BlbihpbmZpbGVOYW1lLCAicmIiKTsNCisJaWYgKCFpbmZpbGUpIHsNCisJCXByaW50ZigiT3BlbiBpbnB1dCBmaWxlIGZhaWwuLi4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwkvKiBvcGVuIG91dHB1dCBmaWxlICovDQorCWlmKGlzT3V0cHV0KQ0KKwl7DQorCQlvdXRmaWxlID0gZm9wZW4ob3V0ZmlsZU5hbWUsICJ3YiIpOyANCisJCWlmICghb3V0ZmlsZSkgew0KKwkJCXByaW50ZigiT3BlbiBvdXRwdXQgZmlsZSBmYWlsLi4uIik7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKwl9DQorCS8vIHNldCBtZW1vcnkgb3BlcmF0b3JzOw0KKwltb3Blci5BbGxvYyA9IGNtbk1lbUFsbG9jOw0KKwltb3Blci5Db3B5ID0gY21uTWVtQ29weTsNCisJbW9wZXIuRnJlZSA9IGNtbk1lbUZyZWU7DQorCW1vcGVyLlNldCA9IGNtbk1lbVNldDsNCisJbW9wZXIuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisJdXNlRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsNCisJdXNlRGF0YS5tZW1EYXRhID0gKFZPX1BUUikoJm1vcGVyKTsNCisJLy8gb3BlbiBlbmNvZGVyIGRsbDsNCisJaGFuZGxlID0gZGxvcGVuKCIvZGF0YS9sb2NhbC90bXAvbGlidm9BQUNFbmN2Ny5zbyIsIFJUTERfTk9XKTsNCisJaWYoaGFuZGxlID09IDApDQorCXsNCisJCXByaW50Zigib3BlbiBkbGwgZXJyb3IuLi4uLi4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkvLyBHZXQgQVBJOw0KKwlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QUFDRW5jQVBJIik7CQ0KKwlpZihwZnVuYyA9PSAwKQ0KKwl7DQorCQlwcmludGYoIm9wZW4gZnVuY3Rpb24gZXJyb3IuLi4uLi4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlwR2V0QVBJID0gKFZPR0VUQVVESU9ERUNBUEkpcGZ1bmM7DQorCXJldHVybkNvZGUgID0gcEdldEFQSSgmQXVkaW9BUEkpOw0KKwlpZihyZXR1cm5Db2RlKQ0KKwkJcmV0dXJuIC0xOw0KKw0KKw0KKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgSW5pdCBFbmNvZGluZyBTZWN0aW9uICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLkluaXQoJmhDb2RlYywgVk9fQVVESU9fQ29kaW5nQUFDLCAmdXNlRGF0YSk7DQorCWlmKHJldHVybkNvZGUgPCAwKQ0KKwl7DQorCQlwcmludGYoIiMjIyMgVk9JX0Vycm9yMjpmYWlsIHRvIGluaXRpYWxpemUgdGhlIEVuY29kZXJyIyMjXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0UGFyYW0oaENvZGVjLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAmYWFjcGFyYSk7CQ0KKwkNCisJaW5EYXRhLkJ1ZmZlciA9IGluQnVmOw0KKwlieXRlc0xlZnQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLGluRGF0YS5CdWZmZXIsUkVBRF9TSVpFKTsNCisNCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICBFbmNvZGluZyBTZWN0aW9uICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisJDQorCWRvIHsNCisNCisJCWluRGF0YS5MZW5ndGggICAgPSBieXRlc0xlZnQ7DQorCQlvdXREYXRhLkJ1ZmZlciAgID0gb3V0QnVmOw0KKwkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7DQorDQorCQl0MSA9IGNsb2NrKCk7DQorCQkNCisJCXJldHVybkNvZGUgPSBBdWRpb0FQSS5TZXRJbnB1dERhdGEoaENvZGVjLCZpbkRhdGEpOw0KKwkJDQorCQlkbyB7DQorCQkJb3V0RGF0YS5CdWZmZXIgICA9IG91dEJ1ZjsNCisJCQlvdXREYXRhLkxlbmd0aCA9IDEwMjQqODsNCisNCisJCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuR2V0T3V0cHV0RGF0YShoQ29kZWMsJm91dERhdGEsICZvdXRJbmZvKTsNCisNCisJCQlpZihyZXR1cm5Db2RlID09IDApDQorCQkJCUVuY29kZXJkRnJhbWUrKzsNCisJCQlpZihyZXR1cm5Db2RlID09IFZPX0VSUl9MSUNFTlNFX0VSUk9SKQ0KKwkJCQlicmVhazsNCisNCisjaWYgVk9fQUFDX0VfT1VUUFVUDQorCQkJaWYgKGlzT3V0cHV0ICYmIHJldHVybkNvZGUgPT0gMCkNCisJCQl7DQorCQkJCWZ3cml0ZShvdXREYXRhLkJ1ZmZlciwgMSwgb3V0RGF0YS5MZW5ndGgsIG91dGZpbGUpOw0KKwkJCX0NCisjZW5kaWYNCisJCX0gd2hpbGUocmV0dXJuQ29kZSAhPSAoVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCkpOw0KKw0KKwkJaWYocmV0dXJuQ29kZSA9PSBWT19FUlJfTElDRU5TRV9FUlJPUikNCisJCQlicmVhazsNCisNCisJCXQyID0gY2xvY2soKTsNCisJCXRvdGFsICs9IHQyIC0gdDE7DQorDQorCQlpZiAoIWVvZkZpbGUpIHsNCisJCQluUmVhZCA9IFJlYWRGaWxlMkJ1ZihpbmZpbGUsIGluQnVmLFJFQURfU0laRSk7DQorCQkJYnl0ZXNMZWZ0ID0gblJlYWQ7DQorCQkJaW5EYXRhLkJ1ZmZlciA9IGluQnVmOw0KKwkJCWlmIChmZW9mKGluZmlsZSkpDQorCQkJCWVvZkZpbGUgPSAxOw0KKwkJfQ0KKw0KKwl9IHdoaWxlICghZW9mRmlsZSAmJiByZXR1cm5Db2RlKTsNCisNCisNCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgRW5kIEVuY29kaW5nIFNlY3Rpb24gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLlVuaW5pdChoQ29kZWMpOw0KKw0KKwlmY2xvc2UoaW5maWxlKTsNCisJaWYgKG91dGZpbGUpDQorICAgIHsNCisgICAgICAgIGZjbG9zZShvdXRmaWxlKTsNCisgICAgfQ0KKwlkbGNsb3NlKGhhbmRsZSk7DQorCXJldHVybiAwOw0KK30NCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IAlBQUNfRV9TQU1QTEVTLmMKKwkKK0xPQ0FMX1NSQ19GSUxFUyArPSAJXAorCS4uLy4uLy4uL0NvbW1vbi9jbW5NZW1vcnkuYyAKKworTE9DQUxfTU9EVUxFIDo9IFRlc3R2b0FBQ0VuYworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ2b0FBQ0VuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKExPQ0FMX1BBVEgpLyBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9Db21tb24gXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vSW5jbHVkZSBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKKwkKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjNWRjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKQEAgLTAsMCArMSw1NSBAQAorIy8qDQorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyoqDQorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMqKg0KKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyoqDQorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyovDQorDQorIyB0YXJnZXQ2DQorIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pDQorVk9UVDo9IHY3DQorDQorDQorIyBtb2R1bGUgdHlwZQ0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUNCitWT01UOj0gZXhlDQorDQorDQorIyBtb2R1bGUgbWFjcm9zDQorIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gDQorIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlIA0KK1ZPTU06PSAjQVJNVjVFDQorDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQ0KK1ZPVEFSR0VUOj0gdm9BQUNFbmNUZXN0djcNCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tayANCisNCisjIGRlcGVuZGVudCBsaWJyYXJpZXMuDQorVk9ERVBMSUJTOj0tbGRsDQorDQorIyBtb2R1bGUgc291cmNlDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUNCitpbmNsdWRlIC4uL21zLm1rDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkDQorVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uL1JlbGVhc2UvDQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL21zLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWE1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvbXMubWsKQEAgLTAsMCArMSwyMyBAQAorIy8qDQorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyoqDQorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMqKg0KKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyoqDQorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyovDQorDQorIyBwbGVhc2UgbGlzdCBhbGwgb2JqZWN0cyBuZWVkZWQgYnkgeW91ciB0YXJnZXQgaGVyZQ0KK09CSlM6PUFBQ19FX1NBTVBMRVMubwljbW5NZW1vcnkubw0KKwkJCQ0KKyMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZSANCitWT1NSQ0RJUjo9Li4vIC4uLy4uLy4uLy4uL2luY2x1ZGUgIC4uLy4uLy4uLy4uL0NvbW1vbg0KKwkJCQkJDQorCQkJCQ0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZG9pdC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZG9pdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWEwYjBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Ub29scy9kb2l0Lm1rCkBAIC0wLDAgKzEsMTMzIEBACisjLyoKKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyMgKioKKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjICoqCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKioKKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKworVkVSQk9TRTo9QAorCisKK1ZPTVQgPz0gbGliCisKK2lmZXEgKCQoVk9NVCksIGxpYikKK0xJQl9TVEFUSUM9JChWT1RBUkdFVCkuYQorTElCX0RZTkFNSUM9JChWT1RBUkdFVCkuc28KK2VuZGlmCisKK2lmZXEgKCQoVk9NVCksIGV4ZSkKK1RBUkdFVD0kKFZPVEFSR0VUKQorZW5kaWYKKworQ0ZMQUdTPSQoVk9DRkxBR1MpICQoYWRkcHJlZml4IC1JLCAkKFZPU1JDRElSKSkgCitDUFBGTEFHUz0kKFZPQ1BQRkxBR1MpICQoYWRkcHJlZml4IC1JLCAkKFZPU1JDRElSKSkgCitpZm5lcSAoJChWT1RUKSwgcGMpCitBU0ZMQUdTPSQoVk9BU0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpIAorZW5kaWYKKworTERGTEFHUzo9JChWT0xERkxBR1MpCitWT1RFREVQUys9JChWT0RFUExJQlMpCitWT1RMREVQUys9JChWT0RFUExJQlMpCitWT1NUQ0xJQlMgPz0KKwordnBhdGggJS5jICQoVk9TUkNESVIpCit2cGF0aCAlLmNwcCAkKFZPU1JDRElSKQoraWZuZXEgKCQoVk9UVCksIHBjKQordnBhdGggJS5zICQoVk9TUkNESVIpCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCBwYykKK0JMVERJUlM9JChWT1JFTERJUikvTGludXgvc3RhdGljCitCTFRESVJEPSQoVk9SRUxESVIpL0xpbnV4L3NoYXJlZAorZWxzZQorQkxURElSUz0kKFZPUkVMRElSKS9Hb29nbGUvJChWT05KKS9saWIvJChWT1RUKQorQkxURElSRD0kKFZPUkVMRElSKS9Hb29nbGUvJChWT05KKS9zby8kKFZPVFQpCitlbmRpZgorCisKKy5QUkVDSU9VUzogJChPQkpESVIpLyUubworCitpZmVxICgkKFZPTVQpLCBsaWIpCithbGw6IG1rZGlycyAkKExJQl9TVEFUSUMpICQoTElCX0RZTkFNSUMpCitta2RpcnM6ICQoT0JKRElSKSAkKEJMVERJUlMpICQoQkxURElSRCkKK2Vsc2UKK2FsbDogbWtkaXJzICQoVEFSR0VUKQorbWtkaXJzOiAkKE9CSkRJUikKK2VuZGlmCisKKyQoT0JKRElSKToKKwlAaWYgdGVzdCAhIC1kICRAOyB0aGVuIFwKKwkJbWtkaXIgLXAgJEA7IFwKKwlmaTsKKworaWZlcSAoJChWT01UKSwgbGliKQorJChCTFRESVJTKToKKwlAaWYgdGVzdCAhIC1kICRAOyB0aGVuIFwKKwkJbWtkaXIgLXAgJEA7IFwKKwlmaTsKKyQoQkxURElSRCk6CisJQGlmIHRlc3QgISAtZCAkQDsgdGhlbiBcCisJCW1rZGlyIC1wICRAOyBcCisJZmk7CitlbmRpZgorCisKK2lmZXEgKCQoVk9NVCksIGxpYikKKyQoTElCX1NUQVRJQyk6JChPQkpTKQorCSQoQVIpIGNyICRAICQoT0JKRElSKS8qLm8gJChWT1NUQ0xJQlMpCisJJChSQU5MSUIpICRACitpZm5lcSAoJChWT0RCRyksIHllcykKKwkjJChTVFJJUCkgJEAKK2VuZGlmCisKKyQoTElCX0RZTkFNSUMpOiQoT0JKUykKKwkkKEdHKSAkKExERkxBR1MpIC1vICRAICQoT0JKRElSKS8qLm8gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFZPU1RDTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAkKFZPVExERVBTKSAKK2lmbmVxICgkKFZPREJHKSwgeWVzKQorCQkkKFNUUklQKSAkQAorZW5kaWYKKworZWxzZQorCiskKFRBUkdFVCk6JChPQkpTKQorCSQoR0cpICQoTERGTEFHUykgLW8gJEAgJChPQkpESVIpLyoubyAtV2wsLS13aG9sZS1hcmNoaXZlICQoVk9TVENMSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlICQoVk9URURFUFMpCitpZm5lcSAoJChWT0RCRyksIHllcykKKwkkKFNUUklQKSAkQAorZW5kaWYKKworZW5kaWYKKworCisuU1VGRklYRVM6IC5jIC5jcHAgLnMgLm8KKy5jLm86CisJJChWRVJCT1NFKSAkKENDKSAkKENGTEFHUykgLW8gJChPQkpESVIpLyRAIC1jICQ8CisjJS5jOiQoT0JKRElSKS8lLm8KKyMJJChWRVJCT1NFKSAkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJDwKKy5jcHAubzoKKwkkKFZFUkJPU0UpICQoR0cpICQoQ1BQRkxBR1MpIC1vICQoT0JKRElSKS8kQCAtYyAkPAoraWZuZXEgKCQoVk9UVCksIHBjKQorLnMubzoKKwkkKFZFUkJPU0UpICQoQVMpICQoQVNGTEFHUykgLW8gJChPQkpESVIpLyRAICQ8CitlbmRpZgorCisKKy5QSE9OWTogY2xlYW4gZGV2ZWwKK2NsZWFuOgoraWZlcSAoJChWT01UKSwgbGliKQorCS1ybSAtZnIgJChPQkpESVIpIC4qLnN3KiAkKFZPVEFSR0VUKS4qCitlbHNlCisJLXJtIC1mciAkKE9CSkRJUikgLiouc3cqICQoVk9UQVJHRVQpCitlbmRpZgorCitkZXZlbDoKKwljcCAtYSAkKExJQl9TVEFUSUMpICQoQkxURElSUykKKwljcCAtYSAkKExJQl9EWU5BTUlDKSAkKEJMVERJUkQpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Ub29scy9lY2xhaXIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4ODM2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCkBAIC0wLDAgKzEsMTcyIEBACisjLyoKKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyMgKioKKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjICoqCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKioKKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKworIyBzcGVjaWFsIG1hY3JvIGRlZmluaXRpb25zIGZvciBidWlsZGluZyAKK1ZPUFJFREVGPS1ETElOVVggLURfTElOVVggCisKK1ZPUFJKID89IAorVk9OSiA/PSBlY2xhaXIKK1ZPVFQgPz0gdjYKKyMgY29udHJvbCB0aGUgdmVyc2lvbiB0byByZWxlYXNlIG91dAorIyBhdmFpbGFibGU6IGV2YShldmFsdWF0aW9uKSwgcmVsKHJlbGVhc2UpCitWT1ZFUj0KK2lmZXEgKCQoVk9WRVIpLCBldmEpCitWT1BSRURFRis9LURfX1ZPVkVSX0VWQV9fCitlbmRpZgorCisjIGZvciBkZWJ1ZyBvciBub3Q6IHllcyBmb3IgZGVidWcsIGFueSBvdGhlciBmb3IgcmVsZWFzZQorVk9EQkc/PXllCisKKyMgZm9yIGRldGVjdGluZyBtZW1vcnkgbGVhaworVk9ETUw9CitpZmVxICgkKFZPRE1MKSwgeWVzKQorVk9QUkVERUYrPS1ERE1FTUxFQUsKK2VuZGlmCisKK1ZPUFJFREVGKz0tRF9fVk9UVF9BUk1fXyAtRF9fVk9OSl9FQ0xBSVJfXworVENST09UUEFUSDo9L29wdC9lY2xhaXIKK0dDQ1ZFUjo9NC40LjAKK1RDUEFUSDo9JChUQ1JPT1RQQVRIKS9wcmVidWlsdC9saW51eC14ODYvdG9vbGNoYWluL2FybS1lYWJpLSQoR0NDVkVSKQorQ0NUUFJFOj0kKFRDUEFUSCkvYmluL2FybS1lYWJpLQorQVM6PSQoQ0NUUFJFKWFzCitBUjo9JChDQ1RQUkUpYXIKK05NOj0kKENDVFBSRSlubQorQ0M6PSQoQ0NUUFJFKWdjYworR0c6PSQoQ0NUUFJFKWcrKworTEQ6PSQoQ0NUUFJFKWxkCitTSVpFOj0kKENDVFBSRSlzaXplCitTVFJJUDo9JChDQ1RQUkUpc3RyaXAKK1JBTkxJQjo9JChDQ1RQUkUpcmFubGliCitPQkpDT1BZOj0kKENDVFBSRSlvYmpjb3B5CitPQkpEVU1QOj0kKENDVFBSRSlvYmpkdW1wCitSRUFERUxGOj0kKENDVFBSRSlyZWFkZWxmCitTVFJJTkdTOj0kKENDVFBSRSlzdHJpbmdzCisKKyMgdGFyZ2V0IHByb2R1Y3QgZGVwZW5kY3kKKyMgYXZhaWxhYmxlOiBkcmVhbSwgZ2VuZXJpYworVk9UUDo9c2FwcGhpcmUtb3BlbgorQ0NUTElCOj0kKFRDUk9PVFBBVEgpL291dC90YXJnZXQvcHJvZHVjdC8kKFZPVFApL29iai9saWIKK0NDVElOQzo9LUkkKFRDUk9PVFBBVEgpL3N5c3RlbS9jb3JlL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvaGFyZHdhcmUvcmlsL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9oYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2RhbHZpay9saWJuYXRpdmVoZWxwZXIvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2RhbHZpay9saWJuYXRpdmVoZWxwZXIvaW5jbHVkZS9uYXRpdmVoZWxwZXIgXAorCS1JJChUQ1JPT1RQQVRIKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSBcCisJLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9saWJzL2F1ZGlvZmxpbmdlciBcCisJLUkkKFRDUk9PVFBBVEgpL2V4dGVybmFsL3NraWEvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL291dC90YXJnZXQvcHJvZHVjdC8kKFZPVFApL29iai9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYmMvYXJjaC1hcm0vaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9rZXJuZWwvY29tbW9uIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYmMva2VybmVsL2FyY2gtYXJtIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYm0vaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJtL2luY2x1ZGUvYXJtIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYnRocmVhZF9kYi9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYm0vYXJtIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYm0gXAorCS1JJChUQ1JPT1RQQVRIKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUgCisJIy1JJChUQ1JPT1RQQVRIKS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJChWT1RQKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJtX2ludGVybWVkaWF0ZXMKKworQ0NUQ0ZMQUdTOj0tbXNvZnQtZmxvYXQgLW10aHVtYi1pbnRlcndvcmsgLWZuby1leGNlcHRpb25zIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZ1bndpbmQtdGFibGVzIC1mc3RhY2stcHJvdGVjdG9yIC1mbm8tc2hvcnQtZW51bXMgLWZtZXNzYWdlLWxlbmd0aD0wIC1maW5saW5lLWZ1bmN0aW9ucyAtZmlubGluZS1saW1pdD02MDAgLWZuby1pbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIC1mZ2NzZS1hZnRlci1yZWxvYWQgLWZyZXJ1bi1jc2UtYWZ0ZXItbG9vcCAtZnJlbmFtZS1yZWdpc3RlcnMgLWZzdHJpY3QtYWxpYXNpbmcgLWZ1bnN3aXRjaC1sb29wcworIy1md2lkZS1leGVjLWNoYXJzZXQ9Y2hhcnNldD1VVEYtMzIgCisKKyMgZm9yIHRhcmdldCBleGUKK1RFTERGTEFHUzo9LW5vc3RkbGliIC1CZHluYW1pYyAtV2wsLVQsJChUQ1JPT1RQQVRIKS9idWlsZC9jb3JlL2FybWVsZi54IC1XbCwtZHluYW1pYy1saW5rZXIsL3N5c3RlbS9iaW4vbGlua2VyIC1XbCwtLWdjLXNlY3Rpb25zIC1XbCwteixub2NvcHlyZWxvYyAtV2wsLS1uby11bmRlZmluZWQgLVdsLC1ycGF0aC1saW5rPSQoQ0NUTElCKSAtTCQoQ0NUTElCKSAKKworVk9URURFUFM6PSQoQ0NUTElCKS9jcnRiZWdpbl9keW5hbWljLm8gJChDQ1RMSUIpL2NydGVuZF9hbmRyb2lkLm8gJChUQ1BBVEgpL2xpYi9nY2MvYXJtLWVhYmkvJChHQ0NWRVIpL2ludGVyd29yay9saWJnY2MuYSAtbGMgLWxtCisKKyMgZm9yIHRhcmdldCBsaWIKK1RMTERGTEFHUzo9LW5vc3RkbGliIC1XbCwtVCwkKFRDUk9PVFBBVEgpL2J1aWxkL2NvcmUvYXJtZWxmLnhzYyAtV2wsLS1nYy1zZWN0aW9ucyAtV2wsLXNoYXJlZCwtQnN5bWJvbGljIC1MJChDQ1RMSUIpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgLVdsLC0tbm8tdW5kZWZpbmVkICQoVENQQVRIKS9saWIvZ2NjL2FybS1lYWJpLyQoR0NDVkVSKS9pbnRlcndvcmsvbGliZ2NjLmEgCisKK1ZPVExERVBTOj0tbG0gLWxjCisKKworaWZlcSAoJChWT1RUKSwgdjQpCitWT0NGTEFHUzo9LW10dW5lPWFybTl0ZG1pIC1tYXJjaD1hcm12NHQKK1ZPQVNGTEFHUzo9LW1hcmNoPWFybXY0dCAtbWZwdT1zb2Z0ZnBhCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NSkKK1ZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjV0ZQorVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjV0ZSAtbWZwdT12ZnAKK2VuZGlmCisKK2lmZXEgKCQoVk9UVCksIHY1eCkKK1ZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjV0ZSAtbXR1bmU9eHNjYWxlCitWT0FTRkxBR1M6PS1tYXJjaD1hcm12NXRlIC1tZnB1PXZmcAorZW5kaWYKKworaWZlcSAoJChWT1RUKSwgdjYpCisjVk9DRkxBR1M6PS1tYXJjaD1hcm12NiAtbXR1bmU9YXJtMTEzNmpmLXMgCisjVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjYKK1ZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjZqIC1tdHVuZT1hcm0xMTM2amYtcyAtbWZwdT12ZnAgLW1mbG9hdC1hYmk9c29mdGZwIC1tYXBjcyAtbXRwY3MtbGVhZi1mcmFtZSAtbWxvbmctY2FsbHMKK1ZPQVNGTEFHUzo9LW1hcmNoPWFybXY2aiAtbWNwdT1hcm0xMTM2amYtcyAtbWZwdT1hcm0xMTM2amYtcyAtbWZsb2F0LWFiaT1zb2Z0ZnAgLW1hcGNzLWZsb2F0IC1tYXBjcy1yZWVudHJhbnQKK2VuZGlmCisKKyMKKyMgZ2xvYmFsIGxpbmsgb3B0aW9ucworVk9MREZMQUdTOj0tV2wsLXgsLVgsLS1hcy1uZWVkZWQKKworCitpZmVxICgkKFZPVFQpLCB2NykKK1ZPQ0ZMQUdTKz0tbWFyY2g9YXJtdjctYSAtbXR1bmU9Y29ydGV4LWE4IC1tZnB1PW5lb24gLW1mbG9hdC1hYmk9c29mdGZwCitWT0FTRkxBR1MrPS1tYXJjaD1hcm12Ny1hIC1tY3B1PWNvcnRleC1hOCAtbWZwdT1uZW9uIC1tZmxvYXQtYWJpPXNvZnRmcAorVk9MREZMQUdTKz0tV2wsLS1maXgtY29ydGV4LWE4CitlbmRpZgorCisjZ2xvYmFsIGNvbXBpbGluZyBvcHRpb25zIGZvciBBUk0gdGFyZ2V0CitpZm5lcSAoJChWT1RUKSwgcGMpCitWT0FTRkxBR1MrPS0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgLVIKK2VuZGlmIAorCisKK2lmZXEgKCQoVk9EQkcpLCB5ZXMpCitWT0NGTEFHUys9LURfREVCVUcgLWcKK2Vsc2UKK1ZPQ0ZMQUdTKz0tRE5ERUJVRyAtTzMKK2VuZGlmCisKK1ZPQ0ZMQUdTKz0kKFZPUFJFREVGKSAkKFZPTU0pIC1XYWxsIC1mc2lnbmVkLWNoYXIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1sZWFkaW5nLXVuZGVyc2NvcmUgLWZwaWMgLWZQSUMgLXBpcGUgLWZ0cmFjZXIgLWZmb3JjZS1hZGRyIC1mbm8tYm91bmRzLWNoZWNrICMtZnZpc2liaWxpdHk9aGlkZGVuICMtZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4gIyMtZnRyZWUtbG9vcC1saW5lYXIgIC1tdGh1bWIgLW5vc3RkaW5jICAtZEQgLWZwcmVmZXRjaC1sb29wLWFycmF5cworCisKK2lmbmVxICgkKFZPVFQpLCBwYykKK1ZPQ0ZMQUdTKz0kKENDVENGTEFHUykgJChDQ1RJTkMpCitWT0NQUEZMQUdTOj0tZm5vLXJ0dGkgJChWT0NGTEFHUykKKworaWZlcSAoJChWT01UKSwgZXhlKQorVk9MREZMQUdTKz0kKFRFTERGTEFHUykKK2VuZGlmCisKK2lmZXEgKCQoVk9NVCksIGxpYikKK1ZPTERGTEFHUys9JChUTExERkxBR1MpCitlbmRpZgorZWxzZQorVk9DUFBGTEFHUzo9JChWT0NGTEFHUykKK2lmZXEgKCQoVk9NVCksIGxpYikKK1ZPTERGTEFHUys9LXNoYXJlZAorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoVk9EQkcpLCB5ZXMpCisjVk9MREZMQUdTOj0KK2VuZGlmCisKKyMgd2hlcmUgdG8gcGxhY2Ugb2JqZWN0IGZpbGVzIAorT0JKRElSPW9iagorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1N2YzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaApAQCAtMCwwICsxLDExNjYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJhc2ljb3AyLmgNCisNCisJQ29udGVudDoJQ29uc3RhbnRzICwgR2xvYmFscyBhbmQgQmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMuDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0JBU0lDX09QX0gKKyNkZWZpbmUgX19CQVNJQ19PUF9IDQorCisjaW5jbHVkZSAidHlwZWRlZi5oIgorCisjZGVmaW5lIE1BWF8zMiAoV29yZDMyKTB4N2ZmZmZmZmZMCisjZGVmaW5lIE1JTl8zMiAoV29yZDMyKTB4ODAwMDAwMDBMCisKKyNkZWZpbmUgTUFYXzE2IChXb3JkMTYpMHg3ZmZmCisjZGVmaW5lIE1JTl8xNiAoV29yZDE2KTB4ODAwMAorI2RlZmluZSBBQlMoYSkJKChhKSA+PSAwKSA/IChhKSA6ICgtKGEpKQ0KKw0KKy8qIFNob3J0IGFicywgICAgICAgICAgIDEgICAqLw0KKyNkZWZpbmUgYWJzX3MoeCkgICAgICAgKChXb3JkMTYpKCgoeCkgIT0gTUlOXzE2KSA/ICgoKHgpID49IDApID8gKHgpIDogKC0oeCkpKSA6IE1BWF8xNikpDQorDQorLyogMTYgYml0IHZhcjEgLT4gTVNCLCAgICAgMiAqLw0KKyNkZWZpbmUgTF9kZXBvc2l0X2goeCkgKCgoV29yZDMyKSh4KSkgPDwgMTYpDQorDQorDQorLyogMTYgYml0IHZhcjEgLT4gTFNCLCAgICAgMiAqLw0KKyNkZWZpbmUgTF9kZXBvc2l0X2woeCkgKChXb3JkMzIpKHgpKQ0KKw0KKw0KKy8qIExvbmcgYWJzLCAgICAgICAgICAgICAgMyAgKi8NCisjZGVmaW5lIExfYWJzKHgpICgoKHgpICE9IE1JTl8zMikgPyAoKCh4KSA+PSAwKSA/ICh4KSA6ICgtKHgpKSkgOiBNQVhfMzIpDQorDQorDQorLyogU2hvcnQgbmVnYXRlLCAgICAgICAgMSAgICovDQorI2RlZmluZSBuZWdhdGUodmFyMSkgKChXb3JkMTYpKCgodmFyMSkgPT0gTUlOXzE2KSA/IE1BWF8xNiA6ICgtKHZhcjEpKSkpDQorDQorDQorLyogTG9uZyBuZWdhdGUsICAgICAyICovDQorI2RlZmluZSBMX25lZ2F0ZShMX3ZhcjEpICgoKExfdmFyMSkgPT0gKE1JTl8zMikpID8gKE1BWF8zMikgOiAoLShMX3ZhcjEpKSkNCisNCisNCisjZGVmaW5lIE1VTEhJR0goQSxCKSAoaW50KSgoKFdvcmQ2NCkoQSkqKFdvcmQ2NCkoQikpID4+IDMyKQ0KKyNkZWZpbmUgZml4bXVsKGEsIGIpIChpbnQpKCgoKFdvcmQ2NCkoYSkqKFdvcmQ2NCkoYikpID4+IDMyKSA8PCAxKQ0KKw0KKw0KKyNpZiAgKFNBVFJVQVRFX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSk7DQorI2Vsc2UNCitXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSk7DQorI2VuZGlmDQorDQorLyogU2hvcnQgc2hpZnQgbGVmdCwgICAgMSAgICovDQorI2lmIChTSExfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IHNoaWZ0IHJpZ2h0LCAgIDEgICAqLw0KKyNpZiAoU0hSX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisjaWYgKExfTVVMVF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIE1zdSwgIDEgICovDQorI2lmIChMX01TVV9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKyAgICANCisvKiBMb25nIHN1YiwgICAgICAgIDIgKi8NCisjaWYgKExfU1VCX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zdWIoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7DQorI2Vsc2UNCitXb3JkMzIgTF9zdWIoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7DQorI2VuZGlmDQorDQorLyogTG9uZyBzaGlmdCBsZWZ0LCAyICovDQorI2lmIChMX1NITF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMzIgTF9zaGwgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBMb25nIHNoaWZ0IHJpZ2h0LCAyKi8NCisjaWYgKExfU0hSX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IGFkZCwgICAgICAgICAgIDEgICAqLw0KKyNpZiAoQUREX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisgICAgDQorLyogU2hvcnQgc3ViLCAgICAgICAgICAgMSAgICovDQorI2lmIChTVUJfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovDQorI2lmIChESVZfU19JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IG11bHQsICAgICAgICAgIDEgICAqLw0KKyNpZiAoTVVMVF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaG9ydCBub3JtLCAgICAgICAgICAgMTUgICovDQorI2lmIChOT1JNX1NfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsNCisjZWxzZQ0KK1dvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsNCisjZW5kaWYNCisNCisvKiBMb25nIG5vcm0sICAgICAgICAgICAgMzAgICovDQorI2lmIChOT1JNX0xfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbHNlDQorV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSk7DQorI2VuZGlmDQorDQorLyogUm91bmQsICAgICAgICAgICAgICAgMSAgICovDQorI2lmIChST1VORF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7DQorI2Vsc2UNCitXb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKTsNCisjZW5kaWYNCisNCisvKiBNYWMsICAxICAqLw0KKyNpZiAoTF9NQUNfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisjaWYgKExfQUREX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOw0KKyNlbHNlDQorV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsNCisjZW5kaWYNCisNCisvKiBFeHRyYWN0IGhpZ2gsICAgICAgICAxICAgKi8NCisjaWYgKEVYVFJBQ1RfSF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSk7DQorI2Vsc2UNCitXb3JkMTYgZXh0cmFjdF9oIChXb3JkMzIgTF92YXIxKTsNCisjZW5kaWYNCisNCisvKiBFeHRyYWN0IGxvdywgICAgICAgICAxICAgKi8NCisjaWYgKEVYVFJBQ1RfTF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKTsNCisjZWxzZQ0KK1dvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSk7DQorI2VuZGlmDQorDQorLyogTXVsdCB3aXRoIHJvdW5kLCAyICovDQorI2lmIChNVUxUX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBtdWx0X3IoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBtdWx0X3IoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaGlmdCByaWdodCB3aXRoIHJvdW5kLCAyICAgICAgICAgICAqLw0KKyNpZiAoU0hSX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBNYWMgd2l0aCByb3VuZGluZywyICovDQorI2lmIChNQUNfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIE1zdSB3aXRoIHJvdW5kaW5nLDIgKi8NCisjaWYgKE1TVV9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogTG9uZyBzaGlmdCByaWdodCB3aXRoIHJvdW5kLCAgMyAgICAgICAgICAgICAqLw0KKyNpZiAoTF9TSFJfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorI2lmIEFSTVY0X0lOQVNNDQorX19pbmxpbmUgV29yZDMyIEFTTV9MX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIk1PViAlW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNSICVbdmFyMl0gXG4iIA0KKwkJOltyZXN1bHRdIj1yIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsJDQorfQ0KKyANCitfX2lubGluZSBXb3JkMzIgQVNNX0xfc2hsKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiTU9WCXIyLCAlW0xfdmFyMV0gXG4iDQorCQkiTU9WCXIzLCAjMHg3ZmZmZmZmZlxuIg0KKwkJIk1PVgklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl0gXG4iIA0KKwkJIlRFUQlyMiwgJVtyZXN1bHRdLCBBU1IgJVt2YXIyXVxuIg0KKwkJIkVPUk5FICAlW3Jlc3VsdF0scjMscjIsQVNSIzMxXG4iDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCToicjIiLCAicjMiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsJDQorfQ0KKw0KK19faW5saW5lIFdvcmQzMiBBU01fc2hyKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiQ01QCSVbdmFyMl0sICMxNVxuIg0KKwkJIk1PVkdFICAlW3ZhcjJdLCAjMTVcbiINCisJCSJNT1YJJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTUiAlW3ZhcjJdXG4iDQorCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMikgDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsJDQorfSANCisNCitfX2lubGluZSBXb3JkMzIgQVNNX3NobChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIkNNUAklW3ZhcjJdLCAjMTZcbiINCisJCSJNT1ZHRSAgJVt2YXIyXSwgIzE2XG4iDQorCQkiTU9WICAgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXVxuIg0KKwkJIk1PViAgICByMywgIzFcbiINCisgICAgICAgICJNT1YgICAgcjIsICVbcmVzdWx0XSwgQVNSICMxNVxuIg0KKyAgICAgICAgIlJTQiAgICByMyxyMyxyMyxMU0wgIzE1IFxuIg0KKyAgICAgICAgIlRFUSAgICByMiwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIg0KKyAgICAgICAgIkVPUk5FICAlW3Jlc3VsdF0sIHIzLCAlW3Jlc3VsdF0sQVNSICMzMSINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQ0KKwkJOiJyMiIsICJyMyINCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0OwkNCit9IA0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBkZWZpbml0aW9ucyBmb3IgaW5saW5lIGJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKFNBVFJVQVRFX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSkNCit7DQorI2lmIEFSTVY1VEVfU0FUDQorCVdvcmQxNiByZXN1bHQ7DQorCWFzbSB2b2xhdGlsZSAoDQorCQkiTU9WCSVbcmVzdWx0XSwgJVtMX3ZhcjFdXG4iDQorCQkiTU9WCXIzLCAjMVxuIg0KKwkJIk1PVglyMiwlW0xfdmFyMV0sQVNSIzE1XG4iDQorCQkiUlNCCXIzLCByMywgcjMsIExTTCAjMTVcbiINCisJCSJURVEJcjIsJVtMX3ZhcjFdLEFTUiMzMVxuIgkNCisJCSJFT1JORQklW3Jlc3VsdF0scjMsJVtMX3ZhcjFdLEFTUiMzMVxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKQ0KKwkJOiJyMiIsICJyMyIJCQkNCisJKTsNCisNCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgDQorICAgIC8vdmFyX291dCA9IChMX3ZhcjEgPiAoV29yZDMyKTBYMDAwMDdmZmZMKSA/IChNQVhfMTYpIDogKChMX3ZhcjEgPCAoV29yZDMyKTB4ZmZmZjgwMDBMKSA/IChNSU5fMTYpIDogKChXb3JkMTYpTF92YXIxKSk7DQorDQorICAgIGlmIChMX3ZhcjEgPiAwWDAwMDA3ZmZmTCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IE1BWF8xNjsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGZmZmY4MDAwTCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IE1JTl8xNjsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2woTF92YXIxKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBTaG9ydCBzaGlmdCBsZWZ0LCAgICAxICAgKi8NCisjaWYgKFNITF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9TSEwNCisJaWYodmFyMj49MCkNCisJew0KKwkJcmV0dXJuIEFTTV9zaGwoIHZhcjEsIHZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuIEFTTV9zaHIoIHZhcjEsIC12YXIyKTsNCisJfQ0KKyNlbHNlDQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKyAgICBXb3JkMzIgcmVzdWx0Ow0KKw0KKyAgICBpZiAodmFyMiA8IDApDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBzaHIgKHZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcmVzdWx0ID0gKFdvcmQzMikgdmFyMSAqKChXb3JkMzIpIDEgPDwgdmFyMik7DQorDQorICAgICAgICBpZiAoKHZhcjIgPiAxNSAmJiB2YXIxICE9IDApIHx8IChyZXN1bHQgIT0gKFdvcmQzMikgKChXb3JkMTYpIHJlc3VsdCkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA+IDApID8gTUFYXzE2IDogTUlOXzE2KTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgc2hpZnQgcmlnaHQsICAgMSAgICovDQorI2lmIChTSFJfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfU0hSDQorCWlmKHZhcjI+PTApDQorCXsNCisJCXJldHVybiAgQVNNX3NociggdmFyMSwgdmFyMik7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4gIEFTTV9zaGwoIHZhcjEsIC12YXIyKTsNCisJfQ0KKyNlbHNlDQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMiA8IDApDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBzaGwgKHZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPj0gMTUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxIDwgMCkgPyAtMSA6IDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICh2YXIxIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh+KCh+dmFyMSkgPj4gdmFyMikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikodmFyMSA+PiB2YXIyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorDQorI2lmIChMX01VTFRfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9MX01VTFQNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIgDQorCQkiUUFERCAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdIFxuIiANCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBMX3Zhcl9vdXQgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOw0KKw0KKyAgICBpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPDw9IDE7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7DQorICAgIH0NCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWYgKExfTVNVX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9NU1UNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIgDQorCQkiUUFERCAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdIFxuIg0KKwkJIlFTVUIgJVtyZXN1bHRdLCAlW0xfdmFyM10sICVbcmVzdWx0XVxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyM10iciIoTF92YXIzKSwgW3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0Ow0KKyNlbHNlDQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3Byb2R1Y3Q7DQorDQorICAgIExfcHJvZHVjdCA9IExfbXVsdCh2YXIxLCB2YXIyKTsNCisgICAgTF92YXJfb3V0ID0gTF9zdWIoTF92YXIzLCBMX3Byb2R1Y3QpOw0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorI2VuZGlmDQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoTF9TVUJfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9MX1NVQg0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJRU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW0xfdmFyMl1cbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOltMX3ZhcjFdInIiKExfdmFyMSksIFtMX3ZhcjJdInIiKExfdmFyMikNCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0Ow0KKyNlbHNlDQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIExfdmFyX291dCA9IExfdmFyMSAtIExfdmFyMjsNCisNCisgICAgaWYgKCgoTF92YXIxIF4gTF92YXIyKSAmIE1JTl8zMikgIT0gMCkNCisgICAgew0KKyAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyBNSU5fMzIgOiBNQVhfMzI7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWYgKExfU0hMX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyNpZiBBUk1WNVRFX0xfU0hMDQorICAgIGlmKHZhcjI+PTApDQorICAgIHsNCisgICAgICAgIHJldHVybiAgQVNNX0xfc2hsKCBMX3ZhcjEsIHZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcmV0dXJuICBBU01fTF9zaHIoIExfdmFyMSwgLXZhcjIpOw0KKyAgICB9DQorI2Vsc2UNCisgICAgV29yZDMyIExfdmFyX291dCA9IDBMOw0KKw0KKyAgICBpZiAodmFyMiA8PSAwKQ0KKyAgICB7DQorICAgICAgICBMX3ZhcjEgPSBMX3NocihMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKExfdmFyMSA+IChXb3JkMzIpIDBYM2ZmZmZmZmZMKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE1BWF8zMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4YzAwMDAwMDBMKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOXzMyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIExfdmFyMSA8PD0gMTsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChMX3ZhcjEpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWYgKExfU0hSX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9MX1NIUg0KKwlpZih2YXIyPj0wKQ0KKwl7DQorCQlyZXR1cm4gQVNNX0xfc2hyKCBMX3ZhcjEsIHZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuIEFTTV9MX3NobCggTF92YXIxLCAtdmFyMik7DQorCX0NCisjZWxzZQ0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMiA8IDApDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IExfc2hsIChMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPj0gMzEpDQorICAgICAgICB7DQorICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IC0xIDogMDsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoTF92YXIxIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExfdmFyX291dCA9IH4oKH5MX3ZhcjEpID4+IHZhcjIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgPj4gdmFyMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBTaG9ydCBhZGQsICAgICAgICAgICAxICAgKi8NCisjaWYgKEFERF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9BREQNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiQUREICAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iIA0KKwkJIk1PViAgcjMsICMweDFcbiINCisJCSJNT1YgIHIyLCAlW3Jlc3VsdF0sIEFTUiAjMTVcbiINCisJCSJSU0IgIHIzLCByMywgcjMsIExTTCwgIzE1XG4iDQorCQkiVEVRICByMiwgJVtyZXN1bHRdLCBBU1IgIzMxXG4iDQorCQkiRU9STkUgJVtyZXN1bHRdLCByMywgJVtyZXN1bHRdLCBBU1IgIzMxIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCToicjIiLCAicjMiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfc3VtOw0KKw0KKyAgICBMX3N1bSA9IChXb3JkMzIpIHZhcjEgKyB2YXIyOw0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9zdW0pOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBTaG9ydCBzdWIsICAgICAgICAgICAxICAgKi8NCisjaWYgKFNVQl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyNpZiBBUk1WNVRFX1NVQg0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJNT1YgICByMywgIzFcbiINCisJCSJTVUIgICAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCQkNCisJCSJSU0IgICByMyxyMyxyMyxMU0wjMTVcbiINCisJCSJNT1YgICByMiwgJVt2YXIxXSwgQVNSICMxNSBcbiIgDQorCQkiVEVRICAgcjIsICVbdmFyMV0sIEFTUiAjMzEgXG4iDQorCQkiRU9STkUgJVtyZXN1bHRdLCByMywgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCToicjIiLCAicjMiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfZGlmZjsNCisNCisgICAgTF9kaWZmID0gKFdvcmQzMikgdmFyMSAtIHZhcjI7DQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOw0KKyAgIA0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovDQorI2lmIChESVZfU19JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dCA9IDA7DQorICAgIFdvcmQxNiBpdGVyYXRpb247DQorICAgIFdvcmQzMiBMX251bTsNCisgICAgV29yZDMyIExfZGVub207DQorDQorICAgIHZhcl9vdXQgPSBNQVhfMTY7DQorICAgIGlmICh2YXIxIT0gdmFyMikvL3ZhcjEhPSB2YXIyDQorICAgIHsNCisgICAgCXZhcl9vdXQgPSAwOw0KKyAgICAJTF9udW0gPSAoV29yZDMyKSB2YXIxOw0KKyAgICANCisgICAgCUxfZGVub20gPSAoV29yZDMyKSB2YXIyOw0KKyAgICAJDQorCQkvL3JldHVybiAoTF9udW08PDE1KS92YXIyOw0KKw0KKyAgICAJZm9yIChpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCAxNTsgaXRlcmF0aW9uKyspDQorICAgIAl7DQorICAgIAkJdmFyX291dCA8PD0gMTsNCisgICAgCQlMX251bSA8PD0gMTsNCisgICAgCQkNCisgICAgCQlpZiAoTF9udW0gPj0gTF9kZW5vbSkNCisgICAgCQl7DQorICAgIAkJCUxfbnVtIC09IExfZGVub207DQorICAgIAkJCXZhcl9vdXQrKzsNCisgICAgCQl9DQorICAgIAl9DQorICAgIH0NCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgbXVsdCwgICAgICAgICAgMSAgICovDQorI2lmIChNVUxUX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9NVUxUDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIlNNVUxCQiByMiwgJVt2YXIxXSwgJVt2YXIyXSBcbiINCisJCSJNT1YJcjMsICMxXG4iDQorCQkiTU9WCSVbcmVzdWx0XSwgcjIsIEFTUiAjMTVcbiINCisJCSJSU0IJcjMsIHIzLCByMywgTFNMICMxNVxuIg0KKwkJIk1PVglyMiwgJVtyZXN1bHRdLCBBU1IgIzE1XG4iDQorCQkiVEVRCXIyLCAlW3Jlc3VsdF0sIEFTUiAjMzFcbiINCisJCSJFT1JORSAgJVtyZXN1bHRdLCByMywgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCToicjIiLCAicjMiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfcHJvZHVjdDsNCisNCisgICAgTF9wcm9kdWN0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsNCisgICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsNCisgICAgaWYgKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKQ0KKyAgICAgICAgTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7DQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3QpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisNCisvKiBTaG9ydCBub3JtLCAgICAgICAgICAgMTUgICovDQorI2lmIChOT1JNX1NfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKQ0KK3sNCisjaWYgQVJNVjVURV9OT1JNX1MNCisJV29yZDE2IHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiTU9WICAgcjIsJVt2YXIxXSBcbiINCisJCSJDTVAgICByMiwgIzBcbiINCisJCSJSU0JMVCAlW3ZhcjFdLCAlW3ZhcjFdLCAjMCBcbiINCisJCSJDTFpORSAlW3Jlc3VsdF0sICVbdmFyMV1cbiINCisJCSJTVUJORSAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgIzE3XG4iDQorCQkiTU9WRVEgJVtyZXN1bHRdLCAjMFxuIg0KKwkJIkNNUCAgIHIyLCAjLTFcbiINCisJCSJNT1ZFUSAlW3Jlc3VsdF0sICMxNVxuIiANCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOlt2YXIxXSJyIih2YXIxKQ0KKwkJOiJyMiINCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0Ow0KKyNlbHNlDQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMSA9PSAwKQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gMDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmICh2YXIxID09IC0xKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAxNTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFyMSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXIxID0gKFdvcmQxNil+dmFyMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgdmFyMSA8IDB4NDAwMDsgdmFyX291dCsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyMSA8PD0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLw0KKyNpZiAoTk9STV9MX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQ0KK3sNCisjaWYgQVJNVjVURV9OT1JNX0wNCisJV29yZDE2IHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiQ01QICAgICVbTF92YXIxXSwgIzBcbiINCisJCSJDTFpORSAgJVtyZXN1bHRdLCAlW0xfdmFyMV1cbiINCisJCSJTVUJORSAgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICMxXG4iIA0KKwkJIk1PVkVRICAlW3Jlc3VsdF0sICMwXG4iDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICAvL1dvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICAvL2lmIChMX3ZhcjEgPT0gMCkNCisgICAgLy97DQorICAgIC8vICAgIHZhcl9vdXQgPSAwOw0KKyAgICAvL30NCisgICAgLy9lbHNlDQorICAgIC8vew0KKyAgICAvLyAgICBpZiAoTF92YXIxID09IChXb3JkMzIpIDB4ZmZmZmZmZmZMKQ0KKyAgICAvLyAgICB7DQorICAgIC8vICAgICAgICB2YXJfb3V0ID0gMzE7DQorICAgIC8vICAgIH0NCisgICAgLy8gICAgZWxzZQ0KKyAgICAvLyAgICB7DQorICAgIC8vICAgICAgICBpZiAoTF92YXIxIDwgMCkNCisgICAgLy8gICAgICAgIHsNCisgICAgLy8gICAgICAgICAgICBMX3ZhcjEgPSB+TF92YXIxOw0KKyAgICAvLyAgICAgICAgfQ0KKyAgICAvLyAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgTF92YXIxIDwgKFdvcmQzMikgMHg0MDAwMDAwMEw7IHZhcl9vdXQrKykNCisgICAgLy8gICAgICAgIHsNCisgICAgLy8gICAgICAgICAgICBMX3ZhcjEgPDw9IDE7DQorICAgIC8vICAgICAgICB9DQorICAgIC8vICAgIH0NCisgICAgLy99DQorICAgIC8vcmV0dXJuICh2YXJfb3V0KTsNCisgIFdvcmQxNiBhMTY7DQorICBXb3JkMTYgciA9IDAgOyAgICAgICANCisNCisgICANCisgIGlmICggTF92YXIxIDwgMCApIHsNCisgICAgTF92YXIxID0gfkxfdmFyMTsgDQorICB9DQorDQorICBpZiAoMCA9PSAoTF92YXIxICYgMHg3ZmZmODAwMCkpIHsNCisgICAgYTE2ID0gZXh0cmFjdF9sKExfdmFyMSk7DQorICAgIHIgKz0gMTY7DQorICAgICAgIA0KKyAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ZjgwKSkgew0KKyAgICAgIHIgKz0gODsNCisgICAgICAgICANCisgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDc4KSkgew0KKyAgICAgICAgciArPSA0Ow0KKyAgICAgICAgICAgDQorICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA2KSkgew0KKyAgICAgICAgICByICs9IDI7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA0KSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA2MCkpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gDQorICAgIGVsc2UgeyANCisgICAgICAgICANCisgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ODAwKSkgew0KKyAgICAgICAgciArPSA0Ow0KKyAgICAgICAgICAgDQorICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNjAwKSkgew0KKyAgICAgICAgICByICs9IDI7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMTAwKSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNDAwKSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NjAwMCkpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NDAwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBhMTYgPSBleHRyYWN0X2goTF92YXIxKTsNCisgICAgICAgDQorICAgIGlmICgwID09IChhMTYgJiAweDdmODApKSB7DQorICAgICAgciArPSA4Ow0KKyAgICAgICAgIA0KKyAgICAgIGlmICgwID09IChhMTYgJiAweDAwNzgpKSB7DQorICAgICAgICByICs9IDQgOw0KKyAgICAgICAgICAgDQorICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA2KSkgew0KKyAgICAgICAgICByICs9IDI7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA0KSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIHsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA2MCkpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICAgDQorICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NzgwMCkpIHsNCisgICAgICAgIHIgKz0gNDsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDYwMCkpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDEwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICAgICANCisgICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7DQorICAgICAgICAgIHIgKz0gMjsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDEwMDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDQwMDApKSB7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIA0KKyAgcmV0dXJuIHIgOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBSb3VuZCwgICAgICAgICAgICAgICAxICAgKi8NCisjaWYgKFJPVU5EX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKQ0KK3sNCisjaWYgQVJNVjVURV9ST1VORA0KKwlXb3JkMTYgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJNT1YgICByMSwjMHgwMDAwODAwMFxuIg0KKwkJIlFBREQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCByMVxuIg0KKwkJIk1PViAgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCBBU1IgIzE2IFxuIiANCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOltMX3ZhcjFdInIiKExfdmFyMSkNCisJCToicjEiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZSAgIA0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfcm91bmRlZDsNCisNCisgICAgTF9yb3VuZGVkID0gTF9hZGQgKExfdmFyMSwgKFdvcmQzMikgMHgwMDAwODAwMEwpOw0KKyAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3JvdW5kZWQpOw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisvKiBNYWMsICAxICAqLw0KKyNpZiAoTF9NQUNfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9MX01BQw0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJTTVVMQkIgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdXG4iDQorCQkiUUFERAklW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdXG4iDQorCQkiUUFERCAgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAlW0xfdmFyM11cbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOiBbTF92YXIzXSJyIihMX3ZhcjMpLCBbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQ0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDMyIExfdmFyX291dDsNCisgICAgV29yZDMyIExfcHJvZHVjdDsNCisNCisgICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOw0KKyAgICBMX3Zhcl9vdXQgPSBMX2FkZCAoTF92YXIzLCBMX3Byb2R1Y3QpOw0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorI2VuZGlmDQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoTF9BRERfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9BREQNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiUUFERCAlW3Jlc3VsdF0sICVbTF92YXIxXSwgJVtMX3ZhcjJdXG4iDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgKyBMX3ZhcjI7DQorICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApDQorICAgIHsNCisgICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMCkgPyBNSU5fMzIgOiBNQVhfMzI7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisNCisNCisjaWYgKE1VTFRfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG11bHRfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3Byb2R1Y3RfYXJyOw0KKw0KKyAgICBMX3Byb2R1Y3RfYXJyID0gKFdvcmQzMil2YXIxICooV29yZDMyKXZhcjI7ICAgICAgIC8qIHByb2R1Y3QgKi8NCisgICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKTB4MDAwMDQwMDBMOyAgICAgIC8qIHJvdW5kICovDQorICAgIExfcHJvZHVjdF9hcnIgPj49IDE1OyAgICAgICAvKiBzaGlmdCAqLw0KKw0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0X2Fycik7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoU0hSX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyID4gMTUpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IHNocih2YXIxLCB2YXIyKTsNCisNCisgICAgICAgIGlmICh2YXIyID4gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKHZhcjEgJiAoKFdvcmQxNikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorI2lmIChNQUNfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7DQorICAgIHZhcl9vdXQgPSAoV29yZDE2KSgoTF92YXIzICsgMHg4MDAwTCkgPj4gMTYpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisjaWYgKE1TVV9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsNCisgICAgdmFyX291dCA9IChXb3JkMTYpKChMX3ZhcjMgKyAweDgwMDBMKSA+PiAxNik7DQorICAgIA0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisjaWYgKExfU0hSX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyID4gMzEpDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPSBMX3NocihMX3ZhcjEsIHZhcjIpOw0KKw0KKyAgICAgICAgaWYgKHZhcjIgPiAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICgoTF92YXIxICYgKChXb3JkMzIpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3Zhcl9vdXQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisjaWYgKEVYVFJBQ1RfSF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICB2YXJfb3V0ID0gKFdvcmQxNikgKExfdmFyMSA+PiAxNik7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoRVhUUkFDVF9MX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpDQorew0KKwlyZXR1cm4gKFdvcmQxNikgTF92YXIxOw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ1ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jCkBAIC0wLDAgKzEsMTYyNCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYmFzaWNvcDIuYw0KKw0KKwlDb250ZW50OglCYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycy4gDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IHNhdHVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExpbWl0IHRoZSAzMiBiaXQgaW5wdXQgdG8gdGhlIHJhbmdlIG9mIGEgMTYgYml0IHdvcmQuICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghU0FUUlVBVEVfSVNfSU5MSU5FKQ0KK1dvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIGlmIChMX3ZhcjEgPiAwWDAwMDA3ZmZmTCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IE1BWF8xNjsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGZmZmY4MDAwTCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IE1JTl8xNjsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2woTF92YXIxKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IGFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIFBlcmZvcm1zIHRoZSBhZGRpdGlvbiAodmFyMSt2YXIyKSB3aXRoIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247fA0KKyB8ICAgIHRoZSAxNiBiaXQgcmVzdWx0IGlzIHNldCBhdCArMzI3Njcgd2hlbiBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgLTMyNzY4ICAgfA0KKyB8ICAgIHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghQUREX0lTX0lOTElORSkNCitXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfc3VtOw0KKw0KKyAgICBMX3N1bSA9IChXb3JkMzIpdmFyMSArIChXb3JkMzIpdmFyMjsNCisgICAgdmFyX291dCA9IHNhdHVyYXRlKExfc3VtKTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBQZXJmb3JtcyB0aGUgc3VidHJhY3Rpb24gKHZhcjErdmFyMikgd2l0aCBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1LSAgIHwNCisgfCAgICByYXRpb247IHRoZSAxNiBiaXQgcmVzdWx0IGlzIHNldCBhdCArMzI3Njcgd2hlbiBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgIHwNCisgfCAgICAtMzI3Njggd2hlbiB1bmRlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIVNVQl9JU19JTkxJTkUpDQorV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfZGlmZjsNCisNCisgICAgTF9kaWZmID0gKFdvcmQzMikgdmFyMSAtIHZhcjI7DQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IGFic19zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIEFic29sdXRlIHZhbHVlIG9mIHZhcjE7IGFic19zKC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorLy9Xb3JkMTYgYWJzX3MgKFdvcmQxNiB2YXIxKQ0KKy8vew0KKy8vICAgIFdvcmQxNiB2YXJfb3V0Ow0KKy8vDQorLy8gICAgaWYgKHZhcjEgPT0gTUlOXzE2KQ0KKy8vICAgIHsNCisvLyAgICAgICAgdmFyX291dCA9IE1BWF8xNjsNCisvLyAgICB9DQorLy8gICAgZWxzZQ0KKy8vICAgIHsNCisvLyAgICAgICAgaWYgKHZhcjEgPCAwKQ0KKy8vICAgICAgICB7DQorLy8gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNiktdmFyMTsNCisvLyAgICAgICAgfQ0KKy8vICAgICAgICBlbHNlDQorLy8gICAgICAgIHsNCisvLyAgICAgICAgICAgIHZhcl9vdXQgPSB2YXIxOw0KKy8vICAgICAgICB9DQorLy8gICAgfQ0KKy8vDQorLy8gICAgcmV0dXJuICh2YXJfb3V0KTsNCisvL30NCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IHNobCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuWmVybyBmaWxsfA0KKyB8ICAgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0ICAgfA0KKyB8ICAgdmFyMSByaWdodCBieSAtdmFyMiB3aXRoIHNpZ24gZXh0ZW5zaW9uLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2YgfA0KKyB8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghU0hMX0lTX0lOTElORSkNCitXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIHJlc3VsdDsNCisNCisgICAgaWYgKHZhcjIgPCAwKQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMiA8IC0xNikNCisgICAgICAgICAgICB2YXIyID0gLTE2Ow0KKyAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgKFdvcmQxNiktdmFyMik7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICByZXN1bHQgPSAoV29yZDMyKSB2YXIxICooKFdvcmQzMikgMSA8PCB2YXIyKTsNCisNCisgICAgICAgIGlmICgodmFyMiA+IDE1ICYmIHZhcjEgIT0gMCkgfHwgKHJlc3VsdCAhPSAoV29yZDMyKSAoKFdvcmQxNikgcmVzdWx0KSkpDQorICAgICAgICB7DQorICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7DQorICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID4gMCkgPyBNQVhfMTYgOiBNSU5fMTYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2wocmVzdWx0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisvLyBlbmQNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IHNociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIHJpZ2h0IHZhcjIgcG9zaXRpb25zIHdpdGggICAgfA0KKyB8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IHZhcjEgbGVmdCBieSAgfA0KKyB8ICAgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHVuZGVyZmxvd3Mgb3IgfA0KKyB8ICAgb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghU0hSX0lTX0lOTElORSkNCitXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgaWYgKHZhcjIgPCAwKQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMiA8IC0xNikNCisgICAgICAgICAgICB2YXIyID0gLTE2Ow0KKyAgICAgICAgdmFyX291dCA9IHNobCAodmFyMSwgKFdvcmQxNiktdmFyMik7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMiA+PSAxNSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPCAwKSA/IC0xIDogMCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKH4oKH52YXIxKSA+PiB2YXIyKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh2YXIxID4+IHZhcjIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG11bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIFBlcmZvcm1zIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB2YXIxIGJ5IHZhcjIgYW5kIGdpdmVzIGEgMTYgYml0IHJlc3VsdCAgfA0KKyB8ICAgIHdoaWNoIGlzIHNjYWxlZCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIG11bHQodmFyMSx2YXIyKSA9IGV4dHJhY3RfbChMX3NocigodmFyMSB0aW1lcyB2YXIyKSwxNSkpIGFuZCAgfA0KKyB8ICAgICAgICAgICAgIG11bHQoLTMyNzY4LC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTVVMVF9JU19JTkxJTkUpDQorV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0Ow0KKw0KKyAgICBMX3Byb2R1Y3QgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOw0KKw0KKyAgICBMX3Byb2R1Y3QgPSAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHhmZmZmODAwMEwpID4+IDE1Ow0KKw0KKyAgICBpZiAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpDQorICAgICAgICBMX3Byb2R1Y3QgPSBMX3Byb2R1Y3QgfCAoV29yZDMyKSAweGZmZmYwMDAwTDsNCisNCisgICAgdmFyX291dCA9IHNhdHVyYXRlKExfcHJvZHVjdCk7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBMX211bHQgaXMgdGhlIDMyIGJpdCByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHZhcjEgdGltZXMgdmFyMiAgICB8DQorIHwgICB3aXRoIG9uZSBzaGlmdCBsZWZ0IGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgIExfbXVsdCh2YXIxLHZhcjIpID0gTF9zaGwoKHZhcjEgdGltZXMgdmFyMiksMSkgYW5kICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgIExfbXVsdCgtMzI3NjgsLTMyNzY4KSA9IDIxNDc0ODM2NDcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFMX01VTFRfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsNCisNCisgICAgaWYgKExfdmFyX291dCAhPSAoV29yZDMyKSAweDQwMDAwMDAwTCkNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0IDw8PSAxOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0ID0gTUFYXzMyOw0KKyAgICB9DQorICAgICAgICANCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisvLyBlbmQNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG5lZ2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgTmVnYXRlIHZhcjEgd2l0aCBzYXR1cmF0aW9uLCBzYXR1cmF0ZSBpbiB0aGUgY2FzZSB3aGVyZSBpbnB1dCBpcyAtMzI3Njg6fA0KKyB8ICAgICAgICAgICAgICAgIG5lZ2F0ZSh2YXIxKSA9IHN1YigwLHZhcjEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorLy9Xb3JkMTYgbmVnYXRlIChXb3JkMTYgdmFyMSkNCisvL3sNCisvLyAgICBXb3JkMTYgdmFyX291dDsNCisvLw0KKy8vICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA9PSBNSU5fMTYpID8gTUFYXzE2IDogLXZhcjEpOw0KKy8vDQorLy8gICAgcmV0dXJuICh2YXJfb3V0KTsNCisvL30NCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IGV4dHJhY3RfaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIHRoZSAxNiBNU0Igb2YgTF92YXIxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghRVhUUkFDVF9IX0lTX0lOTElORSkNCitXb3JkMTYgZXh0cmFjdF9oIChXb3JkMzIgTF92YXIxKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIHZhcl9vdXQgPSAoV29yZDE2KSAoTF92YXIxID4+IDE2KTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBleHRyYWN0X2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiB0aGUgMTYgTFNCIG9mIExfdmFyMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIUVYVFJBQ1RfTF9JU19JTkxJTkUpDQorV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIHZhcl9vdXQgPSAoV29yZDE2KSBMX3ZhcjE7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogcm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSb3VuZCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgMzIgYml0IGlucHV0IG51bWJlciBpbnRvIHRoZSBNUyAxNiBiaXRzICB8DQorIHwgICB3aXRoIHNhdHVyYXRpb24uIFNoaWZ0IHRoZSByZXN1bHRpbmcgYml0cyByaWdodCBieSAxNiBhbmQgcmV0dXJuIHRoZSAxNiB8DQorIHwgICBiaXQgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICByb3VuZChMX3ZhcjEpID0gZXh0cmFjdF9oKExfYWRkKExfdmFyMSwzMjc2OCkpICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMiApIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFST1VORF9JU19JTkxJTkUpDQorV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9yb3VuZGVkOw0KKw0KKyAgICBMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7DQorICAgIHZhcl9vdXQgPSBleHRyYWN0X2ggKExfcm91bmRlZCk7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKy8vIGVuZA0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBBZGQgdGhlIDMyIGJpdCAgICB8DQorIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbiwgcmV0dXJuIGEgMzIgYml0IHJlc3VsdDogICAgICAgICAgICAgICB8DQorIHwgICAgICAgIExfbWFjKExfdmFyMyx2YXIxLHZhcjIpID0gTF9hZGQoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFMX01TVV9JU19JTkxJTkUpDQorV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0Ow0KKw0KKyAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7DQorICAgIExfdmFyX291dCA9IExfYWRkIChMX3ZhcjMsIExfcHJvZHVjdCk7DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX21zdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwNCisgfCAgIGJpdCByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbiwgcmV0dXJuIGEgMzIgYml0IHJlc3VsdDogICAgICAgICAgIHwNCisgfCAgICAgICAgTF9tc3UoTF92YXIzLHZhcjEsdmFyMikgPSBMX3N1YihMX3ZhcjMsTF9tdWx0KHZhcjEsdmFyMikpLiAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIUxfTVNVX0lTX0lOTElORSkNCitXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3Byb2R1Y3Q7DQorDQorICAgIExfcHJvZHVjdCA9IExfbXVsdCh2YXIxLCB2YXIyKTsNCisgICAgTF92YXJfb3V0ID0gTF9zdWIgKExfdmFyMywgTF9wcm9kdWN0KTsNCisNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgMzIgYml0cyBhZGRpdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjErTF92YXIyKSB3aXRoICAgICAgfA0KKyB8ICAgb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjsgdGhlIHJlc3VsdCBpcyBzZXQgYXQgKzIxNDc0ODM2NDcgd2hlbiAgfA0KKyB8ICAgb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0yMTQ3NDgzNjQ4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMiAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTF9BRERfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIExfdmFyX291dCA9IExfdmFyMSArIExfdmFyMjsNCisNCisgICAgaWYgKCgoTF92YXIxIF4gTF92YXIyKSAmIE1JTl8zMikgPT0gMCkNCisgICAgew0KKyAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwKSA/IE1JTl8zMiA6IE1BWF8zMjsNCisgICAgICAgICAgICAvL092ZXJmbG93ID0gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAzMiBiaXRzIHN1YnRyYWN0aW9uIG9mIHRoZSB0d28gMzIgYml0cyB2YXJpYWJsZXMgKExfdmFyMS1MX3ZhcjIpIHdpdGggICB8DQorIHwgICBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uOyB0aGUgcmVzdWx0IGlzIHNldCBhdCArMjE0NzQ4MzY0NyB3aGVuICB8DQorIHwgICBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgLTIxNDc0ODM2NDggd2hlbiB1bmRlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIyICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFMX1NVQl9JU19JTkxJTkUpDQorV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgLSBMX3ZhcjI7DQorDQorICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApDQorICAgIHsNCisgICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gTUlOXzMyIDogTUFYXzMyOw0KKyAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX25lZ2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE5lZ2F0ZSB0aGUgMzIgYml0IHZhcmlhYmxlIExfdmFyMSB3aXRoIHNhdHVyYXRpb247IHNhdHVyYXRlIGluIHRoZSBjYXNlIHwNCisgfCAgIHdoZXJlIGlucHV0IGlzIC0yMTQ3NDgzNjQ4ICgweDgwMDAgMDAwMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8vV29yZDMyIExfbmVnYXRlIChXb3JkMzIgTF92YXIxKQ0KKy8vew0KKy8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorLy8NCisvLyAgICBMX3Zhcl9vdXQgPSAoTF92YXIxID09IE1JTl8zMikgPyBNQVhfMzIgOiAtTF92YXIxOw0KKy8vDQorLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKy8vfQ0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogbXVsdF9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBTYW1lIGFzIG11bHQgd2l0aCByb3VuZGluZywgaS5lLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgIG11bHRfcih2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCgodmFyMSAqIHZhcjIpICsgMTYzODQpLDE1KSkgYW5kICB8DQorIHwgICAgIG11bHRfcigtMzI3NjgsLTMyNzY4KSA9IDMyNzY3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFNVUxUX1JfSVNfSU5MSU5FKQ0KK1dvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsNCisNCisgICAgTF9wcm9kdWN0X2FyciA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7ICAgICAgIC8qIHByb2R1Y3QgKi8NCisgICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKSAweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLw0KKyAgICBMX3Byb2R1Y3RfYXJyICY9IChXb3JkMzIpIDB4ZmZmZjgwMDBMOw0KKyAgICBMX3Byb2R1Y3RfYXJyID4+PSAxNTsgICAgICAgLyogc2hpZnQgKi8NCisNCisgICAgaWYgKExfcHJvZHVjdF9hcnIgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkgICAvKiBzaWduIGV4dGVuZCB3aGVuIG5lY2Vzc2FyeSAqLw0KKyAgICB7DQorICAgICAgICBMX3Byb2R1Y3RfYXJyIHw9IChXb3JkMzIpIDB4ZmZmZjAwMDBMOw0KKyAgICB9DQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3RfYXJyKTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3NobCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAzMiBiaXQgaW5wdXQgTF92YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuIFplcm8gIHwNCisgfCAgIGZpbGwgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5ICAgIHwNCisgfCAgIHNoaWZ0IExfdmFyMSByaWdodCBieSAtdmFyMiB3aXRoIHNpZ24gZXh0ZW5zaW9uLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIHwNCisgfCAgIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIUxfU0hMX0lTX0lOTElORSkNCitXb3JkMzIgTF9zaGwgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDMyIExfdmFyX291dCA9IDBMOw0KKw0KKyAgICBpZiAodmFyMiA8PSAwKQ0KKyAgICB7DQorICAgICAgICBMX3ZhcjEgPSBMX3NocihMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKExfdmFyMSA+IChXb3JkMzIpIDBYM2ZmZmZmZmZMKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIE1BWF8zMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4YzAwMDAwMDBMKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOXzMyOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIExfdmFyMSA8PD0gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gKExfdmFyMSk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMzIgYml0IGlucHV0IExfdmFyMSByaWdodCB2YXIyIHBvc2l0aW9ucyB3aXRoICB8DQorIHwgICBzaWduIGV4dGVuc2lvbi4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgTF92YXIxIGxlZnQgICB8DQorIHwgICBieSAtdmFyMiBhbmQgemVybyBmaWxsIHRoZSAtdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gU2F0dXJhdGUgdGhlIHJlc3VsdCB8DQorIHwgICBpbiBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFMX1NIUl9JU19JTkxJTkUpDQorV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyIDwgMCkNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0ID0gTF9zaGwgKExfdmFyMSwgKFdvcmQxNiktdmFyMik7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMiA+PSAzMSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gLTEgOiAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gfigofkxfdmFyMSkgPj4gdmFyMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExfdmFyX291dCA9IExfdmFyMSA+PiB2YXIyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogc2hyX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBTYW1lIGFzIHNocih2YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2Z8DQorIHwgICB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgLSBJZiB2YXIyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgaWYgKHN1YihzaGwoc2hyKHZhcjEsdmFyMiksMSksc2hyKHZhcjEsc3ViKHZhcjIsMSkpKSkgICAgICAgICAgICB8DQorIHwgICAgICAgICAgaXMgZXF1YWwgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gc2hyKHZhcjEsdmFyMikgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gYWRkKHNocih2YXIxLHZhcjIpLDEpICAgICAgICAgICAgICB8DQorIHwgICAgLSBJZiB2YXIyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gc2hyKHZhcjEsdmFyMikuICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFTSFJfUl9JU19JTkxJTkUpDQorV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgaWYgKHZhcjIgPiAxNSkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gc2hyICh2YXIxLCB2YXIyKTsNCisNCisgICAgICAgIGlmICh2YXIyID4gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKHZhcjEgJiAoKFdvcmQxNikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBtYWNfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIEFkZCB0aGUgMzIgYml0ICAgIHwNCisgfCAgIHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLiBSb3VuZCB0aGUgTFMgMTYgYml0cyBvZiB0aGUgcmVzdWx0ICAgIHwNCisgfCAgIGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5IDE2LiAgIHwNCisgfCAgIFJldHVybiBhIDE2IGJpdCByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgIG1hY19yKExfdmFyMyx2YXIxLHZhcjIpID0gcm91bmQoTF9tYWMoTF92YXIzLHZhcjEsdmFyMikpICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCA4MDAwIDw9IExfdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIU1BQ19SX0lTX0lOTElORSkNCitXb3JkMTYgbWFjX3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBMX3ZhcjMgPSBMX21hYyAoTF92YXIzLCB2YXIxLCB2YXIyKTsNCisgICAgTF92YXIzID0gTF9hZGQgKExfdmFyMywgKFdvcmQzMikgMHgwMDAwODAwMEwpOw0KKyAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3ZhcjMpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG1zdV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gU3VidHJhY3QgdGhlIDMyICAgfA0KKyB8ICAgYml0IHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLiBSb3VuZCB0aGUgTFMgMTYgYml0cyBvZiB0aGUgcmVzLSAgfA0KKyB8ICAgdWx0IGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5ICAgfA0KKyB8ICAgMTYuIFJldHVybiBhIDE2IGJpdCByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgbXN1X3IoTF92YXIzLHZhcjEsdmFyMikgPSByb3VuZChMX21zdShMX3ZhcjMsdmFyMSx2YXIyKSkgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDgwMDAgPD0gTF92YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTVNVX1JfSVNfSU5MSU5FKQ0KK1dvcmQxNiBtc3VfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIExfdmFyMyA9IExfbXN1IChMX3ZhcjMsIHZhcjEsIHZhcjIpOw0KKyAgICBMX3ZhcjMgPSBMX2FkZCAoTF92YXIzLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7DQorICAgIHZhcl9vdXQgPSBleHRyYWN0X2ggKExfdmFyMyk7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBEZXBvc2l0IHRoZSAxNiBiaXQgdmFyMSBpbnRvIHRoZSAxNiBNUyBiaXRzIG9mIHRoZSAzMiBiaXQgb3V0cHV0LiBUaGUgICB8DQorIHwgICAxNiBMUyBiaXRzIG9mIHRoZSBvdXRwdXQgYXJlIHplcm9lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiAwMDAwLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisvL1dvcmQzMiBMX2RlcG9zaXRfaCAoV29yZDE2IHZhcjEpDQorLy97DQorLy8gICAgV29yZDMyIExfdmFyX291dDsNCisvLw0KKy8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgPDwgMTY7DQorLy8NCisvLyAgICByZXR1cm4gKExfdmFyX291dCk7DQorLy99DQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2RlcG9zaXRfbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIERlcG9zaXQgdGhlIDE2IGJpdCB2YXIxIGludG8gdGhlIDE2IExTIGJpdHMgb2YgdGhlIDMyIGJpdCBvdXRwdXQuIFRoZSAgIHwNCisgfCAgIDE2IE1TIGJpdHMgb2YgdGhlIG91dHB1dCBhcmUgc2lnbiBleHRlbmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4RkZGRiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8vV29yZDMyIExfZGVwb3NpdF9sIChXb3JkMTYgdmFyMSkNCisvL3sNCisvLyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKy8vDQorLy8gICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMTsNCisvLw0KKy8vICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisvL30NCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc2hyX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgU2FtZSBhcyBMX3NocihMX3ZhcjEsdmFyMikgYnV0IHdpdGggcm91bmRpbmcuIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gICAgfA0KKyB8ICAgY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIC0gSWYgdmFyMiBpcyBncmVhdGVyIHRoYW4gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgIGlmIChMX3N1YihMX3NobChMX3NocihMX3ZhcjEsdmFyMiksMSksTF9zaHIoTF92YXIxLHN1Yih2YXIyLDEpKSkpfA0KKyB8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX2FkZChMX3NocihMX3ZhcjEsdmFyMiksMSkgICAgfA0KKyB8ICAgIC0gSWYgdmFyMiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikuICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTF9TSFJfUl9JU19JTkxJTkUpDQorV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgaWYgKHZhcjIgPiAzMSkNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0ID0gMDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IExfc2hyIChMX3ZhcjEsIHZhcjIpOw0KKw0KKyAgICAgICAgaWYgKHZhcjIgPiAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICgoTF92YXIxICYgKChXb3JkMzIpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3Zhcl9vdXQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfYWJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIEFic29sdXRlIHZhbHVlIG9mIExfdmFyMTsgU2F0dXJhdGUgaW4gY2FzZSB3aGVyZSB0aGUgaW5wdXQgaXMgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIxNDc4MzY0OCAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorLy9Xb3JkMzIgTF9hYnMgKFdvcmQzMiBMX3ZhcjEpDQorLy97DQorLy8gICAgV29yZDMyIExfdmFyX291dDsNCisvLw0KKy8vICAgIGlmIChMX3ZhcjEgPT0gTUlOXzMyKQ0KKy8vICAgIHsNCisvLyAgICAgICAgTF92YXJfb3V0ID0gTUFYXzMyOw0KKy8vICAgIH0NCisvLyAgICBlbHNlDQorLy8gICAgew0KKy8vICAgICAgICBpZiAoTF92YXIxIDwgMCkNCisvLyAgICAgICAgew0KKy8vICAgICAgICAgICAgTF92YXJfb3V0ID0gLUxfdmFyMTsNCisvLyAgICAgICAgfQ0KKy8vICAgICAgICBlbHNlDQorLy8gICAgICAgIHsNCisvLyAgICAgICAgICAgIExfdmFyX291dCA9IExfdmFyMTsNCisvLyAgICAgICAgfQ0KKy8vICAgIH0NCisvLw0KKy8vICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisvL30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG5vcm1fcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0IG5lZWRlZCB0byBub3JtYWxpemUgdGhlIDE2IGJpdCB2YXJpYS0gfA0KKyB8ICAgYmxlIHZhcjEgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbiB0aGUgaW50ZXJ2YWwgd2l0aCBtaW5pbXVtIG9mIDE2Mzg0IGFuZCAgfA0KKyB8ICAgbWF4aW11bSBvZiAzMjc2NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSAgfA0KKyB8ICAgb2YgLTMyNzY4IGFuZCBtYXhpbXVtIG9mIC0xNjM4NDsgaW4gb3JkZXIgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSAgfA0KKyB8ICAgZm9sbG93aW5nIG9wZXJhdGlvbiBtdXN0IGJlIGRvbmUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICBub3JtX3ZhcjEgPSBzaGwodmFyMSxub3JtX3ModmFyMSkpLiAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgMDAwZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghTk9STV9TX0lTX0lOTElORSkNCitXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMSA9PSAwKQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gMDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmICh2YXIxID09IC0xKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAxNTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFyMSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXIxID0gKFdvcmQxNil+dmFyMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgdmFyMSA8IDB4NDAwMDsgdmFyX291dCsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyMSA8PD0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBkaXZfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFByb2R1Y2VzIGEgcmVzdWx0IHdoaWNoIGlzIHRoZSBmcmFjdGlvbmFsIGludGVnZXIgZGl2aXNpb24gb2YgdmFyMSAgYnkgIHwNCisgfCAgIHZhcjI7IHZhcjEgYW5kIHZhcjIgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdmFyMiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgIHwNCisgfCAgIHRvIHZhcjE7IHRoZSByZXN1bHQgaXMgcG9zaXRpdmUgKGxlYWRpbmcgYml0IGVxdWFsIHRvIDApIGFuZCB0cnVuY2F0ZWQgIHwNCisgfCAgIHRvIDE2IGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElmIHZhcjEgPSB2YXIyIHRoZW4gZGl2KHZhcjEsdmFyMikgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcjEgPD0gdmFyMiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IHZhcjEgPD0gdmFyMiA8PSAweDAwMDAgN2ZmZiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICBJdCdzIGEgUTE1IHZhbHVlIChwb2ludCBiZXR3ZWVuIGIxNSBhbmQgYjE0KS4gICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIURJVl9TX0lTX0lOTElORSkNCitXb3JkMTYgZGl2X3MgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsNCisgICAgV29yZDE2IGl0ZXJhdGlvbjsNCisgICAgV29yZDMyIExfbnVtOw0KKyAgICBXb3JkMzIgTF9kZW5vbTsNCisNCisgICAgaWYgKHZhcjEgPT0gMCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMSA9PSB2YXIyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgTF9udW0gPSBMX2RlcG9zaXRfbCAodmFyMSk7DQorICAgICAgICAgICAgTF9kZW5vbSA9IExfZGVwb3NpdF9sICh2YXIyKTsNCisNCisgICAgICAgICAgICBmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDE1OyBpdGVyYXRpb24rKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQgPDw9IDE7DQorICAgICAgICAgICAgICAgIExfbnVtIDw8PSAxOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoTF9udW0gPj0gTF9kZW5vbSkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgTF9udW0gPSBMX3N1YihMX251bSwgTF9kZW5vbSk7DQorICAgICAgICAgICAgICAgICAgICB2YXJfb3V0ID0gYWRkICh2YXJfb3V0LCAxKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG5vcm1fbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0cyBuZWVkZWQgdG8gbm9ybWFsaXplIHRoZSAzMiBiaXQgdmFyaWEtfA0KKyB8ICAgYmxlIExfdmFyMSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gb2YgICAgICAgICAgfA0KKyB8ICAgMTA3Mzc0MTgyNCBhbmQgbWF4aW11bSBvZiAyMTQ3NDgzNjQ3LCBhbmQgZm9yIG5lZ2F0aXZlIHZhbHVlcyBvbiB0aGUgaW4tfA0KKyB8ICAgdGVydmFsIHdpdGggbWluaW11bSBvZiAtMjE0NzQ4MzY0OCBhbmQgbWF4aW11bSBvZiAtMTA3Mzc0MTgyNDsgaW4gb3JkZXIgfA0KKyB8ICAgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIG11c3QgYmUgZG9uZSA6ICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgIG5vcm1fTF92YXIxID0gTF9zaGwoTF92YXIxLG5vcm1fbChMX3ZhcjEpKS4gICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgMDAxZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghTk9STV9MX0lTX0lOTElORSkNCitXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIGlmIChMX3ZhcjEgPT0gMCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAoTF92YXIxID09IChXb3JkMzIpIDB4ZmZmZmZmZmZMKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAzMTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoTF92YXIxIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExfdmFyMSA9IH5MX3ZhcjE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3ZhcjEgPDw9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmE5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCW9wZXJfMzJiLmMNCisNCisJQ29udGVudDoJICBUaGlzIGZpbGUgY29udGFpbnMgb3BlcmF0aW9ucyBpbiBkb3VibGUgcHJlY2lzaW9uLgorIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBFeHRyYWN0IGZyb20gYSAzMiBiaXQgaW50ZWdlciB0d28gMTYgYml0IERQRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBMXzMyICAgICAgOiAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgIDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaGkgICAgICAgIDogYjE2IHRvIGIzMSBvZiBMXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBsbyAgICAgICAgOiAoTF8zMiAtIGhpPDwxNik+PjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK3ZvaWQgTF9FeHRyYWN0IChXb3JkMzIgTF8zMiwgV29yZDE2ICpoaSwgV29yZDE2ICpsbykKK3sKKyAgICAqaGkgPSBleHRyYWN0X2ggKExfMzIpOworICAgICpsbyA9IGV4dHJhY3RfbCAoTF9tc3UgKExfc2hyIChMXzMyLCAxKSwgKmhpLCAxNjM4NCkpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBGdW5jdGlvbiBMX0NvbXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgQ29tcG9zZSBmcm9tIHR3byAxNiBiaXQgRFBGIGEgMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgIExfMzIgPSBoaTw8MTYgKyBsbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGhpICAgICAgICBtc2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgbG8gICAgICAgIGxzZiAod2l0aCBzaWduKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqCisgKiAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZjAuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitXb3JkMzIgTF9Db21wIChXb3JkMTYgaGksIFdvcmQxNiBsbykKK3sKKyAgICBXb3JkMzIgTF8zMjsKKworICAgIExfMzIgPSBMX2RlcG9zaXRfaCAoaGkpOworICAgIHJldHVybiAoTF9tYWMgKExfMzIsIGxvLCAxKSk7ICAgICAgIC8qID0gaGk8PDE2ICsgbG88PDEgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBNcHlfMzIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBNdWx0aXBseSB0d28gMzIgYml0IGludGVnZXJzIChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgYnkgMioqMzEgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgTF8zMiA9IChoaTEqaGkyKTw8MSArICggKGhpMSpsbzIpPj4xNSArIChsbzEqaGkyKT4+MTUgKTw8MSAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgb3BlcmF0aW9uIGNhbiBhbHNvIGJlIHZpZXdlZCBhcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdHdvIFEzMSAgICAgICoKKyAqICAgbnVtYmVyIGFuZCB0aGUgcmVzdWx0IGlzIGFsc28gaW4gUTMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIGhpMSAgICAgICAgIGhpIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgbG8xICAgICAgICAgbG8gcGFydCBvZiBmaXJzdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBoaTIgICAgICAgICBoaSBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIGxvMiAgICAgICAgIGxvIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworV29yZDMyIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMikKK3sKKyAgICBXb3JkMzIgTF8zMjsKKworICAgIExfMzIgPSBMX211bHQgKGhpMSwgaGkyKTsKKyAgICBMXzMyID0gTF9tYWMgKExfMzIsIG11bHQgKGhpMSwgbG8yKSwgMSk7CisgICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbzEsIGhpMiksIDEpOworCisgICAgcmV0dXJuIChMXzMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBNcHlfMzJfMTYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBNdWx0aXBseSBhIDE2IGJpdCBpbnRlZ2VyIGJ5IGEgMzIgYml0IChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgICAgICAqCisgKiAgIGJ5IDIqKjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIExfMzIgPSAoaGkxKmxvMik8PDEgKyAoKGxvMSpsbzIpPj4xNSk8PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBoaSAgICAgICAgICBoaSBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIGxvICAgICAgICAgIGxvIHBhcnQgb2YgMzIgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgbiAgICAgICAgICAgMTYgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitXb3JkMzIgTXB5XzMyXzE2IChXb3JkMTYgaGksIFdvcmQxNiBsbywgV29yZDE2IG4pCit7CisgICAgV29yZDMyIExfMzI7CisKKyAgICBMXzMyID0gTF9tdWx0IChoaSwgbik7CisgICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbywgbiksIDEpOworCisgICAgcmV0dXJuIChMXzMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgRnVuY3Rpb24gTmFtZSA6IERpdl8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIEZyYWN0aW9uYWwgaW50ZWdlciBkaXZpc2lvbiBvZiB0d28gMzIgYml0IG51bWJlcnMuICAgICAgICAgICAgKgorICogICAgICAgICAgICAgTF9udW0gLyBMX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBMX251bSBhbmQgTF9kZW5vbSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBMX251bSA8IExfZGVub20uICAgICAgICoKKyAqICAgICAgICAgICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgZGVub21faGkgaXMgYSBub3JtYWxpemUgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICBMX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgorICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8IExfbnVtIDwgTF9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgIChEUEYpICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBub3JtYWxpemVkIGludGVnZXIgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAgKgorICogICAgICAgICAgICAgcmFuZ2UgOiAweDQwMDAgPCBoaSA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBkZW5vbV9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBpbnRlZ2VyIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgcmFuZ2UgOiAwIDwgbG8gPCAweDdmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICBMX2RpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgorICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSBMX2RpdiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgLSBmaW5kID0gMS9MX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgRmlyc3QgYXBwcm94aW1hdGlvbjogYXBwcm94ID0gMSAvIGRlbm9tX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCApICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAtICByZXN1bHQgPSBMX251bSAqICgxL0xfZGVub20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitXb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQzMiBkZW5vbSkKK3sKKyAgICBXb3JkMTYgYXBwcm94OworICAgIFdvcmQzMiBMXzMyOworICAgIC8qIEZpcnN0IGFwcHJveGltYXRpb246IDEgLyBMX2Rlbm9tID0gMS9kZW5vbV9oaSAqLworCisgICAgYXBwcm94ID0gZGl2X3MgKChXb3JkMTYpIDB4M2ZmZiwgZGVub20gPj4gMTYpOworCisgICAgLyogMS9MX2Rlbm9tID0gYXBwcm94ICogKDIuMCAtIExfZGVub20gKiBhcHByb3gpICovCisKKyAgICBMXzMyID0gTF9tcHlfbHMgKGRlbm9tLCBhcHByb3gpOworCisgICAgTF8zMiA9IExfc3ViICgoV29yZDMyKSAweDdmZmZmZmZmTCwgTF8zMik7CisKKwlMXzMyID0gTF9tcHlfbHMgKExfMzIsIGFwcHJveCk7CisgICAgLyogTF9udW0gKiAoMS9MX2Rlbm9tKSAqLworCisJTF8zMiA9IE1VTEhJR0goTF8zMiwgTF9udW0pOworICAgIExfMzIgPSBMX3NobCAoTF8zMiwgMyk7CisKKyAgICByZXR1cm4gKExfMzIpOworfQorDQorLyohDQorIA0KKyAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBsb2cgZHVhbGlzIHRpbWVzIDQgb2YgYXJndW1lbnQgDQorICAgICAgICAgIGlMb2c0KHgpID0gKFdvcmQzMikoNCAqIGxvZyh2YWx1ZSkvbG9nKDIuMCkpDQorDQorICBccmV0dXJuIGlsb2c0IHZhbHVlDQorIA0KKyovDQorV29yZDE2IGlMb2c0KFdvcmQzMiB2YWx1ZSkNCit7DQorICBXb3JkMTYgaUxvZzQ7DQorDQorICBpZih2YWx1ZSAhPSAwKXsNCisgICAgV29yZDMyIHRtcDsNCisgICAgV29yZDE2IHRtcDE2Ow0KKyAgICBpTG9nNCA9IG5vcm1fbCh2YWx1ZSk7DQorICAgIHRtcCA9ICh2YWx1ZSA8PCBpTG9nNCk7DQorICAgIHRtcDE2ID0gcm91bmQxNih0bXApOw0KKyAgICB0bXAgPSBMX211bHQodG1wMTYsIHRtcDE2KTsNCisgICAgdG1wMTYgPSByb3VuZDE2KHRtcCk7DQorICAgIHRtcCA9IExfbXVsdCh0bXAxNiwgdG1wMTYpOw0KKyAgICB0bXAxNiA9IHJvdW5kMTYodG1wKTsNCisNCisgICAgaUxvZzQgPSAoLShpTG9nNCA8PCAyKSAtIG5vcm1fcyh0bXAxNikpIC0gMTsNCisgIH0NCisgIGVsc2Ugew0KKyAgICBpTG9nNCA9IC0xMjg7IC8qIC0oSU5UX0JJVFMqNCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICB9DQorDQorICByZXR1cm4gaUxvZzQ7DQorfQ0KKw0KKyNkZWZpbmUgc3RlcChzaGlmdCkgXA0KKyAgICBpZiAoKDB4NDAwMDAwMDBsID4+IHNoaWZ0KSArIHJvb3QgPD0gdmFsdWUpICAgICAgIFwNCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICB2YWx1ZSAtPSAoMHg0MDAwMDAwMGwgPj4gc2hpZnQpICsgcm9vdDsgICAgICAgXA0KKyAgICAgICAgcm9vdCA9IChyb290ID4+IDEpIHwgKDB4NDAwMDAwMDBsID4+IHNoaWZ0KTsgIFwNCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICByb290ID0gcm9vdCA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICB9DQorDQorV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgICAgIC8qITwgT3BlcmFuZCB0byBzcXVhcmUgcm9vdCAoMC4wIC4uLiAxKSAqLw0KKyAgICAgICAgICAgICBXb3JkMzIgYWNjdXJhY3kpICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzIHRoYXQgd2lsbCBiZSBjYWxjdWxhdGVkICovDQorew0KKyAgICBXb3JkMzIgcm9vdCA9IDA7DQorCVdvcmQzMiBzY2FsZTsNCisNCisJaWYodmFsdWUgPCAwKQ0KKwkJcmV0dXJuIDA7DQorDQorCXNjYWxlID0gbm9ybV9sKHZhbHVlKTsNCisJaWYoc2NhbGUgJiAxKSBzY2FsZS0tOw0KKw0KKwl2YWx1ZSA8PD0gc2NhbGU7DQorDQorCXN0ZXAoIDApOyBzdGVwKCAyKTsgc3RlcCggNCk7IHN0ZXAoIDYpOw0KKyAgICBzdGVwKCA4KTsgc3RlcCgxMCk7IHN0ZXAoMTIpOyBzdGVwKDE0KTsNCisgICAgc3RlcCgxNik7IHN0ZXAoMTgpOyBzdGVwKDIwKTsgc3RlcCgyMik7DQorICAgIHN0ZXAoMjQpOyBzdGVwKDI2KTsgc3RlcCgyOCk7IHN0ZXAoMzApOw0KKw0KKyAgICBzY2FsZSA+Pj0gMTsNCisJaWYgKHJvb3QgPCB2YWx1ZSkNCisgICAgICAgICsrcm9vdDsNCisNCisJcm9vdCA+Pj0gc2NhbGU7DQorICAgIHJldHVybiByb290KiA0NjMzNDsNCit9DQorDQorc3RhdGljIGNvbnN0IFdvcmQzMiBwb3cyVGFibGVbUE9XMl9UQUJMRV9TSVpFXSA9IHsNCisweDdmZmZmZmZmLCAweDdmYTc2NWFkLCAweDdmNGYwOGFlLCAweDdlZjZlOGRhLCANCisweDdlOWYwNjA2LCAweDdlNDc2MDA5LCAweDdkZWZmNmI2LCAweDdkOThjOWU2LCANCisweDdkNDFkOTZlLCAweDdjZWIyNTIzLCAweDdjOTRhY2RlLCAweDdjM2U3MDczLCANCisweDdiZTg2ZmI5LCAweDdiOTJhYTg4LCAweDdiM2QyMGI2LCAweDdhZTdkMjFhLCANCisweDdhOTJiZThiLCAweDdhM2RlNWRmLCAweDc5ZTk0N2VmLCAweDc5OTRlNDkyLCANCisweDc5NDBiYjllLCAweDc4ZWNjY2VjLCAweDc4OTkxODU0LCAweDc4NDU5ZGFjLCANCisweDc3ZjI1Y2NlLCAweDc3OWY1NTkxLCAweDc3NGM4N2NjLCAweDc2ZjlmMzU5LCANCisweDc2YTc5ODBmLCAweDc2NTU3NWM4LCAweDc2MDM4YzViLCAweDc1YjFkYmEyLCANCisweDc1NjA2Mzc0LCAweDc1MGYyM2FiLCAweDc0YmUxYzIwLCAweDc0NmQ0Y2FjLCANCisweDc0MWNiNTI4LCAweDczY2M1NTZkLCAweDczN2MyZDU1LCAweDczMmMzY2JhLCANCisweDcyZGM4Mzc0LCAweDcyOGQwMTVkLCAweDcyM2RiNjUwLCAweDcxZWVhMjI2LCANCisweDcxOWZjNGI5LCAweDcxNTExZGU0LCAweDcxMDJhZDgwLCAweDcwYjQ3MzY4LCANCisweDcwNjY2Zjc2LCAweDcwMThhMTg1LCAweDZmY2IwOTZmLCAweDZmN2RhNzEwLCANCisweDZmMzA3YTQxLCAweDZlZTM4MmRlLCAweDZlOTZjMGMzLCAweDZlNGEzM2M5LCANCisweDZkZmRkYmNjLCAweDZkYjFiOGE4LCAweDZkNjVjYTM4LCAweDZkMWExMDU3LCANCisweDZjY2U4YWUxLCAweDZjODMzOWIyLCAweDZjMzgxY2E2LCAweDZiZWQzMzk4LCANCisweDZiYTI3ZTY2LCAweDZiNTdmY2U5LCAweDZiMGRhZWZmLCAweDZhYzM5NDg1LCANCisweDZhNzlhZDU2LCAweDZhMmZmOTRmLCAweDY5ZTY3ODRkLCAweDY5OWQyYTJjLCANCisweDY5NTQwZWM5LCAweDY5MGIyNjAxLCAweDY4YzI2ZmIxLCAweDY4NzllYmI2LCANCisweDY4MzE5OWVkLCAweDY3ZTk3YTM0LCAweDY3YTE4YzY4LCAweDY3NTlkMDY1LCANCisweDY3MTI0NjBiLCAweDY2Y2FlZDM1LCAweDY2ODNjNWMzLCAweDY2M2NjZjkyLCANCisweDY1ZjYwYTgwLCAweDY1YWY3NjZhLCAweDY1NjkxMzJmLCAweDY1MjJlMGFkLCANCisweDY0ZGNkZWMzLCAweDY0OTcwZDRmLCAweDY0NTE2YzJlLCAweDY0MGJmYjQxLCANCisweDYzYzZiYTY0LCAweDYzODFhOTc4LCAweDYzM2NjODViLCAweDYyZjgxNmViLCANCisweDYyYjM5NTA5LCAweDYyNmY0MjkyLCAweDYyMmIxZjY2LCAweDYxZTcyYjY1LCANCisweDYxYTM2NjZkLCAweDYxNWZkMDVmLCAweDYxMWM2OTE5LCAweDYwZDkzMDdiLCANCisweDYwOTYyNjY1LCAweDYwNTM0YWI3LCAweDYwMTA5ZDUxLCAweDVmY2UxZTEyLCANCisweDVmOGJjY2RiLCAweDVmNDlhOThjLCAweDVmMDdiNDA1LCAweDVlYzVlYzI2LCANCisweDVlODQ1MWQwLCAweDVlNDJlNGUzLCAweDVlMDFhNTQwLCAweDVkYzA5MmM3LCANCisweDVkN2ZhZDU5LCAweDVkM2VmNGQ3LCAweDVjZmU2OTIzLCAweDVjYmUwYTFjLCANCisweDVjN2RkN2E0LCAweDVjM2RkMTljLCAweDViZmRmN2U1LCAweDViYmU0YTYxLCANCisweDViN2VjOGYyLCAweDViM2Y3Mzc3LCAweDViMDA0OWQ0LCAweDVhYzE0YmVhLCANCisweDVhODI3OTlhLCAweDVhNDNkMmM2LCAweDVhMDU1NzUxLCAweDU5YzcwNzFjLCANCisweDU5ODhlMjA5LCAweDU5NGFlN2ZiLCAweDU5MGQxOGQzLCAweDU4Y2Y3NDc0LCANCisweDU4OTFmYWMxLCAweDU4NTRhYjliLCAweDU4MTc4NmU2LCAweDU3ZGE4YzgzLCANCisweDU3OWRiYzU3LCAweDU3NjExNjQyLCAweDU3MjQ5YTI5LCAweDU2ZTg0N2VmLCANCisweDU2YWMxZjc1LCAweDU2NzAyMGEwLCAweDU2MzQ0YjUyLCAweDU1Zjg5ZjcwLCANCisweDU1YmQxY2RiLCAweDU1ODFjMzc4LCAweDU1NDY5MzI5LCAweDU1MGI4YmQ0LCANCisweDU0ZDBhZDViLCAweDU0OTVmN2ExLCAweDU0NWI2YThiLCAweDU0MjEwNWZkLCANCisweDUzZTZjOWRiLCAweDUzYWNiNjA3LCAweDUzNzJjYTY4LCAweDUzMzkwNmUwLCANCisweDUyZmY2YjU1LCAweDUyYzVmN2FhLCAweDUyOGNhYmMzLCAweDUyNTM4Nzg2LCANCisweDUyMWE4YWQ3LCAweDUxZTFiNTlhLCAweDUxYTkwN2I0LCAweDUxNzA4MTBiLCANCisweDUxMzgyMTgyLCAweDUwZmZlOGZlLCAweDUwYzdkNzY1LCAweDUwOGZlYzljLCANCisweDUwNTgyODg4LCAweDUwMjA4YjBlLCAweDRmZTkxNDEzLCAweDRmYjFjMzdjLCANCisweDRmN2E5OTMwLCAweDRmNDM5NTE0LCAweDRmMGNiNzBjLCAweDRlZDVmZjAwLCANCisweDRlOWY2Y2Q0LCAweDRlNjkwMDZlLCAweDRlMzJiOWI0LCAweDRkZmM5ODhjLCANCisweDRkYzY5Y2RkLCAweDRkOTBjNjhiLCAweDRkNWIxNTdlLCAweDRkMjU4OTljLCANCisweDRjZjAyMmNhLCAweDRjYmFlMGVmLCAweDRjODVjM2YxLCAweDRjNTBjYmI4LCANCisweDRjMWJmODI5LCAweDRiZTc0OTJiLCAweDRiYjJiZWE1LCAweDRiN2U1ODdkLCANCisweDRiNGExNjljLCAweDRiMTVmOGU2LCAweDRhZTFmZjQzLCAweDRhYWUyOTliLCANCisweDRhN2E3N2Q1LCAweDRhNDZlOWQ2LCAweDRhMTM3Zjg4LCAweDQ5ZTAzOGQwLCANCisweDQ5YWQxNTk4LCAweDQ5N2ExNWM0LCAweDQ5NDczOTNmLCAweDQ5MTQ3ZmVlLCANCisweDQ4ZTFlOWJhLCAweDQ4YWY3NjhhLCAweDQ4N2QyNjQ2LCAweDQ4NGFmOGQ2LCANCisweDQ4MThlZTIyLCAweDQ3ZTcwNjExLCAweDQ3YjU0MDhjLCAweDQ3ODM5ZDdiLCANCisweDQ3NTIxY2M2LCAweDQ3MjBiZTU1LCAweDQ2ZWY4MjEwLCAweDQ2YmU2N2UwLCANCisweDQ2OGQ2ZmFlLCAweDQ2NWM5OTYxLCAweDQ2MmJlNGUyLCAweDQ1ZmI1MjFhLCANCisweDQ1Y2FlMGYyLCAweDQ1OWE5MTUyLCAweDQ1NmE2MzIzLCAweDQ1M2E1NjRkLCANCisweDQ1MGE2YWJiLCAweDQ0ZGFhMDU0LCAweDQ0YWFmNzAyLCAweDQ0N2I2ZWFkLCANCisweDQ0NGMwNzQwLCAweDQ0MWNjMGEzLCAweDQzZWQ5YWMwLCAweDQzYmU5NTgwLCANCisweDQzOGZiMGNiLCAweDQzNjBlYzhkLCAweDQzMzI0OGFlLCAweDQzMDNjNTE3LCANCisweDQyZDU2MWI0LCAweDQyYTcxZTZjLCAweDQyNzhmYjJiLCAweDQyNGFmN2RhLCANCisweDQyMWQxNDYyLCAweDQxZWY1MGFlLCAweDQxYzFhY2E4LCAweDQxOTQyODM5LCANCisweDQxNjZjMzRjLCAweDQxMzk3ZGNjLCAweDQxMGM1N2EyLCAweDQwZGY1MGI4LCANCisweDQwYjI2OGZhLCAweDQwODVhMDUxLCAweDQwNThmNmE4LCAweDQwMmM2YmU5IA0KK307DQorDQorLyohDQorIA0KKyAgXGJyaWVmIGNhbGN1bGF0ZXMgMiBeICh4L3kpIGZvciB4PD0wLCB5ID4gMCwgeCA8PSAzMjc2OCAqIHkgDQorICANCisgIGF2b2lkcyBpbnRlZ2VyIGRpdmlzaW9uDQorICANCisgIFxyZXR1cm4gDQorKi8NCitXb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpDQorew0KKyAgV29yZDMyIGlQYXJ0Ow0KKyAgV29yZDMyIGZQYXJ0Ow0KKyAgV29yZDMyIHJlczsNCisgIFdvcmQzMiB0bXAsIHRtcDI7DQorICBXb3JkMzIgc2hpZnQsIHNoaWZ0MjsNCisNCisgIHRtcDIgPSAteDsNCisgIGlQYXJ0ID0gdG1wMiAvIHk7DQorICBmUGFydCA9IHRtcDIgLSBpUGFydCp5Ow0KKyAgaVBhcnQgPSBtaW4oaVBhcnQsSU5UX0JJVFMtMSk7DQorDQorICByZXMgPSBwb3cyVGFibGVbKFBPVzJfVEFCTEVfU0laRSpmUGFydCkveV0gPj4gaVBhcnQ7IA0KKyANCisgIHJldHVybihyZXMpOw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExOWJjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuaApAQCAtMCwwICsxLDg5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlvcGVyXzMyYi5oDQorDQorCUNvbnRlbnQ6CURvdWJsZSBwcmVjaXNpb24gb3BlcmF0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19PUEVSXzMyYl9ICisjZGVmaW5lIF9fT1BFUl8zMmJfSAorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKw0KKyNkZWZpbmUgUE9XMl9UQUJMRV9CSVRTIDgNCisjZGVmaW5lIFBPVzJfVEFCTEVfU0laRSAoMTw8UE9XMl9UQUJMRV9CSVRTKQ0KKwordm9pZCBMX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKTsKK1dvcmQzMiBMX0NvbXAgKFdvcmQxNiBoaSwgV29yZDE2IGxvKTsKK1dvcmQzMiBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpOworV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKTsKK1dvcmQzMiBEaXZfMzIgKFdvcmQzMiBMX251bSwgV29yZDMyIGRlbm9tKTsKK1dvcmQxNiBpTG9nNChXb3JkMzIgdmFsdWUpOw0KK1dvcmQzMiByc3FydChXb3JkMzIgdmFsdWUsICBXb3JkMzIgYWNjdXJhY3kpOw0KK1dvcmQzMiBwb3cyX3h5KFdvcmQzMiB4LCBXb3JkMzIgeSk7DQorDQorX19pbmxpbmUgV29yZDMyIExfbXB5X2xzKFdvcmQzMiBMX3ZhcjIsIFdvcmQxNiB2YXIxKQ0KK3sNCisgICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOw0KKyAgICBXb3JkMTYgc3dIaWdoMTsNCisgICAgV29yZDMyIGxfdmFyX291dDsNCisNCisgICAgc3dMb3cxID0gKHVuc2lnbmVkIHNob3J0KShMX3ZhcjIpOw0KKyAgICBzd0hpZ2gxID0gKFdvcmQxNikoTF92YXIyID4+IDE2KTsNCisNCisgICAgbF92YXJfb3V0ID0gKGxvbmcpc3dMb3cxICogKGxvbmcpdmFyMSA+PiAxNTsNCisgICAgDQorICAgIGxfdmFyX291dCArPSBzd0hpZ2gxICogdmFyMSA8PCAxOw0KKyAgICANCisgICAgcmV0dXJuKGxfdmFyX291dCk7DQorfQ0KKw0KK19faW5saW5lIFdvcmQzMiBMX21weV93eChXb3JkMzIgTF92YXIyLCBXb3JkMTYgdmFyMSkNCit7DQorI2lmIEFSTVY1VEVfTF9NUFlfTFMNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiU01VTFdCICAlW3Jlc3VsdF0sICVbTF92YXIyXSwgJVt2YXIxXSBcbiIgDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIyXSJyIihMX3ZhcjIpLCBbdmFyMV0iciIodmFyMSkNCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0Ow0KKyNlbHNlDQorICAgIHVuc2lnbmVkIHNob3J0IHN3TG93MTsNCisgICAgV29yZDE2IHN3SGlnaDE7DQorICAgIFdvcmQzMiBsX3Zhcl9vdXQ7DQorDQorICAgIHN3TG93MSA9ICh1bnNpZ25lZCBzaG9ydCkoTF92YXIyKTsNCisgICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7DQorDQorICAgIGxfdmFyX291dCA9IChsb25nKXN3TG93MSAqIChsb25nKXZhcjEgPj4gMTY7ICAgIA0KKyAgICBsX3Zhcl9vdXQgKz0gc3dIaWdoMSAqIHZhcjE7DQorICAgIA0KKyAgICByZXR1cm4obF92YXJfb3V0KTsNCisjZW5kaWYNCit9DQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNjI2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXR5cGVkZWYuaA0KKw0KKwlDb250ZW50Ogl0eXBlIGRlZmluZWQgZm9yIGRlZmZlcmVudCBwYWx0Zm9ybQ0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgdHlwZWRlZl9oCisjZGVmaW5lIHR5cGVkZWZfaCAiJElkICQiCisKKyN1bmRlZiBPUklHSU5BTF9UWVBFREVGX0ggLyogZGVmaW5lIHRvIGdldCAib3JpZ2luYWwiIEVUU0kgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0eXBlZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgT1JJR0lOQUxfVFlQRURFRl9ICisvKgorICogdGhpcyBpcyB0aGUgb3JpZ2luYWwgY29kZSBmcm9tIHRoZSBFVFNJIGZpbGUgdHlwZWRlZi5oCisgKi8KKyAgIAorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fWlRDX18pCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwordHlwZWRlZiBzaG9ydCBXb3JkMTY7Cit0eXBlZGVmIGxvbmcgV29yZDMyOwordHlwZWRlZiBpbnQgRmxhZzsKKworI2VsaWYgZGVmaW5lZChfX3N1bikKK3R5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7Cit0eXBlZGVmIHNob3J0IFdvcmQxNjsKK3R5cGVkZWYgbG9uZyBXb3JkMzI7Cit0eXBlZGVmIGludCBGbGFnOworCisjZWxpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fdW5peCkKK3R5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7Cit0eXBlZGVmIHNob3J0IFdvcmQxNjsKK3R5cGVkZWYgaW50IFdvcmQzMjsKK3R5cGVkZWYgaW50IEZsYWc7CisKKyNlbmRpZgorI2Vsc2UgLyogbm90IG9yaWdpbmFsIHR5cGVkZWYuaCAqLworCisvKgorICogdXNlIChpbXByb3ZlZCkgdHlwZSBkZWZpbml0aW9uIGZpbGUgdHlwZGVmcy5oIGFuZCBhZGQgYSAiRmxhZyIgdHlwZQorICovDQorI2luY2x1ZGUgInR5cGVkZWZzLmgiCit0eXBlZGVmIGludCBGbGFnOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxNmZjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZnMuaApAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdHlwZWRlZnMuaA0KKw0KKwlDb250ZW50Ogl0eXBlIGRlZmluZWQgb3IgY29uc3QgZGVmaW5lZA0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgdHlwZWRlZnNfaAorI2RlZmluZSB0eXBlZGVmc19oICIkSWQgJCIKKworI2lmbmRlZiBDSEFSX0JJVA0KKyNkZWZpbmUgQ0hBUl9CSVQgICAgICA4ICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYSBjaGFyICovDQorI2VuZGlmDQorDQorI2lmbmRlZiBWT0FBQ19TSFJUX01BWA0KKyNkZWZpbmUgVk9BQUNfU0hSVF9NQVggICAgKDMyNzY3KSAgICAgICAgLyogbWF4aW11bSAoc2lnbmVkKSBzaG9ydCB2YWx1ZSAqLw0KKyNlbmRpZg0KKworI2lmbmRlZiBWT0FBQ19TSFJUX01JTg0KKyNkZWZpbmUgVk9BQUNfU0hSVF9NSU4gICAgKC0zMjc2OCkgICAgICAgIC8qIG1pbmltdW0gKHNpZ25lZCkgc2hvcnQgdmFsdWUgKi8NCisjZW5kaWYNCisKKy8qIERlZmluZSBOVUxMIHBvaW50ZXIgdmFsdWUgKi8NCisjaWZuZGVmIE5VTEwNCisjaWZkZWYgX19jcGx1c3BsdXMNCisjZGVmaW5lIE5VTEwgICAgMA0KKyNlbHNlDQorI2RlZmluZSBOVUxMICAgICgodm9pZCAqKTApDQorI2VuZGlmDQorI2VuZGlmCisKKyNpZm5kZWYgYXNzZXJ0CisjZGVmaW5lIGFzc2VydChfRXhwcmVzc2lvbikgICAgICgodm9pZCkwKQorI2VuZGlmCisNCisjaWZkZWYgTElOVVgNCisjZGVmaW5lIF9faW5saW5lIHN0YXRpYyBfX2lubGluZV9fDQorI2VuZGlmDQorCisjZGVmaW5lIElOVF9CSVRTICAgMzIKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIENPTlNUQU5UUyAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworLyoKKyAqKioqKioqKiogZGVmaW5lIGNoYXIgdHlwZQorICovCit0eXBlZGVmIGNoYXIgQ2hhcjsKKworLyoKKyAqKioqKioqKiogZGVmaW5lIDggYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cworICovCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVXb3JkODsKKy8qCisgKioqKioqKioqIGRlZmluZSAxNiBiaXQgc2lnbmVkL3Vuc2lnbmVkIHR5cGVzICYgY29uc3RhbnRzCisgKi8KK3R5cGVkZWYgc2hvcnQgV29yZDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV29yZDE2OworCisvKgorICoqKioqKioqKiBkZWZpbmUgMzIgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cworICovCit0eXBlZGVmIGxvbmcgV29yZDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVXb3JkMzI7CisKKw0KKw0KKyNpZmRlZiBMSU5VWAordHlwZWRlZiBsb25nIGxvbmcgV29yZDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVVdvcmQ2NDsKKyNlbHNlCit0eXBlZGVmIF9faW50NjQgV29yZDY0Ow0KK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVV29yZDY0OworI2VuZGlmCisKKyNpZm5kZWYgbWluDQorI2RlZmluZSBtaW4oYSxiKSAoIGEgPCBiID8gYSA6IGIpDQorI2VuZGlmDQorDQorI2lmbmRlZiBtYXgNCisjZGVmaW5lIG1heChhLGIpICggYSA+IGIgPyBhIDogYikNCisjZW5kaWYNCisNCisjaWZkZWYgQVJNX0lOQVNNDQorI2lmZGVmIEFSTVY1X0lOQVNNDQorI2RlZmluZSBBUk1WNUVfSU5BU00JMQ0KKyNlbmRpZg0KKyNkZWZpbmUgQVJNVjRfSU5BU00JCTENCisjZW5kaWYNCisKKyNpZiBBUk1WNF9JTkFTTQ0KKwkjZGVmaW5lIEFSTVY1VEVfU0FUICAgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9BREQgICAgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX1NVQiAgICAgICAgICAgMQ0KKwkjZGVmaW5lIEFSTVY1VEVfU0hMICAgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9TSFIgICAgICAgICAgIDENCisJI2RlZmluZSBBUk1WNVRFX0xfU0hMICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfTF9TSFIgICAgICAgICAxDQorI2VuZGlmLy9BUk1WNA0KKyNpZiBBUk1WNUVfSU5BU00NCisgICAgI2RlZmluZSBBUk1WNVRFX0xfQUREICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfTF9TVUIgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9MX01VTFQgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX0xfTUFDICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfTF9NU1UgICAgICAgICAxDQorICAgDQorICAgIA0KKyAgICAjZGVmaW5lIEFSTVY1VEVfRElWX1MgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9ST1VORCAgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX01VTFQgICAgICAgICAgMQ0KKyAgICANCisgICAgI2RlZmluZSBBUk1WNVRFX05PUk1fUyAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfTk9STV9MICAgICAgICAxDQorCSNkZWZpbmUgQVJNVjVURV9MX01QWV9MUwkgIDENCisjZW5kaWYKKw0KKy8vYmFzaWMgb3BlcmF0aW9uIGZ1bmN0aW9ucyBvcHRpbWl6YXRpb24gZmxhZ3MNCisjZGVmaW5lIFNBVFJVQVRFX0lTX0lOTElORSAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNhdHVyYXRlIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAvL2RlZmluZSBzaGwgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBTSFJfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzaHIgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX01VTFRfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX211bHQgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX01TVV9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21zdSBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIExfU1VCX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc3ViIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTF9TSExfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9zaGwgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX1NIUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3NociBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIEFERF9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGFkZCBhcyBpbmxpbmUgZnVuY3Rpb24gLy9hZGQsIGlubGluZSBpcyB0aGUgYmVzdA0KKyNkZWZpbmUgU1VCX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgc3ViIGFzIGlubGluZSBmdW5jdGlvbiAvL3N1YiwgaW5saW5lIGlzIHRoZSBiZXN0DQorI2RlZmluZSBESVZfU19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBkaXZfcyBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIE1VTFRfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG11bHQgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBOT1JNX1NfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBub3JtX3MgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBOT1JNX0xfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBub3JtX2wgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBST1VORF9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSByb3VuZCBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIExfTUFDX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfbWFjIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTF9BRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9hZGQgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBFWFRSQUNUX0hfSVNfSU5MSU5FICAgICAgICAgICAgIDEgICAvL2RlZmluZSBleHRyYWN0X2ggYXMgaW5saW5lIGZ1bmN0aW9uIA0KKyNkZWZpbmUgRVhUUkFDVF9MX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9sIGFzIGlubGluZSBmdW5jdGlvbiAgICAgICAgLy8/Pz8NCisjZGVmaW5lIE1VTFRfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG11bHRfciBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIFNIUl9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNocl9yIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTUFDX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbWFjX3IgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBNU1VfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtc3VfciBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIExfU0hSX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hyX3IgYXMgaW5saW5lIGZ1bmN0aW9uDQorDQorI2RlZmluZSBQUkVGSVgJCQkJdm9BQUNFbmMNCisjZGVmaW5lIExJTkswKHgsIHksIHopCQlMSU5LMSh4LHkseikNCisjZGVmaW5lIExJTksxKHgseSx6KQkJeCMjeSMjeg0KKyNkZWZpbmUgQUREX1BSRUZJWChmdW5jKQlMSU5LMChQUkVGSVgsIF8sIGZ1bmMpDQorDQorI2RlZmluZSAgTF9FeHRyYWN0CQlBRERfUFJFRklYKExfRXh0cmFjdCkNCisjZGVmaW5lICBMX0NvbXAJCQlBRERfUFJFRklYKExfQ29tcCkNCisjZGVmaW5lICBNcHlfMzIJCQlBRERfUFJFRklYKE1weV8zMikNCisjZGVmaW5lICBNcHlfMzJfMTYJCUFERF9QUkVGSVgoTXB5XzMyXzE2KQ0KKyNkZWZpbmUgIERpdl8zMgkJCUFERF9QUkVGSVgoRGl2XzMyKQ0KKyNkZWZpbmUgIGlMb2c0CQkJQUREX1BSRUZJWChpTG9nNCkNCisjZGVmaW5lICByc3FydAkJCUFERF9QUkVGSVgocnNxcnQpDQorI2RlZmluZSAgcG93Ml94eQkJQUREX1BSRUZJWChwb3cyX3h5KQ0KKyNkZWZpbmUgIExfbXB5X2xzCQlBRERfUFJFRklYKExfbXB5X2xzKQ0KKyNkZWZpbmUgIExfbXB5X3d4CQlBRERfUFJFRklYKExfbXB5X3d4KQ0KKw0KKyNkZWZpbmUgbWVtX21hbGxvYwkJQUREX1BSRUZJWChtZW1fbWFsbG9jKQ0KKyNkZWZpbmUgbWVtX2ZyZWUJCUFERF9QUkVGSVgobWVtX2ZyZWUpDQorDQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNjNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZQpAQCAtMCwwICsxLDU1IEBACisjLyoNCisjKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjKioNCisjKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIyoqDQorIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjKioNCisjKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjKi8NCisNCisjIHRhcmdldDYNCisjIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikNCitWT1RUOj0gdjUNCisNCisNCisjIG1vZHVsZSB0eXBlDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQ0KK1ZPTVQ6PSBsaWINCisNCisNCisjIG1vZHVsZSBtYWNyb3MNCisjIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiANCisjIGUuZy4gLURWSVNVQUxPTiwgbWFjcm8gVklTVUFMT04gZGVmaW5lZCBmb3IgeW91ciBtb2R1bGUgDQorVk9NTTo9IC1EQVJNVjVFIC1EQVJNX0lOQVNNIC1EQVJNVjVfSU5BU00gDQorDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQ0KK1ZPVEFSR0VUOj1saWJ2b0FBQ0VuY3Y1DQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsgDQorDQorIyBkZXBlbmRlbnQgbGlicmFyaWVzLg0KK1ZPREVQTElCUzo9Iy1sZGwgLWxzdGRjKysgDQorDQorIyBtb2R1bGUgc291cmNlDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUNCitpbmNsdWRlIC4uLy4uL21zLm1rDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkDQorVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UNCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2UyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQpAQCAtMCwwICsxLDU1IEBACisjLyoNCisjKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjKioNCisjKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIyoqDQorIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjKioNCisjKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjKi8NCisNCisjIHRhcmdldDYNCisjIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikNCitWT1RUOj0gdjcNCisNCisNCisjIG1vZHVsZSB0eXBlDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQ0KK1ZPTVQ6PSBsaWINCisNCisNCisjIG1vZHVsZSBtYWNyb3MNCisjIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiANCisjIGUuZy4gLURWSVNVQUxPTiwgbWFjcm8gVklTVUFMT04gZGVmaW5lZCBmb3IgeW91ciBtb2R1bGUgDQorVk9NTTo9IC1EQVJNVjVFIC1EQVJNVjdOZW9uIC1EQVJNX0lOQVNNIC1EQVJNVjVfSU5BU00gDQorDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQ0KK1ZPVEFSR0VUOj1saWJ2b0FBQ0VuY3Y3DQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsgDQorDQorIyBkZXBlbmRlbnQgbGlicmFyaWVzLg0KK1ZPREVQTElCUzo9Iy1sZGwgLWxzdGRjKysgDQorDQorIyBtb2R1bGUgc291cmNlDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUNCitpbmNsdWRlIC4uLy4uL21zLm1rDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkDQorVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UNCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayAgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmIzYzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKQEAgLTAsMCArMSw0MCBAQAorIy8qCisjKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyMqKgorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMqKgorIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMqKgorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMqLworCisjIEp1c3QgYWN0aW5nIGFzIEZhdGhlciBNYWtlZmlsZSBvZiBNb2R1bGVzCisjIHBsZWFzZSBrZWVwIHRoZSBuYW1lICdtYWtlZmlsZScgdW5jaGFuZ2VkCisgCisjIE1vZHVsZSBTdWJkaXJzCitWT01TRDo9JChkaXIgJChzaGVsbCBmaW5kIC4gLW5hbWUgJ01ha2VmaWxlJykpCisKK2FsbDoKKwlmb3IgZGlyIGluICQoVk9NU0QpOyBcCisJCWRvIFwKKwkJCSQoTUFLRSkgLUMgJCRkaXI7IFwKKwkJZG9uZQorCisuUEhPTlk6Y2xlYW4gZGV2ZWwKK2NsZWFuOgorCWZvciBkaXIgaW4gJChWT01TRCk7IFwKKwkJZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBjbGVhbjsgXAorCQlkb25lCisKK2RldmVsOgorCWZvciBkaXIgaW4gJChWT01TRCk7IFwKKwkJZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBkZXZlbDsgXAorCQlkb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdlZmJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5tawpAQCAtMCwwICsxLDQyIEBACisjLyoNCisjKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjKioNCisjKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIyoqDQorIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjKioNCisjKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjKi8NCisNCisNCisjIHBsZWFzZSBsaXN0IGFsbCBvYmplY3RzIG5lZWRlZCBieSB5b3VyIHRhcmdldCBoZXJlDQorT0JKUzo9YmFzaWNvcDIubyBvcGVyXzMyYi5vIGFhY19yb20ubyBhYWNlbmMubyBhYWNlbmNfY29yZS5vIGFkal90aHIubyBcDQorCQkJYmFuZF9ucmcubyBiaXRfY250Lm8gYml0YnVmZmVyLm8gYml0ZW5jLm8gYmxvY2tfc3dpdGNoLm8gY2hhbm5lbF9tYXAubyBcDQorCQkJZHluX2JpdHMubyBncnBfZGF0YS5vIGludGVyZmFjZS5vIGxpbmVfcGUubyBtZW1hbGlnbi5vIG1zX3N0ZXJlby5vIFwNCisJCQlwcmVfZWNob19jb250cm9sLm8gcHN5X2NvbmZpZ3VyYXRpb24ubyBwc3lfbWFpbi5vIHFjX21haW4ubyBxdWFudGl6ZS5vIHNmX2VzdGltLm8gXA0KKwkJCXNwcmVhZGluZy5vIHN0YXRfYml0cy5vIHRucy5vIHRyYW5zZm9ybS5vDQorCQkJDQorIyBwbGVhc2UgbGlzdCBhbGwgZGlyZWN0b3JpZXMgdGhhdCBhbGwgc291cmNlIGZpbGVzIHJlbGF0aXZlIHdpdGggeW91ciBtb2R1bGUoLmggLmMgLmNwcCkgbG9jYXRlIA0KK1ZPU1JDRElSOj0uLi8uLi8uLi9zcmMgXA0KKwkJCQkJLi4vLi4vLi4vaW5jIFwNCisJCQkJCS4uLy4uLy4uL2Jhc2ljX29wXA0KKwkJCQkJLi4vLi4vLi4vLi4vLi4vSW5jbHVkZSANCisJCQkJCQ0KK2lmZXEgKCQoVk9UVCksIHY1KQ0KK09CSlMrPSBBdXRvQ29ycmVsYXRpb25fdjUubyBiYW5kX25yZ192NS5vIENhbGNXaW5kb3dFbmVyZ3lfdjUubyBcDQorCQkJCVByZVBvc3RNRENUX3Y1Lm8gUjRSOEZpcnN0X3Y1Lm8gUmFkaXg0RkZUX3Y1Lm8NCitWT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFLw0KK2VuZGlmCQ0KKw0KK2lmZXEgKCQoVk9UVCksIHY3KQ0KK09CSlMrPSBBdXRvQ29ycmVsYXRpb25fdjUubyBiYW5kX25yZ192NS5vIENhbGNXaW5kb3dFbmVyZ3lfdjUubyBcDQorCQkJIFByZVBvc3RNRENUX3Y3Lm8gUjRSOEZpcnN0X3Y3Lm8gUmFkaXg0RkZUX3Y3Lm8NCitWT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFLw0KK1ZPU1JDRElSKz0gLi4vLi4vLi4vc3JjL2FzbS9BUk1WNy8NCitlbmRpZgkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZG9jL3ZvQUFDRW5jb2RlclNESy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0ZDBmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZG9jL3ZvQUFDRW5jb2RlclNESy5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDI5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNfcm9tLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWFhY19yb20uaA0KKw0KKwlDb250ZW50Ogljb25zdGFudCB0YWJsZXMgDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBST01fSAorI2RlZmluZSBST01fSAorDQorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInRuc19wYXJhbS5oIgorCisvKgorICBtZGN0CisqLworZXh0ZXJuIGNvbnN0IGludCBTaG9ydFdpbmRvd1NpbmVbRlJBTUVfTEVOX1NIT1JULzJdOworZXh0ZXJuIGNvbnN0IGludCBMb25nV2luZG93S0JEW0ZSQU1FX0xFTl9MT05HLzJdOw0KKw0KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGJpdHJldlRhYlsxNyArIDEyOV07DQorZXh0ZXJuIGNvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF07DQorDQorI2lmIGRlZmluZWQgKEFSTVY1RSkgJiYgIWRlZmluZWQgKEFSTVY3TmVvbikNCitleHRlcm4gY29uc3QgaW50IHR3aWRUYWI2NFsoNCo2ICsgMTYqNikvMl07DQorZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWyg4KjYgKyAzMio2ICsgMTI4KjYpLzJdOw0KKyNlbHNlDQorZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl07DQorZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWzgqNiArIDMyKjYgKyAxMjgqNl07CisjZW5kaWYKKworLyoKKyAgZm9ybSBmYWN0b3IKKyovCitleHRlcm4gY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XTsKKworLyoKKyAgcXVhbnRpemVyCisqLworZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzNfNFs1MTJdOworZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzRfM1s1MTJdOworLyohICQyXnstXGZyYWN7bn17MTZ9fSQgdGFibGUgKi8KK2V4dGVybiBjb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA7CisKK2V4dGVybiBXb3JkMzIgc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jWzRdWzE0XTsKK2V4dGVybiBjb25zdCBVV29yZDggc3BlY0V4cFRhYmxlQ29tYl9lbmNbNF1bMTRdOworCitleHRlcm4gY29uc3QgV29yZDE2IHF1YW50Qm9yZGVyc1s0XVs0XTsKKy8vZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzNdWzRdOw0KK2V4dGVybiBjb25zdCBXb3JkMTYgcXVhbnRSZWNvbls0XVszXTsKKworLyoKKyAgaHVmZm1hbgorKi8KK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjFfMlszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjNfNFszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjVfNls5XVs5XTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjdfOFs4XVs4XTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjlfMTBbMTNdWzEzXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjExWzE3XVsxN107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWJzY2ZbMTIxXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjFbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIyWzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiM1szXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjRbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI1WzldWzldOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNls5XVs5XTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjdbOF1bOF07CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI4WzhdWzhdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiOVsxM11bMTNdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTBbMTNdWzEzXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjExWzE3XVsxN107CitleHRlcm4gY29uc3QgVVdvcmQzMiBodWZmX2N0YWJzY2ZbMTIxXTsKKworCisKKy8qCisgIG1pc2MKKyovCitleHRlcm4gY29uc3QgaW50IHNhbXBSYXRlVGFiW05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBpbnQgQmFuZHdpdGhDb2VmVGFiWzhdW05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBpbnQgcmF0ZXNbOF07DQorZXh0ZXJuIGNvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbFNob3J0W05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBVV29yZDggc2ZCYW5kVG90YWxMb25nW05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBpbnQgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU107DQorZXh0ZXJuIGNvbnN0IHNob3J0IHNmQmFuZFRhYlNob3J0Wzc2XTsNCitleHRlcm4gY29uc3QgaW50IHNmQmFuZFRhYkxvbmdPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU107DQorZXh0ZXJuIGNvbnN0IHNob3J0IHNmQmFuZFRhYkxvbmdbMzI1XTsNCisKK2V4dGVybiBjb25zdCBXb3JkMzIgbV9sb2cyX3RhYmxlW0lOVF9CSVRTXTsKKworLyoKKyAgVE5TCisqLworZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjNbOF07DQorZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjNCb3JkZXJzWzhdOw0KK2V4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmY0WzE2XTsNCitleHRlcm4gY29uc3QgV29yZDMyIHRuc0NvZWZmNEJvcmRlcnNbMTZdOw0KK2V4dGVybiBjb25zdCBXb3JkMzIgaW52U0JGWzI0XTsNCitleHRlcm4gY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXTsNCitleHRlcm4gY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiU2hvcnRbTUFYX1NGQl9TSE9SVCArIDFdOworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNlbmNfY29yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWExZDIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaApAQCAtMCwwICsxLDExNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWFjZW5jX2NvcmUuaA0KKw0KKwlDb250ZW50OglhYWMgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfYWFjZW5jX2NvcmVfaF8KKyNkZWZpbmUgX2FhY2VuY19jb3JlX2hfCisKKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiDQorI2luY2x1ZGUgImJpdGVuYy5oIg0KKw0KKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIg0KKyNpbmNsdWRlICJwc3lfbWFpbi5oIg0KKyNpbmNsdWRlICJxY19tYWluLmgiDQorI2luY2x1ZGUgInBzeV9tYWluLmgiDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiAgc3RydWN0IHsKKyAgV29yZDMyICAgc2FtcGxlUmF0ZTsgICAgICAgICAgICAvKiBhdWRpbyBmaWxlIHNhbXBsZSByYXRlICovCisgIFdvcmQzMiAgIGJpdFJhdGU7ICAgICAgICAgICAgICAgLyogZW5jb2RlciBiaXQgcmF0ZSBpbiBiaXRzL3NlYyAqLworICBXb3JkMTYgICBuQ2hhbm5lbHNJbjsgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBvbiBpbnB1dCAoMSwyKSAqLworICBXb3JkMTYgICBuQ2hhbm5lbHNPdXQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBvbiBvdXRwdXQgKDEsMikgKi8KKyAgV29yZDE2ICAgYmFuZFdpZHRoOyAgICAgICAgICAgICAvKiB0YXJnZXRlZCBhdWRpbyBiYW5kd2lkdGggaW4gSHogKi8NCisgIFdvcmQxNiAgIGFkdHNVc2VkOwkJCSAgLyogd2hldGhlciB3cml0ZSBhZHRzIGhlYWRlciAqLworfSBBQUNFTkNfQ09ORklHOworDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwkNCisgIEFBQ0VOQ19DT05GSUcgY29uZmlnOyAgICAgLyogV29yZDE2IHNpemU6IDggKi8NCisNCisgIEVMRU1FTlRfSU5GTyBlbEluZm87ICAgICAgLyogV29yZDE2IHNpemU6IDQgKi8NCisNCisgIFFDX1NUQVRFIHFjS2VybmVsOyAgICAgICAgLyogV29yZDE2IHNpemU6IDYgKyA1KFBBRERJTkcpICsgNyhFTEVNRU5UX0JJVFMpICsgNTQoQURKX1RIUl9TVEFURSkgPSA3MiAqLw0KKyAgUUNfT1VUICAgcWNPdXQ7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjkyMChRQ19PVVRfQ0hBTk5FTCkgKyA1KFFDX09VVF9FTEVNRU5UKSArIDcgPSA5MzIgLyAxODUyICovDQorDQorICBQU1lfT1VUICAgIHBzeU91dDsgICAgICAgIC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMTg2ICsgMiA9IDE4OCAvIDM3NCAqLw0KKyAgUFNZX0tFUk5FTCBwc3lLZXJuZWw7ICAgICAvKiBXb3JkMTYgc2l6ZTogIDI1ODcgLyA0NDkxICovDQorDQorICBzdHJ1Y3QgQklUU1RSRUFNRU5DT0RFUl9JTklUIGJzZUluaXQ7IC8qIFdvcmQxNiBzaXplOiA2ICovDQorICBzdHJ1Y3QgQklUX0JVRiAgYml0U3RyZWFtOyAgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiA4ICovDQorICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbTsNCisgIGludAkJCSAgaW5pdE9LOw0KKw0KKyAgc2hvcnQJCQkqaW50YnVmOw0KKyAgc2hvcnQJCQkqZW5jYnVmOw0KKyAgc2hvcnQJCQkqaW5idWY7DQorICBpbnQJCQllbmNsZW47DQorICBpbnQJCQlpbmxlbjsNCisgIGludAkJCWludGxlbjsNCisgIGludAkJCXVzZWxlbmd0aDsNCisNCisgIHZvaWQJCQkqaENoZWNrOw0KKyAgVk9fTUVNX09QRVJBVE9SICp2b01lbW9wOw0KKyAgVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsNCisNCit9QUFDX0VOQ09ERVI7IC8qIFdvcmQxNiBzaXplOiAzODA5IC8gNjg1MSAqLw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnVuY3Rpb25uYW1lOiBBYWNJbml0RGVmYXVsdENvbmZpZworZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorcmV0dXJuczogICAgICAtLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnVuY3Rpb25uYW1lOkFhY0VuY09wZW4KK2Rlc2NyaXB0aW9uOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCityZXR1cm5zOiAgICAgQUFDRU5DX09LIGlmIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworV29yZDE2ICBBYWNFbmNPcGVuIChBQUNfRU5DT0RFUgkJCQkqaEFhY0VuYywgICAgICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCisgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBBQUNFTkNfQ09ORklHICAgICBjb25maWcpOyAgICAgICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KKworV29yZDE2IEFhY0VuY0VuY29kZShBQUNfRU5DT0RFUgkJICAgKmhBYWNFbmMsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAqdGltZVNpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICAgICAgICphbmNCeXRlcywgICAgICAvKiE8IHBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpudW1BbmNCeXRlcywgICAvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcywgc2VuZCBhcyBmaWxsIGVsZW1lbnQgICovCisgICAgICAgICAgICAgICAgICAgIFVXb3JkOCAgICAgICAgICAgICAqb3V0Qnl0ZXMsICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgICAgKm51bU91dEJ5dGVzICAgIC8qITwgbnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZnVuY3Rpb25uYW1lOkFhY0VuY0Nsb3NlCitkZXNjcmlwdGlvbjogZGVhbGxvY2F0ZSBhbiBlbmNvZGVyIGluc3RhbmNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7IC8qIGFuIGVuY29kZXIgaGFuZGxlICovCisKKyNlbmRpZiAvKiBfYWFjZW5jX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1N2NiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHIuaApAQCAtMCwwICsxLDU3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhZGpfdGhyLmgNCisNCisJQ29udGVudDoJVGhyZXNob2xkIGNvbXBlbnNhdGlvbiBmdW5jdGlvbiANCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQURKX1RIUl9ICisjZGVmaW5lIF9fQURKX1RIUl9ICisKKyNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKK1dvcmQxNiBiaXRzMnBlKGNvbnN0IFdvcmQxNiBiaXRzKTsKKworV29yZDMyIEFkalRock5ldyhBREpfVEhSX1NUQVRFKiogcGhBZGpUaHIsCisgICAgICAgICAgICAgICAgIFdvcmQzMiBuRWxlbWVudHMpOworCit2b2lkIEFkalRockRlbGV0ZShBREpfVEhSX1NUQVRFICpoQWRqVGhyKTsKKwordm9pZCBBZGpUaHJJbml0KEFESl9USFJfU1RBVEUgKmhBZGpUaHIsCisgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIHBlTWVhbiwKKyAgICAgICAgICAgICAgICBXb3JkMzIgY2hCaXRyYXRlKTsKKwordm9pZCBBZGp1c3RUaHJlc2hvbGRzKEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBBZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpjaEJpdERpc3RyaWJ1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPRSwKKwkJCQkJICBFTEVNRU5UX0JJVFMqIGVsQml0cywKKwkJCQkJICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhCaXRGYWMpOworCit2b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZDQzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWFkal90aHJfZGF0YS5oDQorDQorCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gcGFyYW1ldGVyIA0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19BREpfVEhSX0RBVEFfSAorI2RlZmluZSBfX0FESl9USFJfREFUQV9ICisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgImxpbmVfcGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgV29yZDE2IGNsaXBTYXZlTG93LCBjbGlwU2F2ZUhpZ2g7CisgICBXb3JkMTYgbWluQml0U2F2ZSwgbWF4Qml0U2F2ZTsKKyAgIFdvcmQxNiBjbGlwU3BlbmRMb3csIGNsaXBTcGVuZEhpZ2g7CisgICBXb3JkMTYgbWluQml0U3BlbmQsIG1heEJpdFNwZW5kOworfSBCUkVTX1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBVV29yZDggbW9kaWZ5TWluU25yOworICAgV29yZDE2IHN0YXJ0U2ZiTCwgc3RhcnRTZmJTOworfSBBSF9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBXb3JkMzIgbWF4UmVkOworICBXb3JkMzIgc3RhcnRSYXRpbywgbWF4UmF0aW87CisgIFdvcmQzMiByZWRSYXRpb0ZhYzsKKyAgV29yZDMyIHJlZE9mZnM7Cit9IE1JTlNOUl9BREFQVF9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXNlcnZvaXIgY29udHJvbCAqLworICBXb3JkMTYgcGVNaW4sIHBlTWF4OworICAvKiBjb25zdGFudCBvZmZzZXQgdG8gcGUgICAgICAgICAgICAgICAqLworICBXb3JkMTYgIHBlT2Zmc2V0OworICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLworICBBSF9QQVJBTSBhaFBhcmFtOworICAvKiBwYXJhbXRlcnMgZm9yIGFkYXB0YXRpb24gb2YgbWluU25yICovCisgIE1JTlNOUl9BREFQVF9QQVJBTSBtaW5TbnJBZGFwdFBhcmFtOworICAvKiB2YWx1ZXMgZm9yIGNvcnJlY3Rpb24gb2YgcGUgKi8KKyAgV29yZDE2IHBlTGFzdDsKKyAgV29yZDE2IGR5bkJpdHNMYXN0OworICBXb3JkMTYgcGVDb3JyZWN0aW9uRmFjdG9yOworfSBBVFNfRUxFTUVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBCUkVTX1BBUkFNICAgYnJlc1BhcmFtTG9uZywgYnJlc1BhcmFtU2hvcnQ7IC8qIFdvcmQxNiBzaXplOiAyKjggKi8KKyAgQVRTX0VMRU1FTlQgIGFkalRoclN0YXRlRWxlbTsgICAgICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogMTkgKi8KK30gQURKX1RIUl9TVEFURTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmFuZF9ucmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODUwOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmFuZF9ucmcuaApAQCAtMCwwICsxLDQ2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliYW5kX25yZy5oDQorDQorCUNvbnRlbnQ6CUJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb25zIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfQkFORF9OUkdfSAorI2RlZmluZSBfQkFORF9OUkdfSAorCisjaW5jbHVkZSAidHlwZWRlZi5oIgorCisKK3ZvaWQgQ2FsY0JhbmRFbmVyZ3koY29uc3QgV29yZDMyICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTdW0pOworCisKK3ZvaWQgQ2FsY0JhbmRFbmVyZ3lNUyhjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWQsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkU3VtLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZVN1bSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0X2NudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0X2NudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODMxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJpdF9jbnQuaA0KKw0KKwlDb250ZW50OglIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlciBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19CSVRDT1VOVF9ICisjZGVmaW5lIF9fQklUQ09VTlRfSAorCisjaW5jbHVkZSAiYml0YnVmZmVyLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiCisjZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKE1BWF8xNi80KQorCisvKgorICBjb2RlIGJvb2sgbnVtYmVyIHRhYmxlCisqLworCitlbnVtIGNvZGVCb29rTm97CisgIENPREVfQk9PS19aRVJPX05PPSAgICAgICAgICAgICAgIDAsCisgIENPREVfQk9PS18xX05PPSAgICAgICAgICAgICAgICAgIDEsCisgIENPREVfQk9PS18yX05PPSAgICAgICAgICAgICAgICAgIDIsCisgIENPREVfQk9PS18zX05PPSAgICAgICAgICAgICAgICAgIDMsCisgIENPREVfQk9PS180X05PPSAgICAgICAgICAgICAgICAgIDQsCisgIENPREVfQk9PS181X05PPSAgICAgICAgICAgICAgICAgIDUsCisgIENPREVfQk9PS182X05PPSAgICAgICAgICAgICAgICAgIDYsCisgIENPREVfQk9PS183X05PPSAgICAgICAgICAgICAgICAgIDcsCisgIENPREVfQk9PS184X05PPSAgICAgICAgICAgICAgICAgIDgsCisgIENPREVfQk9PS185X05PPSAgICAgICAgICAgICAgICAgIDksCisgIENPREVfQk9PS18xMF9OTz0gICAgICAgICAgICAgICAgMTAsCisgIENPREVfQk9PS19FU0NfTk89ICAgICAgICAgICAgICAgMTEsCisgIENPREVfQk9PS19SRVNfTk89ICAgICAgICAgICAgICAgMTIsCisgIENPREVfQk9PS19QTlNfTk89ICAgICAgICAgICAgICAgMTMKK307CisKKy8qCisgIGNvZGUgYm9vayBpbmRleCB0YWJsZQorKi8KKworZW51bSBjb2RlQm9va05keHsKKyAgQ09ERV9CT09LX1pFUk9fTkRYPTAsCisgIENPREVfQk9PS18xX05EWCwKKyAgQ09ERV9CT09LXzJfTkRYLAorICBDT0RFX0JPT0tfM19ORFgsCisgIENPREVfQk9PS180X05EWCwKKyAgQ09ERV9CT09LXzVfTkRYLAorICBDT0RFX0JPT0tfNl9ORFgsCisgIENPREVfQk9PS183X05EWCwKKyAgQ09ERV9CT09LXzhfTkRYLAorICBDT0RFX0JPT0tfOV9ORFgsCisgIENPREVfQk9PS18xMF9ORFgsCisgIENPREVfQk9PS19FU0NfTkRYLAorICBDT0RFX0JPT0tfUkVTX05EWCwKKyAgQ09ERV9CT09LX1BOU19ORFgsCisgIE5VTUJFUl9PRl9DT0RFX0JPT0tTCit9OworCisvKgorICBjb2RlIGJvb2sgbGF2IHRhYmxlCisqLworCitlbnVtIGNvZGVCb29rTGF2eworICBDT0RFX0JPT0tfWkVST19MQVY9MCwKKyAgQ09ERV9CT09LXzFfTEFWPTEsCisgIENPREVfQk9PS18yX0xBVj0xLAorICBDT0RFX0JPT0tfM19MQVY9MiwKKyAgQ09ERV9CT09LXzRfTEFWPTIsCisgIENPREVfQk9PS181X0xBVj00LAorICBDT0RFX0JPT0tfNl9MQVY9NCwKKyAgQ09ERV9CT09LXzdfTEFWPTcsCisgIENPREVfQk9PS184X0xBVj03LAorICBDT0RFX0JPT0tfOV9MQVY9MTIsCisgIENPREVfQk9PS18xMF9MQVY9MTIsCisgIENPREVfQk9PS19FU0NfTEFWPTE2LAorICBDT0RFX0JPT0tfU0NGX0xBVj02MCwKKyAgQ09ERV9CT09LX1BOU19MQVY9NjAKK307CisKK1dvcmQxNiBiaXRDb3VudChjb25zdCBXb3JkMTYgKmFRdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbm9PZlNwZWNMaW5lcywKKyAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIG1heFZhbCwKKyAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50THV0KTsKKworV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKTsKKworV29yZDE2IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgZGVsdGEpOworV29yZDE2IGNvZGVTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBzY2FsZWZhY3RvciwgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSk7CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4NTBjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGJ1ZmZlci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJpdGJ1ZmZlci5oDQorDQorCUNvbnRlbnQ6CUJpdCBCdWZmZXIgTWFuYWdlbWVudCBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQklUQlVGRkVSX0gKKyNkZWZpbmUgQklUQlVGRkVSX0gKKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKworCitlbnVtIGRpcmVjdGlvbgoreworICBmb3J3YXJkRGlyZWN0aW9uLAorICBiYWNrd2FyZERpcmVjdGlvbgorfTsKKworCisvKiEKKyAgIFRoZSBwb2ludGVyICdwUmVhZE5leHQnIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgd29yZCwgd2hlcmUgYml0cyBjYW4gYmUgcmVhZCBmcm9tLiBUaGUgcG9pbnRlcgorICAgJ3BXcml0ZU5leHQnIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgd29yZCwgd2hlcmUgYml0cyBjYW4gYmUgd3JpdHRlbiB0by4gVGhlIHBvaW50ZXIgcEJpdEJ1ZkJhc2UKKyAgIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIGJpdHN0cmVhbSBidWZmZXIgYW5kIHRoZSBwb2ludGVyIHBCaXRCdWZFbmQgcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIGJpdHN0cmVhbQorICAgYnVmZmVyLiBUaGUgdHdvIHBvaW50ZXJzIGFyZSB1c2VkIGFzIGxvd2VyLWJvdW5kIHJlc3BlY3RpdmVseSB1cHBlci1ib3VuZCBhZGRyZXNzIGZvciB0aGUgbW9kdWxvIGFkZHJlc3NpbmcKKyAgIG1vZGUuCisKKyAgIFRoZSBlbGVtZW50IGNudEJpdHMgY29udGFpbnMgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgYml0cyBpbiB0aGUgYml0IGJ1ZmZlci4gSXQgd2lsbCBiZSBpbmNyZW1lbnRlZCB3aGVuCisgICBiaXRzIGFyZSB3cml0dGVuIHRvIHRoZSBiaXRzdHJlYW0gYnVmZmVyIGFuZCBkZWNyZW1lbnRlZCB3aGVuIGJpdHMgYXJlIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtIGJ1ZmZlci4KKyovCitzdHJ1Y3QgQklUX0JVRgoreworICBVV29yZDggKnBCaXRCdWZCYXNlOyAgICAgICAgICAvKiE8IHBvaW50ZXIgcG9pbnRzIHRvIGZpcnN0IHBvc2l0aW9uIGluIGJpdHN0cmVhbSBidWZmZXIgKi8KKyAgVVdvcmQ4ICpwQml0QnVmRW5kOyAgICAgICAgICAgLyohPCBwb2ludGVyIHBvaW50cyB0byBsYXN0IHBvc2l0aW9uIGluIGJpdHN0cmVhbSBidWZmZXIgKi8KKworICBVV29yZDggKnBXcml0ZU5leHQ7ICAgICAgICAgICAvKiE8IHBvaW50ZXIgcG9pbnRzIHRvIG5leHQgYXZhaWxhYmxlIHdvcmQgaW4gYml0c3RyZWFtIGJ1ZmZlciB0byB3cml0ZSAqLworCisgIFVXb3JkMzIgY2FjaGU7CisKKyAgV29yZDE2ICB3Qml0UG9zOyAgICAgICAgICAgICAgLyohPCAzMTw9d0JpdFBvczw9MCovCisgIFdvcmQxNiAgY250Qml0czsgICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgYml0cyB0byBiaXRzdHJlYW0gYnVmZmVyICA9PiBpbmNyZW1lbnQgY250Qml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYml0cyBmcm9tIGJpdHN0cmVhbSBidWZmZXIgPT4gZGVjcmVtZW50IGNudEJpdHMgKi8KKyAgV29yZDE2ICBzaXplOyAgICAgICAgICAgICAgICAgLyohPCBzaXplIG9mIGJpdGJ1ZmZlciBpbiBiaXRzICovCisgIFdvcmQxNiAgaXNWYWxpZDsgICAgICAgICAgICAgIC8qITwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCit9OyAvKiBzaXplIFdvcmQxNjogOCAqLworCisvKiEgRGVmaW5lIHBvaW50ZXIgdG8gYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IEJJVF9CVUYgKkhBTkRMRV9CSVRfQlVGOworCisKK0hBTkRMRV9CSVRfQlVGIENyZWF0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKTsKKworCit2b2lkIERlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiAqaEJpdEJ1Zik7CisKKworV29yZDE2IEdldEJpdHNBdmFpbChIQU5ETEVfQklUX0JVRiBoQml0QnVmKTsKKworCitXb3JkMTYgV3JpdGVCaXRzKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgIFdvcmQzMiB3cml0ZVZhbHVlLAorICAgICAgICAgICAgICAgICBXb3JkMTYgbm9CaXRzVG9Xcml0ZSk7CisKK3ZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKKyAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKTsKKworI2RlZmluZSBHZXROckJpdHNBdmFpbGFibGUoaEJpdEJ1ZikgKCAoaEJpdEJ1ZiktPmNudEJpdHMpCisjZGVmaW5lIEdldE5yQml0c1JlYWQoaEJpdEJ1ZikgICAgICAgKChoQml0QnVmKS0+c2l6ZS0oaEJpdEJ1ZiktPmNudEJpdHMpCisKKyNlbmRpZiAvKiBCSVRCVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0ZW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTUxMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0ZW5jLmgKQEAgLTAsMCArMSw1MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYml0ZW5jLmgNCisNCisJQ29udGVudDoJQml0c3RyZWFtIGVuY29kZXIgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9CSVRFTkNfSAorI2RlZmluZSBfQklURU5DX0gKKworI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJ0bnMuaCIKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIiAgCisKK3N0cnVjdCBCSVRTVFJFQU1FTkNPREVSX0lOSVQKK3sKKyAgV29yZDE2IG5DaGFubmVsczsKKyAgV29yZDMyIGJpdHJhdGU7CisgIFdvcmQzMiBzYW1wbGVSYXRlOworICBXb3JkMTYgcHJvZmlsZTsKK307CisKKworCitXb3JkMTYgV3JpdGVCaXRzdHJlYW0gKEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgKnBzeU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpnbG9iVXNlZEJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLA0KKwkJCQkJICAgV29yZDE2IHNhbXBsZXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworI2VuZGlmIC8qIF9CSVRFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ibG9ja19zd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM1ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKQEAgLTAsMCArMSw3MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYmxvY2tfc3dpdGNoLmgNCisNCisJQ29udGVudDoJQmxvY2sgc3dpdGNoaW5nIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0gKKyNkZWZpbmUgX0JMT0NLX1NXSVRDSF9ICisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisKKworLyoqKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgSGlnaFBhc3MtRklSLUZpbHRlciBmb3IgQXR0YWNrLURldGVjdGlvbiAqLworI2RlZmluZSBCTE9DS19TV0lUQ0hfV0lORE9XUyBUUkFOU19GQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB3aW5kb3dzIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4gRlJBTUVfTEVOX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbWFsIGdyYW51bGFyaXR5IG9mIGVuZXJneSBjYWxjdWxhdGlvbiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKiBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0eworICBXb3JkMzIgaW52QXR0YWNrUmF0aW87CisgIFdvcmQxNiB3aW5kb3dTZXF1ZW5jZTsKKyAgV29yZDE2IG5leHR3aW5kb3dTZXF1ZW5jZTsKKyAgRmxhZyBhdHRhY2s7CisgIEZsYWcgbGFzdGF0dGFjazsKKyAgV29yZDE2IGF0dGFja0luZGV4OworICBXb3JkMTYgbGFzdEF0dGFja0luZGV4OworICBXb3JkMTYgbm9PZkdyb3VwczsKKyAgV29yZDE2IGdyb3VwTGVuW1RSQU5TX0ZBQ107CisgIFdvcmQzMiB3aW5kb3dOcmdbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAgLyogdGltZSBzaWduYWwgZW5lcmd5IGluIFN1YndpbmRvd3MgKGxhc3QgYW5kIGN1cnJlbnQpICovCisgIFdvcmQzMiB3aW5kb3dOcmdGWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgLyogZmlsdGVyZWQgdGltZSBzaWduYWwgZW5lcmd5IGluIHNlZ21lbnRzIChsYXN0IGFuZCBjdXJyZW50KSAqLworICBXb3JkMzIgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgICAgIC8qIGZpbHRlciBkZWxheS1saW5lICovCisgIFdvcmQzMiBtYXhXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4IGVuZXJneSBpbiBzdWJ3aW5kb3dzICovCisgIFdvcmQzMiBhY2NXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzaXZlbHkgYWNjdW11bGF0ZWQgd2luZG93TnJnRiAqLworfUJMT0NLX1NXSVRDSElOR19DT05UUk9MOworCisKKworCisKK1dvcmQxNiBJbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdFJhdGUsIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpOworCitXb3JkMTYgQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCisJCQkJCSAgV29yZDMyICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCk7CisKK1dvcmQxNiBTeW5jQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5vT2ZDaGFubmVscyk7CisKKworCisjZW5kaWYgIC8qICNpZm5kZWYgX0JMT0NLX1NXSVRDSF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY2hhbm5lbF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2FhOGRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY2hhbm5lbF9tYXAuaApAQCAtMCwwICsxLDM3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQljaGFubmVsX21hcC5oDQorDQorCUNvbnRlbnQ6CWNoYW5uZWwgbWFwcGluZyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DSEFOTkVMX01BUF9ICisjZGVmaW5lIF9DSEFOTkVMX01BUF9ICisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisKK1dvcmQxNiBJbml0RWxlbWVudEluZm8gKFdvcmQxNiBuQ2hhbm5lbHMsIEVMRU1FTlRfSU5GTyogZWxJbmZvKTsKKworV29yZDE2IEluaXRFbGVtZW50Qml0cyhFTEVNRU5UX0JJVFMgKmVsZW1lbnRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgYml0cmF0ZVRvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGF2ZXJhZ2VCaXRzVG90LAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RhdGljQml0c1RvdCk7CisKKyNlbmRpZiAvKiBDSEFOTkVMX01BUF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jb25maWcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTFjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jb25maWcuaApAQCAtMCwwICsxLDM2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQljb25maWcuaA0KKw0KKwlDb250ZW50OglhYWMgZW5jb2RlciBwYXJhbWV0ZXINCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX0FBQ0VOQ19DT05GSUdfSF8NCisjZGVmaW5lIF9BQUNFTkNfQ09ORklHX0hfDQorDQorI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgICAgIDINCisNCisjZGVmaW5lIEFBQ0VOQ19CTE9DS1NJWkUgICAgMTAyNCAgIC8qISBlbmNvZGVyIG9ubHkgdGFrZXMgQkxPQ0tTSVpFIHNhbXBsZXMgYXQgYSB0aW1lICovDQorI2RlZmluZSBBQUNFTkNfVFJBTlNfRkFDICAgIDggICAgICAvKiEgZW5jb2RlciBzaG9ydCBsb25nIHJhdGlvICovDQorDQorDQorI2RlZmluZSBNQVhCSVRTX0NPRUYJCTYxNDQKKyNkZWZpbmUgTUlOQklUU19DT0VGCQk3NDQNCisNCisNCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9keW5fYml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY4ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaApAQCAtMCwwICsxLDgyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlkeW5fYml0cy5oDQorDQorCUNvbnRlbnQ6CU5vaXNlbGVzcyBjb2RlciBtb2R1bGUgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRFlOX0JJVFNfSAorI2RlZmluZSBfX0RZTl9CSVRTX0gKKworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInRucy5oIgorI2luY2x1ZGUgImJpdF9jbnQuaCIKKworCisKKyNkZWZpbmUgTUFYX1NFQ1RJT05TICAgICAgICAgIE1BWF9HUk9VUEVEX1NGQgorI2RlZmluZSBTRUNUX0VTQ19WQUxfTE9ORyAgICAzMQorI2RlZmluZSBTRUNUX0VTQ19WQUxfU0hPUlQgICAgNworI2RlZmluZSBDT0RFX0JPT0tfQklUUyAgICAgICAgNAorI2RlZmluZSBTRUNUX0JJVFNfTE9ORyAgICAgICAgNQorI2RlZmluZSBTRUNUX0JJVFNfU0hPUlQgICAgICAgMworCit0eXBlZGVmIHN0cnVjdAoreworICBXb3JkMTYgY29kZUJvb2s7CisgIFdvcmQxNiBzZmJTdGFydDsKKyAgV29yZDE2IHNmYkNudDsKKyAgV29yZDE2IHNlY3Rpb25CaXRzOworfQorU0VDVElPTl9JTkZPOworCisKKworCit0eXBlZGVmIHN0cnVjdAoreworICBXb3JkMTYgYmxvY2tUeXBlOworICBXb3JkMTYgbm9PZkdyb3VwczsKKyAgV29yZDE2IHNmYkNudDsKKyAgV29yZDE2IG1heFNmYlBlckdyb3VwOworICBXb3JkMTYgc2ZiUGVyR3JvdXA7CisgIFdvcmQxNiBub09mU2VjdGlvbnM7CisgIFNFQ1RJT05fSU5GTyBzZWN0aW9uSW5mb1tNQVhfU0VDVElPTlNdOworICBXb3JkMTYgc2lkZUluZm9CaXRzOyAgICAgICAgICAgICAvKiBzZWN0aW9uaW5nIGJpdHMgICAgICAgKi8KKyAgV29yZDE2IGh1ZmZtYW5CaXRzOyAgICAgICAgICAgICAgLyogaHVmZm1hbiAgICBjb2RlZCBiaXRzICovCisgIFdvcmQxNiBzY2FsZWZhY0JpdHM7ICAgICAgICAgICAgIC8qIHNjYWxlZmFjICAgY29kZWQgYml0cyAqLworICBXb3JkMTYgZmlyc3RTY2Y7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBzY2YgdG8gYmUgY29kZWQgKi8KKyAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpXTsKKyAgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddOworfQorU0VDVElPTl9EQVRBOyAvKiAgV29yZDE2IHNpemU6IDEwICsgNjAoTUFYX1NFQ1RJT05TKSo0KFNFQ1RJT05fSU5GTykgKyA1MShNQVhfU0ZCX0xPTkcpKjEyKENPREVfQk9PS19FU0NfTkRYKzEpICsgNTEoTUFYX1NGQl9MT05HKSA9IDkxMyAqLworCisKK1dvcmQxNiBCQ0luaXQodm9pZCk7CisKK1dvcmQxNiBkeW5CaXRDb3VudChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNjYWxlZmFjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ncnBfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjY1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ncnBfZGF0YS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWdycF9kYXRhLmgNCisNCisJQ29udGVudDoJU2hvcnQgYmxvY2sgZ3JvdXBpbmcgZnVuY3Rpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fR1JQX0RBVEFfSF9fCisjZGVmaW5lIF9fR1JQX0RBVEFfSF9fCisjaW5jbHVkZSAicHN5X2RhdGEuaCIKKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgorCit2b2lkCitncm91cFNob3J0RGF0YShXb3JkMzIgICAgICAgICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICp0bXBTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneSwKKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLAorICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBzZmJDbnQsCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJNaW5TbnIsCisgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiTWluU25yLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKmdyb3VwTGVuKTsKKworI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQzMzRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWludGVyZmFjZS5oDQorDQorCUNvbnRlbnQ6CXBzeWNob2FjY291c3RpYy9xdWFudGl6ZXIgc3RydWN0dXJlcyBhbmQgaW50ZXJmYWNlDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSU5URVJGQUNFX0gKKyNkZWZpbmUgX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJjb25maWcuaCINCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicHN5X2RhdGEuaCIKKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgorCisKK2VudW0KK3sKKyAgTVNfTk9ORSA9IDAsCisgIE1TX1NPTUUgPSAxLAorICBNU19BTEwgID0gMgorfTsKKworZW51bQoreworICBNU19PTiA9IDEKK307CisKK3N0cnVjdCBUT09MU0lORk8geworICBXb3JkMTYgbXNEaWdlc3Q7CisgIFdvcmQxNiBtc01hc2tbTUFYX0dST1VQRURfU0ZCXTsKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBXb3JkMTYgIHNmYkNudDsKKyAgV29yZDE2ICBzZmJQZXJHcm91cDsKKyAgV29yZDE2ICBtYXhTZmJQZXJHcm91cDsKKyAgV29yZDE2ICB3aW5kb3dTZXF1ZW5jZTsKKyAgV29yZDE2ICB3aW5kb3dTaGFwZTsKKyAgV29yZDE2ICBncm91cGluZ01hc2s7CisgIFdvcmQxNiAgc2ZiT2Zmc2V0c1tNQVhfR1JPVVBFRF9TRkIrMV07CisgIFdvcmQxNiAgbWRjdFNjYWxlOyAKKyAgV29yZDMyICpzZmJFbmVyZ3k7IAorICBXb3JkMzIgKnNmYlNwcmVhZGVkRW5lcmd5OworICBXb3JkMzIgKnNmYlRocmVzaG9sZDsgICAgICAgCisgIFdvcmQzMiAqbWRjdFNwZWN0cnVtOyAgICAgICAgCisgIFdvcmQzMiAgc2ZiRW5TdW1MUjsKKyAgV29yZDMyICBzZmJFblN1bU1TOworICBXb3JkMzIgc2ZiRGlzdFtNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMzIgc2ZiRGlzdE5ld1tNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMTYgIHNmYk1pblNucltNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMTYgbWluU2ZNYXhRdWFudFtNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMTYgbWluU2NmQ2FsY3VsYXRlZFtNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMTYgcHJldlNjZkxhc3RbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IHByZXZTY2ZOZXh0W01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQxNiBkZWx0YVBlTGFzdFtNQVhfR1JPVVBFRF9TRkJdOworICBUTlNfSU5GTyB0bnNJbmZvOworfSBQU1lfT1VUX0NIQU5ORUw7IC8qIFdvcmQxNiBzaXplOiAxNCArIDYwKE1BWF9HUk9VUEVEX1NGQikgKyAxMTIoVE5TX0lORk8pID0gMTg2ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IFRPT0xTSU5GTyB0b29sc0luZm87CisgIFdvcmQxNiBncm91cGVkU2ZiT2Zmc2V0W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCKzFdOyAgLyogcGx1cyBvbmUgZm9yIGxhc3QgZHVtbXkgb2Zmc2V0ICEgKi8KKyAgV29yZDE2IGdyb3VwZWRTZmJNaW5TbnJbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOworfSBQU1lfT1VUX0VMRU1FTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogaW5mb3JtYXRpb24gc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMgICovCisgIFBTWV9PVVRfRUxFTUVOVCAgcHN5T3V0RWxlbWVudDsKKyAgLyogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gZWFjaCBjaGFubmVsICovCisgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdOworfVBTWV9PVVQ7CisKK3ZvaWQgQnVpbGRJbnRlcmZhY2UoV29yZDMyICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBtZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgICAgICAgICAgKnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAqc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICAgICAgICAgICpzZmJTcHJlYWRlZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgc2ZiRW5lcmd5U3VtTFIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgIHNmYkVuZXJneVN1bU1TLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICB3aW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqZ3JvdXBMZW4sCisgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgICAgKnBzeU91dENoKTsKKworI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDkzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9saW5lX3BlLmgKQEAgLTAsMCArMSw3NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJbGluZV9wZS5oDQorDQorCUNvbnRlbnQ6CVBlcmNlcHR1YWwgZW50cm9waWUgbW9kdWxlIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xJTkVfUEVfSAorI2RlZmluZSBfX0xJTkVfUEVfSAorCisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIgCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiIAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIFdvcmQxNiBzZmJMZEVuZXJneVtNQVhfR1JPVVBFRF9TRkJdOyAgICAgLyogNCpsb2coc2ZiRW5lcmd5KS9sb2coMikgKi8KKyAgIFdvcmQxNiBzZmJOTGluZXM0W01BWF9HUk9VUEVEX1NGQl07ICAgICAgLyogNCpudW1iZXIgb2YgcmVsZXZhbnQgbGluZXMgaW4gc2ZiICovCisgICBXb3JkMTYgc2ZiUGVbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgIC8qIHBlIGZvciBlYWNoIHNmYiAqLworICAgV29yZDE2IHNmYkNvbnN0UGFydFtNQVhfR1JPVVBFRF9TRkJdOyAgICAvKiBjb25zdGFudCBwYXJ0IGZvciBlYWNoIHNmYiAqLworICAgV29yZDE2IHNmYk5BY3RpdmVMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOyAvKiBudW1iZXIgb2YgYWN0aXZlIGxpbmVzIGluIHNmYiAqLworICAgV29yZDE2IHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiUGUgKi8KKyAgIFdvcmQxNiBjb25zdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYkNvbnN0UGFydCAqLworICAgV29yZDE2IG5BY3RpdmVMaW5lczsgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiTkFjdGl2ZUxpbmVzICovCit9IFBFX0NIQU5ORUxfREFUQTsgLyogc2l6ZSBXb3JkMTY6IDMwMyAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIFBFX0NIQU5ORUxfREFUQSBwZUNoYW5uZWxEYXRhW01BWF9DSEFOTkVMU107CisgICBXb3JkMTYgcGU7CisgICBXb3JkMTYgY29uc3RQYXJ0OworICAgV29yZDE2IG5BY3RpdmVMaW5lczsKKyAgIFdvcmQxNiBvZmZzZXQ7CisgICBXb3JkMTYgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKKyAgIFdvcmQzMiB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOworICAgV29yZDMyIHNmYlBlRmFjdG9yc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Cit9IFBFX0RBVEE7IC8qIHNpemUgV29yZDE2OiAzMDMgKyA0ICsgMTIwICsgMjQwID0gNjY3ICovCisKKworCisKK3ZvaWQgcHJlcGFyZVNmYlBlKFBFX0RBVEEgKnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZU9mZnNldCk7CisKKworCisKKwordm9pZCBjYWxjU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpOworCisKKworCisjZW5kaWYgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbWVtYWxpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMwMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbWVtYWxpZ24uaApAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQltZW1hbGlnbi5oDQorDQorCUNvbnRlbnQ6CU1lbW9yeSBhbGxvYyBhbGlnbm1lbnRzIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfX1ZPX0FBQ0VOQ19NRU1fQUxJR05fSF9fDQorI2RlZmluZSBfX1ZPX0FBQ0VOQ19NRU1fQUxJR05fSF9fDQorDQorI2luY2x1ZGUgInZvTWVtLmgiDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisNCitleHRlcm4gdm9pZCAqbWVtX21hbGxvYyhWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgYWxpZ25tZW50LCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7DQorZXh0ZXJuIHZvaWQgbWVtX2ZyZWUoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHZvaWQgKm1lbV9wdHIsIHVuc2lnbmVkIGludCBDb2RlY0lEKTsNCisNCisjZW5kaWYJLyogX19WT19NRU1fQUxJR05fSF9fICovDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbXNfc3RlcmVvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tc19zdGVyZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDQzZGVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbXNfc3RlcmVvLmgKQEAgLTAsMCArMSw0NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJbXNfc3RlcmVvLmgNCisNCisJQ29udGVudDoJRGVjbGFyYXRpb24gTVMgc3RlcmVvIHByb2Nlc3Npbmcgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTVNfU1RFUkVPX0hfXworI2RlZmluZSBfX01TX1NURVJFT19IX18KKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisKK3ZvaWQgTXNTdGVyZW9Qcm9jZXNzaW5nKFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5TGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5UmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5U2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqbWRjdFNwZWN0cnVtTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlRocmVzaG9sZExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJTcHJlYWRlZEVuTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFblJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICptc0RpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3ByZV9lY2hvX2NvbnRyb2wuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3ByZV9lY2hvX2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWYzNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHJlX2VjaG9fY29udHJvbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXByZV9lY2hvX2NvbnRyb2wuaA0KKw0KKwlDb250ZW50OglQcmUgZWNobyBjb250cm9sIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19QUkVfRUNIT19DT05UUk9MX0gKKyNkZWZpbmUgX19QUkVfRUNIT19DT05UUk9MX0gKKworI2luY2x1ZGUgInR5cGVkZWZzLmgiCisKK3ZvaWQgSW5pdFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRubTEsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KTsKKworCit2b2lkIFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlbm0xKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzY2YyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTA3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwc3lfY29uZmlndXJhdGlvbi5oDQorDQorCUNvbnRlbnQ6CVBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUFNZX0NPTkZJR1VSQVRJT05fSAorI2RlZmluZSBfUFNZX0NPTkZJR1VSQVRJT05fSAorDQorI2luY2x1ZGUgInR5cGVkZWZzLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAidG5zLmgiCisKK3R5cGVkZWYgc3RydWN0eworCisgIFdvcmQxNiBzZmJDbnQ7CisgIFdvcmQxNiBzZmJBY3RpdmU7ICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KKyAgV29yZDE2ICpzZmJPZmZzZXQ7CisKKyAgV29yZDMyIHNmYlRocmVzaG9sZFF1aWV0W01BWF9TRkJfTE9OR107CisKKyAgV29yZDE2IG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KKyAgV29yZDE2IG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsKKworICBXb3JkMTYgbG93cGFzc0xpbmU7DQorICBXb3JkMTYgc2FtcFJhdGVJZHg7CisgIFdvcmQzMiBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KKworICBXb3JkMTYgcmF0aW87CisgIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJfTE9OR107CisgIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCX0xPTkddOworCisgIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKKyAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKKworCisgIFdvcmQxNiBzZmJNaW5TbnJbTUFYX1NGQl9MT05HXTsgICAgICAgLyogbWluaW11bSBzbnIgKGZvcm1lcmx5IGtub3duIGFzIGJtYXgpICovCisKKyAgVE5TX0NPTkZJRyB0bnNDb25mOworCit9UFNZX0NPTkZJR1VSQVRJT05fTE9ORzsgLypXb3JkMTYgc2l6ZTogOCArIDUyICsgMTAyICsgNTEgKyA1MSArIDUxICsgNTEgKyA0NyA9IDUxNSAqLworCisKK3R5cGVkZWYgc3RydWN0eworCisgIFdvcmQxNiBzZmJDbnQ7CisgIFdvcmQxNiBzZmJBY3RpdmU7ICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KKyAgV29yZDE2ICpzZmJPZmZzZXQ7CisKKyAgV29yZDMyIHNmYlRocmVzaG9sZFF1aWV0W01BWF9TRkJfU0hPUlRdOworCisgIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCisgIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7CisKKyAgV29yZDE2IGxvd3Bhc3NMaW5lOw0KKyAgV29yZDE2IHNhbXBSYXRlSWR4OworICBXb3JkMzIgY2xpcEVuZXJneTsgICAgICAgICAgICAgICAgIC8qIGZvciBsZXZlbCBkZXBlbmRlbmQgdG1uICovCisKKyAgV29yZDE2IHJhdGlvOworICBXb3JkMTYgc2ZiTWFza0xvd0ZhY3RvcltNQVhfU0ZCX1NIT1JUXTsKKyAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yW01BWF9TRkJfU0hPUlRdOworCisgIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yU3ByRW5bTUFYX1NGQl9TSE9SVF07CisgIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvclNwckVuW01BWF9TRkJfU0hPUlRdOworCisKKyAgV29yZDE2IHNmYk1pblNucltNQVhfU0ZCX1NIT1JUXTsgICAgICAgLyogbWluaW11bSBzbnIgKGZvcm1lcmx5IGtub3duIGFzIGJtYXgpICovCisKKyAgVE5TX0NPTkZJRyB0bnNDb25mOworCit9UFNZX0NPTkZJR1VSQVRJT05fU0hPUlQ7IC8qV29yZDE2IHNpemU6IDggKyAxNiArIDE2ICsgMTYgKyAxNiArIDE2ICsgMTYgKyAxNiArIDQ3ID0gMTY3ICovCisNCisNCisvKiBSZXR1cm5zIHRoZSBzYW1wbGUgcmF0ZSBpbmRleCAqLw0KK1dvcmQzMiBHZXRTUkluZGV4KFdvcmQzMiBzYW1wbGVSYXRlKTsNCisKKworV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmYpOworCitXb3JkMTYgSW5pdFBzeUNvbmZpZ3VyYXRpb25TaG9ydChXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwc3lDb25mKTsKKworI2VuZGlmIC8qIF9QU1lfQ09ORklHVVJBVElPTl9IICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTVhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaApAQCAtMCwwICsxLDgwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwc3lfY29uc3QuaA0KKw0KKwlDb250ZW50OglHbG9iYWwgcHN5Y2hvYWNvdXN0aWMgY29uc3RhbnRzIHN0cnVjdHVyZXMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9QU1lDT05TVF9ICisjZGVmaW5lIF9QU1lDT05TVF9ICisKKyNpbmNsdWRlICJjb25maWcuaCINCisKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgRlJBTUVfTEVOX0xPTkcgICAgQUFDRU5DX0JMT0NLU0laRQorI2RlZmluZSBUUkFOU19GQUMgICAgICAgICA4CisjZGVmaW5lIEZSQU1FX0xFTl9TSE9SVCAgIChGUkFNRV9MRU5fTE9ORy9UUkFOU19GQUMpDQorDQorCisKKy8qIEJsb2NrIHR5cGVzICovCitlbnVtCit7CisgIExPTkdfV0lORE9XID0gMCwKKyAgU1RBUlRfV0lORE9XLAorICBTSE9SVF9XSU5ET1csCisgIFNUT1BfV0lORE9XCit9OworCisvKiBXaW5kb3cgc2hhcGVzICovCitlbnVtCit7CisgIFNJTkVfV0lORE9XID0gMCwKKyAgS0JEX1dJTkRPVyAgPSAxCit9OworCisvKgorICBNUyBzdHVmZgorKi8KK2VudW0KK3sKKyAgU0lfTVNfTUFTS19OT05FID0gMCwKKyAgU0lfTVNfTUFTS19TT01FID0gMSwKKyAgU0lfTVNfTUFTS19BTEwgID0gMgorfTsKKworI2RlZmluZSBNQVhfTk9fT0ZfR1JPVVBTIDQKKyNkZWZpbmUgTUFYX1NGQl9TSE9SVCAgIDE1ICAvKiAxNSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSAxNiBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTUFYX1NGQl9MT05HICAgIDUxICAvKiA1MSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSA2NCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTUFYX1NGQiAgICAgICAgIChNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgICAvKiA9IE1BWF9TRkJfTE9ORyAqLworI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgKE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpCisKKyNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX09GRlNFVAkJICAgKDEqMTAyNCszKjEyOCs2NCsxMjgpCisjZGVmaW5lIEJMT0NLX1NXSVRDSElOR19EQVRBX1NJWkUgICAgICAgICAgRlJBTUVfTEVOX0xPTkcKKwkJCQkJCQkJCQkgICAgCisjZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfTE9ORyAgICAwCisjZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfU0hPUlQgICA0NDgKKworI2RlZmluZSBMT0dfTk9STV9QQ00gICAgICAgICAgLTE1CisNCisjZGVmaW5lIE5VTV9TQU1QTEVfUkFURVMJMTIKKworI2VuZGlmIC8qIF9QU1lDT05TVF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDEyZDUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2RhdGEuaApAQCAtMCwwICsxLDY2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwc3lfZGF0YS5oDQorDQorCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIGRhdGEgYW5kIHN0cnVjdHVyZXMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9QU1lfREFUQV9ICisjZGVmaW5lIF9QU1lfREFUQV9ICisKKyNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKKyNpbmNsdWRlICJ0bnMuaCIKKworLyoKKyAgdGhlIHN0cnVjdHMgY2FuIGJlIGltcGxlbWVudGVkIGFzIHVuaW9ucworKi8KKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQzMiBzZmJMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQzMiBzZmJTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfVNGQl9USFJFU0hPTEQ7IC8qIFdvcmQxNiBzaXplOiAyNjAgKi8KKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQzMiBzZmJMb25nW01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQzMiBzZmJTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOworfVNGQl9FTkVSR1k7IC8qIFdvcmQxNiBzaXplOiAyNjAgKi8KKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQzMiBzZmJMb25nOworICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXTsKK31TRkJfRU5FUkdZX1NVTTsgLyogV29yZDE2IHNpemU6IDE4ICovCisKKwordHlwZWRlZiBzdHJ1Y3R7CisgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sOyAgICAgICAgICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KKyAgV29yZDE2ICAgICAgICAgICAgICAgICAgICAqbWRjdERlbGF5QnVmZmVyOyAgICAgICAgICAgICAgIC8qIG1kY3QgZGVsYXkgYnVmZmVyIFtCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUXSovCisgIFdvcmQzMiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkbm0xW01BWF9TRkJdOyAgICAgICAvKiBQcmVFY2hvQ29udHJvbCAqLworICBXb3JkMTYgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZW5tMTsgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbGFzdCBibG9jaydzIG1kY3QgKFByZUVjaG9Db250cm9sKSAqLworCisgIFNGQl9USFJFU0hPTEQgICAgICAgICAgICAgc2ZiVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAvKiBhZGFwdCAgICAgICAgICAgKi8KKyAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3k7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNmYiBFbmVyZ3kgICAgICAqLworICBTRkJfRU5FUkdZICAgICAgICAgICAgICAgIHNmYkVuZXJneU1TOworICBTRkJfRU5FUkdZX1NVTSAgICAgICAgICAgIHNmYkVuZXJneVN1bTsKKyAgU0ZCX0VORVJHWV9TVU0gICAgICAgICAgICBzZmJFbmVyZ3lTdW1NUzsKKyAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJTcHJlYWRlZEVuZXJneTsKKworICBXb3JkMzIgICAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgLyogbWRjdCBzcGVjdHJ1bSBbRlJBTUVfTEVOX0xPTkddICovCisgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAgbWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBvZiBtZGN0ICAgKi8KK31QU1lfREFUQTsgLyogV29yZDE2IHNpemU6IDQgKyA4NyArIDEwMiArIDM2MCArIDM2MCArIDM2MCArIDE4ICsgMTggKyAzNjAgPSAxNjY5ICovCisKKyNlbmRpZiAvKiBfUFNZX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X21haW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwYjhiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKQEAgLTAsMCArMSw2OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcHN5X21haW4uaA0KKw0KKwlDb250ZW50OglQc3ljaG9hY291c3RpYyBtYWpvciBmdW5jdGlvbiBibG9jaw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1BTWU1BSU5fSAorI2RlZmluZSBfUFNZTUFJTl9ICisKKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJtZW1hbGlnbi5oIgorCisvKgorICBwc3kga2VybmVsCisqLwordHlwZWRlZiBzdHJ1Y3QgIHsKKyAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAgcHN5Q29uZkxvbmc7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogNTE1ICovCisgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUIHBzeUNvbmZTaG9ydDsgICAgICAgICAgLyogV29yZDE2IHNpemU6IDE2NyAqLworICBQU1lfREFUQSAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU107IC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMTY2OSovCisgIFROU19EQVRBICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXTsgLyogV29yZDE2IHNpemU6IE1BWF9DSEFOTkVMUyoyMzUgKi8KKyAgV29yZDMyKiAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnM7DQorICBXb3JkMTYJCQkJICBzYW1wbGVSYXRlSWR4OworfVBTWV9LRVJORUw7IC8qIFdvcmQxNiBzaXplOiAyNTg3IC8gNDQ5MSAqLworCisKK1dvcmQxNiBQc3lOZXcoIFBTWV9LRVJORUwgICpoUHN5LCBXb3JkMzIgbkNoYW4sIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKK1dvcmQxNiBQc3lEZWxldGUoIFBTWV9LRVJORUwgICpoUHN5LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CisKK1dvcmQxNiBQc3lPdXROZXcoIFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKK1dvcmQxNiBQc3lPdXREZWxldGUoIFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKKworV29yZDE2IHBzeU1haW5Jbml0KCBQU1lfS0VSTkVMICpoUHN5LAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc01hc2ssCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgpOworCisKK1dvcmQxNiBwc3lNYWluKFdvcmQxNiAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsICAgLyohPCB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgICplbGVtSW5mbywKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAqdGltZVNpZ25hbCwgLyohPCBpbnRlcmxlYXZlZCB0aW1lIHNpZ25hbCAqLyAKKyAgICAgICAgICAgICAgIFBTWV9EQVRBICAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICBUTlNfREFUQSAgICAgICAgICAgICAgICAgdG5zRGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyogIHBzeUNvbmZMb25nLAorICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQqIHBzeUNvbmZTaG9ydCwKKyAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgICAgICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICAgICAgKnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoVG5zLAorCQkJICAgV29yZDMyCQkJCQlzYW1wbGVSYXRlKTsKKworI2VuZGlmIC8qIF9QU1lNQUlOX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQ0MDUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oCkBAIC0wLDAgKzEsMTQzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlxY19kYXRhLmgNCisNCisJQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBzdHJ1Y3R1cmVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUUNfREFUQV9ICisjZGVmaW5lIF9RQ19EQVRBX0gKKworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgImR5bl9iaXRzLmgiCisjaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCisKKworI2RlZmluZSBNQVhfTU9ERVMgMTAKKwordHlwZWRlZiBlbnVtIHsKKyAgTU9ERV9JTlZBTElEID0gMCwKKyAgTU9ERV8xLCAgICAgICAgLyogbW9ubyAgICAgICovCisgIE1PREVfMV8xLCAgICAgIC8qIGR1YWwgbW9ubyAqLworICBNT0RFXzIgICAgICAgICAvKiBzdGVyZW8gICAgKi8KK30gRU5DT0RFUl9NT0RFOworCit0eXBlZGVmIGVudW0geworICBJRF9TQ0U9MCwgICAgIC8qIFNpbmdsZSBDaGFubmVsIEVsZW1lbnQgICAqLworICBJRF9DUEU9MSwgICAgIC8qIENoYW5uZWwgUGFpciBFbGVtZW50ICAgICAqLworICBJRF9DQ0U9MiwgICAgIC8qIENvdXBsaW5nIENoYW5uZWwgRWxlbWVudCAqLworICBJRF9MRkU9MywgICAgIC8qIExGRSBDaGFubmVsIEVsZW1lbnQgICAgICAqLworICBJRF9EU0U9NCwgICAgIC8qIGN1cnJlbnQgb25lIERTRSBlbGVtZW50IGZvciBhbmNpbGxhcnkgaXMgc3VwcG9ydGVkICovCisgIElEX1BDRT01LAorICBJRF9GSUw9NiwKKyAgSURfRU5EPTcKK31FTEVNRU5UX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRUxFTUVOVF9UWVBFIGVsVHlwZTsKKyAgV29yZDE2IGluc3RhbmNlVGFnOworICBXb3JkMTYgbkNoYW5uZWxzSW5FbDsKKyAgV29yZDE2IENoYW5uZWxJbmRleFtNQVhfQ0hBTk5FTFNdOworfSBFTEVNRU5UX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV29yZDMyIHBhZGRpbmdSZXN0OworfSBQQURESU5HOworCisKKy8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KKworc3RydWN0IFFDX0lOSVR7CisgIEVMRU1FTlRfSU5GTyAqZWxJbmZvOworICBXb3JkMTYgbWF4Qml0czsgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4gcmVzZXJ2b2lyICAqLworICBXb3JkMTYgYXZlcmFnZUJpdHM7IC8qIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgd2Ugc2hvdWxkIHVzZSAqLworICBXb3JkMTYgYml0UmVzOworICBXb3JkMTYgbWVhblBlOworICBXb3JkMzIgY2hCaXRyYXRlOworICBXb3JkMTYgbWF4Qml0RmFjOworICBXb3JkMzIgYml0cmF0ZTsKKworICBQQURESU5HIHBhZGRpbmc7Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBXb3JkMTYgICAgICAgICAgKnF1YW50U3BlYzsgICAgICAgLyogW0ZSQU1FX0xFTl9MT05HXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVVdvcmQxNiAgICAgICAgICptYXhWYWx1ZUluU2ZiOyAgIC8qIFtNQVhfR1JPVVBFRF9TRkJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFdvcmQxNiAgICAgICAgICAqc2NmOyAgICAgICAgICAgICAvKiBbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBXb3JkMTYgICAgICAgICAgZ2xvYmFsR2FpbjsKKyAgV29yZDE2ICAgICAgICAgIG1kY3RTY2FsZTsKKyAgV29yZDE2ICAgICAgICAgIGdyb3VwaW5nTWFzazsKKyAgU0VDVElPTl9EQVRBICAgIHNlY3Rpb25EYXRhOworICBXb3JkMTYgICAgICAgICAgd2luZG93U2hhcGU7Cit9IFFDX09VVF9DSEFOTkVMOworCit0eXBlZGVmIHN0cnVjdAoreworICBXb3JkMTYJCSAgYWR0c1VzZWQ7DQorICBXb3JkMTYgICAgICAgICAgc3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKyAgV29yZDE2ICAgICAgICAgIGR5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIFdvcmQxNiAgICAgICAgICBwZTsKKyAgV29yZDE2ICAgICAgICAgIGFuY0JpdHNVc2VkOworICBXb3JkMTYgICAgICAgICAgZmlsbEJpdHM7Cit9IFFDX09VVF9FTEVNRU5UOworCit0eXBlZGVmIHN0cnVjdAoreworICBRQ19PVVRfQ0hBTk5FTCAgcWNDaGFubmVsW01BWF9DSEFOTkVMU107CisgIFFDX09VVF9FTEVNRU5UICBxY0VsZW1lbnQ7CisgIFdvcmQxNiAgICAgICAgICB0b3RTdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLworICBXb3JkMTYgICAgICAgICAgdG90RHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKyAgV29yZDE2ICAgICAgICAgIHRvdEFuY0JpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIFdvcmQxNiAgICAgICAgICB0b3RGaWxsQml0czsKKyAgV29yZDE2ICAgICAgICAgIGFsaWduQml0czsKKyAgV29yZDE2ICAgICAgICAgIGJpdFJlc1RvdDsKKyAgV29yZDE2ICAgICAgICAgIGF2ZXJhZ2VCaXRzVG90OworfSBRQ19PVVQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV29yZDMyIGNoQml0cmF0ZTsKKyAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAgICAgICAgICAgICAgIC8qIGJydXR0byAtPiBsb29rIGFuY2lsbGFyeS5oICovCisgIFdvcmQxNiBtYXhCaXRzOworICBXb3JkMTYgYml0UmVzTGV2ZWw7CisgIFdvcmQxNiBtYXhCaXRSZXNCaXRzOworICBXb3JkMTYgcmVsYXRpdmVCaXRzOyAgICAgICAgICAgIC8qIEJpdHMgcmVsYXRpdmUgdG8gdG90YWwgQml0cyBzY2FsZWQgZG93biBieSAyICovCit9IEVMRU1FTlRfQklUUzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogdGhpcyBpcyBiYXNpY2FsbHkgc3RydWN0IFFDX0lOSVQgKi8KKyAgV29yZDE2IGF2ZXJhZ2VCaXRzVG90OworICBXb3JkMTYgbWF4Qml0c1RvdDsKKyAgV29yZDE2IGdsb2JTdGF0Qml0czsKKyAgV29yZDE2IG5DaGFubmVsczsKKyAgV29yZDE2IGJpdFJlc1RvdDsKKworICBXb3JkMTYgbWF4Qml0RmFjOworCisgIFBBRERJTkcgICBwYWRkaW5nOworCisgIEVMRU1FTlRfQklUUyAgZWxlbWVudEJpdHM7CisgIEFESl9USFJfU1RBVEUgYWRqVGhyOworCisgIFdvcmQxNiBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Cit9IFFDX1NUQVRFOworCisjZW5kaWYgLyogX1FDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTM4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19tYWluLmgKQEAgLTAsMCArMSw2NCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcWNfbWFpbi5oDQorDQorCUNvbnRlbnQ6CVF1YW50aXppbmcgJiBjb2RpbmcgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUUNfTUFJTl9ICisjZGVmaW5lIF9RQ19NQUlOX0gKKworI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtZW1hbGlnbi5oIgorCisvKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCisKK1dvcmQxNiBRQ091dE5ldyhRQ19PVVQgKmhRQywgV29yZDE2IG5DaGFubmVscywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOworCit2b2lkIFFDT3V0RGVsZXRlKFFDX09VVCAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CisKK1dvcmQxNiBRQ05ldyhRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CisKK1dvcmQxNiBRQ0luaXQoUUNfU1RBVEUgKmhRQywgCisgICAgICAgICAgICAgIHN0cnVjdCBRQ19JTklUICppbml0KTsKKwordm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CisKKworV29yZDE2IFFDTWFpbihRQ19TVEFURSAqaFFDLAorICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIGVsQml0cywKKyAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCisgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgIC8qIG91dCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPdXRFbGVtZW50LAorICAgICAgICAgICAgICBXb3JkMTYgbkNoYW5uZWxzLAorCQkJICBXb3JkMTYgYW5jaWxsYXJ5RGF0YUJ5dGVzKTsgICAgIC8qIHJldHVybnMgZXJyb3IgY29kZSAgICAgICAqLworCit2b2lkIHVwZGF0ZUJpdHJlcyhRQ19TVEFURSogcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KTsKKworV29yZDE2IEZpbmFsaXplQml0Q29uc3VtcHRpb24oUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogcWNPdXQpOworCitXb3JkMTYgQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAqaFFDLAorICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSk7CisKKyNlbmRpZiAvKiBfUUNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xdWFudGl6ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE5NWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaApAQCAtMCwwICsxLDQyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlxdWFudGl6ZS5oDQorDQorCUNvbnRlbnQ6CVF1YW50aXphdGlvbiBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9RVUFOVElaRV9IXworI2RlZmluZSBfUVVBTlRJWkVfSF8KKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgorCisvKiBxdWFudGl6aW5nICovCisKKyNkZWZpbmUgTUFYX1FVQU5UIDgxOTEKKwordm9pZCBRdWFudGl6ZVNwZWN0cnVtKFdvcmQxNiBzZmJDbnQsIAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsIFdvcmQzMiAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLCBXb3JkMTYgKnNjYWxlZmFjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnF1YW50aXplZFNwZWN0cnVtKTsKKworV29yZDMyIGNhbGNTZmJEaXN0KGNvbnN0IFdvcmQzMiAqc3BlYywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgZ2Fpbik7CisKKyNlbmRpZiAvKiBfUVVBTlRJWkVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NmX2VzdGltLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWVjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXNmX2VzdGltLmgNCisNCisJQ29udGVudDoJU2NhbGUgZmFjdG9yIGVzdGltYXRpb24gZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1NGX0VTVElNX0hfXworI2RlZmluZSBfX1NGX0VTVElNX0hfXworLyoKKyAgIFNjYWxlIGZhY3RvciBlc3RpbWF0aW9uIAorICovCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorCit2b2lkCitDYWxjRm9ybUZhY3RvcihXb3JkMTYgICAgICAgICAgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgIG5DaGFubmVscyk7CisKK3ZvaWQKK0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgcWNPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgbkNoYW5uZWxzKTsKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NwcmVhZGluZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3ByZWFkaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZjYzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NwcmVhZGluZy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXNwcmVhZGluZy5oDQorDQorCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU1BSRUFESU5HX0gKKyNkZWZpbmUgX1NQUkVBRElOR19ICisjaW5jbHVkZSAidHlwZWRlZnMuaCIKKw0KKwordm9pZCBTcHJlYWRpbmdNYXgoY29uc3QgV29yZDE2IHBiQ250LAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrTG93RmFjdG9yLAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrSGlnaEZhY3RvciwKKyAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcGJTcHJlYWRlZEVuZXJneSk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9TUFJFQURJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTkwYjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmgKQEAgLTAsMCArMSwzNCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJc3RhdF9iaXRzLmgNCisNCisJQ29udGVudDoJU3RhdGljIGJpdCBjb3VudGVyIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19TVEFUX0JJVFNfSAorI2RlZmluZSBfX1NUQVRfQklUU19ICisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworV29yZDE2IGNvdW50U3RhdGljQml0ZGVtYW5kKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBuQ2hhbm5lbHMsIA0KKwkJCQkJCQlXb3JkMTYgYWR0c1VzZWQpOworCisjZW5kaWYgLyogX19TVEFUX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZjY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXRucy5oDQorDQorCUNvbnRlbnQ6CVROUyBzdHJ1Y3R1cmVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVE5TX0gKKyNkZWZpbmUgX1ROU19ICisNCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorCisKKworI2RlZmluZSBUTlNfTUFYX09SREVSIDEyCisjZGVmaW5lIFROU19NQVhfT1JERVJfU0hPUlQgNQorCisjZGVmaW5lIEZJTFRFUl9ESVJFQ1RJT04gICAgMAorCit0eXBlZGVmIHN0cnVjdHsgLypzdHVmZiB0aGF0IGlzIHRhYnVsYXRlZCBkZXBlbmRlbnQgb24gYml0cmF0ZSBldGMuICovCisgIFdvcmQxNiAgICAgdGhyZXNoT247ICAgICAgICAgICAgICAgIC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwgKiAxMDAqLworICBXb3JkMzIgICAgIGxwY1N0YXJ0RnJlcTsgICAgICAgICAgICAvKiBsb3dlc3QgZnJlcSBmb3IgbHBjIFRBQlVMKi8KKyAgV29yZDMyICAgICBscGNTdG9wRnJlcTsgICAgICAgICAgICAgLyogVEFCVUwgKi8KKyAgV29yZDMyICAgICB0bnNUaW1lUmVzb2x1dGlvbjsKK31UTlNfQ09ORklHX1RBQlVMQVRFRDsKKworCit0eXBlZGVmIHN0cnVjdCB7ICAgLyphc3NpZ25lZCBhdCBJbml0VGltZSovCisgIFdvcmQxNiB0bnNBY3RpdmU7CisgIFdvcmQxNiB0bnNNYXhTZmI7CisKKyAgV29yZDE2IG1heE9yZGVyOyAgICAgICAgICAgICAgICAvKiBtYXguIG9yZGVyIG9mIHRucyBmaWx0ZXIgKi8KKyAgV29yZDE2IHRuc1N0YXJ0RnJlcTsgICAgICAgICAgICAvKiBsb3dlc3QgZnJlcS4gZm9yIHRucyBmaWx0ZXJpbmcgKi8KKyAgV29yZDE2IGNvZWZSZXM7CisKKyAgVE5TX0NPTkZJR19UQUJVTEFURUQgY29uZlRhYjsKKworICBXb3JkMzIgYWNmV2luZG93W1ROU19NQVhfT1JERVIrMV07CisKKyAgV29yZDE2IHRuc1N0YXJ0QmFuZDsKKyAgV29yZDE2IHRuc1N0YXJ0TGluZTsKKworICBXb3JkMTYgdG5zU3RvcEJhbmQ7CisgIFdvcmQxNiB0bnNTdG9wTGluZTsKKworICBXb3JkMTYgbHBjU3RhcnRCYW5kOworICBXb3JkMTYgbHBjU3RhcnRMaW5lOworCisgIFdvcmQxNiBscGNTdG9wQmFuZDsKKyAgV29yZDE2IGxwY1N0b3BMaW5lOworCisgIFdvcmQxNiB0bnNSYXRpb1BhdGNoTG93ZXN0Q2I7CisgIFdvcmQxNiB0bnNNb2RpZnlCZWdpbkNiOworCisgIFdvcmQxNiB0aHJlc2hvbGQ7IC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwgKiAxMDAgKi8KKworfVROU19DT05GSUc7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBXb3JkMTYgdG5zQWN0aXZlOworICBXb3JkMzIgcGFyY29yW1ROU19NQVhfT1JERVJdOworICBXb3JkMTYgcHJlZGljdGlvbkdhaW47Cit9IFROU19TVUJCTE9DS19JTkZPOyAvKiBXb3JkMTYgc2l6ZTogMjYgKi8KKwordHlwZWRlZiBzdHJ1Y3R7CisgIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mb1tUUkFOU19GQUNdOworfSBUTlNfREFUQV9TSE9SVDsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mbzsKK30gVE5TX0RBVEFfTE9ORzsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIFROU19EQVRBX0xPTkcgdG5zTG9uZzsKKyAgVE5TX0RBVEFfU0hPUlQgdG5zU2hvcnQ7Cit9VE5TX0RBVEFfUkFXOworCit0eXBlZGVmIHN0cnVjdHsKKyAgV29yZDE2IG51bU9mU3ViYmxvY2tzOworICBUTlNfREFUQV9SQVcgZGF0YVJhdzsKK31UTlNfREFUQTsgLyogV29yZDE2IHNpemU6IDEgKyA4KjI2ICsgMjYgPSAyMzUgKi8KKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQxNiB0bnNBY3RpdmVbVFJBTlNfRkFDXTsKKyAgV29yZDE2IGNvZWZSZXNbVFJBTlNfRkFDXTsKKyAgV29yZDE2IGxlbmd0aFtUUkFOU19GQUNdOworICBXb3JkMTYgb3JkZXJbVFJBTlNfRkFDXTsKKyAgV29yZDE2IGNvZWZbVFJBTlNfRkFDKlROU19NQVhfT1JERVJfU0hPUlRdOworfVROU19JTkZPOyAvKiBXb3JkMTYgc2l6ZTogNzIgKi8KKworI2VuZGlmIC8qIF9UTlNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX2Z1bmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiNzViNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmgKQEAgLTAsMCArMSw3NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdG5zX2Z1bmMuaA0KKw0KKwlDb250ZW50OglUTlMgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgIFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKKyAqLworI2lmbmRlZiBfVE5TX0ZVTkNfSAorI2RlZmluZSBfVE5TX0ZVTkNfSA0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKworV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdG5zQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpwc3lDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpOworCitXb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25TaG9ydChXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdG5zQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBzeUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpOworCitXb3JkMzIgVG5zRGV0ZWN0KFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLAorICAgICAgICAgICAgICAgICBXb3JkMzIqIHBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiT2Zmc2V0W10sCisgICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sCisgICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwKKyAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgV29yZDMyICogc2ZiRW5lcmd5KTsKKwordm9pZCBUbnNTeW5jKFROU19EQVRBICp0bnNEYXRhRGVzdCwKKyAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YVNyYywKKyAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHIHRDLAorICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzdWJCbG9ja051bWJlciwKKyAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYmxvY2tUeXBlKTsKKworV29yZDE2IFRuc0VuY29kZShUTlNfSU5GTyogdG5zSW5mbywKKyAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZlNmYiwKKyAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyB0QywKKyAgICAgICAgICAgICAgICAgV29yZDE2IGxvd1Bhc3NMaW5lLAorICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUpOworCit2b2lkIEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MoV29yZDE2IHN0YXJ0Q2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0b3BDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqdGhyZXNob2xkcyk7CisKKworI2VuZGlmIC8qIF9UTlNfRlVOQ19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfcGFyYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjY2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfcGFyYW0uaApAQCAtMCwwICsxLDUyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl0bnNfcGFyYW0uaA0KKw0KKwlDb250ZW50OglUTlMgcGFyYW1ldGVycw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgICBUTlMgcGFyYW1ldGVycworICovCisjaWZuZGVmIF9UTlNfUEFSQU1fSAorI2RlZmluZSBfVE5TX1BBUkFNX0gKKworI2luY2x1ZGUgInRucy5oIgorCit0eXBlZGVmIHN0cnVjdHsKKyAgV29yZDMyIHNhbXBsaW5nUmF0ZTsKKyAgV29yZDE2IG1heEJhbmRMb25nOworICBXb3JkMTYgbWF4QmFuZFNob3J0OworfVROU19NQVhfVEFCX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdHsKKyAgICBXb3JkMzIgYml0UmF0ZUZyb207CisgICAgV29yZDMyIGJpdFJhdGVUbzsKKyAgICBjb25zdCBUTlNfQ09ORklHX1RBQlVMQVRFRCAqcGFyYW1Nb25vX0xvbmc7ICAvKiBjb250YWlucyBUTlMgcGFyYW1ldGVycyAqLworICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbU1vbm9fU2hvcnQ7CisgICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtU3RlcmVvX0xvbmc7CisgICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtU3RlcmVvX1Nob3J0OworfVROU19JTkZPX1RBQjsKKworCit2b2lkIEdldFRuc1BhcmFtKFROU19DT05GSUdfVEFCVUxBVEVEICp0bnNDb25maWdUYWIsIAorICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwgV29yZDE2IGNoYW5uZWxzLCBXb3JkMTYgYmxvY2tUeXBlKTsKKwordm9pZCBHZXRUbnNNYXhCYW5kcyhXb3JkMzIgc2FtcGxpbmdSYXRlLCBXb3JkMTYgYmxvY2tUeXBlLCBXb3JkMTYqIHRuc01heFNmYik7CisKKyNlbmRpZiAvKiBfVE5TX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NjkxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3RyYW5zZm9ybS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXRyYW5zZm9ybS5oDQorDQorCUNvbnRlbnQ6CU1EQ1QgVHJhbnNmb3JtIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgIF9fVFJBTlNGT1JNX0hfXworI2RlZmluZSBfX1RSQU5TRk9STV9IX18KKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKyAgICAgICAgICAgICAgICAgIAordm9pZCBUcmFuc2Zvcm1fUmVhbChXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsICAgICAvKiEgY2hhbm5lbCBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICpyZWFsT3V0LAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd1NlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICk7CisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2UwMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjX3JvbS5jCkBAIC0wLDAgKzEsMjM2MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWFjX3JvbS5jDQorDQorCUNvbnRlbnQ6CWNvbnN0YW50IHRhYmxlcw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNfcm9tLmgiDQorDQorI2lmIGRlZmluZWQgKEFSTVY1RSkgJiYgIWRlZmluZWQgKEFSTVY3TmVvbikNCisNCisvKiANCisgKiAgUTMwIGZvciAxMjggYW5kIDEwMjQgDQorICoNCisgKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgew0KKyAqICAgYW5nbGUgPSAoaSArIDAuMTI1KSAqIE1fUEkgLyBudW07DQorICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOw0KKyAqIA0KKyAqICAgYW5nbGUgPSAobnVtLzIgLSAxIC0gaSArIDAuMTI1KSAqIE1fUEkgLyBudW07DQorICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOw0KKyAqIH0NCisgKi8NCitjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gew0KKwkvKiAxMjggKi8NCisJMHgzZmZmZWM0MywgMHgwMDMyNDNmMSwgMHgwMTVmZDRkMiwgMHgzZmZjMzhkMSwgMHgzZmY5YzEzYSwgMHgwMWM0NTRmNSwgMHgwMmYxYjc1NSwgMHgzZmVlYTc3NiwgDQorCTB4M2ZlOWI4YTksIDB4MDM1NjIwMzgsIDB4MDQ4MzI1OWQsIDB4M2ZkNzNhNGEsIDB4M2ZjZmQ1MGIsIDB4MDRlNzY3YzUsIDB4MDYxM2UxYzUsIDB4M2ZiNWY0ZWEsIA0KKwkweDNmYWMxYTViLCAweDA2NzdlZGJiLCAweDA3YTNhZGZmLCAweDNmOGFkYzc3LCAweDNmN2U4ZTFlLCAweDA4MDc3NDU3LCAweDA5MzI0Y2E3LCAweDNmNTVmNzk2LCANCisJMHgzZjQ3Mzc1OSwgMHgwOTk1YmRmZCwgMHgwYWJmODA0MywgMHgzZjE3NGU3MCwgMHgzZjA2MWU5NSwgMHgwYjIyOGQ0MiwgMHgwYzRiMGI5NCwgMHgzZWNlZWFhZCwgDQorCTB4M2ViYjRkZGIsIDB4MGNhZGE0ZjUsIDB4MGRkNGIxOWEsIDB4M2U3Y2Q3NzgsIDB4M2U2NmQwYjQsIDB4MGUzNmM4MmEsIDB4MGY1YzM1YTMsIDB4M2UyMTIxNzksIA0KKwkweDNlMDhiNDJhLCAweDBmYmRiYTQwLCAweDEwZTE1YjRlLCAweDNkYmJkNmQ0LCAweDNkYTEwNmJkLCAweDExNDIzZWYwLCAweDEyNjNlNjk5LCAweDNkNGQwNzI4LCANCisJMHgzZDJmZDg2YywgMHgxMmM0MWE0ZiwgMHgxM2UzOWJlOSwgMHgzY2Q0YzM4YiwgMHgzY2I1M2FhYSwgMHgxNDQzMTBkZCwgMHgxNTYwNDAxMywgMHgzYzUzMWU4OCwgDQorCTB4M2MzMTQwNjAsIDB4MTViZWU3OGMsIDB4MTZkOTk4NjQsIDB4M2JjODJjMWYsIDB4M2JhM2ZkZTcsIDB4MTczNzYzYzksIDB4MTg0ZjZhYWIsIDB4M2IzNDAxYmIsIA0KKwkweDNiMGQ4OTA5LCAweDE4YWM0Yjg3LCAweDE5YzE3ZDQ0LCAweDNhOTZiNjM2LCAweDNhNmRmOGY4LCAweDFhMWQ2NTQ0LCAweDFiMmY5NzFlLCAweDM5ZjA2MWQyLCANCisJMHgzOWM1NjY0ZiwgMHgxYjhhNzgxNSwgMHgxYzk5N2ZjNCwgMHgzOTQxMWUzMywgMHgzOTEzZWIwZSwgMHgxY2YzNGJhZiwgMHgxZGZlZmY2NywgMHgzODg5MDY2MywgDQorCTB4Mzg1OWEyOTIsIDB4MWU1N2E4NmQsIDB4MWY1ZmRlZTYsIDB4MzdjODM2YzIsIDB4Mzc5NmE5OTYsIDB4MWZiNzU3NWMsIDB4MjBiYmU3ZDgsIDB4MzZmZWNkMGUsIA0KKwkweDM2Y2IxZTJhLCAweDIxMTIyMjQwLCAweDIyMTJlNDkyLCAweDM2MmNlODU1LCAweDM1ZjcxZmIxLCAweDIyNjdkM2EwLCAweDIzNjRhMDJlLCAweDM1NTJhOGY0LCANCisJMHgzNTFhY2VkZCwgMHgyM2I4MzZjYSwgMHgyNGIwZTY5OSwgMHgzNDcwMzA5NSwgMHgzNDM2NGRhNiwgMHgyNTAzMTdkZiwgMHgyNWY3ODQ5NywgMHgzMzg1YTIyMiwgDQorCTB4MzM0OWJmNDgsIDB4MjY0ODQzZDksIDB4MjczODQ3YzgsIDB4MzI5MzIxYzcsIDB4MzI1NTQ4NDAsIDB4Mjc4Nzg4OTMsIDB4Mjg3MmZlYjYsIDB4MzE5OGQ0ZWEsIA0KKwkweDMxNTkwZTNlLCAweDI4YzBiNGQyLCAweDI5YTc3OGRiLCAweDMwOTZlMjIzLCAweDMwNTUzODI4LCAweDI5ZjM5ODRjLCAweDJhZDU4NmEzLCAweDJmOGQ3MTNhLCANCisJMHgyZjQ5ZWUwZiwgMHgyYjIwMDNhYywgMHgyYmZjZjk3YywgMHgyZTdjYWIxYywgMHgyZTM3NTkyYywgMHgyYzQ1YzhhMCwgMHgyZDFkYTNkNSwgMHgyZDY0YjlkYSwgDQorCS8qIDEwMjQgKi8NCisJMHgzZmZmZmZiMSwgMHgwMDA2NDg3ZiwgMHgwMDJiZmI3NCwgMHgzZmZmZjBlMywgMHgzZmZmZTcwNSwgMHgwMDM4OGM2ZSwgMHgwMDVlM2Y0YywgMHgzZmZmYmE5YiwgDQorCTB4M2ZmZmE2ZGUsIDB4MDA2YWQwM2IsIDB4MDA5MDgyZWEsIDB4M2ZmZjVjZDgsIDB4M2ZmZjNmM2MsIDB4MDA5ZDEzYzUsIDB4MDBjMmM2MmYsIDB4M2ZmZWQ3OWIsIA0KKwkweDNmZmViMDIxLCAweDAwY2Y1NmVmLCAweDAwZjUwOGZjLCAweDNmZmUyYWU1LCAweDNmZmRmOThjLCAweDAxMDE5OTk4LCAweDAxMjc0YjMxLCAweDNmZmQ1NmI1LCANCisJMHgzZmZkMWI3ZSwgMHgwMTMzZGJhMywgMHgwMTU5OGNiMSwgMHgzZmZjNWIwYywgMHgzZmZjMTVmNywgMHgwMTY2MWNmMCwgMHgwMThiY2Q1YiwgMHgzZmZiMzdlYywgDQorCTB4M2ZmYWU4ZjksIDB4MDE5ODVkNjAsIDB4MDFiZTBkMTEsIDB4M2ZmOWVkNTMsIDB4M2ZmOTk0ODMsIDB4MDFjYTljZDQsIDB4MDFmMDRiYjQsIDB4M2ZmODdiNDQsIA0KKwkweDNmZjgxODk2LCAweDAxZmNkYjJlLCAweDAyMjI4OTI0LCAweDNmZjZlMWJmLCAweDNmZjY3NTM0LCAweDAyMmYxODRkLCAweDAyNTRjNTQ0LCAweDNmZjUyMGM1LCANCisJMHgzZmY0YWE1ZCwgMHgwMjYxNTQxNCwgMHgwMjg2ZmZmMywgMHgzZmYzMzg1OCwgMHgzZmYyYjgxMywgMHgwMjkzOGU2MiwgMHgwMmI5MzkxNCwgMHgzZmYxMjg3OCwgDQorCTB4M2ZmMDllNTYsIDB4MDJjNWM3MWEsIDB4MDJlYjcwODYsIDB4M2ZlZWYxMjYsIDB4M2ZlZTVkMjgsIDB4MDJmN2ZlMWMsIDB4MDMxZGE2MmIsIDB4M2ZlYzkyNjUsIA0KKwkweDNmZWJmNDhiLCAweDAzMmEzMzQ5LCAweDAzNGZkOWU1LCAweDNmZWEwYzM1LCAweDNmZTk2NDgwLCAweDAzNWM2NjgyLCAweDAzODIwYjkzLCAweDNmZTc1ZTk4LCANCisJMHgzZmU2YWQwOCwgMHgwMzhlOTdhOSwgMHgwM2I0M2IxNywgMHgzZmU0ODk5MCwgMHgzZmUzY2UyNiwgMHgwM2MwYzY5ZSwgMHgwM2U2Njg1MiwgMHgzZmUxOGQxZiwgDQorCTB4M2ZlMGM3ZGEsIDB4MDNmMmYzNDIsIDB4MDQxODkzMjYsIDB4M2ZkZTY5NDUsIDB4M2ZkZDlhMjcsIDB4MDQyNTFkNzcsIDB4MDQ0YWJiNzMsIDB4M2ZkYjFlMDYsIA0KKwkweDNmZGE0NTBmLCAweDA0NTc0NTFkLCAweDA0N2NlMTFhLCAweDNmZDdhYjY0LCAweDNmZDZjODk0LCAweDA0ODk2YTE2LCAweDA0YWYwM2ZjLCAweDNmZDQxMTVmLCANCisJMHgzZmQzMjRiNywgMHgwNGJiOGM0MiwgMHgwNGUxMjNmYSwgMHgzZmQwNGZmYywgMHgzZmNmNTk3YywgMHgwNGVkYWI4MywgMHgwNTEzNDBmNiwgMHgzZmNjNjczYiwgDQorCTB4M2ZjYjY2ZTQsIDB4MDUxZmM3YjksIDB4MDU0NTVhZDEsIDB4M2ZjODU3MWYsIDB4M2ZjNzRjZjMsIDB4MDU1MWUwYzcsIDB4MDU3NzcxNmIsIDB4M2ZjNDFmYWMsIA0KKwkweDNmYzMwYmFhLCAweDA1ODNmNjhjLCAweDA1YTk4NGE2LCAweDNmYmZjMGUzLCAweDNmYmVhMzBjLCAweDA1YjYwOGViLCAweDA1ZGI5NDYzLCAweDNmYmIzYWM3LCANCisJMHgzZmJhMTMxYiwgMHgwNWU4MTdjMywgMHgwNjBkYTA4MywgMHgzZmI2OGQ1YiwgMHgzZmI1NWJkYywgMHgwNjFhMjJmNywgMHgwNjNmYThlNywgMHgzZmIxYjhhMiwgDQorCTB4M2ZiMDdkNTAsIDB4MDY0YzJhNjcsIDB4MDY3MWFkNzEsIDB4M2ZhY2JjOWYsIDB4M2ZhYjc3N2IsIDB4MDY3ZTJkZjUsIDB4MDZhM2FlMDAsIDB4M2ZhNzk5NTQsIA0KKwkweDNmYTY0YTVmLCAweDA2YjAyZDgxLCAweDA2ZDVhYTc3LCAweDNmYTI0ZWM2LCAweDNmYTBmNjAwLCAweDA2ZTIyOGVlLCAweDA3MDdhMmI3LCAweDNmOWNkY2Y3LCANCisJMHgzZjliN2E2MiwgMHgwNzE0MjAxYiwgMHgwNzM5OTZhMSwgMHgzZjk3NDNlYiwgMHgzZjk1ZDc4NywgMHgwNzQ2MTJlYiwgMHgwNzZiODYxNiwgMHgzZjkxODNhNSwgDQorCTB4M2Y5MDBkNzIsIDB4MDc3ODAxM2QsIDB4MDc5ZDcwZjcsIDB4M2Y4YjljMjgsIDB4M2Y4YTFjMjksIDB4MDdhOWVhZjUsIDB4MDdjZjU3MjYsIDB4M2Y4NThkNzksIA0KKwkweDNmODQwM2FlLCAweDA3ZGJjZmYyLCAweDA4MDEzODgzLCAweDNmN2Y1NzliLCAweDNmN2RjNDA1LCAweDA4MGRiMDE2LCAweDA4MzMxNGYxLCAweDNmNzhmYTkyLCANCisJMHgzZjc3NWQzMSwgMHgwODNmOGI0MywgMHgwODY0ZWM0ZiwgMHgzZjcyNzY2MSwgMHgzZjcwY2YzOCwgMHgwODcxNjE1OSwgMHgwODk2YmU4MCwgMHgzZjZiY2IwZSwgDQorCTB4M2Y2YTFhMWMsIDB4MDhhMzMyM2EsIDB4MDhjODhiNjUsIDB4M2Y2NGY4OWIsIDB4M2Y2MzNkZTIsIDB4MDhkNGZkYzYsIDB4MDhmYTUyZGUsIDB4M2Y1ZGZmMGUsIA0KKwkweDNmNWMzYThmLCAweDA5MDZjM2UwLCAweDA5MmMxNGNlLCAweDNmNTZkZTZhLCAweDNmNTUxMDI2LCAweDA5Mzg4NDY5LCAweDA5NWRkMTE2LCAweDNmNGY5NmI0LCANCisJMHgzZjRkYmVhYywgMHgwOTZhM2Y0MiwgMHgwOThmODc5NiwgMHgzZjQ4MjdmMCwgMHgzZjQ2NDYyNiwgMHgwOTliZjQ0YywgMHgwOWMxMzgzMSwgMHgzZjQwOTIyMywgDQorCTB4M2YzZWE2OTcsIDB4MDljZGEzNjgsIDB4MDlmMmUyYzcsIDB4M2YzOGQ1NTIsIDB4M2YzNmUwMDYsIDB4MDlmZjRjNzgsIDB4MGEyNDg3M2EsIDB4M2YzMGYxODEsIA0KKwkweDNmMmVmMjc2LCAweDBhMzBlZjVlLCAweDBhNTYyNTZjLCAweDNmMjhlNmI2LCAweDNmMjZkZGVjLCAweDBhNjI4YmZhLCAweDBhODdiZDNkLCAweDNmMjBiNGY1LCANCisJMHgzZjFlYTI2ZSwgMHgwYTk0MjIyZiwgMHgwYWI5NGU4ZiwgMHgzZjE4NWM0MywgMHgzZjE2NDAwMSwgMHgwYWM1YjFkYywgMHgwYWVhZDk0NCwgMHgzZjBmZGNhNSwgDQorCTB4M2YwZGI2YTksIDB4MGFmNzNhZTUsIDB4MGIxYzVkM2QsIDB4M2YwNzM2MjEsIDB4M2YwNTA2NmQsIDB4MGIyOGJkMmEsIDB4MGI0ZGRhNWMsIDB4M2VmZTY4YmMsIA0KKwkweDNlZmMyZjUwLCAweDBiNWEzODhkLCAweDBiN2Y1MDgxLCAweDNlZjU3NDdiLCAweDNlZjMzMTVhLCAweDBiOGJhY2YwLCAweDBiYjBiZjhmLCAweDNlZWM1OTY1LCANCisJMHgzZWVhMGM4ZSwgMHgwYmJkMWEzMywgMHgwYmUyMjc2NiwgMHgzZWUzMTc3ZSwgMHgzZWUwYzBmNCwgMHgwYmVlODAzOCwgMHgwYzEzODdlOSwgMHgzZWQ5YWVjYywgDQorCTB4M2VkNzRlOTEsIDB4MGMxZmRlZTEsIDB4MGM0NGUwZjksIDB4M2VkMDFmNTUsIDB4M2VjZGI1NmEsIDB4MGM1MTM2MTAsIDB4MGM3NjMyNzgsIDB4M2VjNjY5MjAsIA0KKwkweDNlYzNmNTg1LCAweDBjODI4NWE1LCAweDBjYTc3YzQ3LCAweDNlYmM4YzMxLCAweDNlYmEwZWU5LCAweDBjYjNjZDg0LCAweDBjZDhiZTQ3LCAweDNlYjI4ODhmLCANCisJMHgzZWIwMDE5YywgMHgwY2U1MGQ4YywgMHgwZDA5Zjg1YiwgMHgzZWE4NWU0MSwgMHgzZWE1Y2RhMywgMHgwZDE2NDVhMCwgMHgwZDNiMmE2NCwgMHgzZTllMGQ0YywgDQorCTB4M2U5YjczMDYsIDB4MGQ0Nzc1YTEsIDB4MGQ2YzU0NDMsIDB4M2U5Mzk1YjcsIDB4M2U5MGYxY2EsIDB4MGQ3ODlkNzEsIDB4MGQ5ZDc1ZGIsIDB4M2U4OGY3ODgsIA0KKwkweDNlODY0OWY1LCAweDBkYTliY2YyLCAweDBkY2U4ZjBkLCAweDNlN2UzMmM2LCAweDNlN2I3YjkwLCAweDBkZGFkNDA2LCAweDBkZmY5ZmJhLCAweDNlNzM0Nzc4LCANCisJMHgzZTcwODY5ZiwgMHgwZTBiZTI4ZSwgMHgwZTMwYTdjNSwgMHgzZTY4MzVhNCwgMHgzZTY1NmIyYiwgMHgwZTNjZTg2YiwgMHgwZTYxYTcwZiwgMHgzZTVjZmQ1MSwgDQorCTB4M2U1YTI5MzksIDB4MGU2ZGU1ODAsIDB4MGU5MjlkN2EsIDB4M2U1MTllODYsIDB4M2U0ZWMwZDEsIDB4MGU5ZWQ5YWYsIDB4MGVjMzhhZTgsIDB4M2U0NjE5NGEsIA0KKwkweDNlNDMzMWZhLCAweDBlY2ZjNGQ5LCAweDBlZjQ2ZjNiLCAweDNlM2E2ZGE0LCAweDNlMzc3Y2JiLCAweDBmMDBhNmRmLCAweDBmMjU0YTUzLCAweDNlMmU5YjljLCANCisJMHgzZTJiYTExYiwgMHgwZjMxN2ZhNSwgMHgwZjU2MWMxNSwgMHgzZTIyYTMzOCwgMHgzZTFmOWYyMSwgMHgwZjYyNGYwYywgMHgwZjg2ZTQ2MCwgMHgzZTE2ODQ4MCwgDQorCTB4M2UxMzc2ZDUsIDB4MGY5MzE0ZjUsIDB4MGZiN2EzMTcsIDB4M2UwYTNmN2IsIDB4M2UwNzI4M2YsIDB4MGZjM2QxNDMsIDB4MGZlODU4MWQsIDB4M2RmZGQ0MzIsIA0KKwkweDNkZmFiMzY1LCAweDBmZjQ4M2Q3LCAweDEwMTkwMzUyLCAweDNkZjE0MmFiLCAweDNkZWUxODUxLCAweDEwMjUyYzk0LCAweDEwNDlhNDlhLCAweDNkZTQ4YWVmLCANCisJMHgzZGUxNTcwOCwgMHgxMDU1Y2I1YiwgMHgxMDdhM2JkNSwgMHgzZGQ3YWQwNSwgMHgzZGQ0NmY5NCwgMHgxMDg2NjAwZSwgMHgxMGFhYzhlNiwgMHgzZGNhYThmNSwgDQorCTB4M2RjNzYxZmMsIDB4MTBiNmVhOTAsIDB4MTBkYjRiYWYsIDB4M2RiZDdlYzcsIDB4M2RiYTJlNDgsIDB4MTBlNzZhYzMsIDB4MTEwYmM0MTMsIDB4M2RiMDJlODQsIA0KKwkweDNkYWNkNDgxLCAweDExMTdlMDg4LCAweDExM2MzMWYzLCAweDNkYTJiODM0LCAweDNkOWY1NGFmLCAweDExNDg0YmMyLCAweDExNmM5NTMxLCAweDNkOTUxYmRlLCANCisJMHgzZDkxYWVkOSwgMHgxMTc4YWM1MywgMHgxMTljZWRhZiwgMHgzZDg3NTk4YywgMHgzZDgzZTMwOSwgMHgxMWE5MDIxZCwgMHgxMWNkM2I1MCwgMHgzZDc5NzE0NSwgDQorCTB4M2Q3NWYxNDcsIDB4MTFkOTRkMDIsIDB4MTFmZDdkZjYsIDB4M2Q2YjYzMTMsIDB4M2Q2N2Q5OWIsIDB4MTIwOThjZTUsIDB4MTIyZGI1ODMsIDB4M2Q1ZDJlZmUsIA0KKwkweDNkNTk5YzBlLCAweDEyMzljMWE3LCAweDEyNWRlMWRhLCAweDNkNGVkNTBmLCAweDNkNGIzOGFhLCAweDEyNjllYjJiLCAweDEyOGUwMmRjLCAweDNkNDA1NTRlLCANCisJMHgzZDNjYWY3NiwgMHgxMjlhMDk1NCwgMHgxMmJlMTg2YywgMHgzZDMxYWZjNSwgMHgzZDJlMDA3YywgMHgxMmNhMWMwMywgMHgxMmVlMjI2YywgMHgzZDIyZTQ3YywgDQorCTB4M2QxZjJiYzUsIDB4MTJmYTIzMWIsIDB4MTMxZTIwYzAsIDB4M2QxM2YzN2UsIDB4M2QxMDMxNWEsIDB4MTMyYTFlN2UsIDB4MTM0ZTEzNDgsIDB4M2QwNGRjZDIsIA0KKwkweDNkMDExMTQ1LCAweDEzNWEwZTBlLCAweDEzN2RmOWU3LCAweDNjZjVhMDgyLCAweDNjZjFjYjhlLCAweDEzODlmMWFmLCAweDEzYWRkNDgxLCAweDNjZTYzZTk4LCANCisJMHgzY2UyNjAzZiwgMHgxM2I5Yzk0MywgMHgxM2RkYTJmNywgMHgzY2Q2YjcxZSwgMHgzY2QyY2Y2MiwgMHgxM2U5OTRhYiwgMHgxNDBkNjUyYywgMHgzY2M3MGExYywgDQorCTB4M2NjMzE4ZmYsIDB4MTQxOTUzY2IsIDB4MTQzZDFiMDIsIDB4M2NiNzM3OWMsIDB4M2NiMzNkMjIsIDB4MTQ0OTA2ODUsIDB4MTQ2Y2M0NWMsIDB4M2NhNzNmYTksIA0KKwkweDNjYTMzYmQzLCAweDE0NzhhY2JjLCAweDE0OWM2MTFkLCAweDNjOTcyMjRjLCAweDNjOTMxNTFkLCAweDE0YTg0NjUyLCAweDE0Y2JmMTI3LCAweDNjODZkZjhlLCANCisJMHgzYzgyYzkwOSwgMHgxNGQ3ZDMyYSwgMHgxNGZiNzQ1ZSwgMHgzYzc2Nzc3YiwgMHgzYzcyNTdhMiwgMHgxNTA3NTMyNywgMHgxNTJhZWFhMywgMHgzYzY1ZWExYywgDQorCTB4M2M2MWMwZjEsIDB4MTUzNmM2MmIsIDB4MTU1YTUzZDksIDB4M2M1NTM3N2IsIDB4M2M1MTA1MDEsIDB4MTU2NjJjMTgsIDB4MTU4OWFmZTMsIDB4M2M0NDVmYTIsIA0KKwkweDNjNDAyM2RkLCAweDE1OTU4NGQzLCAweDE1YjhmZWE0LCAweDNjMzM2MjlkLCAweDNjMmYxZDhlLCAweDE1YzRkMDNlLCAweDE1ZTgzZmZmLCAweDNjMjI0MDc1LCANCisJMHgzYzFkZjIxZiwgMHgxNWY0MGUzYSwgMHgxNjE3NzNkNiwgMHgzYzEwZjkzNSwgMHgzYzBjYTE5YiwgMHgxNjIzM2VhYywgMHgxNjQ2OWEwZCwgMHgzYmZmOGNlOCwgDQorCTB4M2JmYjJjMGMsIDB4MTY1MjYxNzYsIDB4MTY3NWIyODYsIDB4M2JlZGZiOTksIDB4M2JlOTkxN2UsIDB4MTY4MTc2N2MsIDB4MTZhNGJkMjUsIDB4M2JkYzQ1NTIsIA0KKwkweDNiZDdkMWZhLCAweDE2YjA3ZDlmLCAweDE2ZDNiOWNjLCAweDNiY2E2YTFkLCAweDNiYzVlZDhkLCAweDE2ZGY3NmMzLCAweDE3MDJhODVlLCAweDNiYjg2YTA4LCANCisJMHgzYmIzZTQ0MCwgMHgxNzBlNjFjYywgMHgxNzMxODhiZSwgMHgzYmE2NDUxYiwgMHgzYmExYjYyMCwgMHgxNzNkM2U5YiwgMHgxNzYwNWFkMCwgMHgzYjkzZmI2MywgDQorCTB4M2I4ZjYzMzcsIDB4MTc2YzBkMTUsIDB4MTc4ZjFlNzYsIDB4M2I4MThjZWIsIDB4M2I3Y2ViOTAsIDB4MTc5YWNkMWMsIDB4MTdiZGQzOTQsIDB4M2I2ZWY5YmUsIA0KKwkweDNiNmE0ZjM4LCAweDE3Yzk3ZTkzLCAweDE3ZWM3YTBkLCAweDNiNWM0MWU4LCAweDNiNTc4ZTM5LCAweDE3ZjgyMTVlLCAweDE4MWIxMWM0LCAweDNiNDk2NTc0LCANCisJMHgzYjQ0YThhMCwgMHgxODI2YjU2MSwgMHgxODQ5OWE5ZCwgMHgzYjM2NjQ2ZSwgMHgzYjMxOWU3NywgMHgxODU1M2E3ZCwgMHgxODc4MTQ3YSwgMHgzYjIzM2VlMSwgDQorCTB4M2IxZTZmY2EsIDB4MTg4M2IwOTcsIDB4MThhNjdmM2YsIDB4M2IwZmY0ZDksIDB4M2IwYjFjYTYsIDB4MThiMjE3OTEsIDB4MThkNGRhZDAsIDB4M2FmYzg2NjMsIA0KKwkweDNhZjdhNTE2LCAweDE4ZTA2ZjUwLCAweDE5MDMyNzBmLCAweDNhZThmMzhiLCAweDNhZTQwOTI2LCAweDE5MGViN2I3LCAweDE5MzE2M2UxLCAweDNhZDUzYzViLCANCisJMHgzYWQwNDhlMywgMHgxOTNjZjBhOSwgMHgxOTVmOTEyOCwgMHgzYWMxNjBlMSwgMHgzYWJjNjQ1OCwgMHgxOTZiMWEwOSwgMHgxOThkYWVjOCwgMHgzYWFkNjEyOSwgDQorCTB4M2FhODViOTIsIDB4MTk5OTMzYmIsIDB4MTliYmJjYTYsIDB4M2E5OTNkM2UsIDB4M2E5NDJlOWQsIDB4MTljNzNkYTMsIDB4MTllOWJhYTMsIDB4M2E4NGY1MmYsIA0KKwkweDNhN2ZkZDg2LCAweDE5ZjUzN2E0LCAweDFhMTdhOGE1LCAweDNhNzA4OTA2LCAweDNhNmI2ODU5LCAweDFhMjMyMWEyLCAweDFhNDU4NjhlLCAweDNhNWJmOGQxLCANCisJMHgzYTU2Y2YyMywgMHgxYTUwZmI4MSwgMHgxYTczNTQ0MiwgMHgzYTQ3NDQ5YywgMHgzYTQyMTFmMCwgMHgxYTdlYzUyNCwgMHgxYWExMTFhNiwgMHgzYTMyNmM3NCwgDQorCTB4M2EyZDMwY2QsIDB4MWFhYzdlNmYsIDB4MWFjZWJlOWQsIDB4M2ExZDcwNjYsIDB4M2ExODJiYzgsIDB4MWFkYTI3NDYsIDB4MWFmYzViMGEsIDB4M2EwODUwN2YsIA0KKwkweDNhMDMwMmVkLCAweDFiMDdiZjhjLCAweDFiMjllNmQyLCAweDM5ZjMwY2NjLCAweDM5ZWRiNjQ5LCAweDFiMzU0NzI3LCAweDFiNTc2MWQ4LCAweDM5ZGRhNTVhLCANCisJMHgzOWQ4NDVlOSwgMHgxYjYyYmRmOCwgMHgxYjg0Y2MwMSwgMHgzOWM4MWEzNiwgMHgzOWMyYjFkYSwgMHgxYjkwMjNlNSwgMHgxYmIyMjUzMCwgMHgzOWIyNmI2ZCwgDQorCTB4MzlhY2ZhMmIsIDB4MWJiZDc4ZDIsIDB4MWJkZjZkNGEsIDB4Mzk5Yzk5MGQsIDB4Mzk5NzFlZTcsIDB4MWJlYWJjYTEsIDB4MWMwY2E0MzIsIDB4Mzk4NmEzMjQsIA0KKwkweDM5ODEyMDFlLCAweDFjMTdlZjM5LCAweDFjMzljOWNkLCAweDM5NzA4OWJmLCAweDM5NmFmZGRjLCAweDFjNDUxMDdjLCAweDFjNjZkZGZlLCAweDM5NWE0Y2ViLCANCisJMHgzOTU0YjgyZSwgMHgxYzcyMjA0ZiwgMHgxYzkzZTBhYiwgMHgzOTQzZWNiNiwgMHgzOTNlNGYyMywgMHgxYzlmMWU5NiwgMHgxY2MwZDFiNiwgMHgzOTJkNjkyZiwgDQorCTB4MzkyN2MyYzksIDB4MWNjYzBiMzUsIDB4MWNlZGIxMDYsIDB4MzkxNmMyNjIsIDB4MzkxMTEzMmQsIDB4MWNmOGU2MTEsIDB4MWQxYTdlN2QsIDB4MzhmZmY4NWUsIA0KKwkweDM4ZmE0MDVlLCAweDFkMjVhZjBkLCAweDFkNDczYTAwLCAweDM4ZTkwYjMxLCAweDM4ZTM0YTY5LCAweDFkNTI2NjBmLCAweDFkNzNlMzc0LCAweDM4ZDFmYWU5LCANCisJMHgzOGNjMzE1ZCwgMHgxZDdmMGFmYiwgMHgxZGEwN2FiYywgMHgzOGJhYzc5NSwgMHgzOGI0ZjU0NywgMHgxZGFiOWRiNSwgMHgxZGNjZmZiZiwgMHgzOGEzNzE0MiwgDQorCTB4Mzg5ZDk2MzcsIDB4MWRkODFlMjEsIDB4MWRmOTcyNWYsIDB4Mzg4YmY3ZmYsIDB4Mzg4NjE0M2IsIDB4MWUwNDhjMjQsIDB4MWUyNWQyODIsIDB4Mzg3NDViZGIsIA0KKwkweDM4NmU2ZjYwLCAweDFlMzBlN2E0LCAweDFlNTIyMDBjLCAweDM4NWM5Y2UzLCAweDM4NTZhN2I2LCAweDFlNWQzMDg0LCAweDFlN2U1YWUyLCAweDM4NDRiYjI4LCANCisJMHgzODNlYmQ0YywgMHgxZTg5NjZhOCwgMHgxZWFhODJlOSwgMHgzODJjYjZiNywgMHgzODI2YjAzMCwgMHgxZWI1ODlmNywgMHgxZWQ2OTgwNSwgMHgzODE0OGY5ZiwgDQorCTB4MzgwZTgwNzEsIDB4MWVlMTlhNTQsIDB4MWYwMjlhMWMsIDB4MzdmYzQ1ZWYsIDB4MzdmNjJlMWQsIDB4MWYwZDk3YTUsIDB4MWYyZTg5MTEsIDB4MzdlM2Q5YjcsIA0KKwkweDM3ZGRiOTQ1LCAweDFmMzk4MWNlLCAweDFmNWE2NGNiLCAweDM3Y2I0YjA0LCAweDM3YzUyMWY2LCAweDFmNjU1OGI1LCAweDFmODYyZDJkLCAweDM3YjI5OWU3LCANCisJMHgzN2FjNjg0MSwgMHgxZjkxMWMzZCwgMHgxZmIxZTIxZCwgMHgzNzk5YzY2ZiwgMHgzNzkzOGMzNCwgMHgxZmJjY2M0ZCwgMHgxZmRkODM4MSwgMHgzNzgwZDBhYSwgDQorCTB4Mzc3YThkZGYsIDB4MWZlODY4YzgsIDB4MjAwOTExM2MsIDB4Mzc2N2I4YTksIDB4Mzc2MTZkNTEsIDB4MjAxM2YxOTYsIDB4MjAzNDhiMzUsIDB4Mzc0ZTdlN2IsIA0KKwkweDM3NDgyYTlhLCAweDIwM2Y2Njk5LCAweDIwNWZmMTRmLCAweDM3MzUyMjJmLCAweDM3MmVjNWM5LCAweDIwNmFjN2I4LCAweDIwOGI0MzcyLCAweDM3MWJhM2Q0LCANCisJMHgzNzE1M2VlZSwgMHgyMDk2MTRkOSwgMHgyMGI2ODE4MSwgMHgzNzAyMDM3YywgMHgzNmZiOTYxOCwgMHgyMGMxNGRkZiwgMHgyMGUxYWI2MywgMHgzNmU4NDEzNSwgDQorCTB4MzZlMWNiNTgsIDB4MjBlYzcyYjEsIDB4MjEwY2MwZmMsIDB4MzZjZTVkMTAsIDB4MzZjN2RlYmQsIDB4MjExNzgzMzQsIDB4MjEzN2MyMzIsIDB4MzZiNDU3MWIsIA0KKwkweDM2YWRkMDU4LCAweDIxNDI3ZjRkLCAweDIxNjJhZWVhLCAweDM2OWEyZjY5LCAweDM2OTNhMDM4LCAweDIxNmQ2NmUyLCAweDIxOGQ4NzBiLCAweDM2N2ZlNjA4LCANCisJMHgzNjc5NGU2ZSwgMHgyMTk4MzlkOCwgMHgyMWI4NGE3OSwgMHgzNjY1N2IwOCwgMHgzNjVlZGIwOSwgMHgyMWMyZjgxNSwgMHgyMWUyZjkxYSwgMHgzNjRhZWU3YiwgDQorCTB4MzY0NDQ2MWIsIDB4MjFlZGExN2YsIDB4MjIwZDkyZDQsIDB4MzYzMDQwNzAsIDB4MzYyOThmYjQsIDB4MjIxODM1ZmIsIDB4MjIzODE3OGQsIDB4MzYxNTcwZjgsIA0KKwkweDM2MGViN2UzLCAweDIyNDJiNTZmLCAweDIyNjI4NzI5LCAweDM1ZmE4MDIzLCAweDM1ZjNiZWJhLCAweDIyNmQxZmMxLCAweDIyOGNlMTkxLCAweDM1ZGY2ZTAzLCANCisJMHgzNWQ4YTQ0OSwgMHgyMjk3NzRkNywgMHgyMmI3MjZhOCwgMHgzNWM0M2FhNywgMHgzNWJkNjhhMSwgMHgyMmMxYjQ5NiwgMHgyMmUxNTY1NSwgMHgzNWE4ZTYyMSwgDQorCTB4MzVhMjBiZDMsIDB4MjJlYmRlZTUsIDB4MjMwYjcwN2UsIDB4MzU4ZDcwODEsIDB4MzU4NjhkZWYsIDB4MjMxNWYzYTgsIDB4MjMzNTc1MDksIDB4MzU3MWQ5ZDksIA0KKwkweDM1NmFlZjA4LCAweDIzM2ZmMmM4LCAweDIzNWY2M2RjLCAweDM1NTYyMjM5LCAweDM1NGYyZjJjLCAweDIzNjlkYzI5LCAweDIzODkzY2RkLCAweDM1M2E0OWIyLCANCisJMHgzNTMzNGU2ZiwgMHgyMzkzYWZiMiwgMHgyM2IyZmZmMywgMHgzNTFlNTA1NiwgMHgzNTE3NGNlMCwgMHgyM2JkNmQ0OCwgMHgyM2RjYWQwMywgMHgzNTAyMzYzNiwgDQorCTB4MzRmYjJhOTIsIDB4MjNlNzE0ZDMsIDB4MjQwNjQzZjQsIDB4MzRlNWZiNjMsIDB4MzRkZWU3OTUsIDB4MjQxMGE2MzksIDB4MjQyZmM0YWQsIDB4MzRjOTlmZWYsIA0KKwkweDM0YzI4M2ZiLCAweDI0M2EyMTVmLCAweDI0NTkyZjEzLCAweDM0YWQyM2ViLCAweDM0YTVmZmQ1LCAweDI0NjM4NjJjLCAweDI0ODI4MzBkLCAweDM0OTA4NzY4LCANCisJMHgzNDg5NWIzNiwgMHgyNDhjZDQ4NywgMHgyNGFiYzA4MiwgMHgzNDczY2E3OSwgMHgzNDZjOTYyZiwgMHgyNGI2MGM1NywgMHgyNGQ0ZTc1NywgMHgzNDU2ZWQyZiwgDQorCTB4MzQ0ZmIwZDEsIDB4MjRkZjJkODEsIDB4MjRmZGY3NzUsIDB4MzQzOWVmOWMsIDB4MzQzMmFiMmUsIDB4MjUwODM3ZWQsIDB4MjUyNmYwYzEsIDB4MzQxY2QxZDIsIA0KKwkweDM0MTU4NTU5LCAweDI1MzEyYjgxLCAweDI1NGZkMzIzLCAweDMzZmY5M2UyLCAweDMzZjgzZjYyLCAweDI1NWEwODIzLCAweDI1Nzg5ZTgwLCAweDMzZTIzNWRmLCANCisJMHgzM2RhZDk1ZSwgMHgyNTgyY2RiYywgMHgyNWExNTJjMCwgMHgzM2M0YjdkYiwgMHgzM2JkNTM1YywgMHgyNWFiN2MzMCwgMHgyNWM5ZWZjYSwgMHgzM2E3MTllOCwgDQorCTB4MzM5ZmFkNzAsIDB4MjVkNDEzNjksIDB4MjVmMjc1ODQsIDB4MzM4OTVjMTgsIDB4MzM4MWU3YWMsIDB4MjVmYzkzNGIsIDB4MjYxYWUzZDYsIDB4MzM2YjdlN2UsIA0KKwkweDMzNjQwMjIzLCAweDI2MjRmYmJmLCAweDI2NDMzYWE3LCAweDMzNGQ4MTJkLCAweDMzNDVmY2U2LCAweDI2NGQ0Y2FjLCAweDI2NmI3OWRkLCAweDMzMmY2NDM1LCANCisJMHgzMzI3ZDgwOCwgMHgyNjc1ODVmOCwgMHgyNjkzYTE2MSwgMHgzMzExMjdhYiwgMHgzMzA5OTM5YywgMHgyNjlkYTc4YiwgMHgyNmJiYjExOSwgMHgzMmYyY2JhMSwgDQorCTB4MzJlYjJmYjUsIDB4MjZjNWIxNGMsIDB4MjZlM2E4ZWMsIDB4MzJkNDUwMjksIDB4MzJjY2FjNjQsIDB4MjZlZGEzMjIsIDB4MjcwYjg4YzIsIDB4MzJiNWI1NTcsIA0KKwkweDMyYWUwOWJlLCAweDI3MTU3Y2Y1LCAweDI3MzM1MDgyLCAweDMyOTZmYjNkLCAweDMyOGY0N2Q1LCAweDI3M2QzZWFjLCAweDI3NWIwMDE0LCAweDMyNzgyMWVlLCANCisJMHgzMjcwNjZiYywgMHgyNzY0ZTgyZiwgMHgyNzgyOTc2MCwgMHgzMjU5Mjk3ZCwgMHgzMjUxNjY4NiwgMHgyNzhjNzk2NSwgMHgyN2FhMTY0YywgMHgzMjNhMTFmZSwgDQorCTB4MzIzMjQ3NDYsIDB4MjdiM2YyMzUsIDB4MjdkMTdjYzEsIDB4MzIxYWRiODMsIDB4MzIxMzA5MGYsIDB4MjdkYjUyODgsIDB4MjdmOGNhYTUsIDB4MzFmYjg2MjAsIA0KKwkweDMxZjNhYmY1LCAweDI4MDI5YTQ1LCAweDI4MWZmZmUyLCAweDMxZGMxMWU4LCAweDMxZDQzMDBiLCAweDI4MjljOTU0LCAweDI4NDcxYzVlLCAweDMxYmM3ZWVlLCANCisJMHgzMWI0OTU2NCwgMHgyODUwZGY5ZCwgMHgyODZlMjAwMiwgMHgzMTljY2Q0NiwgMHgzMTk0ZGMxNCwgMHgyODc3ZGQwNywgMHgyODk1MGFiNiwgMHgzMTdjZmQwNCwgDQorCTB4MzE3NTA0MmUsIDB4Mjg5ZWMxN2EsIDB4MjhiYmRjNjEsIDB4MzE1ZDBlM2IsIDB4MzE1NTBkYzYsIDB4MjhjNThjZGYsIDB4MjhlMjk0ZWIsIDB4MzEzZDAwZmYsIA0KKwkweDMxMzRmOGYxLCAweDI4ZWMzZjFlLCAweDI5MDkzNDNlLCAweDMxMWNkNTY0LCAweDMxMTRjNWMwLCAweDI5MTJkODFmLCAweDI5MmZiYTQwLCAweDMwZmM4YjdkLCANCisJMHgzMGY0NzQ0OSwgMHgyOTM5NTdjOSwgMHgyOTU2MjZkYSwgMHgzMGRjMjM1ZSwgMHgzMGQ0MDRhMCwgMHgyOTVmYmUwNiwgMHgyOTdjNzlmNSwgMHgzMGJiOWQxYywgDQorCTB4MzBiMzc2ZDgsIDB4Mjk4NjBhYmQsIDB4MjlhMmIzNzgsIDB4MzA5YWY4Y2EsIDB4MzA5MmNiMDUsIDB4MjlhYzNkZDcsIDB4MjljOGQzNGQsIDB4MzA3YTM2N2MsIA0KKwkweDMwNzIwMTNjLCAweDI5ZDI1NzNjLCAweDI5ZWVkOTViLCAweDMwNTk1NjQ4LCAweDMwNTExOTkxLCAweDI5Zjg1NmQ1LCAweDJhMTRjNThiLCAweDMwMzg1ODQwLCANCisJMHgzMDMwMTQxOCwgMHgyYTFlM2M4YSwgMHgyYTNhOTdjNywgMHgzMDE3M2M3YSwgMHgzMDBlZjBlNSwgMHgyYTQ0MDg0NCwgMHgyYTYwNGZmNSwgMHgyZmY2MDMwYSwgDQorCTB4MmZlZGIwMGQsIDB4MmE2OWI5ZWMsIDB4MmE4NWVlMDAsIDB4MmZkNGFjMDQsIDB4MmZjYzUxYTUsIDB4MmE4ZjUxNmIsIDB4MmFhYjcxZDAsIDB4MmZiMzM3N2MsIA0KKwkweDJmYWFkNWMxLCAweDJhYjRjZWE5LCAweDJhZDBkYjRlLCAweDJmOTFhNTg5LCAweDJmODkzYzc1LCAweDJhZGEzMThlLCAweDJhZjYyYTYzLCAweDJmNmZmNjNkLCANCisJMHgyZjY3ODVkNywgMHgyYWZmN2EwNSwgMHgyYjFiNWVmOCwgMHgyZjRlMjlhZiwgMHgyZjQ1YjFmYiwgMHgyYjI0YTdmNiwgMHgyYjQwNzhmNSwgMHgyZjJjM2ZmMiwgDQorCTB4MmYyM2MwZjYsIDB4MmI0OWJiNGEsIDB4MmI2NTc4NDQsIDB4MmYwYTM5MWQsIDB4MmYwMWIyZGUsIDB4MmI2ZWIzZWEsIDB4MmI4YTVjY2UsIDB4MmVlODE1NDMsIA0KKwkweDJlZGY4N2M2LCAweDJiOTM5MWMwLCAweDJiYWYyNjdkLCAweDJlYzVkNDc5LCAweDJlYmQzZmM0LCAweDJiYjg1NGI0LCAweDJiZDNkNTNhLCAweDJlYTM3NmQ2LCANCisJMHgyZTlhZGFlZSwgMHgyYmRjZmNiMCwgMHgyYmY4NjhlZCwgMHgyZTgwZmM2ZSwgMHgyZTc4NTk1OCwgMHgyYzAxODk5ZSwgMHgyYzFjZTE4MSwgMHgyZTVlNjU1NiwgDQorCTB4MmU1NWJiMTcsIDB4MmMyNWZiNjYsIDB4MmM0MTNlZGYsIDB4MmUzYmIxYTQsIDB4MmUzMzAwNDIsIDB4MmM0YTUxZjMsIDB4MmM2NTgwZjEsIDB4MmUxOGUxNmQsIA0KKwkweDJlMTAyOGVkLCAweDJjNmU4ZDJlLCAweDJjODlhNzlmLCAweDJkZjVmNGM3LCAweDJkZWQzNTJmLCAweDJjOTJhZDAxLCAweDJjYWRiMmQ1LCAweDJkZDJlYmM3LCANCisJMHgyZGNhMjUxYywgMHgyY2I2YjE1NSwgMHgyY2QxYTI3YiwgMHgyZGFmYzY4MywgMHgyZGE2ZjhjYSwgMHgyY2RhOWExNCwgMHgyY2Y1NzY3YywgMHgyZDhjODUxMCwgDQorCTB4MmQ4M2IwNGYsIDB4MmNmZTY3MjgsIDB4MmQxOTJlYzEsIDB4MmQ2OTI3ODQsIDB4MmQ2MDRiYzAsIDB4MmQyMjE4N2EsIDB4MmQzY2NiMzQsIDB4MmQ0NWFkZjYNCit9Ow0KKw0KKw0KK2NvbnN0IGludCB0d2lkVGFiNTEyWyg4KjYgKyAzMio2ICsgMTI4KjYpLzJdID0gew0KKwkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNiMjAxODdkLCANCisJMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgDQorCTB4MTg3ZDNiMjAsIDB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsIA0KKwkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGU3ODMzYjIwLCANCisJMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgDQorCTB4YzRlMGU3ODMsIDB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsIA0KKw0KKwkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmYjEwNjQ1LCANCisJMHgzZmVjMDMyMywgMHgzZjRlMDk2NCwgMHgzZWM1MGM3YywgMHgzZmIxMDY0NSwgDQorCTB4M2QzZTEyOTQsIDB4M2QzZTEyOTQsIDB4M2Y0ZTA5NjQsIDB4MzlkYTFiNWQsIA0KKwkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDM4NzExZTJiLCANCisJMHgzZTE0MGY4YywgMHgyZjZiMmFmYSwgMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwgDQorCTB4Mjg5OTMxNzksIDB4MzE3OTI4OTksIDB4M2M0MjE1OGYsIDB4MjBlNzM2ZTUsIA0KKwkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDI4OTkzMTc5LCANCisJMHgzOWRhMWI1ZCwgMHgwZjhjM2UxNCwgMHgyMzhlMzUzNiwgMHgzODcxMWUyYiwgDQorCTB4MDY0NTNmYjEsIDB4MWUyYjM4NzEsIDB4MzZlNTIwZTcsIDB4ZmNkZDNmZWMsIA0KKwkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDEyOTQzZDNlLCANCisJMHgzMzY3MjYxZiwgMHhlYTcxM2M0MiwgMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwgDQorCTB4ZTFkNTM4NzEsIDB4MDY0NTNmYjEsIDB4MmY2YjJhZmEsIDB4ZDllMTMzNjcsIA0KKwkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGY5YmIzZmIxLCANCisJMHgyYWZhMmY2YiwgMHhjYzk5MjYxZiwgMHhmMzg0M2VjNSwgMHgyODk5MzE3OSwgDQorCTB4Yzc4ZjFlMmIsIDB4ZWQ2YzNkM2UsIDB4MjYxZjMzNjcsIDB4YzNiZTE1OGYsIA0KKwkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGUxZDUzODcxLCANCisJMHgyMGU3MzZlNSwgMHhjMDE0MDMyMywgMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwgDQorCTB4YzA0ZmY5YmIsIDB4ZDc2NzMxNzksIDB4MWI1ZDM5ZGEsIDB4YzFlY2YwNzQsIA0KKwkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNlODcyODk5LCANCisJMHgxNThmM2M0MiwgMHhjOTFiZGYxOSwgMHhjYWNhMjM4ZSwgMHgxMjk0M2QzZSwgDQorCTB4Y2U4N2Q3NjcsIDB4Yzc4ZjFlMmIsIDB4MGY4YzNlMTQsIDB4ZDUwNmQwOTUsIA0KKwkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGMyYzIxMjk0LCANCisJMHgwOTY0M2Y0ZSwgMHhlNGEzYzYyNiwgMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwgDQorCTB4ZWQ2Y2MyYzIsIDB4YzA0ZjA2NDUsIDB4MDMyMzNmZWMsIDB4ZjY5Y2MwYjIsIA0KKw0KKwkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmZmIwMTkyLCANCisJMHgzZmZlMDBjOSwgMHgzZmY0MDI1YiwgMHgzZmVjMDMyMywgMHgzZmZiMDE5MiwgDQorCTB4M2ZkMzA0YjUsIDB4M2ZkMzA0YjUsIDB4M2ZmNDAyNWIsIDB4M2Y5YzA3MGQsIA0KKwkweDNmYjEwNjQ1LCAweDNmZWMwMzIzLCAweDNmNGUwOTY0LCAweDNmODQwN2Q1LCANCisJMHgzZmUxMDNlYywgMHgzZWViMGJiNiwgMHgzZjRlMDk2NCwgMHgzZmQzMDRiNSwgDQorCTB4M2U3MTBlMDUsIDB4M2YwZTBhZjEsIDB4M2ZjMzA1N2QsIDB4M2RlMjEwNGYsIA0KKwkweDNlYzUwYzdjLCAweDNmYjEwNjQ1LCAweDNkM2UxMjk0LCAweDNlNzEwZTA1LCANCisJMHgzZjljMDcwZCwgMHgzYzg0MTRkMSwgMHgzZTE0MGY4YywgMHgzZjg0MDdkNSwgDQorCTB4M2JiNjE3MDgsIDB4M2RhZTExMTEsIDB4M2Y2YTA4OWMsIDB4M2FkMjE5MzcsIA0KKwkweDNkM2UxMjk0LCAweDNmNGUwOTY0LCAweDM5ZGExYjVkLCAweDNjYzUxNDEzLCANCisJMHgzZjJmMGEyYSwgMHgzOGNmMWQ3OSwgMHgzYzQyMTU4ZiwgMHgzZjBlMGFmMSwgDQorCTB4MzdhZjFmOGIsIDB4M2JiNjE3MDgsIDB4M2VlYjBiYjYsIDB4MzY3YzIxOTIsIA0KKwkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDNhODIxOWVmLCANCisJMHgzZTljMGQ0MSwgMHgzM2RlMjU3ZCwgMHgzOWRhMWI1ZCwgMHgzZTcxMGUwNSwgDQorCTB4MzI3NDI3NWYsIDB4MzkyYTFjYzYsIDB4M2U0NDBlYzksIDB4MzBmODI5MzQsIA0KKwkweDM4NzExZTJiLCAweDNlMTQwZjhjLCAweDJmNmIyYWZhLCAweDM3YWYxZjhiLCANCisJMHgzZGUyMTA0ZiwgMHgyZGNlMmNiMiwgMHgzNmU1MjBlNywgMHgzZGFlMTExMSwgDQorCTB4MmMyMTJlNWEsIDB4MzYxMjIyM2QsIDB4M2Q3NzExZDMsIDB4MmE2NTJmZjEsIA0KKwkweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAweDI4OTkzMTc5LCAweDM0NTMyNGRhLCANCisJMHgzZDAyMTM1NCwgMHgyNmMwMzJlZSwgMHgzMzY3MjYxZiwgMHgzY2M1MTQxMywgDQorCTB4MjRkYTM0NTMsIDB4MzI3NDI3NWYsIDB4M2M4NDE0ZDEsIDB4MjJlNjM1YTUsIA0KKwkweDMxNzkyODk5LCAweDNjNDIxNThmLCAweDIwZTczNmU1LCAweDMwNzYyOWNkLCANCisJMHgzYmZkMTY0YywgMHgxZWRjMzgxMSwgMHgyZjZiMmFmYSwgMHgzYmI2MTcwOCwgDQorCTB4MWNjNjM5MmEsIDB4MmU1YTJjMjEsIDB4M2I2YzE3YzMsIDB4MWFhNjNhMmYsIA0KKwkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDJjMjEyZTVhLCANCisJMHgzYWQyMTkzNywgMHgxNjRjM2JmZCwgMHgyYWZhMmY2YiwgMHgzYTgyMTllZiwgDQorCTB4MTQxMzNjYzUsIDB4MjljZDMwNzYsIDB4M2EyZjFhYTYsIDB4MTFkMzNkNzcsIA0KKwkweDI4OTkzMTc5LCAweDM5ZGExYjVkLCAweDBmOGMzZTE0LCAweDI3NWYzMjc0LCANCisJMHgzOTgzMWMxMiwgMHgwZDQxM2U5YywgMHgyNjFmMzM2NywgMHgzOTJhMWNjNiwgDQorCTB4MGFmMTNmMGUsIDB4MjRkYTM0NTMsIDB4MzhjZjFkNzksIDB4MDg5YzNmNmEsIA0KKwkweDIzOGUzNTM2LCAweDM4NzExZTJiLCAweDA2NDUzZmIxLCAweDIyM2QzNjEyLCANCisJMHgzODExMWVkYywgMHgwM2VjM2ZlMSwgMHgyMGU3MzZlNSwgMHgzN2FmMWY4YiwgDQorCTB4MDE5MjNmZmIsIDB4MWY4YjM3YWYsIDB4Mzc0YjIwMzksIDB4ZmYzNzNmZmUsIA0KKwkweDFlMmIzODcxLCAweDM2ZTUyMGU3LCAweGZjZGQzZmVjLCAweDFjYzYzOTJhLCANCisJMHgzNjdjMjE5MiwgMHhmYTgzM2ZjMywgMHgxYjVkMzlkYSwgMHgzNjEyMjIzZCwgDQorCTB4ZjgyYjNmODQsIDB4MTllZjNhODIsIDB4MzVhNTIyZTYsIDB4ZjVkNjNmMmYsIA0KKwkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDE3MDgzYmI2LCANCisJMHgzNGM2MjQzNCwgMHhmMTM3M2U0NCwgMHgxNThmM2M0MiwgMHgzNDUzMjRkYSwgDQorCTB4ZWVlZjNkYWUsIDB4MTQxMzNjYzUsIDB4MzNkZTI1N2QsIDB4ZWNhYzNkMDIsIA0KKwkweDEyOTQzZDNlLCAweDMzNjcyNjFmLCAweGVhNzEzYzQyLCAweDExMTEzZGFlLCANCisJMHgzMmVlMjZjMCwgMHhlODNkM2I2YywgMHgwZjhjM2UxNCwgMHgzMjc0Mjc1ZiwgDQorCTB4ZTYxMTNhODIsIDB4MGUwNTNlNzEsIDB4MzFmNzI3ZmQsIDB4ZTNlZTM5ODMsIA0KKwkweDBjN2MzZWM1LCAweDMxNzkyODk5LCAweGUxZDUzODcxLCAweDBhZjEzZjBlLCANCisJMHgzMGY4MjkzNCwgMHhkZmM3Mzc0YiwgMHgwOTY0M2Y0ZSwgMHgzMDc2MjljZCwgDQorCTB4ZGRjMzM2MTIsIDB4MDdkNTNmODQsIDB4MmZmMTJhNjUsIDB4ZGJjYzM0YzYsIA0KKwkweDA2NDUzZmIxLCAweDJmNmIyYWZhLCAweGQ5ZTEzMzY3LCAweDA0YjUzZmQzLCANCisJMHgyZWUzMmI4ZSwgMHhkODAzMzFmNywgMHgwMzIzM2ZlYywgMHgyZTVhMmMyMSwgDQorCTB4ZDYzMzMwNzYsIDB4MDE5MjNmZmIsIDB4MmRjZTJjYjIsIDB4ZDQ3MjJlZTMsIA0KKwkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGZlNmUzZmZiLCANCisJMHgyY2IyMmRjZSwgMHhkMTFkMmI4ZSwgMHhmY2RkM2ZlYywgMHgyYzIxMmU1YSwgDQorCTB4Y2Y4YTI5Y2QsIDB4ZmI0YjNmZDMsIDB4MmI4ZTJlZTMsIDB4Y2UwOTI3ZmQsIA0KKwkweGY5YmIzZmIxLCAweDJhZmEyZjZiLCAweGNjOTkyNjFmLCAweGY4MmIzZjg0LCANCisJMHgyYTY1MmZmMSwgMHhjYjNhMjQzNCwgMHhmNjljM2Y0ZSwgMHgyOWNkMzA3NiwgDQorCTB4YzllZTIyM2QsIDB4ZjUwZjNmMGUsIDB4MjkzNDMwZjgsIDB4YzhiNTIwMzksIA0KKwkweGYzODQzZWM1LCAweDI4OTkzMTc5LCAweGM3OGYxZTJiLCAweGYxZmIzZTcxLCANCisJMHgyN2ZkMzFmNywgMHhjNjdkMWMxMiwgMHhmMDc0M2UxNCwgMHgyNzVmMzI3NCwgDQorCTB4YzU3ZTE5ZWYsIDB4ZWVlZjNkYWUsIDB4MjZjMDMyZWUsIDB4YzQ5NDE3YzMsIA0KKwkweGVkNmMzZDNlLCAweDI2MWYzMzY3LCAweGMzYmUxNThmLCAweGViZWQzY2M1LCANCisJMHgyNTdkMzNkZSwgMHhjMmZlMTM1NCwgMHhlYTcxM2M0MiwgMHgyNGRhMzQ1MywgDQorCTB4YzI1MjExMTEsIDB4ZThmODNiYjYsIDB4MjQzNDM0YzYsIDB4YzFiYzBlYzksIA0KKwkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGU2MTEzYTgyLCANCisJMHgyMmU2MzVhNSwgMHhjMGQxMGEyYSwgMHhlNGEzMzlkYSwgMHgyMjNkMzYxMiwgDQorCTB4YzA3YzA3ZDUsIDB4ZTMzYTM5MmEsIDB4MjE5MjM2N2MsIDB4YzAzZDA1N2QsIA0KKwkweGUxZDUzODcxLCAweDIwZTczNmU1LCAweGMwMTQwMzIzLCAweGUwNzUzN2FmLCANCisJMHgyMDM5Mzc0YiwgMHhjMDAyMDBjOSwgMHhkZjE5MzZlNSwgMHgxZjhiMzdhZiwgDQorCTB4YzAwNWZlNmUsIDB4ZGRjMzM2MTIsIDB4MWVkYzM4MTEsIDB4YzAxZmZjMTQsIA0KKwkweGRjNzIzNTM2LCAweDFlMmIzODcxLCAweGMwNGZmOWJiLCAweGRiMjYzNDUzLCANCisJMHgxZDc5MzhjZiwgMHhjMDk2Zjc2NCwgMHhkOWUxMzM2NywgMHgxY2M2MzkyYSwgDQorCTB4YzBmMmY1MGYsIDB4ZDhhMTMyNzQsIDB4MWMxMjM5ODMsIDB4YzE2NGYyYmYsIA0KKwkweGQ3NjczMTc5LCAweDFiNWQzOWRhLCAweGMxZWNmMDc0LCAweGQ2MzMzMDc2LCANCisJMHgxYWE2M2EyZiwgMHhjMjg5ZWUyZCwgMHhkNTA2MmY2YiwgMHgxOWVmM2E4MiwgDQorCTB4YzMzYmViZWQsIDB4ZDNkZjJlNWEsIDB4MTkzNzNhZDIsIDB4YzQwM2U5YjQsIA0KKwkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGQxYTYyYzIxLCANCisJMHgxN2MzM2I2YywgMHhjNWQxZTU1YSwgMHhkMDk1MmFmYSwgMHgxNzA4M2JiNiwgDQorCTB4YzZkNmUzM2EsIDB4Y2Y4YTI5Y2QsIDB4MTY0YzNiZmQsIDB4YzdlZmUxMjQsIA0KKwkweGNlODcyODk5LCAweDE1OGYzYzQyLCAweGM5MWJkZjE5LCAweGNkOGMyNzVmLCANCisJMHgxNGQxM2M4NCwgMHhjYTViZGQxYSwgMHhjYzk5MjYxZiwgMHgxNDEzM2NjNSwgDQorCTB4Y2JhZGRiMjYsIDB4Y2JhZDI0ZGEsIDB4MTM1NDNkMDIsIDB4Y2QxMmQ5NDAsIA0KKwkweGNhY2EyMzhlLCAweDEyOTQzZDNlLCAweGNlODdkNzY3LCAweGM5ZWUyMjNkLCANCisJMHgxMWQzM2Q3NywgMHhkMDBmZDU5YiwgMHhjOTFiMjBlNywgMHgxMTExM2RhZSwgDQorCTB4ZDFhNmQzZGYsIDB4Yzg1MTFmOGIsIDB4MTA0ZjNkZTIsIDB4ZDM0ZWQyMzIsIA0KKwkweGM3OGYxZTJiLCAweDBmOGMzZTE0LCAweGQ1MDZkMDk1LCAweGM2ZDYxY2M2LCANCisJMHgwZWM5M2U0NCwgMHhkNmNjY2YwOCwgMHhjNjI2MWI1ZCwgMHgwZTA1M2U3MSwgDQorCTB4ZDhhMWNkOGMsIDB4YzU3ZTE5ZWYsIDB4MGQ0MTNlOWMsIDB4ZGE4M2NjMjIsIA0KKwkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGM0NGExNzA4LCANCisJMHgwYmI2M2VlYiwgMHhkZTZlYzk4NCwgMHhjM2JlMTU4ZiwgMHgwYWYxM2YwZSwgDQorCTB4ZTA3NWM4NTEsIDB4YzMzYjE0MTMsIDB4MGEyYTNmMmYsIDB4ZTI4N2M3MzEsIA0KKwkweGMyYzIxMjk0LCAweDA5NjQzZjRlLCAweGU0YTNjNjI2LCAweGMyNTIxMTExLCANCisJMHgwODljM2Y2YSwgMHhlNmM5YzUyZSwgMHhjMWVjMGY4YywgMHgwN2Q1M2Y4NCwgDQorCTB4ZThmOGM0NGEsIDB4YzE4ZjBlMDUsIDB4MDcwZDNmOWMsIDB4ZWIyZmMzN2MsIA0KKwkweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAweGVkNmNjMmMyLCAweGMwZjIwYWYxLCANCisJMHgwNTdkM2ZjMywgMHhlZmIxYzIxZSwgMHhjMGIyMDk2NCwgMHgwNGI1M2ZkMywgDQorCTB4ZjFmYmMxOGYsIDB4YzA3YzA3ZDUsIDB4MDNlYzNmZTEsIDB4ZjQ0YWMxMTUsIA0KKwkweGMwNGYwNjQ1LCAweDAzMjMzZmVjLCAweGY2OWNjMGIyLCAweGMwMmQwNGI1LCANCisJMHgwMjViM2ZmNCwgMHhmOGYzYzA2NCwgMHhjMDE0MDMyMywgMHgwMTkyM2ZmYiwgDQorCTB4ZmI0YmMwMmQsIDB4YzAwNTAxOTIsIDB4MDBjOTNmZmUsIDB4ZmRhNWMwMGMJDQorfTsNCisNCitjb25zdCBpbnQgdHdpZFRhYjY0Wyg0KjYgKyAxNio2KS8yXSA9IHsNCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxMmQ0MSwgDQorCTB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIA0KKwkweGQyYmYyZDQxLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCANCisNCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZWM1MGM3YywgDQorCTB4M2ZiMTA2NDUsIDB4M2QzZTEyOTQsIDB4M2IyMDE4N2QsIDB4M2VjNTBjN2MsIA0KKwkweDM1MzYyMzhlLCAweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAweDI4OTkzMTc5LCANCisJMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyMzhlMzUzNiwgDQorCTB4Mzg3MTFlMmIsIDB4MDY0NTNmYjEsIDB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIA0KKwkweGYzODQzZWM1LCAweDBjN2MzZWM1LCAweDMxNzkyODk5LCAweGUxZDUzODcxLCANCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmMzg0M2VjNSwgDQorCTB4Mjg5OTMxNzksIDB4Yzc4ZjFlMmIsIDB4ZTc4MzNiMjAsIDB4MjM4ZTM1MzYsIA0KKwkweGMxM2IwYzdjLCAweGRjNzIzNTM2LCAweDFlMmIzODcxLCAweGMwNGZmOWJiLCANCisJMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhjYWNhMjM4ZSwgDQorCTB4MTI5NDNkM2UsIDB4Y2U4N2Q3NjcsIDB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIA0KKwkweGRjNzJjYWNhLCAweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAweGVkNmNjMmMyIA0KK307DQorDQorI2VsaWYgZGVmaW5lZCBBUk1WN05lb24NCisvKiANCisgKiAgUTI5IGZvciAxMjggYW5kIDEwMjQgDQorICoNCisgKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgew0KKyAqICAgYW5nbGUgPSAoaSArIDAuMTI1KSAqIE1fUEkgLyBudW07DQorICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsNCisgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMjkpOw0KKyAqIA0KKyAqICAgYW5nbGUgPSAobnVtLzIgLSAxIC0gaSArIDAuMTI1KSAqIE1fUEkgLyBudW07DQorICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsNCisgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMjkpOw0KKyAqIH0NCisgKi8NCitjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gew0KKwkvKiAxMjggKi8NCisJMHgxZmZmZjYyMSwgMHgwMDE5MjFmOSwgMHgwMGFmZWE2OSwgMHgxZmZlMWM2OCwgMHgxZmZjZTA5ZCwgMHgwMGUyMmE3YSwgMHgwMTc4ZGJhYSwgMHgxZmY3NTNiYiwgCisJMHgxZmY0ZGM1NSwgMHgwMWFiMTAxYywgMHgwMjQxOTJjZiwgMHgxZmViOWQyNSwgMHgxZmU3ZWE4NSwgMHgwMjczYjNlMiwgMHgwMzA5ZjBlMiwgMHgxZmRhZmE3NSwgCisJMHgxZmQ2MGQyZSwgMHgwMzNiZjZkZCwgMHgwM2QxZDcwMCwgMHgxZmM1NmUzYiwgMHgxZmJmNDcwZiwgMHgwNDAzYmEyYiwgMHgwNDk5MjY1MywgMHgxZmFhZmJjYiwgCisJMHgxZmEzOWJhYywgMHgwNGNhZGVmZSwgMHgwNTVmYzAyMiwgMHgxZjhiYTczOCwgMHgxZjgzMGY0YSwgMHgwNTkxNDZhMSwgMHgwNjI1ODVjYSwgMHgxZjY3NzU1NywgCisJMHgxZjVkYTZlZCwgMHgwNjU2ZDI3YSwgMHgwNmVhNThjZCwgMHgxZjNlNmJiYywgMHgxZjMzNjg1YSwgMHgwNzFiNjQxNSwgMHgwN2FlMWFkMiwgMHgxZjEwOTBiZCwgCisJMHgxZjA0NWExNSwgMHgwN2RlZGQyMCwgMHgwODcwYWRhNywgMHgxZWRkZWI2YSwgMHgxZWQwODM1ZiwgMHgwOGExMWY3OCwgMHgwOTMxZjM0ZCwgMHgxZWE2ODM5NCwgCisJMHgxZTk3ZWMzNiwgMHgwOTYyMGQyNywgMHgwOWYxY2RmNSwgMHgxZTZhNjFjNSwgMHgxZTVhOWQ1NSwgMHgwYTIxODg2ZSwgMHgwYWIwMjAwOSwgMHgxZTI5OGY0NCwgCisJMHgxZTE4YTAzMCwgMHgwYWRmNzNjNiwgMHgwYjZjY2MzMiwgMHgxZGU0MTYwZiwgMHgxZGQxZmVmNCwgMHgwYjliYjFlNSwgMHgwYzI3YjU1NSwgMHgxZDlhMDBkZSwgCisJMHgxZDg2YzQ4NCwgMHgwYzU2MjVjMywgMHgwY2UwYmVhMiwgMHgxZDRiNWIxYiwgMHgxZDM2ZmM3YywgMHgwZDBlYjJhMiwgMHgwZDk3Y2I4ZiwgMHgxY2Y4MzBlOSwgCisJMHgxY2UyYjMyOCwgMHgwZGM1M2MwYSwgMHgwZTRjYmZlMiwgMHgxY2EwOGYxYSwgMHgxYzg5ZjU4NywgMHgwZTc5YTVkNywgMHgwZWZmN2ZiMywgMHgxYzQ0ODMzMSwgCisJMHgxYzJjZDE0OSwgMHgwZjJiZDQzNywgMHgwZmFmZWY3MywgMHgxYmU0MWI2MSwgMHgxYmNiNTRjYiwgMHgwZmRiYWJhZSwgMHgxMDVkZjNlYywgMHgxYjdmNjY4NywgCisJMHgxYjY1OGYxNSwgMHgxMDg5MTEyMCwgMHgxMTA5NzI0OSwgMHgxYjE2NzQyYSwgMHgxYWZiOGZkOSwgMHgxMTMzZTlkMCwgMHgxMWIyNTAxNywgMHgxYWE5NTQ3YSwgCisJMHgxYThkNjc2ZSwgMHgxMWRjMWI2NSwgMHgxMjU4NzM0ZCwgMHgxYTM4MTg0YSwgMHgxYTFiMjZkMywgMHgxMjgxOGJlZiwgMHgxMmZiYzI0YiwgMHgxOWMyZDExMSwgCisJMHgxOWE0ZGZhNCwgMHgxMzI0MjFlYywgMHgxMzljMjNlNCwgMHgxOTQ5OTBlNCwgMHgxOTJhYTQyMCwgMHgxM2MzYzQ0YSwgMHgxNDM5N2Y1YiwgMHgxOGNjNmE3NSwgCisJMHgxOGFjODcxZiwgMHgxNDYwNWE2OSwgMHgxNGQzYmM2ZCwgMHgxODRiNzExMiwgMHgxODJhOWMxNCwgMHgxNGY5Y2MyNiwgMHgxNTZhYzM1MiwgMHgxN2M2Yjg5ZCwgCisJMHgxN2E0ZjcwOCwgMHgxNTkwMDFkNiwgMHgxNWZlN2NiZSwgMHgxNzNlNTU4ZSwgMHgxNzFiYWM5NiwgMHgxNjIyZTQ1MCwgMHgxNjhlZDFlYiwgMHgxNmIyNWNlZCwNCisJLyogMTAyNCAqLw0KKwkweDFmZmZmZmQ5LCAweDAwMDMyNDNmLCAweDAwMTVmZGJhLCAweDFmZmZmODcyLCAweDFmZmZmMzgyLCAweDAwMWM0NjM3LCAweDAwMmYxZmE2LCAweDFmZmZkZDRkLCANCisJMHgxZmZmZDM2ZiwgMHgwMDM1NjgxZCwgMHgwMDQ4NDE3NSwgMHgxZmZmYWU2YywgMHgxZmZmOWY5ZSwgMHgwMDRlODllMywgMHgwMDYxNjMxOCwgMHgxZmZmNmJjZSwgDQorCTB4MWZmZjU4MTEsIDB4MDA2N2FiNzcsIDB4MDA3YTg0N2UsIDB4MWZmZjE1NzIsIDB4MWZmZWZjYzYsIDB4MDA4MGNjY2MsIDB4MDA5M2E1OTksIDB4MWZmZWFiNWIsIA0KKwkweDFmZmU4ZGJmLCAweDAwOTllZGQyLCAweDAwYWNjNjU4LCAweDFmZmUyZDg2LCAweDFmZmUwYWZjLCAweDAwYjMwZTc4LCAweDAwYzVlNmFkLCAweDFmZmQ5YmY2LCANCisJMHgxZmZkNzQ3YywgMHgwMGNjMmViMCwgMHgwMGRmMDY4OCwgMHgxZmZjZjZhYSwgMHgxZmZjY2E0MSwgMHgwMGU1NGU2YSwgMHgwMGY4MjVkYSwgMHgxZmZjM2RhMiwgDQorCTB4MWZmYzBjNGIsIDB4MDBmZTZkOTcsIDB4MDExMTQ0OTIsIDB4MWZmYjcwZTAsIDB4MWZmYjNhOWEsIDB4MDExNzhjMjcsIDB4MDEyYTYyYTIsIDB4MWZmYTkwNjMsIA0KKwkweDFmZmE1NTJlLCAweDAxMzBhYTBhLCAweDAxNDM3ZmZhLCAweDFmZjk5YzJjLCAweDFmZjk1YzA5LCAweDAxNDljNzMxLCAweDAxNWM5YzhhLCAweDFmZjg5NDNjLCANCisJMHgxZmY4NGYyYiwgMHgwMTYyZTM4ZCwgMHgwMTc1Yjg0MywgMHgxZmY3Nzg5MywgMHgxZmY3MmU5NCwgMHgwMTdiZmYwZSwgMHgwMThlZDMxNiwgMHgxZmY2NDkzMiwgDQorCTB4MWZmNWZhNDYsIDB4MDE5NTE5YTUsIDB4MDFhN2VjZjIsIDB4MWZmNTA2MWIsIDB4MWZmNGIyNDAsIDB4MDFhZTMzNDEsIDB4MDFjMTA1YzksIDB4MWZmM2FmNGMsIA0KKwkweDFmZjM1Njg0LCAweDAxYzc0YmQ1LCAweDAxZGExZDhjLCAweDFmZjI0NGM4LCAweDFmZjFlNzEzLCAweDAxZTA2MzRmLCAweDAxZjMzNDI5LCAweDFmZjBjNjhmLCANCisJMHgxZmYwNjNlZCwgMHgwMWY5NzlhMSwgMHgwMjBjNDk5MywgMHgxZmVmMzRhMywgMHgxZmVlY2QxNCwgMHgwMjEyOGViYiwgMHgwMjI1NWRiOSwgMHgxZmVkOGYwMywgDQorCTB4MWZlZDIyODcsIDB4MDIyYmEyOGYsIDB4MDIzZTcwOGQsIDB4MWZlYmQ1YjIsIDB4MWZlYjY0NGEsIDB4MDI0NGI1MGIsIDB4MDI1NzgxZmUsIDB4MWZlYTA4YjAsIA0KKwkweDFmZTk5MjVjLCAweDAyNWRjNjIxLCAweDAyNzA5MWZkLCAweDFmZTgyN2ZlLCAweDFmZTdhY2JlLCAweDAyNzZkNWMxLCAweDAyODlhMDdiLCAweDFmZTYzMzlkLCANCisJMHgxZmU1YjM3MiwgMHgwMjhmZTNkZCwgMHgwMmEyYWQ2OSwgMHgxZmU0MmI5MCwgMHgxZmUzYTY3OSwgMHgwMmE4ZjA2MywgMHgwMmJiYjhiNiwgMHgxZmUyMGZkNiwgDQorCTB4MWZlMTg1ZDUsIDB4MDJjMWZiNDYsIDB4MDJkNGMyNTMsIDB4MWZkZmUwNzEsIDB4MWZkZjUxODYsIDB4MDJkYjA0NzUsIDB4MDJlZGNhMzIsIDB4MWZkZDlkNjQsIA0KKwkweDFmZGQwOThlLCAweDAyZjQwYmUyLCAweDAzMDZkMDQyLCAweDFmZGI0NmFlLCAweDFmZGFhZGVlLCAweDAzMGQxMTdjLCAweDAzMWZkNDc0LCAweDFmZDhkYzUxLCANCisJMHgxZmQ4M2VhOCwgMHgwMzI2MTUzNCwgMHgwMzM4ZDZiOCwgMHgxZmQ2NWU0ZiwgMHgxZmQ1YmJiZCwgMHgwMzNmMTZmYiwgMHgwMzUxZDcwMCwgMHgxZmQzY2NhYSwgDQorCTB4MWZkMzI1MzAsIDB4MDM1ODE2YzEsIDB4MDM2YWQ1M2MsIDB4MWZkMTI3NjMsIDB4MWZkMDdiMDAsIDB4MDM3MTE0NzcsIDB4MDM4M2QxNWMsIDB4MWZjZTZlN2MsIA0KKwkweDFmY2RiZDMxLCAweDAzOGExMDBlLCAweDAzOWNjYjUxLCAweDFmY2JhMWY1LCAweDFmY2FlYmMzLCAweDAzYTMwOTc1LCAweDAzYjVjMzBiLCAweDFmYzhjMWQyLCANCisJMHgxZmM4MDZiOSwgMHgwM2JjMDA5ZiwgMHgwM2NlYjg3YywgMHgxZmM1Y2UxNCwgMHgxZmM1MGUxNCwgMHgwM2Q0ZjU3YSwgMHgwM2U3YWI5MywgMHgxZmMyYzZiZCwgDQorCTB4MWZjMjAxZDcsIDB4MDNlZGU3ZjksIDB4MDQwMDljNDIsIDB4MWZiZmFiY2QsIDB4MWZiZWUyMDIsIDB4MDQwNmQ4MGIsIDB4MDQxOThhNzgsIDB4MWZiYzdkNDksIA0KKwkweDFmYmJhZTk5LCAweDA0MWZjNWExLCAweDA0MzI3NjI4LCAweDFmYjkzYjMxLCAweDFmYjg2NzljLCAweDA0MzhiMGFjLCAweDA0NGI1ZjQwLCAweDFmYjVlNTg3LCANCisJMHgxZmI1MGQwZSwgMHgwNDUxOTkxZCwgMHgwNDY0NDViMiwgMHgxZmIyN2M0ZSwgMHgxZmIxOWVmMSwgMHgwNDZhN2VlMywgMHgwNDdkMjk2ZiwgMHgxZmFlZmY4NywgDQorCTB4MWZhZTFkNDcsIDB4MDQ4MzYxZjAsIDB4MDQ5NjBhNjcsIDB4MWZhYjZmMzUsIDB4MWZhYTg4MTMsIDB4MDQ5YzQyMzUsIDB4MDRhZWU4OGIsIDB4MWZhN2NiNWEsIA0KKwkweDFmYTZkZjU2LCAweDA0YjUxZmExLCAweDA0YzdjM2NiLCAweDFmYTQxM2Y4LCAweDFmYTMyMzEzLCAweDA0Y2RmYTI2LCAweDA0ZTA5YzE4LCAweDFmYTA0OTEyLCANCisJMHgxZjlmNTM0YywgMHgwNGU2ZDFiNCwgMHgwNGY5NzE2MywgMHgxZjljNmFhOSwgMHgxZjliNzAwMywgMHgwNGZmYTYzYywgMHgwNTEyNDM5ZCwgMHgxZjk4NzhjMSwgDQorCTB4MWY5Nzc5M2IsIDB4MDUxODc3YWYsIDB4MDUyYjEyYjYsIDB4MWY5NDczNWIsIDB4MWY5MzZlZjYsIDB4MDUzMTQ1ZmQsIDB4MDU0M2RlOWUsIDB4MWY5MDVhN2EsIA0KKwkweDFmOGY1MTM3LCAweDA1NGExMTE3LCAweDA1NWNhNzQ4LCAweDFmOGMyZTIxLCAweDFmOGIyMDAwLCAweDA1NjJkOGVlLCAweDA1NzU2Y2EyLCAweDFmODdlZTUyLCANCisJMHgxZjg2ZGI1NSwgMHgwNTdiOWQ3MywgMHgwNThlMmU5ZiwgMHgxZjgzOWIxMCwgMHgxZjgyODMzNiwgMHgwNTk0NWU5NSwgMHgwNWE2ZWQyZSwgMHgxZjdmMzQ1ZSwgDQorCTB4MWY3ZTE3YTgsIDB4MDVhZDFjNDcsIDB4MDViZmE4NDAsIDB4MWY3YWJhM2UsIDB4MWY3OTk4YWQsIDB4MDVjNWQ2NzgsIDB4MDVkODVmYzcsIDB4MWY3NjJjYjIsIA0KKwkweDFmNzUwNjQ3LCAweDA1ZGU4ZDE5LCAweDA1ZjExM2IzLCAweDFmNzE4YmJmLCAweDFmNzA2MDdhLCAweDA1Zjc0MDFjLCAweDA2MDljM2Y1LCAweDFmNmNkNzY2LCANCisJMHgxZjZiYTc0OCwgMHgwNjBmZWY3MSwgMHgwNjIyNzA3ZCwgMHgxZjY4MGZhYiwgMHgxZjY2ZGFiNSwgMHgwNjI4OWIwOCwgMHgwNjNiMTkzYywgMHgxZjYzMzQ5MCwgDQorCTB4MWY2MWZhYzMsIDB4MDY0MTQyZDMsIDB4MDY1M2JlMjMsIDB4MWY1ZTQ2MTksIDB4MWY1ZDA3NzUsIDB4MDY1OWU2YzIsIDB4MDY2YzVmMjQsIDB4MWY1OTQ0NDgsIA0KKwkweDFmNTgwMGNlLCAweDA2NzI4NmM2LCAweDA2ODRmYzJlLCAweDFmNTQyZjIxLCAweDFmNTJlNmQyLCAweDA2OGIyMmQwLCAweDA2OWQ5NTMyLCAweDFmNGYwNmE2LCANCisJMHgxZjRkYjk4MywgMHgwNmEzYmFkMCwgMHgwNmI2MmEyMiwgMHgxZjQ5Y2FkYywgMHgxZjQ4NzhlNSwgMHgwNmJjNGViOSwgMHgwNmNlYmFlZSwgMHgxZjQ0N2JjNCwgDQorCTB4MWY0MzI0ZmIsIDB4MDZkNGRlNzksIDB4MDZlNzQ3ODYsIDB4MWYzZjE5NjMsIDB4MWYzZGJkYzgsIDB4MDZlZDZhMDMsIDB4MDZmZmNmZGQsIDB4MWYzOWEzYmMsIA0KKwkweDFmMzg0MzUwLCAweDA3MDVmMTQ3LCAweDA3MTg1M2UzLCAweDFmMzQxYWQyLCAweDFmMzJiNTk1LCAweDA3MWU3NDM2LCAweDA3MzBkMzg4LCAweDFmMmU3ZWE5LCANCisJMHgxZjJkMTQ5ZCwgMHgwNzM2ZjJjMCwgMHgwNzQ5NGViZCwgMHgxZjI4Y2Y0MywgMHgxZjI3NjA2OSwgMHgwNzRmNmNkNywgMHgwNzYxYzU3NCwgMHgxZjIzMGNhNSwgDQorCTB4MWYyMTk4ZmQsIDB4MDc2N2UyNmMsIDB4MDc3YTM3OWQsIDB4MWYxZDM2ZDIsIDB4MWYxYmJlNWQsIDB4MDc4MDUzNzAsIDB4MDc5MmE1MmEsIDB4MWYxNzRkY2UsIA0KKwkweDFmMTVkMDhkLCAweDA3OThiZmQzLCAweDA3YWIwZTBhLCAweDFmMTE1MTljLCAweDFmMGZjZjkxLCAweDA3YjEyNzg2LCAweDA3YzM3MjMwLCAweDFmMGI0MjQwLCANCisJMHgxZjA5YmI2YiwgMHgwN2M5OGE3YSwgMHgwN2RiZDE4YywgMHgxZjA1MWZiZSwgMHgxZjAzOTQxZiwgMHgwN2UxZThhMSwgMHgwN2Y0MmMwZSwgMHgxZWZlZWExOSwgDQorCTB4MWVmZDU5YjMsIDB4MDdmYTQxZWIsIDB4MDgwYzgxYTksIDB4MWVmOGExNTUsIDB4MWVmNzBjMjgsIDB4MDgxMjk2NGEsIDB4MDgyNGQyNGQsIDB4MWVmMjQ1NzcsIA0KKwkweDFlZjBhYjg0LCAweDA4MmFlNWFkLCAweDA4M2QxZGVhLCAweDFlZWJkNjgyLCAweDFlZWEzN2NhLCAweDA4NDMzMDA3LCAweDA4NTU2NDczLCAweDFlZTU1NDdhLCANCisJMHgxZWUzYjBmZSwgMHgwODViNzU0OCwgMHgwODZkYTVkOCwgMHgxZWRlYmY2NCwgMHgxZWRkMTcyNCwgMHgwODczYjU2MiwgMHgwODg1ZTIwOSwgMHgxZWQ4MTc0MiwgDQorCTB4MWVkNjZhNDEsIDB4MDg4YmYwNDQsIDB4MDg5ZTE4ZjksIDB4MWVkMTVjMWEsIDB4MWVjZmFhNTcsIDB4MDhhNDI1ZTEsIDB4MDhiNjRhOTgsIDB4MWVjYThkZWYsIA0KKwkweDFlYzhkNzZjLCAweDA4YmM1NjJhLCAweDA4Y2U3NmQ4LCAweDFlYzNhY2M2LCAweDFlYzFmMTg0LCAweDA4ZDQ4MTBmLCAweDA4ZTY5ZGE4LCAweDFlYmNiOGEzLCANCisJMHgxZWJhZjhhMywgMHgwOGVjYTY4MSwgMHgwOGZlYmVmYiwgMHgxZWI1YjE4YSwgMHgxZWIzZWNjZCwgMHgwOTA0YzY3MywgMHgwOTE2ZGFjMiwgMHgxZWFlOTc3ZiwgDQorCTB4MWVhY2NlMDcsIDB4MDkxY2UwZDQsIDB4MDkyZWYwZWQsIDB4MWVhNzZhODcsIDB4MWVhNTljNTUsIDB4MDkzNGY1OTYsIDB4MDk0NzAxNmUsIDB4MWVhMDJhYTcsIA0KKwkweDFlOWU1N2JiLCAweDA5NGQwNGFhLCAweDA5NWYwYzM2LCAweDFlOThkN2UyLCAweDFlOTcwMDNlLCAweDA5NjUwZTAxLCAweDA5NzcxMTM2LCAweDFlOTE3MjNlLCANCisJMHgxZThmOTVlMywgMHgwOTdkMTE4ZCwgMHgwOThmMTA2MCwgMHgxZTg5ZjliZiwgMHgxZTg4MThhZCwgMHgwOTk1MGYzZiwgMHgwOWE3MDlhNCwgMHgxZTgyNmU2OSwgDQorCTB4MWU4MDg4YTIsIDB4MDlhZDA3MDcsIDB4MDliZWZjZjQsIDB4MWU3YWQwNDEsIDB4MWU3OGU1YzcsIDB4MDljNGY4ZDgsIDB4MDlkNmVhNDAsIDB4MWU3MzFmNGMsIA0KKwkweDFlNzEzMDFmLCAweDA5ZGNlNGExLCAweDA5ZWVkMTdiLCAweDFlNmI1YjhmLCAweDFlNjk2N2IxLCAweDA5ZjRjYTU2LCAweDBhMDZiMjk2LCAweDFlNjM4NTBlLCANCisJMHgxZTYxOGM4MCwgMHgwYTBjYTllNiwgMHgwYTFlOGQ4MSwgMHgxZTViOWJjZSwgMHgxZTU5OWU5MSwgMHgwYTI0ODM0MywgMHgwYTM2NjIyZSwgMHgxZTUzOWZkNCwgDQorCTB4MWU1MTlkZWEsIDB4MGEzYzU2NWUsIDB4MGE0ZTMwOGYsIDB4MWU0YjkxMjYsIDB4MWU0OThhOGUsIDB4MGE1NDIzMjksIDB4MGE2NWY4OTQsIDB4MWU0MzZmYzcsIA0KKwkweDFlNDE2NDg1LCAweDBhNmJlOTk1LCAweDBhN2RiYTJmLCAweDFlM2IzYmJkLCAweDFlMzkyYmQxLCAweDBhODNhOTkzLCAweDBhOTU3NTUxLCAweDFlMzJmNTBlLCANCisJMHgxZTMwZTA3OSwgMHgwYTliNjMxNSwgMHgwYWFkMjllYywgMHgxZTJhOWJiZCwgMHgxZTI4ODI4MSwgMHgwYWIzMTYwYywgMHgwYWM0ZDdmMSwgMHgxZTIyMmZkMSwgDQorCTB4MWUyMDExZWUsIDB4MGFjYWMyNmEsIDB4MGFkYzdmNTIsIDB4MWUxOWIxNGYsIDB4MWUxNzhlYzcsIDB4MGFlMjY4MWYsIDB4MGFmNDFmZmYsIDB4MWUxMTIwM2IsIA0KKwkweDFlMGVmOTEwLCAweDBhZmEwNzFkLCAweDBiMGJiOWViLCAweDFlMDg3YzliLCAweDFlMDY1MGNlLCAweDBiMTE5ZjU2LCAweDBiMjM0ZDA3LCAweDFkZmZjNjc0LCANCisJMHgxZGZkOTYwNiwgMHgwYjI5MzBiYiwgMHgwYjNhZDk0MywgMHgxZGY2ZmRjYywgMHgxZGY0YzhiZiwgMHgwYjQwYmIzZSwgMHgwYjUyNWU5MiwgMHgxZGVlMjJhOSwgDQorCTB4MWRlYmU4ZmQsIDB4MGI1ODNlY2YsIDB4MGI2OWRjZTYsIDB4MWRlNTM1MGYsIDB4MWRlMmY2YzYsIDB4MGI2ZmJiNjIsIDB4MGI4MTU0MmYsIDB4MWRkYzM1MDQsIA0KKwkweDFkZDlmMjIwLCAweDBiODczMGU2LCAweDBiOThjNDVmLCAweDFkZDMyMjhlLCAweDFkZDBkYjEwLCAweDBiOWU5ZjRkLCAweDBiYjAyZDY4LCAweDFkYzlmZGIyLCANCisJMHgxZGM3YjE5YiwgMHgwYmI2MDY4YSwgMHgwYmM3OGYzYiwgMHgxZGMwYzY3NiwgMHgxZGJlNzVjOCwgMHgwYmNkNjY4ZSwgMHgwYmRlZTljYSwgMHgxZGI3N2NkZiwgDQorCTB4MWRiNTI3OWMsIDB4MGJlNGJmNGEsIDB4MGJmNjNkMDcsIDB4MWRhZTIwZjQsIDB4MWRhYmM3MWQsIDB4MGJmYzEwYWYsIDB4MGMwZDg4ZTIsIDB4MWRhNGIyYmEsIA0KKwkweDFkYTI1NDUwLCAweDBjMTM1YWIwLCAweDBjMjRjZDRlLCAweDFkOWIzMjM3LCAweDFkOThjZjNiLCAweDBjMmE5ZDNlLCAweDBjM2MwYTNkLCAweDFkOTE5ZjcwLCANCisJMHgxZDhmMzdlNSwgMHgwYzQxZDg0YiwgMHgwYzUzM2ZhMCwgMHgxZDg3ZmE2ZCwgMHgxZDg1OGU1MywgMHgwYzU5MGJjOSwgMHgwYzZhNmQ2OCwgMHgxZDdlNDMzMiwgDQorCTB4MWQ3YmQyOGIsIDB4MGM3MDM3YTgsIDB4MGM4MTkzODgsIDB4MWQ3NDc5YzUsIDB4MWQ3MjA0OTMsIDB4MGM4NzViZGIsIDB4MGM5OGIxZjAsIDB4MWQ2YTllMmUsIA0KKwkweDFkNjgyNDcyLCAweDBjOWU3ODU0LCAweDBjYWZjODk0LCAweDFkNjBiMDcwLCAweDFkNWUzMjJjLCAweDBjYjU4ZDA0LCAweDBjYzZkNzY0LCAweDFkNTZiMDk0LCANCisJMHgxZDU0MmRjOSwgMHgwY2NjOTlkZSwgMHgwY2RkZGU1MywgMHgxZDRjOWU5ZiwgMHgxZDRhMTc0ZiwgMHgwY2UzOWVkMiwgMHgwY2Y0ZGQ1MiwgMHgxZDQyN2E5NywgDQorCTB4MWQzZmVlYzMsIDB4MGNmYTliZDIsIDB4MGQwYmQ0NTIsIDB4MWQzODQ0ODMsIDB4MWQzNWI0MmQsIDB4MGQxMTkwZDEsIDB4MGQyMmMzNDcsIDB4MWQyZGZjNjgsIA0KKwkweDFkMmI2NzkxLCAweDBkMjg3ZGMxLCAweDBkMzlhYTIxLCAweDFkMjNhMjRlLCAweDFkMjEwOGY4LCAweDBkM2Y2MjkyLCAweDBkNTA4OGQzLCAweDFkMTkzNjNhLCANCisJMHgxZDE2OTg2NywgMHgwZDU2M2YzOCwgMHgwZDY3NWY0ZSwgMHgxZDBlYjgzMywgMHgxZDBjMTVlNCwgMHgwZDZkMTNhMywgMHgwZDdlMmQ4NSwgMHgxZDA0MjgzZiwgDQorCTB4MWQwMTgxNzYsIDB4MGQ4M2RmYzYsIDB4MGQ5NGYzNjksIDB4MWNmOTg2NjYsIDB4MWNmNmRiMjQsIDB4MGQ5YWEzOTMsIDB4MGRhYmIwZWMsIDB4MWNlZWQyYWQsIA0KKwkweDFjZWMyMmY0LCAweDBkYjE1ZWZjLCAweDBkYzI2NjAwLCAweDFjZTQwZDFiLCAweDFjZTE1OGVkLCAweDBkYzgxMWYzLCAweDBkZDkxMjk4LCAweDFjZDkzNWI3LCANCisJMHgxY2Q2N2QxNSwgMHgwZGRlYmM2OSwgMHgwZGVmYjZhNSwgMHgxY2NlNGM4NywgMHgxY2NiOGY3NCwgMHgwZGY1NWU1MSwgMHgwZTA2NTIxOSwgMHgxY2MzNTE5MiwgDQorCTB4MWNjMDkwMGYsIDB4MGUwYmY3OWMsIDB4MGUxY2U0ZTYsIDB4MWNiODQ0ZGYsIDB4MWNiNTdlZWUsIDB4MGUyMjg4M2UsIDB4MGUzMzZlZmYsIDB4MWNhZDI2NzUsIA0KKwkweDFjYWE1YzE3LCAweDBlMzkxMDI3LCAweDBlNDlmMDU1LCAweDFjYTFmNjViLCAweDFjOWYyNzkyLCAweDBlNGY4ZjRiLCAweDBlNjA2OGRiLCAweDFjOTZiNDk3LCANCisJMHgxYzkzZTE2NSwgMHgwZTY2MDU5YSwgMHgwZTc2ZDg4MywgMHgxYzhiNjEzMSwgMHgxYzg4ODk5NywgMHgwZTdjNzMwOCwgMHgwZThkM2YzZSwgMHgxYzdmZmMyZiwgDQorCTB4MWM3ZDIwMmYsIDB4MGU5MmQ3ODcsIDB4MGVhMzlkMDAsIDB4MWM3NDg1OTksIDB4MWM3MWE1MzUsIDB4MGVhOTMzMDgsIDB4MGViOWYxYmEsIDB4MWM2OGZkNzUsIA0KKwkweDFjNjYxOGFlLCAweDBlYmY4NTdkLCAweDBlZDAzZDVlLCAweDFjNWQ2M2NhLCAweDFjNWE3YWE0LCAweDBlZDVjZWRhLCAweDBlZTY3ZmRmLCAweDFjNTFiOGExLCANCisJMHgxYzRlY2IxYywgMHgwZWVjMGYxMCwgMHgwZWZjYjkyZiwgMHgxYzQ1ZmMwMCwgMHgxYzQzMGExZCwgMHgwZjAyNDYxMiwgMHgwZjEyZTk0MSwgMHgxYzNhMmRlZCwgDQorCTB4MWMzNzM3YjAsIDB4MGYxODczZDIsIDB4MGYyOTEwMDYsIDB4MWMyZTRlNzIsIDB4MWMyYjUzZGIsIDB4MGYyZTk4NDIsIDB4MGYzZjJkNzEsIDB4MWMyMjVkOTQsIA0KKwkweDFjMWY1ZWE2LCAweDBmNDRiMzU0LCAweDBmNTU0MTc1LCAweDFjMTY1YjViLCAweDFjMTM1ODE4LCAweDBmNWFjNGZjLCAweDBmNmI0YzAzLCAweDFjMGE0N2NmLCANCisJMHgxYzA3NDAzOCwgMHgwZjcwY2QyYSwgMHgwZjgxNGQwZSwgMHgxYmZlMjJmOCwgMHgxYmZiMTcwZiwgMHgwZjg2Y2JkMywgMHgwZjk3NDQ4OSwgMHgxYmYxZWNkYiwgDQorCTB4MWJlZWRjYTIsIDB4MGY5Y2MwZTcsIDB4MGZhZDMyNjUsIDB4MWJlNWE1ODIsIDB4MWJlMjkwZmIsIDB4MGZiMmFjNWEsIDB4MGZjMzE2OTcsIDB4MWJkOTRjZjQsIA0KKwkweDFiZDYzNDIxLCAweDBmYzg4ZTFlLCAweDBmZDhmMTBmLCAweDFiY2NlMzM3LCAweDFiYzljNjFhLCAweDBmZGU2NjI2LCAweDBmZWVjMWMwLCAweDFiYzA2ODU1LCANCisJMHgxYmJkNDZmMCwgMHgwZmY0MzQ2NCwgMHgxMDA0ODg5ZSwgMHgxYmIzZGM1NSwgMHgxYmIwYjZhOSwgMHgxMDA5ZjhjYiwgMHgxMDFhNDU5YSwgMHgxYmE3M2YzZCwgDQorCTB4MWJhNDE1NGQsIDB4MTAxZmIzNGQsIDB4MTAyZmY4YTgsIDB4MWI5YTkxMTcsIDB4MWI5NzYyZTQsIDB4MTAzNTYzZGMsIDB4MTA0NWExYjksIDB4MWI4ZGQxZWEsIA0KKwkweDFiOGE5Zjc3LCAweDEwNGIwYTZjLCAweDEwNWI0MGMxLCAweDFiODEwMWJlLCAweDFiN2RjYjBjLCAweDEwNjBhNmVmLCAweDEwNzBkNWIxLCAweDFiNzQyMDliLCANCisJMHgxYjcwZTVhYywgMHgxMDc2Mzk1OCwgMHgxMDg2NjA3ZSwgMHgxYjY3MmU4OCwgMHgxYjYzZWY1ZiwgMHgxMDhiYzE5YSwgMHgxMDliZTExOSwgMHgxYjVhMmI4ZSwgDQorCTB4MWI1NmU4MmMsIDB4MTBhMTNmYTYsIDB4MTBiMTU3NzUsIDB4MWI0ZDE3YjQsIDB4MWI0OWQwMWMsIDB4MTBiNmIzNzEsIDB4MTBjNmMzODUsIDB4MWIzZmYzMDQsIA0KKwkweDFiM2NhNzM3LCAweDEwY2MxY2VjLCAweDEwZGMyNTNjLCAweDFiMzJiZDg0LCAweDFiMmY2ZDg1LCAweDEwZTE3YzBiLCAweDEwZjE3YzhkLCAweDFiMjU3NzNkLCANCisJMHgxYjIyMjMwZSwgMHgxMGY2ZDBjMCwgMHgxMTA2Yzk2YSwgMHgxYjE4MjAzOCwgMHgxYjE0YzdkYSwgMHgxMTBjMWFmZSwgMHgxMTFjMGJjNiwgMHgxYjBhYjg3YywgDQorCTB4MWIwNzViZjEsIDB4MTEyMTVhYjgsIDB4MTEzMTQzOTUsIDB4MWFmZDQwMTIsIDB4MWFmOWRmNWQsIDB4MTEzNjhmZTEsIDB4MTE0NjcwYzgsIDB4MWFlZmI3MDIsIA0KKwkweDFhZWM1MjI1LCAweDExNGJiYTZiLCAweDExNWI5MzU0LCAweDFhZTIxZDU0LCAweDFhZGViNDUxLCAweDExNjBkYTRiLCAweDExNzBhYjJhLCAweDFhZDQ3MzExLCANCisJMHgxYWQxMDVlOSwgMHgxMTc1ZWY3MiwgMHgxMTg1YjgzZiwgMHgxYWM2Yjg0MSwgMHgxYWMzNDZmOCwgMHgxMThhZjlkNCwgMHgxMTlhYmE4NCwgMHgxYWI4ZWNlYywgDQorCTB4MWFiNTc3ODQsIDB4MTE5ZmY5NjQsIDB4MTFhZmIxZWUsIDB4MWFhYjExMWMsIDB4MWFhNzk3OTYsIDB4MTFiNGVlMTQsIDB4MTFjNDllNmYsIDB4MWE5ZDI0ZDksIA0KKwkweDFhOTlhNzM3LCAweDExYzlkN2Q5LCAweDExZDk3ZmY5LCAweDFhOGYyODJiLCAweDFhOGJhNjcwLCAweDExZGViNmE0LCAweDExZWU1NjgyLCAweDFhODExYjFiLCANCisJMHgxYTdkOTU0OSwgMHgxMWYzOGE2YSwgMHgxMjAzMjFmYSwgMHgxYTcyZmRiMiwgMHgxYTZmNzNjYSwgMHgxMjA4NTMxYywgMHgxMjE3ZTI1NiwgMHgxYTY0Y2ZmOCwgDQorCTB4MWE2MTQxZmQsIDB4MTIxZDEwYWYsIDB4MTIyYzk3ODksIDB4MWE1NjkxZjUsIDB4MWE1MmZmZWIsIDB4MTIzMWMzMTYsIDB4MTI0MTQxODYsIDB4MWE0ODQzYjQsIA0KKwkweDFhNDRhZDliLCAweDEyNDY2YTQ0LCAweDEyNTVlMDQxLCAweDFhMzllNTNkLCAweDFhMzY0YjE3LCAweDEyNWIwNjJiLCAweDEyNmE3M2FjLCAweDFhMmI3Njk4LCANCisJMHgxYTI3ZDg2OCwgMHgxMjZmOTZjMSwgMHgxMjdlZmJiYiwgMHgxYTFjZjdjZSwgMHgxYTE5NTU5NywgMHgxMjg0MWJmNiwgMHgxMjkzNzg2MSwgMHgxYTBlNjhlOSwgDQorCTB4MWEwYWMyYWMsIDB4MTI5ODk1YzAsIDB4MTJhN2U5OTEsIDB4MTlmZmM5ZjEsIDB4MTlmYzFmYjEsIDB4MTJhZDA0MTIsIDB4MTJiYzRmNDAsIDB4MTlmMTFhZjAsIA0KKwkweDE5ZWQ2Y2FmLCAweDEyYzE2NmRlLCAweDEyZDBhOTYwLCAweDE5ZTI1YmVlLCAweDE5ZGVhOWFlLCAweDEyZDViZTE4LCAweDEyZTRmN2U1LCAweDE5ZDM4Y2Y0LCANCisJMHgxOWNmZDZiOCwgMHgxMmVhMDliNCwgMHgxMmY5M2FjMiwgMHgxOWM0YWUwYywgMHgxOWMwZjNkNiwgMHgxMmZlNDlhNiwgMHgxMzBkNzFlYiwgMHgxOWI1YmYzZiwgDQorCTB4MTliMjAxMTEsIDB4MTMxMjdkZTAsIDB4MTMyMTlkNTMsIDB4MTlhNmMwOTYsIDB4MTlhMmZlNzMsIDB4MTMyNmE2NTYsIDB4MTMzNWJjZWYsIDB4MTk5N2IyMWIsIA0KKwkweDE5OTNlYzA0LCAweDEzM2FjMmZjLCAweDEzNDlkMGIwLCAweDE5ODg5M2Q2LCAweDE5ODRjOWNlLCAweDEzNGVkM2M1LCAweDEzNWRkODhjLCAweDE5Nzk2NWQwLCANCisJMHgxOTc1OTdkYSwgMHgxMzYyZDhhNiwgMHgxMzcxZDQ3NiwgMHgxOTZhMjgxNSwgMHgxOTY2NTYzMiwgMHgxMzc2ZDE5MSwgMHgxMzg1YzQ2MSwgMHgxOTVhZGFhYiwgDQorCTB4MTk1NzA0ZGYsIDB4MTM4YWJlN2IsIDB4MTM5OWE4NDEsIDB4MTk0YjdkOWUsIDB4MTk0N2EzZWIsIDB4MTM5ZTlmNTYsIDB4MTNhZDgwMGEsIDB4MTkzYzEwZjcsIA0KKwkweDE5MzgzMzVlLCAweDEzYjI3NDE3LCAweDEzYzE0YmIwLCAweDE5MmM5NGJmLCAweDE5MjhiMzQzLCAweDEzYzYzY2IyLCAweDEzZDUwYjI2LCAweDE5MWQwOGZmLCANCisJMHgxOTE5MjNhMywgMHgxM2Q5ZjkxYiwgMHgxM2U4YmU2MCwgMHgxOTBkNmRjMSwgMHgxOTA5ODQ4OCwgMHgxM2VkYTk0NCwgMHgxM2ZjNjU1MywgMHgxOGZkYzMxMCwgDQorCTB4MThmOWQ1ZmEsIDB4MTQwMTRkMjMsIDB4MTQwZmZmZjEsIDB4MThlZTA4ZjQsIDB4MThlYTE4MDUsIDB4MTQxNGU0YWEsIDB4MTQyMzhlMmYsIDB4MThkZTNmNzcsIA0KKwkweDE4ZGE0YWIyLCAweDE0Mjg2ZmNlLCAweDE0MzcxMDAxLCAweDE4Y2U2NmEzLCAweDE4Y2E2ZTBhLCAweDE0M2JlZTgzLCAweDE0NGE4NTViLCAweDE4YmU3ZTgyLCANCisJMHgxOGJhODIxNywgMHgxNDRmNjBiZCwgMHgxNDVkZWUzMCwgMHgxOGFlODcxZSwgMHgxOGFhODZlMywgMHgxNDYyYzY3MCwgMHgxNDcxNGE3NiwgMHgxODllODA4MCwgDQorCTB4MTg5YTdjNzgsIDB4MTQ3NjFmOGYsIDB4MTQ4NDlhMWYsIDB4MTg4ZTZhYjIsIDB4MTg4YTYyZTAsIDB4MTQ4OTZjMGYsIDB4MTQ5N2RkMjAsIDB4MTg3ZTQ1YmUsIA0KKwkweDE4N2EzYTI1LCAweDE0OWNhYmU0LCAweDE0YWIxMzZkLCAweDE4NmUxMWFmLCAweDE4NmEwMjUwLCAweDE0YWZkZjAzLCAweDE0YmUzY2ZhLCAweDE4NWRjZThlLCANCisJMHgxODU5YmI2YywgMHgxNGMzMDU1ZSwgMHgxNGQxNTliYywgMHgxODRkN2M2NSwgMHgxODQ5NjU4MywgMHgxNGQ2MWVlYiwgMHgxNGU0NjlhNiwgMHgxODNkMWIzZSwgDQorCTB4MTgzOTAwOWUsIDB4MTRlOTJiOWUsIDB4MTRmNzZjYWQsIDB4MTgyY2FiMjQsIDB4MTgyODhjYzgsIDB4MTRmYzJiNmEsIDB4MTUwYTYyYzYsIDB4MTgxYzJjMjAsIA0KKwkweDE4MTgwYTBjLCAweDE1MGYxZTQ1LCAweDE1MWQ0YmUzLCAweDE4MGI5ZTNkLCAweDE4MDc3ODczLCAweDE1MjIwNDIyLCAweDE1MzAyN2ZiLCAweDE3ZmIwMTg1LCANCisJMHgxN2Y2ZDgwNywgMHgxNTM0ZGNmNiwgMHgxNTQyZjcwMCwgMHgxN2VhNTYwMiwgMHgxN2U2MjhkMywgMHgxNTQ3YThiNSwgMHgxNTU1YjhlOCwgMHgxN2Q5OWJiZSwgDQorCTB4MTdkNTZhZTAsIDB4MTU1YTY3NTQsIDB4MTU2ODZkYTcsIDB4MTdjOGQyYzQsIDB4MTdjNDllM2IsIDB4MTU2ZDE4YzcsIDB4MTU3YjE1MzIsIDB4MTdiN2ZiMWYsIA0KKwkweDE3YjNjMmVjLCAweDE1N2ZiZDAzLCAweDE1OGRhZjdjLCAweDE3YTcxNGQ3LCAweDE3YTJkOGZlLCAweDE1OTI1M2ZiLCAweDE1YTAzYzdhLCAweDE3OTYxZmY5LCANCisJMHgxNzkxZTA3YiwgMHgxNWE0ZGRhNSwgMHgxNWIyYmMyMiwgMHgxNzg1MWM4ZSwgMHgxNzgwZDk2ZiwgMHgxNWI3NTlmNSwgMHgxNWM1MmU2NywgMHgxNzc0MGFhMSwgDQorCTB4MTc2ZmMzZTMsIDB4MTVjOWM4ZTAsIDB4MTVkNzkzM2YsIDB4MTc2MmVhM2QsIDB4MTc1ZTlmZTIsIDB4MTVkYzJhNWEsIDB4MTVlOWVhOWQsIDB4MTc1MWJiNmIsIA0KKwkweDE3NGQ2ZDc3LCAweDE1ZWU3ZTU4LCAweDE1ZmMzNDc3LCAweDE3NDA3ZTM3LCAweDE3M2MyY2FjLCAweDE2MDBjNGNmLCAweDE2MGU3MGMxLCAweDE3MmYzMmFiLCANCisJMHgxNzJhZGQ4YywgMHgxNjEyZmRiMywgMHgxNjIwOWY3MCwgMHgxNzFkZDhkMiwgMHgxNzE5ODAyMSwgMHgxNjI1MjhmYSwgMHgxNjMyYzA3OCwgMHgxNzBjNzBiNywgDQorCTB4MTcwODE0NzcsIDB4MTYzNzQ2OTcsIDB4MTY0NGQzZDAsIDB4MTZmYWZhNjQsIDB4MTZmNjlhOTcsIDB4MTY0OTU2ODAsIDB4MTY1NmQ5NmEsIDB4MTZlOTc1ZTQsIA0KKwkweDE2ZTUxMjhlLCAweDE2NWI1OGFhLCAweDE2NjhkMTNlLCAweDE2ZDdlMzQxLCAweDE2ZDM3YzY1LCAweDE2NmQ0ZDBhLCAweDE2N2FiYjNlLCAweDE2YzY0Mjg4LCANCisJMHgxNmMxZDgyNywgMHgxNjdmMzM5NCwgMHgxNjhjOTc2MCwgMHgxNmI0OTNjMiwgMHgxNmIwMjVlMCwgMHgxNjkxMGMzZCwgMHgxNjllNjU5YSwgMHgxNmEyZDZmYg0KK307DQorDQorY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsNCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgCisJMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgCisKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAKKwkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAKKwkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAKKwkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDBmMTVhZTljLCAweDFjMzhiMmYyLCAKKwkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGZlNmUwOWExLCAweDFmZjYyMWUzLCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAKKwkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAKKwkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LCAKKwkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGZjZGQwYjI4LCAweDFmZDg4ZGE0LCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY2YjVmY2U5LCAweDFlOWY0MTU3LCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLCAKKwkweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGVlMzhjNGM2LCAweDFhOWI2NjI5LCAweGViYjMwY2RiLCAweDE4YmM4MDZiLCAKKwkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAKKwkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LCAweGUwZjU4MTA0LCAweGY4Mzk4MWExLCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU3NDM3Zjk1LCAweDE0NGNmMzI1LCAweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAKKwkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGU0OGQ3Y2JiLCAweGVmOGM3ODY3LCAweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGVhODI5NmNiLCAweGU4NGEyMGRlLCAKKwkweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUxNjBiZWE5LCAweDA5NGEwMzE3LCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMjc3MjVjLCAweDAzMjJmNGQ4LCAKKwkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAKKwkweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGYyNTE3N2ZiLCAweGUzMTI4NTBjLCAweGY2YjVmY2U5LCAweGUxNjBiZWE5LCAweGZiNGRmYmU0LCAweGUwNThhYTgxLCAKKworCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmZDg4NjEsIDB4MDBjOTBhYjAsIDB4MWZmNjIxZTMsIDB4MDE5MWY2NWYsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmZjYyMTcsIDB4MDA2NDg3NDgsIDB4MWZmZDg4NjEsIDB4MDBjOTBhYjAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksIAorCTB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWZjMjY0NzEsIDB4MDNlYWM5Y2IsIDB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY4NzY0ZmEsIDB4MDU3ODg1MTEsIAorCTB4MWZmNjIxZTMsIDB4MDE5MWY2NWYsIDB4MWZmMDk1NjYsIDB4MDFmNjU2ZTgsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZlMWNhZmQsIDB4MDJiZWRhMDEsIAorCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsIAorCTB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWYwYTdlZmMsIDB4MDdjNjdlNWYsIDB4MWVkNzQwZTcsIDB4MDg4OGU5MzEsIAorCTB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksIDB4MWZjMjY0NzEsIDB4MDNlYWM5Y2IsIDB4MWZiNTc5NzIsIDB4MDQ0ZTdjMzQsIAorCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsIAorCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU2Mjg4ZWMsIDB4MGEwOWFlNGEsIDB4MWUyMTIxMDUsIDB4MGFjN2NkM2IsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIAorCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY5N2Y5MjUsIDB4MDUxNTVkYWMsIDB4MWY4NzY0ZmEsIDB4MDU3ODg1MTEsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsIAorCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsIAorCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWQ0MTM0ZDEsIDB4MGNmN2JjYTIsIDB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWM5NTRiMjEsIDB4MGU2MzM3NGQsIAorCTB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWY0ZTYwM2IsIDB4MDZhMGE4MDksIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWYyMjUyZjcsIDB4MDc2NGQzZjksIAorCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsIAorCTB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWI3MjgzNDUsIDB4MTA3Mzg3OTksIDB4MWIwOTBhNTgsIDB4MTExZWIzNTQsIAorCTB4MWYwYTdlZmMsIDB4MDdjNjdlNWYsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsIDB4MWVkNzQwZTcsIDB4MDg4OGU5MzEsIDB4MWViYmQ4YzksIDB4MDhlOWEyMjAsIAorCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsIAorCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MWEyOWE3YTAsIDB4MTI2ZDA1NGQsIDB4MTliM2UwNDgsIDB4MTMwZmY3ZmQsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIAorCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU4MTdiYWIsIDB4MDlhYTA4NjEsIDB4MWU2Mjg4ZWMsIDB4MGEwOWFlNGEsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsIAorCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsIAorCTB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsIDB4MTgzYjBlMGMsIDB4MTRlNmNhYmMsIDB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTcyZDA4MzgsIDB4MTYxMGI3NTUsIAorCTB4MWUyMTIxMDUsIDB4MGFjN2NkM2IsIDB4MWRmZWFlNjIsIDB4MGIyNjNlZWYsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWRiNjUyNjIsIDB4MGJlMWQ0OTksIAorCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTU3ZDY5MzUsIDB4MTdiNWRmMjIsIDB4MTRlNmNhYmMsIDB4MTgzYjBlMGMsIAorCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsIDB4MWQ0MTM0ZDEsIDB4MGNmN2JjYTIsIDB4MWQxN2U3NzQsIDB4MGQ1MzY0MTYsIAorCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksIAorCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTNhZmZhMjksIDB4MTkzYTIyNGEsIDB4MTMwZmY3ZmQsIDB4MTliM2UwNDgsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIAorCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWNjMWYwZjQsIDB4MGUwOTI0ZWMsIDB4MWM5NTRiMjEsIDB4MGU2MzM3NGQsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsIAorCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsIAorCTB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MTExZWIzNTQsIDB4MWIwOTBhNTgsIDB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MGZjNWQyNmUsIDB4MWJkN2MwYWMsIAorCTB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWMwOGM0MjYsIDB4MGY2ZTBjYTksIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWJhNWFhNjcsIDB4MTAxY2ZjODcsIAorCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4ZmY5Yjc4YjgsIDB4MWZmZjYyMTcsIAorCTB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGRhZTg4MDUsIDB4MWNlZDdhZjQsIDB4MGNmN2JjYTIsIDB4MWQ0MTM0ZDEsIAorCTB4MWI3MjgzNDUsIDB4MTA3Mzg3OTksIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsIDB4MWIwOTBhNTgsIDB4MTExZWIzNTQsIDB4MWFkMmJjOWUsIDB4MTE3MzRkNjQsIAorCTB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsIDB4ZmQ0MTI1ZmYsIDB4MWZlMWNhZmQsIDB4ZmMxNTM2MzUsIDB4MWZjMjY0NzEsIDB4ZmFlYWEyNTQsIDB4MWY5N2Y5MjUsIAorCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGI4NDQyOTgsIDB4MWRkYjEzYjcsIDB4MGFjN2NkM2IsIDB4MWUyMTIxMDUsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIAorCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MWE2MzA5MWIsIDB4MTIxYTc5OTksIDB4MWEyOWE3YTAsIDB4MTI2ZDA1NGQsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsIAorCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4Zjg5YjJjMDcsIDB4MWYyMjUyZjcsIDB4Zjc3NzE2Y2YsIDB4MWVkNzQwZTcsIDB4ZjY1NWY3OWYsIDB4MWU4MTdiYWIsIAorCTB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDg4OGU5MzEsIDB4MWVkNzQwZTcsIDB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDcwMmUwOWIsIDB4MWYzOGYzYWMsIAorCTB4MTliM2UwNDgsIDB4MTMwZmY3ZmQsIDB4MTk3NzdlZjUsIDB4MTM2MDU4YjEsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MThmYmNjYTQsIDB4MTNmZWQ5NTMsIAorCTB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjQxZTJiNjcsIDB4MWRiNjUyNjIsIDB4ZjMwODQzNWUsIDB4MWQ0MTM0ZDEsIDB4ZjFmNmRiMTQsIDB4MWNjMWYwZjQsIAorCTB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDRiMjA0MWMsIDB4MWZhNzU1N2YsIDB4MDNlYWM5Y2IsIDB4MWZjMjY0NzEsIAorCTB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsIDB4MTgzYjBlMGMsIDB4MTRlNmNhYmMsIDB4MTdmOGVjZTMsIDB4MTUzMjgyOTMsIAorCTB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWZlMzAzNzksIDB4MWJhNWFhNjcsIDB4ZWVlMTRjYWMsIDB4MWIwOTBhNTgsIDB4ZWRlNTg2NjcsIDB4MWE2MzA5MWIsIAorCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDI1YWE0MTIsIDB4MWZlOWNkYWQsIDB4MDE5MWY2NWYsIDB4MWZmNjIxZTMsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIAorCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTc3MWU3NWYsIDB4MTVjNzdiYmUsIDB4MTcyZDA4MzgsIDB4MTYxMGI3NTUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsIAorCTB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsIDB4ZWMwMTI2YWQsIDB4MThmYmNjYTQsIDB4ZWIxOTM1NDQsIDB4MTgzYjBlMGMsIDB4ZWEzODg0NDIsIDB4MTc3MWU3NWYsIAorCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZmYzNmY1NTAsIDB4MWZmZDg4NjEsIDB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsIDB4ZmRhNTViZWUsIDB4MWZlOWNkYWQsIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTY1OTE5MjYsIDB4MTZlNzQ0NTUsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTVjNzdiYmUsIDB4MTc3MWU3NWYsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTg4ZTE4YTEsIDB4MTVjNzdiYmUsIDB4ZTdjNGYxZjQsIDB4MTRlNmNhYmMsIDB4ZTcwNDMzNWMsIDB4MTNmZWQ5NTMsIAorCTB4ZmNkZDBiMjgsIDB4MWZkODhkYTQsIDB4ZmMxNTM2MzUsIDB4MWZjMjY0NzEsIDB4ZmI0ZGZiZTQsIDB4MWZhNzU1N2YsIDB4ZmE4NzdhZWYsIDB4MWY4NzY0ZmEsIAorCTB4MTU3ZDY5MzUsIDB4MTdiNWRmMjIsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsIDB4MTRlNmNhYmMsIDB4MTgzYjBlMGMsIDB4MTQ5YTQ0OWMsIDB4MTg3YzQwMTAsIAorCTB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTU5Y2Y2ZTUsIDB4MTIxYTc5OTksIDB4ZTRmNmY1YTgsIDB4MTExZWIzNTQsIDB4ZTQ1YTU1OTksIDB4MTAxY2ZjODcsIAorCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjhmZDFmNjUsIDB4MWYzOGYzYWMsIDB4ZjgzOTgxYTEsIDB4MWYwYTdlZmMsIDB4Zjc3NzE2Y2YsIDB4MWVkNzQwZTcsIAorCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTNmZWQ5NTMsIDB4MThmYmNjYTQsIDB4MTNhZmZhMjksIDB4MTkzYTIyNGEsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsIAorCTB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTMzZTBmMGMsIDB4MGUwOTI0ZWMsIDB4ZTJiZWNiMmYsIDB4MGNmN2JjYTIsIDB4ZTI0OWFkOWUsIDB4MGJlMWQ0OTksIAorCTB4ZjZiNWZjZTksIDB4MWU5ZjQxNTcsIDB4ZjVmNjUxYjYsIDB4MWU2Mjg4ZWMsIDB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjQ3YmJkNjgsIDB4MWRkYjEzYjcsIAorCTB4MTMwZmY3ZmQsIDB4MTliM2UwNDgsIDB4MTJiZWRiMjYsIDB4MTllZjQzZWYsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTIxYTc5OTksIDB4MWE2MzA5MWIsIAorCTB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsIDB4ZTE3ZTg0NTUsIDB4MDlhYTA4NjEsIDB4ZTEyOGJmMTksIDB4MDg4OGU5MzEsIDB4ZTBkZGFkMDksIDB4MDc2NGQzZjksIAorCTB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZjMwODQzNWUsIDB4MWQ0MTM0ZDEsIDB4ZjI1MTc3ZmIsIDB4MWNlZDdhZjQsIDB4ZjE5Y2M4YjMsIDB4MWM5NTRiMjEsIAorCTB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsIDB4MTExZWIzNTQsIDB4MWIwOTBhNTgsIDB4MTBjOTcwNGQsIDB4MWIzZTRkM2YsIAorCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTA2ODA2ZGIsIDB4MDUxNTVkYWMsIDB4ZTAzZDliOGYsIDB4MDNlYWM5Y2IsIDB4ZTAxZTM1MDMsIDB4MDJiZWRhMDEsIAorCTB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZjAzYTJkOTIsIDB4MWJkN2MwYWMsIDB4ZWY4Yzc4NjcsIDB4MWI3MjgzNDUsIDB4ZWVlMTRjYWMsIDB4MWIwOTBhNTgsIAorCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MTAxY2ZjODcsIDB4MWJhNWFhNjcsIDB4MGZjNWQyNmUsIDB4MWJkN2MwYWMsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsIAorCTB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAwMDlkZTksIDB4MDA2NDg3NDgsIDB4ZTAwMjc3OWYsIDB4ZmYzNmY1NTAsIDB4ZTAwZjZhOWEsIDB4ZmUwOWE5MTgsIAorCTB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksIDB4ZWQ5MmZhYjMsIDB4MWEyOWE3YTAsIDB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsIDB4ZWM1MDA1ZDcsIDB4MTkzYTIyNGEsIAorCTB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsIDB4MGViY2JiYWUsIDB4MWM2NzhiMzUsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGUwOTI0ZWMsIDB4MWNjMWYwZjQsIAorCTB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIDB4ZTA0YTg2OGUsIDB4ZmJiMTgzY2MsIDB4ZTA3ODliMDYsIDB4ZmE4NzdhZWYsIDB4ZTBiMTlmYzUsIDB4Zjk1ZjU3ZjcsIAorCTB4ZWJiMzBjZGIsIDB4MThiYzgwNmIsIDB4ZWIxOTM1NDQsIDB4MTgzYjBlMGMsIDB4ZWE4Mjk2Y2IsIDB4MTdiNWRmMjIsIDB4ZTllZjQ4YWIsIDB4MTcyZDA4MzgsIAorCTB4MGRhZTg4MDUsIDB4MWNlZDdhZjQsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsIDB4MGNmN2JjYTIsIDB4MWQ0MTM0ZDEsIDB4MGM5Yjk1MzIsIDB4MWQ2OTYxNzQsIAorCTB4ZTBmNTgxMDQsIDB4ZjgzOTgxYTEsIDB4ZTE0NDI3MzcsIDB4ZjcxNjVkZTAsIDB4ZTE5ZDc3MTQsIDB4ZjVmNjUxYjYsIDB4ZTIwMTUxOWUsIDB4ZjRkOWMxMTEsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZThkMmY3YzgsIDB4MTYxMGI3NTUsIDB4ZTg0YTIwZGUsIDB4MTU3ZDY5MzUsIDB4ZTdjNGYxZjQsIDB4MTRlNmNhYmMsIAorCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGJlMWQ0OTksIDB4MWRiNjUyNjIsIDB4MGI4NDQyOTgsIDB4MWRkYjEzYjcsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsIAorCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTJlODE4OGMsIDB4ZjJhYzliZWEsIDB4ZTM2YWI0ZGYsIDB4ZjE5Y2M4YjMsIDB4ZTNmNzNiZGEsIDB4ZjA5MWYzNTcsIAorCTB4ZTc0MzdmOTUsIDB4MTQ0Y2YzMjUsIDB4ZTZjNWRkYjYsIDB4MTNhZmZhMjksIDB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTVkNjU4NjAsIDB4MTI2ZDA1NGQsIAorCTB4MGFjN2NkM2IsIDB4MWUyMTIxMDUsIDB4MGE2OGYxMjEsIDB4MWU0MjZhNGIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDlhYTA4NjEsIDB4MWU4MTdiYWIsIAorCTB4ZTQ4ZDdjYmIsIDB4ZWY4Yzc4NjcsIDB4ZTUyZDQzNjIsIDB4ZWU4Y2IyOWMsIDB4ZTVkNjU4NjAsIDB4ZWQ5MmZhYjMsIDB4ZTY4ODgxMGIsIDB4ZWM5ZmE3NGYsIAorCTB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTRmNmY1YTgsIDB4MTExZWIzNTQsIDB4ZTQ4ZDdjYmIsIDB4MTA3Mzg3OTksIDB4ZTQyODNmNTQsIDB4MGZjNWQyNmUsIAorCTB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksIDB4MDg4OGU5MzEsIDB4MWVkNzQwZTcsIDB4MDgyN2RjMDcsIDB4MWVmMTc4YTQsIAorCTB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZTgwNzEzMWQsIDB4ZWFjZDdkNmQsIDB4ZThkMmY3YzgsIDB4ZTllZjQ4YWIsIDB4ZTlhNmU2ZGEsIDB4ZTkxOGJiYWIsIAorCTB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTM2YWI0ZGYsIDB4MGU2MzM3NGQsIDB4ZTMxMjg1MGMsIDB4MGRhZTg4MDUsIDB4ZTJiZWNiMmYsIDB4MGNmN2JjYTIsIAorCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDc2NGQzZjksIDB4MWYyMjUyZjcsIDB4MDcwMmUwOWIsIDB4MWYzOGYzYWMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsIAorCTB4ZWE4Mjk2Y2IsIDB4ZTg0YTIwZGUsIDB4ZWI2NWJiNjQsIDB4ZTc4M2JmZjAsIDB4ZWM1MDA1ZDcsIDB4ZTZjNWRkYjYsIDB4ZWQ0MTI0ZGEsIDB4ZTYxMGJjMTEsIAorCTB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTIyNGVjNDksIDB4MGI4NDQyOTgsIDB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsIDB4ZTE5ZDc3MTQsIDB4MGEwOWFlNGEsIAorCTB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDVkYjc2NzgsIDB4MWY3NTk5YTQsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDUxNTVkYWMsIDB4MWY5N2Y5MjUsIAorCTB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZWYzNjhmYjMsIDB4ZTRjMWIyYzEsIDB4ZjAzYTJkOTIsIDB4ZTQyODNmNTQsIDB4ZjE0MzQ0NTIsIDB4ZTM5ODc0Y2IsIAorCTB4ZTE2MGJlYTksIDB4MDk0YTAzMTcsIDB4ZTEyOGJmMTksIDB4MDg4OGU5MzEsIDB4ZTBmNTgxMDQsIDB4MDdjNjdlNWYsIDB4ZTBjNzBjNTQsIDB4MDcwMmUwOWIsIAorCTB4MDRiMjA0MWMsIDB4MWZhNzU1N2YsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsIDB4MDNlYWM5Y2IsIDB4MWZjMjY0NzEsIDB4MDM4NmYwYjksIDB4MWZjZTE1ZmQsIAorCTB4ZjI1MTc3ZmIsIDB4ZTMxMjg1MGMsIDB4ZjM2NDZhY2UsIDB4ZTI5NjllOGMsIDB4ZjQ3YmJkNjgsIDB4ZTIyNGVjNDksIDB4ZjU5NzBlZGYsIDB4ZTFiZDk1YjUsIAorCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTA3ODliMDYsIDB4MDU3ODg1MTEsIDB4ZTA1OGFhODEsIDB4MDRiMjA0MWMsIDB4ZTAzZDliOGYsIDB4MDNlYWM5Y2IsIAorCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDJiZWRhMDEsIDB4MWZlMWNhZmQsIDB4MDI1YWE0MTIsIDB4MWZlOWNkYWQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsIAorCTB4ZjZiNWZjZTksIDB4ZTE2MGJlYTksIDB4ZjdkODIzZjksIDB4ZTEwZTg3NWMsIDB4ZjhmZDFmNjUsIDB4ZTBjNzBjNTQsIDB4ZmEyNDg5ODgsIDB4ZTA4YTY2NWMsIAorCTB4ZTAyNzcyNWMsIDB4MDMyMmY0ZDgsIDB4ZTAxNjMyNTMsIDB4MDI1YWE0MTIsIDB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAwMjc3OWYsIDB4MDBjOTBhYjAsIAorCTB4MDE5MWY2NWYsIDB4MWZmNjIxZTMsIDB4MDEyZDg2NTcsIDB4MWZmYTcyZjAsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4MDA2NDg3NDgsIDB4MWZmZjYyMTcsIAorCTB4ZmI0ZGZiZTQsIDB4ZTA1OGFhODEsIDB4ZmM3OTBmNDcsIDB4ZTAzMWVhMDMsIDB4ZmRhNTViZWUsIDB4ZTAxNjMyNTMsIDB4ZmVkMjc5YTksIDB4ZTAwNThkMTANCit9Ow0KKw0KK2NvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7DQorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIAorCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgCisJMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgCisJMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOQ0KK307DQorDQorI2Vsc2UKKworLyogDQorICogIFEzMCBmb3IgMTI4IGFuZCAxMDI0IA0KKyAqDQorICogZm9yIChpID0gMDsgaSA8IG51bS80OyBpKyspIHsNCisgKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiANCisgKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiB9DQorICovDQorY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsNCisJLyogMTI4ICovDQorCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsIA0KKwkweDNmZTliOGE5LCAweDAzNTYyMDM4LCAweDA0ODMyNTlkLCAweDNmZDczYTRhLCAweDNmY2ZkNTBiLCAweDA0ZTc2N2M1LCAweDA2MTNlMWM1LCAweDNmYjVmNGVhLCANCisJMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwgDQorCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsIA0KKwkweDNlYmI0ZGRiLCAweDBjYWRhNGY1LCAweDBkZDRiMTlhLCAweDNlN2NkNzc4LCAweDNlNjZkMGI0LCAweDBlMzZjODJhLCAweDBmNWMzNWEzLCAweDNlMjEyMTc5LCANCisJMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwgDQorCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsIA0KKwkweDNjMzE0MDYwLCAweDE1YmVlNzhjLCAweDE2ZDk5ODY0LCAweDNiYzgyYzFmLCAweDNiYTNmZGU3LCAweDE3Mzc2M2M5LCAweDE4NGY2YWFiLCAweDNiMzQwMWJiLCANCisJMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwgDQorCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsIA0KKwkweDM4NTlhMjkyLCAweDFlNTdhODZkLCAweDFmNWZkZWU2LCAweDM3YzgzNmMyLCAweDM3OTZhOTk2LCAweDFmYjc1NzVjLCAweDIwYmJlN2Q4LCAweDM2ZmVjZDBlLCANCisJMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwgDQorCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsIA0KKwkweDMzNDliZjQ4LCAweDI2NDg0M2Q5LCAweDI3Mzg0N2M4LCAweDMyOTMyMWM3LCAweDMyNTU0ODQwLCAweDI3ODc4ODkzLCAweDI4NzJmZWI2LCAweDMxOThkNGVhLCANCisJMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwgDQorCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsIA0KKwkvKiAxMDI0ICovDQorCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsIA0KKwkweDNmZmZhNmRlLCAweDAwNmFkMDNiLCAweDAwOTA4MmVhLCAweDNmZmY1Y2Q4LCAweDNmZmYzZjNjLCAweDAwOWQxM2M1LCAweDAwYzJjNjJmLCAweDNmZmVkNzliLCANCisJMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwgDQorCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsIA0KKwkweDNmZmFlOGY5LCAweDAxOTg1ZDYwLCAweDAxYmUwZDExLCAweDNmZjllZDUzLCAweDNmZjk5NDgzLCAweDAxY2E5Y2Q0LCAweDAxZjA0YmI0LCAweDNmZjg3YjQ0LCANCisJMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwgDQorCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsIA0KKwkweDNmZjA5ZTU2LCAweDAyYzVjNzFhLCAweDAyZWI3MDg2LCAweDNmZWVmMTI2LCAweDNmZWU1ZDI4LCAweDAyZjdmZTFjLCAweDAzMWRhNjJiLCAweDNmZWM5MjY1LCANCisJMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwgDQorCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsIA0KKwkweDNmZTBjN2RhLCAweDAzZjJmMzQyLCAweDA0MTg5MzI2LCAweDNmZGU2OTQ1LCAweDNmZGQ5YTI3LCAweDA0MjUxZDc3LCAweDA0NGFiYjczLCAweDNmZGIxZTA2LCANCisJMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwgDQorCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsIA0KKwkweDNmY2I2NmU0LCAweDA1MWZjN2I5LCAweDA1NDU1YWQxLCAweDNmYzg1NzFmLCAweDNmYzc0Y2YzLCAweDA1NTFlMGM3LCAweDA1Nzc3MTZiLCAweDNmYzQxZmFjLCANCisJMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywgDQorCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsIA0KKwkweDNmYjA3ZDUwLCAweDA2NGMyYTY3LCAweDA2NzFhZDcxLCAweDNmYWNiYzlmLCAweDNmYWI3NzdiLCAweDA2N2UyZGY1LCAweDA2YTNhZTAwLCAweDNmYTc5OTU0LCANCisJMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywgDQorCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsIA0KKwkweDNmOTAwZDcyLCAweDA3NzgwMTNkLCAweDA3OWQ3MGY3LCAweDNmOGI5YzI4LCAweDNmOGExYzI5LCAweDA3YTllYWY1LCAweDA3Y2Y1NzI2LCAweDNmODU4ZDc5LCANCisJMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwgDQorCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsIA0KKwkweDNmNmExYTFjLCAweDA4YTMzMjNhLCAweDA4Yzg4YjY1LCAweDNmNjRmODliLCAweDNmNjMzZGUyLCAweDA4ZDRmZGM2LCAweDA4ZmE1MmRlLCAweDNmNWRmZjBlLCANCisJMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwgDQorCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsIA0KKwkweDNmM2VhNjk3LCAweDA5Y2RhMzY4LCAweDA5ZjJlMmM3LCAweDNmMzhkNTUyLCAweDNmMzZlMDA2LCAweDA5ZmY0Yzc4LCAweDBhMjQ4NzNhLCAweDNmMzBmMTgxLCANCisJMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwgDQorCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsIA0KKwkweDNmMGRiNmE5LCAweDBhZjczYWU1LCAweDBiMWM1ZDNkLCAweDNmMDczNjIxLCAweDNmMDUwNjZkLCAweDBiMjhiZDJhLCAweDBiNGRkYTVjLCAweDNlZmU2OGJjLCANCisJMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwgDQorCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsIA0KKwkweDNlZDc0ZTkxLCAweDBjMWZkZWUxLCAweDBjNDRlMGY5LCAweDNlZDAxZjU1LCAweDNlY2RiNTZhLCAweDBjNTEzNjEwLCAweDBjNzYzMjc4LCAweDNlYzY2OTIwLCANCisJMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwgDQorCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsIA0KKwkweDNlOWI3MzA2LCAweDBkNDc3NWExLCAweDBkNmM1NDQzLCAweDNlOTM5NWI3LCAweDNlOTBmMWNhLCAweDBkNzg5ZDcxLCAweDBkOWQ3NWRiLCAweDNlODhmNzg4LCANCisJMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwgDQorCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsIA0KKwkweDNlNWEyOTM5LCAweDBlNmRlNTgwLCAweDBlOTI5ZDdhLCAweDNlNTE5ZTg2LCAweDNlNGVjMGQxLCAweDBlOWVkOWFmLCAweDBlYzM4YWU4LCAweDNlNDYxOTRhLCANCisJMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywgDQorCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsIA0KKwkweDNlMTM3NmQ1LCAweDBmOTMxNGY1LCAweDBmYjdhMzE3LCAweDNlMGEzZjdiLCAweDNlMDcyODNmLCAweDBmYzNkMTQzLCAweDBmZTg1ODFkLCAweDNkZmRkNDMyLCANCisJMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwgDQorCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsIA0KKwkweDNkYzc2MWZjLCAweDEwYjZlYTkwLCAweDEwZGI0YmFmLCAweDNkYmQ3ZWM3LCAweDNkYmEyZTQ4LCAweDEwZTc2YWMzLCAweDExMGJjNDEzLCAweDNkYjAyZTg0LCANCisJMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwgDQorCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsIA0KKwkweDNkNzVmMTQ3LCAweDExZDk0ZDAyLCAweDExZmQ3ZGY2LCAweDNkNmI2MzEzLCAweDNkNjdkOTliLCAweDEyMDk4Y2U1LCAweDEyMmRiNTgzLCAweDNkNWQyZWZlLCANCisJMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwgDQorCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsIA0KKwkweDNkMWYyYmM1LCAweDEyZmEyMzFiLCAweDEzMWUyMGMwLCAweDNkMTNmMzdlLCAweDNkMTAzMTVhLCAweDEzMmExZTdlLCAweDEzNGUxMzQ4LCAweDNkMDRkY2QyLCANCisJMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwgDQorCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsIA0KKwkweDNjYzMxOGZmLCAweDE0MTk1M2NiLCAweDE0M2QxYjAyLCAweDNjYjczNzljLCAweDNjYjMzZDIyLCAweDE0NDkwNjg1LCAweDE0NmNjNDVjLCAweDNjYTczZmE5LCANCisJMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwgDQorCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsIA0KKwkweDNjNjFjMGYxLCAweDE1MzZjNjJiLCAweDE1NWE1M2Q5LCAweDNjNTUzNzdiLCAweDNjNTEwNTAxLCAweDE1NjYyYzE4LCAweDE1ODlhZmUzLCAweDNjNDQ1ZmEyLCANCisJMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwgDQorCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsIA0KKwkweDNiZmIyYzBjLCAweDE2NTI2MTc2LCAweDE2NzViMjg2LCAweDNiZWRmYjk5LCAweDNiZTk5MTdlLCAweDE2ODE3NjdjLCAweDE2YTRiZDI1LCAweDNiZGM0NTUyLCANCisJMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwgDQorCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsIA0KKwkweDNiOGY2MzM3LCAweDE3NmMwZDE1LCAweDE3OGYxZTc2LCAweDNiODE4Y2ViLCAweDNiN2NlYjkwLCAweDE3OWFjZDFjLCAweDE3YmRkMzk0LCAweDNiNmVmOWJlLCANCisJMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwgDQorCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsIA0KKwkweDNiMWU2ZmNhLCAweDE4ODNiMDk3LCAweDE4YTY3ZjNmLCAweDNiMGZmNGQ5LCAweDNiMGIxY2E2LCAweDE4YjIxNzkxLCAweDE4ZDRkYWQwLCAweDNhZmM4NjYzLCANCisJMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwgDQorCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksIA0KKwkweDNhYTg1YjkyLCAweDE5OTkzM2JiLCAweDE5YmJiY2E2LCAweDNhOTkzZDNlLCAweDNhOTQyZTlkLCAweDE5YzczZGEzLCAweDE5ZTliYWEzLCAweDNhODRmNTJmLCANCisJMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwgDQorCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsIA0KKwkweDNhMmQzMGNkLCAweDFhYWM3ZTZmLCAweDFhY2ViZTlkLCAweDNhMWQ3MDY2LCAweDNhMTgyYmM4LCAweDFhZGEyNzQ2LCAweDFhZmM1YjBhLCAweDNhMDg1MDdmLCANCisJMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwgDQorCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsIA0KKwkweDM5YWNmYTJiLCAweDFiYmQ3OGQyLCAweDFiZGY2ZDRhLCAweDM5OWM5OTBkLCAweDM5OTcxZWU3LCAweDFiZWFiY2ExLCAweDFjMGNhNDMyLCAweDM5ODZhMzI0LCANCisJMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwgDQorCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsIA0KKwkweDM5MjdjMmM5LCAweDFjY2MwYjM1LCAweDFjZWRiMTA2LCAweDM5MTZjMjYyLCAweDM5MTExMzJkLCAweDFjZjhlNjExLCAweDFkMWE3ZTdkLCAweDM4ZmZmODVlLCANCisJMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwgDQorCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsIA0KKwkweDM4OWQ5NjM3LCAweDFkZDgxZTIxLCAweDFkZjk3MjVmLCAweDM4OGJmN2ZmLCAweDM4ODYxNDNiLCAweDFlMDQ4YzI0LCAweDFlMjVkMjgyLCAweDM4NzQ1YmRiLCANCisJMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwgDQorCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsIA0KKwkweDM4MGU4MDcxLCAweDFlZTE5YTU0LCAweDFmMDI5YTFjLCAweDM3ZmM0NWVmLCAweDM3ZjYyZTFkLCAweDFmMGQ5N2E1LCAweDFmMmU4OTExLCAweDM3ZTNkOWI3LCANCisJMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywgDQorCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsIA0KKwkweDM3N2E4ZGRmLCAweDFmZTg2OGM4LCAweDIwMDkxMTNjLCAweDM3NjdiOGE5LCAweDM3NjE2ZDUxLCAweDIwMTNmMTk2LCAweDIwMzQ4YjM1LCAweDM3NGU3ZTdiLCANCisJMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwgDQorCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsIA0KKwkweDM2ZTFjYjU4LCAweDIwZWM3MmIxLCAweDIxMGNjMGZjLCAweDM2Y2U1ZDEwLCAweDM2YzdkZWJkLCAweDIxMTc4MzM0LCAweDIxMzdjMjMyLCAweDM2YjQ1NzFiLCANCisJMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwgDQorCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsIA0KKwkweDM2NDQ0NjFiLCAweDIxZWRhMTdmLCAweDIyMGQ5MmQ0LCAweDM2MzA0MDcwLCAweDM2Mjk4ZmI0LCAweDIyMTgzNWZiLCAweDIyMzgxNzhkLCAweDM2MTU3MGY4LCANCisJMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywgDQorCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsIA0KKwkweDM1YTIwYmQzLCAweDIyZWJkZWU1LCAweDIzMGI3MDdlLCAweDM1OGQ3MDgxLCAweDM1ODY4ZGVmLCAweDIzMTVmM2E4LCAweDIzMzU3NTA5LCAweDM1NzFkOWQ5LCANCisJMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwgDQorCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsIA0KKwkweDM0ZmIyYTkyLCAweDIzZTcxNGQzLCAweDI0MDY0M2Y0LCAweDM0ZTVmYjYzLCAweDM0ZGVlNzk1LCAweDI0MTBhNjM5LCAweDI0MmZjNGFkLCAweDM0Yzk5ZmVmLCANCisJMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwgDQorCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsIA0KKwkweDM0NGZiMGQxLCAweDI0ZGYyZDgxLCAweDI0ZmRmNzc1LCAweDM0MzllZjljLCAweDM0MzJhYjJlLCAweDI1MDgzN2VkLCAweDI1MjZmMGMxLCAweDM0MWNkMWQyLCANCisJMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwgDQorCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsIA0KKwkweDMzOWZhZDcwLCAweDI1ZDQxMzY5LCAweDI1ZjI3NTg0LCAweDMzODk1YzE4LCAweDMzODFlN2FjLCAweDI1ZmM5MzRiLCAweDI2MWFlM2Q2LCAweDMzNmI3ZTdlLCANCisJMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwgDQorCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsIA0KKwkweDMyZWIyZmI1LCAweDI2YzViMTRjLCAweDI2ZTNhOGVjLCAweDMyZDQ1MDI5LCAweDMyY2NhYzY0LCAweDI2ZWRhMzIyLCAweDI3MGI4OGMyLCAweDMyYjViNTU3LCANCisJMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwgDQorCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsIA0KKwkweDMyMzI0NzQ2LCAweDI3YjNmMjM1LCAweDI3ZDE3Y2MxLCAweDMyMWFkYjgzLCAweDMyMTMwOTBmLCAweDI3ZGI1Mjg4LCAweDI3ZjhjYWE1LCAweDMxZmI4NjIwLCANCisJMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwgDQorCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsIA0KKwkweDMxNzUwNDJlLCAweDI4OWVjMTdhLCAweDI4YmJkYzYxLCAweDMxNWQwZTNiLCAweDMxNTUwZGM2LCAweDI4YzU4Y2RmLCAweDI4ZTI5NGViLCAweDMxM2QwMGZmLCANCisJMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwgDQorCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsIA0KKwkweDMwYjM3NmQ4LCAweDI5ODYwYWJkLCAweDI5YTJiMzc4LCAweDMwOWFmOGNhLCAweDMwOTJjYjA1LCAweDI5YWMzZGQ3LCAweDI5YzhkMzRkLCAweDMwN2EzNjdjLCANCisJMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwgDQorCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsIA0KKwkweDJmZWRiMDBkLCAweDJhNjliOWVjLCAweDJhODVlZTAwLCAweDJmZDRhYzA0LCAweDJmY2M1MWE1LCAweDJhOGY1MTZiLCAweDJhYWI3MWQwLCAweDJmYjMzNzdjLCANCisJMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwgDQorCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsIA0KKwkweDJmMjNjMGY2LCAweDJiNDliYjRhLCAweDJiNjU3ODQ0LCAweDJmMGEzOTFkLCAweDJmMDFiMmRlLCAweDJiNmViM2VhLCAweDJiOGE1Y2NlLCAweDJlZTgxNTQzLCANCisJMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwgDQorCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsIA0KKwkweDJlNTViYjE3LCAweDJjMjVmYjY2LCAweDJjNDEzZWRmLCAweDJlM2JiMWE0LCAweDJlMzMwMDQyLCAweDJjNGE1MWYzLCAweDJjNjU4MGYxLCAweDJlMThlMTZkLCANCisJMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywgDQorCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsIA0KKwkweDJkODNiMDRmLCAweDJjZmU2NzI4LCAweDJkMTkyZWMxLCAweDJkNjkyNzg0LCAweDJkNjA0YmMwLCAweDJkMjIxODdhLCAweDJkM2NjYjM0LCAweDJkNDVhZGY2DQorfTsKKworY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsNCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgDQorCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIA0KKwkweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCANCisJMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgDQorCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIA0KKwkweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGM0ZGYyODYyLCAweDE4N2RlMmE2LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweGRjNzE4OThkLCAweGNhYzkzM2FlLCANCisNCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgDQorCTB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIA0KKwkweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCANCisJMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgDQorCTB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIA0KKwkweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCANCisJMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgDQorCTB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIA0KKwkweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCANCisJMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgDQorCTB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIA0KKwkweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCANCisJMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywgDQorCTB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIA0KKwkweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweGVkNmJmOWQyLCAweDNkM2U4MmFkLCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCANCisJMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgDQorCTB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIA0KKwkweGMwNGVlNGI5LCAweGY5YmExNjUxLCAweGQ3NjYxOWI2LCAweDMxNzkwMGQ2LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweGMxZWIwMjA5LCAweGYwNzMwMzQzLCANCisJMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwgDQorCTB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4YzkxYWY5NzYsIDB4ZGYxOGYwY2UsIDB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIA0KKwkweGNlODZmZjJhLCAweGQ3NjYxOWI2LCAweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweGQ1MDUyZDk3LCAweGQwOTQ0MWJjLCANCisJMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwgDQorCTB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4ZTRhMmVmZjcsIDB4YzYyNTBhMTgsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIA0KKwkweGVkNmJmOWQyLCAweGMyYzE3ZDUzLCAweGMwNGVlNGI5LCAweDA2NDVlOWFmLCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweGY2OWJmN2M5LCAweGMwYjE1NTAyLCANCisNCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmZiMTBjMSwgMHgwMTkyMTU1ZiwgDQorCTB4M2ZmZWM0MmQsIDB4MDBjOTBlOGYsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2ZmYjEwYzEsIDB4MDE5MjE1NWYsIA0KKwkweDNmZDM5YjVhLCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLCAweDA0YjU0ODI0LCAweDNmZjRlNWRmLCAweDAyNWIwY2FlLCAweDNmOWMyYmZhLCAweDA3MGRlMTcxLCANCisJMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZjg0YzhlMSwgMHgwN2Q1OTM5NSwgDQorCTB4M2ZlMTJhY2IsIDB4MDNlY2FkY2YsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIA0KKwkweDNlNzFlNzU4LCAweDBlMDVjMTM1LCAweDNmMGVjOWY0LCAweDBhZjEwYTIyLCAweDNmYzM5NWY5LCAweDA1N2RiNDAyLCAweDNkZTJmMTQ3LCAweDEwNGZiODBlLCANCisJMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwgDQorCTB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4M2Y4NGM4ZTEsIDB4MDdkNTkzOTUsIA0KKwkweDNiYjYyNzZkLCAweDE3MDg4NTMwLCAweDNkYWU4MWNlLCAweDExMTFkMjYyLCAweDNmNmFmMmUzLCAweDA4OWNmODY3LCAweDNhZDJjMmU3LCAweDE5MzcyYTYzLCANCisJMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgzY2M1MTFkOCwgMHgxNDEzNWM5NCwgDQorCTB4M2YyZmYyNDksIDB4MGEyYWJiNTgsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIA0KKwkweDM3YWY4MTU4LCAweDFmOGJhNGRiLCAweDNiYjYyNzZkLCAweDE3MDg4NTMwLCAweDNlZWIzMzQ3LCAweDBiYjZlY2VmLCAweDM2N2M5YTdkLCAweDIxOTJlMDlhLCANCisJMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzYTgyNjlhMiwgMHgxOWVmNzk0MywgDQorCTB4M2U5Y2MwNzYsIDB4MGQ0MTUwMTIsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIA0KKwkweDMyNzQ0NDkzLCAweDI3NWZmNDUyLCAweDM5MmE5NjQyLCAweDFjYzY2ZTk5LCAweDNlNDRhNWVlLCAweDBlYzlhN2YyLCAweDMwZjg4MDFmLCAweDI5MzQ4OTM3LCANCisJMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwgDQorCTB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIA0KKwkweDJjMjE2ZWFhLCAweDJlNWExMDZmLCAweDM2MTIxNGIwLCAweDIyM2Q2NmE4LCAweDNkNzdiMTkxLCAweDExZDM0NDNmLCAweDJhNjUwNTI1LCAweDJmZjFkOWM2LCANCisJMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzNDUzNGY0MCwgMHgyNGRhMGE5OSwgDQorCTB4M2QwMmY3NTYsIDB4MTM1NDEwYzIsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4M2NjNTExZDgsIDB4MTQxMzVjOTQsIA0KKwkweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLCAweDMyNzQ0NDkzLCAweDI3NWZmNDUyLCAweDNjODRkNDk2LCAweDE0ZDFlMjQyLCAweDIyZTY5YWM3LCAweDM1YTU3OTNjLCANCisJMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHgzYzQyNDIwOSwgMHgxNThmOWE3NSwgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHgzMDc2MWMxNywgMHgyOWNkOTU3NywgDQorCTB4M2JmZDVjYzQsIDB4MTY0YzdkZGQsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIA0KKwkweDFjYzY2ZTk5LCAweDM5MmE5NjQyLCAweDJlNWExMDZmLCAweDJjMjE2ZWFhLCAweDNiNmNhNGM0LCAweDE3YzNhOTMxLCAweDFhYTZjODJiLCAweDNhMmZjZWU4LCANCisJMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwgDQorCTB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4M2E4MjY5YTIsIDB4MTllZjc5NDMsIA0KKwkweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LCAweDI5Y2Q5NTc3LCAweDMwNzYxYzE3LCAweDNhMmZjZWU4LCAweDFhYTZjODJiLCAweDExZDM0NDNmLCAweDNkNzdiMTkxLCANCisJMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyNzVmZjQ1MiwgMHgzMjc0NDQ5MywgDQorCTB4Mzk4M2UxZTcsIDB4MWMxMjQ5ZDgsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIA0KKwkweDBhZjEwYTIyLCAweDNmMGVjOWY0LCAweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLCAweDM4Y2YxNjY5LCAweDFkNzk3NzViLCAweDA4OWNmODY3LCAweDNmNmFmMmUzLCANCisJMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyMjNkNjZhOCwgMHgzNjEyMTRiMCwgDQorCTB4MzgxMTg4NGMsIDB4MWVkYzE5NTIsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIA0KKwkweDAxOTIxNTVmLCAweDNmZmIxMGMxLCAweDFmOGJhNGRiLCAweDM3YWY4MTU4LCAweDM3NGI1NGNlLCAweDIwMzlmOTBlLCAweGZmMzZmMTcxLCAweDNmZmVjNDJkLCANCisJMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHgzNmU1MDY4YSwgMHgyMGU3MGYzMiwgMHhmY2RjMTM0MiwgMHgzZmVjNDNjNiwgMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwgDQorCTB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsIDB4ZmE4MjRiZmUsIDB4M2ZjMzk1ZjksIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIA0KKwkweGY4MmE2YzZiLCAweDNmODRjOGUxLCAweDE5ZWY3OTQzLCAweDNhODI2OWEyLCAweDM1YTU3OTNjLCAweDIyZTY5YWM3LCAweGY1ZDU0NGE4LCAweDNmMmZmMjQ5LCANCisJMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxNzA4ODUzMCwgMHgzYmI2Mjc2ZCwgDQorCTB4MzRjNjEyMzYsIDB4MjQzNGYzMzIsIDB4ZjEzNjU4MGUsIDB4M2U0NGE1ZWUsIDB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4MzQ1MzRmNDAsIDB4MjRkYTBhOTksIA0KKwkweGVlZWUyZDllLCAweDNkYWU4MWNlLCAweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LCAweDMzZGU4N2RlLCAweDI1N2RiNjRiLCAweGVjYWJlZjNlLCAweDNkMDJmNzU2LCANCisJMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgxMTExZDI2MiwgMHgzZGFlODFjZSwgDQorCTB4MzJlZWZkZTksIDB4MjZjMGIxNjIsIDB4ZTgzYzU2Y2YsIDB4M2I2Y2E0YzQsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIA0KKwkweGU2MTA4NmJkLCAweDNhODI2OWEyLCAweDBlMDVjMTM1LCAweDNlNzFlNzU4LCAweDMxZjc5OTQ3LCAweDI3ZmRiMmE2LCAweGUzZWRiNjI4LCAweDM5ODNlMWU3LCANCisJMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwgDQorCTB4MzBmODgwMWYsIDB4MjkzNDg5MzcsIDB4ZGZjNjA2ZjIsIDB4Mzc0YjU0Y2UsIDB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4MzA3NjFjMTcsIDB4MjljZDk1NzcsIA0KKwkweGRkYzI5OTU4LCAweDM2MTIxNGIwLCAweDA3ZDU5Mzk1LCAweDNmODRjOGUxLCAweDJmZjFkOWM2LCAweDJhNjUwNTI1LCAweGRiY2IwY2NlLCAweDM0YzYxMjM2LCANCisJMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHhkOWUwMTAwNywgMHgzMzY3YzA4ZiwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwgDQorCTB4MmVlM2NlYmUsIDB4MmI4ZWY3N2MsIDB4ZDgwMjRkNWEsIDB4MzFmNzk5NDcsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIA0KKwkweGQ2MzI2YTg5LCAweDMwNzYxYzE3LCAweDAxOTIxNTVmLCAweDNmZmIxMGMxLCAweDJkY2U4OGE5LCAweDJjYjIzMjRiLCAweGQ0NzEwODg0LCAweDJlZTNjZWJlLCANCisJMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmZTZkZWFhMSwgMHgzZmZiMTBjMSwgDQorCTB4MmNiMjMyNGIsIDB4MmRjZTg4YTksIDB4ZDExYzMxNDIsIDB4MmI4ZWY3N2MsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIDB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIA0KKwkweGNmODllM2U5LCAweDI5Y2Q5NTc3LCAweGZiNGFiN2RjLCAweDNmZDM5YjVhLCAweDJiOGVmNzdjLCAweDJlZTNjZWJlLCAweGNlMDg2NmI5LCAweDI3ZmRiMmE2LCANCisJMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywgMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwgDQorCTB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsIDB4Y2IzOWVkY2EsIDB4MjQzNGYzMzIsIDB4ZjY5YmY3YzksIDB4M2Y0ZWFhZmUsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIA0KKwkweGM5ZWRlYjUwLCAweDIyM2Q2NmE4LCAweGY1MGVmNWRlLCAweDNmMGVjOWY0LCAweDI5MzQ4OTM3LCAweDMwZjg4MDFmLCAweGM4YjRhYjMyLCAweDIwMzlmOTBlLCANCisJMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhmMWZhM2VjYiwgMHgzZTcxZTc1OCwgDQorCTB4MjdmZGIyYTYsIDB4MzFmNzk5NDcsIDB4YzY3YzFlMTksIDB4MWMxMjQ5ZDgsIDB4ZjA3MzAzNDMsIDB4M2UxNGZkZjcsIDB4Mjc1ZmY0NTIsIDB4MzI3NDQ0OTMsIA0KKwkweGM1N2Q5NjVlLCAweDE5ZWY3OTQzLCAweGVlZWUyZDllLCAweDNkYWU4MWNlLCAweDI2YzBiMTYyLCAweDMyZWVmZGU5LCAweGM0OTM1YjNjLCAweDE3YzNhOTMxLCANCisJMHhlZDZiZjlkMiwgMHgzZDNlODJhZCwgMHgyNjFmZWZmOSwgMHgzMzY3YzA4ZiwgMHhjM2JkYmRmNywgMHgxNThmOWE3NSwgMHhlYmVjYTM2YywgMHgzY2M1MTFkOCwgDQorCTB4MjU3ZGI2NGIsIDB4MzNkZTg3ZGUsIDB4YzJmZDA4YWEsIDB4MTM1NDEwYzIsIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIA0KKwkweGMyNTE3ZTMyLCAweDExMTFkMjYyLCAweGU4Zjc3YWQwLCAweDNiYjYyNzZkLCAweDI0MzRmMzMyLCAweDM0YzYxMjM2LCAweGMxYmI1YTEyLCAweDBlYzlhN2YyLCANCisJMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwgDQorCTB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsIDB4YzBkMDBkYjcsIDB4MGEyYWJiNTgsIDB4ZTRhMmVmZjcsIDB4MzlkYWY1ZTgsIDB4MjIzZDY2YTgsIDB4MzYxMjE0YjAsIA0KKwkweGMwN2IzNzFmLCAweDA3ZDU5Mzk1LCAweGUzMzk5MTY3LCAweDM5MmE5NjQyLCAweDIxOTJlMDlhLCAweDM2N2M5YTdkLCAweGMwM2M2YTA3LCAweDA1N2RiNDAyLCANCisJMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhlMDc0NWIyNSwgMHgzN2FmODE1OCwgDQorCTB4MjAzOWY5MGUsIDB4Mzc0YjU0Y2UsIDB4YzAwMTNiZDMsIDB4MDBjOTBlOGYsIDB4ZGYxOGYwY2UsIDB4MzZlNTA2OGEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIA0KKwkweGMwMDRlZjNmLCAweGZlNmRlYWExLCAweGRkYzI5OTU4LCAweDM2MTIxNGIwLCAweDFlZGMxOTUyLCAweDM4MTE4ODRjLCAweGMwMWVkNTM1LCAweGZjMTM1MjMxLCANCisJMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwgMHhkYjI1ZjU2NywgMHgzNDUzNGY0MCwgDQorCTB4MWQ3OTc3NWIsIDB4MzhjZjE2NjksIDB4YzA5NTBkMWQsIDB4Zjc2MzA3OTksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIDB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIA0KKwkweGMwZjEzNjBjLCAweGY1MGVmNWRlLCAweGQ4YTAwYmFlLCAweDMyNzQ0NDkzLCAweDFjMTI0OWQ4LCAweDM5ODNlMWU3LCAweGMxNjMzZjhhLCAweGYyYmVhZmVlLCANCisJMHhkNzY2MTliNiwgMHgzMTc5MDBkNiwgMHgxYjVkMTAwOSwgMHgzOWRhZjVlOCwgMHhjMWViMDIwOSwgMHhmMDczMDM0MywgMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywgDQorCTB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsIDB4YzI4ODRlNmYsIDB4ZWUyY2JiYzEsIDB4ZDUwNTJkOTcsIDB4MmY2YmJlNDQsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIA0KKwkweGMzM2FlZTI4LCAweGViZWNhMzZjLCAweGQzZGU5MTU2LCAweDJlNWExMDZmLCAweDE5MzcyYTYzLCAweDNhZDJjMmU3LCAweGM0MDJhMzNjLCAweGU5YjM4MjIzLCANCisJMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhkMWE1ZWY5MSwgMHgyYzIxNmVhYSwgDQorCTB4MTdjM2E5MzEsIDB4M2I2Y2E0YzQsIDB4YzVkMDMxMTgsIDB4ZTU1OTM3ZDUsIDB4ZDA5NDQxYmMsIDB4MmFmYWQyNjksIDB4MTcwODg1MzAsIDB4M2JiNjI3NmQsIA0KKwkweGM2ZDU2OWJlLCAweGUzMzk5MTY3LCAweGNmODllM2U5LCAweDI5Y2Q5NTc3LCAweDE2NGM3ZGRkLCAweDNiZmQ1Y2M0LCAweGM3ZWU3N2I0LCAweGUxMjNlNmFlLCANCisJMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwgMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjZDhiYmI2ZCwgMHgyNzVmZjQ1MiwgDQorCTB4MTRkMWUyNDIsIDB4M2M4NGQ0OTYsIDB4Y2E1YTg2YzQsIDB4ZGQxOTY1MzksIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIA0KKwkweGNiYWNiMGMwLCAweGRiMjVmNTY3LCAweGNiYWNiMGMwLCAweDI0ZGEwYTk5LCAweDEzNTQxMGMyLCAweDNkMDJmNzU2LCAweGNkMTEwMjE3LCAweGQ5M2Y0ZTllLCANCisJMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwgDQorCTB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsIDB4ZDAwZTI2M2EsIDB4ZDU5YWZhZGIsIDB4YzkxYWY5NzYsIDB4MjBlNzBmMzIsIDB4MTExMWQyNjIsIDB4M2RhZTgxY2UsIA0KKwkweGQxYTVlZjkxLCAweGQzZGU5MTU2LCAweGM4NTA3ZWE4LCAweDFmOGJhNGRiLCAweDEwNGZiODBlLCAweDNkZTJmMTQ3LCAweGQzNGRjZGI1LCAweGQyMzE3NzU3LCANCisJMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHhkNTA1MmQ5NywgMHhkMDk0NDFiYywgMHhjNmQ1NjliZSwgMHgxY2M2NmU5OSwgDQorCTB4MGVjOWE3ZjIsIDB4M2U0NGE1ZWUsIDB4ZDZjYjc2YzksIDB4Y2YwNzdmZTEsIDB4YzYyNTBhMTgsIDB4MWI1ZDEwMDksIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIA0KKwkweGQ4YTAwYmFlLCAweGNkOGJiYjZkLCAweGM1N2Q5NjVlLCAweDE5ZWY3OTQzLCAweDBkNDE1MDEyLCAweDNlOWNjMDc2LCAweGRhODI0OWI1LCAweGNjMjE3ODIyLCANCisJMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjNDQ5ZDg5MywgMHgxNzA4ODUzMCwgDQorCTB4MGJiNmVjZWYsIDB4M2VlYjMzNDcsIDB4ZGU2ZDFmNjYsIDB4Yzk4MzY1ODMsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIDB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIA0KKwkweGUwNzQ1YjI1LCAweGM4NTA3ZWE4LCAweGMzM2FlZTI4LCAweDE0MTM1Yzk0LCAweDBhMmFiYjU4LCAweDNmMmZmMjQ5LCAweGUyODY4OGE1LCAweGM3MzBlOTk3LCANCisJMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwgMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwgDQorCTB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsIDB4ZTZjOGQ1OWQsIDB4YzUyZDNkMTksIDB4YzFlYjAyMDksIDB4MGY4Y2ZjYmQsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIA0KKwkweGU4Zjc3YWQwLCAweGM0NDlkODkzLCAweGMxOGUxOGE4LCAweDBlMDVjMTM1LCAweDA3MGRlMTcxLCAweDNmOWMyYmZhLCAweGViMmUxZGJlLCAweGMzN2IyYjZhLCANCisJMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MywgMHhjMGYxMzYwYywgMHgwYWYxMGEyMiwgDQorCTB4MDU3ZGI0MDIsIDB4M2ZjMzk1ZjksIDB4ZWZiMDQ3ZjIsIDB4YzIxZDBlYjksIDB4YzBiMTU1MDIsIDB4MDk2NDA4MzcsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIA0KKwkweGYxZmEzZWNiLCAweGMxOGUxOGE4LCAweGMwN2IzNzFmLCAweDA3ZDU5Mzk1LCAweDAzZWNhZGNmLCAweDNmZTEyYWNiLCAweGY0NDkxMzExLCAweGMxMTRjY2I5LCANCisJMHhjMDRlZTRiOSwgMHgwNjQ1ZTlhZiwgMHgwMzIzZWNiZSwgMHgzZmVjNDNjNiwgMHhmNjliZjdjOSwgMHhjMGIxNTUwMiwgMHhjMDJjNjRhNiwgMHgwNGI1NDgyNCwgDQorCTB4MDI1YjBjYWUsIDB4M2ZmNGU1ZGYsIDB4ZjhmMjFlOGYsIDB4YzA2M2Q0MDYsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIA0KKwkweGZiNGFiN2RjLCAweGMwMmM2NGE2LCAweGMwMDRlZjNmLCAweDAxOTIxNTVmLCAweDAwYzkwZThmLCAweDNmZmVjNDJkLCAweGZkYTRmMzUyLCAweGMwMGIxYTIxDQorfTsNCisNCitjb25zdCBpbnQgdHdpZFRhYjY0WzQqNiArIDE2KjZdID0gew0KKwkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCANCisJMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgDQorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIA0KKw0KKwkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCANCisJMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgDQorCTB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIA0KKwkweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCANCisJMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgDQorCTB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIA0KKwkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCANCisJMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgDQorCTB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIA0KKwkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLCANCisJMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgDQorCTB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMgDQorfTsNCisjZW5kaWYgIC8vQVJNVjVFDQorDQorY29uc3QgaW50IFNob3J0V2luZG93U2luZVtGUkFNRV9MRU5fU0hPUlQvMl0gPXsgIA0KKwkweDAwYzk3ZmZmLCAweDAyNWI3ZmZhLCAweDAzZWQ3ZmYxLCAweDA1N2Y3ZmUyLCAweDA3MTE3ZmNlLCAweDA4YTI3ZmI1LCAweDBhMzM3Zjk4LCAweDBiYzQ3Zjc1LCANCisJMHgwZDU0N2Y0ZSwgMHgwZWU0N2YyMiwgMHgxMDczN2VmMCwgMHgxMjAxN2ViYSwgMHgxMzhmN2U3ZiwgMHgxNTFjN2UzZiwgMHgxNmE4N2RmYiwgMHgxODMzN2RiMSwgDQorCTB4MTliZTdkNjMsIDB4MWI0NzdkMGYsIDB4MWNkMDdjYjcsIDB4MWU1NzdjNWEsIDB4MWZkZDdiZjksIDB4MjE2MjdiOTIsIDB4MjJlNTdiMjcsIDB4MjQ2NzdhYjcsIA0KKwkweDI1ZTg3YTQyLCAweDI3Njg3OWM5LCAweDI4ZTU3OTRhLCAweDJhNjI3OGM4LCAweDJiZGM3ODQwLCAweDJkNTU3N2I0LCAweDJlY2M3NzIzLCAweDMwNDI3NjhlLCANCisJMHgzMWI1NzVmNCwgMHgzMzI3NzU1NiwgMHgzNDk3NzRiMywgMHgzNjA0NzQwYiwgMHgzNzcwNzM1ZiwgMHgzOGQ5NzJhZiwgMHgzYTQwNzFmYSwgMHgzYmE1NzE0MSwgDQorCTB4M2QwODcwODMsIDB4M2U2ODZmYzIsIDB4M2ZjNjZlZmIsIDB4NDEyMTZlMzEsIDB4NDI3YTZkNjIsIDB4NDNkMTZjOGYsIDB4NDUyNDZiYjgsIDB4NDY3NTZhZGQsIA0KKwkweDQ3YzQ2OWZkLCAweDQ5MGY2OTFhLCAweDRhNTg2ODMyLCAweDRiOWU2NzQ3LCAweDRjZTE2NjU3LCAweDRlMjE2NTY0LCAweDRmNWU2NDZjLCAweDUwOTg2MzcxLCANCisJMHg1MWNmNjI3MiwgMHg1MzAzNjE2ZiwgMHg1NDMzNjA2OCwgMHg1NTYwNWY1ZSwgMHg1NjhhNWU1MCwgMHg1N2IxNWQzZSwgMHg1OGQ0NWMyOSwgMHg1OWY0NWIxMA0KK307CisKK2NvbnN0IGludCBMb25nV2luZG93S0JEW0ZSQU1FX0xFTl9MT05HLzJdPXsgIAorCTB4MDAwYTdmZmYsIDB4MDAwZTdmZmYsIDB4MDAxMjdmZmYsIDB4MDAxNTdmZmYsIDB4MDAxOTdmZmYsIDB4MDAxYzdmZmYsIDB4MDAyMDdmZmYsIDB4MDAyMzdmZmYsIA0KKwkweDAwMjY3ZmZmLCAweDAwMmE3ZmZmLCAweDAwMmQ3ZmZmLCAweDAwMzA3ZmZmLCAweDAwMzQ3ZmZmLCAweDAwMzg3ZmZmLCAweDAwM2I3ZmZmLCAweDAwM2Y3ZmZmLCANCisJMHgwMDQzN2ZmZiwgMHgwMDQ3N2ZmZiwgMHgwMDRiN2ZmZiwgMHgwMDRmN2ZmZiwgMHgwMDUzN2ZmZiwgMHgwMDU3N2ZmZiwgMHgwMDViN2ZmZiwgMHgwMDYwN2ZmZiwgDQorCTB4MDA2NDdmZmYsIDB4MDA2OTdmZmYsIDB4MDA2ZDdmZmYsIDB4MDA3MjdmZmYsIDB4MDA3NzdmZmYsIDB4MDA3YzdmZmYsIDB4MDA4MTdmZmYsIDB4MDA4NjdmZmYsIA0KKwkweDAwOGI3ZmZmLCAweDAwOTE3ZmZmLCAweDAwOTY3ZmZmLCAweDAwOWM3ZmZmLCAweDAwYTE3ZmZmLCAweDAwYTc3ZmZmLCAweDAwYWQ3ZmZmLCAweDAwYjM3ZmZmLCANCisJMHgwMGI5N2ZmZiwgMHgwMGJmN2ZmZiwgMHgwMGM2N2ZmZiwgMHgwMGNjN2ZmZiwgMHgwMGQzN2ZmZiwgMHgwMGRhN2ZmZiwgMHgwMGUwN2ZmZiwgMHgwMGU3N2ZmZiwgDQorCTB4MDBlZTdmZmYsIDB4MDBmNTdmZmYsIDB4MDBmZDdmZmYsIDB4MDEwNDdmZmYsIDB4MDEwYzdmZmYsIDB4MDExMzdmZmYsIDB4MDExYjdmZmYsIDB4MDEyMzdmZmYsIA0KKwkweDAxMmI3ZmZmLCAweDAxMzM3ZmZmLCAweDAxM2M3ZmZlLCAweDAxNDQ3ZmZlLCAweDAxNGQ3ZmZlLCAweDAxNTY3ZmZlLCAweDAxNWY3ZmZlLCAweDAxNjg3ZmZlLCANCisJMHgwMTcxN2ZmZSwgMHgwMTdhN2ZmZSwgMHgwMTgzN2ZmZSwgMHgwMThkN2ZmZSwgMHgwMTk3N2ZmZCwgMHgwMWExN2ZmZCwgMHgwMWFiN2ZmZCwgMHgwMWI1N2ZmZCwgDQorCTB4MDFiZjdmZmQsIDB4MDFjYTdmZmQsIDB4MDFkNDdmZmQsIDB4MDFkZjdmZmMsIDB4MDFlYTdmZmMsIDB4MDFmNTdmZmMsIDB4MDIwMDdmZmMsIDB4MDIwYzdmZmMsIA0KKwkweDAyMTc3ZmZjLCAweDAyMjM3ZmZiLCAweDAyMmY3ZmZiLCAweDAyM2I3ZmZiLCAweDAyNDc3ZmZiLCAweDAyNTM3ZmZiLCAweDAyNjA3ZmZhLCAweDAyNmQ3ZmZhLCANCisJMHgwMjdhN2ZmYSwgMHgwMjg3N2ZmYSwgMHgwMjk0N2ZmOSwgMHgwMmExN2ZmOSwgMHgwMmFmN2ZmOSwgMHgwMmJjN2ZmOSwgMHgwMmNhN2ZmOCwgMHgwMmQ4N2ZmOCwgDQorCTB4MDJlNzdmZjgsIDB4MDJmNTdmZjcsIDB4MDMwNDdmZjcsIDB4MDMxMjdmZjcsIDB4MDMyMTdmZjYsIDB4MDMzMTdmZjYsIDB4MDM0MDdmZjUsIDB4MDM0ZjdmZjUsIA0KKwkweDAzNWY3ZmY1LCAweDAzNmY3ZmY0LCAweDAzN2Y3ZmY0LCAweDAzOGY3ZmYzLCAweDAzYTA3ZmYzLCAweDAzYjA3ZmYyLCAweDAzYzE3ZmYyLCAweDAzZDI3ZmYxLCANCisJMHgwM2UzN2ZmMSwgMHgwM2Y1N2ZmMCwgMHgwNDA2N2ZmMCwgMHgwNDE4N2ZlZiwgMHgwNDJhN2ZlZiwgMHgwNDNjN2ZlZSwgMHgwNDRmN2ZlZCwgMHgwNDYxN2ZlZCwgDQorCTB4MDQ3NDdmZWMsIDB4MDQ4NzdmZWIsIDB4MDQ5YTdmZWIsIDB4MDRhZTdmZWEsIDB4MDRjMTdmZTksIDB4MDRkNTdmZTksIDB4MDRlOTdmZTgsIDB4MDRmZDdmZTcsIA0KKwkweDA1MTI3ZmU2LCAweDA1Mjc3ZmU1LCAweDA1M2I3ZmU1LCAweDA1NTA3ZmU0LCAweDA1NjY3ZmUzLCAweDA1N2I3ZmUyLCAweDA1OTE3ZmUxLCAweDA1YTc3ZmUwLCANCisJMHgwNWJkN2ZkZiwgMHgwNWQzN2ZkZSwgMHgwNWVhN2ZkZCwgMHgwNjAxN2ZkYywgMHgwNjE4N2ZkYiwgMHgwNjJmN2ZkYSwgMHgwNjQ2N2ZkOSwgMHgwNjVlN2ZkNywgDQorCTB4MDY3NjdmZDYsIDB4MDY4ZTdmZDUsIDB4MDZhNjdmZDQsIDB4MDZiZjdmZDIsIDB4MDZkODdmZDEsIDB4MDZmMTdmZDAsIDB4MDcwYTdmY2UsIDB4MDcyMzdmY2QsIA0KKwkweDA3M2Q3ZmNjLCAweDA3NTc3ZmNhLCAweDA3NzE3ZmM5LCAweDA3OGM3ZmM3LCAweDA3YTY3ZmM1LCAweDA3YzE3ZmM0LCAweDA3ZGM3ZmMyLCAweDA3Zjc3ZmMwLCANCisJMHgwODEzN2ZiZiwgMHgwODJmN2ZiZCwgMHgwODRiN2ZiYiwgMHgwODY3N2ZiOSwgMHgwODg0N2ZiNywgMHgwOGEwN2ZiNiwgMHgwOGJkN2ZiNCwgMHgwOGRhN2ZiMiwgDQorCTB4MDhmODdmYWYsIDB4MDkxNjdmYWQsIDB4MDkzNDdmYWIsIDB4MDk1MjdmYTksIDB4MDk3MDdmYTcsIDB4MDk4ZjdmYTUsIDB4MDlhZTdmYTIsIDB4MDljZDdmYTAsIA0KKwkweDA5ZWM3ZjlkLCAweDBhMGM3ZjliLCAweDBhMmM3Zjk4LCAweDBhNGM3Zjk2LCAweDBhNmM3ZjkzLCAweDBhOGQ3ZjkxLCAweDBhYWU3ZjhlLCAweDBhY2Y3ZjhiLCANCisJMHgwYWYwN2Y4OCwgMHgwYjEyN2Y4NSwgMHgwYjMzN2Y4MiwgMHgwYjU1N2Y3ZiwgMHgwYjc4N2Y3YywgMHgwYjlhN2Y3OSwgMHgwYmJkN2Y3NiwgMHgwYmUwN2Y3MywgDQorCTB4MGMwNDdmNmYsIDB4MGMyNzdmNmMsIDB4MGM0YjdmNjksIDB4MGM2ZjdmNjUsIDB4MGM5MzdmNjEsIDB4MGNiODdmNWUsIDB4MGNkZDdmNWEsIDB4MGQwMjdmNTYsIA0KKwkweDBkMjc3ZjUzLCAweDBkNGQ3ZjRmLCAweDBkNzM3ZjRiLCAweDBkOTk3ZjQ3LCAweDBkYmY3ZjQzLCAweDBkZTY3ZjNlLCAweDBlMGM3ZjNhLCAweDBlMzQ3ZjM2LCANCisJMHgwZTViN2YzMSwgMHgwZTgzN2YyZCwgMHgwZWFhN2YyOCwgMHgwZWQzN2YyNCwgMHgwZWZiN2YxZiwgMHgwZjIzN2YxYSwgMHgwZjRjN2YxNSwgMHgwZjc1N2YxMCwgDQorCTB4MGY5ZjdmMGIsIDB4MGZjODdmMDYsIDB4MGZmMjdmMDEsIDB4MTAxYzdlZmIsIDB4MTA0NzdlZjYsIDB4MTA3MTdlZjAsIDB4MTA5YzdlZWIsIDB4MTBjODdlZTUsIA0KKwkweDEwZjM3ZWRmLCAweDExMWY3ZWRhLCAweDExNGE3ZWQ0LCAweDExNzc3ZWNlLCAweDExYTM3ZWM3LCAweDExZDA3ZWMxLCAweDExZmQ3ZWJiLCAweDEyMmE3ZWI0LCANCisJMHgxMjU3N2VhZSwgMHgxMjg1N2VhNywgMHgxMmIzN2VhMCwgMHgxMmUxN2U5YSwgMHgxMzBmN2U5MywgMHgxMzNlN2U4YywgMHgxMzZkN2U4NCwgMHgxMzljN2U3ZCwgDQorCTB4MTNjYzdlNzYsIDB4MTNmYjdlNmUsIDB4MTQyYjdlNjcsIDB4MTQ1YjdlNWYsIDB4MTQ4YzdlNTcsIDB4MTRiYzdlNGYsIDB4MTRlZDdlNDcsIDB4MTUxZTdlM2YsIA0KKwkweDE1NTA3ZTM3LCAweDE1ODE3ZTJlLCAweDE1YjM3ZTI2LCAweDE1ZTU3ZTFkLCAweDE2MTg3ZTE0LCAweDE2NGE3ZTBiLCAweDE2N2Q3ZTAyLCAweDE2YjA3ZGY5LCANCisJMHgxNmU0N2RmMCwgMHgxNzE3N2RlNiwgMHgxNzRiN2RkZCwgMHgxNzdmN2RkMywgMHgxN2IzN2RjOSwgMHgxN2U4N2RiZiwgMHgxODFkN2RiNSwgMHgxODUyN2RhYiwgDQorCTB4MTg4NzdkYTEsIDB4MThiYzdkOTYsIDB4MThmMjdkOGMsIDB4MTkyODdkODEsIDB4MTk1ZTdkNzYsIDB4MTk5NTdkNmIsIDB4MTljYjdkNjAsIDB4MWEwMjdkNTQsIA0KKwkweDFhMzk3ZDQ5LCAweDFhNzE3ZDNkLCAweDFhYTg3ZDMxLCAweDFhZTA3ZDI2LCAweDFiMTg3ZDE5LCAweDFiNTA3ZDBkLCAweDFiODk3ZDAxLCAweDFiYzI3Y2Y0LCANCisJMHgxYmZiN2NlOCwgMHgxYzM0N2NkYiwgMHgxYzZkN2NjZSwgMHgxY2E3N2NjMSwgMHgxY2UxN2NiMywgMHgxZDFiN2NhNiwgMHgxZDU1N2M5OCwgMHgxZDhmN2M4YSwgDQorCTB4MWRjYTdjN2MsIDB4MWUwNTdjNmUsIDB4MWU0MDdjNjAsIDB4MWU3YjdjNTEsIDB4MWViNzdjNDMsIDB4MWVmMzdjMzQsIDB4MWYyZjdjMjUsIDB4MWY2YjdjMTYsIA0KKwkweDFmYTc3YzA2LCAweDFmZTQ3YmY3LCAweDIwMjE3YmU3LCAweDIwNWU3YmQ3LCAweDIwOWI3YmM3LCAweDIwZDg3YmI3LCAweDIxMTY3YmE2LCAweDIxNTQ3Yjk2LCANCisJMHgyMTkyN2I4NSwgMHgyMWQwN2I3NCwgMHgyMjBlN2I2MywgMHgyMjRkN2I1MiwgMHgyMjhjN2I0MCwgMHgyMmNiN2IyZSwgMHgyMzBhN2IxYywgMHgyMzQ5N2IwYSwgDQorCTB4MjM4OTdhZjgsIDB4MjNjODdhZTYsIDB4MjQwODdhZDMsIDB4MjQ0ODdhYzAsIDB4MjQ4OTdhYWQsIDB4MjRjOTdhOWEsIDB4MjUwYTdhODYsIDB4MjU0YjdhNzMsIA0KKwkweDI1OGM3YTVmLCAweDI1Y2Q3YTRiLCAweDI2MGU3YTM2LCAweDI2NTA3YTIyLCAweDI2OTE3YTBkLCAweDI2ZDM3OWY4LCAweDI3MTU3OWUzLCAweDI3NTc3OWNlLCANCisJMHgyNzlhNzliOCwgMHgyN2RjNzlhMywgMHgyODFmNzk4ZCwgMHgyODYyNzk3NywgMHgyOGE1Nzk2MCwgMHgyOGU4Nzk0YSwgMHgyOTJiNzkzMywgMHgyOTZmNzkxYywgDQorCTB4MjliMjc5MDUsIDB4MjlmNjc4ZWQsIDB4MmEzYTc4ZDYsIDB4MmE3ZTc4YmUsIDB4MmFjMjc4YTYsIDB4MmIwNzc4OGQsIDB4MmI0Yjc4NzUsIDB4MmI5MDc4NWMsIA0KKwkweDJiZDQ3ODQzLCAweDJjMTk3ODJhLCAweDJjNWU3ODEwLCAweDJjYTQ3N2Y3LCAweDJjZTk3N2RkLCAweDJkMmU3N2MzLCAweDJkNzQ3N2E4LCAweDJkYmE3NzhlLCANCisJMHgyZGZmNzc3MywgMHgyZTQ1Nzc1OCwgMHgyZThiNzczZCwgMHgyZWQyNzcyMSwgMHgyZjE4NzcwNiwgMHgyZjVlNzZlYSwgMHgyZmE1NzZjZCwgMHgyZmVjNzZiMSwgDQorCTB4MzAzMjc2OTQsIDB4MzA3OTc2NzcsIDB4MzBjMDc2NWEsIDB4MzEwNzc2M2QsIDB4MzE0ZTc2MWYsIDB4MzE5Njc2MDEsIDB4MzFkZDc1ZTMsIDB4MzIyNTc1YzUsIA0KKwkweDMyNmM3NWE2LCAweDMyYjQ3NTg4LCAweDMyZmM3NTY5LCAweDMzNDQ3NTQ5LCAweDMzOGM3NTJhLCAweDMzZDQ3NTBhLCAweDM0MWM3NGVhLCAweDM0NjQ3NGNhLCANCisJMHgzNGFjNzRhOSwgMHgzNGY1NzQ4OCwgMHgzNTNkNzQ2NywgMHgzNTg1NzQ0NiwgMHgzNWNlNzQyNCwgMHgzNjE3NzQwMywgMHgzNjVmNzNlMSwgMHgzNmE4NzNiZSwgDQorCTB4MzZmMTczOWMsIDB4MzczYTczNzksIDB4Mzc4MzczNTYsIDB4MzdjYzczMzMsIDB4MzgxNTczMGYsIDB4Mzg1ZTcyZWMsIDB4MzhhNzcyYzgsIDB4MzhmMTcyYTMsIA0KKwkweDM5M2E3MjdmLCAweDM5ODM3MjVhLCAweDM5Y2Q3MjM1LCAweDNhMTY3MjEwLCAweDNhNjA3MWVhLCAweDNhYTk3MWM0LCAweDNhZjM3MTllLCAweDNiM2M3MTc4LCANCisJMHgzYjg2NzE1MSwgMHgzYmQwNzEyYiwgMHgzYzE5NzEwNCwgMHgzYzYzNzBkYywgMHgzY2FkNzBiNSwgMHgzY2Y3NzA4ZCwgMHgzZDQwNzA2NSwgMHgzZDhhNzAzYywgDQorCTB4M2RkNDcwMTQsIDB4M2UxZTZmZWIsIDB4M2U2ODZmYzIsIDB4M2ViMTZmOTgsIDB4M2VmYjZmNmYsIDB4M2Y0NTZmNDUsIDB4M2Y4ZjZmMWIsIDB4M2ZkOTZlZjAsIA0KKwkweDQwMjM2ZWM2LCAweDQwNmQ2ZTliLCAweDQwYjY2ZTcwLCAweDQxMDA2ZTQ0LCAweDQxNGE2ZTE5LCAweDQxOTQ2ZGVkLCAweDQxZGU2ZGMxLCAweDQyMjg2ZDk0LCANCisJMHg0MjcxNmQ2OCwgMHg0MmJiNmQzYiwgMHg0MzA1NmQwZCwgMHg0MzRmNmNlMCwgMHg0Mzk4NmNiMiwgMHg0M2UyNmM4NCwgMHg0NDJjNmM1NiwgMHg0NDc1NmMyOCwgDQorCTB4NDRiZjZiZjksIDB4NDUwODZiY2EsIDB4NDU1MjZiOWIsIDB4NDU5YjZiNmIsIDB4NDVlNTZiM2MsIDB4NDYyZTZiMGMsIDB4NDY3ODZhZGIsIDB4NDZjMTZhYWIsIA0KKwkweDQ3MGE2YTdhLCAweDQ3NTM2YTQ5LCAweDQ3OWM2YTE4LCAweDQ3ZTU2OWU3LCAweDQ4MmU2OWI1LCAweDQ4Nzc2OTgzLCAweDQ4YzA2OTUxLCAweDQ5MDk2OTFlLCANCisJMHg0OTUyNjhlYywgMHg0OTliNjhiOSwgMHg0OWUzNjg4NSwgMHg0YTJjNjg1MiwgMHg0YTc0NjgxZSwgMHg0YWJkNjdlYSwgMHg0YjA1NjdiNiwgMHg0YjRkNjc4MiwgDQorCTB4NGI5NTY3NGQsIDB4NGJkZTY3MTgsIDB4NGMyNjY2ZTMsIDB4NGM2ZDY2YWUsIDB4NGNiNTY2NzgsIDB4NGNmZDY2NDIsIDB4NGQ0NTY2MGMsIDB4NGQ4YzY1ZDYsIA0KKwkweDRkZDQ2NTlmLCAweDRlMWI2NTY4LCAweDRlNjI2NTMxLCAweDRlYTk2NGZhLCAweDRlZjA2NGMzLCAweDRmMzc2NDhiLCAweDRmN2U2NDUzLCAweDRmYzU2NDFiLCANCisJMHg1MDBiNjNlMiwgMHg1MDUyNjNhYSwgMHg1MDk4NjM3MSwgMHg1MGRmNjMzOCwgMHg1MTI1NjJmZSwgMHg1MTZiNjJjNSwgMHg1MWIxNjI4YiwgMHg1MWY2NjI1MSwgDQorCTB4NTIzYzYyMTcsIDB4NTI4MTYxZGMsIDB4NTJjNzYxYTIsIDB4NTMwYzYxNjcsIDB4NTM1MTYxMmMsIDB4NTM5NjYwZjEsIDB4NTNkYjYwYjUsIDB4NTQyMDYwNzksIA0KKwkweDU0NjQ2MDNkLCAweDU0YTk2MDAxLCAweDU0ZWQ1ZmM1LCAweDU1MzE1Zjg4LCAweDU1NzU1ZjRiLCAweDU1Yjk1ZjBlLCAweDU1ZmM1ZWQxLCAweDU2NDA1ZTk0LCANCisJMHg1NjgzNWU1NiwgMHg1NmM3NWUxOCwgMHg1NzBhNWRkYSwgMHg1NzRkNWQ5YywgMHg1NzhmNWQ1ZSwgMHg1N2QyNWQxZiwgMHg1ODE0NWNlMCwgMHg1ODU2NWNhMSwgDQorCTB4NTg5OTVjNjIsIDB4NThkYTVjMjMsIDB4NTkxYzViZTMsIDB4NTk1ZTViYTQsIDB4NTk5ZjViNjQsIDB4NTllMDViMjQsIDB4NWEyMTVhZTMsIDB4NWE2MjVhYTMKK307CisKKworLyoKKyAgZm9ybSBmYWN0b3IKKyovCisvKiBzcXJ0KCgoaSsoMTw8KEZGX1NRUlRfQklUUy0yKSswLjUpLzJeMzEpICovCitjb25zdCBXb3JkMzIgZm9ybWZhY19zcXJ0dGFibGVbOTZdID0geworICAweDAwMDQwN2Y4LCAweDAwMDQxN2I5LCAweDAwMDQyNzNmLCAweDAwMDQzNjhjLCAweDAwMDQ0NWExLCAweDAwMDQ1NDgzLCAweDAwMDQ2MzMyLCAweDAwMDQ3MWIwLAorICAweDAwMDQ4MDAwLCAweDAwMDQ4ZTIyLCAweDAwMDQ5YzFhLCAweDAwMDRhOWU3LCAweDAwMDRiNzhjLCAweDAwMDRjNTBhLCAweDAwMDRkMjYzLCAweDAwMDRkZjk2LAorICAweDAwMDRlY2E3LCAweDAwMDRmOTk1LCAweDAwMDUwNjYyLCAweDAwMDUxMzBlLCAweDAwMDUxZjljLCAweDAwMDUyYzBhLCAweDAwMDUzODViLCAweDAwMDU0NDkwLAorICAweDAwMDU1MGE4LCAweDAwMDU1Y2E1LCAweDAwMDU2ODg4LCAweDAwMDU3NDUwLCAweDAwMDU4MDAwLCAweDAwMDU4Yjk2LCAweDAwMDU5NzE1LCAweDAwMDVhMjdjLAorICAweDAwMDVhZGNjLCAweDAwMDViOTA2LCAweDAwMDVjNDJiLCAweDAwMDVjZjM5LCAweDAwMDVkYTMzLCAweDAwMDVlNTE5LCAweDAwMDVlZmVhLCAweDAwMDVmYWE4LAorICAweDAwMDYwNTUyLCAweDAwMDYwZmVhLCAweDAwMDYxYTcwLCAweDAwMDYyNGUzLCAweDAwMDYyZjQ1LCAweDAwMDYzOTk2LCAweDAwMDY0M2Q1LCAweDAwMDY0ZTA0LAorICAweDAwMDY1ODIzLCAweDAwMDY2MjMxLCAweDAwMDY2YzMwLCAweDAwMDY3NjFmLCAweDAwMDY4MDAwLCAweDAwMDY4OWQxLCAweDAwMDY5MzkzLCAweDAwMDY5ZDQ3LAorICAweDAwMDZhNmVkLCAweDAwMDZiMDg1LCAweDAwMDZiYTEwLCAweDAwMDZjMzhkLCAweDAwMDZjY2ZjLCAweDAwMDZkNjVmLCAweDAwMDZkZmI1LCAweDAwMDZlOGZlLAorICAweDAwMDZmMjNiLCAweDAwMDZmYjZjLCAweDAwMDcwNDkwLCAweDAwMDcwZGE5LCAweDAwMDcxNmI2LCAweDAwMDcxZmI4LCAweDAwMDcyOGFlLCAweDAwMDczMTk5LAorICAweDAwMDczYTc5LCAweDAwMDc0MzRlLCAweDAwMDc0YzE5LCAweDAwMDc1NGQ5LCAweDAwMDc1ZDhlLCAweDAwMDc2NjNhLCAweDAwMDc2ZWRiLCAweDAwMDc3NzcyLAorICAweDAwMDc4MDAwLCAweDAwMDc4ODgzLCAweDAwMDc5MGZkLCAweDAwMDc5OTZlLCAweDAwMDdhMWQ1LCAweDAwMDdhYTMzLCAweDAwMDdiMjg4LCAweDAwMDdiYWQ0LAorICAweDAwMDdjMzE4LCAweDAwMDdjYjUyLCAweDAwMDdkMzg0LCAweDAwMDdkYmFkLCAweDAwMDdlM2NlLCAweDAwMDdlYmU2LCAweDAwMDdmM2Y2LCAweDAwMDdmYmZlCit9OworCisKKworLyohCisgIFxuYW1lICAgIHF1YW50aXplciBhbmQgaW52ZXJzZSBxdWFudGl6ZXIgdGFibGVzCisKKyAgXGJyaWVmICAgdGhlc2UgdGFibGVzIGFyZSB1c2VkIGZvciB0aGUgbm9uCisgICAgICAgICAgIGxpbmVhciBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyCisgICAgICAgICAgIAorKi8KK2NvbnN0IFdvcmQzMiBtVGFiXzNfNFs1MTJdID0geworCTB4NGMxYmY4MjksIDB4NGMzODgwZGUsIDB4NGM1NTA2MDMsIDB4NGM3MTg3OWMsIAorCTB4NGM4ZTA1YWEsIDB4NGNhYTgwMzAsIDB4NGNjNmY3MmYsIDB4NGNlMzZhYWIsIAorCTB4NGNmZmRhYTQsIDB4NGQxYzQ3MWQsIDB4NGQzOGIwMTksIDB4NGQ1NTE1OWEsIAorCTB4NGQ3MTc3YTEsIDB4NGQ4ZGQ2MzEsIDB4NGRhYTMxNGIsIDB4NGRjNjg4ZjMsIAorCTB4NGRlMmRkMmEsIDB4NGRmZjJkZjIsIDB4NGUxYjdiNGQsIDB4NGUzN2M1M2QsIAorCTB4NGU1NDBiYzUsIDB4NGU3MDRlZTYsIDB4NGU4YzhlYTMsIDB4NGVhOGNhZmQsIAorCTB4NGVjNTAzZjcsIDB4NGVlMTM5OTIsIDB4NGVmZDZiZDAsIDB4NGYxOTlhYjQsIAorCTB4NGYzNWM2NDAsIDB4NGY1MWVlNzUsIDB4NGY2ZTEzNTYsIDB4NGY4YTM0ZTQsIAorCTB4NGZhNjUzMjEsIDB4NGZjMjZlMTAsIDB4NGZkZTg1YjIsIDB4NGZmYTlhMGEsIAorCTB4NTAxNmFiMTgsIDB4NTAzMmI4ZTAsIDB4NTA0ZWMzNjIsIDB4NTA2YWNhYTEsIAorCTB4NTA4NmNlYTAsIDB4NTBhMmNmNWUsIDB4NTBiZWNjZTAsIDB4NTBkYWM3MjUsIAorCTB4NTBmNmJlMzEsIDB4NTExMmIyMDUsIDB4NTEyZWEyYTMsIDB4NTE0YTkwMGQsIAorCTB4NTE2NjdhNDUsIDB4NTE4MjYxNGMsIDB4NTE5ZTQ1MjQsIDB4NTFiYTI1Y2YsIAorCTB4NTFkNjAzNTAsIDB4NTFmMWRkYTcsIDB4NTIwZGI0ZDYsIDB4NTIyOTg4ZTAsIAorCTB4NTI0NTU5YzYsIDB4NTI2MTI3ODksIDB4NTI3Y2YyMmQsIDB4NTI5OGI5YjEsIAorCTB4NTJiNDdlMTksIDB4NTJkMDNmNjUsIDB4NTJlYmZkOTgsIDB4NTMwN2I4YjQsIAorCTB4NTMyMzcwYjksIDB4NTMzZjI1YWEsIDB4NTM1YWQ3ODksIDB4NTM3Njg2NTYsIAorCTB4NTM5MjMyMTUsIDB4NTNhZGRhYzYsIDB4NTNjOTgwNmIsIDB4NTNlNTIzMDYsIAorCTB4NTQwMGMyOTgsIDB4NTQxYzVmMjQsIDB4NTQzN2Y4YWIsIDB4NTQ1MzhmMmUsIAorCTB4NTQ2ZjIyYWYsIDB4NTQ4YWIzMzAsIDB4NTRhNjQwYjMsIDB4NTRjMWNiMzgsIAorCTB4NTRkZDUyYzIsIDB4NTRmOGQ3NTMsIDB4NTUxNDU4ZWIsIDB4NTUyZmQ3OGQsIAorCTB4NTU0YjUzMzksIDB4NTU2NmNiZjMsIDB4NTU4MjQxYmIsIDB4NTU5ZGI0OTIsIAorCTB4NTViOTI0N2IsIDB4NTVkNDkxNzcsIDB4NTVlZmZiODcsIDB4NTYwYjYyYWQsIAorCTB4NTYyNmM2ZWIsIDB4NTY0MjI4NDIsIDB4NTY1ZDg2YjQsIDB4NTY3OGUyNDIsIAorCTB4NTY5NDNhZWUsIDB4NTZhZjkwYjksIDB4NTZjYWUzYTQsIDB4NTZlNjMzYjIsIAorCTB4NTcwMTgwZTQsIDB4NTcxY2NiM2IsIDB4NTczODEyYjgsIDB4NTc1MzU3NWUsIAorCTB4NTc2ZTk5MmUsIDB4NTc4OWQ4MjksIDB4NTdhNTE0NTAsIDB4NTdjMDRkYTYsIAorCTB4NTdkYjg0MmIsIDB4NTdmNmI3ZTEsIDB4NTgxMWU4YzksIDB4NTgyZDE2ZTYsIAorCTB4NTg0ODQyMzgsIDB4NTg2MzZhYzAsIDB4NTg3ZTkwODEsIDB4NTg5OWIzN2MsIAorCTB4NThiNGQzYjEsIDB4NThjZmYxMjMsIDB4NThlYjBiZDMsIDB4NTkwNjIzYzIsIAorCTB4NTkyMTM4ZjIsIDB4NTkzYzRiNjMsIDB4NTk1NzViMTksIDB4NTk3MjY4MTIsIAorCTB4NTk4ZDcyNTMsIDB4NTlhODc5ZGEsIDB4NTljMzdlYWIsIDB4NTlkZTgwYzYsIAorCTB4NTlmOTgwMmQsIDB4NWExNDdjZTAsIDB4NWEyZjc2ZTIsIDB4NWE0YTZlMzQsIAorCTB4NWE2NTYyZDYsIDB4NWE4MDU0Y2IsIDB4NWE5YjQ0MTQsIDB4NWFiNjMwYjIsIAorCTB4NWFkMTFhYTYsIDB4NWFlYzAxZjEsIDB4NWIwNmU2OTYsIDB4NWIyMWM4OTUsIAorCTB4NWIzY2E3ZWYsIDB4NWI1Nzg0YTYsIDB4NWI3MjVlYmMsIDB4NWI4ZDM2MzEsIAorCTB4NWJhODBiMDYsIDB4NWJjMmRkM2UsIDB4NWJkZGFjZDksIDB4NWJmODc5ZDgsIAorCTB4NWMxMzQ0M2QsIDB4NWMyZTBjMDksIDB4NWM0OGQxM2UsIDB4NWM2MzkzZGMsIAorCTB4NWM3ZTUzZTUsIDB4NWM5OTExNWEsIDB4NWNiM2NjM2MsIDB4NWNjZTg0OGQsIAorCTB4NWNlOTNhNGUsIDB4NWQwM2VkODAsIDB4NWQxZTllMjQsIDB4NWQzOTRjM2IsIAorCTB4NWQ1M2Y3YzcsIDB4NWQ2ZWEwYzksIDB4NWQ4OTQ3NDIsIDB4NWRhM2ViMzMsIAorCTB4NWRiZThjOWUsIDB4NWRkOTJiODQsIDB4NWRmM2M3ZTUsIDB4NWUwZTYxYzMsIAorCTB4NWUyOGY5MjAsIDB4NWU0MzhkZmMsIDB4NWU1ZTIwNTksIDB4NWU3OGIwMzcsIAorCTB4NWU5MzNkOTksIDB4NWVhZGM4N2UsIDB4NWVjODUwZTksIDB4NWVlMmQ2ZGEsIAorCTB4NWVmZDVhNTMsIDB4NWYxN2RiNTQsIDB4NWYzMjU5ZTAsIDB4NWY0Y2Q1ZjYsIAorCTB4NWY2NzRmOTksIDB4NWY4MWM2YzgsIDB4NWY5YzNiODcsIDB4NWZiNmFkZDQsIAorCTB4NWZkMTFkYjMsIDB4NWZlYjhiMjMsIDB4NjAwNWY2MjYsIDB4NjAyMDVlYmQsIAorCTB4NjAzYWM0ZTksIDB4NjA1NTI4YWMsIDB4NjA2ZjhhMDUsIDB4NjA4OWU4ZjcsIAorCTB4NjBhNDQ1ODMsIDB4NjBiZTlmYTksIDB4NjBkOGY3NmIsIDB4NjBmMzRjY2EsIAorCTB4NjEwZDlmYzcsIDB4NjEyN2YwNjIsIDB4NjE0MjNlOWUsIDB4NjE1YzhhN2EsIAorCTB4NjE3NmQzZjksIDB4NjE5MTFiMWIsIDB4NjFhYjVmZTEsIDB4NjFjNWEyNGQsIAorCTB4NjFkZmUyNWYsIDB4NjFmYTIwMTgsIDB4NjIxNDViN2EsIDB4NjIyZTk0ODUsIAorCTB4NjI0OGNiM2IsIDB4NjI2MmZmOWQsIDB4NjI3ZDMxYWIsIDB4NjI5NzYxNjcsIAorCTB4NjJiMThlZDEsIDB4NjJjYmI5ZWIsIDB4NjJlNWUyYjYsIDB4NjMwMDA5MzMsIAorCTB4NjMxYTJkNjIsIDB4NjMzNDRmNDUsIDB4NjM0ZTZlZGQsIDB4NjM2ODhjMmIsIAorCTB4NjM4MmE3MzAsIDB4NjM5Y2JmZWMsIDB4NjNiNmQ2NjEsIDB4NjNkMGVhOTAsIAorCTB4NjNlYWZjN2EsIDB4NjQwNTBjMWYsIDB4NjQxZjE5ODIsIDB4NjQzOTI0YTIsIAorCTB4NjQ1MzJkODAsIDB4NjQ2ZDM0MWYsIDB4NjQ4NzM4N2UsIDB4NjRhMTNhOWUsIAorCTB4NjRiYjNhODEsIDB4NjRkNTM4MjgsIDB4NjRlZjMzOTMsIDB4NjUwOTJjYzQsIAorCTB4NjUyMzIzYmIsIDB4NjUzZDE4NzksIDB4NjU1NzBiMDAsIDB4NjU3MGZiNTAsIAorCTB4NjU4YWU5NmIsIDB4NjVhNGQ1NTAsIDB4NjViZWJmMDEsIDB4NjVkOGE2ODAsIAorCTB4NjVmMjhiY2MsIDB4NjYwYzZlZTgsIDB4NjYyNjRmZDMsIDB4NjY0MDJlOGYsIAorCTB4NjY1YTBiMWMsIDB4NjY3M2U1N2QsIDB4NjY4ZGJkYjAsIDB4NjZhNzkzYjgsIAorCTB4NjZjMTY3OTUsIDB4NjZkYjM5NDksIDB4NjZmNTA4ZDQsIDB4NjcwZWQ2MzYsIAorCTB4NjcyOGExNzIsIDB4Njc0MjZhODcsIDB4Njc1YzMxNzcsIDB4Njc3NWY2NDMsIAorCTB4Njc4ZmI4ZWIsIDB4NjdhOTc5NzEsIDB4NjdjMzM3ZDUsIDB4NjdkY2Y0MTgsIAorCTB4NjdmNmFlM2IsIDB4NjgxMDY2M2YsIDB4NjgyYTFjMjUsIDB4Njg0M2NmZWQsIAorCTB4Njg1ZDgxOTksIDB4Njg3NzMxMjksIDB4Njg5MGRlOWYsIDB4NjhhYTg5ZmEsIAorCTB4NjhjNDMzM2QsIDB4NjhkZGRhNjcsIDB4NjhmNzdmN2EsIDB4NjkxMTIyNzcsIAorCTB4NjkyYWMzNWUsIDB4Njk0NDYyMzAsIDB4Njk1ZGZlZWUsIDB4Njk3Nzk5OWEsIAorCTB4Njk5MTMyMzIsIDB4NjlhYWM4YmEsIDB4NjljNDVkMzEsIDB4NjlkZGVmOTgsIAorCTB4NjlmNzdmZjAsIDB4NmExMTBlM2EsIDB4NmEyYTlhNzcsIDB4NmE0NDI0YTgsIAorCTB4NmE1ZGFjY2MsIDB4NmE3NzMyZTYsIDB4NmE5MGI2ZjYsIDB4NmFhYTM4ZmQsIAorCTB4NmFjM2I4ZmIsIDB4NmFkZDM2ZjIsIDB4NmFmNmIyZTIsIDB4NmIxMDJjY2QsIAorCTB4NmIyOWE0YjIsIDB4NmI0MzFhOTIsIDB4NmI1YzhlNmYsIDB4NmI3NjAwNGEsIAorCTB4NmI4ZjcwMjIsIDB4NmJhOGRkZjksIDB4NmJjMjQ5ZDAsIDB4NmJkYmIzYTcsIAorCTB4NmJmNTFiODAsIDB4NmMwZTgxNWEsIDB4NmMyN2U1MzcsIDB4NmM0MTQ3MTgsIAorCTB4NmM1YWE2ZmQsIDB4NmM3NDA0ZTcsIDB4NmM4ZDYwZDcsIDB4NmNhNmJhY2UsIAorCTB4NmNjMDEyY2MsIDB4NmNkOTY4ZDIsIDB4NmNmMmJjZTEsIDB4NmQwYzBlZjksIAorCTB4NmQyNTVmMWQsIDB4NmQzZWFkNGIsIDB4NmQ1N2Y5ODUsIDB4NmQ3MTQzY2MsIAorCTB4NmQ4YThjMjEsIDB4NmRhM2QyODMsIDB4NmRiZDE2ZjUsIDB4NmRkNjU5NzYsIAorCTB4NmRlZjlhMDgsIDB4NmUwOGQ4YWIsIDB4NmUyMjE1NjAsIDB4NmUzYjUwMjcsIAorCTB4NmU1NDg5MDIsIDB4NmU2ZGJmZjEsIDB4NmU4NmY0ZjUsIDB4NmVhMDI4MGUsIAorCTB4NmViOTU5M2UsIDB4NmVkMjg4ODUsIDB4NmVlYmI1ZTMsIDB4NmYwNGUxNWEsIAorCTB4NmYxZTBhZWEsIDB4NmYzNzMyOTQsIDB4NmY1MDU4NTksIDB4NmY2OTdjMzksIAorCTB4NmY4MjllMzUsIDB4NmY5YmJlNGUsIDB4NmZiNGRjODUsIDB4NmZjZGY4ZDksIAorCTB4NmZlNzEzNGQsIDB4NzAwMDJiZTAsIDB4NzAxOTQyOTMsIDB4NzAzMjU3NjcsIAorCTB4NzA0YjZhNWQsIDB4NzA2NDdiNzYsIDB4NzA3ZDhhYjEsIDB4NzA5Njk4MTEsIAorCTB4NzBhZmEzOTQsIDB4NzBjOGFkM2QsIDB4NzBlMWI1MGMsIDB4NzBmYWJiMDEsIAorCTB4NzExM2JmMWQsIDB4NzEyY2MxNjEsIDB4NzE0NWMxY2UsIDB4NzE1ZWMwNjQsIAorCTB4NzE3N2JkMjQsIDB4NzE5MGI4MGYsIDB4NzFhOWIxMjQsIDB4NzFjMmE4NjYsIAorCTB4NzFkYjlkZDQsIDB4NzFmNDkxNzAsIDB4NzIwZDgzMzksIDB4NzIyNjczMzEsIAorCTB4NzIzZjYxNTksIDB4NzI1ODRkYjAsIDB4NzI3MTM4MzgsIDB4NzI4YTIwZjEsIAorCTB4NzJhMzA3ZGIsIDB4NzJiYmVjZjksIDB4NzJkNGQwNDksIDB4NzJlZGIxY2UsIAorCTB4NzMwNjkxODcsIDB4NzMxZjZmNzUsIDB4NzMzODRiOTgsIDB4NzM1MTI1ZjMsIAorCTB4NzM2OWZlODQsIDB4NzM4MmQ1NGQsIDB4NzM5YmFhNGUsIDB4NzNiNDdkODksIAorCTB4NzNjZDRlZmQsIDB4NzNlNjFlYWIsIDB4NzNmZWVjOTQsIDB4NzQxN2I4YjgsIAorCTB4NzQzMDgzMTksIDB4NzQ0OTRiYjYsIDB4NzQ2MjEyOTEsIDB4NzQ3YWQ3YWEsIAorCTB4NzQ5MzliMDIsIDB4NzRhYzVjOTgsIDB4NzRjNTFjNmYsIDB4NzRkZGRhODYsIAorCTB4NzRmNjk2ZGUsIDB4NzUwZjUxNzgsIDB4NzUyODBhNTQsIDB4NzU0MGMxNzQsIAorCTB4NzU1OTc2ZDcsIDB4NzU3MjJhN2UsIDB4NzU4YWRjNjksIDB4NzVhMzhjOWIsIAorCTB4NzViYzNiMTIsIDB4NzVkNGU3Y2YsIDB4NzVlZDkyZDQsIDB4NzYwNjNjMjEsIAorCTB4NzYxZWUzYjYsIDB4NzYzNzg5OTQsIDB4NzY1MDJkYmMsIDB4NzY2OGQwMmUsIAorCTB4NzY4MTcwZWIsIDB4NzY5YTBmZjMsIDB4NzZiMmFkNDcsIDB4NzZjYjQ4ZTcsIAorCTB4NzZlM2UyZDUsIDB4NzZmYzdiMTAsIDB4NzcxNTExOWEsIDB4NzcyZGE2NzMsIAorCTB4Nzc0NjM5OWIsIDB4Nzc1ZWNiMTMsIDB4Nzc3NzVhZGMsIDB4Nzc4ZmU4ZjYsIAorCTB4NzdhODc1NjEsIDB4NzdjMTAwMWYsIDB4NzdkOTg5MzAsIDB4NzdmMjEwOTUsIAorCTB4NzgwYTk2NGQsIDB4NzgyMzFhNWIsIDB4NzgzYjljYmQsIDB4Nzg1NDFkNzUsIAorCTB4Nzg2YzljODQsIDB4Nzg4NTE5ZTksIDB4Nzg5ZDk1YTYsIDB4NzhiNjBmYmIsIAorCTB4NzhjZTg4MjgsIDB4NzhlNmZlZWYsIDB4NzhmZjc0MGYsIDB4NzkxN2U3OGEsIAorCTB4NzkzMDU5NWYsIDB4Nzk0OGM5OTAsIDB4Nzk2MTM4MWQsIDB4Nzk3OWE1MDYsIAorCTB4Nzk5MjEwNGMsIDB4NzlhYTc5ZjAsIDB4NzljMmUxZjEsIDB4NzlkYjQ4NTIsIAorCTB4NzlmM2FkMTEsIDB4N2EwYzEwMzEsIDB4N2EyNDcxYjAsIDB4N2EzY2QxOTEsIAorCTB4N2E1NTJmZDMsIDB4N2E2ZDhjNzYsIDB4N2E4NWU3N2QsIDB4N2E5ZTQwZTYsIAorCTB4N2FiNjk4YjIsIDB4N2FjZWVlZTMsIDB4N2FlNzQzNzgsIDB4N2FmZjk2NzMsIAorCTB4N2IxN2U3ZDIsIDB4N2IzMDM3OTksIDB4N2I0ODg1YzUsIDB4N2I2MGQyNTksIAorCTB4N2I3OTFkNTUsIDB4N2I5MTY2YjksIDB4N2JhOWFlODYsIDB4N2JjMWY0YmMsIAorCTB4N2JkYTM5NWMsIDB4N2JmMjdjNjYsIDB4N2MwYWJkZGIsIDB4N2MyMmZkYmIsIAorCTB4N2MzYjNjMDcsIDB4N2M1Mzc4YzAsIDB4N2M2YmIzZTUsIDB4N2M4M2VkNzgsIAorCTB4N2M5YzI1NzksIDB4N2NiNDViZTksIDB4N2NjYzkwYzcsIDB4N2NlNGM0MTQsIAorCTB4N2NmY2Y1ZDIsIDB4N2QxNTI2MDAsIDB4N2QyZDU0OWYsIDB4N2Q0NTgxYjAsIAorCTB4N2Q1ZGFkMzIsIDB4N2Q3NWQ3MjcsIDB4N2Q4ZGZmOGYsIDB4N2RhNjI2NmEsIAorCTB4N2RiZTRiYmEsIDB4N2RkNjZmN2QsIDB4N2RlZTkxYjYsIDB4N2UwNmIyNjQsIAorCTB4N2UxZWQxODgsIDB4N2UzNmVmMjIsIDB4N2U0ZjBiMzQsIDB4N2U2NzI1YmQsIAorCTB4N2U3ZjNlYmQsIDB4N2U5NzU2MzYsIDB4N2VhZjZjMjgsIDB4N2VjNzgwOTMsIAorCTB4N2VkZjkzNzgsIDB4N2VmN2E0ZDcsIDB4N2YwZmI0YjEsIDB4N2YyN2MzMDcsIAorCTB4N2YzZmNmZDgsIDB4N2Y1N2RiMjUsIDB4N2Y2ZmU0ZWYsIDB4N2Y4N2VkMzYsIAorCTB4N2Y5ZmYzZmIsIDB4N2ZiN2Y5M2UsIDB4N2ZjZmZjZmYsIDB4N2ZlN2ZmNDAKK307CisKK2NvbnN0IFdvcmQzMiBtVGFiXzRfM1s1MTJdPXsKKwkweDMyY2JmZDRhLCAweDMyZWRkZDcwLCAweDMzMGZjMzM5LCAweDMzMzFhZWEzLCAKKwkweDMzNTM5ZmFjLCAweDMzNzU5NjUyLCAweDMzOTc5Mjk0LCAweDMzYjk5NDcwLCAKKwkweDMzZGI5YmU0LCAweDMzZmRhOGVkLCAweDM0MWZiYjhiLCAweDM0NDFkM2JiLCAKKwkweDM0NjNmMTdjLCAweDM0ODYxNGNjLCAweDM0YTgzZGE4LCAweDM0Y2E2YzEwLCAKKwkweDM0ZWNhMDAxLCAweDM1MGVkOTc5LCAweDM1MzExODc3LCAweDM1NTM1Y2ZhLCAKKwkweDM1NzVhNmZlLCAweDM1OTdmNjgzLCAweDM1YmE0Yjg3LCAweDM1ZGNhNjA3LCAKKwkweDM1ZmYwNjAzLCAweDM2MjE2Yjc4LCAweDM2NDNkNjY1LCAweDM2NjY0NmM3LCAKKwkweDM2ODhiYzllLCAweDM2YWIzN2U4LCAweDM2Y2RiOGEyLCAweDM2ZjAzZWNiLCAKKwkweDM3MTJjYTYyLCAweDM3MzU1YjY0LCAweDM3NTdmMWQxLCAweDM3N2E4ZGE1LCAKKwkweDM3OWQyZWUwLCAweDM3YmZkNTgwLCAweDM3ZTI4MTg0LCAweDM4MDUzMmU4LCAKKwkweDM4MjdlOWFkLCAweDM4NGFhNWQwLCAweDM4NmQ2NzRmLCAweDM4OTAyZTJhLCAKKwkweDM4YjJmYTVkLCAweDM4ZDVjYmU5LCAweDM4ZjhhMmNhLCAweDM5MWI3ZWZmLCAKKwkweDM5M2U2MDg4LCAweDM5NjE0NzYxLCAweDM5ODQzMzhhLCAweDM5YTcyNTAxLCAKKwkweDM5Y2ExYmM0LCAweDM5ZWQxN2QxLCAweDNhMTAxOTI4LCAweDNhMzMxZmM2LCAKKwkweDNhNTYyYmFhLCAweDNhNzkzY2QyLCAweDNhOWM1MzNkLCAweDNhYmY2ZWU5LCAKKwkweDNhZTI4ZmQ1LCAweDNiMDViNWZmLCAweDNiMjhlMTY1LCAweDNiNGMxMjA2LCAKKwkweDNiNmY0N2UwLCAweDNiOTI4MmYyLCAweDNiYjVjMzNhLCAweDNiZDkwOGI3LCAKKwkweDNiZmM1MzY4LCAweDNjMWZhMzQ5LCAweDNjNDJmODViLCAweDNjNjY1MjljLCAKKwkweDNjODliMjA5LCAweDNjYWQxNmEyLCAweDNjZDA4MDY1LCAweDNjZjNlZjUxLCAKKwkweDNkMTc2MzY0LCAweDNkM2FkYzljLCAweDNkNWU1YWY4LCAweDNkODFkZTc3LCAKKwkweDNkYTU2NzE3LCAweDNkYzhmNGQ2LCAweDNkZWM4N2I0LCAweDNlMTAxZmFlLCAKKwkweDNlMzNiY2MzLCAweDNlNTc1ZWYyLCAweDNlN2IwNjNhLCAweDNlOWViMjk4LCAKKwkweDNlYzI2NDBjLCAweDNlZTYxYTkzLCAweDNmMDlkNjJkLCAweDNmMmQ5NmQ4LCAKKwkweDNmNTE1YzkzLCAweDNmNzUyNzViLCAweDNmOThmNzMxLCAweDNmYmNjYzExLCAKKwkweDNmZTBhNWZjLCAweDQwMDQ4NGVmLCAweDQwMjg2OGVhLCAweDQwNGM1MWU5LCAKKwkweDQwNzAzZmVlLCAweDQwOTQzMmY1LCAweDQwYjgyYWZkLCAweDQwZGMyODA2LCAKKwkweDQxMDAyYTBkLCAweDQxMjQzMTExLCAweDQxNDgzZDEyLCAweDQxNmM0ZTBkLCAKKwkweDQxOTA2NDAxLCAweDQxYjQ3ZWVkLCAweDQxZDg5ZWNmLCAweDQxZmNjM2E3LCAKKwkweDQyMjBlZDcyLCAweDQyNDUxYzMwLCAweDQyNjk0ZmRlLCAweDQyOGQ4ODdkLCAKKwkweDQyYjFjNjA5LCAweDQyZDYwODgzLCAweDQyZmE0ZmU4LCAweDQzMWU5YzM3LCAKKwkweDQzNDJlZDcwLCAweDQzNjc0MzkwLCAweDQzOGI5ZTk2LCAweDQzYWZmZTgyLCAKKwkweDQzZDQ2MzUxLCAweDQzZjhjZDAzLCAweDQ0MWQzYjk1LCAweDQ0NDFhZjA4LCAKKwkweDQ0NjYyNzU4LCAweDQ0OGFhNDg3LCAweDQ0YWYyNjkwLCAweDQ0ZDNhZDc1LCAKKwkweDQ0ZjgzOTMzLCAweDQ1MWNjOWM4LCAweDQ1NDE1ZjM1LCAweDQ1NjVmOTc3LCAKKwkweDQ1OGE5ODhkLCAweDQ1YWYzYzc2LCAweDQ1ZDNlNTMxLCAweDQ1Zjg5MmJjLCAKKwkweDQ2MWQ0NTE2LCAweDQ2NDFmYzNlLCAweDQ2NjZiODMyLCAweDQ2OGI3OGYyLCAKKwkweDQ2YjAzZTdjLCAweDQ2ZDUwOGNmLCAweDQ2ZjlkN2U5LCAweDQ3MWVhYmNhLCAKKwkweDQ3NDM4NDcwLCAweDQ3Njg2MWQ5LCAweDQ3OGQ0NDA2LCAweDQ3YjIyYWYzLCAKKwkweDQ3ZDcxNmExLCAweDQ3ZmMwNzBlLCAweDQ4MjBmYzM5LCAweDQ4NDVmNjIwLCAKKwkweDQ4NmFmNGMzLCAweDQ4OGZmODIwLCAweDQ4YjUwMDM1LCAweDQ4ZGEwZDAzLCAKKwkweDQ4ZmYxZTg3LCAweDQ5MjQzNGMwLCAweDQ5NDk0ZmFkLCAweDQ5NmU2ZjRkLCAKKwkweDQ5OTM5MzlmLCAweDQ5YjhiY2EyLCAweDQ5ZGRlYTU0LCAweDRhMDMxY2I0LCAKKwkweDRhMjg1M2MxLCAweDRhNGQ4ZjdhLCAweDRhNzJjZmRlLCAweDRhOTgxNGViLCAKKwkweDRhYmQ1ZWExLCAweDRhZTJhY2ZkLCAweDRiMDgwMDAwLCAweDRiMmQ1N2E4LCAKKwkweDRiNTJiM2YzLCAweDRiNzgxNGUxLCAweDRiOWQ3YTcwLCAweDRiYzJlNDlmLCAKKwkweDRiZTg1MzZlLCAweDRjMGRjNmRiLCAweDRjMzMzZWU0LCAweDRjNThiYjg5LCAKKwkweDRjN2UzY2M5LCAweDRjYTNjMmEyLCAweDRjYzk0ZDE0LCAweDRjZWVkYzFjLCAKKwkweDRkMTQ2ZmJiLCAweDRkM2EwN2VmLCAweDRkNWZhNGI2LCAweDRkODU0NjExLCAKKwkweDRkYWFlYmZkLCAweDRkZDA5Njc5LCAweDRkZjY0NTg1LCAweDRlMWJmOTFmLCAKKwkweDRlNDFiMTQ2LCAweDRlNjc2ZGZhLCAweDRlOGQyZjM4LCAweDRlYjJmNTAxLCAKKwkweDRlZDhiZjUyLCAweDRlZmU4ZTJiLCAweDRmMjQ2MThhLCAweDRmNGEzOTcwLCAKKwkweDRmNzAxNWQ5LCAweDRmOTVmNmM2LCAweDRmYmJkYzM2LCAweDRmZTFjNjI2LCAKKwkweDUwMDdiNDk3LCAweDUwMmRhNzg3LCAweDUwNTM5ZWY1LCAweDUwNzk5YWUxLCAKKwkweDUwOWY5YjQ4LCAweDUwYzVhMDJhLCAweDUwZWJhOTg1LCAweDUxMTFiNzVhLCAKKwkweDUxMzdjOWE2LCAweDUxNWRlMDY5LCAweDUxODNmYmEyLCAweDUxYWExYjRmLCAKKwkweDUxZDAzZjcwLCAweDUxZjY2ODAzLCAweDUyMWM5NTA4LCAweDUyNDJjNjdkLCAKKwkweDUyNjhmYzYyLCAweDUyOGYzNmI1LCAweDUyYjU3NTc1LCAweDUyZGJiOGEyLCAKKwkweDUzMDIwMDNhLCAweDUzMjg0YzNjLCAweDUzNGU5Y2E4LCAweDUzNzRmMTdjLCAKKwkweDUzOWI0YWI3LCAweDUzYzFhODU4LCAweDUzZTgwYTVmLCAweDU0MGU3MGNhLCAKKwkweDU0MzRkYjk4LCAweDU0NWI0YWM4LCAweDU0ODFiZTVhLCAweDU0YTgzNjRiLCAKKwkweDU0Y2ViMjljLCAweDU0ZjUzMzRjLCAweDU1MWJiODU4LCAweDU1NDI0MWMxLCAKKwkweDU1NjhjZjg1LCAweDU1OGY2MWEzLCAweDU1YjVmODFiLCAweDU1ZGM5MmViLCAKKwkweDU2MDMzMjEyLCAweDU2MjlkNTkwLCAweDU2NTA3ZDYzLCAweDU2NzcyOThhLCAKKwkweDU2OWRkYTA1LCAweDU2YzQ4ZWQzLCAweDU2ZWI0N2YyLCAweDU3MTIwNTYyLCAKKwkweDU3MzhjNzIxLCAweDU3NWY4ZDJmLCAweDU3ODY1NzhhLCAweDU3YWQyNjMzLCAKKwkweDU3ZDNmOTI3LCAweDU3ZmFkMDY2LCAweDU4MjFhYmVmLCAweDU4NDg4YmMwLCAKKwkweDU4NmY2ZmRhLCAweDU4OTY1ODNiLCAweDU4YmQ0NGUyLCAweDU4ZTQzNWNlLCAKKwkweDU5MGIyYWZmLCAweDU5MzIyNDczLCAweDU5NTkyMjI5LCAweDU5ODAyNDIwLCAKKwkweDU5YTcyYTU5LCAweDU5Y2UzNGQwLCAweDU5ZjU0Mzg3LCAweDVhMWM1NjdiLCAKKwkweDVhNDM2ZGFjLCAweDVhNmE4OTE5LCAweDVhOTFhOGMxLCAweDVhYjhjY2EzLCAKKwkweDVhZGZmNGJlLCAweDViMDcyMTExLCAweDViMmU1MTljLCAweDViNTU4NjVlLCAKKwkweDViN2NiZjU0LCAweDViYTNmYzgwLCAweDViY2IzZGRmLCAweDViZjI4MzcxLCAKKwkweDVjMTljZDM1LCAweDVjNDExYjJhLCAweDVjNjg2ZDRmLCAweDVjOGZjM2E0LCAKKwkweDVjYjcxZTI3LCAweDVjZGU3Y2Q3LCAweDVkMDVkZmI0LCAweDVkMmQ0NmJkLCAKKwkweDVkNTRiMWYwLCAweDVkN2MyMTRlLCAweDVkYTM5NGQ0LCAweDVkY2IwYzgzLCAKKwkweDVkZjI4ODU5LCAweDVlMWEwODU2LCAweDVlNDE4Yzc4LCAweDVlNjkxNGJlLCAKKwkweDVlOTBhMTI5LCAweDVlYjgzMWI3LCAweDVlZGZjNjY3LCAweDVmMDc1ZjM4LCAKKwkweDVmMmVmYzI5LCAweDVmNTY5ZDNhLCAweDVmN2U0MjZhLCAweDVmYTVlYmI3LCAKKwkweDVmY2Q5OTIxLCAweDVmZjU0YWE4LCAweDYwMWQwMDRhLCAweDYwNDRiYTA2LCAKKwkweDYwNmM3N2RjLCAweDYwOTQzOWNhLCAweDYwYmJmZmQwLCAweDYwZTNjOWVlLCAKKwkweDYxMGI5ODIxLCAweDYxMzM2YTZhLCAweDYxNWI0MGM4LCAweDYxODMxYjM5LCAKKwkweDYxYWFmOWJkLCAweDYxZDJkYzUzLCAweDYxZmFjMmZhLCAweDYyMjJhZGIyLCAKKwkweDYyNGE5Yzc5LCAweDYyNzI4ZjRmLCAweDYyOWE4NjMzLCAweDYyYzI4MTIzLCAKKwkweDYyZWE4MDIwLCAweDYzMTI4MzI5LCAweDYzM2E4YTNjLCAweDYzNjI5NTU5LCAKKwkweDYzOGFhNDdmLCAweDYzYjJiN2FkLCAweDYzZGFjZWUyLCAweDY0MDJlYTFlLCAKKwkweDY0MmIwOTYwLCAweDY0NTMyY2E2LCAweDY0N2I1M2YxLCAweDY0YTM3ZjNmLCAKKwkweDY0Y2JhZThmLCAweDY0ZjNlMWUyLCAweDY1MWMxOTM1LCAweDY1NDQ1NDg4LCAKKwkweDY1NmM5M2RiLCAweDY1OTRkNzJjLCAweDY1YmQxZTdiLCAweDY1ZTU2OWM3LCAKKwkweDY2MGRiOTBmLCAweDY2MzYwYzUzLCAweDY2NWU2MzkxLCAweDY2ODZiZWM5LCAKKwkweDY2YWYxZGZhLCAweDY2ZDc4MTIzLCAweDY2ZmZlODQ0LCAweDY3Mjg1MzViLCAKKwkweDY3NTBjMjY4LCAweDY3NzkzNTZiLCAweDY3YTFhYzYyLCAweDY3Y2EyNzRjLCAKKwkweDY3ZjJhNjI5LCAweDY4MWIyOGY5LCAweDY4NDNhZmI5LCAweDY4NmMzYTZhLCAKKwkweDY4OTRjOTBiLCAweDY4YmQ1YjliLCAweDY4ZTVmMjE5LCAweDY5MGU4Yzg0LCAKKwkweDY5MzcyYWRkLCAweDY5NWZjZDIxLCAweDY5ODg3MzUwLCAweDY5YjExZDZhLCAKKwkweDY5ZDljYjZkLCAweDZhMDI3ZDVhLCAweDZhMmIzMzJmLCAweDZhNTNlY2ViLCAKKwkweDZhN2NhYThkLCAweDZhYTU2YzE2LCAweDZhY2UzMTg0LCAweDZhZjZmYWQ2LCAKKwkweDZiMWZjODBjLCAweDZiNDg5OTI1LCAweDZiNzE2ZTIwLCAweDZiOWE0NmZkLCAKKwkweDZiYzMyM2JiLCAweDZiZWMwNDU4LCAweDZjMTRlOGQ1LCAweDZjM2RkMTMwLCAKKwkweDZjNjZiZDY5LCAweDZjOGZhZDgwLCAweDZjYjhhMTcyLCAweDZjZTE5OTQwLCAKKwkweDZkMGE5NGU5LCAweDZkMzM5NDZkLCAweDZkNWM5N2NhLCAweDZkODU5ZWZmLCAKKwkweDZkYWVhYTBkLCAweDZkZDdiOGYxLCAweDZlMDBjYmFkLCAweDZlMjllMjNlLCAKKwkweDZlNTJmY2E0LCAweDZlN2MxYWRmLCAweDZlYTUzY2VlLCAweDZlY2U2MmNmLCAKKwkweDZlZjc4YzgzLCAweDZmMjBiYTA5LCAweDZmNDllYjVmLCAweDZmNzMyMDg1LCAKKwkweDZmOWM1OTdiLCAweDZmYzU5NjQwLCAweDZmZWVkNmQzLCAweDcwMTgxYjMzLCAKKwkweDcwNDE2MzYwLCAweDcwNmFhZjU5LCAweDcwOTNmZjFkLCAweDcwYmQ1MmFiLCAKKwkweDcwZTZhYTA0LCAweDcxMTAwNTI1LCAweDcxMzk2NDBmLCAweDcxNjJjNmMxLCAKKwkweDcxOGMyZDNhLCAweDcxYjU5NzdhLCAweDcxZGYwNTdmLCAweDcyMDg3NzQ5LCAKKwkweDcyMzFlY2Q4LCAweDcyNWI2NjJhLCAweDcyODRlMzNmLCAweDcyYWU2NDE3LCAKKwkweDcyZDdlOGIwLCAweDczMDE3MTBhLCAweDczMmFmZDI0LCAweDczNTQ4Y2ZlLCAKKwkweDczN2UyMDk3LCAweDczYTdiN2VlLCAweDczZDE1MzAzLCAweDczZmFmMWQ1LCAKKwkweDc0MjQ5NDYyLCAweDc0NGUzYWFjLCAweDc0NzdlNGIwLCAweDc0YTE5MjZlLCAKKwkweDc0Y2I0M2U2LCAweDc0ZjRmOTE3LCAweDc1MWViMjAxLCAweDc1NDg2ZWExLCAKKwkweDc1NzIyZWY5LCAweDc1OWJmMzA3LCAweDc1YzViYWNhLCAweDc1ZWY4NjQyLCAKKwkweDc2MTk1NTZmLCAweDc2NDMyODRmLCAweDc2NmNmZWUyLCAweDc2OTZkOTI4LCAKKwkweDc2YzBiNzFmLCAweDc2ZWE5OGM3LCAweDc3MTQ3ZTIwLCAweDc3M2U2NzI4LCAKKwkweDc3Njg1M2RmLCAweDc3OTI0NDQ1LCAweDc3YmMzODU4LCAweDc3ZTYzMDE5LCAKKwkweDc4MTAyYjg1LCAweDc4M2EyYTllLCAweDc4NjQyZDYyLCAweDc4OGUzM2QxLCAKKwkweDc4YjgzZGU5LCAweDc4ZTI0YmFiLCAweDc5MGM1ZDE1LCAweDc5MzY3MjI4LCAKKwkweDc5NjA4YWUxLCAweDc5OGFhNzQyLCAweDc5YjRjNzQ4LCAweDc5ZGVlYWY0LCAKKwkweDdhMDkxMjQ1LCAweDdhMzMzZDNhLCAweDdhNWQ2YmQyLCAweDdhODc5ZTBlLCAKKwkweDdhYjFkM2VjLCAweDdhZGMwZDZiLCAweDdiMDY0YThjLCAweDdiMzA4YjRkLCAKKwkweDdiNWFjZmFlLCAweDdiODUxN2FlLCAweDdiYWY2MzRjLCAweDdiZDliMjg5LCAKKwkweDdjMDQwNTYzLCAweDdjMmU1YmRhLCAweDdjNThiNWVjLCAweDdjODMxMzliLCAKKwkweDdjYWQ3NGU0LCAweDdjZDdkOWM3LCAweDdkMDI0MjQ0LCAweDdkMmNhZTVhLCAKKwkweDdkNTcxZTA5LCAweDdkODE5MTRmLCAweDdkYWMwODJkLCAweDdkZDY4MmExLCAKKwkweDdlMDEwMGFjLCAweDdlMmI4MjRiLCAweDdlNTYwNzgwLCAweDdlODA5MDQ4LCAKKwkweDdlYWIxY2E1LCAweDdlZDVhYzk0LCAweDdmMDA0MDE1LCAweDdmMmFkNzI5LCAKKwkweDdmNTU3MWNkLCAweDdmODAxMDAzLCAweDdmYWFiMWM4LCAweDdmZDU1NzFkCit9OworCisNCitjb25zdCBXb3JkMzIgaW52U0JGWzI0XSA9IHsNCisgIDB4M0ZGRDM0RkMsIDB4MkQzRjgwMDAsIDB4MjRGMThDN0UsIDB4MUZGRTlBN0UsIA0KKyAgMHgxQzlERjEwQywgMHgxQTFGODUxQSwgMHgxODJGRTk5NCwgMHgxNjlGQzAwMCwgDQorICAweDE1NTQyQUFBLCAweDE0M0MzMUMyLCAweDEzNEIxQjZDLCAweDEyNzkyMEJFLCANCisgIDB4MTFCRjJGQ0MsIDB4MTExQTc0OUUsIDB4MTA4NUZDNDIsIDB4MEZGRkE3QkUsIA0KKyAgMHgwRjg1NTgxOCwgMHgwRjE0RUU1NiwgMHgwRUFFNkE3OCwgMHgwRTRFRjg4NiwgDQorICAweDBERjY5ODgwLCAweDBEQTQ5NTY4LCAweDBENTc4NTQyLCAweDBEMTAxRDBDDQorfTsNCisKK2NvbnN0IFdvcmQxNiBwb3cydG9taW51c05vdmVyMTZbMTddID0geworICAweDdmZmYsIDB4N2E5MywgMHg3NTYwLCAweDcwNjYsCisgIDB4NmJhMiwgMHg2NzEyLCAweDYyYjQsIDB4NWU4NCwKKyAgMHg1YTgyLCAweDU2YWMsIDB4NTJmZiwgMHg0ZjdiLAorICAweDRjMWMsIDB4NDhlMiwgMHg0NWNiLCAweDQyZDUsCisgIDB4NDAwMAorfTsNCisNCitjb25zdCBXb3JkMTYgc2lkZUluZm9UYWJMb25nW01BWF9TRkJfTE9ORyArIDFdID0gew0KKyAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgDQorICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCANCisgIDksIDksIDksIDksIDksIDksIDksIDksIDksIA0KKyAgOSwgOSwgOSwgOSwgMTQsIDE0LCAxNCwgMTQsIA0KKyAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIA0KKyAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIA0KKyAgMTQsIDE0LCAxNA0KK307DQorDQorY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiU2hvcnRbTUFYX1NGQl9TSE9SVCArIDFdID0gew0KKyAgNywgNywgNywgNywgNywgNywgNywgMTAsIDEwLCANCisgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTMsIDEzDQorfTsKKworV29yZDMyIHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1s0XVsxNF0gPQoreworICB7MHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgCisgICAweDUwYTI4YmU2LCAgMHg2NTk3ZmE5NSwgIDB4NDAwMDAwMDAsICAweDUwYTI4YmU2LCAKKyAgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsIAorICAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTZ9LCAKKworICB7MHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwgCisgICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlLCAKKyAgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsIAorICAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWV9LCAKKworICB7MHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgCisgICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAKKyAgIDB4NDdkNjZiMGYsICAweDVhODI3OTlhLCAgMHg3MjA4ZjgxZCwgIDB4NDdkNjZiMGYsIAorICAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWR9LCAKKworICB7MHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgCisgICAweDQzY2UzZTRiLCAgMHg1NTZlMDQyNCwgIDB4NmJhMjdlNjUsICAweDQzY2UzZTRiLCAKKyAgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsIAorICAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGJ9Cit9OworCitjb25zdCAgVVdvcmQ4IHNwZWNFeHBUYWJsZUNvbWJfZW5jWzRdWzE0XSA9Cit7CisgIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCisgIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCisgIHsxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOH0sCisgIHsxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOX0KK307CisKK2NvbnN0IFdvcmQxNiBxdWFudEJvcmRlcnNbNF1bNF0gPSB7DQorICAvKiBwb3coMS4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8NCisgIHsweDA0MDAsIDB4MGVlNywgMHgxYzg2LCAweDJjMGR9LA0KKyAgLyogcG93KDIuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovDQorICB7MHgwNGMyLCAweDExYjksIDB4MjFlYiwgMHgzNDYzfSwNCisgIC8qIHBvdygzLjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLw0KKyAgezB4MDVhOCwgMHgxNTE0LCAweDI4NTYsIDB4M2U0Y30sDQorICAvKiBwb3coNC4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8NCisgIHsweDA2YmEsIDB4MTkxMSwgMHgyZmY4LCAweDRhMTZ9LA0KK307DQorCitjb25zdCBXb3JkMTYgcXVhbnRSZWNvbls0XVszXSA9IHsNCisgIHsweDA4MDAsIDB4MTQyOSwgMHgyMjlkfSwNCisgIHsweDA5ODMsIDB4MTdmOSwgMHgyOTJhfSwNCisgIHsweDBiNTAsIDB4MWM4MiwgMHgzMGY0fSwNCisgIHsweDBkNzQsIDB4MjFlNywgMHgzYTM3fSwNCit9OworCitjb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU10gPSB7DQorICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIA0KKwkyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsICA4MDAwDQorfTsKKworCitjb25zdCBpbnQJcmF0ZXNbOF0gPSB7CQkNCisJMTYwLCAyNDAsIDMyMCwgNDAwLCA0ODAsIDU2MCwgNjQwLCAwDQorfTsNCisKK2NvbnN0IGludCBCYW5kd2l0aENvZWZUYWJbOF1bTlVNX1NBTVBMRV9SQVRFU10gPSB7CisJeyA3MDAwLCAgNzAwMCwgIDQ2NjYsICAzNTAwLCAgMzUwMCwgIDI4MDAsICAyODAwLCAgMjgwMCwgIDI4MDAsICAyMDAwLCAgMjAwMCwgIDIwMDB9LAorCXsxMjAwMCwgMTIwMDAsICA4MDAwLCAgNjAwMCwgIDYwMDAsICA2MDAwLCAgNDAwMCwgIDQwMDAsICA0MDAwLCAgMzAwMCwgIDMwMDAsICAzMDAwfSwKKwl7MTgwMDAsIDE4MDAwLCAxMjAwMCwgIDkwMDAsICA5MDAwLCAgOTAwMCwgIDcwMDAsICA3MDAwLCAgNzAwMCwgIDUwMDAsICA1MDAwLCAgNTAwMH0sCisJezIwMDAwLCAyMDAwMCwgMTYwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsICA5MDAwLCAgOTAwMCwgIDkwMDAsICA2MDAwLCAgNjAwMCwgIDYwMDB9LAorCXsyMDAwMCwgMjAwMDAsIDE4NjY2LCAxNDAwMCwgMTQwMDAsIDE0MDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCAgNzAwMCwgIDcwMDAsICA3MDAwfSwKKwl7MjAwMDAsIDIwMDAwLCAyMDAwMCwgMTYwMDAsIDE2MDAwLCAxNjAwMCwgMTIwMDAsIDEyMDAwLCAxMjAwMCwgIDgwMDAsICA4MDAwLCAgODAwMH0sCisJezIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDE1MDAwLCAxNTAwMCwgMTUwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDB9LAorCXsyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwfQorfTsKKworCisvKiB0b3RhbCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzIGluIG9uZSB3aW5kb3cgKi8NCitjb25zdCBVV29yZDggc2ZCYW5kVG90YWxTaG9ydFtOVU1fU0FNUExFX1JBVEVTXSA9IHsNCisgICAgMTIsIDEyLCAxMiwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNQ0KK307DQorDQorY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsTG9uZ1tOVU1fU0FNUExFX1JBVEVTXSA9IHsNCisgICAgNDEsIDQxLCA0NywgNDksIDQ5LCA1MSwgNDcsIDQ3LCA0MywgNDMsIDQzLCA0MA0KK307DQorDQorLyogc2NhbGUgZmFjdG9yIGJhbmQgdGFibGVzICovDQorY29uc3QgaW50IHNmQmFuZFRhYlNob3J0T2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdID0gezAsIDAsIDAsIDEzLCAxMywgMTMsIDI4LCAyOCwgNDQsIDQ0LCA0NCwgNjB9Ow0KKw0KK2NvbnN0IHNob3J0IHNmQmFuZFRhYlNob3J0Wzc2XSA9IHsNCisJLyogc2hvcnQgYmxvY2sgNjQsIDg4LCA5NiBrSHogWzEzXSAgKi8NCisJMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOCwNCisNCisJLyogc2hvcnQgYmxvY2sgMzIsIDQ0LCA0OCBrSHogWzE1XSAgKi8NCisJMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyOCwgIDM2LCAgNDQsICA1NiwgIDY4LCAgODAsICA5NiwgMTEyLCAxMjgsDQorDQorCS8qIHNob3J0IGJsb2NrIDIyLCAyNCBrSHogWzE2XSAgKi8NCisJMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzYsICA0NCwgIDUyLCAgNjQsICA3NiwgIDkyLCAxMDgsIDEyOCwNCisNCisJLyogc2hvcnQgYmxvY2sgMTEsIDEyLCAxNiBrSHogWzE2XSAqLw0KKwkwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDQwLCAgNDgsICA2MCwgIDcyLCAgODgsIDEwOCwgMTI4LA0KKw0KKwkvKiBzaG9ydCBibG9jayA4IGtIeiBbMTZdICovDQorCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDM2LCAgNDQsICA1MiwgIDYwLCAgNzIsICA4OCwgMTA4LCAxMjgNCit9Ow0KKw0KK2NvbnN0IGludCBzZkJhbmRUYWJMb25nT2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdID0gezAsIDAsIDQyLCA5MCwgOTAsIDE0MCwgMTkyLCAxOTIsIDI0MCwgMjQwLCAyNDAsIDI4NH07DQorDQorY29uc3Qgc2hvcnQgc2ZCYW5kVGFiTG9uZ1szMjVdID0gew0KKwkvKiBsb25nIGJsb2NrIDg4LCA5NiBrSHogWzQyXSAgKi8NCisJICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgIDUyLA0KKwkgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsICAyMTIsDQorCTI0MCwgMjc2LCAzMjAsIDM4NCwgNDQ4LCA1MTIsIDU3NiwgNjQwLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNCwNCisNCisJLyogbG9uZyBibG9jayA2NCBrSHogWzQ4XSAgKi8NCisJICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgNTIsICA1NiwgICA2NCwNCisJIDcyLCAgODAsICA4OCwgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgIDM4NCwNCisJNDI0LCA0NjQsIDUwNCwgNTQ0LCA1ODQsIDYyNCwgNjY0LCA3MDQsIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk4NCwgMTAyNCwNCisNCisJLyogbG9uZyBibG9jayA0NCwgNDgga0h6IFs1MF0gKi8NCisJICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgICA4MCwgIDg4LA0KKwkgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCAgNDE2LCA0NDgsDQorCTQ4MCwgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDEwMjQsDQorDQorCS8qIGxvbmcgYmxvY2sgMzIga0h6IFs1Ml0gKi8NCisJICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgICA4MCwgIDg4LCAgOTYsDQorCTEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCA0MTYsICA0NDgsIDQ4MCwgNTEyLA0KKwk1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MCwgOTkyLCAxMDI0LA0KKw0KKwkvKiBsb25nIGJsb2NrIDIyLCAyNCBrSHogWzQ4XSAqLw0KKwkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwgIDY4LCAgIDc2LA0KKwkgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAgMjg0LA0KKwkzMDgsIDMzNiwgMzY0LCAzOTYsIDQzMiwgNDY4LCA1MDgsIDU1MiwgNjAwLCA2NTIsIDcwNCwgNzY4LCA4MzIsIDg5NiwgOTYwLCAxMDI0LA0KKw0KKwkvKiBsb25nIGJsb2NrIDExLCAxMiwgMTYga0h6IFs0NF0gKi8NCisJICAwLCAgIDgsICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgMTAwLCAgMTEyLCAxMjQsDQorCTEzNiwgMTQ4LCAxNjAsIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsIDI2MCwgMjgwLCAzMDAsIDMyMCwgIDM0NCwgMzY4LA0KKwkzOTYsIDQyNCwgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LCA5NjAsIDEwMjQsDQorDQorCS8qIGxvbmcgYmxvY2sgOCBrSHogWzQxXSAgKi8NCisJICAwLCAgMTIsICAyNCwgIDM2LCAgNDgsICA2MCwgIDcyLCAgODQsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTU2LA0KKwkxNzIsIDE4OCwgMjA0LCAyMjAsIDIzNiwgMjUyLCAyNjgsIDI4OCwgMzA4LCAzMjgsIDM0OCwgMzcyLCAgMzk2LCA0MjAsDQorCTQ0OCwgNDc2LCA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgNzEyLCA3NjQsIDgyMCwgODgwLCA5NDQsIDEwMjQNCit9Ow0KKworLyoKKyAgdGhlc2UgdGFibGVzIGFyZSB1c2VkIG9ubHkgZm9yIGNvdW50aW5nIGFuZCAKKyAgYXJlIHN0b3JlZCBpbiBwYWNrZWQgZm9ybWF0CisqLworY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxXzJbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7CisgICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAorICAgICAgezB4MGEwOCwweDA3MDYsMHgwYTA4fSwKKyAgICAgIHsweDBiMDksMHgwOTA4LDB4MGIwOX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDBhMDgsMHgwNzA2LDB4MGEwN30sCisgICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAorICAgICAgezB4MDkwNywweDA3MDYsMHgwYTA4fQorICAgIH0sCisgICAgeworICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA4fSwKKyAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwOH0sCisgICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA3fSwKKyAgICAgIHsweDA3MDYsMHgwNTA1LDB4MDcwNn0sCisgICAgICB7MHgwOTA3LDB4MDcwNiwweDA5MDh9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAorICAgICAgezB4MDUwNSwweDAxMDMsMHgwNTA1fSwKKyAgICAgIHsweDA3MDYsMHgwNTA1LDB4MDcwNn0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwN30sCisgICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAorICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA4fQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOX0sCisgICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDh9LAorICAgICAgezB4MGIwOCwweDA5MDcsMHgwYjA5fQorICAgIH0sCisgICAgeworICAgICAgezB4MGEwOCwweDA3MDYsMHgwOTA3fSwKKyAgICAgIHsweDA3MDYsMHgwNTA0LDB4MDcwNn0sCisgICAgICB7MHgwOTA4LDB4MDcwNiwweDBhMDd9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAorICAgICAgezB4MGEwNywweDA3MDYsMHgwOTA4fSwKKyAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOX0KKyAgICB9CisgIH0KK307CisKKworY29uc3QgVVdvcmQxNiBodWZmX2x0YWIzXzRbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7CisgICAgICB7MHgwMTA0LDB4MDQwNSwweDA4MDh9LAorICAgICAgezB4MDQwNSwweDA1MDQsMHgwODA4fSwKKyAgICAgIHsweDA5MDksMHgwOTA4LDB4MGEwYn0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA0MDUsMHgwNjA1LDB4MDkwOH0sCisgICAgICB7MHgwNjA1LDB4MDYwNCwweDA5MDh9LAorICAgICAgezB4MDkwOCwweDA5MDcsMHgwYTBhfQorICAgIH0sCisgICAgeworICAgICAgezB4MDkwOSwweDBhMDgsMHgwZDBifSwKKyAgICAgIHsweDA5MDgsMHgwOTA4LDB4MGIwYX0sCisgICAgICB7MHgwYjBiLDB4MGEwYSwweDBjMGJ9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDQwNCwweDA2MDUsMHgwYTA4fSwKKyAgICAgIHsweDA2MDQsMHgwNzA0LDB4MGEwOH0sCisgICAgICB7MHgwYTA4LDB4MGEwOCwweDBjMGF9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwNTA0LDB4MDcwNCwweDBiMDh9LAorICAgICAgezB4MDYwNCwweDA3MDQsMHgwYTA3fSwKKyAgICAgIHsweDA5MDgsMHgwOTA3LDB4MGIwOX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA5MDgsMHgwYTA4LDB4MGQwYX0sCisgICAgICB7MHgwODA3LDB4MDkwNywweDBjMDl9LAorICAgICAgezB4MGEwYSwweDBiMDksMHgwYzBhfQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDA4MDgsMHgwYTA4LDB4MGYwYn0sCisgICAgICB7MHgwOTA4LDB4MGIwNywweDBmMGF9LAorICAgICAgezB4MGQwYiwweDBlMGEsMHgxMDBjfQorICAgIH0sCisgICAgeworICAgICAgezB4MDgwOCwweDBhMDcsMHgwZTBhfSwKKyAgICAgIHsweDA5MDcsMHgwYTA3LDB4MGUwOX0sCisgICAgICB7MHgwYzBhLDB4MGMwOSwweDBmMGJ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwYjBiLDB4MGMwYSwweDEwMGN9LAorICAgICAgezB4MGEwYSwweDBiMDksMHgwZjBifSwKKyAgICAgIHsweDBjMGIsMHgwYzBhLDB4MGYwYn0KKyAgICB9CisgIH0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFiNV82WzldWzldPQoreworICB7MHgwZDBiLDB4MGMwYSwweDBiMDksMHgwYjA5LDB4MGEwOSwweDBiMDksMHgwYjA5LDB4MGMwYSwweDBkMGJ9LAorICB7MHgwYzBhLDB4MGIwOSwweDBhMDgsMHgwOTA3LDB4MDgwNywweDA5MDcsMHgwYTA4LDB4MGIwOSwweDBjMGF9LAorICB7MHgwYzA5LDB4MGEwOCwweDA5MDYsMHgwODA2LDB4MDcwNiwweDA4MDYsMHgwOTA2LDB4MGEwOCwweDBiMDl9LAorICB7MHgwYjA5LDB4MDkwNywweDA4MDYsMHgwNTA0LDB4MDQwNCwweDA1MDQsMHgwODA2LDB4MDkwNywweDBiMDl9LAorICB7MHgwYTA5LDB4MDgwNywweDA3MDYsMHgwNDA0LDB4MDEwNCwweDA0MDQsMHgwNzA2LDB4MDgwNywweDBiMDl9LAorICB7MHgwYjA5LDB4MDkwNywweDA4MDYsMHgwNTA0LDB4MDQwNCwweDA1MDQsMHgwODA2LDB4MDkwNywweDBiMDl9LAorICB7MHgwYjA5LDB4MGEwOCwweDA5MDYsMHgwODA2LDB4MDcwNiwweDA4MDYsMHgwOTA2LDB4MGEwOCwweDBiMDl9LAorICB7MHgwYzBhLDB4MGIwOSwweDBhMDgsMHgwOTA3LDB4MDgwNywweDA5MDcsMHgwYTA3LDB4MGIwOCwweDBjMGF9LAorICB7MHgwZDBiLDB4MGMwYSwweDBjMDksMHgwYjA5LDB4MGEwOSwweDBhMDksMHgwYjA5LDB4MGMwYSwweDBkMGJ9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjdfOFs4XVs4XT0KK3sKKyAgezB4MDEwNSwweDAzMDQsMHgwNjA1LDB4MDcwNiwweDA4MDcsMHgwOTA4LDB4MGEwOSwweDBiMGF9LAorICB7MHgwMzA0LDB4MDQwMywweDA2MDQsMHgwNzA1LDB4MDgwNiwweDA4MDcsMHgwOTA3LDB4MDkwOH0sCisgIHsweDA2MDUsMHgwNjA0LDB4MDcwNCwweDA4MDUsMHgwODA2LDB4MDkwNywweDA5MDcsMHgwYTA4fSwKKyAgezB4MDcwNiwweDA3MDUsMHgwODA1LDB4MDgwNiwweDA5MDYsMHgwOTA3LDB4MGEwOCwweDBhMDh9LAorICB7MHgwODA3LDB4MDgwNiwweDA5MDYsMHgwOTA2LDB4MGEwNywweDBhMDcsMHgwYTA4LDB4MGIwOX0sCisgIHsweDA5MDgsMHgwODA3LDB4MDkwNiwweDA5MDcsMHgwYTA3LDB4MGEwOCwweDBiMDgsMHgwYjBhfSwKKyAgezB4MGEwOSwweDA5MDcsMHgwOTA3LDB4MGEwOCwweDBhMDgsMHgwYjA4LDB4MGMwOSwweDBjMDl9LAorICB7MHgwYjBhLDB4MGEwOCwweDBhMDgsMHgwYTA4LDB4MGIwOSwweDBiMDksMHgwYzA5LDB4MGMwYX0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFiOV8xMFsxM11bMTNdPQoreworICB7MHgwMTA2LDB4MDMwNSwweDA2MDYsMHgwODA2LDB4MDkwNywweDBhMDgsMHgwYTA5LDB4MGIwYSwweDBiMGEsMHgwYzBhLDB4MGMwYiwweDBkMGIsMHgwZDBjfSwKKyAgezB4MDMwNSwweDA0MDQsMHgwNjA0LDB4MDcwNSwweDA4MDYsMHgwODA3LDB4MDkwNywweDBhMDgsMHgwYTA4LDB4MGEwOSwweDBiMGEsMHgwYzBhLDB4MGMwYn0sCisgIHsweDA2MDYsMHgwNjA0LDB4MDcwNSwweDA4MDUsMHgwODA2LDB4MDkwNiwweDBhMDcsMHgwYTA4LDB4MGEwOCwweDBiMDksMHgwYzA5LDB4MGMwYSwweDBjMGF9LAorICB7MHgwODA2LDB4MDcwNSwweDA4MDUsMHgwOTA1LDB4MDkwNiwweDBhMDcsMHgwYTA3LDB4MGIwOCwweDBiMDgsMHgwYjA5LDB4MGMwOSwweDBjMGEsMHgwZDBhfSwKKyAgezB4MDkwNywweDA4MDYsMHgwOTA2LDB4MDkwNiwweDBhMDYsMHgwYTA3LDB4MGIwNywweDBiMDgsMHgwYjA4LDB4MGMwOSwweDBjMDksMHgwYzBhLDB4MGQwYX0sCisgIHsweDBhMDgsMHgwOTA3LDB4MDkwNiwweDBhMDcsMHgwYjA3LDB4MGIwNywweDBiMDgsMHgwYzA4LDB4MGIwOCwweDBjMDksMHgwYzBhLDB4MGQwYSwweDBkMGJ9LAorICB7MHgwYjA5LDB4MDkwNywweDBhMDcsMHgwYjA3LDB4MGIwNywweDBiMDgsMHgwYzA4LDB4MGMwOSwweDBjMDksMHgwYzA5LDB4MGQwYSwweDBkMGEsMHgwZDBifSwKKyAgezB4MGIwOSwweDBhMDgsMHgwYTA4LDB4MGIwOCwweDBiMDgsMHgwYzA4LDB4MGMwOSwweDBkMDksMHgwZDA5LDB4MGQwYSwweDBkMGEsMHgwZDBiLDB4MGQwYn0sCisgIHsweDBiMDksMHgwYTA4LDB4MGEwOCwweDBiMDgsMHgwYjA4LDB4MGIwOCwweDBjMDksMHgwYzA5LDB4MGQwYSwweDBkMGEsMHgwZTBhLDB4MGQwYiwweDBlMGJ9LAorICB7MHgwYjBhLDB4MGEwOSwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGUwYiwweDBlMGIsMHgwZTBjfSwKKyAgezB4MGMwYSwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMDksMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGUwYiwweDBlMGIsMHgwZTBiLDB4MGYwY30sCisgIHsweDBjMGIsMHgwYjBhLDB4MGMwOSwweDBjMGEsMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBlMGIsMHgwZTBiLDB4MGYwYiwweDBmMGN9LAorICB7MHgwZDBiLDB4MGMwYSwweDBjMGEsMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBlMGIsMHgwZTBjLDB4MGUwYywweDBlMGMsMHgwZjBjfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxMVsxN11bMTddPQoreworICB7MHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBjLDB4MDAwYiwweDAwMGMsMHgwMDBjLDB4MDAwYX0sCisgIHsweDAwMDUsMHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDA4fSwKKyAgezB4MDAwNiwweDAwMDUsMHgwMDA1LDB4MDAwNiwweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAorICB7MHgwMDA3LDB4MDAwNiwweDAwMDYsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCisgIHsweDAwMDgsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKKyAgezB4MDAwOCwweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAorICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCisgIHsweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKKyAgezB4MDAwYSwweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMDh9LAorICB7MHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwOH0sCisgIHsweDAwMGIsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDA4fSwKKyAgezB4MDAwYiwweDAwMGEsMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDh9LAorICB7MHgwMDBiLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwOX0sCisgIHsweDAwMGIsMHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA5fSwKKyAgezB4MDAwYiwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDl9LAorICB7MHgwMDBjLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGMsMHgwMDBjLDB4MDAwOX0sCisgIHsweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA1fQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2x0YWJzY2ZbMTIxXT0KK3sKKyAgMHgwMDEyLAorICAweDAwMTIsCisgIDB4MDAxMiwKKyAgMHgwMDEyLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTIsCisgIDB4MDAxMywKKyAgMHgwMDEyLAorICAweDAwMTEsCisgIDB4MDAxMSwKKyAgMHgwMDEwLAorICAweDAwMTEsCisgIDB4MDAxMCwKKyAgMHgwMDEwLAorICAweDAwMTAsCisgIDB4MDAxMCwKKyAgMHgwMDBmLAorICAweDAwMGYsCisgIDB4MDAwZSwKKyAgMHgwMDBlLAorICAweDAwMGUsCisgIDB4MDAwZSwKKyAgMHgwMDBlLAorICAweDAwMGUsCisgIDB4MDAwZCwKKyAgMHgwMDBkLAorICAweDAwMGMsCisgIDB4MDAwYywKKyAgMHgwMDBjLAorICAweDAwMGIsCisgIDB4MDAwYywKKyAgMHgwMDBiLAorICAweDAwMGEsCisgIDB4MDAwYSwKKyAgMHgwMDBhLAorICAweDAwMDksCisgIDB4MDAwOSwKKyAgMHgwMDA4LAorICAweDAwMDgsCisgIDB4MDAwOCwKKyAgMHgwMDA3LAorICAweDAwMDYsCisgIDB4MDAwNiwKKyAgMHgwMDA1LAorICAweDAwMDQsCisgIDB4MDAwMywKKyAgMHgwMDAxLAorICAweDAwMDQsCisgIDB4MDAwNCwKKyAgMHgwMDA1LAorICAweDAwMDYsCisgIDB4MDAwNiwKKyAgMHgwMDA3LAorICAweDAwMDcsCisgIDB4MDAwOCwKKyAgMHgwMDA4LAorICAweDAwMDksCisgIDB4MDAwOSwKKyAgMHgwMDBhLAorICAweDAwMGEsCisgIDB4MDAwYSwKKyAgMHgwMDBiLAorICAweDAwMGIsCisgIDB4MDAwYiwKKyAgMHgwMDBiLAorICAweDAwMGMsCisgIDB4MDAwYywKKyAgMHgwMDBkLAorICAweDAwMGQsCisgIDB4MDAwZCwKKyAgMHgwMDBlLAorICAweDAwMGUsCisgIDB4MDAxMCwKKyAgMHgwMDBmLAorICAweDAwMTAsCisgIDB4MDAwZiwKKyAgMHgwMDEyLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzCit9OworCisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMVszXVszXVszXVszXT0KK3sKKyAgeworICAgIHsKKyAgICAgIHsweDA3ZjgsMHgwMWYxLDB4MDdmZH0sCisgICAgICB7MHgwM2Y1LDB4MDA2OCwweDAzZjB9LAorICAgICAgezB4MDdmNywweDAxZWMsMHgwN2Y1fQorICAgIH0sCisgICAgeworICAgICAgezB4MDNmMSwweDAwNzIsMHgwM2Y0fSwKKyAgICAgIHsweDAwNzQsMHgwMDExLDB4MDA3Nn0sCisgICAgICB7MHgwMWViLDB4MDA2YywweDAzZjZ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwN2ZjLDB4MDFlMSwweDA3ZjF9LAorICAgICAgezB4MDFmMCwweDAwNjEsMHgwMWY2fSwKKyAgICAgIHsweDA3ZjIsMHgwMWVhLDB4MDdmYn0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwMWYyLDB4MDA2OSwweDAxZWR9LAorICAgICAgezB4MDA3NywweDAwMTcsMHgwMDZmfSwKKyAgICAgIHsweDAxZTYsMHgwMDY0LDB4MDFlNX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwNjcsMHgwMDE1LDB4MDA2Mn0sCisgICAgICB7MHgwMDEyLDB4MDAwMCwweDAwMTR9LAorICAgICAgezB4MDA2NSwweDAwMTYsMHgwMDZkfQorICAgIH0sCisgICAgeworICAgICAgezB4MDFlOSwweDAwNjMsMHgwMWU0fSwKKyAgICAgIHsweDAwNmIsMHgwMDEzLDB4MDA3MX0sCisgICAgICB7MHgwMWUzLDB4MDA3MCwweDAxZjN9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDdmZSwweDAxZTcsMHgwN2YzfSwKKyAgICAgIHsweDAxZWYsMHgwMDYwLDB4MDFlZX0sCisgICAgICB7MHgwN2YwLDB4MDFlMiwweDA3ZmF9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwM2YzLDB4MDA2YSwweDAxZTh9LAorICAgICAgezB4MDA3NSwweDAwMTAsMHgwMDczfSwKKyAgICAgIHsweDAxZjQsMHgwMDZlLDB4MDNmN30KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA3ZjYsMHgwMWUwLDB4MDdmOX0sCisgICAgICB7MHgwM2YyLDB4MDA2NiwweDAxZjV9LAorICAgICAgezB4MDdmZiwweDAxZjcsMHgwN2Y0fQorICAgIH0KKyAgfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWIyWzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeworICAgICAgezB4MDFmMywweDAwNmYsMHgwMWZkfSwKKyAgICAgIHsweDAwZWIsMHgwMDIzLDB4MDBlYX0sCisgICAgICB7MHgwMWY3LDB4MDBlOCwweDAxZmF9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMGYyLDB4MDAyZCwweDAwNzB9LAorICAgICAgezB4MDAyMCwweDAwMDYsMHgwMDJifSwKKyAgICAgIHsweDAwNmUsMHgwMDI4LDB4MDBlOX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAxZjksMHgwMDY2LDB4MDBmOH0sCisgICAgICB7MHgwMGU3LDB4MDAxYiwweDAwZjF9LAorICAgICAgezB4MDFmNCwweDAwNmIsMHgwMWY1fQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDAwZWMsMHgwMDJhLDB4MDA2Y30sCisgICAgICB7MHgwMDJjLDB4MDAwYSwweDAwMjd9LAorICAgICAgezB4MDA2NywweDAwMWEsMHgwMGY1fQorICAgIH0sCisgICAgeworICAgICAgezB4MDAyNCwweDAwMDgsMHgwMDFmfSwKKyAgICAgIHsweDAwMDksMHgwMDAwLDB4MDAwN30sCisgICAgICB7MHgwMDFkLDB4MDAwYiwweDAwMzB9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMGVmLDB4MDAxYywweDAwNjR9LAorICAgICAgezB4MDAxZSwweDAwMGMsMHgwMDI5fSwKKyAgICAgIHsweDAwZjMsMHgwMDJmLDB4MDBmMH0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwMWZjLDB4MDA3MSwweDAxZjJ9LAorICAgICAgezB4MDBmNCwweDAwMjEsMHgwMGU2fSwKKyAgICAgIHsweDAwZjcsMHgwMDY4LDB4MDFmOH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwZWUsMHgwMDIyLDB4MDA2NX0sCisgICAgICB7MHgwMDMxLDB4MDAwMiwweDAwMjZ9LAorICAgICAgezB4MDBlZCwweDAwMjUsMHgwMDZhfQorICAgIH0sCisgICAgeworICAgICAgezB4MDFmYiwweDAwNzIsMHgwMWZlfSwKKyAgICAgIHsweDAwNjksMHgwMDJlLDB4MDBmNn0sCisgICAgICB7MHgwMWZmLDB4MDA2ZCwweDAxZjZ9CisgICAgfQorICB9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjNbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7CisgICAgICB7MHgwMDAwLDB4MDAwOSwweDAwZWZ9LAorICAgICAgezB4MDAwYiwweDAwMTksMHgwMGYwfSwKKyAgICAgIHsweDAxZWIsMHgwMWU2LDB4MDNmMn0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwMGEsMHgwMDM1LDB4MDFlZn0sCisgICAgICB7MHgwMDM0LDB4MDAzNywweDAxZTl9LAorICAgICAgezB4MDFlZCwweDAxZTcsMHgwM2YzfQorICAgIH0sCisgICAgeworICAgICAgezB4MDFlZSwweDAzZWQsMHgxZmZhfSwKKyAgICAgIHsweDAxZWMsMHgwMWYyLDB4MDdmOX0sCisgICAgICB7MHgwN2Y4LDB4MDNmOCwweDBmZjh9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDAwOCwweDAwMzgsMHgwM2Y2fSwKKyAgICAgIHsweDAwMzYsMHgwMDc1LDB4MDNmMX0sCisgICAgICB7MHgwM2ViLDB4MDNlYywweDBmZjR9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMDE4LDB4MDA3NiwweDA3ZjR9LAorICAgICAgezB4MDAzOSwweDAwNzQsMHgwM2VmfSwKKyAgICAgIHsweDAxZjMsMHgwMWY0LDB4MDdmNn0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAxZTgsMHgwM2VhLDB4MWZmY30sCisgICAgICB7MHgwMGYyLDB4MDFmMSwweDBmZmJ9LAorICAgICAgezB4MDNmNSwweDA3ZjMsMHgwZmZjfQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDAwZWUsMHgwM2Y3LDB4N2ZmZX0sCisgICAgICB7MHgwMWYwLDB4MDdmNSwweDdmZmR9LAorICAgICAgezB4MWZmYiwweDNmZmEsMHhmZmZmfQorICAgIH0sCisgICAgeworICAgICAgezB4MDBmMSwweDAzZjAsMHgzZmZjfSwKKyAgICAgIHsweDAxZWEsMHgwM2VlLDB4M2ZmYn0sCisgICAgICB7MHgwZmY2LDB4MGZmYSwweDdmZmN9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwN2YyLDB4MGZmNSwweGZmZmV9LAorICAgICAgezB4MDNmNCwweDA3ZjcsMHg3ZmZifSwKKyAgICAgIHsweDBmZjcsMHgwZmY5LDB4N2ZmYX0KKyAgICB9CisgIH0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNFszXVszXVszXVszXT0KK3sKKyAgeworICAgIHsKKyAgICAgIHsweDAwMDcsMHgwMDE2LDB4MDBmNn0sCisgICAgICB7MHgwMDE4LDB4MDAwOCwweDAwZWZ9LAorICAgICAgezB4MDFlZiwweDAwZjMsMHgwN2Y4fQorICAgIH0sCisgICAgeworICAgICAgezB4MDAxOSwweDAwMTcsMHgwMGVkfSwKKyAgICAgIHsweDAwMTUsMHgwMDAxLDB4MDBlMn0sCisgICAgICB7MHgwMGYwLDB4MDA3MCwweDAzZjB9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMWVlLDB4MDBmMSwweDA3ZmF9LAorICAgICAgezB4MDBlZSwweDAwZTQsMHgwM2YyfSwKKyAgICAgIHsweDA3ZjYsMHgwM2VmLDB4MDdmZH0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwMDA1LDB4MDAxNCwweDAwZjJ9LAorICAgICAgezB4MDAwOSwweDAwMDQsMHgwMGU1fSwKKyAgICAgIHsweDAwZjQsMHgwMGU4LDB4MDNmNH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwMDYsMHgwMDAyLDB4MDBlN30sCisgICAgICB7MHgwMDAzLDB4MDAwMCwweDAwNmJ9LAorICAgICAgezB4MDBlMywweDAwNjksMHgwMWYzfQorICAgIH0sCisgICAgeworICAgICAgezB4MDBlYiwweDAwZTYsMHgwM2Y2fSwKKyAgICAgIHsweDAwNmUsMHgwMDZhLDB4MDFmNH0sCisgICAgICB7MHgwM2VjLDB4MDFmMCwweDAzZjl9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDBmNSwweDAwZWMsMHgwN2ZifSwKKyAgICAgIHsweDAwZWEsMHgwMDZmLDB4MDNmN30sCisgICAgICB7MHgwN2Y5LDB4MDNmMywweDBmZmZ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMGU5LDB4MDA2ZCwweDAzZjh9LAorICAgICAgezB4MDA2YywweDAwNjgsMHgwMWY1fSwKKyAgICAgIHsweDAzZWUsMHgwMWYyLDB4MDdmNH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA3ZjcsMHgwM2YxLDB4MGZmZX0sCisgICAgICB7MHgwM2VkLDB4MDFmMSwweDA3ZjV9LAorICAgICAgezB4MDdmZSwweDAzZjUsMHgwN2ZjfQorICAgIH0KKyAgfQorfTsKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNVs5XVs5XT0KK3sKKyAgezB4MWZmZiwweDBmZjcsMHgwN2Y0LDB4MDdlOCwweDAzZjEsMHgwN2VlLDB4MDdmOSwweDBmZjgsMHgxZmZkfSwKKyAgezB4MGZmZCwweDA3ZjEsMHgwM2U4LDB4MDFlOCwweDAwZjAsMHgwMWVjLDB4MDNlZSwweDA3ZjIsMHgwZmZhfSwKKyAgezB4MGZmNCwweDAzZWYsMHgwMWYyLDB4MDBlOCwweDAwNzAsMHgwMGVjLDB4MDFmMCwweDAzZWEsMHgwN2YzfSwKKyAgezB4MDdlYiwweDAxZWIsMHgwMGVhLDB4MDAxYSwweDAwMDgsMHgwMDE5LDB4MDBlZSwweDAxZWYsMHgwN2VkfSwKKyAgezB4MDNmMCwweDAwZjIsMHgwMDczLDB4MDAwYiwweDAwMDAsMHgwMDBhLDB4MDA3MSwweDAwZjMsMHgwN2U5fSwKKyAgezB4MDdlZiwweDAxZWUsMHgwMGVmLDB4MDAxOCwweDAwMDksMHgwMDFiLDB4MDBlYiwweDAxZTksMHgwN2VjfSwKKyAgezB4MDdmNiwweDAzZWIsMHgwMWYzLDB4MDBlZCwweDAwNzIsMHgwMGU5LDB4MDFmMSwweDAzZWQsMHgwN2Y3fSwKKyAgezB4MGZmNiwweDA3ZjAsMHgwM2U5LDB4MDFlZCwweDAwZjEsMHgwMWVhLDB4MDNlYywweDA3ZjgsMHgwZmY5fSwKKyAgezB4MWZmYywweDBmZmMsMHgwZmY1LDB4MDdlYSwweDAzZjMsMHgwM2YyLDB4MDdmNSwweDBmZmIsMHgxZmZlfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWI2WzldWzldPQoreworICB7MHgwN2ZlLDB4MDNmZCwweDAxZjEsMHgwMWViLDB4MDFmNCwweDAxZWEsMHgwMWYwLDB4MDNmYywweDA3ZmR9LAorICB7MHgwM2Y2LDB4MDFlNSwweDAwZWEsMHgwMDZjLDB4MDA3MSwweDAwNjgsMHgwMGYwLDB4MDFlNiwweDAzZjd9LAorICB7MHgwMWYzLDB4MDBlZiwweDAwMzIsMHgwMDI3LDB4MDAyOCwweDAwMjYsMHgwMDMxLDB4MDBlYiwweDAxZjd9LAorICB7MHgwMWU4LDB4MDA2ZiwweDAwMmUsMHgwMDA4LDB4MDAwNCwweDAwMDYsMHgwMDI5LDB4MDA2YiwweDAxZWV9LAorICB7MHgwMWVmLDB4MDA3MiwweDAwMmQsMHgwMDAyLDB4MDAwMCwweDAwMDMsMHgwMDJmLDB4MDA3MywweDAxZmF9LAorICB7MHgwMWU3LDB4MDA2ZSwweDAwMmIsMHgwMDA3LDB4MDAwMSwweDAwMDUsMHgwMDJjLDB4MDA2ZCwweDAxZWN9LAorICB7MHgwMWY5LDB4MDBlZSwweDAwMzAsMHgwMDI0LDB4MDAyYSwweDAwMjUsMHgwMDMzLDB4MDBlYywweDAxZjJ9LAorICB7MHgwM2Y4LDB4MDFlNCwweDAwZWQsMHgwMDZhLDB4MDA3MCwweDAwNjksMHgwMDc0LDB4MDBmMSwweDAzZmF9LAorICB7MHgwN2ZmLDB4MDNmOSwweDAxZjYsMHgwMWVkLDB4MDFmOCwweDAxZTksMHgwMWY1LDB4MDNmYiwweDA3ZmN9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjdbOF1bOF09Cit7CisgIHsweDAwMDAsMHgwMDA1LDB4MDAzNywweDAwNzQsMHgwMGYyLDB4MDFlYiwweDAzZWQsMHgwN2Y3fSwKKyAgezB4MDAwNCwweDAwMGMsMHgwMDM1LDB4MDA3MSwweDAwZWMsMHgwMGVlLDB4MDFlZSwweDAxZjV9LAorICB7MHgwMDM2LDB4MDAzNCwweDAwNzIsMHgwMGVhLDB4MDBmMSwweDAxZTksMHgwMWYzLDB4MDNmNX0sCisgIHsweDAwNzMsMHgwMDcwLDB4MDBlYiwweDAwZjAsMHgwMWYxLDB4MDFmMCwweDAzZWMsMHgwM2ZhfSwKKyAgezB4MDBmMywweDAwZWQsMHgwMWU4LDB4MDFlZiwweDAzZWYsMHgwM2YxLDB4MDNmOSwweDA3ZmJ9LAorICB7MHgwMWVkLDB4MDBlZiwweDAxZWEsMHgwMWYyLDB4MDNmMywweDAzZjgsMHgwN2Y5LDB4MDdmY30sCisgIHsweDAzZWUsMHgwMWVjLDB4MDFmNCwweDAzZjQsMHgwM2Y3LDB4MDdmOCwweDBmZmQsMHgwZmZlfSwKKyAgezB4MDdmNiwweDAzZjAsMHgwM2YyLDB4MDNmNiwweDA3ZmEsMHgwN2ZkLDB4MGZmYywweDBmZmZ9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjhbOF1bOF09Cit7CisgIHsweDAwMGUsMHgwMDA1LDB4MDAxMCwweDAwMzAsMHgwMDZmLDB4MDBmMSwweDAxZmEsMHgwM2ZlfSwKKyAgezB4MDAwMywweDAwMDAsMHgwMDA0LDB4MDAxMiwweDAwMmMsMHgwMDZhLDB4MDA3NSwweDAwZjh9LAorICB7MHgwMDBmLDB4MDAwMiwweDAwMDYsMHgwMDE0LDB4MDAyZSwweDAwNjksMHgwMDcyLDB4MDBmNX0sCisgIHsweDAwMmYsMHgwMDExLDB4MDAxMywweDAwMmEsMHgwMDMyLDB4MDA2YywweDAwZWMsMHgwMGZhfSwKKyAgezB4MDA3MSwweDAwMmIsMHgwMDJkLDB4MDAzMSwweDAwNmQsMHgwMDcwLDB4MDBmMiwweDAxZjl9LAorICB7MHgwMGVmLDB4MDA2OCwweDAwMzMsMHgwMDZiLDB4MDA2ZSwweDAwZWUsMHgwMGY5LDB4MDNmY30sCisgIHsweDAxZjgsMHgwMDc0LDB4MDA3MywweDAwZWQsMHgwMGYwLDB4MDBmNiwweDAxZjYsMHgwMWZkfSwKKyAgezB4MDNmZCwweDAwZjMsMHgwMGY0LDB4MDBmNywweDAxZjcsMHgwMWZiLDB4MDFmYywweDAzZmZ9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjlbMTNdWzEzXT0KK3sKKyAgezB4MDAwMCwweDAwMDUsMHgwMDM3LDB4MDBlNywweDAxZGUsMHgwM2NlLDB4MDNkOSwweDA3YzgsMHgwN2NkLDB4MGZjOCwweDBmZGQsMHgxZmU0LDB4MWZlY30sCisgIHsweDAwMDQsMHgwMDBjLDB4MDAzNSwweDAwNzIsMHgwMGVhLDB4MDBlZCwweDAxZTIsMHgwM2QxLDB4MDNkMywweDAzZTAsMHgwN2Q4LDB4MGZjZiwweDBmZDV9LAorICB7MHgwMDM2LDB4MDAzNCwweDAwNzEsMHgwMGU4LDB4MDBlYywweDAxZTEsMHgwM2NmLDB4MDNkZCwweDAzZGIsMHgwN2QwLDB4MGZjNywweDBmZDQsMHgwZmU0fSwKKyAgezB4MDBlNiwweDAwNzAsMHgwMGU5LDB4MDFkZCwweDAxZTMsMHgwM2QyLDB4MDNkYywweDA3Y2MsMHgwN2NhLDB4MDdkZSwweDBmZDgsMHgwZmVhLDB4MWZkYn0sCisgIHsweDAxZGYsMHgwMGViLDB4MDFkYywweDAxZTYsMHgwM2Q1LDB4MDNkZSwweDA3Y2IsMHgwN2RkLDB4MDdkYywweDBmY2QsMHgwZmUyLDB4MGZlNywweDFmZTF9LAorICB7MHgwM2QwLDB4MDFlMCwweDAxZTQsMHgwM2Q2LDB4MDdjNSwweDA3ZDEsMHgwN2RiLDB4MGZkMiwweDA3ZTAsMHgwZmQ5LDB4MGZlYiwweDFmZTMsMHgxZmU5fSwKKyAgezB4MDdjNCwweDAxZTUsMHgwM2Q3LDB4MDdjNiwweDA3Y2YsMHgwN2RhLDB4MGZjYiwweDBmZGEsMHgwZmUzLDB4MGZlOSwweDFmZTYsMHgxZmYzLDB4MWZmN30sCisgIHsweDA3ZDMsMHgwM2Q4LDB4MDNlMSwweDA3ZDQsMHgwN2Q5LDB4MGZkMywweDBmZGUsMHgxZmRkLDB4MWZkOSwweDFmZTIsMHgxZmVhLDB4MWZmMSwweDFmZjZ9LAorICB7MHgwN2QyLDB4MDNkNCwweDAzZGEsMHgwN2M3LDB4MDdkNywweDA3ZTIsMHgwZmNlLDB4MGZkYiwweDFmZDgsMHgxZmVlLDB4M2ZmMCwweDFmZjQsMHgzZmYyfSwKKyAgezB4MDdlMSwweDAzZGYsMHgwN2M5LDB4MDdkNiwweDBmY2EsMHgwZmQwLDB4MGZlNSwweDBmZTYsMHgxZmViLDB4MWZlZiwweDNmZjMsMHgzZmY0LDB4M2ZmNX0sCisgIHsweDBmZTAsMHgwN2NlLDB4MDdkNSwweDBmYzYsMHgwZmQxLDB4MGZlMSwweDFmZTAsMHgxZmU4LDB4MWZmMCwweDNmZjEsMHgzZmY4LDB4M2ZmNiwweDdmZmN9LAorICB7MHgwZmU4LDB4MDdkZiwweDBmYzksMHgwZmQ3LDB4MGZkYywweDFmZGMsMHgxZmRmLDB4MWZlZCwweDFmZjUsMHgzZmY5LDB4M2ZmYiwweDdmZmQsMHg3ZmZlfSwKKyAgezB4MWZlNywweDBmY2MsMHgwZmQ2LDB4MGZkZiwweDFmZGUsMHgxZmRhLDB4MWZlNSwweDFmZjIsMHgzZmZhLDB4M2ZmNywweDNmZmMsMHgzZmZkLDB4N2ZmZn0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTBbMTNdWzEzXT0KK3sKKyAgezB4MDAyMiwweDAwMDgsMHgwMDFkLDB4MDAyNiwweDAwNWYsMHgwMGQzLDB4MDFjZiwweDAzZDAsMHgwM2Q3LDB4MDNlZCwweDA3ZjAsMHgwN2Y2LDB4MGZmZH0sCisgIHsweDAwMDcsMHgwMDAwLDB4MDAwMSwweDAwMDksMHgwMDIwLDB4MDA1NCwweDAwNjAsMHgwMGQ1LDB4MDBkYywweDAxZDQsMHgwM2NkLDB4MDNkZSwweDA3ZTd9LAorICB7MHgwMDFjLDB4MDAwMiwweDAwMDYsMHgwMDBjLDB4MDAxZSwweDAwMjgsMHgwMDViLDB4MDBjZCwweDAwZDksMHgwMWNlLDB4MDFkYywweDAzZDksMHgwM2YxfSwKKyAgezB4MDAyNSwweDAwMGIsMHgwMDBhLDB4MDAwZCwweDAwMjQsMHgwMDU3LDB4MDA2MSwweDAwY2MsMHgwMGRkLDB4MDFjYywweDAxZGUsMHgwM2QzLDB4MDNlN30sCisgIHsweDAwNWQsMHgwMDIxLDB4MDAxZiwweDAwMjMsMHgwMDI3LDB4MDA1OSwweDAwNjQsMHgwMGQ4LDB4MDBkZiwweDAxZDIsMHgwMWUyLDB4MDNkZCwweDAzZWV9LAorICB7MHgwMGQxLDB4MDA1NSwweDAwMjksMHgwMDU2LDB4MDA1OCwweDAwNjIsMHgwMGNlLDB4MDBlMCwweDAwZTIsMHgwMWRhLDB4MDNkNCwweDAzZTMsMHgwN2VifSwKKyAgezB4MDFjOSwweDAwNWUsMHgwMDVhLDB4MDA1YywweDAwNjMsMHgwMGNhLDB4MDBkYSwweDAxYzcsMHgwMWNhLDB4MDFlMCwweDAzZGIsMHgwM2U4LDB4MDdlY30sCisgIHsweDAxZTMsMHgwMGQyLDB4MDBjYiwweDAwZDAsMHgwMGQ3LDB4MDBkYiwweDAxYzYsMHgwMWQ1LDB4MDFkOCwweDAzY2EsMHgwM2RhLDB4MDdlYSwweDA3ZjF9LAorICB7MHgwMWUxLDB4MDBkNCwweDAwY2YsMHgwMGQ2LDB4MDBkZSwweDAwZTEsMHgwMWQwLDB4MDFkNiwweDAzZDEsMHgwM2Q1LDB4MDNmMiwweDA3ZWUsMHgwN2ZifSwKKyAgezB4MDNlOSwweDAxY2QsMHgwMWM4LDB4MDFjYiwweDAxZDEsMHgwMWQ3LDB4MDFkZiwweDAzY2YsMHgwM2UwLDB4MDNlZiwweDA3ZTYsMHgwN2Y4LDB4MGZmYX0sCisgIHsweDAzZWIsMHgwMWRkLDB4MDFkMywweDAxZDksMHgwMWRiLDB4MDNkMiwweDAzY2MsMHgwM2RjLDB4MDNlYSwweDA3ZWQsMHgwN2YzLDB4MDdmOSwweDBmZjl9LAorICB7MHgwN2YyLDB4MDNjZSwweDAxZTQsMHgwM2NiLDB4MDNkOCwweDAzZDYsMHgwM2UyLDB4MDNlNSwweDA3ZTgsMHgwN2Y0LDB4MDdmNSwweDA3ZjcsMHgwZmZifSwKKyAgezB4MDdmYSwweDAzZWMsMHgwM2RmLDB4MDNlMSwweDAzZTQsMHgwM2U2LDB4MDNmMCwweDA3ZTksMHgwN2VmLDB4MGZmOCwweDBmZmUsMHgwZmZjLDB4MGZmZn0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTFbMTddWzE3XT0KK3sKKyAgezB4MDAwMCwweDAwMDYsMHgwMDE5LDB4MDAzZCwweDAwOWMsMHgwMGM2LDB4MDFhNywweDAzOTAsMHgwM2MyLDB4MDNkZiwweDA3ZTYsMHgwN2YzLDB4MGZmYiwweDA3ZWMsMHgwZmZhLDB4MGZmZSwweDAzOGV9LAorICB7MHgwMDA1LDB4MDAwMSwweDAwMDgsMHgwMDE0LDB4MDAzNywweDAwNDIsMHgwMDkyLDB4MDBhZiwweDAxOTEsMHgwMWE1LDB4MDFiNSwweDAzOWUsMHgwM2MwLDB4MDNhMiwweDAzY2QsMHgwN2Q2LDB4MDBhZX0sCisgIHsweDAwMTcsMHgwMDA3LDB4MDAwOSwweDAwMTgsMHgwMDM5LDB4MDA0MCwweDAwOGUsMHgwMGEzLDB4MDBiOCwweDAxOTksMHgwMWFjLDB4MDFjMSwweDAzYjEsMHgwMzk2LDB4MDNiZSwweDAzY2EsMHgwMDlkfSwKKyAgezB4MDAzYywweDAwMTUsMHgwMDE2LDB4MDAxYSwweDAwM2IsMHgwMDQ0LDB4MDA5MSwweDAwYTUsMHgwMGJlLDB4MDE5NiwweDAxYWUsMHgwMWI5LDB4MDNhMSwweDAzOTEsMHgwM2E1LDB4MDNkNSwweDAwOTR9LAorICB7MHgwMDlhLDB4MDAzNiwweDAwMzgsMHgwMDNhLDB4MDA0MSwweDAwOGMsMHgwMDliLDB4MDBiMCwweDAwYzMsMHgwMTllLDB4MDFhYiwweDAxYmMsMHgwMzlmLDB4MDM4ZiwweDAzYTksMHgwM2NmLDB4MDA5M30sCisgIHsweDAwYmYsMHgwMDNlLDB4MDAzZiwweDAwNDMsMHgwMDQ1LDB4MDA5ZSwweDAwYTcsMHgwMGI5LDB4MDE5NCwweDAxYTIsMHgwMWJhLDB4MDFjMywweDAzYTYsMHgwM2E3LDB4MDNiYiwweDAzZDQsMHgwMDlmfSwKKyAgezB4MDFhMCwweDAwOGYsMHgwMDhkLDB4MDA5MCwweDAwOTgsMHgwMGE2LDB4MDBiNiwweDAwYzQsMHgwMTlmLDB4MDFhZiwweDAxYmYsMHgwMzk5LDB4MDNiZiwweDAzYjQsMHgwM2M5LDB4MDNlNywweDAwYTh9LAorICB7MHgwMWI2LDB4MDBhYiwweDAwYTQsMHgwMGFhLDB4MDBiMiwweDAwYzIsMHgwMGM1LDB4MDE5OCwweDAxYTQsMHgwMWI4LDB4MDM4YywweDAzYTQsMHgwM2M0LDB4MDNjNiwweDAzZGQsMHgwM2U4LDB4MDBhZH0sCisgIHsweDAzYWYsMHgwMTkyLDB4MDBiZCwweDAwYmMsMHgwMThlLDB4MDE5NywweDAxOWEsMHgwMWEzLDB4MDFiMSwweDAzOGQsMHgwMzk4LDB4MDNiNywweDAzZDMsMHgwM2QxLDB4MDNkYiwweDA3ZGQsMHgwMGI0fSwKKyAgezB4MDNkZSwweDAxYTksMHgwMTliLDB4MDE5YywweDAxYTEsMHgwMWFhLDB4MDFhZCwweDAxYjMsMHgwMzhiLDB4MDNiMiwweDAzYjgsMHgwM2NlLDB4MDNlMSwweDAzZTAsMHgwN2QyLDB4MDdlNSwweDAwYjd9LAorICB7MHgwN2UzLDB4MDFiYiwweDAxYTgsMHgwMWE2LDB4MDFiMCwweDAxYjIsMHgwMWI3LDB4MDM5YiwweDAzOWEsMHgwM2JhLDB4MDNiNSwweDAzZDYsMHgwN2Q3LDB4MDNlNCwweDA3ZDgsMHgwN2VhLDB4MDBiYX0sCisgIHsweDA3ZTgsMHgwM2EwLDB4MDFiZCwweDAxYjQsMHgwMzhhLDB4MDFjNCwweDAzOTIsMHgwM2FhLDB4MDNiMCwweDAzYmMsMHgwM2Q3LDB4MDdkNCwweDA3ZGMsMHgwN2RiLDB4MDdkNSwweDA3ZjAsMHgwMGMxfSwKKyAgezB4MDdmYiwweDAzYzgsMHgwM2EzLDB4MDM5NSwweDAzOWQsMHgwM2FjLDB4MDNhZSwweDAzYzUsMHgwM2Q4LDB4MDNlMiwweDAzZTYsMHgwN2U0LDB4MDdlNywweDA3ZTAsMHgwN2U5LDB4MDdmNywweDAxOTB9LAorICB7MHgwN2YyLDB4MDM5MywweDAxYmUsMHgwMWMwLDB4MDM5NCwweDAzOTcsMHgwM2FkLDB4MDNjMywweDAzYzEsMHgwM2QyLDB4MDdkYSwweDA3ZDksMHgwN2RmLDB4MDdlYiwweDA3ZjQsMHgwN2ZhLDB4MDE5NX0sCisgIHsweDA3ZjgsMHgwM2JkLDB4MDM5YywweDAzYWIsMHgwM2E4LDB4MDNiMywweDAzYjksMHgwM2QwLDB4MDNlMywweDAzZTUsMHgwN2UyLDB4MDdkZSwweDA3ZWQsMHgwN2YxLDB4MDdmOSwweDA3ZmMsMHgwMTkzfSwKKyAgezB4MGZmZCwweDAzZGMsMHgwM2I2LDB4MDNjNywweDAzY2MsMHgwM2NiLDB4MDNkOSwweDAzZGEsMHgwN2QzLDB4MDdlMSwweDA3ZWUsMHgwN2VmLDB4MDdmNSwweDA3ZjYsMHgwZmZjLDB4MGZmZiwweDAxOWR9LAorICB7MHgwMWMyLDB4MDBiNSwweDAwYTEsMHgwMDk2LDB4MDA5NywweDAwOTUsMHgwMDk5LDB4MDBhMCwweDAwYTIsMHgwMGFjLDB4MDBhOSwweDAwYjEsMHgwMGIzLDB4MDBiYiwweDAwYzAsMHgwMThmLDB4MDAwNH0KK307CisKK2NvbnN0IFVXb3JkMzIgaHVmZl9jdGFic2NmWzEyMV09Cit7CisgIDB4MDAwM2ZmZTgsCisgIDB4MDAwM2ZmZTYsCisgIDB4MDAwM2ZmZTcsCisgIDB4MDAwM2ZmZTUsCisgIDB4MDAwN2ZmZjUsCisgIDB4MDAwN2ZmZjEsCisgIDB4MDAwN2ZmZWQsCisgIDB4MDAwN2ZmZjYsCisgIDB4MDAwN2ZmZWUsCisgIDB4MDAwN2ZmZWYsCisgIDB4MDAwN2ZmZjAsCisgIDB4MDAwN2ZmZmMsCisgIDB4MDAwN2ZmZmQsCisgIDB4MDAwN2ZmZmYsCisgIDB4MDAwN2ZmZmUsCisgIDB4MDAwN2ZmZjcsCisgIDB4MDAwN2ZmZjgsCisgIDB4MDAwN2ZmZmIsCisgIDB4MDAwN2ZmZjksCisgIDB4MDAwM2ZmZTQsCisgIDB4MDAwN2ZmZmEsCisgIDB4MDAwM2ZmZTMsCisgIDB4MDAwMWZmZWYsCisgIDB4MDAwMWZmZjAsCisgIDB4MDAwMGZmZjUsCisgIDB4MDAwMWZmZWUsCisgIDB4MDAwMGZmZjIsCisgIDB4MDAwMGZmZjMsCisgIDB4MDAwMGZmZjQsCisgIDB4MDAwMGZmZjEsCisgIDB4MDAwMDdmZjYsCisgIDB4MDAwMDdmZjcsCisgIDB4MDAwMDNmZjksCisgIDB4MDAwMDNmZjUsCisgIDB4MDAwMDNmZjcsCisgIDB4MDAwMDNmZjMsCisgIDB4MDAwMDNmZjYsCisgIDB4MDAwMDNmZjIsCisgIDB4MDAwMDFmZjcsCisgIDB4MDAwMDFmZjUsCisgIDB4MDAwMDBmZjksCisgIDB4MDAwMDBmZjcsCisgIDB4MDAwMDBmZjYsCisgIDB4MDAwMDA3ZjksCisgIDB4MDAwMDBmZjQsCisgIDB4MDAwMDA3ZjgsCisgIDB4MDAwMDAzZjksCisgIDB4MDAwMDAzZjcsCisgIDB4MDAwMDAzZjUsCisgIDB4MDAwMDAxZjgsCisgIDB4MDAwMDAxZjcsCisgIDB4MDAwMDAwZmEsCisgIDB4MDAwMDAwZjgsCisgIDB4MDAwMDAwZjYsCisgIDB4MDAwMDAwNzksCisgIDB4MDAwMDAwM2EsCisgIDB4MDAwMDAwMzgsCisgIDB4MDAwMDAwMWEsCisgIDB4MDAwMDAwMGIsCisgIDB4MDAwMDAwMDQsCisgIDB4MDAwMDAwMDAsCisgIDB4MDAwMDAwMGEsCisgIDB4MDAwMDAwMGMsCisgIDB4MDAwMDAwMWIsCisgIDB4MDAwMDAwMzksCisgIDB4MDAwMDAwM2IsCisgIDB4MDAwMDAwNzgsCisgIDB4MDAwMDAwN2EsCisgIDB4MDAwMDAwZjcsCisgIDB4MDAwMDAwZjksCisgIDB4MDAwMDAxZjYsCisgIDB4MDAwMDAxZjksCisgIDB4MDAwMDAzZjQsCisgIDB4MDAwMDAzZjYsCisgIDB4MDAwMDAzZjgsCisgIDB4MDAwMDA3ZjUsCisgIDB4MDAwMDA3ZjQsCisgIDB4MDAwMDA3ZjYsCisgIDB4MDAwMDA3ZjcsCisgIDB4MDAwMDBmZjUsCisgIDB4MDAwMDBmZjgsCisgIDB4MDAwMDFmZjQsCisgIDB4MDAwMDFmZjYsCisgIDB4MDAwMDFmZjgsCisgIDB4MDAwMDNmZjgsCisgIDB4MDAwMDNmZjQsCisgIDB4MDAwMGZmZjAsCisgIDB4MDAwMDdmZjQsCisgIDB4MDAwMGZmZjYsCisgIDB4MDAwMDdmZjUsCisgIDB4MDAwM2ZmZTIsCisgIDB4MDAwN2ZmZDksCisgIDB4MDAwN2ZmZGEsCisgIDB4MDAwN2ZmZGIsCisgIDB4MDAwN2ZmZGMsCisgIDB4MDAwN2ZmZGQsCisgIDB4MDAwN2ZmZGUsCisgIDB4MDAwN2ZmZDgsCisgIDB4MDAwN2ZmZDIsCisgIDB4MDAwN2ZmZDMsCisgIDB4MDAwN2ZmZDQsCisgIDB4MDAwN2ZmZDUsCisgIDB4MDAwN2ZmZDYsCisgIDB4MDAwN2ZmZjIsCisgIDB4MDAwN2ZmZGYsCisgIDB4MDAwN2ZmZTcsCisgIDB4MDAwN2ZmZTgsCisgIDB4MDAwN2ZmZTksCisgIDB4MDAwN2ZmZWEsCisgIDB4MDAwN2ZmZWIsCisgIDB4MDAwN2ZmZTYsCisgIDB4MDAwN2ZmZTAsCisgIDB4MDAwN2ZmZTEsCisgIDB4MDAwN2ZmZTIsCisgIDB4MDAwN2ZmZTMsCisgIDB4MDAwN2ZmZTQsCisgIDB4MDAwN2ZmZTUsCisgIDB4MDAwN2ZmZDcsCisgIDB4MDAwN2ZmZWMsCisgIDB4MDAwN2ZmZjQsCisgIDB4MDAwN2ZmZjMKK307CisKK2NvbnN0IFdvcmQzMiBtX2xvZzJfdGFibGVbSU5UX0JJVFNdID0geworICAweDAwMDAwMDAwLDB4NGFlMDBkMDAsMHgyOTM0ZjA4MCwweDE1YzAxYTNmLCAKKyAgMHgwYjMxZmI4MCwweDA1YWViNGUwLDB4MDJkY2YyZDAsMHgwMTZmZTUwYywgCisgIDB4MDBiODRlMjMsMHgwMDVjM2UxMCwweDAwMmUyNGNhLDB4MDAxNzEzZDYsCisgIDB4MDAwYjhhNDcsMHgwMDA1YzUzYiwweDAwMDJlMmEzLDB4MDAwMTcxNTMsCisgIDB4MDAwMGI4YWEsMHgwMDAwNWM1NSwweDAwMDAyZTJiLDB4MDAwMDE3MTUsCisgIDB4MDAwMDBiOGIsMHgwMDAwMDVjNSwweDAwMDAwMmUzLDB4MDAwMDAxNzEsIAorICAweDAwMDAwMGI5LDB4MDAwMDAwNWMsMHgwMDAwMDAyZSwweDAwMDAwMDE3LAorICAweDAwMDAwMDBjLDB4MDAwMDAwMDYsMHgwMDAwMDAwMywweDAwMDAwMDAxCit9OworCisKKy8qCisgIDMgYml0IHJlc29sdXRpb24KKyovCitjb25zdCBXb3JkMzIgdG5zQ29lZmYzWzhdID0KK3sKKyAgMHg4MWYxZDFkNCwKKyAgMHg5MTI2MTQ3YywKKyAgMHhhZGI5MjJmNywKKyAgMHhkNDM4YWYwOSwKKyAgMHgwMDAwMDAwMCwKKyAgMHgzNzg5ODA4NywKKyAgMHg2NDEzMGRmYSwKKyAgMHg3Y2NhNmZmYiwKK307CisKK2NvbnN0IFdvcmQzMiB0bnNDb2VmZjNCb3JkZXJzWzhdID0KK3sKKyAgMHg4MDAwMDAwMCwgIC8qIC00ICovCisgIDB4ODdiODI2ZGUsICAvKiAtMyAqLworICAweDlkZjI0MTUzLCAgLyogLTIgKi8KKyAgMHhiZmZmZmZlNSwgIC8qIC0xICovCisgIDB4ZTljNWU1NzgsICAvKiAgMCAqLworICAweDFjN2I5MGYwLCAgLyogIDEgKi8KKyAgMHg0ZmNlODNhYSwgIC8qICAyICovCisgIDB4NzM1MmYyYzQsICAvKiAgMyAqLworfTsKKworCisvKgorICA0IGJpdCByZXNvbHV0aW9uCisqLworCitjb25zdCBXb3JkMzIgdG5zQ29lZmY0WzE2XSA9Cit7CisgIDB4ODA4YmM4NGIsCisgIDB4ODRlMmU1N2QsCisgIDB4OGQ2YjQ5ZmIsCisgIDB4OTlkYTkyMDcsCisgIDB4YTljNDU3MDcsCisgIDB4YmM5ZGRlNzgsCisgIDB4ZDFjMmQ0ZmMsCisgIDB4ZTg3YWU1MzksCisgIDB4MDAwMDAwMDAsCisgIDB4MWE5Y2Q5YzAsCisgIDB4MzQwZmYyM2IsCisgIDB4NGIzYzhiZjcsCisgIDB4NWYxZjVlODAsCisgIDB4NmVkOWViODQsCisgIDB4NzliYzM4ODAsCisgIDB4N2Y0YzdlODkKK307CisKK2NvbnN0IFdvcmQzMiB0bnNDb2VmZjRCb3JkZXJzWzE2XT0KK3sKKyAgMHg4MDAwMDAwMCwgIC8qIC04ICovCisgIDB4ODIyZGVmZWYsICAvKiAtNyAqLworICAweDg4YTRiZmU1LCAgLyogLTYgKi8KKyAgMHg5MzJjMTU5YywgIC8qIC01ICovCisgIDB4YTE2ODI3YzEsICAvKiAtNCAqLworICAweGIyZGNkZTI2LCAgLyogLTMgKi8KKyAgMHhjNmYyMGI5MSwgIC8qIC0yICovCisgIDB4ZGNmODljNjQsICAvKiAtMSAqLworICAweGY0MzA4Y2UxLCAgLyogIDAgKi8KKyAgMHgwZDYxMzA1NCwgIC8qICAxICovCisgIDB4Mjc4ZGRlODAsICAvKiAgMiAqLworICAweDQwMDAwMDFiLCAgLyogIDMgKi8KKyAgMHg1NWE2MTI3YywgIC8qICA0ICovCisgIDB4Njc4ZGRlOGYsICAvKiAgNSAqLworICAweDc0ZWYwZWQ4LCAgLyogIDYgKi8KKyAgMHg3ZDMzZjBkYiAgIC8qICA3ICovCit9OworCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYml0cmV2VGFiWzE3ICsgMTI5XSA9IA0KK3sNCisvKiA2NCAqLw0KKzB4MDEsIDB4MDgsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MGMsIDB4MDUsIDB4MGEsIDB4MDcsIDB4MGUsIDB4MGIsIDB4MGQsIDB4MDAsIDB4MDYsIDB4MDksIDB4MGYsDQorMHgwMCwNCisNCisvKiA1MTIgKi8NCisweDAxLCAweDQwLCAweDAyLCAweDIwLCAweDAzLCAweDYwLCAweDA0LCAweDEwLCAweDA1LCAweDUwLCAweDA2LCAweDMwLCAweDA3LCAweDcwLCAweDA5LCAweDQ4LA0KKzB4MGEsIDB4MjgsIDB4MGIsIDB4NjgsIDB4MGMsIDB4MTgsIDB4MGQsIDB4NTgsIDB4MGUsIDB4MzgsIDB4MGYsIDB4NzgsIDB4MTEsIDB4NDQsIDB4MTIsIDB4MjQsDQorMHgxMywgMHg2NCwgMHgxNSwgMHg1NCwgMHgxNiwgMHgzNCwgMHgxNywgMHg3NCwgMHgxOSwgMHg0YywgMHgxYSwgMHgyYywgMHgxYiwgMHg2YywgMHgxZCwgMHg1YywNCisweDFlLCAweDNjLCAweDFmLCAweDdjLCAweDIxLCAweDQyLCAweDIzLCAweDYyLCAweDI1LCAweDUyLCAweDI2LCAweDMyLCAweDI3LCAweDcyLCAweDI5LCAweDRhLA0KKzB4MmIsIDB4NmEsIDB4MmQsIDB4NWEsIDB4MmUsIDB4M2EsIDB4MmYsIDB4N2EsIDB4MzEsIDB4NDYsIDB4MzMsIDB4NjYsIDB4MzUsIDB4NTYsIDB4MzcsIDB4NzYsDQorMHgzOSwgMHg0ZSwgMHgzYiwgMHg2ZSwgMHgzZCwgMHg1ZSwgMHgzZiwgMHg3ZSwgMHg0MywgMHg2MSwgMHg0NSwgMHg1MSwgMHg0NywgMHg3MSwgMHg0YiwgMHg2OSwNCisweDRkLCAweDU5LCAweDRmLCAweDc5LCAweDUzLCAweDY1LCAweDU3LCAweDc1LCAweDViLCAweDZkLCAweDVmLCAweDdkLCAweDY3LCAweDczLCAweDZmLCAweDdiLA0KKzB4MDAsIDB4MDgsIDB4MTQsIDB4MWMsIDB4MjIsIDB4MmEsIDB4MzYsIDB4M2UsIDB4NDEsIDB4NDksIDB4NTUsIDB4NWQsIDB4NjMsIDB4NmIsIDB4NzcsIDB4N2YsDQorMHgwMCwNCit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyYWU0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCkBAIC0wLDAgKzEsNDk1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhYWNlbmMuYw0KKw0KKwlDb250ZW50OglhYWMgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidm9BQUMuaCINCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJhYWNlbmNfY29yZS5oIg0KKyNpbmNsdWRlICJhYWNfcm9tLmgiDQorI2luY2x1ZGUgImNtbk1lbW9yeS5oIg0KKyNpbmNsdWRlICJtZW1hbGlnbi5oIg0KKw0KKy8qKg0KKyogSW5pdCB0aGUgYXVkaW8gY29kZWMgbW9kdWxlIGFuZCByZXR1cm4gY29kZWMgaGFuZGxlDQorKiBccGFyYW0gcGhDb2RlYyBbT1VUXSBSZXR1cm4gdGhlIHZpZGVvIGNvZGVjIGhhbmRsZQ0KKyogXHBhcmFtIHZUeXBlCVtJTl0gVGhlIGNvZGVjIHR5cGUgaWYgdGhlIG1vZHVsZSBzdXBwb3J0IG11bHRpIGNvZGVjLg0KKyogXHBhcmFtIHBVc2VyRGF0YQlbSU5dIFRoZSBpbml0IHBhcmFtLiBJdCBpcyBtZW1vcnkgb3BlcmF0b3Igb3IgYWxsb2NlZCBtZW1vcnkNCisqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKyovDQorVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0luaXQoVk9fSEFORExFICogcGhDb2RlYyxWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCBWT19DT0RFQ19JTklUX1VTRVJEQVRBICpwVXNlckRhdGEpDQorew0KKwlBQUNfRU5DT0RFUipoQWFjRW5jOw0KKwlBQUNFTkNfQ09ORklHIGNvbmZpZzsNCisJaW50IGVycm9yOw0KKw0KKyNpZmRlZiBVU0VfREVBVUxUX01FTQ0KKwlWT19NRU1fT1BFUkFUT1Igdm9NZW1vcHJhdG9yOw0KKyNlbmRpZg0KKwlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsNCisJaW50IGludGVyTWVtOw0KKw0KKwlpbnRlck1lbSA9IDA7DQorCWVycm9yID0gMDsNCisJDQorCS8qIGluaXQgdGhlIG1lbW9yeSBvcGVyYXRvciAqLw0KKwlpZihwVXNlckRhdGEgPT0gTlVMTCB8fCBwVXNlckRhdGEtPm1lbWZsYWcgIT0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUiB8fCBwVXNlckRhdGEtPm1lbURhdGEgPT0gTlVMTCApDQorCXsNCisjaWZkZWYgVVNFX0RFQVVMVF9NRU0NCisJCXZvTWVtb3ByYXRvci5BbGxvYyA9IGNtbk1lbUFsbG9jOw0KKwkJdm9NZW1vcHJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5Ow0KKwkJdm9NZW1vcHJhdG9yLkZyZWUgPSBjbW5NZW1GcmVlOw0KKwkJdm9NZW1vcHJhdG9yLlNldCA9IGNtbk1lbVNldDsNCisJCXZvTWVtb3ByYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOw0KKw0KKwkJaW50ZXJNZW0gPSAxOw0KKw0KKwkJcE1lbU9QID0gJnZvTWVtb3ByYXRvcjsNCisjZWxzZQ0KKwkJKnBoQ29kZWMgPSBOVUxMOw0KKwkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisjZW5kaWYNCisJfQ0KKwllbHNlDQorCXsNCisJCXBNZW1PUCA9IChWT19NRU1fT1BFUkFUT1IgKilwVXNlckRhdGEtPm1lbURhdGE7DQorCX0NCisNCisJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaGFuZGxlICovDQorCWhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKW1lbV9tYWxsb2MocE1lbU9QLCBzaXplb2YoQUFDX0VOQ09ERVIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorCWlmKE5VTEwgPT0gaEFhY0VuYykNCisJew0KKwkJZXJyb3IgPSAxOw0KKwl9DQorDQorCWlmKCFlcnJvcikNCisJew0KKwkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaW50cmEgbWVtb3J5ICovDQorCQloQWFjRW5jLT5pbnRidWYgPSAoc2hvcnQgKiltZW1fbWFsbG9jKHBNZW1PUCwgQUFDRU5DX0JMT0NLU0laRSpNQVhfQ0hBTk5FTFMqc2l6ZW9mKHNob3J0KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKwkJaWYoTlVMTCA9PSBoQWFjRW5jLT5pbnRidWYpDQorCQl7DQorCQkJZXJyb3IgPSAxOw0KKwkJfQ0KKwl9DQorDQorCWlmICghZXJyb3IpIHsKKwkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgcHN5Y2hvYWNvdXN0aWMgKi8KKwkJZXJyb3IgPSAoUHN5TmV3KCZoQWFjRW5jLT5wc3lLZXJuZWwsIE1BWF9DSEFOTkVMUywgcE1lbU9QKSB8fAorCQkJUHN5T3V0TmV3KCZoQWFjRW5jLT5wc3lPdXQsIHBNZW1PUCkpOworCX0NCisNCisJaWYgKCFlcnJvcikgeworCQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBxdWFudGl6YXRpb24gZWxlbWVudHMgKi8KKwkJZXJyb3IgPSBRQ091dE5ldygmaEFhY0VuYy0+cWNPdXQsTUFYX0NIQU5ORUxTLCBwTWVtT1ApOworCX0NCisNCisJaWYgKCFlcnJvcikgeworCQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBxdWFudGl6YXRpb24gc3RhdGUgKi8KKwkJZXJyb3IgPSBRQ05ldygmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7CisJfQorCisJLyogdW5pbml0IHRoZSBhYWMgZW5jb2RlciBpZiBlcnJvciBpcyBub3plcm8gKi8KKwlpZihlcnJvcikKKwl7CisJCUFhY0VuY0Nsb3NlKGhBYWNFbmMsIHBNZW1PUCk7CisJCWlmKGhBYWNFbmMpCisJCXsKKwkJCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYywgVk9fSU5ERVhfRU5DX0FBQyk7CisJCQloQWFjRW5jID0gTlVMTDsKKwkJfQkJCisJCSpwaENvZGVjID0gTlVMTDsKKwkJcmV0dXJuIFZPX0VSUl9PVVRPRl9NRU1PUlk7CisJfQ0KKw0KKwkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBtZW1vcnkgb3BlcmF0b3IgICovDQorI2lmZGVmIFVTRV9ERUFVTFRfTUVNDQorCWlmKGludGVyTWVtKQ0KKwl7DQorCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsNCisJCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsNCisJCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5GcmVlID0gY21uTWVtRnJlZTsNCisJCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7DQorCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisNCisJCXBNZW1PUCA9ICZoQWFjRW5jLT52b01lbW9wcmF0b3I7DQorCX0NCisjZW5kaWYNCisJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgZGVmYXVsdCBwYXJhbWV0ZXIgICovDQorCWlmKGhBYWNFbmMtPmluaXRPSyA9PSAwKQ0KKwl7DQorCQkgQUFDRU5DX0NPTkZJRyBjb25maWc7DQorCQkgY29uZmlnLmFkdHNVc2VkID0gMTsNCisJCSBjb25maWcuYml0UmF0ZSA9IDEyODAwMDsNCisJCSBjb25maWcubkNoYW5uZWxzSW4gPSAyOw0KKwkJIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPSAyOw0KKwkJIGNvbmZpZy5zYW1wbGVSYXRlID0gNDQxMDA7DQorCQkgY29uZmlnLmJhbmRXaWR0aCA9IDIwMDAwOw0KKw0KKwkJIEFhY0VuY09wZW4oaEFhY0VuYywgY29uZmlnKTsNCisJfQ0KKw0KKwloQWFjRW5jLT52b01lbW9wID0gcE1lbU9QOw0KKw0KKwkqcGhDb2RlYyA9IGhBYWNFbmM7DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqDQorKiBTZXQgaW5wdXQgYXVkaW8gZGF0YS4NCisqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKyogXHBhcmFtIHBJbnB1dCBbSU5dIFRoZSBpbnB1dCBidWZmZXIgcGFyYW0uDQorKiBccGFyYW0gcE91dEJ1ZmZlciBbT1VUXSBUaGUgb3V0cHV0IGJ1ZmZlciBpbmZvLg0KKyogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorKi8NCitWT19VMzIgVk9fQVBJIHZvQUFDRW5jU2V0SW5wdXREYXRhKFZPX0hBTkRMRSBoQ29kZWMsIFZPX0NPREVDQlVGRkVSICogcElucHV0KQ0KK3sNCisJQUFDX0VOQ09ERVIgKmhBYWNFbmM7DQorCWludCAgbGVuZ3RoOw0KKw0KKwlpZihOVUxMID09IGhDb2RlYyB8fCBOVUxMID09IHBJbnB1dCB8fCBOVUxMID09IHBJbnB1dC0+QnVmZmVyKQ0KKwl7DQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwl9DQorCQ0KKwloQWFjRW5jID0gKEFBQ19FTkNPREVSICopaENvZGVjOw0KKwkNCisJLyogaW5pdCBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLw0KKwloQWFjRW5jLT5pbmJ1ZiA9IChzaG9ydCAqKXBJbnB1dC0+QnVmZmVyOw0KKwloQWFjRW5jLT5pbmxlbiA9IHBJbnB1dC0+TGVuZ3RoIC8gc2l6ZW9mKHNob3J0KTsNCisJaEFhY0VuYy0+dXNlbGVuZ3RoID0gMDsNCisNCisJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW5idWY7DQorCWhBYWNFbmMtPmVuY2xlbiA9IGhBYWNFbmMtPmlubGVuOw0KKwkNCisJLyogcmVidWlsZCBpbnRyYSBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLw0KKwlpZihoQWFjRW5jLT5pbnRsZW4pDQorCXsNCisJCWxlbmd0aCA9IG1pbihoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzSW4qQUFDRU5DX0JMT0NLU0laRSAtIGhBYWNFbmMtPmludGxlbiwgaEFhY0VuYy0+aW5sZW4pOw0KKwkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYgKyBoQWFjRW5jLT5pbnRsZW4sIA0KKwkJCWhBYWNFbmMtPmluYnVmLCBsZW5ndGgqc2l6ZW9mKHNob3J0KSk7DQorDQorCQloQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5pbnRidWY7DQorCQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbnRsZW4gKyBsZW5ndGg7DQorDQorCQloQWFjRW5jLT5pbmJ1ZiArPSBsZW5ndGg7DQorCQloQWFjRW5jLT5pbmxlbiAtPSBsZW5ndGg7DQorCX0NCisJDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqDQorKiBHZXQgdGhlIG91dHV0IGF1ZGlvIGRhdGENCisqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKyogXHBhcmFtIHBPdXRCdWZmZXIgW09VVF0gVGhlIG91dHB1dCBhdWRpbyBkYXRhDQorKiBccGFyYW0gcE91dEluZm8gW09VVF0gVGhlIGRlYyBtb2R1bGUgZmlsbGVkIGF1ZGlvIGZvcm1hdCBhbmQgdXNlZCB0aGUgaW5wdXQgc2l6ZS4NCisqCQkJCQkJIHBPdXRJbmZvLT5JbnB1dFVzZWQgaXMgdG90YWwgdXNlZCB0aGUgaW5wdXQgc2l6ZS4NCisqIFxyZXR2YWwgIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisqCQkJVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTC4gVGhlIGlucHV0IHdhcyBmaW5pc2hlZCBvciB0aGUgaW5wdXQgZGF0YSB3YXMgbm90IGVub3VnaHQuDQorKi8NCitWT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0T3V0cHV0RGF0YShWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBPdXRwdXQsIFZPX0FVRElPX09VVFBVVElORk8gKiBwT3V0SW5mbykNCit7DQorCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7DQorCVdvcmQxNiBudW1BbmNEYXRhQnl0ZXM9MDsNCisJV29yZDMyICBpbmJ1ZmxlbjsNCisJaW50IHJldCwgbGVuZ3RoOw0KKwlpZihOVUxMID09IGhBYWNFbmMpDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKw0KKwkgaW5idWZsZW4gPSBBQUNFTkNfQkxPQ0tTSVpFKmhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNJbjsNCisNCisJIC8qIGNoZWNrIHRoZSBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLw0KKwkgaWYoTlVMTCA9PSBoQWFjRW5jLT5lbmNidWYgfHwgaEFhY0VuYy0+ZW5jbGVuIDwgaW5idWZsZW4pDQorCSB7DQorCQlsZW5ndGggPSBoQWFjRW5jLT5lbmNsZW47CQkNCisJCWlmKGhBYWNFbmMtPmludGxlbiA9PSAwKQ0KKwkJewkNCisJCQloQWFjRW5jLT52b01lbW9wLT5Db3B5KFZPX0lOREVYX0VOQ19BQUMsIGhBYWNFbmMtPmludGJ1ZiwgDQorCQkJCWhBYWNFbmMtPmVuY2J1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwkJDQorCQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWhBYWNFbmMtPnVzZWxlbmd0aCArPSAobGVuZ3RoIC0gaEFhY0VuYy0+aW50bGVuKSpzaXplb2Yoc2hvcnQpOw0KKwkJfQ0KKw0KKwkJaEFhY0VuYy0+aW50bGVuID0gbGVuZ3RoOw0KKw0KKwkJcE91dHB1dC0+TGVuZ3RoID0gMDsNCisJCWlmKHBPdXRJbmZvKQ0KKwkJCXBPdXRJbmZvLT5JbnB1dFVzZWQgPSBoQWFjRW5jLT51c2VsZW5ndGg7DQorCQlyZXR1cm4gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTDsJDQorCSB9DQorDQorCSAvKiBjaGVjayB0aGUgb3V0cHV0IGFhYyBidWZmZXIgYW5kIGxlbmd0aCovDQorCSBpZihOVUxMID09IHBPdXRwdXQgfHwgTlVMTCA9PSBwT3V0cHV0LT5CdWZmZXIgfHwgcE91dHB1dC0+TGVuZ3RoIDwgKDYxNDQvOCkqaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dC8oc2l6ZW9mKFdvcmQzMikpKQ0KKwkJIHJldHVybiBWT19FUlJfT1VUUFVUX0JVRkZFUl9TTUFMTDsNCisNCisJIC8qIGFhYyBlbmNvZGVyIGNvcmUgZnVuY3Rpb24gKi8NCisJIEFhY0VuY0VuY29kZSggaEFhY0VuYywNCisJCQkoV29yZDE2KiloQWFjRW5jLT5lbmNidWYsDQorCQkJTlVMTCwNCisJCQkmbnVtQW5jRGF0YUJ5dGVzLA0KKwkJCXBPdXRwdXQtPkJ1ZmZlciwNCisJCQkmcE91dHB1dC0+TGVuZ3RoKTsNCisNCisJIC8qIHVwZGF0ZSB0aGUgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8NCisJIGlmKGhBYWNFbmMtPmludGxlbikNCisJIHsNCisJCWxlbmd0aCA9IGluYnVmbGVuIC0gaEFhY0VuYy0+aW50bGVuOwkJDQorCQloQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5pbmJ1ZjsNCisJCWhBYWNFbmMtPmVuY2xlbiA9IGhBYWNFbmMtPmlubGVuOw0KKwkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOw0KKwkJaEFhY0VuYy0+aW50bGVuID0gMDsNCisJIH0NCisJIGVsc2UNCisJIHsNCisJCSBoQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5lbmNidWYgKyBpbmJ1ZmxlbjsNCisJCSBoQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5lbmNsZW4gLSBpbmJ1ZmxlbjsNCisJCSBoQWFjRW5jLT51c2VsZW5ndGggKz0gaW5idWZsZW4qc2l6ZW9mKHNob3J0KTsNCisJIH0JIA0KKw0KKwkgLyogdXBkYXRlIHRoZSBvdXRwdXQgYWFjIGluZm9ybWF0aW9uICovDQorCWlmKHBPdXRJbmZvKQ0KKwl7DQorCQlwT3V0SW5mby0+Rm9ybWF0LkNoYW5uZWxzID0gaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dDsNCisJCXBPdXRJbmZvLT5Gb3JtYXQuU2FtcGxlUmF0ZSA9IGhBYWNFbmMtPmNvbmZpZy5zYW1wbGVSYXRlOw0KKwkJcE91dEluZm8tPkZvcm1hdC5TYW1wbGVCaXRzID0gMTY7DQorCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOw0KKwl9DQorDQorCSByZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyogVW5pbml0IHRoZSBDb2RlYy4NCisqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKyogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorKi8NCitWT19VMzIgVk9fQVBJIHZvQUFDRW5jVW5pbml0KFZPX0hBTkRMRSBoQ29kZWMpDQorew0KKwlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOw0KKwkNCisJaWYoTlVMTCAhPSBoQWFjRW5jKQ0KKwl7DQorCQkvKiBjbG9zZSB0aGUgYWFjIGVuY29kZXIgKi8NCisJCUFhY0VuY0Nsb3NlKGhBYWNFbmMsIGhBYWNFbmMtPnZvTWVtb3ApOw0KKw0KKwkJLyogZnJlZSB0aGUgYWFjIGVuY29kZXIgaGFuZGxlKi8NCisJCW1lbV9mcmVlKGhBYWNFbmMtPnZvTWVtb3AsIGhBYWNFbmMsIFZPX0lOREVYX0VOQ19BQUMpOw0KKwkJaEFhY0VuYyA9IE5VTEw7DQorCX0JDQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqDQorKiBTZXQgdGhlIHBhcmFtIGZvciBzcGVjaWFsIHRhcmdldC4NCisqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKyogXHBhcmFtIHVQYXJhbUlEIFtJTl0gVGhlIHBhcmFtIElELg0KKyogXHBhcmFtIHBEYXRhIFtJTl0gVGhlIHBhcmFtIHZhbHVlIGRlcGVuZCBvbiB0aGUgSUQ+DQorKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisqLw0KK1ZPX1UzMiBWT19BUEkgdm9BQUNFbmNTZXRQYXJhbShWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSkNCit7DQorCUFBQ0VOQ19DT05GSUcgY29uZmlnOw0KKwlBQUNFTkNfUEFSQU0qIHBBQUNfcGFyYW07DQorCVZPX0FVRElPX0ZPUk1BVCAqcFdBVl9Gb3JtYXQ7DQorCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7DQorCWludCByZXQsIGksIGJpdHJhdGUsIHRtcDsNCisJaW50IFNhbXBsZVJhdGVJZHg7DQorDQorCWlmKE5VTEwgPT0gaEFhY0VuYykNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCQ0KKwlzd2l0Y2godVBhcmFtSUQpDQorCXsNCisJY2FzZSBWT19QSURfQUFDX0VOQ1BBUkFNOiAgLyogaW5pdCBhYWMgZW5jb2RlciBwYXJhbWV0ZXIqLw0KKwkJQWFjSW5pdERlZmF1bHRDb25maWcoJmNvbmZpZyk7DQorCQlpZihwRGF0YSA9PSBOVUxMKQ0KKwkJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCQlwQUFDX3BhcmFtID0gKEFBQ0VOQ19QQVJBTSopcERhdGE7DQorCQljb25maWcuYWR0c1VzZWQgPSBwQUFDX3BhcmFtLT5hZHRzVXNlZDsNCisJCWNvbmZpZy5iaXRSYXRlID0gcEFBQ19wYXJhbS0+Yml0UmF0ZTsNCisJCWNvbmZpZy5uQ2hhbm5lbHNJbiA9IHBBQUNfcGFyYW0tPm5DaGFubmVsczsNCisJCWNvbmZpZy5uQ2hhbm5lbHNPdXQgPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7DQorCQljb25maWcuc2FtcGxlUmF0ZSA9IHBBQUNfcGFyYW0tPnNhbXBsZVJhdGU7DQorDQorCQkvKiBjaGVjayB0aGUgY2hhbm5lbCAqLw0KKwkJaWYoY29uZmlnLm5DaGFubmVsc0luPCAxICB8fCBjb25maWcubkNoYW5uZWxzSW4gPiBNQVhfQ0hBTk5FTFMgIHx8DQorICAgICAgICAgICAgIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPCAxIHx8IGNvbmZpZy5uQ2hhbm5lbHNPdXQgPiBNQVhfQ0hBTk5FTFMgfHwgY29uZmlnLm5DaGFubmVsc0luIDwgY29uZmlnLm5DaGFubmVsc091dCkNCisJCQkgcmV0dXJuIFZPX0VSUl9BVURJT19VTlNDSEFOTkVMOw0KKw0KKwkJLyogY2hlY2sgdGhlIHNhbXBsZXJhdGUgKi8NCisJCXJldCA9IC0xOw0KKwkJZm9yKGkgPSAwOyBpIDwgTlVNX1NBTVBMRV9SQVRFUzsgaSsrKQ0KKwkJew0KKwkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQ0KKwkJCXsNCisJCQkJcmV0ID0gMDsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwkJaWYocmV0IDwgMCkNCisJCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU1NBTVBMRVJBVEU7DQorDQorCQlTYW1wbGVSYXRlSWR4ID0gaTsNCisNCisJCXRtcCA9IDQ0MTsNCisJCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkgDQorCQkJdG1wID00ODA7DQorCQkvKiBjaGVjayB0aGUgYml0cmF0ZSAqLw0KKwkJaWYoY29uZmlnLmJpdFJhdGUhPTAgJiYgKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPCA0MDAwKSB8fA0KKyAgICAgICAgICAgKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPiAxNjAwMDApIHx8IA0KKwkJICAgKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KSkNCisJCXsNCisJCQljb25maWcuYml0UmF0ZSA9IDY0MCpjb25maWcuc2FtcGxlUmF0ZS90bXAqY29uZmlnLm5DaGFubmVsc091dDsNCisNCisJCQlpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkNCisJCQkJY29uZmlnLmJpdFJhdGUgPSA0MDAwICogY29uZmlnLm5DaGFubmVsc091dDsNCisJCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KQ0KKwkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dDsNCisJCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPiAxNjAwMDApDQorCQkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLm5DaGFubmVsc091dCoxNjAwMDA7DQorCQl9DQorDQorCQkvKiBjaGVjayB0aGUgYmFuZHdpZHRoICovDQorCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0Ow0KKwkJYml0cmF0ZSA9IGJpdHJhdGUgKiB0bXAgLyBjb25maWcuc2FtcGxlUmF0ZTsNCisNCisJCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspDQorCQl7DQorCQkJaWYgKHJhdGVzW2ldID49IGJpdHJhdGUpDQorCQkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsNCisNCisJCS8qIGluaXQgYWFjIGVuY29kZXIgY29yZSAqLw0KKwkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOw0KKwkJaWYocmV0KSANCisJCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7DQorCQlicmVhazsNCisJY2FzZSBWT19QSURfQVVESU9fRk9STUFUOgkvKiBpbml0IHBjbSBjaGFubmVsIGFuZCBzYW1wbGVyYXRlKi8NCisJCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOw0KKwkJaWYocERhdGEgPT0gTlVMTCkNCisJCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwkJcFdBVl9Gb3JtYXQgPSAoVk9fQVVESU9fRk9STUFUKilwRGF0YTsNCisJCWNvbmZpZy5hZHRzVXNlZCA9IDE7DQorCQljb25maWcubkNoYW5uZWxzSW4gPSBwV0FWX0Zvcm1hdC0+Q2hhbm5lbHM7DQorCQljb25maWcubkNoYW5uZWxzT3V0ID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOw0KKwkJY29uZmlnLnNhbXBsZVJhdGUgPSBwV0FWX0Zvcm1hdC0+U2FtcGxlUmF0ZTsNCisNCisJCS8qIGNoZWNrIHRoZSBjaGFubmVsICovDQorCQlpZihjb25maWcubkNoYW5uZWxzSW48IDEgIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA+IE1BWF9DSEFOTkVMUyAgfHwNCisgICAgICAgICAgICAgY29uZmlnLm5DaGFubmVsc091dCA8IDEgfHwgY29uZmlnLm5DaGFubmVsc091dCA+IE1BWF9DSEFOTkVMUyB8fCBjb25maWcubkNoYW5uZWxzSW4gPCBjb25maWcubkNoYW5uZWxzT3V0KQ0KKwkJCSByZXR1cm4gVk9fRVJSX0FVRElPX1VOU0NIQU5ORUw7DQorDQorCQkvKiBjaGVjayB0aGUgc2FtcGxlYml0cyAqLw0KKwkJaWYocFdBVl9Gb3JtYXQtPlNhbXBsZUJpdHMgIT0gMTYpDQorCQl7DQorCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNGRUFUVVJFOw0KKwkJfQ0KKw0KKwkJLyogY2hlY2sgdGhlIHNhbXBsZXJhdGUgKi8NCisJCXJldCA9IC0xOw0KKwkJZm9yKGkgPSAwOyBpIDwgTlVNX1NBTVBMRV9SQVRFUzsgaSsrKQ0KKwkJew0KKwkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQ0KKwkJCXsNCisJCQkJcmV0ID0gMDsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwkJaWYocmV0IDwgMCkNCisJCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU1NBTVBMRVJBVEU7DQorDQorCQlTYW1wbGVSYXRlSWR4ID0gaTsNCisNCisJCS8qIHVwZGF0ZSB0aGUgYml0cmF0ZXMgKi8NCisJCXRtcCA9IDQ0MTsNCisJCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkgDQorCQkJdG1wID00ODA7DQorDQorCQljb25maWcuYml0UmF0ZSA9IDY0MCpjb25maWcuc2FtcGxlUmF0ZS90bXAqY29uZmlnLm5DaGFubmVsc091dDsNCisNCisJCWlmKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPCA0MDAwKQ0KKwkJCWNvbmZpZy5iaXRSYXRlID0gNDAwMCAqIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KQ0KKwkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0Ow0KKwkJZWxzZSBpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKQ0KKwkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLm5DaGFubmVsc091dCoxNjAwMDA7DQorDQorCQkvKiBjaGVjayB0aGUgYmFuZHdpZHRoICovDQorCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0Ow0KKwkJYml0cmF0ZSA9IGJpdHJhdGUgKiB0bXAgLyBjb25maWcuc2FtcGxlUmF0ZTsNCisNCisJCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspDQorCQl7DQorCQkJaWYgKHJhdGVzW2ldID49IGJpdHJhdGUpDQorCQkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsNCisJCQ0KKwkJLyogaW5pdCBhYWMgZW5jb2RlciBjb3JlICovDQorCQlyZXQgPSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7DQorCQlpZihyZXQpIA0KKwkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsNCisJfQ0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyogR2V0IHRoZSBwYXJhbSBmb3Igc3BlY2lhbCB0YXJnZXQuDQorKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisqIFxwYXJhbSB1UGFyYW1JRCBbSU5dIFRoZSBwYXJhbSBJRC4NCisqIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEPg0KKyogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorKi8NCitWT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpDQorew0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyAqIEdldCBhdWRpbyBjb2RlYyBBUEkgaW50ZXJmYWNlDQorICogXHBhcmFtIHBFbmNIYW5kbGUgW291dF0gUmV0dXJuIHRoZSBBQUMgRW5jb2RlciBoYW5kbGUuDQorICogXHJldHZhbCBWT19FUlJfT0sgU3VjY2VlZGVkLg0KKyAqLw0KK1ZPX1MzMiBWT19BUEkgdm9HZXRBQUNFbmNBUEkoVk9fQVVESU9fQ09ERUNBUEkgKiBwRGVjSGFuZGxlKQ0KK3sNCisJaWYocERlY0hhbmRsZSA9PSBOVUxMKQ0KKwkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisJCQ0KKwlwRGVjSGFuZGxlLT5Jbml0ID0gdm9BQUNFbmNJbml0Ow0KKwlwRGVjSGFuZGxlLT5TZXRJbnB1dERhdGEgPSB2b0FBQ0VuY1NldElucHV0RGF0YTsNCisJcERlY0hhbmRsZS0+R2V0T3V0cHV0RGF0YSA9IHZvQUFDRW5jR2V0T3V0cHV0RGF0YTsNCisJcERlY0hhbmRsZS0+U2V0UGFyYW0gPSB2b0FBQ0VuY1NldFBhcmFtOw0KKwlwRGVjSGFuZGxlLT5HZXRQYXJhbSA9IHZvQUFDRW5jR2V0UGFyYW07DQorCXBEZWNIYW5kbGUtPlVuaW5pdCA9IHZvQUFDRW5jVW5pbml0Ow0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjQ3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCkBAIC0wLDAgKzEsMjM5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhYWNlbmNfY29yZS5jDQorDQorCUNvbnRlbnQ6CWFhYyBlbmNvZGVyIGNvcmUgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJhYWNlbmNfY29yZS5oIgorI2luY2x1ZGUgImJpdGVuYy5oIgorCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJwc3lfbWFpbi5oIgorI2luY2x1ZGUgInFjX21haW4uaCIKKyNpbmNsdWRlICJwc3lfbWFpbi5oIgorI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQWFjSW5pdERlZmF1bHRDb25maWcKKyogZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKQoreworICAvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zICovCisgIGNvbmZpZy0+YWR0c1VzZWQgICAgICAgID0gMTsKKyAgY29uZmlnLT5uQ2hhbm5lbHNJbiAgICAgPSAyOworICBjb25maWctPm5DaGFubmVsc091dCAgICA9IDI7CisgIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gMTI4MDAwOyAgICAgICAgICAgICAgICAgICAgICAKKyAgY29uZmlnLT5iYW5kV2lkdGggICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQWFjRW5jT3BlbgorKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGVuY29kZXIgaW5zdGFuY2UKKyogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgIEFhY0VuY09wZW4oICBBQUNfRU5DT0RFUiogICAgICBoQWFjRW5jLCAgICAgICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCisgICAgICAgICAgICAgICAgICAgICBjb25zdCAgQUFDRU5DX0NPTkZJRyAgICAgY29uZmlnICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgV29yZDMyIGk7DQorICBXb3JkMzIgZXJyb3IgPSAwOworICBXb3JkMTYgcHJvZmlsZSA9IDE7DQorCisgIEVMRU1FTlRfSU5GTyAqZWxJbmZvID0gTlVMTDsKKyAgIAorICBpZiAoaEFhY0VuYz09MCkgeworICAgIGVycm9yPTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgICAKKyAgaWYgKCFlcnJvcikgeworICAgIGhBYWNFbmMtPmNvbmZpZyA9IGNvbmZpZzsKKyAgfQorCisgIGlmICghZXJyb3IpIHsKKyAgICBlcnJvciA9IEluaXRFbGVtZW50SW5mbyAoY29uZmlnLm5DaGFubmVsc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNFbmMtPmVsSW5mbyk7CisgIH0KKw0KKyAgaWYgKCFlcnJvcikgeworICAgIGVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87CisgIH0KKworICBpZiAoIWVycm9yKSB7CisgICAgLyogdXNlIG9yIG5vdCB0bnMgdG9vbCBmb3IgbG9uZyBhbmQgc2hvcnQgYmxvY2sgKi8KKwkgV29yZDE2IHRuc01hc2s9MzsgICAgICAKKworCS8qIGluaXQgZW5jb2RlciBwc3ljaG9hY291c3RpYyAqLworICAgIGVycm9yID0gcHN5TWFpbkluaXQoJmhBYWNFbmMtPnBzeUtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0bnNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLmJhbmRXaWR0aCk7CisgIH0KKworIC8qIHVzZSBvciBub3QgYWR0cyBoZWFkZXIgKi8KKyAgaWYoIWVycm9yKSB7DQorCSAgaEFhY0VuYy0+cWNPdXQucWNFbGVtZW50LmFkdHNVc2VkID0gY29uZmlnLmFkdHNVc2VkOw0KKyAgfQorCisgIC8qIGluaXQgZW5jb2RlciBxdWFudGl6YXRpb24gKi8KKyAgaWYgKCFlcnJvcikgeworICAgIHN0cnVjdCBRQ19JTklUIHFjSW5pdDsKKworICAgIC8qcWNJbml0LmNoYW5uZWxNYXBwaW5nID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOyovCisgICAgcWNJbml0LmVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87CisKKyAgICBxY0luaXQubWF4Qml0cyA9IChXb3JkMTYpIChNQVhCSVRTX0NPRUYqZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsKKyAgICBxY0luaXQuYml0UmVzID0gcWNJbml0Lm1heEJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBxY0luaXQuYXZlcmFnZUJpdHMgPSAoV29yZDE2KSAoKGNvbmZpZy5iaXRSYXRlICogRlJBTUVfTEVOX0xPTkcpIC8gY29uZmlnLnNhbXBsZVJhdGUpOworCisgICAgcWNJbml0LnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBjb25maWcuc2FtcGxlUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgcWNJbml0Lm1lYW5QZSA9IChXb3JkMTYpICgoMTAgKiBGUkFNRV9MRU5fTE9ORyAqIGhBYWNFbmMtPmNvbmZpZy5iYW5kV2lkdGgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLnNhbXBsZVJhdGU+PjEpKTsKKworICAgIHFjSW5pdC5tYXhCaXRGYWMgPSAoV29yZDE2KSAoKDEwMCAqIChNQVhCSVRTX0NPRUYtTUlOQklUU19DT0VGKSogZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKS8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNJbml0LmF2ZXJhZ2VCaXRzP3FjSW5pdC5hdmVyYWdlQml0czoxKSk7CisKKyAgICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy5iaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGVycm9yID0gUUNJbml0KCZoQWFjRW5jLT5xY0tlcm5lbCwgJnFjSW5pdCk7CisgIH0KKworICAvKiBpbml0IGJpdHN0cmVhbSBlbmNvZGVyICovCisgIGlmICghZXJyb3IpIHsKKyAgICBoQWFjRW5jLT5ic2VJbml0Lm5DaGFubmVscyAgID0gZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOyAgICAgICAgICAgICAgICAKKyAgICBoQWFjRW5jLT5ic2VJbml0LmJpdHJhdGUgICAgID0gY29uZmlnLmJpdFJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBoQWFjRW5jLT5ic2VJbml0LnNhbXBsZVJhdGUgID0gY29uZmlnLnNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgICAgICAKKyAgICBoQWFjRW5jLT5ic2VJbml0LnByb2ZpbGUgICAgID0gcHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFhY0VuY0VuY29kZQorKiBkZXNjcmlwdGlvbjogIGVuY29kZSBwY20gdG8gYWFjIGRhdGEgY29yZSBmdW5jdGlvbgorKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBBYWNFbmNFbmNvZGUoQUFDX0VOQ09ERVIgKmFhY0VuYywJCS8qITwgYW4gZW5jb2RlciBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLCAgICAgICAgIC8qITwgQkxPQ0tTSVpFKm5DaGFubmVscyBhdWRpbyBzYW1wbGVzLCBpbnRlcmxlYXZlZCAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLCAgICAgLyohPCBwb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbnVtQW5jQnl0ZXMsCQkvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcyAqLworICAgICAgICAgICAgICAgICAgICBVV29yZDggKm91dEJ5dGVzLCAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgKG11c3QgYmUgbGFyZ2UgTUlOQklUU19DT0VGLzgqTUFYX0NIQU5ORUxTIGJ5dGVzKSAqLworICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKm51bU91dEJ5dGVzICAgICAgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciBhZnRlciBwcm9jZXNzaW5nICovCisgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgRUxFTUVOVF9JTkZPICplbEluZm8gPSAmYWFjRW5jLT5lbEluZm87CisgIFdvcmQxNiBnbG9iVXNlZEJpdHM7CisgIFdvcmQxNiBhbmNEYXRhQnl0ZXMsIGFuY0RhdGFCeXRlc0xlZnQ7CisgIAorICBhbmNEYXRhQnl0ZXMgPSBhbmNEYXRhQnl0ZXNMZWZ0ID0gKm51bUFuY0J5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLyogaW5pdCBvdXRwdXQgYWFjIGRhdGEgYnVmZmVyIGFuZCBsZW5ndGggKi8KKyAgYWFjRW5jLT5oQml0U3RyZWFtID0gQ3JlYXRlQml0QnVmZmVyKCZhYWNFbmMtPmJpdFN0cmVhbSwgb3V0Qnl0ZXMsICpudW1PdXRCeXRlcyk7CisKKyAgLyogcHN5Y2hvYWNvdXN0aWMgcHJvY2VzcyAqLworICBwc3lNYWluKGFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dCwgICAgCisgICAgICAgICAgZWxJbmZvLAorICAgICAgICAgIHRpbWVTaWduYWwsCisgICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeURhdGFbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC50bnNEYXRhW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKKyAgICAgICAgICAmYWFjRW5jLT5wc3lLZXJuZWwucHN5Q29uZkxvbmcsCisgICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeUNvbmZTaG9ydCwKKyAgICAgICAgICAmYWFjRW5jLT5wc3lPdXQucHN5T3V0Q2hhbm5lbFtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCisgICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgYWFjRW5jLT5wc3lLZXJuZWwucFNjcmF0Y2hUbnMsCisJCSAgYWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZSk7CisKKyAgLyogYWRqdXN0IGJpdHJhdGUgYW5kIGZyYW1lIGxlbmd0aCAqLworICBBZGp1c3RCaXRyYXRlKCZhYWNFbmMtPnFjS2VybmVsLAorICAgICAgICAgICAgICAgIGFhY0VuYy0+Y29uZmlnLmJpdFJhdGUsCisgICAgICAgICAgICAgICAgYWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZSk7CisgICAgCisgIC8qIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHByb2Nlc3MgKi8KKyAgUUNNYWluKCZhYWNFbmMtPnFjS2VybmVsLCAgICAgICAgIAorICAgICAgICAgJmFhY0VuYy0+cWNLZXJuZWwuZWxlbWVudEJpdHMsCisgICAgICAgICAmYWFjRW5jLT5xY0tlcm5lbC5hZGpUaHIuYWRqVGhyU3RhdGVFbGVtLAorICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dEVsZW1lbnQsCisgICAgICAgICAmYWFjRW5jLT5xY091dC5xY0NoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgJmFhY0VuYy0+cWNPdXQucWNFbGVtZW50LAorICAgICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsLAorCQkgbWluKGFuY0RhdGFCeXRlc0xlZnQsYW5jRGF0YUJ5dGVzKSk7CisKKyAgYW5jRGF0YUJ5dGVzTGVmdCA9IGFuY0RhdGFCeXRlc0xlZnQgLSBhbmNEYXRhQnl0ZXM7CisKKyAgZ2xvYlVzZWRCaXRzID0gRmluYWxpemVCaXRDb25zdW1wdGlvbigmYWFjRW5jLT5xY0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7CisKKyAgLyogd3JpdGUgYml0c3RyZWFtIHByb2Nlc3MgKi8KKyAgV3JpdGVCaXRzdHJlYW0oYWFjRW5jLT5oQml0U3RyZWFtLAkJCQkgCisgICAgICAgICAgICAgICAgICplbEluZm8sCisgICAgICAgICAgICAgICAgICZhYWNFbmMtPnFjT3V0LAorICAgICAgICAgICAgICAgICAmYWFjRW5jLT5wc3lPdXQsCisgICAgICAgICAgICAgICAgICZnbG9iVXNlZEJpdHMsCQkJCSAKKyAgICAgICAgICAgICAgICAgYW5jQnl0ZXMsDQorCQkJCSBhYWNFbmMtPnBzeUtlcm5lbC5zYW1wbGVSYXRlSWR4KTsKKworICB1cGRhdGVCaXRyZXMoJmFhY0VuYy0+cWNLZXJuZWwsCisgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBiaXRzdHJlYW0gKi8KKyAgKm51bU91dEJ5dGVzID0gR2V0Qml0c0F2YWlsKGFhY0VuYy0+aEJpdFN0cmVhbSkgPj4gMzsNCisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6QWFjRW5jQ2xvc2UKKyogZGVzY3JpcHRpb246IGRlYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgaWYgKGhBYWNFbmMpIHsgIAorICAgIFFDRGVsZXRlKCZoQWFjRW5jLT5xY0tlcm5lbCwgcE1lbU9QKTsKKworICAgIFFDT3V0RGVsZXRlKCZoQWFjRW5jLT5xY091dCwgcE1lbU9QKTsKKworICAgIFBzeURlbGV0ZSgmaEFhY0VuYy0+cHN5S2VybmVsLCBwTWVtT1ApOworCisgICAgUHN5T3V0RGVsZXRlKCZoQWFjRW5jLT5wc3lPdXQsIHBNZW1PUCk7CisKKyAgICBEZWxldGVCaXRCdWZmZXIoJmhBYWNFbmMtPmhCaXRTdHJlYW0pOworCisJaWYoaEFhY0VuYy0+aW50YnVmKQorCXsKKwkJbWVtX2ZyZWUocE1lbU9QLCBoQWFjRW5jLT5pbnRidWYsIFZPX0lOREVYX0VOQ19BQUMpOworCQloQWFjRW5jLT5pbnRidWYgPSBOVUxMOworCX0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKQEAgLTAsMCArMSwxMjIzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhZGpfdGhyLmMNCisNCisJQ29udGVudDoJVGhyZXNob2xkIGNvbXBlbnNhdGlvbiBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKKyNpbmNsdWRlICJhZGpfdGhyLmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorI2luY2x1ZGUgImxpbmVfcGUuaCIKKworCisjZGVmaW5lICBtaW5TbnJMaW1pdCAgICAweDY2NjYgLyogMSBkQiAqLworI2RlZmluZSAgUEVCSVRTX0NPRUYJMHgxNzBhIC8qIDAuMTgqKDEgPDwgMTUpKi8NCisNCisjZGVmaW5lICBIT0xFX1RIUl9MT05HCTB4Mjg3MwkvKiAwLjMxNiooMSA8PCAxNSkgKi8NCisjZGVmaW5lICBIT0xFX1RIUl9TSE9SVCAweDQwMDAgIC8qIDAuNSAgKigxIDw8IDE1KSAqLw0KKw0KKyNkZWZpbmUgIE1TX1RIUlNQUkVBRF9DT0VGIDB4NzMzMyAgLyogMC45ICogKDEgPDwgMTUpICovDQorDQorI2RlZmluZQkgTUlOX1NOUl9DT0VGCSAgIDB4NjUxZiAgLyogMy4xNiogKDEgPDwgKDE1IC0gMikpICovDQorCisvKiB2YWx1ZXMgZm9yIGF2b2lkIGhvbGUgZmxhZyAqLworZW51bSBfYXZvaWRfaG9sZV9zdGF0ZSB7CisgIE5PX0FIICAgICAgICAgICAgICA9MCwKKyAgQUhfSU5BQ1RJVkUgICAgICAgID0xLAorICBBSF9BQ1RJVkUgICAgICAgICAgPTIKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmJpdHMycGUKKyogZGVzY3JpcHRpb246IGNvbnZlcnQgZnJvbSBiaXRzIHRvIHBlCisqCQkJICAgcGUgPSAxLjE4KmRlc2lyZWRCaXRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IGJpdHMycGUoY29uc3QgV29yZDE2IGJpdHMpIHsKKyAgcmV0dXJuIChiaXRzICsgKChQRUJJVFNfQ09FRiAqIGJpdHMpID4+IDE1KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmNhbGNUaHJlc2hFeHAKKyogZGVzY3JpcHRpb246IGxvdWRuZXNzIGNhbGN1bGF0aW9uICh0aHJlc2hvbGQgdG8gdGhlIHBvd2VyIG9mIHJlZEV4cCkKKyoJCQkgICB0aHIobileMC4yNQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNhbGNUaHJlc2hFeHAoV29yZDMyIHRockV4cFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCit7CisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7DQorICBXb3JkMzIgKnB0aHJFeHAsICpwc2ZiVGhyZTsKKyAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07DQorCSBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkJIA0KKwkgIHB0aHJFeHAgPSAmKHRockV4cFtjaF1bc2ZiR3JwXSk7DQorCSAgcHNmYlRocmUgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7DQorCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCQkqcHRockV4cCA9IHJzcXJ0KHJzcXJ0KCpwc2ZiVGhyZSxJTlRfQklUUyksSU5UX0JJVFMpOw0KKwkJcHRockV4cCsrOyBwc2ZiVGhyZSsrOworICAgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmFkYXB0TWluU25yCisqIGRlc2NyaXB0aW9uOiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cgZW5lcmdpZXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhZGFwdE1pblNucihQU1lfT1VUX0NIQU5ORUwgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscykKK3sKKyAgV29yZDE2IGNoLCBzZmIsIHNmYk9mZnMsIHNoaWZ0OworICBXb3JkMzIgblNmYiwgYXZnRW47CisgIFdvcmQxNiBsb2dfYXZnRW4gPSAwOworICBXb3JkMzIgc3RhcnRSYXRpb194X2F2Z0VuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworCisgICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLworICAgIGF2Z0VuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIG5TZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgYXZnRW4gPSBMX2FkZChhdmdFbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYk9mZnMrc2ZiXSk7CisgICAgICAgIG5TZmIgPSBuU2ZiICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgIAorICAgIGlmIChuU2ZiID4gMCkgeworCSAgYXZnRW4gPSBhdmdFbiAvIG5TZmI7DQorCisgICAgICBsb2dfYXZnRW4gPSBpTG9nNChhdmdFbik7CisgICAgICBzdGFydFJhdGlvX3hfYXZnRW4gPSBmaXhtdWwobXNhUGFyYW0tPnN0YXJ0UmF0aW8sIGF2Z0VuKTsKKyAgICB9CisKKyAgICAKKyAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCisgICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBpZiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYk9mZnMrc2ZiXSA8IHN0YXJ0UmF0aW9feF9hdmdFbikgeworICAgICAgICAgIFdvcmQxNiBkYlJhdGlvLCBtaW5TbnJSZWQ7CisgICAgICAgICAgV29yZDMyIHNuclJlZDsKKyAgICAgICAgICBXb3JkMTYgbmV3TWluU25yOworICAgICAgICAgIAorICAgICAgICAgIGRiUmF0aW8gPSBsb2dfYXZnRW4gLSBsb2dTZmJFbmVyZ3lbY2hdW3NmYk9mZnMrc2ZiXTsKKyAgICAgICAgICBkYlJhdGlvID0gZGJSYXRpbyArIChkYlJhdGlvIDw8IDEpOworCisgICAgICAgICAgbWluU25yUmVkID0gMTEwIC0gKChkYlJhdGlvICsgKGRiUmF0aW8gPDwgMSkpID4+IDIpOworICAgICAgICAgIG1pblNuclJlZCA9IG1heChtaW5TbnJSZWQsIDIwKTsgLyogMTEwOiAoMC4zNzUocmVkT2ZmcykrMSkqODAsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogMC4wMDM3NShyZWRSYXRpb0ZhYykqODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6IDAuMjUobWF4UmVkKSAqIDgwICovCisKKyAgICAgICAgICBzbnJSZWQgPSBtaW5TbnJSZWQgKiBpTG9nNCgocHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA8PCAxNikpOyAKKyAgICAgICAgICAvKiAKKyAgICAgICAgICAgICBzbnJSZWRJIHNpIG5vdyBzY2FsZWQgYnkgODAgKG1pblNuclJlZCkgYW5kIDQgKGZmcl9pTG9nNCkKKyAgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgICBuZXdNaW5TbnIgPSByb3VuZDE2KHBvdzJfeHkoc25yUmVkLDgwKjQpKTsKKyAgICAgICAgIAorICAgICAgICAgIHBzeU91dENoYW4tPnNmYk1pblNucltzZmJPZmZzK3NmYl0gPSBtaW4obmV3TWluU25yLCBtaW5TbnJMaW1pdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmluaXRBdm9pZEhvbGVGbGFnCisqIGRlc2NyaXB0aW9uOiBkZXRlcm1pbmUgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBub3QgbmVjZXNzYXJ5IHJlc3AuIHBvc3NpYmxlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdEF2b2lkSG9sZUZsYWcoV29yZDE2IGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSF9QQVJBTSAqYWhQYXJhbSkKK3sKKyAgV29yZDE2IGNoLCBzZmIsIHNmYkdycCwgc2hpZnQ7CisgIFdvcmQzMiB0aHJlc2hvbGQ7CisgIFdvcmQzMiogcHNmYlNwcmVhZEVuOworCisgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgICAKKyAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgICAgcHNmYlNwcmVhZEVuID0gcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3kgKyBzZmJHcnA7DQorCQkgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCQkJKnBzZmJTcHJlYWRFbiA9ICpwc2ZiU3ByZWFkRW4gPj4gMTsgIC8qIDAuNSAqLw0KKwkJCSsrcHNmYlNwcmVhZEVuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsNCisJCXBzZmJTcHJlYWRFbiA9IHBzeU91dENoYW4tPnNmYlNwcmVhZGVkRW5lcmd5ICsgc2ZiR3JwOworICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgKnBzZmJTcHJlYWRFbiA9ICgqcHNmYlNwcmVhZEVuID4+IDEpICsgKCpwc2ZiU3ByZWFkRW4gPj4gMyk7ICAvKiAwLjYzICovDQorCQkgICsrcHNmYlNwcmVhZEVuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaW5jcmVhc2UgbWluU25yIGZvciBsb2NhbCBwZWFrcywgZGVjcmVhc2UgaXQgZm9yIHZhbGxleXMgKi8KKyAgaWYgKGFoUGFyYW0tPm1vZGlmeU1pblNucikgeworICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgIAorICAgICAgaWYgKHBzeU91dENoYW4tPndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICAgICAgdGhyZXNob2xkID0gSE9MRV9USFJfTE9ORzsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyZXNob2xkID0gSE9MRV9USFJfU0hPUlQ7CisKKyAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICAgIFdvcmQxNiAqcHNmYk1pblNuciA9IHBzeU91dENoYW4tPnNmYk1pblNuciArIHNmYkdycDsNCisJCWZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICBXb3JkMzIgc2ZiRW4sIHNmYkVubTEsIHNmYkVucDEsIGF2Z0VuOworICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChzZmIgPiAwKQorICAgICAgICAgICAgc2ZiRW5tMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiLTFdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYkVubTEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwXTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoc2ZiIDwgKHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwLTEpKQorICAgICAgICAgICAgc2ZiRW5wMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiKzFdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNmYkVucDEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisgICAgICAgICAgYXZnRW4gPSAoc2ZiRW5tMSArIHNmYkVucDEpID4+IDE7CisgICAgICAgICAgc2ZiRW4gPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoc2ZiRW4gPiBhdmdFbiAmJiBhdmdFbiA+IDApIHsKKyAgICAgICAgICAgIFdvcmQzMiB0bXBNaW5TbnI7CisgICAgICAgICAgICBzaGlmdCA9IG5vcm1fbChzZmJFbik7DQorCQkJdG1wTWluU25yID0gRGl2XzMyKExfbXB5X2xzKGF2Z0VuLCBtaW5TbnJMaW1pdCkgPDwgc2hpZnQsIHNmYkVuIDw8IHNoaWZ0ICk7CisgICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCBIT0xFX1RIUl9MT05HKTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHRtcE1pblNuciA9IG1heCh0bXBNaW5TbnIsIHRocmVzaG9sZCk7CisgICAgICAgICAgICAqcHNmYk1pblNuciA9IG1pbigqcHNmYk1pblNuciwgdG1wTWluU25yKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogdmFsbGV5ID8gKi8KKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoKHNmYkVuIDwgKGF2Z0VuID4+IDEpKSAmJiAoc2ZiRW4gPiAwKSkgeworICAgICAgICAgICAgV29yZDMyIHRtcE1pblNucjsKKyAgICAgICAgICAgIFdvcmQzMiBtaW5TbnJFbiA9IExfbXB5X3d4KGF2Z0VuLCAqcHNmYk1pblNucik7ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKG1pblNuckVuIDwgc2ZiRW4pIHsNCisJCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuKTsKKyAgICAgICAgICAgICAgdG1wTWluU25yID0gRGl2XzMyKCBtaW5TbnJFbiA8PCBzaGlmdCwgc2ZiRW48PHNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICB0bXBNaW5TbnIgPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXBNaW5TbnIgPSBtaW4obWluU25yTGltaXQsIHRtcE1pblNucik7CisKKyAgICAgICAgICAgICpwc2ZiTWluU25yID0KKyAgICAgICAgICAgICAgKG1pbigodG1wTWluU25yID4+ICAyKSwgbXVsdCgqcHNmYk1pblNuciwgTUlOX1NOUl9DT0VGKSkgPDwgMik7CisgICAgICAgICAgfQ0KKwkJICBwc2ZiTWluU25yKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzdGVyZW86IGFkYXB0IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBzZmJNaW5TbnIgb2YgbWlkIGFuZAorICAgICBzaWRlIGNoYW5uZWxzICovCisgICAKKyAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuTSA9ICZwc3lPdXRDaGFubmVsWzBdOworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhblMgPSAmcHN5T3V0Q2hhbm5lbFsxXTsKKyAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbk0tPnNmYkNudDsgc2ZiKyspIHsKKyAgICAgIGlmIChwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrW3NmYl0pIHsKKyAgICAgICAgV29yZDMyIHNmYkVuTSA9IHBzeU91dENoYW5NLT5zZmJFbmVyZ3lbc2ZiXTsKKyAgICAgICAgV29yZDMyIHNmYkVuUyA9IHBzeU91dENoYW5TLT5zZmJFbmVyZ3lbc2ZiXTsKKyAgICAgICAgV29yZDMyIG1heFNmYkVuID0gbWF4KHNmYkVuTSwgc2ZiRW5TKTsKKyAgICAgICAgV29yZDMyIG1heFRociA9IExfbXB5X3d4KG1heFNmYkVuLCBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0pID4+IDE7ICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBpZihtYXhUaHIgPj0gc2ZiRW5NKSB7CisgICAgICAgICAgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuTSk7IA0KKwkJICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSwgDQorCQkJICByb3VuZDE2KERpdl8zMihtYXhUaHI8PHNoaWZ0LCBzZmJFbk0gPDwgc2hpZnQpKSksIG1pblNuckxpbWl0KTsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIGlmKG1heFRociA+PSBzZmJFblMpIHsKKyAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0gPSBNQVhfMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7DQorCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuUyk7CisgICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0sIA0KKwkJCSAgcm91bmQxNihEaXZfMzIobWF4VGhyIDw8IHNoaWZ0LCBzZmJFblMgPDwgc2hpZnQpKSksIG1pblNuckxpbWl0KTsKKyAgICAgICAgfQorCisgICAgICAgICAKKyAgICAgICAgaWYgKHNmYkVuTSA+IHBzeU91dENoYW5NLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdKQorICAgICAgICAgIHBzeU91dENoYW5TLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdID0gTF9tcHlfbHMoc2ZiRW5TLCBNU19USFJTUFJFQURfQ09FRik7CisgICAgICAgICAKKyAgICAgICAgaWYgKHNmYkVuUyA+IHBzeU91dENoYW5TLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdKQorICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdID0gTF9tcHlfbHMoc2ZiRW5NLCBNU19USFJTUFJFQURfQ09FRik7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKyAgICAgIFdvcmQxNiAqcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7DQorCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgICAgICAgCisgICAgICAgIGlmICgocHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0pIHx8CisgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdIDw9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXSkgfHwKKyAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0gPT0gTUFYXzE2KSkgeworICAgICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAqcGFoRmxhZysrID0gQUhfSU5BQ1RJVkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoc2ZiPXBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmNhbGNQZU5vQUgKKyogZGVzY3JpcHRpb246IHN1bSB0aGUgcGUgZGF0YSBvbmx5IGZvciBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIGluYWN0aXZlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY2FsY1BlTm9BSChXb3JkMTYgICAgICAgICAgKnBlLAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmNvbnN0UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpuQWN0aXZlTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscykKK3sKKyAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsNCisgIGludCBpcGUsIGljb25zdFBhcnQsIGluQWN0aXZlTGluZXM7CisKKyAgaXBlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGljb25zdFBhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpbkFjdGl2ZUxpbmVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKKyAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgCisgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7CisgICAgICAgICAgaXBlID0gaXBlICsgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07CisgICAgICAgICAgaWNvbnN0UGFydCA9IGljb25zdFBhcnQgKyBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07CisgICAgICAgICAgaW5BY3RpdmVMaW5lcyA9IGluQWN0aXZlTGluZXMgKyBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0NCisKKyAgKnBlID0gc2F0dXJhdGUoaXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICpjb25zdFBhcnQgPSBzYXR1cmF0ZShpY29uc3RQYXJ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKm5BY3RpdmVMaW5lcyA9IHNhdHVyYXRlKGluQWN0aXZlTGluZXMpOyAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOnJlZHVjZVRocmVzaG9sZHMKKyogZGVzY3JpcHRpb246IGFwcGx5IHJlZHVjdGlvbiBmb3JtdWxhCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmVkdWNlVGhyZXNob2xkcyhQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIHRockV4cFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgICAgIHJlZFZhbCkKK3sKKyAgV29yZDMyIHNmYlRoclJlZHVjZWQ7CisgIFdvcmQzMiAqcHNmYkVuLCAqcHNmYlRocjsgICAgIA0KKyAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsNCisKKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAJICBwc2ZiRW4gID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5ICsgc2ZiR3JwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgcHNmYlRociA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZCArIHNmYkdycDsNCisJICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAKKyAgICAgICAgaWYgKCpwc2ZiRW4gPiAqcHNmYlRocikgeworICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLworICAgICAgICAgIFdvcmQzMiB0bXAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsOworICAgICAgICAgIHRtcCA9IGZpeG11bCh0bXAsIHRtcCk7CisgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IGZpeG11bCh0bXAsIHRtcCk7CisgICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KKyAgICAgICAgICB0bXAgPSBMX21weV9scygqcHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOworICAgICAgICAgICAgIAorICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZCA+IHRtcCkgJiYgCisgICAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSl7CisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHRtcCwgKnBzZmJUaHIpOworICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9CisJCSAgKnBzZmJUaHIgPSBzZmJUaHJSZWR1Y2VkOworICAgICAgICB9DQorDQorCQlwc2ZiRW4rKzsgIHBzZmJUaHIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpjb3JyZWN0VGhyZXNoCisqIGRlc2NyaXB0aW9uOiBpZiBwZSBkaWZmZXJlbmNlIGRlbHRhUGUgYmV0d2VlbiBkZXNpcmVkIHBlIGFuZCByZWFsIHBlIGlzIHNtYWxsIGVub3VnaCwKKyogICAgICAgICAgICAgdGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRpc3RyaWJ1dGVkIGFtb25nIHRoZSBzY2FsZSBmYWN0b3IgYmFuZHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY29ycmVjdFRocmVzaChQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgICpwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgICByZWRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgICAgIGRlbHRhUGUpCit7CisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnAsc2hpZnQ7CisgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbjsKKyAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhOworICBXb3JkMzIgZGVsdGFTZmJQZTsKKyAgV29yZDMyIG5vcm1GYWN0b3I7DQorICBXb3JkMzIgKnBzZmJQZUZhY3RvcnM7DQorICBXb3JkMTYgKnBzZmJOQWN0aXZlTGluZXMsICpwYWhGbGFnOworICBXb3JkMzIgc2ZiRW4sIHNmYlRocjsKKyAgV29yZDMyIHNmYlRoclJlZHVjZWQ7CisKKyAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLworICBub3JtRmFjdG9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOworICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICBwc2ZiUGVGYWN0b3JzID0gcGVEYXRhLT5zZmJQZUZhY3RvcnNbY2hdICsgc2ZiR3JwOw0KKwkgIHBzZmJOQWN0aXZlTGluZXMgPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXMgKyBzZmJHcnA7DQorCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7DQorCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBXb3JkMzIgcmVkVGhyRXhwID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbDsKKyAgICAgICAgICAgICAKKyAgICAgICAgaWYgKCgoKnBhaEZsYWcgPCBBSF9BQ1RJVkUpIHx8IChkZWx0YVBlID4gMCkpICYmIChyZWRUaHJFeHAgPiAwKSApIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gKCpwc2ZiTkFjdGl2ZUxpbmVzKSAqICgweDdmZmZmZmZmIC8gcmVkVGhyRXhwKTsKKyAgICAgICAgICBub3JtRmFjdG9yID0gTF9hZGQobm9ybUZhY3RvciwgKnBzZmJQZUZhY3RvcnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0NCisJCXBzZmJQZUZhY3RvcnMrKzsgDQorCQlwYWhGbGFnKys7IHBzZmJOQWN0aXZlTGluZXMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworIAorICAvKiBjYWxjdWxhdGUgbmV3IHRocmVzaG9sZHMgKi8KKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOworICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICBwc2ZiUGVGYWN0b3JzID0gcGVEYXRhLT5zZmJQZUZhY3RvcnNbY2hdICsgc2ZiR3JwOw0KKwkgIHBzZmJOQWN0aXZlTGluZXMgPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXMgKyBzZmJHcnA7DQorCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7DQorCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAvKiBwZSBkaWZmZXJlbmNlIGZvciB0aGlzIHNmYiAqLworICAgICAgICBkZWx0YVNmYlBlID0gKnBzZmJQZUZhY3RvcnMgKiBkZWx0YVBlOworCisJCS8qIHRocjMobikgPSB0aHIyKG4pKjJeZGVsdGFTZmJQZS9iKG4pICovICAgICAgICAgCisgICAgICAgIGlmICgqcHNmYk5BY3RpdmVMaW5lcyA+IDApIHsKKyAgICAgICAgICAvKiBuZXcgdGhyZXNob2xkICovCisgICAgICAgICAgV29yZDMyIHRockZhY3RvcjsKKyAgICAgICAgICBzZmJFbiAgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl07CisgICAgICAgICAgc2ZiVGhyID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdOworCisgICAgICAgICAgIGlmKGRlbHRhU2ZiUGUgPj0gMCl7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICByZWR1Y2UgdGhyZXNob2xkCisgICAgICAgICAgICAqLworICAgICAgICAgICAgdGhyRmFjdG9yID0gcG93Ml94eShMX25lZ2F0ZShkZWx0YVNmYlBlKSwgKG5vcm1GYWN0b3IqICgqcHNmYk5BY3RpdmVMaW5lcykpKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTF9tcHlfbHMoc2ZiVGhyLCByb3VuZDE2KHRockZhY3RvcikpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIGluY3JlYXNlIHRocmVzaG9sZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoZGVsdGFTZmJQZSwgKG5vcm1GYWN0b3IgKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYodGhyRmFjdG9yID4gc2ZiVGhyKSB7CisgICAgICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHRockZhY3Rvcik7DQorCQkJICBzZmJUaHJSZWR1Y2VkID0gRGl2XzMyKCBzZmJUaHIgPDwgc2hpZnQsIHRockZhY3Rvcjw8c2hpZnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIC8qIGF2b2lkIGhvbGUgKi8KKyAgICAgICAgICBzZmJFbiA9IExfbXB5X2xzKHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOworICAgICAgICAgICAgIAorICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZCA+IHNmYkVuKSAmJgorICAgICAgICAgICAgICAoKnBhaEZsYWcgPT0gQUhfSU5BQ1RJVkUpKSB7CisgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHNmYkVuLCBzZmJUaHIpOworICAgICAgICAgICAgKnBhaEZsYWcgPSBBSF9BQ1RJVkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfQorCisgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZDsgIAorICAgICAgICB9DQorDQorCQlwYWhGbGFnKys7IHBzZmJOQWN0aXZlTGluZXMrKzsgcHNmYlBlRmFjdG9ycysrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOnJlZHVjZU1pblNucgorKiBkZXNjcmlwdGlvbjogaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCByZWR1Y2UgcGUgYnkgcmVkdWNpbmcgbWluU25yCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmVkdWNlTWluU25yKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgKnBlRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgZGVzaXJlZFBlKQoreworICBXb3JkMTYgY2gsIHNmYiwgc2ZiU3ViV2luOworICBXb3JkMTYgZGVsdGFQZTsKKworICAvKiBzdGFydCBhdCBoaWdoZXN0IGZyZXEgZG93biB0byAwICovCisgIHNmYlN1YldpbiA9IHBzeU91dENoYW5uZWxbMF0ubWF4U2ZiUGVyR3JvdXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB3aGlsZSAocGVEYXRhLT5wZSA+IGRlc2lyZWRQZSAmJiBzZmJTdWJXaW4gPiAwKSB7CisgICAgICAgCisgICAgc2ZiU3ViV2luID0gc2ZiU3ViV2luIC0gMTsKKyAgICAvKiBsb29wIG92ZXIgYWxsIHN1YndpbmRvd3MgKi8KKyAgICBmb3IgKHNmYj1zZmJTdWJXaW47IHNmYjxwc3lPdXRDaGFubmVsWzBdLnNmYkNudDsKKyAgICAgICAgc2ZiKz1wc3lPdXRDaGFubmVsWzBdLnNmYlBlckdyb3VwKSB7CisgICAgICAvKiBsb29wIG92ZXIgYWxsIGNoYW5uZWxzICovCisJCVBFX0NIQU5ORUxfREFUQSogcGVDaGFuID0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhOw0KKwkJUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaCA9IHBzeU91dENoYW5uZWw7DQorCQlmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeyAgICAgICAgICAgCisgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUggJiYKKyAgICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA8IG1pblNuckxpbWl0KSB7CisgICAgICAgICAgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdID0gbWluU25yTGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBwc3lPdXRDaC0+c2ZiVGhyZXNob2xkW3NmYl0gPQorICAgICAgICAgICAgTF9tcHlfbHMocHN5T3V0Q2gtPnNmYkVuZXJneVtzZmJdLCBwc3lPdXRDaC0+c2ZiTWluU25yW3NmYl0pOworCisgICAgICAgICAgLyogY2FsYyBuZXcgcGUgKi8KKyAgICAgICAgICBkZWx0YVBlID0gKChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSArIChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSA+PiAxKSkgPj4gMikgLQorICAgICAgICAgICAgICBwZUNoYW4tPnNmYlBlW3NmYl07CisgICAgICAgICAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+cGUgKyBkZWx0YVBlOworICAgICAgICAgIHBlQ2hhbi0+cGUgPSBwZUNoYW4tPnBlICsgZGVsdGFQZTsJCSAgCisgICAgICAgIH0NCisJCXBlQ2hhbiArPSAxOyBwc3lPdXRDaCArPSAxOworICAgICAgfQorICAgICAgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KKyAgICAgICAKKyAgICAgIGlmIChwZURhdGEtPnBlIDw9IGRlc2lyZWRQZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmFsbG93TW9yZUhvbGVzCisqIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHNvbWUgbW9yZSBzY2FsZWZhY3RvciBiYW5kcyAgCisqICAgICAgICAgICAgICBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxsb3dNb3JlSG9sZXMoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUhfUEFSQU0gICphaFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIGRlc2lyZWRQZSkKK3sKKyAgV29yZDE2IGNoLCBzZmI7CisgIFdvcmQxNiBhY3RQZSwgc2hpZnQ7CisKKyAgYWN0UGUgPSBwZURhdGEtPnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLyogZm9yIE1TIGFsbG93IGhvbGUgaW4gdGhlIGNoYW5uZWwgd2l0aCBsZXNzIGVuZXJneSAqLworICAgICAKKyAgaWYgKG5DaGFubmVscz09MiAmJgorICAgICAgcHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZT09cHN5T3V0Q2hhbm5lbFsxXS53aW5kb3dTZXF1ZW5jZSkgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbkwgPSAmcHN5T3V0Q2hhbm5lbFswXTsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5SID0gJnBzeU91dENoYW5uZWxbMV07CisgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5MLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgICBXb3JkMzIgbWluRW47CisgICAgICAgCisgICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7CisgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gc2lkZSBjaGFubmVsID8gKi8KKyAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5MLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOworICAgICAgICAgICAKKyAgICAgICAgaWYgKGFoRmxhZ1sxXVtzZmJdICE9IE5PX0FIICYmCisgICAgICAgICAgICBtaW5FbiA+IHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSkgeworICAgICAgICAgIGFoRmxhZ1sxXVtzZmJdID0gTk9fQUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHBzeU91dENoYW5SLT5zZmJUaHJlc2hvbGRbc2ZiXSA9IExfYWRkKHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhblItPnNmYkVuZXJneVtzZmJdKTsKKyAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzFdLnNmYlBlW3NmYl07CisgICAgICAgIH0KKyAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBtaWQgY2hhbm5lbCA/ICovCisgICAgICAgIGVsc2UgeworICAgICAgICBtaW5FbiA9IExfbXB5X2xzKHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSwgKG1pblNuckxpbWl0ICogcHN5T3V0Q2hhblItPnNmYk1pblNucltzZmJdKSA+PiAxNik7CisgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKGFoRmxhZ1swXVtzZmJdIT0gTk9fQUggJiYKKyAgICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0pIHsKKyAgICAgICAgICAgIGFoRmxhZ1swXVtzZmJdID0gTk9fQUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBzeU91dENoYW5MLT5zZmJUaHJlc2hvbGRbc2ZiXSA9IExfYWRkKHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdKTsKKyAgICAgICAgICAgIGFjdFBlID0gYWN0UGUgLSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMF0uc2ZiUGVbc2ZiXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICBpZiAoYWN0UGUgPCBkZXNpcmVkUGUpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogc3Vic2VxdWVudGx5IGVyYXNlIGJhbmRzICovICAgCisgIGlmIChhY3RQZSA+IGRlc2lyZWRQZSkgeworICAgIFdvcmQxNiBzdGFydFNmYlsyXTsKKyAgICBXb3JkMzIgYXZnRW4sIG1pbkVuOworICAgIFdvcmQxNiBhaENudDsKKyAgICBXb3JkMTYgZW5JZHg7CisgICAgV29yZDE2IGVuRGlmZjsKKyAgICBXb3JkMzIgZW5bNF07CisgICAgV29yZDE2IG1pblNmYiwgbWF4U2ZiOworICAgIEZsYWcgICBkb25lOworCisgICAgLyogZG8gbm90IGdvIGJlbG93IHN0YXJ0U2ZiICovCisgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgIAorICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJMOworICAgICAgZWxzZQorICAgICAgICBzdGFydFNmYltjaF0gPSBhaFBhcmFtLT5zdGFydFNmYlM7CisgICAgfQorCisgICAgYXZnRW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgbWluRW4gPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYWhDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiW2NoXTsgc2ZiPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiKyspIHsKKyAgICAgICAgICAgCisgICAgICAgIGlmICgoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIKSAmJgorICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdID4gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYl0pKSB7CisgICAgICAgICAgbWluRW4gPSBtaW4obWluRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdKTsKKyAgICAgICAgICBhdmdFbiA9IExfYWRkKGF2Z0VuLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7CisgICAgICAgICAgYWhDbnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAgCisgICAgaWYoYWhDbnQpIHsKKyAgICAgIFdvcmQzMiBpYWhDbnQ7CisgICAgICBzaGlmdCA9IG5vcm1fbChhaENudCk7DQorCSAgaWFoQ250ID0gRGl2XzMyKCAxIDw8IHNoaWZ0LCBhaENudCA8PCBzaGlmdCApOworICAgICAgYXZnRW4gPSBmaXhtdWwoYXZnRW4sIGlhaENudCk7CisgICAgfQorCisgICAgZW5EaWZmID0gaUxvZzQoYXZnRW4pIC0gaUxvZzQobWluRW4pOworICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLworICAgIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgeworICAgICAgV29yZDMyIGVuRmFjOworICAgICAgZW5GYWMgPSAoKDYtKGVuSWR4IDw8IDEpKSAqIGVuRGlmZik7CisgICAgICBlbltlbklkeF0gPSBmaXhtdWwoYXZnRW4sIHBvdzJfeHkoTF9uZWdhdGUoZW5GYWMpLDcqNCkpOworICAgIH0KKworICAgIC8qIHN0YXJ0IHdpdGggbG93ZXN0IGVuZXJneSBib3JkZXIgYXQgaGlnaGVzdCBzZmIgKi8KKyAgICBtYXhTZmIgPSBwc3lPdXRDaGFubmVsWzBdLnNmYkNudCAtIDE7CisgICAgbWluU2ZiID0gc3RhcnRTZmJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAKKyAgICBpZiAobkNoYW5uZWxzID09IDIpIHsKKyAgICAgIG1heFNmYiA9IG1heChtYXhTZmIsIChwc3lPdXRDaGFubmVsWzFdLnNmYkNudCAtIDEpKTsKKyAgICAgIG1pblNmYiA9IG1pbihtaW5TZmIsIHN0YXJ0U2ZiWzFdKTsKKyAgICB9CisKKyAgICBzZmIgPSBtYXhTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZW5JZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGRvbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAKKyAgICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgICAgICAgCisgICAgICAgIGlmIChzZmI+PXN0YXJ0U2ZiW2NoXSAmJiBzZmI8cHN5T3V0Q2hhbi0+c2ZiQ250KSB7CisgICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLworICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUggJiYgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0gPCBlbltlbklkeF0peworICAgICAgICAgICAgLyogYWxsb3cgaG9sZSAqLworICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJdID0gTk9fQUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdID0gTF9hZGQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdKTsKKyAgICAgICAgICAgIGFjdFBlID0gYWN0UGUgLSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYl07CisgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICBpZiAoYWN0UGUgPCBkZXNpcmVkUGUpIHsKKyAgICAgICAgICAgIGRvbmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNmYiA9IHNmYiAtIDE7CisgICAgICAgCisgICAgICBpZiAoc2ZiIDwgbWluU2ZiKSB7CisgICAgICAgIC8qIHJlc3RhcnQgd2l0aCBuZXh0IGVuZXJneSBib3JkZXIgKi8KKyAgICAgICAgc2ZiID0gbWF4U2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGVuSWR4ID0gZW5JZHggKyAxOworICAgICAgICAgCisgICAgICAgIGlmIChlbklkeCAtIDQgPj0gMCkKKyAgICAgICAgICBkb25lID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmFkYXB0VGhyZXNob2xkc1RvUGUKKyogZGVzY3JpcHRpb246IHR3byBndWVzc2VzIGZvciB0aGUgcmVkdWN0aW9uIHZhbHVlIGFuZCBvbmUgZmluYWwgY29ycmVjdGlvbiBvZiB0aGUKKyogICAgICAgICAgICAgIHRocmVzaG9sZHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhZGFwdFRocmVzaG9sZHNUb1BlKFBTWV9PVVRfQ0hBTk5FTCAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgKnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICAgICpwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIGRlc2lyZWRQZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhfUEFSQU0gICAgICAgICAgICphaFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtKQoreworICBXb3JkMTYgbm9SZWRQZSwgcmVkUGUsIHJlZFBlTm9BSDsKKyAgV29yZDE2IGNvbnN0UGFydCwgY29uc3RQYXJ0Tm9BSDsKKyAgV29yZDE2IG5BY3RpdmVMaW5lcywgbkFjdGl2ZUxpbmVzTm9BSDsKKyAgV29yZDE2IGRlc2lyZWRQZU5vQUg7CisgIFdvcmQzMiByZWRWYWwsIGF2Z1RockV4cDsKKyAgV29yZDMyIGl0ZXI7CisKKyAgY2FsY1RocmVzaEV4cChwZURhdGEtPnRockV4cCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICBhZGFwdE1pblNucihwc3lPdXRDaGFubmVsLCBsb2dTZmJFbmVyZ3ksIG1zYVBhcmFtLCBuQ2hhbm5lbHMpOworCisgIGluaXRBdm9pZEhvbGVGbGFnKHBlRGF0YS0+YWhGbGFnLCBwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBuQ2hhbm5lbHMsIGFoUGFyYW0pOworCisgIG5vUmVkUGUgPSBwZURhdGEtPnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgY29uc3RQYXJ0ID0gcGVEYXRhLT5jb25zdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBuQWN0aXZlTGluZXMgPSBwZURhdGEtPm5BY3RpdmVMaW5lczsgICAgICAgCisKKyAgLyogZmlyc3QgZ3Vlc3Mgb2YgcmVkdWN0aW9uIHZhbHVlIHReMC4yNSA9IDJeKChhLXBlbikvNCpiKSAqLworICBhdmdUaHJFeHAgPSBwb3cyX3h5KChjb25zdFBhcnQgLSBub1JlZFBlKSwgKG5BY3RpdmVMaW5lcyA8PCAyKSk7CisgIAorICAvKiByMSA9IDJeKChhLXBlcikvNCpiKSAtIHReMC4yNSAqLworICByZWRWYWwgPSBwb3cyX3h5KChjb25zdFBhcnQgLSBkZXNpcmVkUGUpLCAobkFjdGl2ZUxpbmVzIDw8IDIpKSAtIGF2Z1RockV4cDsKKworICAvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworICByZWR1Y2VUaHJlc2hvbGRzKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEtPnRockV4cCwgbkNoYW5uZWxzLCByZWRWYWwpOworCisgIC8qIHBlIGFmdGVyIGZpcnN0IGd1ZXNzICovCisgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisgIHJlZFBlID0gcGVEYXRhLT5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGRvIHsKKyAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLworICAgIGNhbGNQZU5vQUgoJnJlZFBlTm9BSCwgJmNvbnN0UGFydE5vQUgsICZuQWN0aXZlTGluZXNOb0FILAorICAgICAgICAgICAgICAgcGVEYXRhLCBwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICAgIGRlc2lyZWRQZU5vQUggPSBkZXNpcmVkUGUgLShyZWRQZSAtIHJlZFBlTm9BSCk7CisgICAgIAorICAgIGlmIChkZXNpcmVkUGVOb0FIIDwgMCkgeworICAgICAgZGVzaXJlZFBlTm9BSCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLyogc2Vjb25kIGd1ZXNzICovCisgICAgIAorICAgIGlmIChuQWN0aXZlTGluZXNOb0FIID4gMCkgeworCQkKKwkJYXZnVGhyRXhwID0gcG93Ml94eSgoY29uc3RQYXJ0Tm9BSCAtIHJlZFBlTm9BSCksIChuQWN0aXZlTGluZXNOb0FIIDw8IDIpKTsKKwkJCisJCXJlZFZhbCA9IChyZWRWYWwgKyBwb3cyX3h5KChjb25zdFBhcnROb0FIIC0gZGVzaXJlZFBlTm9BSCksIChuQWN0aXZlTGluZXNOb0FIIDw8IDIpKSkgLSBhdmdUaHJFeHA7CisJCQorCQkvKiByZWR1Y2UgdGhyZXNob2xkcyAqLworCQlyZWR1Y2VUaHJlc2hvbGRzKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEtPnRockV4cCwgbkNoYW5uZWxzLCByZWRWYWwpOworICAgIH0KKworICAgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisgICAgcmVkUGUgPSBwZURhdGEtPnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGl0ZXIgPSBpdGVyKzE7CisgICAgICAgCisgIH0gd2hpbGUgKCgyMCAqIGFic19zKHJlZFBlIC0gZGVzaXJlZFBlKSA+IGRlc2lyZWRQZSkgJiYgKGl0ZXIgPCAyKSk7CisKKyAgIAorICBpZiAoKDEwMCAqIHJlZFBlIDwgMTE1ICogZGVzaXJlZFBlKSkgeworICAgIGNvcnJlY3RUaHJlc2gocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLT5haEZsYWcsIHBlRGF0YSwgcGVEYXRhLT50aHJFeHAsIHJlZFZhbCwKKyAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgZGVzaXJlZFBlIC0gcmVkUGUpOworICB9CisgIGVsc2UgeworICAgIFdvcmQxNiBkZXNpcmVkUGUxMDUgPSAoMTA1ICogZGVzaXJlZFBlKSAvIDEwMDsKKyAgICByZWR1Y2VNaW5TbnIocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLCBwZURhdGEtPmFoRmxhZywKKyAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBkZXNpcmVkUGUxMDUpOworICAgIGFsbG93TW9yZUhvbGVzKHBzeU91dENoYW5uZWwsIHBzeU91dEVsZW1lbnQsIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsCisgICAgICAgICAgICAgICAgICAgYWhQYXJhbSwgbkNoYW5uZWxzLCBkZXNpcmVkUGUxMDUpOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNhbGNCaXRTYXZlCisqIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBwZXJjZW50YWdlIG9mIGJpdCBzYXZlLCBzZWUgZmlndXJlIGJlbG93CisqIHJldHVybnM6CisqIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCisqIG91dHB1dDogICAgICAgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNhbGNCaXRTYXZlKFdvcmQxNiBmaWxsTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjbGlwTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtaW5CaXRTYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0U2F2ZSkKK3sKKyAgV29yZDE2IGJpdHNhdmUgPSAwOworCisgIGZpbGxMZXZlbCA9IG1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOworICBmaWxsTGV2ZWwgPSBtaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CisKKyAgaWYoY2xpcEhpZ2gtY2xpcExvdykNCisgIGJpdHNhdmUgPSAobWF4Qml0U2F2ZSAtICgoKG1heEJpdFNhdmUtbWluQml0U2F2ZSkqKGZpbGxMZXZlbC1jbGlwTG93KSkvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpcEhpZ2gtY2xpcExvdykpKTsKKworICByZXR1cm4gKGJpdHNhdmUpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNhbGNCaXRTcGVuZAorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQsIHNlZSBmaWd1cmUgYmVsb3cKKyogcmV0dXJuczoKKyogaW5wdXQ6ICAgICAgICBwYXJhbWV0ZXJzIGFuZCBiaXRyZXMtZnVsbG5lc3MKKyogb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNhbGNCaXRTcGVuZChXb3JkMTYgZmlsbExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U3BlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0U3BlbmQpCit7CisgIFdvcmQxNiBiaXRzcGVuZCA9IDE7CisKKyAgZmlsbExldmVsID0gbWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7CisgIGZpbGxMZXZlbCA9IG1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKKworICBpZihjbGlwSGlnaC1jbGlwTG93KQ0KKyAgYml0c3BlbmQgPSAobWluQml0U3BlbmQgKyAoKG1heEJpdFNwZW5kIC0gbWluQml0U3BlbmQpKihmaWxsTGV2ZWwgLSBjbGlwTG93KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlwSGlnaC1jbGlwTG93KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICByZXR1cm4gKGJpdHNwZW5kKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYWRqdXN0UGVNaW5NYXgoKQorKiBkZXNjcmlwdGlvbjogIGFkanVzdHMgcGVNaW4gYW5kIHBlTWF4IHBhcmFtZXRlcnMgb3ZlciB0aW1lCisqIHJldHVybnM6CisqIGlucHV0OiAgICAgICAgY3VycmVudCBwZSwgcGVNaW4sIHBlTWF4CisqIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWRqdXN0UGVNaW5NYXgoY29uc3QgV29yZDE2IGN1cnJQZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICpwZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICpwZU1heCkKK3sKKyAgV29yZDE2IG1pbkZhY0hpLCBtYXhGYWNIaSwgbWluRmFjTG8sIG1heEZhY0xvOworICBXb3JkMTYgZGlmZjsKKyAgV29yZDE2IG1pbkRpZmYgPSBleHRyYWN0X2woY3VyclBlIC8gNik7CisgIG1pbkZhY0hpID0gMzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1heEZhY0hpID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1pbkZhY0xvID0gMTQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1heEZhY0xvID0gNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZGlmZiA9IGN1cnJQZSAtICpwZU1heCA7CisgICAKKyAgaWYgKGRpZmYgPiAwKSB7CisgICAgKnBlTWluID0gKnBlTWluICsgKChkaWZmICogbWluRmFjSGkpIC8gMTAwKTsKKyAgICAqcGVNYXggPSAqcGVNYXggKyAoKGRpZmYgKiBtYXhGYWNIaSkgLyAxMDApOworICB9IGVsc2UgeworICAgIGRpZmYgPSAqcGVNaW4gLSBjdXJyUGU7CisgICAgIAorICAgIGlmIChkaWZmID4gMCkgeworICAgICAgKnBlTWluID0gKnBlTWluIC0gKChkaWZmICogbWluRmFjTG8pIC8gMTAwKTsKKyAgICAgICpwZU1heCA9ICpwZU1heCAtICgoZGlmZiAqIG1heEZhY0xvKSAvIDEwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICpwZU1pbiA9ICpwZU1pbiArICgoY3VyclBlIC0gKnBlTWluKSAqIG1pbkZhY0hpIC8gMTAwKTsKKyAgICAgICpwZU1heCA9ICpwZU1heCAtICgoKnBlTWF4IC0gY3VyclBlKSAqIG1heEZhY0xvIC8gMTAwKTsKKyAgICB9CisgIH0KKworICAgCisgIGlmICgoKnBlTWF4IC0gKnBlTWluKSA8IG1pbkRpZmYpIHsKKyAgICBXb3JkMTYgcGFydExvLCBwYXJ0SGk7CisKKyAgICBwYXJ0TG8gPSBtYXgoMCwgKGN1cnJQZSAtICpwZU1pbikpOworICAgIHBhcnRIaSA9IG1heCgwLCAoKnBlTWF4IC0gY3VyclBlKSk7CisKKyAgICAqcGVNYXggPSBjdXJyUGUgKyAoKHBhcnRIaSAqIG1pbkRpZmYpIC8gKHBhcnRMbyArIHBhcnRIaSkpOworICAgICpwZU1pbiA9IGN1cnJQZSAtICgocGFydExvICogbWluRGlmZikgLyAocGFydExvICsgcGFydEhpKSk7CisgICAgKnBlTWluID0gbWF4KDAsICpwZU1pbik7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQml0cmVzQ2FsY0JpdEZhYworKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgZmFjdG9yIG9mIHNwZW5kaW5nIGJpdHMgZm9yIG9uZSBmcmFtZQorKiAgICAgICAgICAgICAgICAxLjAgOiB0YWtlIGFsbCBmcmFtZSBkeW5wYXJ0IGJpdHMKKyogICAgICAgICAgICAgICAgPjEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cyArIGJpdHJlcworKiAgICAgICAgICAgICAgICA8MS4wIDogcHV0IGJpdHMgaW4gYml0cmVzZXJ2b2lyCisqICByZXR1cm5zOiAgICAgIEJpdEZhYyoxMDAKKyogIGlucHV0OiAgICAgICAgYml0cmVzLWZ1bGxuZXNzLCBwZSwgYmxvY2tUeXBlLCBwYXJhbWV0ZXItc2V0dGluZ3MKKyogIG91dHB1dDoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBiaXRyZXNDYWxjQml0RmFjKCBjb25zdCBXb3JkMTYgICBiaXRyZXNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBtYXhCaXRyZXNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgd2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIGF2Z0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heEJpdEZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKX1RIUl9TVEFURSAqQWRqVGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCAgICphZGpUaHJDaGFuKQoreworICBCUkVTX1BBUkFNICpicmVzUGFyYW07CisgIFdvcmQxNiBwZXg7CisgIFdvcmQxNiBmaWxsTGV2ZWw7CisgIFdvcmQxNiBiaXRTYXZlLCBiaXRTcGVuZCwgYml0cmVzRmFjOworCisgIGZpbGxMZXZlbCA9IGV4dHJhY3RfbCgoMTAwKiBiaXRyZXNCaXRzKSAvIG1heEJpdHJlc0JpdHMpOworCisgIGlmICh3aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbUxvbmcpOworICBlbHNlCisgICAgYnJlc1BhcmFtID0gJihBZGpUaHItPmJyZXNQYXJhbVNob3J0KTsKKworICBwZXggPSBtYXgocGUsIGFkalRockNoYW4tPnBlTWluKTsKKyAgcGV4ID0gbWluKHBleCxhZGpUaHJDaGFuLT5wZU1heCk7CisKKyAgYml0U2F2ZSA9IGNhbGNCaXRTYXZlKGZpbGxMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNhdmVMb3csIGJyZXNQYXJhbS0+Y2xpcFNhdmVIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlc1BhcmFtLT5taW5CaXRTYXZlLCBicmVzUGFyYW0tPm1heEJpdFNhdmUpOworCisgIGJpdFNwZW5kID0gY2FsY0JpdFNwZW5kKGZpbGxMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlc1BhcmFtLT5jbGlwU3BlbmRMb3csIGJyZXNQYXJhbS0+Y2xpcFNwZW5kSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlc1BhcmFtLT5taW5CaXRTcGVuZCwgYnJlc1BhcmFtLT5tYXhCaXRTcGVuZCk7CisKKyAgaWYoYWRqVGhyQ2hhbi0+cGVNYXggIT0gYWRqVGhyQ2hhbi0+cGVNaW4pDQorCWJpdHJlc0ZhYyA9ICgxMDAgLSBiaXRTYXZlKSArIGV4dHJhY3RfbCgoKGJpdFNwZW5kICsgYml0U2F2ZSkgKiAocGV4IC0gYWRqVGhyQ2hhbi0+cGVNaW4pKSAvCisgICAgICAgICAgICAgICAgICAgIChhZGpUaHJDaGFuLT5wZU1heCAtIGFkalRockNoYW4tPnBlTWluKSk7CisgIGVsc2UKKwliaXRyZXNGYWMgPSAweDdmZmY7CisgICAgICAgICAgICAgICAKKyAgYml0cmVzRmFjID0gbWluKGJpdHJlc0ZhYywKKyAgICAgICAgICAgICAgICAgICAgKDEwMC0zMCArIGV4dHJhY3RfbCgoMTAwICogYml0cmVzQml0cykgLyBhdmdCaXRzKSkpOworCisgIGJpdHJlc0ZhYyA9IG1pbihiaXRyZXNGYWMsIG1heEJpdEZhYyk7CisKKyAgYWRqdXN0UGVNaW5NYXgocGUsICZhZGpUaHJDaGFuLT5wZU1pbiwgJmFkalRockNoYW4tPnBlTWF4KTsKKworICByZXR1cm4gYml0cmVzRmFjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQWRqVGhySW5pdAorKiBkZXNjcmlwdGlvbjogIGluaXQgdGhyZXNob2xkcyBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBZGpUaHJJbml0KEFESl9USFJfU1RBVEUgKmhBZGpUaHIsCisgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgbWVhblBlLAorICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgIGNoQml0cmF0ZSkKK3sKKyAgQVRTX0VMRU1FTlQqIGF0c0VsZW0gPSAmaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtOworICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtID0gJmF0c0VsZW0tPm1pblNuckFkYXB0UGFyYW07CisKKyAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCisgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVMb3cgICA9ICAyMDsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlSGlnaCAgPSAgOTU7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTYXZlICAgID0gIC01OyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U2F2ZSAgICA9ICAzMDsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZExvdyAgPSAgMjA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gIDk1OyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U3BlbmQgICA9IC0xMDsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNwZW5kICAgPSAgNDA7ICAgICAgICAgICAgICAgICAgICAKKworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gIDIwOyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoICA9ICA3NTsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAgIDA7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlICAgID0gIDIwOyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ICA9ICAyMDsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAgNzU7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCAgID0gLTU7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgICA9ICA1MDsgICAgICAgICAgICAgICAgICAgCisKKyAgLyogc3BlY2lmaWMgZm9yIGVhY2ggZWxlbWVudDogKi8KKworICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLworICBhdHNFbGVtLT5wZU1pbiA9IGV4dHJhY3RfbCgoKDgwKm1lYW5QZSkgLyAxMDApKTsKKyAgYXRzRWxlbS0+cGVNYXggPSBleHRyYWN0X2woKCgxMjAqbWVhblBlKSAvIDEwMCkpOworCisgIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCisgIGF0c0VsZW0tPnBlT2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApIHsKKyAgICBhdHNFbGVtLT5wZU9mZnNldCA9IG1heCg1MCwgKDEwMCAtIGV4dHJhY3RfbCgoMTAwICogY2hCaXRyYXRlKSAvIDMyMDAwKSkpOworICB9CisKKyAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICovCisgIGlmIChjaEJpdHJhdGUgPiAyMDAwMCkgeworICAgIGF0c0VsZW0tPmFoUGFyYW0ubW9kaWZ5TWluU25yID0gVFJVRTsKKyAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDE1OworICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMzsKKyAgfQorICBlbHNlIHsKKyAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IEZBTFNFOworICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMDsKKyAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDA7CisgIH0KKworICAvKiBtaW5TbnIgYWRhcHRhdGlvbiAqLworICAvKiBtYXhpbXVtIHJlZHVjdGlvbiBvZiBtaW5TbnIgZ29lcyBkb3duIHRvIG1pblNucl5tYXhSZWQgKi8KKyAgbXNhUGFyYW0tPm1heFJlZCA9IDB4MjAwMDAwMDA7ICAgICAvKiAqMC4yNWYgLyAgICAgICAgICAgICAgICAgICAgICAgIAorICAvKiBzdGFydCBhZGFwdGF0aW9uIG9mIG1pblNuciBmb3IgYXZnRW4vc2ZiRW4gPiBzdGFydFJhdGlvICovCisgIG1zYVBhcmFtLT5zdGFydFJhdGlvID0gMHgwY2NjY2NjZDsgLyogMTAgKi8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgLyogbWF4aW11bSBtaW5TbnIgcmVkdWN0aW9uIHRvIG1pblNucl5tYXhSZWQgaXMgcmVhY2hlZCBmb3IKKyAgICAgYXZnRW4vc2ZiRW4gPj0gbWF4UmF0aW8gKi8KKyAgbXNhUGFyYW0tPm1heFJhdGlvID0gIDB4MDAyMGM0OWM7IC8qIDEwMDAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qIGhlbHBlciB2YXJpYWJsZXMgdG8gaW50ZXJwb2xhdGUgbWluU25yIHJlZHVjdGlvbiBmb3IKKyAgICAgYXZnRW4vc2ZiRW4gYmV0d2VlbiBzdGFydFJhdGlvIGFuZCBtYXhSYXRpbyAqLworCisgIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyA9IDB4ZmIzMzMzMzM7IC8qIC0wLjc1LzIwICovICAgICAgICAgCisKKyAgbXNhUGFyYW0tPnJlZE9mZnMgPSAweDMwMDAwMDAwOyAgLyogbXNhUGFyYW0tPnJlZFJhdGlvRmFjICogMTAqbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pICovICAKKworICAgICAgIAorICAvKiBwZSBjb3JyZWN0aW9uICovCisgIGF0c0VsZW0tPnBlTGFzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBhdHNFbGVtLT5keW5CaXRzTGFzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yID0gMTAwOyAvKiAxLjAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNhbGNQZUNvcnJlY3Rpb24KKyogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHRoZSBkZXNpcmVkIHBlcmNlcHR1YWwgZW50cm9weSBmYWN0b3IKKyoJCQkJSXQgaXMgYmV0d2VlbiAwLjg1IGFuZCAxLjE1CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNhbGNQZUNvcnJlY3Rpb24oV29yZDE2ICpjb3JyZWN0aW9uRmFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVBY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZUxhc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYml0c0xhc3QpIAoreworICBXb3JkMzIgcGVBY3QxMDAgPSAxMDAgKiBwZUFjdDsKKyAgV29yZDMyIHBlTGFzdDEwMCA9IDEwMCAqIHBlTGFzdDsKKyAgV29yZDE2IHBlQml0c0xhc3QgPSBiaXRzMnBlKGJpdHNMYXN0KTsKKyAgICAgICAgICAgCisgIGlmICgoYml0c0xhc3QgPiAwKSAmJgorICAgICAgKHBlQWN0MTAwIDwgKDE1MCAqIHBlTGFzdCkpICYmICAocGVBY3QxMDAgPiAoNzAgKiBwZUxhc3QpKSAmJgorICAgICAgKCgxMjAgKiBwZUJpdHNMYXN0KSA+IHBlTGFzdDEwMCApICYmICgoIDY1ICogcGVCaXRzTGFzdCkgPCBwZUxhc3QxMDApKQorICAgIHsKKyAgICAgIFdvcmQxNiBuZXdGYWMgPSAoMTAwICogcGVMYXN0KSAvIHBlQml0c0xhc3Q7CisgICAgICAvKiBkZWFkIHpvbmUgKi8KKyAgICAgICAKKyAgICAgIGlmIChuZXdGYWMgPCAxMDApIHsKKyAgICAgICAgbmV3RmFjID0gbWluKCgoMTEwICogbmV3RmFjKSAvIDEwMCksIDEwMCk7CisgICAgICAgIG5ld0ZhYyA9IG1heChuZXdGYWMsIDg1KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBuZXdGYWMgPSBtYXgoKCg5MCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOworICAgICAgICBuZXdGYWMgPSBtaW4obmV3RmFjLCAxMTUpOworICAgICAgfQorICAgICAgICAgCisgICAgICBpZiAoKG5ld0ZhYyA+IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA8IDEwMCkgfHwKKyAgICAgICAgICAobmV3RmFjIDwgMTAwICYmICpjb3JyZWN0aW9uRmFjID4gMTAwKSkgeworICAgICAgICAqY29ycmVjdGlvbkZhYyA9IDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgICAvKiBmYXN0ZXIgYWRhcHRhdGlvbiB0b3dhcmRzIDEuMCwgc2xvd2VyIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAKKyAgICAgIGlmICgoKmNvcnJlY3Rpb25GYWMgPCAxMDAgJiYgbmV3RmFjIDwgKmNvcnJlY3Rpb25GYWMpIHx8CisgICAgICAgICAgKCpjb3JyZWN0aW9uRmFjID4gMTAwICYmIG5ld0ZhYyA+ICpjb3JyZWN0aW9uRmFjKSkKKyAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAoODUgKiAqY29ycmVjdGlvbkZhYyArIDE1ICogbmV3RmFjKSAvIDEwMDsKKyAgICAgIGVsc2UKKyAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAoNzAgKiAqY29ycmVjdGlvbkZhYyArIDMwICogbmV3RmFjKSAvIDEwMDsKKyAgICAgICpjb3JyZWN0aW9uRmFjID0gbWluKCpjb3JyZWN0aW9uRmFjLCAxMTUpOworICAgICAgKmNvcnJlY3Rpb25GYWMgPSBtYXgoKmNvcnJlY3Rpb25GYWMsIDg1KTsKKyAgICB9CisgIGVsc2UgeworICAgICpjb3JyZWN0aW9uRmFjID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFkanVzdFRocmVzaG9sZHMKKyogZGVzY3JpcHRpb246ICBBZGp1c3QgdGhyZXNob2xkcyB0byB0aGUgZGVzaXJlZCBiaXRyYXRlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBZGp1c3RUaHJlc2hvbGRzKEFESl9USFJfU1RBVEUgICAqYWRqVGhyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqY2hCaXREaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCAgKnFjT0UsCisJCQkJCSAgRUxFTUVOVF9CSVRTCSAgKmVsQml0cywKKwkJCQkJICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG1heEJpdEZhYykKK3sKKyAgUEVfREFUQSBwZURhdGE7ICAKKyAgV29yZDE2IG5vUmVkUGUsIGdyYW50ZWRQZSwgZ3JhbnRlZFBlQ29ycjsKKyAgV29yZDE2IGN1cldpbmRvd1NlcXVlbmNlOworICBXb3JkMTYgYml0RmFjdG9yOworICBXb3JkMTYgYXZnQml0cyA9IChlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpKTsKKyAgV29yZDE2IGJpdHJlc0JpdHMgPSBlbEJpdHMtPmJpdFJlc0xldmVsOyAKKyAgV29yZDE2IG1heEJpdHJlc0JpdHMgPSBlbEJpdHMtPm1heEJpdHM7CisgIFdvcmQxNiBzaWRlSW5mb0JpdHMgPSAocWNPRS0+c3RhdGljQml0c1VzZWQgKyBxY09FLT5hbmNCaXRzVXNlZCk7CisgIFdvcmQxNiBjaDsKKyAgIAorICBwcmVwYXJlU2ZiUGUoJnBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbG9nU2ZiRW5lcmd5LCBzZmJOUmVsZXZhbnRMaW5lcywgbkNoYW5uZWxzLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlT2Zmc2V0KTsKKyAgIAorICAvKiBwZSB3aXRob3V0IHJlZHVjdGlvbiAqLworICBjYWxjU2ZiUGUoJnBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKyAgbm9SZWRQZSA9IHBlRGF0YS5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisgIGN1cldpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAKKyAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICAgCisgICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgfHwKKyAgICAgICAgKHBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgeworICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U7ICAgICAgICAgICAgICAgICAKKyAgfQorCisKKyAgLyogYml0IGZhY3RvciAqLworICBiaXRGYWN0b3IgPSBiaXRyZXNDYWxjQml0RmFjKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMsIG5vUmVkUGUrNSpzaWRlSW5mb0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyV2luZG93U2VxdWVuY2UsIGF2Z0JpdHMsIG1heEJpdEZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQpOworCisgIC8qIGRlc2lyZWQgcGUgKi8KKyAgZ3JhbnRlZFBlID0gKChiaXRGYWN0b3IgKiBiaXRzMnBlKGF2Z0JpdHMpKSAvIDEwMCk7CisKKyAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLworICBjYWxjUGVDb3JyZWN0aW9uKCYoQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpLCAKKyAgICAgICAgICAgICAgICAgICBtaW4oZ3JhbnRlZFBlLCBub1JlZFBlKSwKKyAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwgCisgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCk7CisgIGdyYW50ZWRQZUNvcnIgPSAoZ3JhbnRlZFBlICogQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpIC8gMTAwOworCisgICAgIAorICBpZiAoZ3JhbnRlZFBlQ29yciA8IG5vUmVkUGUgJiYgbm9SZWRQZSA+IHBlRGF0YS5vZmZzZXQpIHsKKyAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KKyAgICBhZGFwdFRocmVzaG9sZHNUb1BlKHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYW50ZWRQZUNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSk7CisgIH0KKworICAvKiBjYWxjdWxhdGUgcmVsYXRpdmUgZGlzdHJpYnV0aW9uICovCisgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgV29yZDE2IHBlT2Zmc0RpZmYgPSBwZURhdGEucGUgLSBwZURhdGEub2Zmc2V0OworICAgIGNoQml0RGlzdHJpYnV0aW9uW2NoXSA9IDIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgIGlmIChwZU9mZnNEaWZmID4gMCkgeworICAgICAgV29yZDMyIHRlbXAgPSAxMDAwIC0gKG5DaGFubmVscyAqIDIwMCk7CisgICAgICBjaEJpdERpc3RyaWJ1dGlvbltjaF0gPSBjaEJpdERpc3RyaWJ1dGlvbltjaF0gKw0KKwkJICAodGVtcCAqIHBlRGF0YS5wZUNoYW5uZWxEYXRhW2NoXS5wZSkgLyBwZU9mZnNEaWZmOworICAgIH0KKyAgfQorCisgIC8qIHN0b3JlIHBlICovCisgIHFjT0UtPnBlID0gbm9SZWRQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAvKiB1cGRhdGUgbGFzdCBwZSAqLworICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCA9IGdyYW50ZWRQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBBZGpUaHJVcGRhdGUKKyogZGVzY3JpcHRpb246ICBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKQoreworICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0ID0gZHluQml0c1VzZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlZGQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKQEAgLTAsMCArMSwxNjcgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCUF1dG9Db3JyZWxhdGlvbl92NS5zDQorQA0KK0AJQ29udGVudDoJQXV0b0NvcnJlbGF0aW9uIGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorDQorCS5zZWN0aW9uIC50ZXh0CQ0KKwkuZ2xvYmFsCUF1dG9Db3JyZWxhdGlvbg0KKw0KK0F1dG9Db3JyZWxhdGlvbjoNCisJc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0NCisNCisgIHN1YiAgICAgcjEzLCByMTMsICMyMCAgICAgICAgICAgICAgICAgICAgIA0KKw0KKyAgbW92ICAgICByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHI3LCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjksIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMiwgcjIsIGxzbCAjMTYgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIwLCAjMCAgICAgICAgICANCisgIG1vdiAgICAgcjQsIHIyLCBhc3IgIzE2ICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHI0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsZSAgICAgTDEzNiAgICAgICAgDQorCQ0KKwljbXAgICAgIHI0LCAjOCANCisJbW92CQkgIHIyLCAjMCANCisgIGJsdCAgICAgTDEzMyAgIA0KKw0KKwlzdWIgICAgIHIxMiwgcjQsICM4ICAgICAgICAgICAgICAgIA0KK0wxMzI6ICANCisgIGxkciAgICAgcjYsIFtyNSwgcjJdICANCisJYWRkCQkgIHIyLCByMiwgIzQNCisJc211bGJiICByMywgcjYsIHI2DQorCWxkciAgICAgcjEsIFtyNSwgcjJdIA0KKwlzbXVsdHQJcjEwLCByNiwgcjYNCisJbW92CQkgIHIzLCByMywgYXNyICM5DQorCXNtdWxiYglyNiwgcjEsIHIxDQorCW1vdgkJICByMTAsIHIxMCwgYXNyICM5DQorCXFhZGQJICByMCwgcjAsIHIzDQorCXNtdWx0dAlyMTEsIHIxLCByMQ0KKwlhZGQgICAgIHIyLCByMiwgIzQNCisJcWFkZAkgIHIwLCByMCwgcjEwDQorCW1vdgkJICByNiwgcjYsIGFzciAjOQ0KKwltb3YJCSAgcjExLCByMTEsIGFzciAjOQ0KKwlsZHIJCSAgcjEsIFtyNSwgcjJdDQorCXFhZGQJICByMCwgcjAsIHI2DQorCXNtdWxiYglyMTAsIHIxLCByMQ0KKwlzbXVsdHQJcjYsIHIxLCByMQ0KKwlxYWRkCSAgcjAsIHIwLCByMTENCisJbW92CQkgIHIxMCwgcjEwLCBhc3IgIzkNCisJbW92CQkgIHI2LCByNiwgYXNyICM5DQorCXFhZGQJICByMCwgcjAsIHIxMA0KKwlhZGQgICAgIHIyLCByMiwgIzQNCisJYWRkICAgICByOCwgcjgsICM2DQorDQorCXFhZGQJICByMCwgcjAsIHI2DQorCWNtcCAgICAgcjgsIHIxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsdCAgICAgTDEzMgkgICAgICAgICAgICAgICAgICANCitMMTMzOiAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjYsIFtyNSwgcjJdICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbXVsICAgICByMTAsIHI2LCByNiAgIA0KKwlhZGQgICAgIHIyLCByMiwgIzIgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjEsIHIxMCwgYXNyICM5ICAgICAgICAgICAgICAgICAgICANCisgIHFhZGQgICAgcjAsIHIwLCByMQ0KK0wxMzQ6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkICAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHI4LCByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsdCAgICAgTDEzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTM1OiAgICAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzY6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgc3RyICAgICByMCwgW3I3LCAjMF0gICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHIwLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJlcSAgICAgTDEzMjAgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTM3OiAgICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjIsIHI5LCBsc2wgIzE2ICAgICAgICAgICAgICAgICAgIA0KKwltb3YgICAgIHI4LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIyLCByMiwgYXNyICMxNiAgICAgICAgICAgICAgICAgICANCisgIGNtcCAgICAgcjIsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgYmxlICAgICBMMTMxOSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzg6ICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzOTogICAgICAgICAgICAgICAgICAgICAgICAgDQorICBzdWIgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjE0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMywgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHI0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsZSAgICAgTDEzMTcgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTMxMDogICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByNCwgIzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBhZGRsdCAgIHI2LCByNSwgcjgsIGxzbCAjMSAgICAgICAgICAgICAgICANCisgIGJsdCAgICAgTDEzMTQgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTMxMTogICAgICAgICAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjYsIHI1LCByOCwgbHNsICMxICAgICAgICAgICAgICAgIA0KKyAgc3ViICAgICByMTIsIHI0LCAjNiAgICAgICAgICAgICAgICAgICAgICAgDQorICBzdHIgICAgIHI4LCBbcjEzLCAjOF0gICAgICAgICAgICAgICAgICAgICANCisgIHN0ciAgICAgcjcsIFtyMTMsICM0XSAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzEyOiAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMSwgcjMsIGxzbCAjMSAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHI3LCBbcjYsIHIxXSAgICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjEwLCBbcjUsIHIxXSAgDQorICBhZGQgICAgIHI4LCByMSwgcjYgDQorCWFkZCAgICAgcjksIHI1LCByMSAgICAgICAgICAgICAgICAgICAgICAgDQorCW11bCAgICAgcjcsIHIxMCwgcjcNCisgIGxkcnNoICAgcjEsIFtyOCwgIzJdIA0KKwlsZHJzaCAgIHIxMCwgW3I4LCAjNF0gICANCisgIGFkZCAgICAgcjcsIHIxNCwgcjcsIGFzciAjOSAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMCwgW3I5LCAjMl0gICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMTEsIFtyOSwgIzRdICAgICAgICAgICAgICAgICAgIA0KKyAgbXVsICAgICByMSwgcjAsIHIxICAgICAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHIxNCwgW3I4LCAjNl0gICAgICAgICAgICAgICAgICAgICANCisgIG11bCAgICAgcjEwLCByMTEsIHIxMCAgICAgICAgICANCisJYWRkICAgICByNywgcjcsIHIxLCBhc3IgIzkgICAgICAgICAgICANCisgIGxkcnNoICAgcjgsIFtyOCwgIzhdIA0KKwlhZGQgICAgIHIzLCByMywgIzUNCisJbGRyc2ggICByMTEsIFtyOSwgIzZdICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHIxLCBbcjksICM4XSAgICAgICAgICAgICAgICAgICAgICANCisgIG11bCAgICAgcjE0LCByMTEsIHIxNCAgICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkICAgICByNywgcjcsIHIxMCwgYXNyICM5ICAgICAgIA0KKyAgbXVsICAgICByMSwgcjEsIHI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjE0LCByNywgcjE0LCBhc3IgIzkgICAgICAgICAgICAgIA0KKwljbXAgICAgIHIzLCByMTIgDQorICBhZGQgICAgIHIxNCwgcjE0LCByMSwgYXNyICM5ICAgICAgICAgICAgICANCisgIGJsZSAgICAgTDEzMTIgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTMxMzogICAgICAgICAgICAgICAgICAgICAgICANCisgIGxkciAgICAgcjgsIFtyMTMsICM4XSAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyICAgICByNywgW3IxMywgIzRdICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTQ6ICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTU6ICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIxMiwgcjMsIGxzbCAjMSAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjksIFtyNiwgcjEyXSAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMTIsIFtyNSwgcjEyXSAgICAgICAgICAgICAgICAgICAgDQorICBhZGQgICAgIHIzLCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICANCisgIGNtcCAgICAgcjMsIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbXVsICAgICByMTIsIHIxMiwgcjkgICAgICAgICAgICAgICAgICAgICAgDQorICBhZGQgICAgIHIxNCwgcjE0LCByMTIsIGFzciAjOSAgICAgICAgICAgICANCisgIGJsdCAgICAgTDEzMTUgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTMxNjogICAgICAgICAgICAgICAgICAgICAgICANCitMMTMxNzogICAgICAgICAgICAgICAgICAgICAgICANCisgIHN0ciAgICAgcjE0LCBbcjcsICtyOCwgbHNsICMyXSAgICAgICAgICAgIA0KKyAgYWRkICAgICByOCwgcjgsICMxICAgICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHI4LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsdCAgICAgTDEzOSAgIA0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTk6DQorTDEzMjA6DQorCWFkZCAgICAgcjEzLCByMTMsICMyMCAgICAgICAgICAgICAgICAgICAgDQorCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKw0KKwlARU5EUCAgQCB8QXV0b0NvcnJlbGF0aW9ufA0KKwkuZW5kDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTk3ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKQEAgLTAsMCArMSwxMTIgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCUNhbGNXaW5kb3dFbmVyZ3lfdjUucw0KK0ANCitACUNvbnRlbnQ6CUNhbGNXaW5kb3dFbmVyZ3kgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUNCitADQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCisNCisJLnNlY3Rpb24gLnRleHQNCisJDQorCS5nbG9iYWwJQ2FsY1dpbmRvd0VuZXJneQ0KKw0KK0NhbGNXaW5kb3dFbmVyZ3k6DQorCXN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwlzdWIgICAgIHIxMywgcjEzLCAjMjAgDQorDQorICBtb3YgICAgIHIzLCByMywgbHNsICMxNiAgICAgICAgICAgICAgICAgICAgICAgICANCisJbGRyICAgICByMTAsIFtyMCwgIzE2OF0gICAgICAgICAgICAgICAgICAgIEAgc3RhdGVzMCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOw0KKyAgbW92ICAgICByMywgcjMsIGFzciAjMTYgDQorCWxkciAgICAgcjExLCBbcjAsICMxNzJdICAgICAgICAgICAgICAgICAgICBAIHN0YXRlczEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsNCisNCisJbW92ICAgICByMiwgcjIsIGxzbCAjMTYNCisJbGRyICAgICByMTIsIGhpUGFzc0NvZWZmICAgICAgICAgICAgICAgICAgIEAgQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07ICAgICAgDQorICBtb3YgICAgIHIyLCByMiwgYXNyICMxNg0KKwlsZHIgICAgIHIxNCwgaGlQYXNzQ29lZmYgKyA0CQkJICAgICAgICAgQCBDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsNCisJDQorCW1vdgkJCXI4LCAjMAkJCQkJCQkgICAgICAgICAgICAgICBAIHc9MA0KKwltb3YJCQlyNSwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCB3T2Zmc2V0ID0gMDsNCisJDQorQkxPQ0tfQkVHSU46DQorCW1vdgkJCXI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1VUUgPSAwOyANCisJbW92CQkJcjcsICMwCQkJCQkJCQkgICAgICAgICAgICAgQCBhY2N1RkUgPSAwOyANCisJbW92CQkJcjQsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgaT0wDQorCQkgICAgICAgICAgICAgICAgICAgDQorCXN0cgkJCXI4LCBbcjEzLCAjNF0JDQorCXN0cgkJCXIwLCBbcjEzLCAjOF0JDQorCXN0cgkJCXIzLCBbcjEzLCAjMTJdDQorCQ0KK0VORVJHWV9CRUc6CQ0KKwltb3YgICAgIHI5LCByNSwgbHNsICMxICANCisJbGRyc2ggICByOSwgW3IxLCByOV0JCQkJCQkJCQkJCUAgdGVtcFVuZmlsdGVyZWQgPSB0aW1lU2lnbmFsW3RpZHhdOw0KKw0KKwlhZGQJCQlyNSwgcjUsIHIyCQkJCQkJCQkJCQkJQCB0aWR4ID0gdGlkeCArIGNoSW5jcmVtZW50Ow0KKwkNCisJc211bHdiCXIzLCByMTQsIHI5CQkJCQkJCQkJCQkJQCBhY2N1MSA9IExfbXB5X2xzKENvZWZmMSwgdGVtcFVuZmlsdGVyZWQpOwkNCisJc211bGwJCXIwLCByOCwgcjEyLCByMTEJCQkJCQkJCQlAIGFjY3UyID0gZml4bXVsKCBDb2VmZjAsIHN0YXRlczEgKTsNCisJDQorCW1vdgkJCXIzLCByMywgbHNsICMxDQorCW1vdgkJCXI4LCByOCwgbHNsICMxDQorDQorCXN1YgkJCXIwLCByMywgcjEwCQkJCQkJCQkJCQkJQCBhY2N1MyA9IGFjY3UxIC0gc3RhdGVzMDsJDQorCXN1YgkJCXI4LAlyMCwgcjgJCQkJCQkJCQkJCQlAIG91dCA9IGFjY3UzIC0gYWNjdTI7DQorDQorCW1vdgkJICByMTAsIHIzCQkJCQkJCQkJCQkJCQlAIHN0YXRlczAgPSBhY2N1MTsNCisJbW92CQkgIHIxMSwgcjgJCQkJCQkJCQkJCQkJCUAgc3RhdGVzMSA9IG91dDsgIA0KKwkNCisJbXVsCQkgIHIzLCByOSwgcjkJDQorCW1vdiAgICAgcjgsIHI4LCBhc3IgIzE2DQorCQ0KKwlhZGQJCSAgcjQsIHI0LCAjMQ0KKwlhZGQgICAgIHI2LCByNiwgcjMsIGFzciAjNw0KKw0KKwltdWwJCSAgcjksIHI4LCByOAkNCisJbGRyCQkgIHIzLCBbcjEzLCAjMTJdDQorDQorCWFkZAkJICByNywgcjcsIHI5LCBhc3IgIzcNCisJCQ0KKwljbXAgICAgIHI0LCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsdCAgICAgRU5FUkdZX0JFRyAgICAgICANCisJDQorCWxkcgkJICByMCwgW3IxMywgIzhdDQorCWxkcgkJICByOCwgW3IxMywgIzRdDQorCQ0KK0VORVJHWV9FTkQ6DQorCWFkZAkJICByNCwgcjAsIHI4LCBsc2wgIzINCisNCisJc3RyICAgICByNiwgW3I0LCAjNzJdICAgICAgICAgDQorCWFkZAkJICByOCwgcjgsICMxCSAgICAgICAgICAgDQorICBzdHIgICAgIHI3LCBbcjQsICMxMzZdICAgICAgICAgICAgICAgICAgIA0KKw0KKwljbXAJCSAgcjgsICM4DQorCWJsdAkJICBCTE9DS19CRUdJTiAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICANCisNCitCTE9DS19FTkQ6DQorCXN0ciAgICAgcjEwLCBbcjAsICMxNjhdICAgICAgICAgICAgICAgICAgICANCisgIHN0ciAgICAgcjExLCBbcjAsICMxNzJdICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjAsICMxICAgICAgICAgICAgDQorCSAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjEzLCByMTMsICMyMCAgIA0KKwlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30gICAgICAgICAgICAgICAgICANCisNCitoaVBhc3NDb2VmZjoNCisJLndvcmQgMHhiZWM4YjQzOQ0KKwkud29yZAkweDYwOWQ0OTUyDQorCQkNCisJQEVORFANCisJLmVuZA0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQzZWRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zCkBAIC0wLDAgKzEsMTMxIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQlQcmVQb3N0TURDVF92NS5zDQorQA0KK0AJQ29udGVudDoJcHJlbWRjdCBhbmQgcG9zdG1kY3QgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUNCitADQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCisNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlQcmVNRENUDQorDQorUHJlTURDVDoNCisJc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwkNCisJYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyDQorCXN1YiAgICAgICAgIHIzLCByOSwgIzgNCisNCisJbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzINCisJYmVxICAgICAgICAgUHJlTURDVF9FTkQNCisJDQorUHJlTURDVF9MT09QOg0KKwlsZHIJCQkJCXI4LCBbcjJdLCAjNA0KKwlsZHIJCQkJCXI5LCBbcjJdLCAjNA0KKwkNCisJbGRyZAkJCQlyNCwgW3IwXQ0KKwlsZHJkCQkJCXI2LCBbcjNdDQorCQ0KKwlzbXVsbAkJCQlyMTQsIHIxMSwgcjQsIHI4CQkJCQlAIE1VTEhJR0godHIxLCBjb3NhKQ0KKwlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjcsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQ0KKwkJDQorCXNtdWxsCQkJCXIxNCwgcjgsIHI3LCByOQkJCQkJCUAgTVVMSElHSCh0aTEsIHNpbmEpDQorCXNtdWxsCQkJCXI3LCByMTAsIHI0LCByOQkJCQkJCUAgTVVMSElHSCh0cjEsIHNpbmEpCQ0KKwkJDQorCWFkZAkJCQkJcjExLCByMTEsIHI4CQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACQ0KKwlzdWIJCQkJCXI3LCByMTIsIHIxMAkJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpIC0gTVVMSElHSCh0cjEsIHNpbmEpDQorCQ0KKwlsZHIJCQkJCXI4LCBbcjJdLCAjNA0KKwlsZHIJCQkJCXI5LCBbcjJdLCAjNA0KKwkNCisJc211bGwJCQkJcjE0LCByNCwgcjYsIHI4CQkJCQkJQCBNVUxISUdIKHRyMiwgY29zYSkNCisJc211bGwgICAgCQkJcjEwLCByMTIsIHI1LCByOAkJCQkJQCBNVUxISUdIKHRpMiwgY29zYSkNCisJCQ0KKwlzbXVsbAkJCQlyMTQsIHI4LCByNSwgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQ0KKwlzbXVsbAkJCQlyNSwgcjEwLCByNiwgcjkJCQkJCQlAIE1VTEhJR0godHIyLCBzaW5hKQ0KKwkNCisJYWRkCQkJCQlyOCwgcjgsIHI0DQorCXN1YgkJCQkJcjksIHIxMiwgcjEwDQorCQ0KKwltb3YJCQkJCXI2LCByMTEJCQ0KKw0KKwlzdHJkCQkJCXI2LCBbcjBdCQ0KKwlzdHJkCQkJCXI4LCBbcjNdDQorCQ0KKwlzdWJzCQkJCXIxLCByMSwgIzENCisJc3ViCQkJCQlyMywgcjMsICM4DQorCWFkZCAJCQkJcjAsIHIwLCAjOA0KKwlibmUJCQkJCVByZU1EQ1RfTE9PUA0KKw0KK1ByZU1EQ1RfRU5EOg0KKwlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCUBFTkRQICBAIHxQcmVNRENUfA0KKwkNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlQb3N0TURDVA0KKw0KK1Bvc3RNRENUOg0KKwlzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorCQ0KKwlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzINCisJc3ViICAgICAgICAgcjMsIHI5LCAjOA0KKw0KKwltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMg0KKwliZXEgICAgICAgICBQb3N0TURDVF9FTkQNCisJDQorUG9zdE1EQ1RfTE9PUDoNCisJbGRyCQkJCQlyOCwgW3IyXSwgIzQJCQkJCQ0KKwlsZHIJCQkJCXI5LCBbcjJdLCAjNA0KKwkNCisJbGRyZAkJCQlyNCwgW3IwXQ0KKwlsZHJkCQkJCXI2LCBbcjNdDQorCQ0KKwlzbXVsbAkJCQlyMTQsIHIxMSwgcjQsIHI4CQkJCQlAIE1VTEhJR0godHIxLCBjb3NhKQ0KKwlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjUsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQ0KKwkJDQorCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTEsIHNpbmEpDQorCXNtdWxsCQkJCXI1LCByMTAsIHI0LCByOQkJCQkJCUAgTVVMSElHSCh0cjEsIHNpbmEpCQ0KKwkJDQorCWFkZAkJCQkJcjQsIHIxMSwgcjgJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACQ0KKwlzdWIJCQkJCXIxMSwgcjEwLCByMTIJCQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKSAtIE1VTEhJR0godHIxLCBzaW5hKUANCisJDQorCWxkcgkJCQkJcjgsIFtyMl0sICM0CQkJCQkJQA0KKwlsZHIJCQkJCXI5LCBbcjJdLCAjNA0KKwkNCisJc211bGwJCQkJcjE0LCByNSwgcjYsIHI4CQkJCQkJQCBNVUxISUdIKHRyMiwgY29zYSkNCisJc211bGwgICAgCQkJcjEwLCByMTIsIHI3LCByOAkJCQkJQCBNVUxISUdIKHRpMiwgY29zYSkNCisJCQ0KKwlzbXVsbAkJCQlyMTQsIHI4LCByNywgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQ0KKwlzbXVsbAkJCQlyNywgcjEwLCByNiwgcjkJCQkJCQlAIE1VTEhJR0godHIyLCBzaW5hKQ0KKwkNCisJYWRkCQkJCQlyNiwgcjgsIHI1CQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpQA0KKwlzdWIJCQkJCXI1LCByMTAsIHIxMgkJCQkJCUAgTVVMSElHSChzaW5iLCB0cjIpIC0gTVVMSElHSChjb3NiLCB0aTIpQA0KKwkNCisJbW92CQkJCQlyNywgcjExCQkJCQ0KKw0KKwlzdHJkCQkJCXI0LCBbcjBdDQorCXN0cmQJCQkJcjYsIFtyM10NCisJDQorCXN1YnMJCQkJcjEsIHIxLCAjMQ0KKwlzdWIJCQkJCXIzLCByMywgIzgNCisJYWRkIAkJCQlyMCwgcjAsICM4DQorCWJuZQkJCQkJUG9zdE1EQ1RfTE9PUA0KKw0KK1Bvc3RNRENUX0VORDoNCisJbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwlARU5EUCAgQCB8UG9zdE1EQ1R8DQorCS5lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBkYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucwpAQCAtMCwwICsxLDI1MiBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorQAlGaWxlOgkJUjRSOEZpcnN0X3Y1LnMNCitADQorQAlDb250ZW50OglSYWRpeDhGaXJzdCBhbmQgUmFkaXg0Rmlyc3QgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUNCitADQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCisNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlSYWRpeDRGaXJzdA0KKw0KK1JhZGl4NEZpcnN0Og0KKwlzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorCQ0KKwltb3ZzCQkJCXIxMCwgcjENCisJbW92CQkJCQlyMTEsIHIwDQorCWJlcQkJCQkJUmFkaXg0Rmlyc3RfRU5EDQorCQkNCitSYWRpeDRGaXJzdF9MT09QOg0KKwlsZHJkCQkJCXIwLCBbcjExXQ0KKwlsZHJkCQkJCXIyLCBbcjExLCAjOF0NCisJbGRyZAkJCQlyNCwgW3IxMSwgIzE2XQ0KKwlsZHJkCQkJCXI2LCBbcjExLCAjMjRdDQorCQ0KKwlhZGQJCQkJCXI4LCByMCwgcjINCisJYWRkCQkJCQlyOSwgcjEsIHIzDQorCQ0KKwlzdWIJCQkJCXIwLCByMCwgcjINCisJc3ViCQkJCQlyMSwgcjEsIHIzDQorCQ0KKwlhZGQJCQkJCXIyLCByNCwgcjYNCisJYWRkCQkJCQlyMywgcjUsIHI3DQorCQ0KKwlzdWIJCQkJCXI0LCByNCwgcjYNCisJc3ViCQkJCQlyNSwgcjUsIHI3DQorCQ0KKwlhZGQJCQkJCXI2LCByOCwgcjINCisJYWRkCQkJCQlyNywgcjksIHIzDQorCQ0KKwlzdWIJCQkJCXI4LCByOCwgcjINCisJc3ViCQkJCQlyOSwgcjksIHIzDQorCQ0KKwlhZGQJCQkJCXIyLCByMCwgcjUNCisJc3ViCQkJCQlyMywgcjEsIHI0DQorCQ0KKwlzdWIJCQkJCXIwLCByMCwgcjUNCisJYWRkCQkJCQlyMSwgcjEsIHI0DQorCQ0KKwlzdHJkCQkJCXI2LCBbcjExXQ0KKwlzdHJkCQkJCXIyLCBbcjExLCAjOF0NCisJc3RyZAkJCQlyOCwgW3IxMSwgIzE2XQ0KKwlzdHJkCQkJCXIwLCBbcjExLCAjMjRdDQorCQ0KKwlzdWJzCQkJCXIxMCwgcjEwLCAjMQ0KKwlhZGQJCQkJCXIxMSwgcjExLCAjMzINCisJYm5lCQkJCQlSYWRpeDRGaXJzdF9MT09QDQorDQorUmFkaXg0Rmlyc3RfRU5EOg0KKwlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCUBFTkRQICBAIHxSYWRpeDRGaXJzdHwNCisJDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg4Rmlyc3QNCisNCitSYWRpeDhGaXJzdDoNCisJc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwlzdWIgICAgICAgICBzcCwgc3AsICMweDI0DQorCQ0KKwltb3YJCQkJICByMTIsIHIxDQorCW1vdgkJCQkJcjE0LCByMA0KKwljbXAJCQkJCXIxMiwgIzANCisJYmVxCQkJCQlSYWRpeDhGaXJzdF9FTkQNCisJDQorUmFkaXg4Rmlyc3RfTE9PUDoNCisJbGRyZAkJCQlyMCwgW3IxNF0JCQ0KKwlsZHJkCQkJCXIyLCBbcjE0LCAjOF0NCisJbGRyZAkJCQlyNCwgW3IxNCwgIzE2XQ0KKwlsZHJkCQkJCXI2LCBbcjE0LCAjMjRdDQorCQ0KKwlhZGQJCQkJCXI4LCByMCwgcjIJCQkJCUAgcjAgPSBidWZbMF0gKyBidWZbMl1ADQorCWFkZAkJCQkJcjksIHIxLCByMwkJCQkJQCBpMCA9IGJ1ZlsxXSArIGJ1ZlszXUANCisJDQorCXN1YgkJCQkJcjAsIHIwLCByMgkJCQkJQCByMSA9IGJ1ZlswXSAtIGJ1ZlsyXUANCisJc3ViCQkJCQlyMSwgcjEsIHIzCQkJCQlAIGkxID0gYnVmWzFdIC0gYnVmWzNdQA0KKwkNCisJYWRkCQkJCQlyMiwgcjQsIHI2CQkJCQlACXIyID0gYnVmWzRdICsgYnVmWzZdQA0KKwlhZGQJCQkJCXIzLCByNSwgcjcJCQkJCUAgaTIgPSBidWZbNV0gKyBidWZbN11ADQorCQ0KKwlzdWIJCQkJCXI0LCByNCwgcjYJCQkJCUAJcjMgPSBidWZbNF0gLSBidWZbNl1ADQorCXN1YgkJCQkJcjUsIHI1LCByNwkJCQkJQCBpMyA9IGJ1Zls1XSAtIGJ1Zls3XUANCisJDQorCWFkZAkJCQkJcjYsIHI4LCByMgkJCQkJQCByNCA9IChyMCArIHIyKSA+PiAxQA0KKwlhZGQJCQkJCXI3LCByOSwgcjMJCQkJCUAgaTQgPSAoaTAgKyBpMikgPj4gMUANCisJDQorCXN1YgkJCQkJcjgsIHI4LCByMgkJCQkJQAlyNSA9IChyMCAtIHIyKSA+PiAxQA0KKwlzdWIJCQkJCXI5LCByOSwgcjMJCQkJCUAgaTUgPSAoaTAgLSBpMikgPj4gMUANCisJDQorCXN1YgkJCQkJcjIsIHIwLCByNQkJCQkJQCByNiA9IChyMSAtIGkzKSA+PiAxQA0KKwlhZGQJCQkJCXIzLCByMSwgcjQJCQkJCUAgaTYgPSAoaTEgKyByMykgPj4gMUANCisJDQorCWFkZAkJCQkJcjAsIHIwLCByNQkJCQkJQCByNyA9IChyMSArIGkzKSA+PiAxQA0KKwlzdWIJCQkJCXIxLCByMSwgcjQJCQkJCUAgaTcgPSAoaTEgLSByMykgPj4gMUANCisJDQorCW1vdgkJCQkJcjYsIHI2LCBhc3IgIzEJCQlADQorCW1vdgkJCQkJcjcsIHI3LCBhc3IgIzEJCQlADQorCQ0KKwltb3YJCQkJCXI4LCByOCwgYXNyICMxDQorCW1vdgkJCQkJcjksIHI5LCBhc3IgIzENCisJDQorCW1vdgkJCQkJcjIsIHIyLCBhc3IgIzENCisJbW92CQkJCQlyMywgcjMsIGFzciAjMQ0KKwkNCisJbW92CQkJCQlyMCwgcjAsIGFzciAjMQ0KKwltb3YJCQkJCXIxLCByMSwgYXNyICMxCQ0KKwkNCisJc3RyCQkJCQlyNiwgW3NwXQ0KKwlzdHIJCQkJCXI3LCBbc3AsICM0XQ0KKwkNCisJc3RyCQkJCQlyOCwgW3NwLCAjOF0NCisJc3RyCQkJCQlyOSwgW3NwLCAjMTJdDQorCQ0KKwlzdHIJCQkJCXIyLCBbc3AsICMxNl0NCisJc3RyCQkJCQlyMywgW3NwLCAjMjBdCQ0KKwkNCisJc3RyCQkJCQlyMCwgW3NwLCAjMjRdDQorCXN0cgkJCQkJcjEsIFtzcCwgIzI4XQkNCisJDQorCWxkcmQJCQkJcjIsIFtyMTQsICMzMl0JCQ0KKwlsZHJkCQkJCXI0LCBbcjE0LCAjNDBdDQorCWxkcmQJCQkJcjYsIFtyMTQsICM0OF0NCisJbGRyZAkJCQlyOCwgW3IxNCwgIzU2XQ0KKwkNCisJYWRkCQkJCQlyMCwgcjIsIHI0CQkJCQlAIHIwID0gYnVmWyA4XSArIGJ1ZlsxMF1ADQorCWFkZAkJCQkJcjEsIHIzLCByNQkJCQkJQCBpMCA9IGJ1ZlsgOV0gKyBidWZbMTFdQA0KKwkNCisJc3ViCQkJCQlyMiwgcjIsIHI0CQkJCQlAIHIxID0gYnVmWyA4XSAtIGJ1ZlsxMF1ADQorCXN1YgkJCQkJcjMsIHIzLCByNQkJCQkJQCBpMSA9IGJ1ZlsgOV0gLSBidWZbMTFdQA0KKwkNCisJYWRkCQkJCQlyNCwgcjYsIHI4CQkJCQlAIHIyID0gYnVmWzEyXSArIGJ1ZlsxNF1ADQorCWFkZAkJCQkJcjUsIHI3LCByOQkJCQkJQCBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQA0KKwkNCisJc3ViCQkJCQlyNiwgcjYsIHI4CQkJCQlAIHIzID0gYnVmWzEyXSAtIGJ1ZlsxNF1ADQorCXN1YgkJCQkJcjcsIHI3LCByOQkJCQkJQAlpMyA9IGJ1ZlsxM10gLSBidWZbMTVdQA0KKwkNCisJYWRkCQkJCQlyOCwgcjAsIHI0CQkJCQlAIHQwID0gKHIwICsgcjIpDQorCWFkZAkJCQkJcjksIHIxLCByNQkJCQkJQCB0MSA9IChpMCArIGkyKQ0KKwkNCisJc3ViCQkJCQlyMCwgcjAsIHI0CQkJCQlAIHQyID0gKHIwIC0gcjIpDQorCXN1YgkJCQkJcjEsIHIxLCByNQkJCQkJQCB0MyA9IChpMCAtIGkyKQ0KKwkNCisJbW92CQkJCQlyOCwgcjgsIGFzciAjMQ0KKwlsZHIJCQkJCXI0LCBbc3BdDQorCQ0KKwltb3YJCQkJCXI5LCByOSwgYXNyICMxDQorCWxkcgkJCQkJcjUsIFtzcCwgIzRdDQorCQ0KKwltb3YJCQkJCXIwLCByMCwgYXNyICMxCQkNCisJbW92CQkJCQlyMSwgcjEsIGFzciAjMQ0KKwkNCisJYWRkCQkJCQlyMTAsIHI0LCByOAkJCQkJQCBidWZbIDBdID0gcjQgKyB0MEANCisJYWRkCQkJCQlyMTEsIHI1LCByOQkJCQkJQCBidWZbIDFdID0gaTQgKyB0MUANCisJDQorCXN1YgkJCQkJcjQsICByNCwgcjgJCQkJCUAgYnVmWyA4XSA9IHI0IC0gdDBADQorCXN1YgkJCQkJcjUsICByNSwgcjkJCQkJCUAJYnVmWyA5XSA9IGk0IC0gdDFADQorCQ0KKyAJc3RyZAkJCQlyMTAsIFtyMTRdDQorIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzMyXQ0KKyAJDQorIAlsZHIJCQkJCXIxMCwgW3NwLCAjOF0NCisgCWxkcgkJCQkJcjExLCBbc3AsICMxMl0NCisgCQ0KKyAJYWRkCQkJCQlyNCwgcjEwLCByMQkJCQkJQCBidWZbIDRdID0gcjUgKyB0M0ANCisgCXN1YgkJCQkJcjUsIHIxMSwgcjAJCQkJCUAJYnVmWyA1XSA9IGk1IC0gdDJADQorIAkNCisgCXN1YgkJCQkJcjEwLCByMTAsIHIxCQkJCUAgYnVmWzEyXSA9IHI1IC0gdDNADQorIAlhZGQJCQkJCXIxMSwgcjExLCByMAkJCQlAIGJ1ZlsxM10gPSBpNSArIHQyQA0KKyAJDQorIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzE2XQ0KKyAJc3RyZAkJCQlyMTAsIFtyMTQsICM0OF0NCisgCQ0KKyAJc3ViCQkJCQlyMCwgcjIsIHI3CQkJCQlAIHIwID0gcjEgLSBpM0ANCisgCWFkZAkJCQkJcjEsIHIzLCByNgkJCQkJQCBpMCA9IGkxICsgcjNADQorIA0KKyAgbGRyCQkJCQlyMTEsIERBVEFUYWINCisgCQ0KKyAJYWRkCQkJCQlyMiwgcjIsIHI3CQkJCQlAIHIyID0gcjEgKyBpM0ANCisgCXN1YgkJCQkJcjMsIHIzLCByNgkJCQkJQCBpMiA9IGkxIC0gcjNADQorIAkNCisJc3ViCQkJCQlyNCwgcjAsIHIxCQkJCQlAIHIwIC0gaTANCisJYWRkCQkJCQlyNSwgcjAsIHIxCQkJCQlAIHIwICsgaTANCisJDQorCXN1YgkJCQkJcjAsIHIyLCByMwkJCQkJQCByMiAtIGkyDQorCWFkZAkJCQkJcjEsIHIyLCByMwkJCQkJQCByMiArIGkyDQorCQ0KKwlzbXVsbAkJCQlyOCwgcjYsIHI0LCByMTEJCQkJCQkJCQ0KKwlzbXVsbAkJCQlyOSwgcjcsIHI1LCByMTEJCQkJCQkJCQ0KKwkNCisJbGRyCQkJCQlyMiwgW3NwLCAjMTZdDQorCWxkcgkJCQkJcjMsIFtzcCwgIzIwXQ0KKwkNCisJc211bGwJCQkJcjgsIHI0LCByMCwgcjExCQkJCQkJCQkNCisJc211bGwJCQkJcjksIHI1LCByMSwgcjExCQkJCQkJCQkNCisJDQorCWxkcgkJCQkJcjEwLCBbc3AsICMyNF0NCisJbGRyCQkJCQlyMTEsIFtzcCwgIzI4XQ0KKwkNCisJc3ViCQkJCQlyOCwgcjIsIHI2DQorCXN1YgkJCQkJcjksIHIzLCByNw0KKwkNCisJYWRkCQkJCQlyMiwgcjIsIHI2DQorCWFkZAkJCQkJcjMsIHIzLCByNw0KKwkNCisJYWRkCQkJCQlyNiwgcjEwLCByNQ0KKwlzdWIJCQkJCXI3LCByMTEsIHI0DQorCQ0KKwlzdWIJCQkJCXIwLCByMTAsIHI1DQorCWFkZAkJCQkJcjEsIHIxMSwgcjQNCisJDQorCXN0cmQJCQkJcjYsIFtyMTQsICM4XQ0KKwlzdHJkCQkJCXI4LCBbcjE0LCAjMjRdDQorCXN0cmQJCQkJcjAsIFtyMTQsICM0MF0NCisJc3RyZAkJCQlyMiwgW3IxNCwgIzU2XQ0KKwkNCisJc3VicwkJCQlyMTIsIHIxMiwgIzENCisJYWRkCQkJCQlyMTQsIHIxNCwgIzY0DQorCQ0KKwlibmUJCQkJCVJhZGl4OEZpcnN0X0xPT1ANCisJDQorUmFkaXg4Rmlyc3RfRU5EOg0KKwlhZGQgICAgICAgICBzcCwgc3AsICMweDI0DQorCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30NCisJDQorREFUQVRhYjoNCisJLndvcmQgICAgICAgMHg1YTgyNzk5YQ0KKwkNCisJQEVORFAgIEAgfFJhZGl4OEZpcnN0fA0KKwkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4ZTVkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMKQEAgLTAsMCArMSwxNjkgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCVJhZGl4NEZGVF92NS5zDQorQA0KK0AJQ29udGVudDoJUmFkaXg0RkZUIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg0RkZUDQorDQorUmFkaXg0RkZUOg0KKwlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwlzdWIgICAgICAgc3AsIHNwLCAjMzIgICAgICAgICAgICAgICAgICAgICANCisNCisJbW92CQkJcjEsIHIxLCBhc3IgIzINCisJY21wICAgICByMSwgIzAgICAgICAgDQorCWJlcSAgICAgUmFkaXg0RkZUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9MT09QMTogICAgICAgICAgDQorCW1vdiAgICAgcjE0LCByMCAgICAgICAgICAJCQkJCQkJQCB4cHRyID0gYnVmQCAgICAgICAgICANCisJbW92CQlyMTAsIHIxIAkJCQkJCQkJCQkJCUAgaSA9IG51bUANCisJbW92ICAgICByOSwgcjIsIGxzbCAjMyAgCQkJCQkJCUAgc3RlcCA9IDIqYmduQA0KKwljbXAgICAgIHIxMCwgIzAgIA0KKwlzdHIJCXIwLCBbc3BdIA0KKwlzdHIJCXIxLCBbc3AsICM0XSAgICAgIA0KKwlzdHIJCXIyLCBbc3AsICM4XQ0KKwlzdHIJCXIzLCBbc3AsICMxMl0gIA0KKwliZXEgICAgIFJhZGl4NEZGVF9MT09QMV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICANCisgICAgIA0KK1JhZGl4NEZGVF9MT09QMjogICAgICAgICAgICAgICAgICAgICAgIA0KKwltb3YgICAgIHIxMiwgcjMJCQkJICAgICAgICAJCQkJQCBjc3B0ciA9IHR3aWRUYWJADQorCW1vdgkJcjExLCByMgkJCQkJCQkJCQkJCUAgaiA9IGJnbg0KKwljbXAgICAgIHIxMSwgIzAgICAgICAgIA0KKwlzdHIJCXIxMCwgW3NwLCAjMTZdDQorCWJlcSAgICAgUmFkaXg0RkZUX0xPT1AyX0VORCAgICAgICAgICAgICAgICAgICAgICAgICANCisJIA0KK1JhZGl4NEZGVF9MT09QMzogICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlzdHIJCQlyMTEsIFtzcCwgIzIwXQkgDQorCQ0KKwlsZHJkCQlyMCwgW3IxNCwgIzBdCQkJCQkJCQkJQCByMCA9IHhwdHJbMF1AIHIxID0geHB0clsxXUANCisJYWRkCQkJcjE0LCByMTQsIHI5IAkgCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEANCisJDQorCWxkcmQJCXIxMCwJW3IxNCwgIzBdICAJCQkJCSAJCQlAIHIyID0geHB0clswXUAgcjMgPSB4cHRyWzFdQAkNCisJbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clswXUANCisJDQorCXNtdWx3dAlyNCwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQ0KKwlzbXVsd3QJcjMsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkNCisJDQorCXNtbGF3YglyMiwgcjExLCByOCwgcjQJCQkJCQkJCUAgcjIgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlADQorCXNtdWx3YglyNSwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQ0KKwkNCisJbW92CQkJcjEwLCByMCwgYXNyICMyCQkJCQkJCQlAIHQwID0gcjAgPj4gMkANCisJbW92CQkJcjExLCByMSwgYXNyICMyCQkJCQkJCQlACXQxID0gcjEgPj4gMkANCisJCQ0KKwlzdWIJCQlyMywgcjMsIHI1CQkJCQkJCQkJCUAgcjMgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClADQorCWFkZCAgICAgcjE0LCByMTQsIHI5IAkgCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEANCisJDQorCXN1YgkJCXIwLCByMTAsIHIyCQkJCQkJCQkJCUAgcjAgPSB0MCAtIHIyQA0KKwlzdWIJCQlyMSwgcjExLCByMwkJCQkJCQkJCSAgQCByMSA9IHQxIC0gcjNADQorCQ0KKwlhZGQJCQlyMiwgcjEwLCByMgkJCQkJCQkJCQlAIHIyID0gdDAgKyByMkANCisJYWRkCQkJcjMsIHIxMSwgcjMJCQkJCQkJCQkJQCByMyA9IHQxICsgcjNADQorCQ0KKwlzdHIJCQlyMiwgW3NwLCAjMjRdDQorCXN0cgkJCXIzLCBbc3AsICMyOF0NCisJDQorCWxkcmQJCXIxMCwgW3IxNCwgIzBdCQkJCQkJCQlAIHI0ID0geHB0clswXUAgcjUgPSB4cHRyWzFdQA0KKwlsZHIJCQlyOCwgW3IxMl0sICM0CQkJCQkJCQkJQCBjb3N4c2lueCA9IGNzcHRyWzFdQA0KKwkNCisJc211bHd0CXI2LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDApDQorCXNtdWx3dAlyNSwgcjExLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQxKQ0KKwkNCisJc21sYXdiCXI0LCByMTEsIHI4LCByNgkJCQkJCQkJQCByNCA9IExfbXB5X3d4KGNvc3gsIHQwKSArIExfbXB5X3d4KHNpbngsIHQxKUANCisJc211bHdiCXI3LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApDQorCQ0KKwlhZGQJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEANCisJc3ViCQkJcjUsIHI1LCByNwkJCQkJCQkJCQlAIHI1ID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQA0KKwkJDQorCWxkcmQJCXIxMCwgW3IxNF0JCQkJCQkJCQkJQCByNiA9IHhwdHJbMF1AIHI3ID0geHB0clsxXUANCisJbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clsxXUANCisJDQorCXNtdWx3dAlyMiwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQ0KKwlzbXVsd3QJcjcsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkNCisJDQorCXNtbGF3YglyNiwgcjExLCByOCwgcjIJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlADQorCXNtdWx3YglyMywgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQ0KKwkNCisJbW92CQkJcjEwLCByNAkJCQkJCQkJCQkJCUAgdDAgPSByNEANCisJbW92CQkJcjExLCByNQkJCQkJCQkJCQkJCUAgdDEgPSByNUAJDQorCQ0KKwlzdWIJCQlyNywgcjcsIHIzCQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClADQorCQ0KKw0KKwlhZGQJCQlyNCwgIHIxMCwgcjYJCQkJCQkJCQlACXI0ID0gdDAgKyByNkAJDQorCXN1YgkJCXI1LCByNywgcjExCQkJCQkJCQkJCUAgcjUgPSByNyAtIHQxQA0KKwkNCisJc3ViCQkJcjYsIHIxMCwgcjYJCQkJCQkJCQkJQCByNiA9IHQwIC0gcjZADQorCWFkZAkJCXI3LCByNywgcjExCQkJCQkJCQkJCUAgcjcgPSByNyArIHQxQA0KKwkNCisJbGRyCQkJcjIsIFtzcCwgIzI0XQ0KKwlsZHIJCQlyMywgW3NwLCAjMjhdDQorCQ0KKwlhZGQJCQlyMTAsIHIwLCByNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCArIHI1QA0KKwlhZGQJCQlyMTEsIHIxLCByNgkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMSArIHI2DQorCQ0KKwlzdHJkCQlyMTAsIFtyMTRdCQkJCQkJCQkJCQ0KKwlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJDQorCXN1YgkJCXIxMCwgcjIsIHI0CQkJCQkJCQkJCUAJeHB0clswXSA9IHIyIC0gcjRADQorCXN1YgkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdADQorCQ0KKwlzdHJkCQlyMTAsIFtyMTRdCQkJCQ0KKwlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJDQorCXN1YgkJCXIxMCwgcjAsIHI1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwIC0gcjVADQorCXN1YgkJCXIxMSwgcjEsIHI2CQkJCQkJCQkJCUAgeHB0clswXSA9IHIxIC0gcjYNCisJDQorCXN0cmQJCXIxMCwgW3IxNF0JCQkJCQkJCQkJDQorCXN1YgkJCXIxNCwgcjE0LCByOQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQA0KKwkNCisJYWRkCQkJcjEwLCByMiwgcjQJCQkJCQkJCQkJQAl4cHRyWzBdID0gcjIgLSByNEANCisJYWRkCQkJcjExLCByMywgcjcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0ANCisJDQorCXN0cmQJCXIxMCwgW3IxNF0JCQkJDQorCWFkZAkJCXIxNCwgcjE0LCAjOAkJCQkJCQkJCUAgeHB0ciArPSAyQA0KKwkNCisJbGRyCQkJcjExLCBbc3AsICMyMF0NCisJc3VicwkJcjExLCByMTEsICMxDQorCWJuZQkJCVJhZGl4NEZGVF9MT09QMwkNCisJIA0KK1JhZGl4NEZGVF9MT09QMl9FTkQ6ICAgICAgICAgICANCisJbGRyCQkJcjEwLCBbc3AsICMxNl0NCisJbGRyCQkJcjMsIFtzcCwgIzEyXQ0KKwlsZHIJCQlyMiwgW3NwLCAjOF0NCisJcnNiCQkJcjgsIHI5LCByOSwgbHNsICMyICAgDQorCXN1YgkJCXIxMCwgcjEwLCAjMQ0KKwlhZGQJCQlyMTQsIHIxNCwgcjgJCSAgICAgIA0KKwljbXAJCQlyMTAsICMwICANCisJYmhpICAgICBSYWRpeDRGRlRfTE9PUDIgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9MT09QMV9FTkQ6ICAgICAgICAgICAgICAgDQorCWxkciAgICAgcjAsIFtzcF0gICAgDQorCWxkcgkJcjEsIFtzcCwgIzRdDQorCWFkZCAgICAgcjMsIHIzLCByOCwgYXNyICMxDQorCW1vdiAgICAgcjIsIHIyLCBsc2wgIzIgDQorCW1vdnMgICAgcjEsIHIxLCBhc3IgIzIgDQorCWJuZSAgICAgUmFkaXg0RkZUX0xPT1AxICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9FTkQ6ICAgICAgICAgICAgICAgICAgICAgICAgDQorCWFkZCAgICAgc3AsIHNwLCAjMzIgICAgICAgICAgICAgICAgICANCisJbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCQkNCisJQEVORFAgIEAgfFJhZGl4NEZGVHwNCisJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDYzZGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zCkBAIC0wLDAgKzEsMjA0IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQliYW5kX25yZ192NS5zDQorQA0KK0AJQ29udGVudDoJQ2FsY0JhbmRFbmVyZ3kgYW5kIENhbGNCYW5kRW5lcmd5TVMgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUNCitADQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCisNCisJLnNlY3Rpb24gLnRleHQNCisNCisJLmdsb2JhbAlDYWxjQmFuZEVuZXJneQ0KKw0KK0NhbGNCYW5kRW5lcmd5Og0KKwlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0JDQorICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMiwgcjIsIGxzbCAjMTYgICAgICAgICAgICAgICAgICAgDQorCWxkciAgICAgcjEyLCBbcjEzLCAjMzZdDQorCW1vdgkJCXI5LCAjMA0KKyAgbW92ICAgICByNSwgcjIsIGFzciAjMTYgICAgDQorCW1vdgkJCXI0LCAjMCAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByNSwgIzAJDQorCWJsZSAgICAgTDIxMiANCisNCitMMjI6DQorICBtb3YgICAgIHIyLCByNCwgbHNsICMxICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjEwLCBbcjEsIHIyXSAgICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkICAgICByMTEsIHIxLCByMiAgICAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHIyLCBbcjExLCAjMl0gICAgDQorCW1vdiAgICAgcjE0LCAjMCAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHIxMCwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJnZSAgICAgTDI4IA0KKwkNCitMMjM6DQorCWxkciAgICAgcjExLCBbcjAsICtyMTAsIGxzbCAjMl0JDQorICBhZGQgICAgIHIxMCwgcjEwLCAjMSAgICANCisJbGRyICAgICByNiwgW3IwLCArcjEwLCBsc2wgIzJdCQ0KKwlzbXVsbCAgIHIxMSwgcjcsIHIxMSwgcjExDQorCWFkZCAgICAgcjEwLCByMTAsICMxIA0KKwlzbXVsbAkgIHI2LCByOCwgcjYsIHI2DQorCWxkciAgICAgcjExLCBbcjAsICtyMTAsIGxzbCAjMl0NCisJcWFkZAkgIHIxNCwgcjE0LCByNw0KKwlhZGQgICAgIHIxMCwgcjEwLCAjMQ0KKwlzbXVsbAkgIHIxMSwgcjcsIHIxMSwgcjExDQorCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQ0KKwlxYWRkCSAgcjE0LCByMTQsIHI4DQorCXNtdWxsCSAgcjYsIHI4LCByNiwgcjYNCisgIGFkZCAgICAgcjEwLCByMTAsICMxIA0KKwlxYWRkCSAgcjE0LCByMTQsIHI3DQorCWNtcCAgICAgcjEwLCByMg0KKwlxYWRkCSAgcjE0LCByMTQsIHI4DQorCWJsdCAgICAgTDIzICAgDQorDQorTDI4OgkNCisJcWFkZAkgIHIxNCwgcjE0LCByMTQNCisJc3RyICAgICByMTQsIFtyMywgK3I0LCBsc2wgIzJdDQorCWFkZCAgICAgcjQsIHI0LCAjMSANCisJcWFkZAkgIHI5LCByOSwgcjE0DQorCWNtcCAgICAgcjQsIHI1ICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisgIGJsdCAgICAgTDIyICAgICAgIAkNCisNCitMMjEyOgkNCisJc3RyICAgICByOSwgW3IxMiwgIzBdICAgICAgICAgICAgICAgICAgICAgDQorCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwkNCisJQEVORFAgIDsgfENhbGNCYW5kRW5lcmd5fA0KKwkNCisJLmdsb2JhbAlDYWxjQmFuZEVuZXJneU1TDQorDQorQ2FsY0JhbmRFbmVyZ3lNUzoNCisJc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorCXN1YiAgICAgcjEzLCByMTMsICMyNA0KKwkNCisJbW92ICAgICByMTIsICMwIA0KKyAgbW92ICAgICByMywgcjMsIGxzbCAjMTYgIA0KKyAgbW92ICAgICByMTQsICMwIA0KKwltb3YgICAgIHIzLCByMywgYXNyICMxNiAgICAgIA0KKwljbXAgICAgIHIzLCAjMCAgICAgICAgICANCisJbW92CQkgIHI0LCAjMCAgICAgICAgICAgICAgICAgIA0KKyAgYmxlICAgICBMMzE1ICAgIA0KKwkNCitMMzI6CQ0KKwltb3YJCSAgcjUsIHI0LCBsc2wgIzENCisJbW92CQkgIHI2LCAjMA0KKwlsZHJzaCAgIHIxMCwgW3IyLCByNV0NCisJYWRkICAgICByNSwgcjIsIHI1DQorCW1vdgkJICByNywgIzANCisJbGRyc2gJICByMTEsIFtyNSwgIzJdICAgICAgICAgICAgICAgICAgICAgICAgDQorCWNtcCAgICAgcjEwLCByMTEgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgYmdlICAgICBMMzkgICAgDQorDQorCXN0cgkJICByMywgW3IxMywgIzRdDQorCXN0cgkJICByNCwgW3IxMywgIzhdDQorCXN0cgkJICByMTIsIFtyMTMsICMxMl0NCisJc3RyCQkgIHIxNCwgW3IxMywgIzE2XQ0KKw0KK0wzMzoJDQorCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICAgICAgICAgICAgDQorCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQ0KKwltb3YJCSAgcjgsIHI4LCBhc3IgIzENCisJYWRkCQkgIHIxMCwgcjEwLCAjMQ0KKwltb3YJCSAgcjksIHI5LCBhc3IgIzENCisNCisJbGRyICAgICByMTIsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICANCisJYWRkCQkgIHI1LCByOCwgcjkJICAgICAgICAgIA0KKwlsZHIgICAgIHIxNCwgW3IxLCArcjEwLCBsc2wgIzJdDQorCXN1YgkJICByOCwgcjgsIHI5DQorDQorCXNtdWxsICAgcjUsIHIzLCByNSwgcjUgDQorCW1vdgkJICByMTIsIHIxMiwgYXNyICMxDQorCXNtdWxsICAgcjgsIHI0LCByOCwgcjggDQorCW1vdgkJICByMTQsIHIxNCwgYXNyICMxDQorDQorCXFhZGQJICByNiwgcjYsIHIzDQorCWFkZAkJICByNSwgcjEyLCByMTQNCisJcWFkZAkgIHI3LCByNywgcjQNCisJc3ViCQkgIHI4LCByMTIsIHIxNA0KKw0KKwlzbXVsbCAgIHI1LCByMywgcjUsIHI1IA0KKwlhZGQJCSAgcjEwLCByMTAsICMxDQorCXNtdWxsICAgcjgsIHI0LCByOCwgcjggDQorCQkNCisJcWFkZAkgIHI2LCByNiwgcjMNCisJcWFkZAkgIHI3LCByNywgcjQNCisNCisJbGRyICAgICByOCwgW3IwLCArcjEwLCBsc2wgIzJdICAgICAgICAgICAgICAgICAgICANCisJbGRyICAgICByOSwgW3IxLCArcjEwLCBsc2wgIzJdDQorCW1vdgkJICByOCwgcjgsIGFzciAjMQ0KKwlhZGQJCSAgcjEwLCByMTAsICMxDQorCW1vdgkJICByOSwgcjksIGFzciAjMQ0KKw0KKwlsZHIgICAgIHIxMiwgW3IwLCArcjEwLCBsc2wgIzJdICAgICAgICAgIA0KKwlhZGQJCSAgcjUsIHI4LCByOQkgICAgICAgICAgDQorCWxkciAgICAgcjE0LCBbcjEsICtyMTAsIGxzbCAjMl0NCisJc3ViCQkgIHI4LCByOCwgcjkNCisNCisJc211bGwgICByNSwgcjMsIHI1LCByNSANCisJbW92CQkgIHIxMiwgcjEyLCBhc3IgIzENCisJc211bGwgICByOCwgcjQsIHI4LCByOCANCisJbW92CQkgIHIxNCwgcjE0LCBhc3IgIzENCisNCisJcWFkZAkgIHI2LCByNiwgcjMNCisJYWRkCQkgIHI1LCByMTIsIHIxNA0KKwlxYWRkCSAgcjcsIHI3LCByNA0KKwlzdWIJCSAgcjgsIHIxMiwgcjE0DQorDQorCXNtdWxsICAgcjUsIHIzLCByNSwgcjUgDQorCWFkZAkJICByMTAsIHIxMCwgIzENCisJc211bGwgICByOCwgcjQsIHI4LCByOCANCisJCQ0KKwlxYWRkCSAgcjYsIHI2LCByMw0KKwlxYWRkCSAgcjcsIHI3LCByNA0KKw0KKwljbXAgICAgIHIxMCwgcjExDQorCQ0KKwlibHQJCSAgTDMzDQorDQorCWxkcgkJICByMywgW3IxMywgIzRdDQorCWxkcgkJICByNCwgW3IxMywgIzhdCQ0KKwlsZHIJCSAgcjEyLCBbcjEzLCAjMTJdDQorCWxkcgkJICByMTQsIFtyMTMsICMxNl0NCitMMzk6CQ0KKwlxYWRkCSAgcjYsIHI2LCByNg0KKwlxYWRkCSAgcjcsIHI3LCByNwkNCisJDQorCWxkcgkJICByOCwgW3IxMywgIzYwXQ0KKwlsZHIJCSAgcjksIFtyMTMsICM2OF0NCisNCisJcWFkZAkgIHIxMiwgcjEyLCByNg0KKwlxYWRkCSAgcjE0LCByMTQsIHI3DQorCQ0KKwlzdHIJCSAgcjYsIFtyOCwgK3I0LCBsc2wgIzJdICAgICAgIA0KKwlzdHIgICAgIHI3LCBbcjksICtyNCwgbHNsICMyXSAgICANCisJDQorCWFkZAkJICByNCwgcjQsICMxDQorCWNtcAkJICByNCwgcjMNCisJYmx0ICAgICBMMzIgICAgICAgICAgICANCisNCitMMzE1Og0KKwlsZHIJCSAgcjgsIFtyMTMsICM2NF0NCisJbGRyCQkgIHI5LCBbcjEzLCAjNzJdDQorCXN0cgkJICByMTIsIFtyOCwgIzBdDQorCXN0cgkJICByMTQsIFtyOSwgIzBdDQorDQorCWFkZCAgICAgcjEzLCByMTMsICMyNA0KKwlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30NCisJQEVORFAgIDsgfENhbGNCYW5kRW5lcmd5TVN8DQorDQorCS5lbmQNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2RjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucwpAQCAtMCwwICsxLDEzNSBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorQAlGaWxlOgkJUHJlUG9zdE1EQ1Rfdjcucw0KK0ANCitACUNvbnRlbnQ6CXByZW1kY3QgYW5kIHBvc3RtZGN0IGZ1bmN0aW9uIGFybXY3IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUHJlTURDVA0KKw0KK1ByZU1EQ1Q6DQorCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorCQ0KKwlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzINCisJc3ViICAgICAgICAgcjMsIHI5LCAjMzINCisNCisJbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzINCisJYmVxICAgICAgICAgUHJlTURDVF9FTkQJDQorCQ0KK1ByZU1EQ1RfTE9PUDoNCisJVkxENC5JMzIJCQl7ZDAsIGQyLCBkNCwgZDZ9LCBbcjJdIQkJCQlAIGNvc2EgPSAqY3NwdHIrK0Agc2luYSA9ICpjc3B0cisrQA0KKwlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytADQorCVZMRDIuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdCQkJQCB0cjEgPSAqKGJ1ZjAgKyAwKUAgdGkyID0gKihidWYwICsgMSlADQorCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCUAgdHIyID0gKihidWYxIC0gMSlAIHRpMSA9ICooYnVmMSArIDApQA0KKwlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUANCisJCQ0KKwlWUkVWNjQuMzIJCQlROCwgUTcJDQorCVZSRVY2NC4zMgkJCVE5LCBRNg0KKw0KKwkNCisJVlFETVVMSC5TMzIJCVExMCwgUTAsIFE0CQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKQ0KKwlWUURNVUxILlMzMgkJUTExLCBRMSwgUTgJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0aTEpDQorCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBROAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMSkNCisJVlFETVVMSC5TMzIJCVExMywgUTEsIFE0CQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdHIxKQ0KKwkJDQorCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQA0KKwlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKUANCisJDQorCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSENCisJc3ViCQkJCQkJcjMsIHIzLCAjMzINCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFEyLCBROQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdHIyKQ0KKwlWUURNVUxILlMzMgkJUTExLCBRMywgUTUJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRpMikNCisJVlFETVVMSC5TMzIJCVExMiwgUTIsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpDQorCVZRRE1VTEguUzMyCQlRMTMsIFEzLCBROQkJCQkJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKQ0KKwkJDQorCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMikgKyBNVUxISUdIKHNpbmEsIHRpMilADQorCVZTVUIuUzMyCQkJUTEsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMikgLSBNVUxISUdIKHNpbmEsIHRyMilADQorCQ0KKwlWUkVWNjQuMzIJCQlRMywgUTENCisJVlJFVjY0LjMyCQkJUTIsIFEwDQorCQkNCisJVlNUMi5JMzIJCXtkNSwgZDd9LCBbcjNdIQkNCisJVlNUMi5JMzIJCXtkNCwgZDZ9LCBbcjNdISANCisJDQorCXN1YnMgICAgIAkJcjEsIHIxLCAjNA0KKwlzdWIJCSAgCQlyMywgcjMsICM2NAkNCisJYm5lICAgICAgIAlQcmVNRENUX0xPT1ANCisJDQorUHJlTURDVF9FTkQ6DQorCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCUBFTkRQICBAIHxQcmVNRENUfA0KKw0KKwkuc2VjdGlvbiAudGV4dA0KKwkuZ2xvYmFsCVBvc3RNRENUDQorDQorUG9zdE1EQ1Q6DQorCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorCQ0KKwlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzINCisJc3ViICAgICAgICAgcjMsIHI5LCAjMzINCisNCisJbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzINCisJYmVxICAgICAgICAgUG9zdE1EQ1RfRU5EDQorCQ0KK1Bvc3RNRENUX0xPT1A6DQorCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0ANCisJVkxENC5JMzIJCQl7ZDEsIGQzLCBkNSwgZDd9LCBbcjJdIQkJCQlAIGNvc2IgPSAqY3NwdHIrK0Agc2luYiA9ICpjc3B0cisrQA0KKwlWTEQyLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwgW3IwXQkJCUAgdHIxID0gKih6YnVmMSArIDApQCB0aTEgPSAqKHpidWYxICsgMSlADQorCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUANCisJVkxEMi5JMzIJCQl7ZDEyLCBkMTR9LCBbcjNdIQkJCQkJCQlAIHRyMiA9ICooemJ1ZjIgLSAxKUAgdGkyID0gKih6YnVmMiArIDApQAkNCisNCisJVlJFVjY0LjMyCQkJUTgsIFE2CQ0KKwlWUkVWNjQuMzIJCQlROSwgUTcJCQkNCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKQ0KKwlWUURNVUxILlMzMgkJUTExLCBRMSwgUTUJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmEsIHRpMSkNCisJVlFETVVMSC5TMzIJCVExMiwgUTAsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0aTEpDQorCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdHIxKQ0KKwkJDQorCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQA0KKwlWU1VCLlMzMgkJCVE1LCBRMTMsIFExMgkJCQkJCQkJCUAgKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKUANCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFEyLCBROAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdHIyKQ0KKwlWUURNVUxILlMzMgkJUTExLCBRMywgUTkJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRpMikNCisJVlFETVVMSC5TMzIJCVExMiwgUTIsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpDQorCVZRRE1VTEguUzMyCQlRMTMsIFEzLCBROAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKQ0KKwkJDQorCVZBREQuUzMyCQkJUTQsIFExMCwgUTExCQkJCQkJCQkJQCAqYnVmMS0tID0gTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQA0KKwlWU1VCLlMzMgkJCVExLCBRMTMsIFExMgkJCQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goc2luYSwgdHIyKSAtIE1VTEhJR0goY29zYSwgdGkyKUAJDQorCQ0KKwlWUkVWNjQuMzIJCQlRMiwgUTQNCisJVlJFVjY0LjMyCQkJUTMsIFE1CQ0KKwkNCisJc3ViCQkJCQkJcjMsIHIzLCAjMzIJDQorCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSENCisJCQ0KKwlWU1QyLkkzMgkJCXtkNSwgZDd9LCBbcjNdIQkNCisJVlNUMi5JMzIJCQl7ZDQsIGQ2fSwgW3IzXSEgDQorCQ0KKwlzdWJzICAgICAJCQlyMSwgcjEsICM0DQorCXN1YgkJICAJCQlyMywgcjMsICM2NAkJDQorCWJuZSAgICAgICAJUG9zdE1EQ1RfTE9PUA0KKw0KK1Bvc3RNRENUX0VORDoNCisJbGRtaWEgICAgIHNwISwge3I0IC0gcjExLCBwY30NCisNCisJQEVORFAgIAkJQCB8UG9zdE1EQ1R8DQorCS5lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllZTY4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucwpAQCAtMCwwICsxLDE0NiBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorQAlGaWxlOgkJUjRSOEZpcnN0X3Y3LnMNCitADQorQAlDb250ZW50OglSYWRpeDhGaXJzdCBhbmQgUmFkaXg0Rmlyc3QgZnVuY3Rpb24gYXJtdjcgYXNzZW1ibGUNCitADQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCisNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlSYWRpeDhGaXJzdA0KKw0KK1JhZGl4OEZpcnN0Og0KKwlzdG1kYiAgICAgCQlzcCEsIHtyNCAtIHIxMSwgbHJ9DQorDQorCWxkciAgICAgICAJCXIzLCBTUVJUMV8yDQorCWNtcCAgICAgICAJCXIxLCAjMA0KKwkNCisJVkRVUC5JMzIgIAkJUTE1LCByMwkNCisJYmVxICAgICAgIAkJUmFkaXg4Rmlyc3RfRU5EDQorCQ0KK1JhZGl4OEZpcnN0X0xPT1A6DQorCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwJW3IwXSENCisJVkxEMS5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sCVtyMF0hDQorCQkNCisJVkFERC5TMzIJCQlkNCwgZDAsIGQxCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQGkwID0gYnVmWzFdICsgYnVmWzNdQA0KKwlWU1VCLlMzMgkJCWQ1LCBkMCwgZDEJCUAgcjEgPSBidWZbMF0gLSBidWZbMl1AaTEgPSBidWZbMV0gLSBidWZbM11ACQ0KKwlWU1VCLlMzMgkJCWQ3LCBkMiwgZDMJCUAgcjIgPSBidWZbNF0gLSBidWZbNl1AaTIgPSBidWZbNV0gLSBidWZbN11ACQ0KKwlWQURELlMzMgkJCWQ2LCBkMiwgZDMJCUAgcjMgPSBidWZbNF0gKyBidWZbNl1AaTMgPSBidWZbNV0gKyBidWZbN11ADQorCVZSRVY2NC5JMzIJCQlkNywgZDcJDQorCQ0KKwlWQURELlMzMgkJCVEwLCBRMiwgUTMJCUAgcjQgPSAocjAgKyByMilAaTQgPSAoaTAgKyBpMilAaTYgPSAoaTEgKyByMylAcjcgPSAocjEgKyBpMykNCisJVlNVQi5TMzIJCQlRMSwgUTIsIFEzCQlAIHI1ID0gKHIwIC0gcjIpQGk1ID0gKGkwIC0gaTIpQHI2ID0gKHIxIC0gaTMpQGk3ID0gKGkxIC0gcjMpQA0KKw0KKwlWUkVWNjQuSTMyCQkJZDMsIGQzCQ0KKw0KKwlWQURELlMzMgkJCWQ0LCBkOCwgZDkJCUAgcjAgPSBidWZbIDhdICsgYnVmWzEwXUBpMCA9IGJ1ZlsgOV0gKyBidWZbMTFdQA0KKwlWU1VCLlMzMgkJCWQ3LCBkMTAsIGQxMQlAIHIxID0gYnVmWzEyXSAtIGJ1ZlsxNF1AaTEgPSBidWZbMTNdIC0gYnVmWzE1XUAJDQorCVZBREQuUzMyCQkJZDYsIGQxMCwgZDExCUAgcjIgPSBidWZbMTJdICsgYnVmWzE0XUBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQA0KKwlWUkVWNjQuSTMyCQkJZDcsIGQ3CQ0KKwlWU1VCLlMzMgkJCWQ1LCBkOCwgZDkJCUAgcjMgPSBidWZbIDhdIC0gYnVmWzEwXUBpMyA9IGJ1ZlsgOV0gLSBidWZbMTFdQA0KKwkNCisJVlRSTi4zMgkJCQlkMSwgZDMJDQorCQ0KKwlWQURELlMzMgkJCVE0LCBRMiwgUTMJCUAgdDAgPSAocjAgKyByMikgPj4gMUB0MSA9IChpMCArIGkyKSA+PiAxQGkwID0gaTEgKyByM0ByMiA9IHIxICsgaTNADQorCVZTVUIuUzMyCQkJUTUsIFEyLCBRMwkJQCB0MiA9IChyMCAtIHIyKSA+PiAxQHQzID0gKGkwIC0gaTIpID4+IDFAcjAgPSByMSAtIGkzQGkyID0gaTEgLSByM0ANCisJDQorCVZSRVY2NC5JMzIJCQlkMywgZDMNCisJDQorCVZTSFIuUzMyCQkJZDgsIGQ4LCAjMQkJIA0KKwlWU0hSLlMzMgkJCVEwLCBRMCwgIzENCisJVlJFVjY0LkkzMgkJCWQxMCwgZDEwDQorCVZUUk4uMzIJCQkJZDExLCBkOQ0KKwlWU0hSLlMzMgkJCVExLCBRMSwgIzENCisJVlNIUi5TMzIJCQlkMTAsIGQxMCwgIzENCisJVlJFVjY0LkkzMgkJCWQ5LCBkOQ0KKwkNCisJc3ViICAgICAgIAkJCXIwLCByMCwgIzB4NDANCisJDQorCVZBREQuUzMyCQkJZDEyLCBkMCwgZDgNCisJVlNVQi5TMzIJCQlkMTYsIGQwLCBkOAkNCisJVkFERC5TMzIJCQlkMTQsIGQyLCBkMTANCisJVlNVQi5TMzIJCQlkMTgsIGQyLCBkMTANCisJDQorCVZTVUIuUzMyCQkJZDQsIGQxMSwgZDkNCisJVkFERC5TMzIJCQlkNSwgZDExLCBkOQ0KKwkNCisJVlJFVjY0LkkzMgkJCWQxOCwgZDE4DQorCQ0KKwlWUURNVUxILlMzMgkJCVEzLCBRMiwgUTE1DQorCVZUUk4uMzIJCQkJZDE0LCBkMTgNCisJVlRSTi4zMgkJCQlkNiwgZDcNCisJVlJFVjY0LkkzMgkJCWQxOCwgZDE4CQ0KKwkNCisJVlNVQi5TMzIJCQlkMTUsIGQzLCBkNg0KKwlWUkVWNjQuSTMyCQkJZDcsIGQ3DQorCVZBREQuUzMyCQkJZDE5LCBkMywgZDYNCisJVkFERC5TMzIJCQlkMTMsIGQxLCBkNw0KKwlWU1VCLlMzMgkJCWQxNywgZDEsIGQ3DQorCQ0KKwlWUkVWNjQuSTMyCQkJZDE3LCBkMTcNCisJVlRSTi4zMgkJCQlkMTMsIGQxNw0KKwlWUkVWNjQuSTMyCQkJZDE3LCBkMTcNCisJDQorCXN1YnMgICAgICAgCQkJcjEsIHIxLCAjMQkNCisJDQorCVZTVDEuSTMyCQkJe2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0hDQorCVZTVDEuSTMyCQkJe2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyMF0hCQ0KKwlibmUgICAgICAgCQkJUmFkaXg4Rmlyc3RfTE9PUA0KKwkNCitSYWRpeDhGaXJzdF9FTkQ6DQorCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CQ0KK1NRUlQxXzI6DQorCS53b3JkICAgICAgMHgyZDQxM2NjZA0KKwkNCisJQEVORFAgIEAgfFJhZGl4OEZpcnN0fA0KKwkNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlSYWRpeDRGaXJzdA0KKw0KK1JhZGl4NEZpcnN0Og0KKwlzdG1kYiAgICAgCXNwISwge3I0IC0gcjExLCBscn0NCisNCisJY21wICAgICAgIAlyMSwgIzANCisJYmVxICAgICAgIAlSYWRpeDRGaXJzdF9FTkQNCisJDQorUmFkaXg0Rmlyc3RfTE9PUDoNCisJVkxEMS5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCQkJCQkNCisJDQorCVZBREQuUzMyCQkJZDQsIGQwLCBkMQkJCQkJCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQCByMSA9IGJ1ZlsxXSArIGJ1ZlszXUAJCQ0KKwlWU1VCLlMzMgkJCWQ1LCBkMCwgZDEJCQkJCQkJQCByMiA9IGJ1ZlswXSAtIGJ1ZlsyXUAgcjMgPSBidWZbMV0gLSBidWZbM11ADQorCVZTVUIuUzMyCQkJZDcsIGQyLCBkMwkJCQkJCQlAIHI0ID0gYnVmWzRdICsgYnVmWzZdQCByNSA9IGJ1Zls1XSArIGJ1Zls3XUANCisJVkFERC5TMzIJCQlkNiwgZDIsIGQzCQkJCQkJCUAgcjYgPSBidWZbNF0gLSBidWZbNl1AIHI3ID0gYnVmWzVdIC0gYnVmWzddQA0KKwkNCisJVlJFVjY0LkkzMgkJZDcsIGQ3CQkJCQkJCQkJQCANCisJDQorCVZBREQuUzMyCQkJUTQsIFEyLCBRMw0KKwlWU1VCLlMzMgkJCVE1LCBRMiwgUTMNCisJDQorCVZSRVY2NC5JMzIJCWQxMSwgZDExDQorCVZUUk4uMzIJCQkJZDksIGQxMQ0KKwlzdWJzICAgICAgIAkJcjEsIHIxLCAjMQkNCisJVlJFVjY0LkkzMgkJZDExLCBkMTENCisJVlNUMS5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0hDQorDQorCWJuZSAgICAgICAJCVJhZGl4NEZpcnN0X0xPT1ANCisJDQorUmFkaXg0Rmlyc3RfRU5EOg0KKwlsZG1pYSAgICAJCXNwISwge3I0IC0gcjExLCBwY30NCisNCisJQEVORFAgIEAgfFJhZGl4NEZpcnN0fA0KKwkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTg0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMKQEAgLTAsMCArMSwxNDMgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCVJhZGl4NEZGVF92Ny5zDQorQA0KK0AJQ29udGVudDoJUmFkaXg0RkZUIGFybXY3IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg0RkZUDQorDQorUmFkaXg0RkZUOg0KKwlzdG1kYiAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorDQorCW1vdgkJCXIxLCByMSwgYXNyICMyDQorCWNtcCAgICAgCXIxLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJYmVxICAgICAJUmFkaXg0RkZUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICANCitSYWRpeDRGRlRfTE9PUDE6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltb3YgICAgIAlyNSwgcjIsIGxzbCAjMSAgDQorCW1vdiAgICAgCXI4LCByMCAgICAgICAgICANCisJbW92ICAgICAJcjcsIHIxICANCisJbW92ICAgICAJcjUsIHI1LCBsc2wgIzIgICANCisJY21wICAgICAJcjEsICMwICAgICAgICAgIA0KKwlyc2JlcSAgIAlyMTIsIHI1LCByNSwgbHNsICMyIA0KKwliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDFfRU5EICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXJzYiAgICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIgICANCisJIA0KK1JhZGl4NEZGVF9MT09QMjogICAgICAgICAgICAgICAgICAgICAgICANCisJbW92ICAgICAJcjYsIHIzIA0KKwltb3YgICAgIAlyNCwgcjIgIA0KKwljbXAgICAgIAlyMiwgIzAgICAgICAgIA0KKwliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDJfRU5EICAgICAgICAgDQorICANCitSYWRpeDRGRlRfTE9PUDM6ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJQHIwID0geHB0clswXUANCisJQHIxID0geHB0clsxXUANCisJVkxEMi5JMzIJCQl7RDAsIEQxLCBEMiwgRDN9LCBbcjhdCQkJCQ0KKwlWTEQyLkkzMgkJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQkJQCBjb3N4ID0gY3NwdHJbMF1AIHNpbnggPSBjc3B0clsxXUANCisJDQorCWFkZAkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAJDQorCVZMRDIuSTMyCQkJe0Q0LCBENSwgRDYsRDd9LCBbcjhdCQkJCQlAIHIyID0geHB0clswXUAgcjMgPSB4cHRyWzFdQA0KKwkNCisJVlFETVVMSC5TMzIJCVExMCwgUTIsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkNCisJVlFETVVMSC5TMzIJCVExMSwgUTMsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMiwgUTMsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMywgUTIsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkNCisJCQ0KKwlWQURELlMzMgkJCVEyLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQ0KKwlWU1VCLlMzMgkJCVEzLCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQ0KKwkNCisJYWRkCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciArPSBzdGVwQA0KKwlWU0hSLlMzMgkJCVExMCwgUTAsICMyCQkJCQkJCQkJCUAgdDAgPSByMCA+PiAyQA0KKwlWU0hSLlMzMgkJCVExMSwgUTEsICMyCQkJCQkJCQkJCUAgdDEgPSByMSA+PiAyQA0KKwkNCisJVlNVQi5TMzIJCQlRMCwJUTEwLCBRMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkANCisJVlNVQi5TMzIJCQlRMSwJUTExLCBRMwkJCQkJCQkJCQlAIHIxID0gdDEgLSByM0ANCisJVkFERC5TMzIJCQlRMiwgUTEwLCBRMgkJCQkJCQkJCQlAIHIyID0gdDAgKyByMkANCisJVkFERC5TMzIJCQlRMywgUTExLCBRMwkJCQkJCQkJCQlAIHIzID0gdDEgKyByM0ANCisJCQ0KKwlWTEQyLkkzMgkJCXtEOCwgRDksIEQxMCwgRDExfSwgW3I4XQkNCisJVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEJDQorCWFkZAkJCQkJCXI4LCByOCwgcjUNCisNCisJVlFETVVMSC5TMzIJCVExMCwgUTQsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkNCisJVlFETVVMSC5TMzIJCVExMSwgUTUsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMiwgUTUsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMywgUTQsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkNCisJCQ0KKwlWQURELlMzMgkJCVE4LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQ0KKwlWU1VCLlMzMgkJCVE5LCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQkNCisJDQorCVZMRDIuSTMyCQl7RDEyLCBEMTMsIEQxNCwgRDE1fSwgW3I4XQkNCisJVkxEMi5JMzIJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQ0KKwkNCisJVlFETVVMSC5TMzIJCVExMCwgUTYsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkNCisJVlFETVVMSC5TMzIJCVExMSwgUTcsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMiwgUTcsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkNCisJVlFETVVMSC5TMzIJCVExMywgUTYsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkNCisJCQ0KKwlWQURELlMzMgkJCVE2LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQ0KKwlWU1VCLlMzMgkJCVE3LCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQkJDQorCQ0KKwlWQURELlMzMgkJCVE0LCBROCwgUTYJCQkJCQkJCQkJQCByNCA9IHQwICsgcjZADQorCVZTVUIuUzMyCQkJUTUsIFE3LCBROQkJCQkJCQkJCQlAIHI1ID0gcjcgLSB0MUANCisJVlNVQi5TMzIJCQlRNiwgUTgsIFE2CQkJCQkJCQkJCUAgcjYgPSB0MCAtIHI2QA0KKwlWQURELlMzMgkJCVE3LCBRNywgUTkJCQkJCQkJCQkJQCByNyA9IHI3ICsgdDFADQorCQ0KKwlWQURELlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUANCisJVkFERC5TMzIJCQlROSwgUTEsIFE2CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIxICsgcjZADQorCVZTVDIuSTMyCQkJe0QxNiwgRDE3LCBEMTgsIEQxOX0sIFtyOF0NCisJDQorCVZTVUIuUzMyCQkJUTEwLCBRMiwgUTQJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjIgLSByNEANCisJc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQA0KKwlWU1VCLlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdADQorCVZTVDIuSTMyCQkJe0QyMCwgRDIxLCBEMjIsIEQyM30sIFtyOF0NCisJCQ0KKwlWU1VCLlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgLSByNUANCisJc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQA0KKwlWU1VCLlMzMgkJCVE5LCBRMSwgUTYJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjEgLSByNkANCisJVlNUMi5JMzIJCQl7RDE2LCBEMTcsIEQxOCwgRDE5fSwgW3I4XQ0KKwkJDQorCVZBREQuUzMyCQkJUTEwLCBRMiwgUTQJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjIgKyByNEANCisJc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQA0KKwlWQURELlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzICsgcjdADQorCVZTVDIuSTMyCQkJe0QyMCwgRDIxLCBEMjIsIEQyM30sIFtyOF0hDQorCQkNCisJc3VicyAgICAJCQlyNCwgcjQsICM0IA0KKwlibmUgICAgIAkJCVJhZGl4NEZGVF9MT09QMyANCisJICAgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9MT09QMl9FTkQ6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlhZGQgICAgIAkJCXI4LCByOCwgcjEyICAgIA0KKwlzdWIgICAgCQkJCXI3LCByNywgIzEgICAgIA0KKwljbXAJCQkJCXI3LCAjMA0KKwliaGkgICAgIAkJCVJhZGl4NEZGVF9MT09QMiAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgDQorUmFkaXg0RkZUX0xPT1AxX0VORDogICAgICAgICAgICAgICAgICAgICAgICANCisJYWRkICAgICAJCQlyMywgcjEyLCByMyAgICANCisJbW92ICAgICAJCQlyMiwgcjIsIGxzbCAjMiANCisJbW92cyAgICAJCQlyMSwgcjEsIGFzciAjMiANCisJYm5lICAgICAJCQlSYWRpeDRGRlRfTE9PUDEgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgDQorUmFkaXg0RkZUX0VORDogICAgICAgIA0KKwlsZG1pYSAgIAkJCXNwISwge3I0IC0gcjExLCBwY30NCisJCQ0KKwlARU5EUCAgQCB8UmFkaXg0RkZUfA0KKwkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmFuZF9ucmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YzRjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJhbmRfbnJnLmMNCisNCisJQ29udGVudDoJQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbnMgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImJhbmRfbnJnLmgiCisKKyNpZm5kZWYgQVJNVjVFDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENhbGNCYW5kRW5lcmd5CisqIGRlc2NyaXB0aW9uOiAgIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordm9pZCBDYWxjQmFuZEVuZXJneShjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVN1bSkKK3sKKyAgV29yZDMyIGksIGo7CisgIFdvcmQzMiBhY2N1U3VtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKKyAgICBXb3JkMzIgYWNjdSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspCisgICAgICBhY2N1ID0gTF9hZGQoYWNjdSwgTVVMSElHSChtZGN0U3BlY3RydW1bal0sIG1kY3RTcGVjdHJ1bVtqXSkpOw0KKw0KKwlhY2N1ID0gTF9hZGQoYWNjdSwgYWNjdSk7CisgICAgYWNjdVN1bSA9IExfYWRkKGFjY3VTdW0sIGFjY3UpOworICAgIGJhbmRFbmVyZ3lbaV0gPSBhY2N1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICAqYmFuZEVuZXJneVN1bSA9IGFjY3VTdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENhbGNCYW5kRW5lcmd5TVMKKyogZGVzY3JpcHRpb246ICAgQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQ2FsY0JhbmRFbmVyZ3lNUyhjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWQsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkU3VtLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZVN1bSkKK3sKKworICBXb3JkMzIgaSwgajsKKyAgV29yZDMyIGFjY3VNaWRTdW0gPSAwOyAgICAgICAgCisgIFdvcmQzMiBhY2N1U2lkZVN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgCisKKyAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7CisgICAgV29yZDMyIGFjY3VNaWQgPSAwOworICAgIFdvcmQzMiBhY2N1U2lkZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKSB7CisgICAgICBXb3JkMzIgc3BlY20sIHNwZWNzOyAKKyAgICAgIFdvcmQzMiBsLCByOworCisgICAgICBsID0gbWRjdFNwZWN0cnVtTGVmdFtqXSA+PiAxOworICAgICAgciA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDE7CisgICAgICBzcGVjbSA9IGwgKyByOworICAgICAgc3BlY3MgPSBsIC0gcjsKKyAgICAgIGFjY3VNaWQgPSBMX2FkZChhY2N1TWlkLCBNVUxISUdIKHNwZWNtLCBzcGVjbSkpOworICAgICAgYWNjdVNpZGUgPSBMX2FkZChhY2N1U2lkZSwgTVVMSElHSChzcGVjcywgc3BlY3MpKTsKKyAgICB9CisgICAgDQorCWFjY3VNaWQgPSBMX2FkZChhY2N1TWlkLCBhY2N1TWlkKTsNCisJYWNjdVNpZGUgPSBMX2FkZChhY2N1U2lkZSwgYWNjdVNpZGUpOw0KKwliYW5kRW5lcmd5TWlkW2ldID0gYWNjdU1pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYWNjdU1pZFN1bSA9IExfYWRkKGFjY3VNaWRTdW0sIGFjY3VNaWQpOworICAgIGJhbmRFbmVyZ3lTaWRlW2ldID0gYWNjdVNpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBhY2N1U2lkZVN1bSA9IExfYWRkKGFjY3VTaWRlU3VtLCBhY2N1U2lkZSk7CisgICAgCisgIH0KKyAgKmJhbmRFbmVyZ3lNaWRTdW0gPSBhY2N1TWlkU3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICpiYW5kRW5lcmd5U2lkZVN1bSA9IGFjY3VTaWRlU3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MzdlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYwpAQCAtMCwwICsxLDg4NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYml0X2NudC5jDQorDQorCUNvbnRlbnQ6CUh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorCisjZGVmaW5lIEhJX0xUQUIoYSkgKGE+PjgpCisjZGVmaW5lIExPX0xUQUIoYSkgKGEgJiAweGZmKQorCisjZGVmaW5lIEVYUEFORChhKSAgKCgoKFdvcmQzMikoYSYweGZmMDApKSA8PCA4KXwoV29yZDMyKShhJjB4ZmYpKSAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMQorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMS0xMSAKKyogcmV0dXJuczogICAgICAKKyogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDEtMTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQoreworICBXb3JkMzIgdDAsdDEsdDIsdDMsaTsKKyAgV29yZDMyIGJjMV8yLGJjM180LGJjNV82LGJjN184LGJjOV8xMDsKKyAgV29yZDE2IGJjMTEsc2M7DQorICAKKyAgYmMxXzI9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjM180PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzVfNj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM3Xzg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjOV8xMD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2M9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKGk9MDtpPHdpZHRoO2krPTQpeworICAgIAorICAgIHQwPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0MT0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDI9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQzPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAKKyAgCisgICAgLyogMSwyICovCisKKyAgICBiYzFfMiA9IGJjMV8yICsgRVhQQU5EKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7ICAgICAgICAgICAgICAKKworICAgIC8qIDUsNiAqLworICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgdDA9QUJTKHQwKTsKKyAgICB0MT1BQlModDEpOworICAgIHQyPUFCUyh0Mik7CisgICAgdDM9QUJTKHQzKTsKKworICAgIAorICAgIGJjM180ID0gYmMzXzQgKyBFWFBBTkQoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKKyAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QyXVt0M107CisgICAKKyAgICAgICAgICAgCisgICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKSArICh0Mj4wKSArICh0Mz4wKTsKKyAgfQorICAKKyAgYml0Q291bnRbMV09ZXh0cmFjdF9oKGJjMV8yKTsKKyAgYml0Q291bnRbMl09ZXh0cmFjdF9sKGJjMV8yKTsKKyAgYml0Q291bnRbM109ZXh0cmFjdF9oKGJjM180KSArIHNjOworICBiaXRDb3VudFs0XT1leHRyYWN0X2woYmMzXzQpICsgc2M7CisgIGJpdENvdW50WzVdPWV4dHJhY3RfaChiYzVfNik7CisgIGJpdENvdW50WzZdPWV4dHJhY3RfbChiYzVfNik7CisgIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnQzXzRfNV82XzdfOF85XzEwXzExCisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAzLTExIAorKiByZXR1cm5zOiAgICAgIAorKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgMy0xMQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvdW50M180XzVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCit7CisgIFdvcmQzMiB0MCx0MSx0Mix0MywgaTsKKyAgV29yZDMyIGJjM180LGJjNV82LGJjN184LGJjOV8xMDsKKyAgV29yZDE2IGJjMTEsc2M7CisgICAgCisgIGJjM180PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzVfNj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM3Xzg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjOV8xMD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2M9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKGk9MDtpPHdpZHRoO2krPTQpeworCisgICAgdDA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQxPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0Mj0gdmFsdWVzW2krMl07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDM9IHZhbHVlc1tpKzNdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIC8qCisgICAgICA1LDYKKyAgICAqLworICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgdDA9QUJTKHQwKTsKKyAgICB0MT1BQlModDEpOworICAgIHQyPUFCUyh0Mik7CisgICAgdDM9QUJTKHQzKTsKKworCisgICAgYmMzXzQgPSBiYzNfNCArIEVYUEFORChodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDJdW3QzXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOworICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDJdW3QzXTsKKworICAgICAgICAgICAKKyAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOyAgIAorICB9DQorICAKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzNdPWV4dHJhY3RfaChiYzNfNCkgKyBzYzsKKyAgYml0Q291bnRbNF09ZXh0cmFjdF9sKGJjM180KSArIHNjOworICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOworICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOworICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdPWV4dHJhY3RfbChiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXT1iYzExICsgc2M7CisgIAorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50NV82XzdfOF85XzEwXzExCisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA1LTExIAorKiByZXR1cm5zOiAgICAgIAorKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNS0xMQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjb3VudDVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQoreworCisgIFdvcmQzMiB0MCx0MSxpOworICBXb3JkMzIgYmM1XzYsYmM3XzgsYmM5XzEwOworICBXb3JkMTYgYmMxMSxzYzsNCisKKyAgYmM1XzY9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjN184PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKKworICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAKKyAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgCisKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgCisKKyAgICB0MD1BQlModDApOworICAgIHQxPUFCUyh0MSk7CisgICAgIAorICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgCisgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOworICAgIAorICAgICAgIAorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CisgIH0KKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOworICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOworICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdPWV4dHJhY3RfbChiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXT1iYzExICsgc2M7CisgIAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudDdfOF85XzEwXzExCisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA3LTExIAorKiByZXR1cm5zOiAgICAgIAorKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNy0xMQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvdW50N184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCit7CisgIFdvcmQzMiB0MCx0MSwgaTsKKyAgV29yZDMyIGJjN184LGJjOV8xMDsKKyAgV29yZDE2IGJjMTEsc2M7CisgICAgCisgIGJjN184PTA7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM5XzEwPTA7ICAgICAgICAgICAgICAgICAgICAgIAorICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisKKyAgICB0MD1BQlModmFsdWVzW2krMF0pOworICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7CisKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgIAorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKKyAgIAorICAgICAgIAorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CisgIH0KKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOworICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMV09YmMxMSArIHNjOworICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50OV8xMF8xMQorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgOS0xMSAKKyogcmV0dXJuczogICAgICAKKyogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDktMTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY291bnQ5XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQ0KK3sNCisNCisgIFdvcmQzMiB0MCx0MSxpOyAgDQorICBXb3JkMzIgYmM5XzEwOw0KKyAgV29yZDE2IGJjMTEsc2M7DQorDQorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgc2M9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7DQorDQorICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7DQorICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7DQorICAgIA0KKw0KKyAgICBiYzlfMTAgKz0gRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICANCisgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOw0KKw0KKyAgICAgICANCisgICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsNCisgIH0NCisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOw0KKyAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7DQorICBiaXRDb3VudFsxMV09YmMxMSArIHNjOw0KKyAgDQorfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50MTEKKyogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGUgMTEgCisqIHJldHVybnM6ICAgICAgCisqIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisqIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlIDExCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyBzdGF0aWMgdm9pZCBjb3VudDExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmJpdENvdW50KQ0KK3sNCisgIFdvcmQzMiB0MCx0MSxpOw0KKyAgV29yZDE2IGJjMTEsc2M7ICANCisNCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICANCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsNCisgICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsNCisgICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsNCisgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOw0KKw0KKyAgICAgICANCisgICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsNCisgIH0NCisNCisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbOV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFsxMV09YmMxMSArIHNjOw0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50RXNjCisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExICh3aXRoIEVzYykgCisqIHJldHVybnM6ICAgICAgCisqIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisqIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAxMSAod2l0aCBFc2MpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY291bnRFc2MoY29uc3QgV29yZDE2ICp2YWx1ZXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQ0KK3sNCisgIFdvcmQzMiB0MCx0MSx0MDAsdDAxLGk7DQorICBXb3JkMTYgYmMxMSxlYyxzYzsgIA0KKw0KKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGVjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgZm9yKGk9MDtpPHdpZHRoO2krPTIpew0KKyAgICB0MD1BQlModmFsdWVzW2krMF0pOw0KKyAgICB0MT1BQlModmFsdWVzW2krMV0pOw0KKyAgICANCisgICAgICAgDQorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7DQorDQorICAgIHQwMCA9IG1pbih0MCwxNik7DQorICAgIHQwMSA9IG1pbih0MSwxNik7DQorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDAwXVt0MDFdOw0KKyAgICANCisgICAgIA0KKyAgICBpZih0MCA+PSAxNil7DQorICAgICAgZWMgPSBlYyArIDU7DQorICAgICAgd2hpbGUoc3ViKHQwPSh0MCA+PiAxKSwgMTYpID49IDApIHsNCisgICAgICAgIGVjID0gZWMgKyAyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgIA0KKyAgICBpZih0MSA+PSAxNil7DQorICAgICAgZWMgPSBlYyArIDU7DQorICAgICAgd2hpbGUoc3ViKHQxPSh0MSA+PiAxKSwgMTYpID49IDApIHsNCisgICAgICAgIGVjID0gZWMgKyAyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbMTBdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgDQorICBiaXRDb3VudFsxMV09YmMxMSArIHNjICsgZWM7DQorfQorCisKK3R5cGVkZWYgdm9pZCAoKkNPVU5UX0ZVTkNUSU9OKShjb25zdCBXb3JkMTYgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpOworCitzdGF0aWMgQ09VTlRfRlVOQ1RJT04gY291bnRGdW5jVGFibGVbQ09ERV9CT09LX0VTQ19MQVYrMV0gPQorICB7CisKKyAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMCAgKi8KKyAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMSAgKi8KKyAgICBjb3VudDNfNF81XzZfN184XzlfMTBfMTEsICAgICAgLyogMiAgKi8KKyAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogMyAgKi8KKyAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogNCAgKi8KKyAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNSAgKi8KKyAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNiAgKi8KKyAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNyAgKi8KKyAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOCAgKi8KKyAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOSAgKi8KKyAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTAgKi8KKyAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTIgKi8KKyAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgKi8KKyAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgKi8KKyAgICBjb3VudEVzYyAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KKyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGJpdENvdW50CisqIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cyAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IGJpdENvdW50KGNvbnN0IFdvcmQxNiAqdmFsdWVzLAorICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCisgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBtYXhWYWwsCisgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKK3sKKyAgLyoKKyAgICBjaGVjayBpZiB3ZSBjYW4gdXNlIGNvZGVib29rIDAKKyAgKi8KKyAgICAgCisgIGlmKG1heFZhbCA9PSAwKQorICAgIGJpdENvdW50WzBdID0gMDsKKyAgZWxzZQorICAgIGJpdENvdW50WzBdID0gSU5WQUxJRF9CSVRDT1VOVDsKKworICBtYXhWYWwgPSBtaW4obWF4VmFsLCBDT0RFX0JPT0tfRVNDX0xBVik7CisgIGNvdW50RnVuY1RhYmxlW21heFZhbF0odmFsdWVzLHdpZHRoLGJpdENvdW50KTsKKworICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb2RlVmFsdWVzCisqIGRlc2NyaXB0aW9uOiAgd3JpdGUgaHVmZnVtIGJpdHMgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBjb2RlVmFsdWVzKFdvcmQxNiAqdmFsdWVzLCBXb3JkMTYgd2lkdGgsIFdvcmQxNiBjb2RlQm9vaywgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSkNCit7DQorDQorICBXb3JkMzIgaSwgdDAsIHQxLCB0MiwgdDMsIHQwMCwgdDAxOw0KKyAgV29yZDE2IGNvZGVXb3JkLCBjb2RlTGVuZ3RoOw0KKyAgV29yZDE2IHNpZ24sIHNpZ25MZW5ndGg7DQorDQorICAgDQorICBzd2l0Y2ggKGNvZGVCb29rKSB7DQorICAgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzFfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgew0KKyAgICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdOyAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOyAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsgICAgICAgIA0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisNCisgICAgY2FzZSBDT0RFX0JPT0tfMl9OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7DQorICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07ICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7ICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzNfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgew0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDAgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDEgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDE9LXQxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB0MiA9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDIgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDIgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDI9LXQyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDMgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDMgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDM9LXQzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiM1t0MF1bdDFdW3QyXVt0M107ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzRfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgew0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDAgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MD0tdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9DQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MiA9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDIgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQyIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQyPS10MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDMgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQzIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQzPS10MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiNFt0MF1bdDFdW3QyXVt0M107ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgY2FzZSBDT0RFX0JPT0tfNV9OTzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI1W3QwKzRdW3QxKzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS182X05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsNCisgICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjZbdDArNF1bdDErNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzdfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mil7DQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgDQorICAgICAgICBpZih0MCAhPSAwKXsNCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MCA8IDApew0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MD0tdDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgDQorICAgICAgICBpZih0MSAhPSAwKXsNCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MSA8IDApew0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MT0tdDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI3W3QwXVt0MV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWI3XzhbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7DQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisNCisgICAgY2FzZSBDT0RFX0JPT0tfOF9OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7DQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MCAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjhbdDBdW3QxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS185X05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsNCisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQwICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MD0tdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MSAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDE9LXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiOVt0MF1bdDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzEwX05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsNCisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQwICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MD0tdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MSAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDE9LXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMTBbdDBdW3QxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7DQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDAgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQwPS10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQxICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MT0tdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwMCA9IG1pbih0MCwxNik7DQorICAgICAgICB0MDEgPSBtaW4odDEsMTYpOw0KKw0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjExW3QwMF1bdDAxXTsgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFiMTFbdDAwXVt0MDFdOyAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsNCisgICAgICAgICANCisgICAgICAgIGlmKHQwID49IDE2KXsNCisgICAgICAgICAgV29yZDE2IG4sIHA7DQorICAgICAgICAgIG49MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgcD10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB3aGlsZShzdWIocD0ocCA+PiAxKSwgMTYpID49IDApew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOw0KKyAgICAgICAgICAgIG4gPSBuICsgMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOw0KKyAgICAgICAgICBuID0gbiArIDQ7DQorICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCh0MCAtICgxIDw8IG4pKSxuKTsNCisgICAgICAgIH0NCisgICAgICAgICANCisgICAgICAgIGlmKHQxID49IDE2KXsNCisgICAgICAgICAgV29yZDE2IG4sIHA7DQorICAgICAgICAgIG49MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgcD10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB3aGlsZShzdWIocD0ocCA+PiAxKSwgMTYpID49IDApew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOw0KKyAgICAgICAgICAgIG4gPSBuICsgMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOw0KKyAgICAgICAgICBuID0gbiArIDQ7DQorICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCh0MSAtICgxIDw8IG4pKSxuKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4oMCk7DQorfQorCitXb3JkMTYgYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBkZWx0YSkKK3sKKyAgcmV0dXJuKGh1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl0pOworfQorCitXb3JkMTYgY29kZVNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQoreworICBXb3JkMzIgY29kZVdvcmQ7IAorICBXb3JkMTYgY29kZUxlbmd0aDsKKyAgCisgICAKKyAgaWYoZGVsdGEgPiBDT0RFX0JPT0tfU0NGX0xBViB8fCBkZWx0YSA8IC1DT0RFX0JPT0tfU0NGX0xBVikKKyAgICByZXR1cm4oMSk7CisgIAorICBjb2RlV29yZCAgID0gaHVmZl9jdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOyAgICAgICAgICAgIAorICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOyAgICAgICAgICAgIAorICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKKyAgcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ4ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJpdGJ1ZmZlci5jDQorDQorCUNvbnRlbnQ6CUJpdCBCdWZmZXIgTWFuYWdlbWVudCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYml0YnVmZmVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB1cGRhdGVCaXRCdWZXb3JkUHRyCisqIGRlc2NyaXB0aW9uOiAgdXBkYXRlIEJpdCBCdWZmZXIgcG9pbnRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB1cGRhdGVCaXRCdWZXb3JkUHRyKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkOCAqKnBCaXRCdWZXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBjbnQpCit7CisgICpwQml0QnVmV29yZCArPSBjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYoKnBCaXRCdWZXb3JkID4gaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCkgeworICAgICpwQml0QnVmV29yZCAtPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7ICAgICAgICAgICAgICAgICAgIAorICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmKCpwQml0QnVmV29yZCA8IGhCaXRCdWYtPnBCaXRCdWZCYXNlKSB7CisgICAgKnBCaXRCdWZXb3JkICs9IChoQml0QnVmLT5wQml0QnVmRW5kIC0gaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UgKyAxKTsgICAgICAgICAgICAgICAgICAgCisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQ3JlYXRlQml0QnVmZmVyCisqIGRlc2NyaXB0aW9uOiAgY3JlYXRlIGFuZCBpbml0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQU5ETEVfQklUX0JVRiBDcmVhdGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDggKnBCaXRCdWZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSkKK3sKKyAgYXNzZXJ0KGJpdEJ1ZlNpemUqOCA8PSAzMjc2OCk7CisKKyAgaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UgPSBwQml0QnVmQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGhCaXRCdWYtPnBCaXRCdWZFbmQgID0gcEJpdEJ1ZkJhc2UgKyBiaXRCdWZTaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgaEJpdEJ1Zi0+cFdyaXRlTmV4dCAgPSBwQml0QnVmQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgaEJpdEJ1Zi0+Y2FjaGUgICAgICAgPSAwOworICAKKyAgaEJpdEJ1Zi0+d0JpdFBvcyAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGhCaXRCdWYtPmNudEJpdHMgICAgID0gMDsgICAKKyAgCisgIGhCaXRCdWYtPnNpemUgICAgICAgID0gKGJpdEJ1ZlNpemUgPDwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGhCaXRCdWYtPmlzVmFsaWQgICAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHJldHVybiBoQml0QnVmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogRGVsZXRlQml0QnVmZmVyCisqIGRlc2NyaXB0aW9uOiAgdW5pbml0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIERlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiAqaEJpdEJ1ZikKK3sKKyAgaWYoKmhCaXRCdWYpDQorCSgqaEJpdEJ1ZiktPmlzVmFsaWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqaEJpdEJ1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFJlc2V0Qml0QnVmCisqIGRlc2NyaXB0aW9uOiAgcmVzZXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKKyAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKQoreworICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAgPSBwQml0QnVmQmFzZSArIGJpdEJ1ZlNpemUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBoQml0QnVmLT53Qml0UG9zICAgICA9IDA7ICAgIAorICBoQml0QnVmLT5jbnRCaXRzICAgICA9IDA7ICAgIAorICAKKyAgaEJpdEJ1Zi0+Y2FjaGUJICAgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQ29weUJpdEJ1ZgorKiBkZXNjcmlwdGlvbjogIGNvcHkgQml0IEJ1ZmZlciBNYW5hZ2VtZW50CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQ29weUJpdEJ1ZihIQU5ETEVfQklUX0JVRiBoQml0QnVmU3JjLAorICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRCdWZEc3QpCit7CisgICpoQml0QnVmRHN0ID0gKmhCaXRCdWZTcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogR2V0Qml0c0F2YWlsCisqIGRlc2NyaXB0aW9uOiAgZ2V0IGF2YWlsYWJsZSBiaXRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBHZXRCaXRzQXZhaWwoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZikKK3sKKyAgcmV0dXJuIGhCaXRCdWYtPmNudEJpdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUJpdHMKKyogZGVzY3JpcHRpb246ICB3cml0ZSBiaXRzIHRvIHRoZSBidWZmZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFdyaXRlQml0cyhIQU5ETEVfQklUX0JVRiBoQml0QnVmLAorICAgICAgICAgICAgICAgICBXb3JkMzIgd3JpdGVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgV29yZDE2IG5vQml0c1RvV3JpdGUpCit7CisgIFdvcmQxNiB3Qml0UG9zOworCisgIGFzc2VydChub0JpdHNUb1dyaXRlIDw9IChXb3JkMTYpc2l6ZW9mKFdvcmQzMikqOCk7CisKKyAgaWYobm9CaXRzVG9Xcml0ZSA9PSAwKQorCSAgcmV0dXJuIG5vQml0c1RvV3JpdGU7CisKKyAgaEJpdEJ1Zi0+Y250Qml0cyArPSBub0JpdHNUb1dyaXRlOyAgIAorCisgIHdCaXRQb3MgPSBoQml0QnVmLT53Qml0UG9zOworICB3Qml0UG9zICs9IG5vQml0c1RvV3JpdGU7CisgIHdyaXRlVmFsdWUgPDw9IDMyIC0gd0JpdFBvczsJCisgIHdyaXRlVmFsdWUgfD0gaEJpdEJ1Zi0+Y2FjaGU7CisgIAorICB3aGlsZSAod0JpdFBvcyA+PSA4KSAKKyAgeworCSAgVVdvcmQ4IHRtcDsKKwkgIHRtcCA9IChVV29yZDgpKCh3cml0ZVZhbHVlID4+IDI0KSAmIDB4RkYpOworCSAgCisJICAqaEJpdEJ1Zi0+cFdyaXRlTmV4dCsrID0gdG1wOwkJCisJICB3cml0ZVZhbHVlIDw8PSA4OworCSAgd0JpdFBvcyAtPSA4OworICB9CisgIAorICBoQml0QnVmLT53Qml0UG9zID0gd0JpdFBvczsKKyAgaEJpdEJ1Zi0+Y2FjaGUgPSB3cml0ZVZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICByZXR1cm4gbm9CaXRzVG9Xcml0ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YzJkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCkBAIC0wLDAgKzEsNjkwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliaXRlbmMuYw0KKw0KKwlDb250ZW50OglCaXRzdHJlYW0gZW5jb2RlciBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYml0ZW5jLmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgImR5bl9iaXRzLmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisKK3N0YXRpYyBjb25zdCAgV29yZDE2IGdsb2JhbEdhaW5PZmZzZXQgPSAxMDA7CitzdGF0aWMgY29uc3QgIFdvcmQxNiBpY3NSZXNlcnZlZEJpdCAgID0gMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZW5jb2RlU3BlY3RyYWxEYXRhCisqIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHNwZWN0cmFsIGRhdGEKKyogcmV0dXJuczogICAgICBzcGVjdHJhbCBiaXRzIHVzZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQzMiBlbmNvZGVTcGVjdHJhbERhdGEoV29yZDE2ICAgICAgICAgICAgICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICAgICAgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgICAgICBoQml0U3RyZWFtKQoreworICBXb3JkMTYgaSxzZmI7CisgIFdvcmQxNiBkYmdWYWw7CisgIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOworICBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvcihpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7CisgICAgcHNlY3Rpb25pbmZvID0gJihzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0pOw0KKwkvKgorICAgICAgIGh1ZmZlbmNvZGUgc3BlY3RyYWwgZGF0YSBmb3IgdGhpcyBzZWN0aW9uCisgICAgKi8KKyAgICBmb3Ioc2ZiPXBzZWN0aW9uaW5mby0+c2ZiU3RhcnQ7CisgICAgICAgIHNmYjxwc2VjdGlvbmluZm8tPnNmYlN0YXJ0K3BzZWN0aW9uaW5mby0+c2ZiQ250OworICAgICAgICBzZmIrKykgeworICAgICAgY29kZVZhbHVlcyhxdWFudFNwZWN0cnVtK3NmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0sCisgICAgICAgICAgICAgICAgIHBzZWN0aW9uaW5mby0+Y29kZUJvb2ssCisgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworICAgIH0KKyAgfQorCisgIHJldHVybihHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSktZGJnVmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlR2xvYmFsR2FpbgorKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBHbG9iYWwgR2FpbiAoY29tbW9uIHNjYWxlIGZhY3RvcikKKyogcmV0dXJuczogICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZW5jb2RlR2xvYmFsR2FpbihXb3JkMTYgZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ05vcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzY2FsZWZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKK3sKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICgoZ2xvYmFsR2FpbiAtIHNjYWxlZmFjKSArIGdsb2JhbEdhaW5PZmZzZXQtKGxvZ05vcm0gPDwgMikpLCA4KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTplbmNvZGVJY3NJbmZvCisqIGRlc2NyaXB0aW9uOiBlbmNvZGVzIEljcyBJbmZvCisqIHJldHVybnM6ICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZW5jb2RlSWNzSW5mbyhXb3JkMTYgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBncm91cGluZ01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQoreworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpY3NSZXNlcnZlZEJpdCwxKTsKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sYmxvY2tUeXBlLDIpOworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx3aW5kb3dTaGFwZSwxKTsKKworICAgCisgIHN3aXRjaChibG9ja1R5cGUpeworICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCw2KTsKKworICAgICAgLyogTm8gcHJlZGljdG9yIGRhdGEgcHJlc2VudCAqLworICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCw0KTsKKworICAgICAgLyoKKyAgICAgIFdyaXRlIGdyb3VwaW5nIGJpdHMKKyAgICAgICovCisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxncm91cGluZ01hc2ssVFJBTlNfRkFDLTEpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGVuY29kZVNlY3Rpb25EYXRhCisqIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHNlY3Rpb24gZGF0YSAoY29tbW9uIEh1ZmZtYW4gY29kZWJvb2tzIGZvciBhZGphY2VudAorKiAgICAgICAgICAgICAgIFNGQidzKQorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQzMiBlbmNvZGVTZWN0aW9uRGF0YShTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKQoreworICBXb3JkMTYgc2VjdEVzY2FwZVZhbD0wLHNlY3RMZW5CaXRzPTA7CisgIFdvcmQxNiBzZWN0TGVuOworICBXb3JkMTYgaTsKKyAgV29yZDE2IGRiZ1ZhbD1HZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7CisgICAgICAgCisKKyAgIAorICBzd2l0Y2goc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSkKKyAgeworICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsgICAgICAgICAgICAgICAgIAorICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19MT05HOyAgICAgICAgICAgICAgICAgICAgCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9TSE9SVDsgICAgICAgICAgICAgICAgCisgICAgICBzZWN0TGVuQml0cyAgID0gU0VDVF9CSVRTX1NIT1JUOyAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJyZWFrOworICB9CisKKyAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKSB7CisgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldLmNvZGVCb29rLDQpOworICAgIHNlY3RMZW4gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0uc2ZiQ250OyAgICAgICAgCisKKyAgICB3aGlsZShzZWN0TGVuID49IHNlY3RFc2NhcGVWYWwpIHsKKyAgICAgICAKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RFc2NhcGVWYWwsc2VjdExlbkJpdHMpOworICAgICAgc2VjdExlbiA9IHNlY3RMZW4gLSBzZWN0RXNjYXBlVmFsOworICAgIH0KKyAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0TGVuLHNlY3RMZW5CaXRzKTsKKyAgfQorICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTY2FsZUZhY3RvckRhdGEKKyogZGVzY3JpcHRpb246ICBlbmNvZGUgRFBDTSBjb2RlZCBzY2FsZSBmYWN0b3JzCisqIHJldHVybnM6ICAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDMyIGVuY29kZVNjYWxlRmFjdG9yRGF0YShVV29yZDE2ICAgICAgICAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICpzY2FsZWZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQoreworICBXb3JkMTYgaSxqLGxhc3RWYWxTY2YsZGVsdGFTY2Y7CisgIFdvcmQxNiBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7CisgIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOyAKKworICBsYXN0VmFsU2NmPXNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07ICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspeworICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsgCisgICAgaWYgKHBzZWN0aW9uaW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8peworICAgICAgZm9yIChqPXBzZWN0aW9uaW5mby0+c2ZiU3RhcnQ7CisgICAgICAgICAgIGo8cHNlY3Rpb25pbmZvLT5zZmJTdGFydCtwc2VjdGlvbmluZm8tPnNmYkNudDsgaisrKXsKKyAgICAgICAgIAorICAgICAgICBpZihtYXhWYWx1ZUluU2ZiW2pdID09IDApIHsKKyAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNbal07CisgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgaWYoY29kZVNjYWxlZmFjdG9yRGVsdGEoZGVsdGFTY2YsaEJpdFN0cmVhbSkpeworICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisgIHJldHVybihHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSktZGJnVmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlTXNJbmZvCisqIGRlc2NyaXB0aW9uOiBlbmNvZGVzIE1TLVN0ZXJlbyBJbmZvCisqIHJldHVybnM6ICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuY29kZU1TSW5mbyhXb3JkMTYgICAgICAgICAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBncnBTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIG1heFNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgKmpzRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgIGhCaXRTdHJlYW0pCit7CisgIFdvcmQxNiBzZmIsIHNmYk9mZjsKKworICAgCisgIHN3aXRjaChtc0RpZ2VzdCkKKyAgeworICAgIGNhc2UgTVNfTk9ORToKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfTk9ORSwyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNU19BTEw6CisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX0FMTCwyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNU19TT01FOgorICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19TT01FLDIpOworICAgICAgZm9yKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmKz1ncnBTZmIpIHsKKyAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykgeworICAgICAgICAgICAgIAorICAgICAgICAgIGlmKGpzRmxhZ3Nbc2ZiT2ZmK3NmYl0gJiBNU19PTikgeworICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVUbnNEYXRhCisqIGRlc2NyaXB0aW9uOiAgZW5jb2RlIFROUyBkYXRhIChmaWx0ZXIgb3JkZXIsIGNvZWZmcywgLi4pCisqIHJldHVybnM6ICAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlbmNvZGVUbnNEYXRhKFROU19JTkZPIHRuc0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pIHsKKyAgV29yZDE2IGksazsKKyAgRmxhZyB0bnNQcmVzZW50OworICBXb3JkMTYgbnVtT2ZXaW5kb3dzOworICBXb3JkMTYgY29lZkJpdHM7CisgIEZsYWcgaXNTaG9ydDsKKworICAgICAgIAorICBpZiAoYmxvY2tUeXBlPT0yKSB7CisgICAgaXNTaG9ydCA9IDE7CisgICAgbnVtT2ZXaW5kb3dzID0gVFJBTlNfRkFDOworICB9CisgIGVsc2UgeworICAgIGlzU2hvcnQgPSAwOworICAgIG51bU9mV2luZG93cyA9IDE7CisgIH0KKworICB0bnNQcmVzZW50PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgCisgICAgaWYgKHRuc0luZm8udG5zQWN0aXZlW2ldKSB7CisgICAgICB0bnNQcmVzZW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorICAgCisgIGlmICh0bnNQcmVzZW50PT0wKSB7CisgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKKyAgfQorICBlbHNleyAvKiB0aGVyZSBpcyBkYXRhIHRvIGJlIHdyaXR0ZW4qLworICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7IC8qZGF0YV9wcmVzZW50ICovCisgICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgICAKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8udG5zQWN0aXZlW2ldLChpc1Nob3J0PzE6MikpOworICAgICAgIAorICAgICAgaWYgKHRuc0luZm8udG5zQWN0aXZlW2ldKSB7CisgICAgICAgICAKKyAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sKCh0bnNJbmZvLmNvZWZSZXNbaV0gLSA0KT09MD8xOjApLDEpOworICAgICAgICAgCisgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8ubGVuZ3RoW2ldLChpc1Nob3J0PzQ6NikpOworICAgICAgICAgCisgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8ub3JkZXJbaV0sKGlzU2hvcnQ/Mzo1KSk7CisgICAgICAgICAKKyAgICAgICAgaWYgKHRuc0luZm8ub3JkZXJbaV0peworICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCBGSUxURVJfRElSRUNUSU9OLCAxKTsKKyAgICAgICAgICAgCisgICAgICAgICAgaWYodG5zSW5mby5jb2VmUmVzW2ldID09IDQpIHsKKyAgICAgICAgICAgIGNvZWZCaXRzID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby5vcmRlcltpXTsgaysrKSB7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAodG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA+IDMgfHwKKyAgICAgICAgICAgICAgICAgIHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPCAtNCkgeworICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29lZkJpdHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICh0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdID4gMSB8fAorICAgICAgICAgICAgICAgICAgdG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA8IC0yKSB7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRuc0luZm8uY29lZlJlc1tpXSAtIGNvZWZCaXRzLCAxKTsgLypjb2VmX2NvbXByZXMqLworICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKyApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBXb3JkMTYgcm1hc2tbXSA9IHswLDEsMyw3LDE1fTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gJiBybWFza1tjb2VmQml0c10sY29lZkJpdHMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVHYWluQ29udHJvbERhdGEKKyogZGVzY3JpcHRpb246ICB1bnN1cHBvcnRlZAorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCit7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVQdWxzZURhdGEKKyogZGVzY3JpcHRpb246ICBub3Qgc3VwcG9ydGVkIHlldCAoZHVtbXkpCisqIHJldHVybnM6ICAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlbmNvZGVQdWxzZURhdGEoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKK3sKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogV3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbQorKiBkZXNjcmlwdGlvbjogIG1hbmFnZW1lbnQgb2Ygd3JpdGUgcHJvY2VzcyBvZiBpbmRpdmlkdWFsIGNoYW5uZWwgc3RyZWFtCisqIHJldHVybnM6ICAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbShGbGFnICAgY29tbW9uV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBncm91cGluZ01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NmW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCit7CisgIFdvcmQxNiBsb2dOb3JtOworCisgIGxvZ05vcm0gPSBMT0dfTk9STV9QQ00gLSAobWRjdFNjYWxlICsgMSk7CisKKyAgZW5jb2RlR2xvYmFsR2FpbihnbG9iYWxHYWluLCBsb2dOb3JtLHNjZltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdLCBoQml0U3RyZWFtKTsKKworICAgCisgIGlmKCFjb21tb25XaW5kb3cpIHsKKyAgICBlbmNvZGVJY3NJbmZvKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUsIHdpbmRvd1NoYXBlLCBncm91cGluZ01hc2ssIHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKKyAgfQorCisgIGVuY29kZVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKKworICBlbmNvZGVTY2FsZUZhY3RvckRhdGEobWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisKKyAgZW5jb2RlUHVsc2VEYXRhKGhCaXRTdHJlYW0pOworCisgIGVuY29kZVRuc0RhdGEodG5zSW5mbywgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSwgaEJpdFN0cmVhbSk7CisKKyAgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKGhCaXRTdHJlYW0pOworCisgIGVuY29kZVNwZWN0cmFsRGF0YShzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB3cml0ZVNpbmdsZUNoYW5uZWxFbGVtZW50CisqIGRlc2NyaXB0aW9uOiAgd3JpdGUgc2luZ2xlIGNoYW5uZWwgZWxlbWVudCB0byBiaXRzdHJlYW0KKyogcmV0dXJuczogICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCit7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX1NDRSwzKTsKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saW5zdGFuY2VUYWcsNCk7CisgIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPndpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+Z3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5nbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+cXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsLT5zZWN0aW9uRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgcmV0dXJuKDApOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IHdyaXRlQ2hhbm5lbFBhaXJFbGVtZW50CisqIGRlc2NyaXB0aW9uOgorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtc0RpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1zRmxhZ3NbTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMIHFjT3V0Q2hhbm5lbFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gdG5zSW5mb1syXSkKK3sKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfQ1BFLDMpOworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpbnN0YW5jZVRhZyw0KTsKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsgLyogY29tbW9uIHdpbmRvdyAqLworCisgIGVuY29kZUljc0luZm8ocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLmJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YSksCisgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisKKyAgZW5jb2RlTVNJbmZvKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5zZmJDbnQsCisgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEuc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICBtc0RpZ2VzdCwKKyAgICAgICAgICAgICAgIG1zRmxhZ3MsCisgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKKworICB3cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ucXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9bMF0pOworCisgIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ubWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uZ3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5tYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5nbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5xdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWxbMV0uc2VjdGlvbkRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1sxXSk7CisKKyAgcmV0dXJuKDApOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IHdyaXRlRmlsbEVsZW1lbnQKKyogZGVzY3JpcHRpb246ICB3cml0ZSBmaWxsIGVsZW1lbnRzIHRvIGJpdHN0cmVhbQorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd3JpdGVGaWxsRWxlbWVudCggY29uc3QgVVdvcmQ4ICphbmNCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0b3RGaWxsQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCit7CisgIFdvcmQxNiBpOworICBXb3JkMTYgY250LGVzY19jb3VudDsKKworICAvKgorICAgIFdyaXRlIGZpbGwgRWxlbWVudChzKToKKyAgICBhbW91bnQgb2YgYSBmaWxsIGVsZW1lbnQgY2FuIGJlIDcrWCo4IEJpdHMsIFggZWxlbWVudCBvZiBbMC4uMjcwXQorICAqLworICAgIAorICB3aGlsZSh0b3RGaWxsQml0cyA+PSAoMys0KSkgeworICAgIGNudCA9IG1pbigoKHRvdEZpbGxCaXRzIC0gKDMrNCkpID4+IDMpLCAoKDE8PDQpLTEpKTsKKworICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX0ZJTCwzKTsKKyAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxjbnQsNCk7CisKKyAgICB0b3RGaWxsQml0cyA9IHRvdEZpbGxCaXRzIC0gKDMrNCk7CisKKyAgICAgCisgICAgaWYgKChjbnQgPT0gKDE8PDQpLTEpKSB7CisKKyAgICAgIGVzY19jb3VudCA9IG1pbiggKCh0b3RGaWxsQml0cyA+PiAzKSAtICgoMTw8NCktMSkpLCAoMTw8OCktMSk7CisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxlc2NfY291bnQsOCk7CisgICAgICB0b3RGaWxsQml0cyA9ICh0b3RGaWxsQml0cyAtIDgpOworICAgICAgY250ID0gY250ICsgKGVzY19jb3VudCAtIDEpOworICAgIH0KKworICAgIGZvcihpPTA7aTxjbnQ7aSsrKSB7CisgICAgICAgCisgICAgICBpZihhbmNCeXRlcykKKyAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICphbmNCeXRlcysrLDgpOworICAgICAgZWxzZQorICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDgpOworICAgICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtIDg7CisgICAgfQorICB9Cit9CisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogV3JpdGVCaXRTdHJlYW0KKyogZGVzY3JpcHRpb246ICBtYWluIGZ1bmN0aW9uIG9mIHdyaXRlIGJpdHN0ZWFtIHByb2Nlc3MKKyogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFdyaXRlQml0c3RyZWFtIChIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICpwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZ2xvYlVzZWRCaXRzLAkJCQkJICAgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsDQorCQkJCQkgICBXb3JkMTYgc2FtcGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICkgLyogcmV0dXJucyBlcnJvciBjb2RlICovCit7CisgIFdvcmQxNiBiaXRNYXJrVXA7CisgIFdvcmQxNiBlbGVtZW50VXNlZEJpdHM7CisgIFdvcmQxNiBmcmFtZUJpdHM9MDsNCisNCisgIC8qICAgc3RydWN0IGJpdGJ1ZmZlciBic1dyaXRlQ29weTsgKi8NCisgIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsgDQorICBpZihxY091dC0+cWNFbGVtZW50LmFkdHNVc2VkKSAgLyogIHdyaXRlIGFkdHMgaGVhZGVyKi8NCisgIHsNCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMHhGRkYsIDEyKTsgLyogMTIgYml0IFN5bmN3b3JkICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIDEpOyAvKiBJRCA9PSAwIGZvciBNUEVHNCBBQUMsIDEgZm9yIE1QRUcyIEFBQyAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAyKTsgLyogbGF5ZXIgPT0gMCAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsgLyogcHJvdGVjdGlvbiBhYnNlbnQgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgMik7IC8qIHByb2ZpbGUgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgc2FtcGluZGV4LCA0KTsgLyogc2FtcGxpbmcgcmF0ZSAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogcHJpdmF0ZSBiaXQgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgZWxJbmZvLm5DaGFubmVsc0luRWwsIDMpOyAvKiBjaC4gY29uZmlnIChtdXN0IGJlID4gMCkgKi8NCisJCQkJCQkJCSAgIC8qIHNpbXBseSB1c2luZyBudW1DaGFubmVscyBvbmx5IHdvcmtzIGZvcg0KKwkJCQkJCQkJCTYgY2hhbm5lbHMgb3IgbGVzcywgZWxzZSBhIGNoYW5uZWwNCisJCQkJCQkJCQljb25maWd1cmF0aW9uIHNob3VsZCBiZSB3cml0dGVuICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBvcmlnaW5hbC9jb3B5ICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBob21lICovCSAgDQorCSAgDQorCSAgLyogVmFyaWFibGUgQURUUyBoZWFkZXIgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGNvcHlyLiBpZC4gYml0ICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBjb3B5ci4gaWQuIHN0YXJ0ICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICpnbG9iVXNlZEJpdHMgPj4gMywgMTMpOw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAweDdGRiwgMTEpOyAvKiBidWZmZXIgZnVsbG5lc3MgKDB4N0ZGIGZvciBWQlIpICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDIpOyAvKiByYXcgZGF0YSBibG9ja3MgKDArMT0xKSAqLyAgDQorICB9DQorCisgICpnbG9iVXNlZEJpdHM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHsKKworICAgIFdvcmQxNiAqc2ZiT2Zmc2V0WzJdOworICAgIFROU19JTkZPIHRuc0luZm9bMl07CisgICAgZWxlbWVudFVzZWRCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKSB7CisKKyAgICAgIGNhc2UgSURfU0NFOiAgICAgIC8qIHNpbmdsZSBjaGFubmVsICovCisgICAgICAgIHNmYk9mZnNldFswXSA9IHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS5zZmJPZmZzZXRzOworICAgICAgICB0bnNJbmZvWzBdID0gcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnRuc0luZm87CisKKyAgICAgICAgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1swXSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIElEX0NQRTogICAgIC8qIGNoYW5uZWwgcGFpciAqLworICAgICAgICB7CisgICAgICAgICAgV29yZDE2IG1zRGlnZXN0OworICAgICAgICAgIFdvcmQxNiAqbXNGbGFncyA9IHBzeU91dC0+cHN5T3V0RWxlbWVudC50b29sc0luZm8ubXNNYXNrOworICAgICAgICAgIG1zRGlnZXN0ID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc0RpZ2VzdDsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzZmJPZmZzZXRbMF0gPQorICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnNmYk9mZnNldHM7CisgICAgICAgICAgc2ZiT2Zmc2V0WzFdID0KKyAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzFdXS5zZmJPZmZzZXRzOworCisgICAgICAgICAgdG5zSW5mb1swXT0KKyAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS50bnNJbmZvOworICAgICAgICAgIHRuc0luZm9bMV09CisgICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFsxXV0udG5zSW5mbzsKKyAgICAgICAgICB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0NoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuKDEpOworCisgICAgICB9ICAgLyogc3dpdGNoICovCisKKyAgICBlbGVtZW50VXNlZEJpdHMgPSBlbGVtZW50VXNlZEJpdHMgLSBiaXRNYXJrVXA7CisgICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOworICAgIGZyYW1lQml0cyA9IGZyYW1lQml0cyArIGVsZW1lbnRVc2VkQml0cyArIGJpdE1hcmtVcDsKKworICB9CisKKyAgd3JpdGVGaWxsRWxlbWVudChOVUxMLAorICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cywgCisgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfRU5ELDMpOworCisgIC8qIGJ5dGUgYWxpZ25lbWVudCAqLworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLCAoOCAtIChoQml0U3RyZWFtLT5jbnRCaXRzICYgNykpICYgNyk7ICAgICAgICAgIAorICAKKyAgKmdsb2JVc2VkQml0cyA9ICpnbG9iVXNlZEJpdHMtIGJpdE1hcmtVcDsKKyAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKmdsb2JVc2VkQml0cyA9ICpnbG9iVXNlZEJpdHMgKyBiaXRNYXJrVXA7CisgIGZyYW1lQml0cyA9IGZyYW1lQml0cyArICpnbG9iVXNlZEJpdHM7CisKKyAgIAorICBpZiAoZnJhbWVCaXRzICE9ICAocWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkK3FjT3V0LT50b3REeW5CaXRzVXNlZCArIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArCisgICAgICAgICAgICAgICAgICAgICBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzKSkgeworICAgIHJldHVybigtMSk7CisgIH0KKyAgcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA1NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJsb2NrX3N3aXRjaC5jDQorDQorCUNvbnRlbnQ6CUJsb2NrIHN3aXRjaGluZyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgorCisKKyNkZWZpbmUgRU5FUkdZX1NISUZUICg4IC0gMSkKKworLyoqKioqKioqKioqKioqKiogaW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYKK0lJUkZpbHRlcihjb25zdCBXb3JkMTYgaW4sIGNvbnN0IFdvcmQzMiBjb2VmZltdLCBXb3JkMzIgc3RhdGVzW10pOworCitzdGF0aWMgV29yZDMyCitTcmNoTWF4V2l0aEluZGV4KGNvbnN0IFdvcmQzMiAqaW4sIFdvcmQxNiAqaW5kZXgsIFdvcmQxNiBuKTsKKworCitXb3JkMzIKK0NhbGNXaW5kb3dFbmVyZ3koQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dMZW4pOworCisKKworLyoqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAgSUlSIGhpZ2ggcGFzcyBjb2VmZnMKKyovCitXb3JkMzIgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0geworICAweGJlYzhiNDM5LCAweDYwOWQ0OTUyICAvKiAtMC41MDk1ZiwgMC43NTQ4ZiAqLyAKK307CisKK3N0YXRpYyBjb25zdCBXb3JkMzIgYWNjV2luZG93TnJnRmFjID0gMHgyNjY2NjY2NjsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzIDAuMyAqLworc3RhdGljIGNvbnN0IFdvcmQzMiBvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYyA9IDB4NTk5OTk5OWE7CQkJLyogMC43ICovCitzdGF0aWMgY29uc3QgV29yZDMyIGludkF0dGFja1JhdGlvSGlnaEJyID0gMHgwY2NjY2NjZDsgICAgICAgICAgICAgIC8qIGludmVydGVkIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzIDAuMSovCitzdGF0aWMgY29uc3QgV29yZDMyIGludkF0dGFja1JhdGlvTG93QnIgPSAgMHgwNzJiMDIwYzsgICAgICAgICAgICAgIC8qIDAuMDU2ICovCitzdGF0aWMgY29uc3QgV29yZDMyIG1pbkF0dGFja05yZyA9IDB4MDAwMDFlODQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gZW5lcmd5IGZvciBhdHRhY2tzIDFlKzYgKi8KKworCisvKioqKioqKioqKioqKioqKioqIFJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEluaXRCbG9ja1N3aXRjaGluZworKiBkZXNjcmlwdGlvbjogIGluaXQgQmxvY2sgU3dpdGNoaW5nIHBhcmFtZXRlci4KKyogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBiaXRSYXRlLCBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQoreworICAvKiBzZWxlY3QgYXR0YWNrUmF0aW8gKi8KKyAgICAgICAgICAgCisgIGlmICgoc3ViKG5DaGFubmVscywxKT09MCAmJiBMX3N1YihiaXRSYXRlLCAyNDAwMCkgPiAwKSB8fCAKKyAgICAgIChzdWIobkNoYW5uZWxzLDEpPjAgJiYgYml0UmF0ZSA+IChuQ2hhbm5lbHMgKiAxNjAwMCkpKSB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5pbnZBdHRhY2tSYXRpbyA9IGludkF0dGFja1JhdGlvSGlnaEJyOworICB9CisgIGVsc2UgIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmludkF0dGFja1JhdGlvID0gaW52QXR0YWNrUmF0aW9Mb3dCcjsKKyAgfQorCisgIHJldHVybihUUlVFKTsKK30KKworc3RhdGljIFdvcmQxNiBzdWdnZXN0ZWRHcm91cGluZ1RhYmxlW1RSQU5TX0ZBQ11bTUFYX05PX09GX0dST1VQU10gPSB7CisgIC8qIEF0dGFjayBpbiBXaW5kb3cgMCAqLyB7MSwgIDMsICAzLCAgMX0sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgMSAqLyB7MSwgIDEsICAzLCAgM30sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgMiAqLyB7MiwgIDEsICAzLCAgMn0sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgMyAqLyB7MywgIDEsICAzLCAgMX0sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgNCAqLyB7MywgIDEsICAxLCAgM30sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgNSAqLyB7MywgIDIsICAxLCAgMn0sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgNiAqLyB7MywgIDMsICAxLCAgMX0sCisgIC8qIEF0dGFjayBpbiBXaW5kb3cgNyAqLyB7MywgIDMsICAxLCAgMX0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBCbG9ja1N3aXRjaGluZworKiBkZXNjcmlwdGlvbjogIGRldGVjdCB0aGlzIGZyYW1lIHdoZXRoZXIgdGhlcmUgaXMgYW4gYXR0YWNrCisqIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorCQkJCQkgIFdvcmQzMiBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCkKK3sKKyAgV29yZDMyIGksIHc7CisgIFdvcmQzMiBlbk0xLCBlbk1heDsKKworICAvKiBSZXNldCBncm91cGluZyBpbmZvICovCisgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbltpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisKKyAgLyogU2VhcmNoIGZvciBwb3NpdGlvbiBhbmQgYW1wbGl0dWRlIG9mIGF0dGFjayBpbiBsYXN0IGZyYW1lICgxIHdpbmRvd3MgZGVsYXkpICovCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gU3JjaE1heFdpdGhJbmRleCggJmJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdW0JMT0NLX1NXSVRDSF9XSU5ET1dTLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSF9XSU5ET1dTKTsKKworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXg7ICAgCisKKyAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gTUFYX05PX09GX0dST1VQUzsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaT0wOyBpPE1BWF9OT19PRl9HUk9VUFM7IGkrKykgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSBzdWdnZXN0ZWRHcm91cGluZ1RhYmxlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXhdW2ldOyAgCisgIH0NCisJCisgIC8qIGlmIHRoZSBzYW1wbGVyYXRlIGlzIGxlc3MgdGhhbiAxNjAwMCwgaXQgc2hvdWxkIGJlIGFsbCB0aGUgc2hvcnQgYmxvY2ssIGF2b2lkIHByZSZwb3N0IGVjaG8gKi8KKyAgaWYoc2FtcGxlUmF0ZSA+PSAxNjAwMCkgeworCSAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCisJICBmb3IgKHc9MDsgdzxCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7CisJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XTsgICAgICAgICAgICAgCisJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW3ddID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOyAgICAgICAgICAgCisJICB9CisKKworCSAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8gc2VnbWVudHMgKi8KKwkgIENhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCB0aW1lU2lnbmFsLCBjaEluY3JlbWVudCwgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4pOworCisJICAvKiByZXNldCBhdHRhY2sgKi8KKwkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCSAgZW5NYXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAgZW5NMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVtCTE9DS19TV0lUQ0hfV0lORE9XUy0xXTsgICAgICAgICAgIAorCisJICBmb3IgKHc9MDsgdzxCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7CisJCSAgV29yZDMyIGVuTTFfVG1wLCBhY2NXaW5kb3dOcmdfVG1wLCB3aW5kb3dOcmdGX1RtcDsKKwkJICBXb3JkMTYgZW5NMV9TaGYsIGFjY1dpbmRvd05yZ19TaGYsIHdpbmRvd05yZ0ZfU2hmOworCisJCSAgYWNjV2luZG93TnJnX1NoZiA9IG5vcm1fbChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyk7CisJCSAgZW5NMV9TaGYgPSBub3JtX2woZW5NMSk7CisJCSAgd2luZG93TnJnRl9TaGYgPSBub3JtX2woYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddKTsKKworCQkgIGFjY1dpbmRvd05yZ19UbXAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyA8PCBhY2NXaW5kb3dOcmdfU2hmOworCQkgIGVuTTFfVG1wID0gZW5NMSA8PCBlbk0xX1NoZjsKKwkJICB3aW5kb3dOcmdGX1RtcCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSA8PCB3aW5kb3dOcmdGX1NoZjsKKworCQkgIC8qIGEgc2xpZGluZyBhdmVyYWdlIG9mIHRoZSBwcmV2aW91cyBlbmVyZ2llcyAqLworCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnID0gKGZpeG11bChvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYywgYWNjV2luZG93TnJnX1RtcCkgPj4gYWNjV2luZG93TnJnX1NoZikgKworCQkJICAoZml4bXVsKGFjY1dpbmRvd05yZ0ZhYywgZW5NMV9UbXApID4+IGVuTTFfU2hmKTsKKworCisJCSAgLyogaWYgdGhlIGVuZXJneSB3aXRoIHRoZSByYXRpbyBpcyBiaWdnZXIgdGhhbiB0aGUgYXZlcmFnZSwgYW5kIHRoZSBhdHRhY2sgYW5kIHNob3J0IGJsb2NrICAqLworCQkgIGlmICgoZml4bXVsKHdpbmRvd05yZ0ZfVG1wLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmludkF0dGFja1JhdGlvKSA+PiB3aW5kb3dOcmdGX1NoZikgPgorCQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyApIHsKKwkJCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSB3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCSAgfQorCQkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCSAgZW5NYXggPSBtYXgoZW5NYXgsIGVuTTEpOworCSAgfQorCisJICBpZiAoZW5NYXggPCBtaW5BdHRhY2tOcmcpIHsKKwkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAgfQorICB9CisgIGVsc2UKKyAgeworCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOworICB9CisKKyAgLyogQ2hlY2sgaWYgYXR0YWNrIHNwcmVhZHMgb3ZlciBmcmFtZSBib3JkZXIgKi8gICAgIAorICBpZiAoKCFibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjaykgJiYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjaykpIHsKKyAgICAgCisgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPT0gVFJBTlNfRkFDLTEpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgZWxzZSB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2s7ICAgICAgICAgICAKKyAgfQorCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2U7ICAgIAorCisgICAgIAorICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKKyAgfQorICBlbHNlIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOworICB9CisKKyAgLyogdXBkYXRlIHNob3J0IGJsb2NrIGdyb3VwICovIAorICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgIAorICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlPT0gTE9OR19XSU5ET1cpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTVEFSVF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAgCisgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzBdID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMV0gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblsyXSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisKKyAgLyogdXBkYXRlIGJsb2NrIHR5cGUgKi8gIAorICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPT0gTE9OR19XSU5ET1cpIHsKKyAgICAgCisgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNUT1BfV0lORE9XOyAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKworICByZXR1cm4oVFJVRSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFNyY2hNYXhXaXRoSW5kZXgKKyogZGVzY3JpcHRpb246ICBzZWFyY2ggZm9yIHRoZSBiaWdnZXN0IHZhbHVlIGluIGFuIGFycmF5CisqIHJldHVybnM6ICAgICAgdGhlIG1heCB2YWx1ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMzIgU3JjaE1heFdpdGhJbmRleChjb25zdCBXb3JkMzIgaW5bXSwgV29yZDE2ICppbmRleCwgV29yZDE2IG4pCit7CisgIFdvcmQzMiBtYXg7CisgIFdvcmQzMiBpLCBpZHg7CisKKyAgLyogU2VhcmNoIG1heGltdW0gdmFsdWUgaW4gYXJyYXkgYW5kIHJldHVybiBpbmRleCBhbmQgdmFsdWUgKi8KKyAgbWF4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlkeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgCisgICAgaWYgKGluW2krMV0gID4gbWF4KSB7CisgICAgICBtYXggPSBpbltpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWR4ID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgKmluZGV4ID0gaWR4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgcmV0dXJuKG1heCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjV2luZG93RW5lcmd5CisqIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlIHRoZSBlbmVyZ3kgYmVmb3JlIGlpci1maWx0ZXIgYW5kIGFmdGVyIGlyci1maWx0ZXIKKyogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFSTVY1RQ0KK1dvcmQzMiBDYWxjV2luZG93RW5lcmd5KEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93TGVuKQoreworICBXb3JkMzIgdywgaSwgd09mZnNldCwgdGlkeCwgY2g7CisgIFdvcmQzMiBhY2N1VUUsIGFjY3VGRTsKKyAgV29yZDMyIHRlbXBVbmZpbHRlcmVkOworICBXb3JkMzIgdGVtcEZpbHRlcmVkOw0KKyAgV29yZDMyIHN0YXRlczAsIHN0YXRlczE7DQorICBXb3JkMzIgQ29lZmYwLCBDb2VmZjE7DQorDQorCisgIHN0YXRlczAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsNCisgIHN0YXRlczEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsNCisgIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOw0KKyAgQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07CisgIHRpZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKHc9MDsgdyA8IEJMT0NLX1NXSVRDSF9XSU5ET1dTOyB3KyspIHsKKworICAgIGFjY3VVRSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBhY2N1RkUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBmb3IoaT0wOyBpPHdpbmRvd0xlbjsgaSsrKSB7CisJICBXb3JkMzIgYWNjdTEsIGFjY3UyLCBhY2N1MzsNCisJICBXb3JkMzIgb3V0Ow0KKwkgIHRlbXBVbmZpbHRlcmVkID0gdGltZVNpZ25hbFt0aWR4XTsKKyAgICAgIHRpZHggPSB0aWR4ICsgY2hJbmNyZW1lbnQ7CisNCisJICBhY2N1MSA9IExfbXB5X2xzKENvZWZmMSwgdGVtcFVuZmlsdGVyZWQpOw0KKwkgIGFjY3UyID0gZml4bXVsKCBDb2VmZjAsIHN0YXRlczEgKTsNCisJICBhY2N1MyA9IGFjY3UxIC0gc3RhdGVzMDsNCisJICBvdXQgPSBhY2N1MyAtIGFjY3UyOw0KKw0KKwkgIHN0YXRlczAgPSBhY2N1MTsgICAgICAgICAgICAgDQorCSAgc3RhdGVzMSA9IG91dDsgICAgICAgICAgICAgICANCisNCisgICAgICB0ZW1wRmlsdGVyZWQgPSBleHRyYWN0X2gob3V0KTsJICAKKyAgICAgIGFjY3VVRSArPSAodGVtcFVuZmlsdGVyZWQgKiB0ZW1wVW5maWx0ZXJlZCkgPj4gRU5FUkdZX1NISUZUOworICAgICAgYWNjdUZFICs9ICh0ZW1wRmlsdGVyZWQgKiB0ZW1wRmlsdGVyZWQpID4+IEVORVJHWV9TSElGVDsKKyAgICB9CisKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XSA9IGFjY3VVRTsgICAgICAgICAgICAgCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gYWNjdUZFOyAgICAgICAgICAgIAorCisgIH0NCisNCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdID0gc3RhdGVzMDsNCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdID0gc3RhdGVzMTsKKworICByZXR1cm4oVFJVRSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IElJUkZpbHRlcgorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgaWlyLWZpbHRlciBmb3IgYW4gYXJyYXkKKyogcmV0dXJuczogICAgICB0aGUgcmVzdWx0IGFmdGVyIGlpci1maWx0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IElJUkZpbHRlcihjb25zdCBXb3JkMTYgaW4sIGNvbnN0IFdvcmQzMiBjb2VmZltdLCBXb3JkMzIgc3RhdGVzW10pCit7CisgIFdvcmQzMiBhY2N1MSwgYWNjdTIsIGFjY3UzOworICBXb3JkMzIgb3V0OworCisgIGFjY3UxID0gTF9tcHlfbHMoY29lZmZbMV0sIGluKTsKKyAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlc1swXTsKKyAgYWNjdTIgPSBmaXhtdWwoIGNvZWZmWzBdLCBzdGF0ZXNbMV0gKTsKKyAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKKworICBzdGF0ZXNbMF0gPSBhY2N1MTsgICAgICAgICAgICAgCisgIHN0YXRlc1sxXSA9IG91dDsgICAgICAgICAgICAgICAKKworICByZXR1cm4gcm91bmQxNihvdXQpOworfQorCisKK3N0YXRpYyBXb3JkMTYgc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbNF1bNF0gPSB7CisgIC8qICAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyAgIFNUQVJUX1dJTkRPVyAgU0hPUlRfV0lORE9XICBTVE9QX1dJTkRPVyAqLworICAvKiBMT05HX1dJTkRPVyAgKi97TE9OR19XSU5ET1csICBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1d9LAorICAvKiBTVEFSVF9XSU5ET1cgKi97U1RBUlRfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XfSwKKyAgLyogU0hPUlRfV0lORE9XICove1NIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPV30sCisgIC8qIFNUT1BfV0lORE9XICAqL3tTVE9QX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPV30KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFN5bmNCbG9ja1N3aXRjaGluZworKiBkZXNjcmlwdGlvbjogIHVwZGF0ZSBibG9jayB0eXBlIGFuZCBncm91cCB2YWx1ZQorKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBTeW5jQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKK3sKKyAgV29yZDE2IGk7CisgIFdvcmQxNiBwYXRjaFR5cGUgPSBMT05HX1dJTkRPVzsgICAgICAgICAgICAgICAgCisKKyAgIAorICBpZiAobkNoYW5uZWxzID09IDEpIHsgLyogTW9ubyAqLworICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZm9yIChpPTE7IGk8VFJBTlNfRkFDOyBpKyspIHsKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7IC8qIFN0ZXJlbyBjb21tb24gV2luZG93ICovCisgICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTZXF1ZW5jZV07ICAgICAgICAKKyAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZV07ICAgICAgIAorCisgICAgLyogU2V0IHN5bmNocm9uaXplZCBCbG9ja3R5cGUgKi8KKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsgICAgICAgICAgICAgICAKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7ICAgICAgICAgICAgICAKKworICAgIC8qIFN5bmNocm9uaXplIGdyb3VwaW5nIGluZm8gKi8gICAgIAorICAgIGlmKHBhdGNoVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsgLyogTG9uZyBCbG9ja3MgKi8KKyAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGZvciAoaT0xOyBpPFRSQU5TX0ZBQzsgaSsrKSB7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgIAorICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm1heFdpbmRvd05yZyA+IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5tYXhXaW5kb3dOcmcpIHsKKyAgICAgICAgLyogTGVmdCBDaGFubmVsIHdpbnMgKi8KKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzOyAgICAgICAgICAKKyAgICAgICAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsgICAgICAKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7ICAgICAgICAgIAorICAgICAgICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgeworICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOyAgICAgIAorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IC8qZW5kaWYgTW9ubyBvciBTdGVyZW8gKi8KKworICByZXR1cm4oVFJVRSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDcyOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY2hhbm5lbF9tYXAuYw0KKw0KKwlDb250ZW50OgljaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCisjaW5jbHVkZSAiYml0ZW5jLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorCitzdGF0aWMgY29uc3QgV29yZDE2IG1heENoYW5uZWxCaXRzID0gTUFYQklUU19DT0VGOworCitzdGF0aWMgV29yZDE2IGluaXRFbGVtZW50KEVMRU1FTlRfSU5GTyogZWxJbmZvLCBFTEVNRU5UX1RZUEUgZWxUeXBlKQoreworICBXb3JkMTYgZXJyb3I9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBlbEluZm8tPmVsVHlwZT1lbFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBzd2l0Y2goZWxJbmZvLT5lbFR5cGUpIHsKKworICAgIGNhc2UgSURfU0NFOgorICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTE7ICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJRF9DUEU6CisKKyAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0yOyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT0wOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzFdPTE7ICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBlbEluZm8tPmluc3RhbmNlVGFnPTA7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yPTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCisKK1dvcmQxNiBJbml0RWxlbWVudEluZm8gKFdvcmQxNiBuQ2hhbm5lbHMsIEVMRU1FTlRfSU5GTyogZWxJbmZvKQoreworICBXb3JkMTYgZXJyb3I7CisgIGVycm9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgc3dpdGNoKG5DaGFubmVscykgeworCisgICAgY2FzZSAxOiAKKyAgICAgIGluaXRFbGVtZW50KGVsSW5mbywgSURfU0NFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgaW5pdEVsZW1lbnQoZWxJbmZvLCBJRF9DUEUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3I9NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgcmV0dXJuIGVycm9yOworfQorCisKK1dvcmQxNiBJbml0RWxlbWVudEJpdHMoRUxFTUVOVF9CSVRTICplbGVtZW50Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdHJhdGVUb3QsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhdmVyYWdlQml0c1RvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXRpY0JpdHNUb3QpCit7CisgIFdvcmQxNiBlcnJvcjsKKyAgZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICBzd2l0Y2goZWxJbmZvLm5DaGFubmVsc0luRWwpIHsKKyAgICBjYXNlIDE6CisgICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlID0gYml0cmF0ZVRvdDsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGVsZW1lbnRCaXRzLT5hdmVyYWdlQml0cyA9IGF2ZXJhZ2VCaXRzVG90IC0gc3RhdGljQml0c1RvdDsKKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzID0gbWF4Q2hhbm5lbEJpdHM7ICAgICAgICAgICAgICAgICAgIAorCisgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IG1heENoYW5uZWxCaXRzIC0gYXZlcmFnZUJpdHNUb3Q7CisgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzIC0gKGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzICYgNyk7IAorICAgICAgZWxlbWVudEJpdHMtPmJpdFJlc0xldmVsID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHM7ICAgCisgICAgICBlbGVtZW50Qml0cy0+cmVsYXRpdmVCaXRzICA9IDB4NDAwMDsgLyogMS4wZi8yICovICAgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgZWxlbWVudEJpdHMtPmNoQml0cmF0ZSAgID0gYml0cmF0ZVRvdCA+PiAxOworICAgICAgZWxlbWVudEJpdHMtPmF2ZXJhZ2VCaXRzID0gYXZlcmFnZUJpdHNUb3QgLSBzdGF0aWNCaXRzVG90OworICAgICAgZWxlbWVudEJpdHMtPm1heEJpdHMgICAgID0gbWF4Q2hhbm5lbEJpdHMgPDwgMTsKKworICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSAobWF4Q2hhbm5lbEJpdHMgPDwgMSkgLSBhdmVyYWdlQml0c1RvdDsKKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgLSAoZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgJiA3KTsgICAKKyAgICAgIGVsZW1lbnRCaXRzLT5iaXRSZXNMZXZlbCA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzOyAgICAgCisgICAgICBlbGVtZW50Qml0cy0+cmVsYXRpdmVCaXRzID0gMHg0MDAwOyAvKiAxLjBmLzIgKi8gICAgICAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVhY2NhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpAQCAtMCwwICsxLDU0NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJZHluX2JpdHMuYw0KKw0KKwlDb250ZW50OglOb2lzZWxlc3MgY29kZXIgbW9kdWxlIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAiZHluX2JpdHMuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGJ1aWxkQml0TG9va1VwCisqIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cyB1c2luZyBhbGwgcG9zc2libGUgdGFibGVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitidWlsZEJpdExvb2tVcChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICpzZmJNYXgsCisgICAgICAgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKKyAgICAgICAgICAgICAgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvKQoreworICBXb3JkMzIgaTsKKworICBmb3IgKGk9MDsgaTxtYXhTZmI7IGkrKykgeworICAgIFdvcmQxNiBzZmJXaWR0aCwgbWF4VmFsOworCisgICAgc2VjdGlvbkluZm9baV0uc2ZiQ250ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHNlY3Rpb25JbmZvW2ldLnNmYlN0YXJ0ID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IElOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgCisgICAgc2VjdGlvbkluZm9baV0uY29kZUJvb2sgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2kgKyAxXSAtIHNmYk9mZnNldFtpXTsgICAgICAgICAgICAgIAorICAgIG1heFZhbCA9IHNmYk1heFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiaXRDb3VudChxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W2ldLCBzZmJXaWR0aCwgbWF4VmFsLCBiaXRMb29rVXBbaV0pOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGZpbmRCZXN0Qm9vaworKiBkZXNjcmlwdGlvbjogIGVzc2VudGlhbCBoZWxwZXIgZnVuY3Rpb25zCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYKK2ZpbmRCZXN0Qm9vayhjb25zdCBXb3JkMTYgKmJjLCBXb3JkMTYgKmJvb2spCit7CisgIFdvcmQzMiBtaW5CaXRzLCBqOworICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgeworICAgICAKKyAgICBpZiAoYmNbal0gPCBtaW5CaXRzKSB7CisgICAgICBtaW5CaXRzID0gYmNbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgKmJvb2sgPSBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgcmV0dXJuIGV4dHJhY3RfbChtaW5CaXRzKTsKK30KKworc3RhdGljIFdvcmQxNgorZmluZE1pbk1lcmdlQml0cyhjb25zdCBXb3JkMTYgKmJjMSwgY29uc3QgV29yZDE2ICpiYzIpCit7CisgIFdvcmQzMiBtaW5CaXRzLCBqLCBzdW07CisgIG1pbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaj0wOyBqPD1DT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7CisgICAgc3VtID0gYmMxW2pdICsgYmMyW2pdOworICAgIGlmIChzdW0gPCBtaW5CaXRzKSB7CisgICAgICBtaW5CaXRzID0gc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorICByZXR1cm4gZXh0cmFjdF9sKG1pbkJpdHMpOworfQorCitzdGF0aWMgdm9pZAorbWVyZ2VCaXRMb29rVXAoV29yZDE2ICpiYzEsIGNvbnN0IFdvcmQxNiAqYmMyKQoreworICBXb3JkMzIgajsKKworICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgeworICAgIGJjMVtqXSA9IG1pbihiYzFbal0gKyBiYzJbal0sIElOVkFMSURfQklUQ09VTlQpOworICB9Cit9CisKK3N0YXRpYyBXb3JkMTYKK2ZpbmRNYXhNZXJnZShjb25zdCBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCisgICAgICAgICAgICAgY29uc3QgU0VDVElPTl9JTkZPICpzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLCBXb3JkMTYgKm1heE5keCkKK3sKKyAgV29yZDMyIGksIG1heE1lcmdlR2FpbjsKKyAgbWF4TWVyZ2VHYWluID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yIChpPTA7IGkrc2VjdGlvbkluZm9baV0uc2ZiQ250IDwgbWF4U2ZiOyBpICs9IHNlY3Rpb25JbmZvW2ldLnNmYkNudCkgeworICAgICAKKyAgICBpZiAobWVyZ2VHYWluTG9va1VwW2ldID4gbWF4TWVyZ2VHYWluKSB7CisgICAgICBtYXhNZXJnZUdhaW4gPSBtZXJnZUdhaW5Mb29rVXBbaV07ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgKm1heE5keCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgcmV0dXJuIGV4dHJhY3RfbChtYXhNZXJnZUdhaW4pOworfQorCisKKworc3RhdGljIFdvcmQxNgorQ2FsY01lcmdlR2Fpbihjb25zdCBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKKyAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYiwKKyAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5keDEsCisgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuZHgyKQoreworICBXb3JkMzIgU3BsaXRCaXRzOworICBXb3JkMzIgTWVyZ2VCaXRzOworICBXb3JkMzIgTWVyZ2VHYWluOworCisgIC8qCisgICAgQml0IGFtb3VudCBmb3Igc3BsaXR0ZWQgc2VjdGlvbnMKKyAgKi8KKyAgU3BsaXRCaXRzID0gc2VjdGlvbkluZm9bbmR4MV0uc2VjdGlvbkJpdHMgKyBzZWN0aW9uSW5mb1tuZHgyXS5zZWN0aW9uQml0czsKKworICBNZXJnZUJpdHMgPSBzaWRlSW5mb1RhYltzZWN0aW9uSW5mb1tuZHgxXS5zZmJDbnQgKyBzZWN0aW9uSW5mb1tuZHgyXS5zZmJDbnRdICsKKyAgICAgICAgICAgICAgICAgIGZpbmRNaW5NZXJnZUJpdHMoYml0TG9va1VwW25keDFdLCBiaXRMb29rVXBbbmR4Ml0pOworICBNZXJnZUdhaW4gPSAoU3BsaXRCaXRzIC0gTWVyZ2VCaXRzKTsKKworICByZXR1cm4gZXh0cmFjdF9sKE1lcmdlR2Fpbik7Cit9CisKKy8qCisgIHNlY3Rpb25pbmcgU3RhZ2UgMDpmaW5kIG1pbmltdW0gY29kYm9va3MKKyovCisKK3N0YXRpYyB2b2lkCitnbVN0YWdlMChTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mbywKKyAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYikKK3sKKyAgV29yZDMyIGk7CisKKyAgZm9yIChpPTA7IGk8bWF4U2ZiOyBpKyspIHsKKyAgICAvKiBTaWRlLUluZm8gYml0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgaW4gU3RhZ2UgMSEgICovCisgICAgIAorICAgIGlmIChzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9PSBJTlZBTElEX0JJVENPVU5UKSB7CisgICAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IGZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoc2VjdGlvbkluZm9baV0uY29kZUJvb2spKTsKKyAgICB9CisgIH0KK30KKworLyoKKyAgc2VjdGlvbmluZyBTdGFnZSAxOm1lcmdlIGFsbCBjb25uZWN0ZWQgcmVnaW9ucyB3aXRoIHRoZSBzYW1lIGNvZGUgYm9vayBhbmQKKyAgY2FsY3VsYXRlIHNpZGUgaW5mbworKi8KKworc3RhdGljIHZvaWQKK2dtU3RhZ2UxKFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvLAorICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAorICAgICAgICAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYikKK3sKKyAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm9fczsNCisgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvX2U7DQorICBXb3JkMzIgbWVyZ2VTdGFydCwgbWVyZ2VFbmQ7CisgIG1lcmdlU3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZG8geworCisgICAgc2VjdGlvbkluZm9fcyA9IHNlY3Rpb25JbmZvICsgbWVyZ2VTdGFydDsNCisJZm9yIChtZXJnZUVuZD1tZXJnZVN0YXJ0KzE7IG1lcmdlRW5kPG1heFNmYjsgbWVyZ2VFbmQrKykgeworICAgICAgc2VjdGlvbkluZm9fZSA9IHNlY3Rpb25JbmZvICsgbWVyZ2VFbmQ7IAorICAgICAgaWYgKHNlY3Rpb25JbmZvX3MtPmNvZGVCb29rICE9IHNlY3Rpb25JbmZvX2UtPmNvZGVCb29rKQorICAgICAgICBicmVhazsKKyAgICAgIHNlY3Rpb25JbmZvX3MtPnNmYkNudCArPSAxOworICAgICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2VjdGlvbkluZm9fZS0+c2VjdGlvbkJpdHM7CisKKyAgICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttZXJnZVN0YXJ0XSwgYml0TG9va1VwW21lcmdlRW5kXSk7CisgICAgfQorCisgICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9fcy0+c2ZiQ250XTsKKyAgICBzZWN0aW9uSW5mb1ttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9fcy0+c2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8gIAorCisgICAgbWVyZ2VTdGFydCA9IG1lcmdlRW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgCisgIH0gd2hpbGUgKG1lcmdlU3RhcnQgLSBtYXhTZmIgPCAwKTsKK30KKworLyoKKyAgc2VjdGlvbmluZyBTdGFnZSAyOmdyZWVkeSBtZXJnZSBhbGdvcml0aG0sIG1lcmdlIGNvbm5lY3RlZCBzZWN0aW9ucyB3aXRoCisgIG1heGltdW0gYml0IGdhaW4gdW50aWwgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlCisqLworc3RhdGljIHZvaWQKK2dtU3RhZ2UyKFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCisgICAgICAgICBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCisgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKKyAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsCisgICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiKQoreworICBXb3JkMTYgaTsKKworICBmb3IgKGk9MDsgaStzZWN0aW9uSW5mb1tpXS5zZmJDbnQ8bWF4U2ZiOyBpKz1zZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKKyAgICBtZXJnZUdhaW5Mb29rVXBbaV0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpKTsKKyAgfQorCisgIHdoaWxlIChUUlVFKSB7CisgICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4LCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OworCisgICAgbWF4TWVyZ2VHYWluID0gZmluZE1heE1lcmdlKG1lcmdlR2Fpbkxvb2tVcCwgc2VjdGlvbkluZm8sIG1heFNmYiwgJm1heE5keCk7CisKKyAgICAgCisgICAgaWYgKG1heE1lcmdlR2FpbiA8PSAwKQorICAgICAgYnJlYWs7CisKKworICAgIG1heE5keE5leHQgPSBtYXhOZHggKyBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudDsKKworICAgIHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250ID0gc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQgKyBzZWN0aW9uSW5mb1ttYXhOZHhOZXh0XS5zZmJDbnQ7CisgICAgc2VjdGlvbkluZm9bbWF4TmR4XS5zZWN0aW9uQml0cyA9IHNlY3Rpb25JbmZvW21heE5keF0uc2VjdGlvbkJpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb25JbmZvW21heE5keE5leHRdLnNlY3Rpb25CaXRzIC0gbWF4TWVyZ2VHYWluKTsKKworCisgICAgbWVyZ2VCaXRMb29rVXAoYml0TG9va1VwW21heE5keF0sIGJpdExvb2tVcFttYXhOZHhOZXh0XSk7CisKKyAgICAgCisgICAgaWYgKG1heE5keCAhPSAwKSB7CisgICAgICBtYXhOZHhMYXN0ID0gc2VjdGlvbkluZm9bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7CisgICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHhMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgpOworICAgIH0KKyAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQ7CisKKyAgICBzZWN0aW9uSW5mb1ttYXhOZHhOZXh0IC0gMV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYlN0YXJ0OyAgICAgICAgICAgICAKKworICAgICAKKyAgICBpZiAobWF4TmR4TmV4dCAtIG1heFNmYiA8IDApIHsKKyAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhdID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keE5leHQpOworICAgIH0KKyAgfQorfQorCisvKgorICBjb3VudCBiaXRzIHVzZWQgYnkgdGhlIG5vaXNlbGVzcyBjb2RlcgorKi8KK3N0YXRpYyB2b2lkCitub2lzZWxlc3NDb3VudGVyKFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKKyAgICAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBibG9ja1R5cGUpCit7CisgIFdvcmQzMiBncnBOZHgsIGk7CisgIFdvcmQxNiAqc2lkZUluZm9UYWIgPSBOVUxMOworICBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvOworCisgIC8qCisgICAgdXNlIGFwcHJvcHJpYXRlIHNpZGUgaW5mbyB0YWJsZQorICAqLyAgIAorICBzd2l0Y2ggKGJsb2NrVHlwZSkKKyAgeworICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgIHNpZGVJbmZvVGFiID0gc2lkZUluZm9UYWJMb25nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICBzaWRlSW5mb1RhYiA9IHNpZGVJbmZvVGFiU2hvcnQ7CisgICAgICBicmVhazsKKyAgfQorCisKKyAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgCisgIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyoKKyAgICBsb29wIHRyb3VnaCBncm91cHMKKyAgKi8KKyAgZm9yIChncnBOZHg9MDsgZ3JwTmR4PHNlY3Rpb25EYXRhLT5zZmJDbnQ7IGdycE5keCs9c2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwKSB7CisKKyAgICBzZWN0aW9uSW5mbyA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mbyArIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7CisKKyAgICBidWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsCisgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiArIGdycE5keCwKKyAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCisgICAgICAgICAgICAgICAgICAgc2VjdGlvbkluZm8pOworCisgICAgLyoKKyAgICAgICAwLlN0YWdlCisgICAgKi8KKyAgICBnbVN0YWdlMChzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXApOworCisgICAgLyoKKyAgICAgICAxLlN0YWdlCisgICAgKi8KKyAgICBnbVN0YWdlMShzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIHNpZGVJbmZvVGFiKTsKKworCisgICAgLyoKKyAgICAgICAyLlN0YWdlCisgICAgKi8KKyAgICBnbVN0YWdlMihzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCisgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICBzaWRlSW5mb1RhYik7CisKKworICAgIC8qCisgICAgICAgY29tcHJlc3Mgb3V0cHV0LCBjYWxjdWxhdGUgdG90YWwgaHVmZiBhbmQgc2lkZSBiaXRzCisgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7IGkrPXNlY3Rpb25JbmZvW2ldLnNmYkNudCkgeworICAgICAgZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihzZWN0aW9uSW5mb1tpXS5jb2RlQm9vaykpOworICAgICAgc2VjdGlvbkluZm9baV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCArIGdycE5keDsKKworICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzID0gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzIC0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSkpOworICAgICAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyA9IChzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsgc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSk7CisgICAgICBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uc10gPSBzZWN0aW9uSW5mb1tpXTsgICAgICAgICAgICAgCisgICAgICBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zID0gc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyArIDE7CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb25uYW1lOiBzY2ZDb3VudAorKiByZXR1cm5zICAgICA6IC0tLQorKiBkZXNjcmlwdGlvbiA6IGNvdW50IGJpdHMgdXNlZCBieSBzY2FsZWZhY3RvcnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNjZkNvdW50KGNvbnN0IFdvcmQxNiAqc2NhbGVmYWNHYWluLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqIHNlY3Rpb25EYXRhKQorCit7CisgIFNFQ1RJT05fSU5GTyAqcHNlY3Rpb25JbmZvOw0KKyAgU0VDVElPTl9JTkZPICpwc2VjdGlvbkluZm9tOw0KKw0KKyAgLyogY291bnRlciAqLworICBXb3JkMzIgaSA9IDA7IC8qIHNlY3Rpb24gY291bnRlciAqLworICBXb3JkMzIgaiA9IDA7IC8qIHNmYiBjb3VudGVyICovCisgIFdvcmQzMiBrID0gMDsgLyogY3VycmVudCBzZWN0aW9uIGF1eGlsaWFyeSBjb3VudGVyICovCisgIFdvcmQzMiBtID0gMDsgLyogb3RoZXIgc2VjdGlvbiBhdXhpbGlhcnkgY291bnRlciAqLworICBXb3JkMzIgbiA9IDA7IC8qIG90aGVyIHNmYiBhdXhpbGlhcnkgY291bnRlciAqLworCisgIC8qIGZ1cnRoZXIgdmFyaWFibGVzICovCisgIFdvcmQzMiBsYXN0VmFsU2NmICAgICA9IDA7CisgIFdvcmQzMiBkZWx0YVNjZiAgICAgICA9IDA7CisgIEZsYWcgZm91bmQgICAgICAgICAgICA9IDA7CisgIFdvcmQzMiBzY2ZTa2lwQ291bnRlciA9IDA7ICAgICAgICAgICAKKyAgICAgICAgIAorCisgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAKKyAgaWYgKHNjYWxlZmFjR2FpbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbGFzdFZhbFNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7ICAgICAgICANCisgIAorICBwc2VjdGlvbkluZm8gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm87CisgIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgeworICAgICAKKyAgICBpZiAocHNlY3Rpb25JbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgeworICAgICAgc2VjdGlvbkRhdGEtPmZpcnN0U2NmID0gcHNlY3Rpb25JbmZvLT5zZmJTdGFydDsgICAgICAKKyAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bc2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsgICAgICAgICAgICAgICAgICAKKyAgICAgIGJyZWFrOworICAgIH0NCisJcHNlY3Rpb25JbmZvICs9IDE7CisgIH0NCisKKyAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOworICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyssIHBzZWN0aW9uSW5mbyArPSAxKSB7CisgICAgICAgCisgICAgaWYgKHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8KKyAgICAgICAgJiYgcHNlY3Rpb25JbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSB7CisgICAgICBmb3IgKGogPSBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0OworICAgICAgICAgICBqIDwgKHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQgKyBwc2VjdGlvbkluZm8tPnNmYkNudCk7IGorKykgeworICAgICAgICAvKiBjaGVjayBpZiB3ZSBjYW4gcmVwZWF0IHRoZSBsYXN0IHZhbHVlIHRvIHNhdmUgYml0cyAqLworICAgICAgICAgCisgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApIHsKKyAgICAgICAgICBmb3VuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgICAgaWYgKHNjZlNraXBDb3VudGVyID09IDApIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaiAtICgocHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250KSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgZm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBmb3IgKGsgPSBqICsgMTsgayA8IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQgKyBwc2VjdGlvbkluZm8tPnNmYkNudDsgaysrKSB7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2tdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgIGludCB0bXAgPSBMX2FicyhzY2FsZWZhY0dhaW5ba10gLSBsYXN0VmFsU2NmKTsKKwkJCQkgIGZvdW5kID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGlmICggdG1wIDwgQ09ERV9CT09LX1NDRl9MQVYpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBiaXRzICovCisgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IHNhdmUgYml0cyAqLworICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07CisgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLworICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkNCisJCQlwc2VjdGlvbkluZm9tID0gcHNlY3Rpb25JbmZvICsgMTsKKyAgICAgICAgICAgIC8qIHNlYXJjaCBmb3IgdGhlIG5leHQgbWF4VmFsdWVJblNmYltdICE9IDAgaW4gYWxsIG90aGVyIHNlY3Rpb25zICovCisgICAgICAgICAgICBmb3IgKG0gPSBpICsgMTsgKG0gPCBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zKSAmJiAoZm91bmQgPT0gMCk7IG0rKykgeworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKKyAgICAgICAgICAgICAgICAgIChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkgeworICAgICAgICAgICAgICAgIGZvciAobiA9IHBzZWN0aW9uSW5mb20tPnNmYlN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgbiA8IChwc2VjdGlvbkluZm9tLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mb20tPnNmYkNudCk7IG4rKykgeworICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbbl0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICggKGFic19zKHNjYWxlZmFjR2FpbltuXSAtIGxhc3RWYWxTY2YpIDwgQ09ERV9CT09LX1NDRl9MQVYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAobGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXSk7CisgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltqXTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvKiBjb3VudCBzY2FsZWZhY3RvciBza2lwICovCisgICAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IHNjZlNraXBDb3VudGVyICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0NCisNCisJCQkgIHBzZWN0aW9uSW5mb20gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVsdGFTY2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciAtIDE7CisgICAgICAgICAgfQ0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07CisgICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFTY2YpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3R5cGVkZWYgV29yZDE2ICgqbG9va1VwVGFibGUpW0NPREVfQk9PS19FU0NfTkRYICsgMV07CisKKworV29yZDE2CitkeW5CaXRDb3VudChjb25zdCBXb3JkMTYgICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNjYWxlZmFjLAorICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgYmxvY2tUeXBlLAorICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiQ250LAorICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgKnNlY3Rpb25EYXRhKQoreworICBzZWN0aW9uRGF0YS0+YmxvY2tUeXBlICAgICAgPSBibG9ja1R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2VjdGlvbkRhdGEtPnNmYkNudCAgICAgICAgID0gc2ZiQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCAgICA9IHNmYlBlckdyb3VwOyAgICAgICAgICAgCisgIGlmKHNmYlBlckdyb3VwKQorCXNlY3Rpb25EYXRhLT5ub09mR3JvdXBzICAgPSBzZmJDbnQvc2ZiUGVyR3JvdXA7IAorICBlbHNlCisJc2VjdGlvbkRhdGEtPm5vT2ZHcm91cHMgICA9IDB4N2ZmZjsKKyAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXA7ICAgICAgICAgICAgICAgICAgCisKKyAgbm9pc2VsZXNzQ291bnRlcihzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWVyZ2VHYWluTG9va1VwLAorICAgICAgICAgICAgICAgICAgIChsb29rVXBUYWJsZSlzZWN0aW9uRGF0YS0+Yml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlKTsKKworICBzY2ZDb3VudChzY2FsZWZhYywKKyAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgc2VjdGlvbkRhdGEpOworCisKKyAgcmV0dXJuIChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKyBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsgDQorCSAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ncnBfZGF0YS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ5YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJZ3JwX2RhdGEuYw0KKw0KKwlDb250ZW50OglTaG9ydCBibG9jayBncm91cGluZyBmdW5jdGlvbg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJncnBfZGF0YS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZ3JvdXBTaG9ydERhdGEKKyogZGVzY3JpcHRpb246ICBncm91cCBzaG9ydCBkYXRhIGZvciBuZXh0IHF1YW50aXphdGlvbiBhbmQgY29kaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZ3JvdXBTaG9ydERhdGEoV29yZDMyICAgICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAqdG1wU3BlY3RydW0sCisgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICpzZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3ksCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3lNUywKKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZGVkRW5lcmd5LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiQ250LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiTWluU25yLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpncm91cExlbikKK3sKKyAgV29yZDMyIGksIGo7CisgIFdvcmQzMiBsaW5lOworICBXb3JkMzIgc2ZiOworICBXb3JkMzIgZ3JwOworICBXb3JkMzIgd25kOworICBXb3JkMzIgb2Zmc2V0OworICBXb3JkMzIgaGlnaGVzdFNmYjsKKworICAvKiBmb3Igc2hvcnQ6IHJlZ3JvdXAgYW5kICAqLworICAvKiBjdW11bGF0ZSBlbmVyZ2llcyB1bmQgdGhyZXNob2xkcyBncm91cC13aXNlIC4gKi8KKyAgCisgIC8qIGNhbGN1bGF0ZSBzZmJDbnQgKi8KKyAgaGlnaGVzdFNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKHduZD0wOyB3bmQ8VFJBTlNfRkFDOyB3bmQrKykgeworICAgIGZvciAoc2ZiPXNmYkNudCAtIDE7IHNmYj49aGlnaGVzdFNmYjsgc2ZiLS0pIHsKKyAgICAgIGZvciAobGluZT0oc2ZiT2Zmc2V0W3NmYiArIDFdIC0gMSk7IGxpbmU+PXNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKKyAgICAgICAgCisgICAgICAgIGlmIChtZGN0U3BlY3RydW1bd25kKkZSQU1FX0xFTl9TSE9SVCtsaW5lXSAhPSAwKSBicmVhazsgCisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChsaW5lID49IHNmYk9mZnNldFtzZmJdKSBicmVhazsKKyAgICB9CisgICAgaGlnaGVzdFNmYiA9IG1heChoaWdoZXN0U2ZiLCBzZmIpOworICB9CisgIAorICBpZiAoaGlnaGVzdFNmYiA8IDApIHsKKyAgICBoaWdoZXN0U2ZiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgICptYXhTZmJQZXJHcm91cCA9IGhpZ2hlc3RTZmIgKyAxOworCisgIC8qIGNhbGN1bGF0ZSBzZmJPZmZzZXQgKi8KKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBvZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKyAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaV0gPSBvZmZzZXQgKyBzZmJPZmZzZXRbc2ZiXSAqIGdyb3VwTGVuW2dycF07CisgICAgICBpICs9IDE7CisgICAgfQorICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogRlJBTUVfTEVOX1NIT1JUOworICB9CisgIGdyb3VwZWRTZmJPZmZzZXRbaV0gPSBGUkFNRV9MRU5fTE9ORzsgICAgICAgICAgICAgICAgICAKKyAgaSArPSAxOworCisgIC8qIGNhbGN1bGF0ZSBtaW5TbnIgKi8KKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBvZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKyAgICAgIGdyb3VwZWRTZmJNaW5TbnJbaV0gPSBzZmJNaW5TbnJbc2ZiXTsgICAgICAgICAgICAgIAorICAgICAgaSArPSAxOworICAgIH0KKyAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKKyAgfQorCisKKyAgLyogc3VtIHVwIHNmYlRocmVzaG9sZHMgKi8KKyAgd25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBXb3JkMzIgdGhyZXNoID0gc2ZiVGhyZXNob2xkLT5zZmJTaG9ydFt3bmRdW3NmYl07ICAgICAgICAgIAorICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIHRocmVzaCA9IExfYWRkKHRocmVzaCwgc2ZiVGhyZXNob2xkLT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICB9CisgICAgICBzZmJUaHJlc2hvbGQtPnNmYkxvbmdbaV0gPSB0aHJlc2g7ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaSArPSAxOworICAgIH0KKyAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKKyAgfQorCisgIC8qIHN1bSB1cCBzZmJFbmVyZ2llcyBsZWZ0L3JpZ2h0ICovCisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgeworICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kXVtzZmJdOyAgICAgICAgICAgICAKKyAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgfQorICAgICAgc2ZiRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGkgKz0gMTsKKyAgICB9CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbWlkL3NpZGUgKi8KKyAgd25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZF1bc2ZiXTsgICAgICAgICAgIAorICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIH0KKyAgICAgIHNmYkVuZXJneU1TLT5zZmJMb25nW2ldID0gZW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpICs9IDE7CisgICAgfQorICAgIHduZCArPSBncm91cExlbltncnBdOworICB9CisKKyAgLyogc3VtIHVwIHNmYlNwcmVhZGVkRW5lcmdpZXMgKi8KKyAgd25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsgICAgIAorICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIH0KKyAgICAgIHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OyAgICAgICAgICAgICAgICAgICAgCisgICAgICBpICs9IDE7CisgICAgfQorICAgIHduZCArPSBncm91cExlbltncnBdOworICB9CisKKyAgLyogcmUtZ3JvdXAgc3BlY3RydW0gKi8KKyAgd25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICAgIFdvcmQxNiBsaW5lT2Zmc2V0ID0gRlJBTUVfTEVOX1NIT1JUICogKHduZCArIGopOworICAgICAgICBmb3IgKGxpbmUgPSBsaW5lT2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl07IGxpbmUgPCBsaW5lT2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYisxXTsgbGluZSsrKSB7CisgICAgICAgICAgdG1wU3BlY3RydW1baV0gPSBtZGN0U3BlY3RydW1bbGluZV07ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIGkgPSBpICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKKyAgfQorCisgIGZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORztpKz00KSB7CisgICAgbWRjdFNwZWN0cnVtW2ldID0gdG1wU3BlY3RydW1baV07ICANCisJbWRjdFNwZWN0cnVtW2krMV0gPSB0bXBTcGVjdHJ1bVtpKzFdOyAgDQorCW1kY3RTcGVjdHJ1bVtpKzJdID0gdG1wU3BlY3RydW1baSsyXTsgIA0KKwltZGN0U3BlY3RydW1baSszXSA9IHRtcFNwZWN0cnVtW2krM107ICAJCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvaW50ZXJmYWNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRiMWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWludGVyZmFjZS5jDQorDQorCUNvbnRlbnQ6CUludGVyZmFjZSBwc3ljaG9hY2NvdXN0aWMvcXVhbnRpemVyIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEJ1aWxkSW50ZXJmYWNlCisqIGRlc2NyaXB0aW9uOiAgdXBkYXRlIG91dHB1dCBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgICpncm91cGVkTWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAqZ3JvdXBlZFNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgKmdyb3VwZWRTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICpncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgICBzZmJFbmVyZ3lTdW1MUiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgIHNmYkVuZXJneVN1bU1TLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICB3aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIGdyb3VwZWRTZmJDbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiTWluU25yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgKmdyb3VwTGVuLAorICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAqcHN5T3V0Q2gpCit7CisgIFdvcmQzMiBqOworICBXb3JkMzIgZ3JwOyAKKyAgV29yZDMyIG1hc2s7DQorICBXb3JkMTYgKnRtcFY7CisKKyAgLyoKKyAgY29weSB2YWx1ZXMgdG8gcHN5T3V0CisgICovCisgIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCAgICA9IG1heFNmYlBlckdyb3VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHBzeU91dENoLT5zZmJDbnQgICAgICAgICAgICA9IGdyb3VwZWRTZmJDbnQ7ICAgCisgIGlmKG5vT2ZHcm91cHMpCisJcHN5T3V0Q2gtPnNmYlBlckdyb3VwICAgICA9IGdyb3VwZWRTZmJDbnQvIG5vT2ZHcm91cHM7CisgIGVsc2UKKwlwc3lPdXRDaC0+c2ZiUGVyR3JvdXAgICAgID0gMHg3ZmZmOworICBwc3lPdXRDaC0+d2luZG93U2VxdWVuY2UgICAgPSB3aW5kb3dTZXF1ZW5jZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lPdXRDaC0+d2luZG93U2hhcGUgICAgICAgPSB3aW5kb3dTaGFwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lPdXRDaC0+bWRjdFNjYWxlICAgICAgICAgPSBtZGN0U2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lPdXRDaC0+bWRjdFNwZWN0cnVtICAgICAgPSBncm91cGVkTWRjdFNwZWN0cnVtOworICBwc3lPdXRDaC0+c2ZiRW5lcmd5ICAgICAgICAgPSBncm91cGVkU2ZiRW5lcmd5LT5zZmJMb25nOworICBwc3lPdXRDaC0+c2ZiVGhyZXNob2xkICAgICAgPSBncm91cGVkU2ZiVGhyZXNob2xkLT5zZmJMb25nOworICBwc3lPdXRDaC0+c2ZiU3ByZWFkZWRFbmVyZ3kgPSBncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYkxvbmc7CisgIAorICB0bXBWID0gcHN5T3V0Q2gtPnNmYk9mZnNldHM7DQorICBmb3Ioaj0wOyBqPGdyb3VwZWRTZmJDbnQgKyAxOyBqKyspIHsKKyAgICAgICp0bXBWKysgPSBncm91cGVkU2ZiT2Zmc2V0W2pdOworICB9CisgIA0KKyAgdG1wViA9IHBzeU91dENoLT5zZmJNaW5TbnI7CisgIGZvcihqPTA7ajxncm91cGVkU2ZiQ250OyBqKyspIHsKKwkgICp0bXBWKysgPSAgIGdyb3VwZWRTZmJNaW5TbnJbal07CisgIH0KKyAgCisgIC8qIGdlbmVyYXRlIGdyb3VwaW5nIG1hc2sgKi8KKyAgbWFzayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgbWFzayA9IG1hc2sgPDwgMTsKKyAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgIG1hc2sgPSBtYXNrIDw8IDE7CisgICAgICBtYXNrIHw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgcHN5T3V0Q2gtPmdyb3VwaW5nTWFzayA9IG1hc2s7IAorICAKKyAgaWYgKHdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gIHNmYkVuZXJneVN1bUxSLnNmYkxvbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcHN5T3V0Q2gtPnNmYkVuU3VtTVMgPSAgc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICBlbHNlIHsKKyAgICBXb3JkMzIgaTsKKyAgICBXb3JkMzIgYWNjdVN1bU1TPTA7CisgICAgV29yZDMyIGFjY3VTdW1MUj0wOyAgICAgICAgDQorCVdvcmQzMiAqcFN1bU1TID0gc2ZiRW5lcmd5U3VtTVMuc2ZiU2hvcnQ7DQorCVdvcmQzMiAqcFN1bUxSID0gc2ZiRW5lcmd5U3VtTFIuc2ZiU2hvcnQ7CisKKyAgICBmb3IgKGk9VFJBTlNfRkFDOyBpOyBpLS0pIHsKKyAgICAgIGFjY3VTdW1MUiA9IExfYWRkKGFjY3VTdW1MUiwgKnBTdW1MUik7IHBTdW1MUisrOworICAgICAgYWNjdVN1bU1TID0gTF9hZGQoYWNjdVN1bU1TLCAqcFN1bU1TKTsgcFN1bU1TKys7CisgICAgfQorICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gYWNjdVN1bU1TOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcHN5T3V0Q2gtPnNmYkVuU3VtTFIgPSBhY2N1U3VtTFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTc2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWxpbmVfcGUuYw0KKw0KKwlDb250ZW50OglQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZSBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKworI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgImxpbmVfcGUuaCIKKworCitzdGF0aWMgY29uc3QgV29yZDE2ICBDMV9JID0gMTI7ICAgIC8qIGxvZyg4LjApL2xvZygyKSAqNCAgICAgICAgICovCitzdGF0aWMgY29uc3QgV29yZDMyICBDMl9JID0gMTA4MzA7IC8qIGxvZygyLjUpL2xvZygyKSAqIDEwMjQgKiA0ICogMiAqLworc3RhdGljIGNvbnN0IFdvcmQxNiAgQzNfSSA9IDU3MzsgICAvKiAoMS1DMi9DMSkgKjEwMjQgICAgICAgICAgICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBwcmVwYXJlU2ZiUGUKKyogZGVzY3JpcHRpb246ICBjb25zdGFudHMgdGhhdCBkbyBub3QgY2hhbmdlIGR1cmluZyBzdWNjZXNzaXZlIHBlIGNhbGN1bGF0aW9ucworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJlcGFyZVNmYlBlKFBFX0RBVEEgKnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZU9mZnNldCkKK3sKKyAgV29yZDMyIHNmYkdycCwgc2ZiOworICBXb3JkMzIgY2g7ICAgICAKKworICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YT0mcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKKyAgICBmb3Ioc2ZiR3JwPTA7c2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisJICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lczRbc2ZiR3JwK3NmYl0gPSBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl07ICAgICAgICAgIAorICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl0gPSBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl0gPj4gMjsgICAgCisJICAgIHBlQ2hhbkRhdGEtPnNmYkxkRW5lcmd5W3NmYkdycCtzZmJdID0gbG9nU2ZiRW5lcmd5W2NoXVtzZmJHcnArc2ZiXTsgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0KKyAgfQorICBwZURhdGEtPm9mZnNldCA9IHBlT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY2FsY1NmYlBlCisqIGRlc2NyaXB0aW9uOiAgY29uc3RQYXJ0IGlzIHNmYlBlIHdpdGhvdXQgdGhlIHRocmVzaG9sZCBwYXJ0IG4qbGQodGhyKSBvciBuKkMzKmxkKHRocikKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNhbGNTZmJQZShQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKK3sKKyAgV29yZDMyIGNoOworICBXb3JkMzIgc2ZiR3JwLCBzZmI7CisgIFdvcmQzMiBuTGluZXM0OworICBXb3JkMzIgbGRUaHIsIGxkUmF0aW87DQorICBXb3JkMzIgcGUsIGNvbnN0UGFydCwgbkFjdGl2ZUxpbmVzOworCisgIHBlRGF0YS0+cGUgPSBwZURhdGEtPm9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHBlRGF0YS0+Y29uc3RQYXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CisgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3k7CisgICAgY29uc3QgV29yZDMyICpzZmJUaHJlc2hvbGQgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQ7CisKKyAgICBwZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBjb25zdFBhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBuQWN0aXZlTGluZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgeworICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICBXb3JkMzIgbnJnID0gc2ZiRW5lcmd5W3NmYkdycCtzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFdvcmQzMiB0aHJlcyA9IHNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgV29yZDMyIHNmYkxERW4gPSBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXTsNCisKKyAgICAgICAgaWYgKG5yZyA+IHRocmVzKSB7CisgICAgICAgICAgbGRUaHIgPSBpTG9nNCh0aHJlcyk7CisKKyAgICAgICAgICBsZFJhdGlvID0gc2ZiTERFbiAtIGxkVGhyOworCisgICAgICAgICAgbkxpbmVzNCA9IHBlQ2hhbkRhdGEtPnNmYk5MaW5lczRbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgICAgLyogc2ZiUGUgPSBubCpsb2cyKGVuL3RocikqLworCQkgIGlmIChsZFJhdGlvID49IEMxX0kpIHsKKyAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gKG5MaW5lczQqbGRSYXRpbyArIDgpID4+IDQ7CisgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAoKG5MaW5lczQqc2ZiTERFbikpID4+IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworCQkgIC8qIHNmYlBlID0gbmwqKGMyICsgYzMqbG9nMihlbi90aHIpKSovCisgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IGV4dHJhY3RfbCgoTF9tcHlfd3goDQorICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBsZFJhdGlvICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsNCisgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSBleHRyYWN0X2woKCBMX21weV93eCgNCisgICAgICAgICAgICAgICAgICAgIChDMl9JICsgQzNfSSAqIHNmYkxERW4gKiAyKSA8PCA0LCBuTGluZXM0KSArIDQpID4+IDMpOw0KKyAgICAgICAgICAgIG5MaW5lczQgPSAobkxpbmVzNCAqIEMzX0kgKyAoMTAyNDw8MSkpID4+IDEwOworICAgICAgICAgIH0KKyAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSBuTGluZXM0ID4+IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcGUgPSBwZSArIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOworICAgICAgICBjb25zdFBhcnQgPSBjb25zdFBhcnQgKyBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07CisgICAgICAgIG5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lcyArIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKKyAgICAgIH0KKyAgICB9CisJDQorCXBlQ2hhbkRhdGEtPnBlID0gc2F0dXJhdGUocGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisKKyAgICAKKwlwZSArPSBwZURhdGEtPnBlOworCXBlRGF0YS0+cGUgPSBzYXR1cmF0ZShwZSk7IAorICAgIGNvbnN0UGFydCArPSBwZURhdGEtPmNvbnN0UGFydDsKKwlwZURhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7IAorICAgIG5BY3RpdmVMaW5lcyArPSBwZURhdGEtPm5BY3RpdmVMaW5lczsKKwlwZURhdGEtPm5BY3RpdmVMaW5lcyA9IHNhdHVyYXRlKG5BY3RpdmVMaW5lcyk7CisgIH0gCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tZW1hbGlnbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDIwMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJRmlsZToJCW1lbV9hbGlnbi5jCisKKwlDb250ZW50OglNZW1vcnkgYWxsb2MgYWxpZ25tZW50cyBmdW5jdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZQkibWVtYWxpZ24uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IG1lbV9tYWxsb2MKKyogZGVzY3JpcHRpb246ICBtYWxsb2MgdGhlIGFsaWdubWVudHMgbWVtb3J5IAorKiByZXR1cm5zOiAgICAgIHRoZSBwb2ludCBvZiB0aGUgbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqCittZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqbWVtX3B0cjsKKwlWT19NRU1fSU5GTyBNZW1JbmZvOworCisJaWYgKCFhbGlnbm1lbnQpIHsKKworCQlNZW1JbmZvLkZsYWcgPSAwOworCQlNZW1JbmZvLlNpemUgPSBzaXplICsgMTsKKwkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7CisJCWlmKHJldCAhPSAwKQorCQkJcmV0dXJuIDA7CisJCW1lbV9wdHIgPSAodW5zaWduZWQgY2hhciAqKU1lbUluZm8uVkJ1ZmZlcjsKKworCQlwTWVtb3AtPlNldChDb2RlY0lELCBtZW1fcHRyLCAwLCBzaXplICsgMSk7CisKKwkJKm1lbV9wdHIgPSAodW5zaWduZWQgY2hhcikxOworCisJCXJldHVybiAoKHZvaWQgKikobWVtX3B0cisxKSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciAqdG1wOworCisJCU1lbUluZm8uRmxhZyA9IDA7CisJCU1lbUluZm8uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnQ7CisJCXJldCA9IHBNZW1vcC0+QWxsb2MoQ29kZWNJRCwgJk1lbUluZm8pOworCQlpZihyZXQgIT0gMCkKKwkJCXJldHVybiAwOworCisJCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOworCisJCXBNZW1vcC0+U2V0KENvZGVjSUQsIHRtcCwgMCwgc2l6ZSArIGFsaWdubWVudCk7CisKKwkJbWVtX3B0ciA9CisJCQkodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKHRtcCArIGFsaWdubWVudCAtIDEpICYKKwkJCQkJKH4oKHVuc2lnbmVkIGludCkgKGFsaWdubWVudCAtIDEpKSkpOworCisJCWlmIChtZW1fcHRyID09IHRtcCkKKwkJCW1lbV9wdHIgKz0gYWxpZ25tZW50OworCisJCSoobWVtX3B0ciAtIDEpID0gKHVuc2lnbmVkIGNoYXIpIChtZW1fcHRyIC0gdG1wKTsKKworCQlyZXR1cm4gKCh2b2lkICopbWVtX3B0cik7CisJfQorCisJcmV0dXJuKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBtZW1fZnJlZQorKiBkZXNjcmlwdGlvbjogIGZyZWUgdGhlIG1lbW9yeQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK21lbV9mcmVlKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB2b2lkICptZW1fcHRyLCB1bnNpZ25lZCBpbnQgQ29kZWNJRCkKK3sKKworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmIChtZW1fcHRyID09IDApCisJCXJldHVybjsKKworCXB0ciA9IG1lbV9wdHI7CisKKwlwdHIgLT0gKihwdHIgLSAxKTsKKworCXBNZW1vcC0+RnJlZShDb2RlY0lELCBwdHIpOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNkMDdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCW1zX3N0ZXJlby5jDQorDQorCUNvbnRlbnQ6CU1TIHN0ZXJlbyBwcm9jZXNzaW5nIGZ1bmN0aW9uDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAibXNfc3RlcmVvLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IE1zU3RlcmVvUHJvY2Vzc2luZworKiBkZXNjcmlwdGlvbjogIGRldGVjdCB1c2UgbXMgc3RlcmVvIG9yIG5vdAorKgkJCQlpZiAoKG1pbih0aHJMbiwgdGhyUm4pKm1pbih0aHJMbiwgdGhyUm4pKS8oZW5NbiplblNuKSkgCisqCQkJCT49ICgodGhyTG4gKnRoclJuKS8oZW5MbiplblJuKSkgdGhlbiBtcyBzdGVyZW8KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE1zU3RlcmVvUHJvY2Vzc2luZyhXb3JkMzIgICAgICAgKnNmYkVuZXJneUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFbkxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCkgeworICBXb3JkMzIgdGVtcDsKKyAgV29yZDMyIHNmYixzZmJvZmZzLCBqOyAKKyAgV29yZDMyIG1zTWFza1RydWVTb21ld2hlcmUgPSAwOworICBXb3JkMzIgbXNNYXNrRmFsc2VTb21ld2hlcmUgPSAwOworCisgIGZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYis9c2ZiUGVyR3JvdXApIHsKKyAgICBmb3IgKHNmYm9mZnM9MDtzZmJvZmZzPG1heFNmYlBlckdyb3VwO3NmYm9mZnMrKykgeworCisgICAgICBXb3JkMzIgdGVtcDsKKyAgICAgIFdvcmQzMiBwbmxyLHBubXM7CisgICAgICBXb3JkMzIgbWluVGhyZXNob2xkOworICAgICAgV29yZDMyIHRockwsIHRoclIsIG5yZ0wsIG5yZ1I7CisgICAgICBXb3JkMzIgaWR4LCBzaGlmdDsKKworICAgICAgaWR4ID0gc2ZiICsgc2Zib2ZmczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICB0aHJMID0gc2ZiVGhyZXNob2xkTGVmdFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB0aHJSID0gc2ZiVGhyZXNob2xkUmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBucmdMID0gc2ZiRW5lcmd5TGVmdFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBucmdSID0gc2ZiRW5lcmd5UmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIG1pblRocmVzaG9sZCA9IG1pbih0aHJMLCB0aHJSKTsKKworICAgICAgbnJnTCA9IG1heChucmdMLHRockwpICsgMTsKKyAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ0wpOw0KKwkgIG5yZ0wgPSBEaXZfMzIodGhyTCA8PCBzaGlmdCwgbnJnTCA8PCBzaGlmdCk7CisgICAgICBucmdSID0gbWF4KG5yZ1IsdGhyUikgKyAxOworICAgICAgc2hpZnQgPSBub3JtX2wobnJnUik7DQorCSAgbnJnUiA9IERpdl8zMih0aHJSIDw8IHNoaWZ0LCBucmdSIDw8IHNoaWZ0KTsKKworCSAgcG5sciA9IGZpeG11bChucmdMLCBucmdSKTsKKworICAgICAgbnJnTCA9IHNmYkVuZXJneU1pZFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbnJnUiA9IHNmYkVuZXJneVNpZGVbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBucmdMID0gbWF4KG5yZ0wsbWluVGhyZXNob2xkKSArIDE7CisgICAgICBzaGlmdCA9IG5vcm1fbChucmdMKTsNCisJICBucmdMID0gRGl2XzMyKG1pblRocmVzaG9sZCA8PCBzaGlmdCwgbnJnTCA8PCBzaGlmdCk7CisKKyAgICAgIG5yZ1IgPSBtYXgobnJnUixtaW5UaHJlc2hvbGQpICsgMTsKKyAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ1IpOw0KKwkgIG5yZ1IgPSBEaXZfMzIobWluVGhyZXNob2xkIDw8IHNoaWZ0LCBucmdSIDw8IHNoaWZ0KTsKKworICAgICAgcG5tcyA9IGZpeG11bChucmdMLCBucmdSKTsKKworICAgICAgdGVtcCA9IChwbmxyICsgMSkgLyAoKHBubXMgPj4gOCkgKyAxKTsKKworICAgICAgdGVtcCA9IHBubXMgLSBwbmxyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYoIHRlbXAgPiAwICl7CisKKyAgICAgICAgbXNNYXNrW2lkeF0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W2lkeF07IGo8c2ZiT2Zmc2V0W2lkeCsxXTsgaisrKSB7CisgICAgICAgICAgV29yZDMyIGxlZnQsIHJpZ2h0OworICAgICAgICAgIGxlZnQgID0gKG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gIDEpOworICAgICAgICAgIHJpZ2h0ID0gKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDEpOworICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAgbGVmdCArIHJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSAgbGVmdCAtIHJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2ZiVGhyZXNob2xkTGVmdFtpZHhdID0gbWluVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbaWR4XSA9IG1pblRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiRW5lcmd5TGVmdFtpZHhdID0gc2ZiRW5lcmd5TWlkW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiRW5lcmd5UmlnaHRbaWR4XSA9IHNmYkVuZXJneVNpZGVbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSA9IG1pbihzZmJTcHJlYWRlZEVuTGVmdFtpZHhdLHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdKSA+PiAxOyAgCisgICAgICAgIHNmYlNwcmVhZGVkRW5MZWZ0W2lkeF0gPSBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIG1zTWFza1tpZHhdICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCBtc01hc2tUcnVlU29tZXdoZXJlICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpZihtc01hc2tGYWxzZVNvbWV3aGVyZSApIHsKKyAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19TT01FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfQUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfTk9ORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTIxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXByZV9lY2hvX2NvbnRyb2wuYw0KKw0KKwlDb250ZW50OglQcmUgZWNobyBjb250cm9sIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKworI2luY2x1ZGUgIm9wZXJfMzJiLmgiCisjaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOkluaXRQcmVFY2hvQ29udHJvbCAKKyogZGVzY3JpcHRpb246IGluaXQgcHJlIGVjaG8gY29udHJvbCBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBJbml0UHJlRWNob0NvbnRyb2woV29yZDMyICpwYlRocmVzaG9sZE5tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkUXVpZXQpCit7CisgIFdvcmQxNiBwYjsKKworICBmb3IocGI9MDsgcGI8bnVtUGI7IHBiKyspIHsKKyAgICBwYlRocmVzaG9sZE5tMVtwYl0gPSBwYlRocmVzaG9sZFF1aWV0W3BiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOlByZUVjaG9Db250cm9sIAorKiBkZXNjcmlwdGlvbjogdXBkYXRlIHNocmVzaG9sZCB0byBhdm9pZCBwcmUgZWNobworKgkJCSAgIHRocihuKSA9IG1heChycG1pbip0aHJxKG4pLCBtaW4odGhycShuKSwgcnBlbGV2KnRocnExKG4pKSkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQcmVFY2hvQ29udHJvbChXb3JkMzIgKnBiVGhyZXNob2xkTm0xLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1kY3RTY2FsZW5tMSkKK3sKKyAgV29yZDMyIGk7CisgIFdvcmQzMiB0bXBUaHJlc2hvbGQxLCB0bXBUaHJlc2hvbGQyOworICBXb3JkMzIgc2NhbGluZzsKKworICAvKiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgaXMgaGFyZCBjb2RlZCB0byAyICovCisgICh2b2lkKW1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsKKworICBzY2FsaW5nID0gKChtZGN0U2NhbGUgLSBtZGN0U2NhbGVubTEpIDw8IDEpOworICAgCisgIGlmICggc2NhbGluZyA+IDAgKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgeworICAgICAgdG1wVGhyZXNob2xkMSA9IHBiVGhyZXNob2xkTm0xW2ldID4+IChzY2FsaW5nLTEpOworICAgICAgdG1wVGhyZXNob2xkMiA9IExfbXB5X2xzKHBiVGhyZXNob2xkW2ldLCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IpOworCisgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgaWYocGJUaHJlc2hvbGRbaV0gPiB0bXBUaHJlc2hvbGQxKSB7CisgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICAgICAKKyAgICAgIGlmKHRtcFRocmVzaG9sZDIgPiBwYlRocmVzaG9sZFtpXSkgeworICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2NhbGluZyA9IC1zY2FsaW5nOworICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKworICAgICAgdG1wVGhyZXNob2xkMSA9IHBiVGhyZXNob2xkTm0xW2ldIDw8IDE7CisgICAgICB0bXBUaHJlc2hvbGQyID0gTF9tcHlfbHMocGJUaHJlc2hvbGRbaV0sIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3Rvcik7CisKKyAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KKyAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgCisgICAgICBpZigoKHBiVGhyZXNob2xkW2ldID4+IHNjYWxpbmcpID4gdG1wVGhyZXNob2xkMSkpIHsKKyAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQxIDw8IHNjYWxpbmc7CisgICAgICB9CisgICAgICAgCisgICAgICBpZih0bXBUaHJlc2hvbGQyID4gcGJUaHJlc2hvbGRbaV0pIHsKKyAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorCisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmUwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jCkBAIC0wLDAgKzEsNTA1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwc3lfY29uZmlndXJhdGlvbi5jDQorDQorCUNvbnRlbnQ6CVBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiYWRqX3Roci5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworCisKKyNkZWZpbmUgQkFSQ19TQ0FMRQkxMDAgLyogaW50ZWdlciBiYXJjIHZhbHVlcyBhcmUgc2NhbGVkIHdpdGggMTAwICovCisjZGVmaW5lIExPRzJfMTAwMAkzMDEgLyogbG9nMioxMDAwICovDQorI2RlZmluZSBQSTJfMTAwMAkxNTcxIC8qIHBpLzIqMTAwMCovDQorI2RlZmluZSBBVEFOX0NPRUYxCTM1NjAgLyogMTAwMC8wLjI4MDg3MmYqLw0KKyNkZWZpbmUgQVRBTl9DT0VGMgkyODEgLyogMTAwMCowLjI4MDg3MmYqLw0KKworCit0eXBlZGVmIHN0cnVjdHsKKyAgV29yZDMyIHNhbXBsZVJhdGU7CisgIGNvbnN0IFVXb3JkOCAqcGFyYW1Mb25nOworICBjb25zdCBVV29yZDggKnBhcmFtU2hvcnQ7Cit9U0ZCX0lORk9fVEFCOworCitzdGF0aWMgY29uc3QgV29yZDE2IEFCU19MRVYgPSAyMDsKK3N0YXRpYyBjb25zdCBXb3JkMTYgQkFSQ19USFJfUVVJRVRbXSA9IHsxNSwgMTAsICA3LCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgIDUsIDEwLCAyMCwgMzB9OworCisKKworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXhfYmFyayA9IDI0OyAvKiBtYXhpbXVtIGJhcmstdmFsdWUgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgbWFza0xvdyAgPSAzMDsgLyogaW4gMWRCL2JhcmsgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgbWFza0hpZ2ggPSAxNTsgLyogaW4gMSpkQi9iYXJrICovCitzdGF0aWMgY29uc3QgV29yZDE2IGNfcmF0aW8gID0gMHgwMDI5OyAvKiBwb3coMTAuMGYsIC0oMjkuMGYvMTAuMGYpKSAqLworCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tMb3dTcHJFbkxvbmcgPSAzMDsgICAgICAgLyogaW4gMWRCL2JhcmsgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgbWFza0hpZ2hTcHJFbkxvbmcgPSAyMDsgICAgICAvKiBpbiAxZEIvYmFyayAqLworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaFNwckVuTG9uZ0xvd0JyID0gMTU7IC8qIGluIDFkQi9iYXJrICovCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tMb3dTcHJFblNob3J0ID0gMjA7ICAgICAgLyogaW4gMWRCL2JhcmsgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgbWFza0hpZ2hTcHJFblNob3J0ID0gMTU7ICAgICAvKiBpbiAxZEIvYmFyayAqLw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSAweDAxNDg7ICAgIC8qIDAuMDEgKigxIDw8IDE1KSovDQorc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heHNuciA9IDB4NjY2NjY2NjY7CQkgLyogdXBwZXIgbGltaXQgaXMgLTEgZEIgKi8NCitzdGF0aWMgY29uc3QgV29yZDMyIGNfbWluc25yID0gMHgwMDYyNGRkMzsJCSAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8NCisNCitzdGF0aWMgY29uc3QgV29yZDMyIGNfbWF4Q2xpcEVuZXJneUxvbmcgPSAweDc3MzU5NDAwOyAgLyogMi4wZTlmKi8NCitzdGF0aWMgY29uc3QgV29yZDMyIGNfbWF4Q2xpcEVuZXJneVNob3J0ID0gMHgwMWRjZDY1MDsgLyogMi4wZTlmLyhBQUNFTkNfVFJBTlNfRkFDKkFBQ0VOQ19UUkFOU19GQUMpKi8NCisNCisNCitXb3JkMzIgR2V0U1JJbmRleChXb3JkMzIgc2FtcGxlUmF0ZSkNCit7DQorICAgIGlmICg5MjAxNyA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMDsNCisgICAgaWYgKDc1MTMyIDw9IHNhbXBsZVJhdGUpIHJldHVybiAxOw0KKyAgICBpZiAoNTU0MjYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDI7DQorICAgIGlmICg0NjAwOSA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMzsNCisgICAgaWYgKDM3NTY2IDw9IHNhbXBsZVJhdGUpIHJldHVybiA0Ow0KKyAgICBpZiAoMjc3MTMgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDU7DQorICAgIGlmICgyMzAwNCA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNjsNCisgICAgaWYgKDE4NzgzIDw9IHNhbXBsZVJhdGUpIHJldHVybiA3Ow0KKyAgICBpZiAoMTM4NTYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDg7DQorICAgIGlmICgxMTUwMiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gOTsNCisgICAgaWYgKDkzOTEgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDEwOw0KKw0KKyAgICByZXR1cm4gMTE7DQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYXRhbl8xMDAwCisqIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyAxMDAwKmF0YW4oeC8xMDAwKQorKiAgICAgICAgICAgICAgIGJhc2VkIG9uIGF0YW4gYXBwcm94IGZvciB4ID4gMAkJCQkKKyoJCQkJYXRhbih4KSA9IHgvKChmbG9hdCkxLjBmKyhmbG9hdCkwLjI4MDg3MmYqeCp4KSAgaWYgeCA8IDENCisqCQkJCQkJPSBwaS8yIC0geC8oKGZsb2F0KTAuMjgwODcyZiAreCp4KQkgICAgaWYgeCA+PSAxDQorKiByZXR1cm46ICAgICAgIDEwMDAqYXRhbih4LzEwMDApCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBhdGFuXzEwMDAoV29yZDMyIHZhbCkgCit7CisgIFdvcmQzMiB5OworCisgICAKKyAgaWYoTF9zdWIodmFsLCAxMDAwKSA8IDApIHsKKyAgICB5ID0gZXh0cmFjdF9sKCgoMTAwMCAqIHZhbCkgLyAoMTAwMCArICgodmFsICogdmFsKSAvIEFUQU5fQ09FRjEpKSkpOworICB9CisgIGVsc2UgeworICAgIHkgPSBQSTJfMTAwMCAtICgoMTAwMCAqIHZhbCkgLyAoQVRBTl9DT0VGMiArICgodmFsICogdmFsKSAvIDEwMDApKSk7CisgIH0KKworICByZXR1cm4gZXh0cmFjdF9sKHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBCYXJjTGluZVZhbHVlCisqIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBiYXJjIHZhbHVlIGZvciBvbmUgZnJlcXVlbmN5IGxpbmUKKyogcmV0dXJuczogICAgICBiYXJjIHZhbHVlIG9mIGxpbmUgKiBCQVJDX1NDQUxFCisqIGlucHV0OiAgICAgICAgbnVtYmVyIG9mIGxpbmVzIGluIHRyYW5zZm9ybSwgaW5kZXggb2YgbGluZSB0byBjaGVjaywgRnMKKyogb3V0cHV0OgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IEJhcmNMaW5lVmFsdWUoV29yZDE2IG5vT2ZMaW5lcywgV29yZDE2IGZmdExpbmUsIFdvcmQzMiBzYW1wbGluZ0ZyZXEpCit7CisgIFdvcmQzMiBjZW50ZXJfZnJlcSwgdGVtcCwgYnZhbEZGVExpbmU7CisKKyAgLyogY2VudGVyIGZyZXF1ZW5jeSBvZiBmZnQgbGluZSAqLworICBjZW50ZXJfZnJlcSA9IChmZnRMaW5lICogc2FtcGxpbmdGcmVxKSAvIChub09mTGluZXMgPDwgMSk7CisgIHRlbXAgPSAgYXRhbl8xMDAwKChjZW50ZXJfZnJlcSA8PCAyKSAvICgzKjEwKSk7CisgIGJ2YWxGRlRMaW5lID0gCisgICAgKDI2NjAwICogYXRhbl8xMDAwKChjZW50ZXJfZnJlcSo3NikgLyAxMDApICsgNyp0ZW1wKnRlbXApIC8gKDIqMTAwMCoxMDAwIC8gQkFSQ19TQ0FMRSk7CisgIAorICByZXR1cm4gc2F0dXJhdGUoYnZhbEZGVExpbmUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogaW5pdFRoclF1aWV0CisqIGRlc2NyaXB0aW9uOiAgaW5pdCB0aHJlZGhvbGQgaW4gcXVpZXQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdFRoclF1aWV0KFdvcmQxNiAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQmFyY1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkUXVpZXQpIHsKKyAgV29yZDE2IGk7CisgIFdvcmQxNiBiYXJjVGhyUXVpZXQ7CisKKyAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKSB7CisgICAgV29yZDE2IGJ2MSwgYnYyOworCisgICAgIAorICAgIGlmIChpPjApCisgICAgICBidjEgPSAocGJCYXJjVmFsW2ldICsgcGJCYXJjVmFsW2ktMV0pID4+IDE7CisgICAgZWxzZQorICAgICAgYnYxID0gcGJCYXJjVmFsW2ldID4+IDE7CisKKyAgICAgCisgICAgaWYgKGkgPCAobnVtUGIgLSAxKSkKKyAgICAgIGJ2MiA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaSsxXSkgPj4gMTsKKyAgICBlbHNlIHsKKyAgICAgIGJ2MiA9IHBiQmFyY1ZhbFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgYnYxID0gbWluKChidjEgLyBCQVJDX1NDQUxFKSwgbWF4X2JhcmspOworICAgIGJ2MiA9IG1pbigoYnYyIC8gQkFSQ19TQ0FMRSksIG1heF9iYXJrKTsKKworICAgIGJhcmNUaHJRdWlldCA9IG1pbihCQVJDX1RIUl9RVUlFVFtidjFdLCBCQVJDX1RIUl9RVUlFVFtidjJdKTsKKworICAgIAorICAgIC8qCisgICAgICB3ZSBjYWxjdWxhdGUgCisgICAgICBwb3coMTAuMGYsKGZsb2F0KShiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSowLjEpKihmbG9hdClBQlNfTE9XKihwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pOworICAgICovCisKKyAgICBwYlRocmVzaG9sZFF1aWV0W2ldID0gcG93Ml94eSgoKChiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSAqIDEwMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cyXzEwMDAqKDE0KzIqTE9HX05PUk1fUENNKSksIExPRzJfMTAwMCkgKiAocGJPZmZzZXRbaSsxXSAtIHBiT2Zmc2V0W2ldKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBpbml0U3ByZWFkaW5nCisqIGRlc2NyaXB0aW9uOiAgaW5pdCBlbmVyZ3kgc3ByZWFkaW5nIHBhcmFtZXRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0U3ByZWFkaW5nKFdvcmQxNiAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJCYXJjVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrSGlGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tIaUZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSkKK3sKKyAgV29yZDE2IGk7CisgIFdvcmQxNiBtYXNrTG93U3ByRW4sIG1hc2tIaWdoU3ByRW47CisKKyAgIAorICBpZiAoc3ViKGJsb2NrVHlwZSwgU0hPUlRfV0lORE9XKSAhPSAwKSB7CisgICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuTG9uZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgaWYgKGJpdHJhdGUgPiAyMjAwMCkKKyAgICAgIG1hc2tIaWdoU3ByRW4gPSBtYXNrSGlnaFNwckVuTG9uZzsKKyAgICBlbHNlCisgICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmdMb3dCcjsKKyAgfQorICBlbHNlIHsKKyAgICBtYXNrTG93U3ByRW4gPSBtYXNrTG93U3ByRW5TaG9ydDsgICAgICAgICAgICAKKyAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFblNob3J0OyAgICAgICAgICAKKyAgfQorCisgIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgeworICAgICAKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIFdvcmQzMiBkYlZhbDsKKyAgICAgIFdvcmQxNiBkYmFyayA9IHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXTsKKworICAgICAgLyoKKyAgICAgICAgd2UgY2FsdWxhdGUgcG93KDEwLjBmLCAtMC4xKmRiVmFsL0JBUkNfU0NBTEUpIAorICAgICAgKi8KKyAgICAgIGRiVmFsID0gKG1hc2tIaWdoICogZGJhcmspOworICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLCAoV29yZDMyKUxPRzJfMTAwMCkpOyAgICAgICAgICAgICAvKiAwLjMwMSBsb2cxMCgyKSAqLworICAgICAgIAorICAgICAgZGJWYWwgPSAobWFza0xvdyAqIGRiYXJrKTsKKyAgICAgIHBiTWFza0xvRmFjdG9yW2ktMV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7IAorICAgICAgIAorICAgICAgCisgICAgICBkYlZhbCA9IChtYXNrSGlnaFNwckVuICogZGJhcmspOworICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9ICByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7IAorICAgICAgZGJWYWwgPSAobWFza0xvd1NwckVuICogZGJhcmspOworICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltpLTFdID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHBiTWFza0xvRmFjdG9yW251bVBiLTFdID0gMDsgICAgICAgICAgICAgICAKKworICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9IDA7ICAgICAgICAgICAgICAgIAorICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltudW1QYi0xXSA9IDA7ICAgICAgICAgIAorICAgIH0KKyAgfQorCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGluaXRCYXJjVmFsdWVzCisqIGRlc2NyaXB0aW9uOiAgaW5pdCBiYXJrIHZhbHVlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRCYXJjVmFsdWVzKFdvcmQxNiAgbnVtUGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1MaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgc2FtcGxpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQnZhbCkKK3sKKyAgV29yZDE2IGk7CisgIFdvcmQxNiBwYkJ2YWwwLCBwYkJ2YWwxOworCisgIHBiQnZhbDAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvcihpPTA7IGk8bnVtUGI7IGkrKyl7CisgICAgcGJCdmFsMSA9IEJhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2krMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKKyAgICBwYkJ2YWxbaV0gPSAocGJCdmFsMCArIHBiQnZhbDEpID4+IDE7CisgICAgcGJCdmFsMCA9IHBiQnZhbDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogaW5pdE1pblNucgorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBtaW4gc25yIHBhcmFtZXRlcgorKgkJCQltaW5TbnIobikgPSAxLygyXnNmYlBlbWluKG4pL3cobikgLSAxLjUpDQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0TWluU25yKGNvbnN0IFdvcmQzMiAgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpwYkJhcmNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKnNmYk1pblNucikKK3sKKyAgV29yZDE2IHNmYjsKKyAgV29yZDE2IGJhcmNXaWR0aDsKKyAgV29yZDE2IHBlUGVyV2luZG93OworICBXb3JkMzIgcGVQYXJ0OworICBXb3JkMzIgc25yOworICBXb3JkMTYgcGJWYWwwLCBwYlZhbDEsIHNoaWZ0OworCisgIC8qIHJlbGF0aXZlIG51bWJlciBvZiBhY3RpdmUgYmFya3MgKi8KKworCisgIHBlUGVyV2luZG93ID0gYml0czJwZShleHRyYWN0X2woKGJpdHJhdGUgKiBudW1MaW5lcykgLyBzYW1wbGVyYXRlKSk7CisKKyAgcGJWYWwwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yIChzZmI9MDsgc2ZiPHNmYkFjdGl2ZTsgc2ZiKyspIHsKKworICAgIHBiVmFsMSA9IChwYkJhcmNWYWxbc2ZiXSA8PCAxKSAtIHBiVmFsMDsKKyAgICBiYXJjV2lkdGggPSBwYlZhbDEgLSBwYlZhbDA7CisgICAgcGJWYWwwID0gcGJWYWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgLyogYWxsb3cgYXQgbGVhc3QgMi40JSBvZiBwZSBmb3IgZWFjaCBhY3RpdmUgYmFyYyAqLw0KKwlwZVBhcnQgPSAoKHBlUGVyV2luZG93ICogMjQpICogKG1heF9iYXJrICogYmFyY1dpZHRoKSkgLworICAgICAgICAocGJCYXJjVmFsW3NmYkFjdGl2ZS0xXSAqIChzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0pKTsKKyAgIAorICAgICAgCisgICAgcGVQYXJ0ID0gbWluKHBlUGFydCwgODQwMCk7IAorICAgIHBlUGFydCA9IG1heChwZVBhcnQsIDE0MDApOworCisgICAgLyogbWluU25yKG4pID0gMS8oMl5zZmJQZW1pbihuKS93KG4pIC0gMS41KSovDQorCS8qIHdlIGFkZCBhbiBvZmZzZXQgb2YgMl4xNiB0byB0aGUgcG93IGZ1bmN0aW9ucyAqLworCS8qIDB4YzAwMCA9IDEuNSooMSA8PCAxNSkqLw0KKyAgICAgIAorICAgIHNuciA9IHBvdzJfeHkoKHBlUGFydCAtIDE2KjEwMDApLDEwMDApIC0gMHgwMDAwYzAwMDsKKyAgICAgIAorICAgIGlmKHNuciA+IDB4MDAwMDgwMDApDQorCXsNCisJCXNoaWZ0ID0gbm9ybV9sKHNucik7DQorCQlzbnIgPSBEaXZfMzIoMHgwMDAwODAwMCA8PCBzaGlmdCwgc25yIDw8IHNoaWZ0KTsgIAorCX0KKwllbHNlCisJeworCQlzbnIgPSAweDdmZmZmZmZmOworCX0KKyAgICAgIAorICAgIC8qIHVwcGVyIGxpbWl0IGlzIC0xIGRCICovCisgICAgc25yID0gbWluKHNuciwgY19tYXhzbnIpOworICAgIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLworICAgIHNuciA9IG1heChzbnIsIGNfbWluc25yKTsKKyAgICBzZmJNaW5TbnJbc2ZiXSA9IHJvdW5kMTYoc25yKTsKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcKKyogZGVzY3JpcHRpb246ICBpbml0IGxvbmcgYmxvY2sgcHN5Y2hvYWNvdXN0aWMgY29uZmlndXJhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcHN5Q29uZikKK3sKKyAgV29yZDMyIHNhbXBsZXJhdGVpbmRleDsNCisgIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfTE9OR107DQorICBXb3JkMTYgc2ZiOworCisgIC8qCisgICAgaW5pdCBzZmIgdGFibGUKKyAgKi8NCisgIHNhbXBsZXJhdGVpbmRleCA9IEdldFNSSW5kZXgoc2FtcGxlcmF0ZSk7ICANCisgIHBzeUNvbmYtPnNmYkNudCA9IHNmQmFuZFRvdGFsTG9uZ1tzYW1wbGVyYXRlaW5kZXhdOw0KKyAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiTG9uZyArIHNmQmFuZFRhYkxvbmdPZmZzZXRbc2FtcGxlcmF0ZWluZGV4XTsNCisgIHBzeUNvbmYtPnNhbXBSYXRlSWR4ID0gc2FtcGxlcmF0ZWluZGV4OworCisgIC8qCisgICAgY2FsY3VsYXRlIGJhcmMgdmFsdWVzIGZvciBlYWNoIHBiCisgICovCisgIGluaXRCYXJjVmFsdWVzKHBzeUNvbmYtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKKyAgICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCk7CisKKyAgLyoKKyAgICBpbml0IHRocmVzaG9sZHMgaW4gcXVpZXQKKyAgKi8KKyAgaW5pdFRoclF1aWV0KHBzeUNvbmYtPnNmYkNudCwKKyAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIHNmYkJhcmNWYWwsCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJUaHJlc2hvbGRRdWlldCk7CisKKyAgLyoKKyAgICBjYWxjdWxhdGUgc3ByZWFkaW5nIGZ1bmN0aW9uCisgICovCisgIGluaXRTcHJlYWRpbmcocHN5Q29uZi0+c2ZiQ250LAorICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwsCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvciwKKyAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICBiaXRyYXRlLAorICAgICAgICAgICAgICAgIExPTkdfV0lORE9XKTsKKworICAvKgorICAgIGluaXQgcmF0aW8KKyAgKi8KKyAgcHN5Q29uZi0+cmF0aW8gPSBjX3JhdGlvOyAgICAgIAorCisgIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7ICAgICAgICAgICAgICAKKyAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7ICAgIC8qIDAuMDEgKigxIDw8IDE1KSovICAKKworICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gY19tYXhDbGlwRW5lcmd5TG9uZzsgICAgICAgICAgICAgICAgICAgCisgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKChiYW5kd2lkdGg8PDEpICogRlJBTUVfTEVOX0xPTkcgLyBzYW1wbGVyYXRlKTsKKworICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKKyAgICBpZiAoc3ViKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdLCBwc3lDb25mLT5sb3dwYXNzTGluZSkgPj0gMCkKKyAgICAgIGJyZWFrOworICB9CisgIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsgICAgICAgICAgICAgICAgIAorCisgIC8qCisgICAgY2FsY3VsYXRlIG1pblNucgorICAqLworICBpbml0TWluU25yKGJpdHJhdGUsCisgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWluU25yKTsKKworCisgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQKKyogZGVzY3JpcHRpb246ICBpbml0IHNob3J0IGJsb2NrIHBzeWNob2Fjb3VzdGljIGNvbmZpZ3VyYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZikgDQoreworICBXb3JkMzIgc2FtcGxlcmF0ZWluZGV4OworICBXb3JkMTYgc2ZiQmFyY1ZhbFtNQVhfU0ZCX1NIT1JUXTsKKyAgV29yZDE2IHNmYjsKKyAgLyoKKyAgICBpbml0IHNmYiB0YWJsZQorICAqLworICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOyAgDQorICBwc3lDb25mLT5zZmJDbnQgPSBzZkJhbmRUb3RhbFNob3J0W3NhbXBsZXJhdGVpbmRleF07DQorICBwc3lDb25mLT5zZmJPZmZzZXQgPSBzZkJhbmRUYWJTaG9ydCArIHNmQmFuZFRhYlNob3J0T2Zmc2V0W3NhbXBsZXJhdGVpbmRleF07CisgIHBzeUNvbmYtPnNhbXBSYXRlSWR4ID0gc2FtcGxlcmF0ZWluZGV4OworICAvKgorICAgIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYgorICAqLworICBpbml0QmFyY1ZhbHVlcyhwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCisgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwpOworCisgIC8qCisgICAgaW5pdCB0aHJlc2hvbGRzIGluIHF1aWV0CisgICovCisgIGluaXRUaHJRdWlldChwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiVGhyZXNob2xkUXVpZXQpOworCisgIC8qCisgICAgY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbgorICAqLworICBpbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwKKyAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICBTSE9SVF9XSU5ET1cpOworCisgIC8qCisgICAgaW5pdCByYXRpbworICAqLworICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lDb25mLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSBjX21pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAKKworICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gY19tYXhDbGlwRW5lcmd5U2hvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgcHN5Q29uZi0+bG93cGFzc0xpbmUgPSBleHRyYWN0X2woKChiYW5kd2lkdGggPDwgMSkgKiBGUkFNRV9MRU5fU0hPUlQpIC8gc2FtcGxlcmF0ZSk7CisgCisgIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKykgeworICAgICAKKyAgICBpZiAocHN5Q29uZi0+c2ZiT2Zmc2V0W3NmYl0gPj0gcHN5Q29uZi0+bG93cGFzc0xpbmUpCisgICAgICBicmVhazsKKyAgfQorICBwc3lDb25mLT5zZmJBY3RpdmUgPSBzZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLyoKKyAgICBjYWxjdWxhdGUgbWluU25yCisgICovCisgIGluaXRNaW5TbnIoYml0cmF0ZSwKKyAgICAgICAgICAgICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAorICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgIHBzeUNvbmYtPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJNaW5TbnIpOworCisgIHJldHVybigwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NmE3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKQEAgLTAsMCArMSw4MTAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXBzeV9tYWluLmMNCisNCisJQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgbWFqb3IgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKKyNpbmNsdWRlICJ0cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJzcHJlYWRpbmcuaCIKKyNpbmNsdWRlICJwcmVfZWNob19jb250cm9sLmgiCisjaW5jbHVkZSAiYmFuZF9ucmcuaCIKKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInBzeV9kYXRhLmgiCisjaW5jbHVkZSAibXNfc3RlcmVvLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicHN5X21haW4uaCIKKyNpbmNsdWRlICJncnBfZGF0YS5oIgorI2luY2x1ZGUgInRuc19mdW5jLmgiCisjaW5jbHVkZSAibWVtYWxpZ24uaCIKKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHN0YXJ0ICAgICAgIHNob3J0ICAgICAgIHN0b3AgKi8KK3N0YXRpYyBXb3JkMTYgYmxvY2tUeXBlMndpbmRvd1NoYXBlW10gPSB7S0JEX1dJTkRPVyxTSU5FX1dJTkRPVyxTSU5FX1dJTkRPVyxLQkRfV0lORE9XfTsKKworLyoKKyAgZm9yd2FyZCBkZWZpbml0aW9ucworKi8KK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7CisKK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZ01TIChQU1lfREFUQSAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZyk7CisKK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7CisKK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnRNUyAoUFNZX0RBVEEgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBQc3lOZXcKKyogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYworKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyogaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBQc3lOZXcoUFNZX0tFUk5FTCAqaFBzeSwgV29yZDMyIG5DaGFuLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgV29yZDE2IGk7DQorICBXb3JkMzIgKm1kY3RTcGVjdHJ1bTsNCisgIFdvcmQzMiAqc2NyYXRjaFROUzsNCisgIFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyOw0KKyAgDQorICBtZGN0U3BlY3RydW0gPSAoV29yZDMyICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFuICogRlJBTUVfTEVOX0xPTkcgKiBzaXplb2YoV29yZDMyKSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKyAgaWYoTlVMTCA9PSBtZGN0U3BlY3RydW0pDQorCSAgcmV0dXJuIDE7DQorDQorICBzY3JhdGNoVE5TID0gKFdvcmQzMiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbiAqIEZSQU1FX0xFTl9MT05HICogc2l6ZW9mKFdvcmQzMiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsNCisgIGlmKE5VTEwgPT0gc2NyYXRjaFROUykNCisgIHsNCisJICByZXR1cm4gMTsNCisgIH0NCisNCisgIG1kY3REZWxheUJ1ZmZlciA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICogc2l6ZW9mKFdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsNCisgIGlmKE5VTEwgPT0gbWRjdERlbGF5QnVmZmVyKQ0KKyAgew0KKwkgIHJldHVybiAxOworICB9DQorDQorICBmb3IgKGk9MDsgaTxuQ2hhbjsgaSsrKXsKKyAgICBoUHN5LT5wc3lEYXRhW2ldLm1kY3REZWxheUJ1ZmZlciA9IG1kY3REZWxheUJ1ZmZlciArIGkqQkxPQ0tfU1dJVENISU5HX09GRlNFVDsgICAgICAKKyAgICBoUHN5LT5wc3lEYXRhW2ldLm1kY3RTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bSArIGkqRlJBTUVfTEVOX0xPTkc7CisgIH0KKworICBoUHN5LT5wU2NyYXRjaFRucyA9IHNjcmF0Y2hUTlM7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFBzeURlbGV0ZQorKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeWNob2Fjb3VzdGljCisqIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUHN5RGVsZXRlKFBTWV9LRVJORUwgICpoUHN5LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgV29yZDMyIG5jaDsNCisNCisgIGlmKGhQc3kpDQorICB7DQorCWlmKGhQc3ktPnBzeURhdGFbMF0ubWRjdERlbGF5QnVmZmVyKQ0KKwkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlciwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICAgICAgDQorICAgIGlmKGhQc3ktPnBzeURhdGFbMF0ubWRjdFNwZWN0cnVtKQ0KKwkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwgVk9fSU5ERVhfRU5DX0FBQyk7DQorDQorICAgIGZvciAobmNoPTA7IG5jaDxNQVhfQ0hBTk5FTFM7IG5jaCsrKXsNCisJICBoUHN5LT5wc3lEYXRhW25jaF0ubWRjdERlbGF5QnVmZmVyID0gTlVMTDsgICAgICANCisJICBoUHN5LT5wc3lEYXRhW25jaF0ubWRjdFNwZWN0cnVtID0gTlVMTDsNCisJfQ0KKw0KKwlpZihoUHN5LT5wU2NyYXRjaFRucykNCisJew0KKwkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wU2NyYXRjaFRucywgVk9fSU5ERVhfRU5DX0FBQyk7DQorCQloUHN5LT5wU2NyYXRjaFRucyA9IE5VTEw7DQorCX0NCisgIH0NCisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFBzeU91dE5ldworKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeU91dCBzdHJ1YworKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyogaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBQc3lPdXROZXcoUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIHBNZW1PUC0+U2V0KFZPX0lOREVYX0VOQ19BQUMsIGhQc3lPdXQsIDAsIHNpemVvZihQU1lfT1VUKSk7CisgIC8qCisgICAgYWxsb2Mgc29tZSBtb3JlIHN0dWZmLCB0YmQKKyAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBQc3lPdXREZWxldGUKKyogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYworKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFBzeU91dERlbGV0ZShQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgaFBzeU91dD1OVUxMOworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogcHN5TWFpbkluaXQKKyogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwc3ljaG9hY291c3RpYworKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitXb3JkMTYgcHN5TWFpbkluaXQoUFNZX0tFUk5FTCAqaFBzeSwKKyAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc01hc2ssCisgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCkKK3sKKyAgV29yZDE2IGNoLCBlcnI7CisgIFdvcmQzMiBjaGFubmVsQml0UmF0ZSA9IGJpdFJhdGUvY2hhbm5lbHM7CisKKyAgZXJyID0gSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nKGNoYW5uZWxCaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaFBzeS0+cHN5Q29uZkxvbmcpKTsNCisNCisgIGlmICghZXJyKSB7CisgICAgICBoUHN5LT5zYW1wbGVSYXRlSWR4ID0gaFBzeS0+cHN5Q29uZkxvbmcuc2FtcFJhdGVJZHg7DQorCSAgZXJyID0gSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKGJpdFJhdGUsIHNhbXBsZVJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5Q29uZkxvbmcudG5zQ29uZiwgJmhQc3ktPnBzeUNvbmZMb25nLCB0bnNNYXNrJjIpOworICB9CisKKyAgaWYgKCFlcnIpCisgICAgZXJyID0gSW5pdFBzeUNvbmZpZ3VyYXRpb25TaG9ydChjaGFubmVsQml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5Q29uZlNob3J0KTsKKyAgaWYgKCFlcnIpIHsKKyAgICBlcnIgPSBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0KGJpdFJhdGUsIHNhbXBsZVJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZTaG9ydC50bnNDb25mLCAmaFBzeS0+cHN5Q29uZlNob3J0LCB0bnNNYXNrJjEpOworICB9CisKKyAgaWYgKCFlcnIpCisgICAgZm9yKGNoPTA7Y2ggPCBjaGFubmVscztjaCsrKXsKKyAgCisgICAgICBJbml0QmxvY2tTd2l0Y2hpbmcoJmhQc3ktPnBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlLCBjaGFubmVscyk7CisKKyAgICAgIEluaXRQcmVFY2hvQ29udHJvbChoUHN5LT5wc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGRubTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZkxvbmcuc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZMb25nLnNmYlRocmVzaG9sZFF1aWV0KTsKKyAgICAgIGhQc3ktPnBzeURhdGFbY2hdLm1kY3RTY2FsZW5tMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKwlyZXR1cm4oZXJyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IHBzeU1haW4KKyogZGVzY3JpcHRpb246ICBwc3ljaG9hY291c3RpYyBtYWluIGZ1bmN0aW9uCisqIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQorKgorKiAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBlbm91Z2ggaW5wdXQgZGF0YSBpcyBpbiB0aGUgbW9kdWxvIGJ1ZmZlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitXb3JkMTYgcHN5TWFpbihXb3JkMTYgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgKmVsZW1JbmZvLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICAgICAgKnRpbWVTaWduYWwsIAorICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICAqaFBzeUNvbmZMb25nLAorICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQsCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAgICAgKnBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2hUbnMsCisJCQkgICBXb3JkMzIJCQkJICAgc2FtcGxlUmF0ZSkKK3sKKyAgV29yZDE2IG1heFNmYlBlckdyb3VwW01BWF9DSEFOTkVMU107CisgIFdvcmQxNiBtZGN0U2NhbGluZ0FycmF5W01BWF9DSEFOTkVMU107CisKKyAgV29yZDE2IGNoOyAgIC8qIGNvdW50cyB0aHJvdWdoIGNoYW5uZWxzICAgICAgICAgICovCisgIFdvcmQxNiBzZmI7ICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAqLworICBXb3JkMTYgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KKyAgV29yZDE2IGNoYW5uZWxzOworICBXb3JkMTYgbWF4U2NhbGU7CisKKyAgY2hhbm5lbHMgPSBlbGVtSW5mby0+bkNoYW5uZWxzSW5FbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1heFNjYWxlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIGJsb2NrIHN3aXRjaGluZyAqLw0KKyAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgIEJsb2NrU3dpdGNoaW5nKCZwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgdGltZVNpZ25hbCtlbGVtSW5mby0+Q2hhbm5lbEluZGV4W2NoXSwKKwkJCQkgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgIG5DaGFubmVscyk7CisgIH0KKworICAvKiBzeW5jaCBsZWZ0IGFuZCByaWdodCBibG9jayB0eXBlICovCisgIFN5bmNCbG9ja1N3aXRjaGluZygmcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVsxXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisKKyAgLyogdHJhbnNmb3JtCisgICAgIGFuZCBnZXQgbWF4U2NhbGUgKG1heCBtZGN0U2NhbGluZykgZm9yIGFsbCBjaGFubmVscyAqLworICBmb3IoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKKyAgICBUcmFuc2Zvcm1fUmVhbChwc3lEYXRhW2NoXS5tZGN0RGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgdGltZVNpZ25hbCtlbGVtSW5mby0+Q2hhbm5lbEluZGV4W2NoXSwKKyAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICYobWRjdFNjYWxpbmdBcnJheVtjaF0pLAorICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7CisgICAgbWF4U2NhbGUgPSBtYXgobWF4U2NhbGUsIG1kY3RTY2FsaW5nQXJyYXlbY2hdKTsKKyAgfQorCisgIC8qIGNvbW1vbiBzY2FsaW5nIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgZm9yIChjaD0wOyBjaDxjaGFubmVsczsgY2grKykgeworICAgIFdvcmQxNiBzY2FsZURpZmYgPSBtYXhTY2FsZSAtIG1kY3RTY2FsaW5nQXJyYXlbY2hdOworICAgICAKKyAgICBpZiAoc2NhbGVEaWZmID4gMCkgeworICAgICAgV29yZDMyICpTcGVjdHJ1bSA9IHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bTsKKwkgIGZvcihsaW5lPTA7IGxpbmU8RlJBTUVfTEVOX0xPTkc7IGxpbmUrKykgeworICAgICAgICAqU3BlY3RydW0gPSAoKlNwZWN0cnVtKSA+PiBzY2FsZURpZmY7CisJCVNwZWN0cnVtKys7CisgICAgICB9CisgICAgfQorICAgIHBzeURhdGFbY2hdLm1kY3RTY2FsZSA9IG1heFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgZm9yIChjaD0wOyBjaDxjaGFubmVsczsgY2grKykgeworICAgICAKKyAgICBpZihwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICAvKiB1cGRhdGUgbG9uZyBibG9jayBwYXJhbWV0ZXIgKi8KKwkgIGFkdmFuY2VQc3ljaExvbmcoJnBzeURhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbMSAtIGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2gpOworCisgICAgICAvKiBkZXRlcm1pbmUgbWF4U2ZiICovCisgICAgICBmb3IgKHNmYj1oUHN5Q29uZkxvbmctPnNmYkNudC0xOyBzZmI+PTA7IHNmYi0tKSB7CisgICAgICAgIGZvciAobGluZT1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIrMV0gLSAxOyBsaW5lPj1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKKyAgICAgICAgICAgCisgICAgICAgICAgaWYgKHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bVtsaW5lXSAhPSAwKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluZSA+PSBoUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdKSBicmVhazsKKyAgICAgIH0KKyAgICAgIG1heFNmYlBlckdyb3VwW2NoXSA9IHNmYiArIDE7CisKKyAgICAgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsCisgICAgICAgICBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMgZXhpc3QgKi8KKyAgICAgICAKKyAgICAgIGlmIChjaCA9PSAxKQorICAgICAgICBhZHZhbmNlUHN5Y2hMb25nTVMocHN5RGF0YSwgaFBzeUNvbmZMb25nKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBhZHZhbmNlUHN5Y2hTaG9ydCgmcHN5RGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVsxIC0gY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gpOworCisgICAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbAorICAgICAgICAgRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCisgICAgICAgCisgICAgICBpZiAoY2ggPT0gMSkKKyAgICAgICAgYWR2YW5jZVBzeWNoU2hvcnRNUyAocHN5RGF0YSwgaFBzeUNvbmZTaG9ydCk7CisgICAgfQorICB9CisKKyAgLyogZ3JvdXAgc2hvcnQgZGF0YSAqLworICBmb3IoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgCisgICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKKyAgICAgIGdyb3VwU2hvcnREYXRhKHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5TVMsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiU3ByZWFkZWRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNaW5TbnIsCisgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0W2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICZtYXhTZmJQZXJHcm91cFtjaF0sCisgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiTWluU25yW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuKTsKKyAgICB9CisgIH0KKworCisjaWYgKE1BWF9DSEFOTkVMUz4xKQorICAvKgorICAgIHN0ZXJlbyBQcm9jZXNzaW5nCisgICovCisgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0ID0gTVNfTk9ORTsgICAgICAgICAgICAgICAgIAorICAgIG1heFNmYlBlckdyb3VwWzBdID0gbWF4U2ZiUGVyR3JvdXBbMV0gPSBtYXgobWF4U2ZiUGVyR3JvdXBbMF0sIG1heFNmYlBlckdyb3VwWzFdKTsKKworICAgICAKKyAgICBpZiAocHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQorICAgICAgTXNTdGVyZW9Qcm9jZXNzaW5nKHBzeURhdGFbMF0uc2ZiRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZkxvbmctPnNmYk9mZnNldCk7CisgICAgICBlbHNlCisgICAgICAgIE1zU3RlcmVvUHJvY2Vzc2luZyhwc3lEYXRhWzBdLnNmYkVuZXJneS5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlRocmVzaG9sZC5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2Kilwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJPZmZzZXRbMF0pOworICB9CisKKyNlbmRpZiAvKiAoTUFYX0NIQU5ORUxTPjEpICovCisKKyAgLyoKKyAgICBidWlsZCBvdXRwdXQKKyAgKi8KKyAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgeworICAgICAKKyAgICBpZiAocHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICAgIEJ1aWxkSW50ZXJmYWNlKHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlNwcmVhZGVkRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uc2ZiRW5lcmd5U3VtLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uc2ZiRW5lcmd5U3VtTVMsCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUyd2luZG93U2hhcGVbcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlXSwKKyAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0sCisgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1pblNuciwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuLAorICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdKTsKKyAgICBlbHNlCisgICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJTcHJlYWRlZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bU1TLAorICAgICAgICAgICAgICAgICAgICAgU0hPUlRfV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgU0lORV9XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJPZmZzZXRbY2hdLAorICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLAorICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk1pblNucltjaF0sCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSk7CisgIH0KKworICByZXR1cm4oMCk7IC8qIG5vIGVycm9yICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBhZHZhbmNlUHN5Y2hMb25nCisqIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgZm9yIGxvbmcgYmxvY2tzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hMb25nKFBTWV9EQVRBKiBwc3lEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSogdG5zRGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNoKQoreworICBXb3JkMzIgaTsKKyAgV29yZDMyIG5vcm1FbmVyZ3lTaGlmdCA9IChwc3lEYXRhLT5tZGN0U2NhbGUgKyAxKSA8PCAxOyAvKiBpbiByZWZlcmVuY2UgY29kZSwgbWRjdCBzcGVjdHJ1bSBtdXN0IGJlIG11bHRpcGllZCB3aXRoIDIsIHNvICsxICovCisgIFdvcmQzMiBjbGlwRW5lcmd5ID0gaFBzeUNvbmZMb25nLT5jbGlwRW5lcmd5ID4+IG5vcm1FbmVyZ3lTaGlmdDsNCisgIFdvcmQzMiAqZGF0YTAsICpkYXRhMSwgdGRhdGE7CisKKyAgLyogbG93IHBhc3MgKi8KKyAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOw0KKyAgZm9yKGk9aFBzeUNvbmZMb25nLT5sb3dwYXNzTGluZTsgaTxGUkFNRV9MRU5fTE9ORzsgaSsrKSB7CisgICAgKmRhdGEwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCisgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcpOworCisgIC8qCisgICAgVE5TIGRldGVjdAorICAqLworICBUbnNEZXRlY3QodG5zRGF0YSwKKyAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKKyAgICAgICAgICAgIHBTY3JhdGNoVG5zLAorICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCisgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcpOworCisgIC8qICBUbnNTeW5jICovICAgCisgIGlmIChjaCA9PSAxKSB7CisgICAgVG5zU3luYyh0bnNEYXRhLAorICAgICAgICAgICAgdG5zRGF0YTIsCisgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKKyAgfQorCisgIC8qICBUbnMgRW5jb2RlciAqLyAKKyAgVG5zRW5jb2RlKCZwc3lPdXRDaGFubmVsLT50bnNJbmZvLAorICAgICAgICAgICAgdG5zRGF0YSwKKyAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAorICAgICAgICAgICAgaFBzeUNvbmZMb25nLT50bnNDb25mLAorICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5sb3dwYXNzTGluZSwKKyAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOworCisgIC8qIGZpcnN0IHBhcnQgb2YgdGhyZXNob2xkIGNhbGN1bGF0aW9uICovCisgIGRhdGEwID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7DQorICBkYXRhMSA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nOw0KKyAgZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKKyAgICB0ZGF0YSA9IExfbXB5X2xzKCpkYXRhMCsrLCBoUHN5Q29uZkxvbmctPnJhdGlvKTsKKyAgICAqZGF0YTErKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7DQorICB9CisKKyAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiAqLyAgIAorICBpZiAodG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUhPTApIHsKKyAgICBXb3JkMTYgdG5zU3RhcnRCYW5kID0gaFBzeUNvbmZMb25nLT50bnNDb25mLnRuc1N0YXJ0QmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSAtIHRuc1N0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcrdG5zU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcpOworICAgIA0KKwlkYXRhMCA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nOw0KKwl0ZGF0YSA9IHBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nOw0KKwlmb3IgKGk9MDsgaTx0bnNTdGFydEJhbmQ7IGkrKykKKyAgICAgIHRkYXRhICs9ICpkYXRhMCsrOw0KKw0KKwlwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZyA9IHRkYXRhOworICB9CisKKworICAvKiBzcHJlYWRpbmcgZW5lcmd5ICovCisgIFNwcmVhZGluZ01heChoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZyk7CisKKyAgLyogdGhyZXNob2xkIGluIHF1aWV0ICovCisgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmc7DQorICBkYXRhMSA9IGhQc3lDb25mTG9uZy0+c2ZiVGhyZXNob2xkUXVpZXQ7DQorICBmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkKKyAgew0KKwkgICpkYXRhMCA9IG1heCgqZGF0YTAsICgqZGF0YTEgPj4gbm9ybUVuZXJneVNoaWZ0KSk7DQorCSAgZGF0YTArKzsgZGF0YTErKzsNCisgIH0KKworICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8gICAKKyAgaWYgKHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSA9PSBTVE9QX1dJTkRPVykgeworICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xOw0KKwlmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgew0KKyAgICAgICpkYXRhMCsrID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICB9DQorICAgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKKyAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKKyAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xKTsKKyAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgCisgIGlmIChwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2U9PSBTVEFSVF9XSU5ET1cpIHsKKyAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMTsNCisJZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKKyAgICAgICpkYXRhMCsrID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIC8qIGFwcGx5IHRucyBtdWx0IHRhYmxlIG9uIGNiIHRocmVzaG9sZHMgKi8KKyAgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zUmF0aW9QYXRjaExvd2VzdENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZyk7CisKKworICAvKiBzcHJlYWRlZCBlbmVyZ3kgKi8KKyAgZGF0YTAgPSBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nOw0KKyAgZGF0YTEgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZzsNCisgIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7CisgICAgLy9wc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nW2ldID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmdbaV07ICAgICAgIA0KKwkgICpkYXRhMCsrID0gKmRhdGExKys7CisgIH0KKworICAvKiBzcHJlYWRpbmcgZW5lcmd5ICovCisgIFNwcmVhZGluZ01heChoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLCAKKyAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcpOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZ01TCisqIGRlc2NyaXB0aW9uOiAgIHVwZGF0ZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsIAorKgkJCQlmb3IgbG9uZyBibG9jaworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaExvbmdNUyAoUFNZX0RBVEEgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZykKK3sKKyAgQ2FsY0JhbmRFbmVyZ3lNUyhwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMF0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZyk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaFNob3J0CisqIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgZm9yIHNob3J0IGJsb2NrcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKK3sKKyAgV29yZDMyIHc7CisgIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLworICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mU2hvcnQtPmNsaXBFbmVyZ3kgPj4gbm9ybUVuZXJneVNoaWZ0OworICBXb3JkMzIgd09mZnNldCA9IDA7ICAgICANCisgIFdvcmQzMiAqZGF0YTAsICpkYXRhMTsKKworICBmb3IodyA9IDA7IHcgPCBUUkFOU19GQUM7IHcrKykgeworICAgIFdvcmQzMiBpLCB0ZGF0YTsKKworICAgIC8qIGxvdyBwYXNzICovCisgICAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0ICsgaFBzeUNvbmZTaG9ydC0+bG93cGFzc0xpbmU7DQorCWZvcihpPWhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9TSE9SVDsgaSsrKXsKKyAgICAgICpkYXRhMCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgKi8KKyAgICBDYWxjQmFuZEVuZXJneSggcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd10sCisgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiU2hvcnRbd10pOworICAgIC8qCisgICAgICAgVE5TCisgICAgKi8KKyAgICBUbnNEZXRlY3QodG5zRGF0YSwKKyAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZiwKKyAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCisgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKWhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddKTsKKworICAgIC8qICBUbnNTeW5jICovCisgICAgaWYgKGNoID09IDEpIHsKKyAgICAgIFRuc1N5bmModG5zRGF0YSwKKyAgICAgICAgICAgICAgdG5zRGF0YTIsCisgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCisgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7CisgICAgfQorCisgICAgVG5zRW5jb2RlKCZwc3lPdXRDaGFubmVsLT50bnNJbmZvLAorICAgICAgICAgICAgICB0bnNEYXRhLAorICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCisgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lLAorICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKKworICAgIC8qIGZpcnN0IHBhcnQgb2YgdGhyZXNob2xkIGNhbGN1bGF0aW9uICovCisgICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd107DQorCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOw0KKwlmb3IgKGk9aFBzeUNvbmZTaG9ydC0+c2ZiQ250OyBpOyBpLS0pIHsKKyAgICAgIHRkYXRhID0gTF9tcHlfbHMoKmRhdGExKyssIGhQc3lDb25mU2hvcnQtPnJhdGlvKTsKKyAgICAgICpkYXRhMCsrID0gbWluKHRkYXRhLCBjbGlwRW5lcmd5KTsNCisgICAgfQorCisgICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiAqLyAgICAgCisgICAgaWYgKHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3ddLnRuc0FjdGl2ZSAhPSAwKSB7CisgICAgICBXb3JkMTYgdG5zU3RhcnRCYW5kID0gaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNTdGFydEJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCt0bnNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgKGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSAtIHRuc1N0YXJ0QmFuZCksCisgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddK3Ruc1N0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddKTsNCisKKyAgICAgIHRkYXRhID0gcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddOw0KKwkgIGRhdGEwID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOw0KKwkgIGZvciAoaT10bnNTdGFydEJhbmQ7IGk7IGktLSkKKyAgICAgICAgdGRhdGEgKz0gKmRhdGEwKys7DQorDQorCSAgcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddID0gdGRhdGE7CisgICAgfQorCisgICAgLyogc3ByZWFkaW5nICovCisgICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XSk7CisKKworICAgIC8qIHRocmVzaG9sZCBpbiBxdWlldCAqLworICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddOw0KKwlkYXRhMSA9IGhQc3lDb25mU2hvcnQtPnNmYlRocmVzaG9sZFF1aWV0Ow0KKwlmb3IgKGk9aFBzeUNvbmZTaG9ydC0+c2ZiQ250OyBpOyBpLS0pCisgICAgew0KKwkJKmRhdGEwID0gbWF4KCpkYXRhMCwgKCpkYXRhMSA+PiBub3JtRW5lcmd5U2hpZnQpKTsNCisNCisJCWRhdGEwKys7IGRhdGExKys7DQorCX0NCisKKworICAgIC8qIHByZWVjaG8gKi8gICAgIAorICAgIFByZUVjaG9Db250cm9sKCBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTEsCisgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XSwKKyAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICB3PT0wID8gcHN5RGF0YS0+bWRjdFNjYWxlbm0xIDogcHN5RGF0YS0+bWRjdFNjYWxlKTsKKworICAgIC8qIGFwcGx5IHRucyBtdWx0IHRhYmxlIG9uIGNiIHRocmVzaG9sZHMgKi8KKyAgICBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKCBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc1N0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1t3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd10pOworCisgICAgLyogc3ByZWFkZWQgZW5lcmd5ICovCisgICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJTaG9ydFt3XTsNCisJZGF0YTEgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd107DQorCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkgeworCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKKyAgICB9CisgICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mU2hvcnQtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLCAKKyAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiU2hvcnRbd10pOworCisgICAgd09mZnNldCArPSBGUkFNRV9MRU5fU0hPUlQ7CisgIH0gLyogZm9yIFRSQU5TX0ZBQyAqLworCisgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IHBzeURhdGEtPm1kY3RTY2FsZTsgICAgICAgICAgICAgIAorCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoU2hvcnRNUworKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbCAKKyoJCQkJZm9yIHNob3J0IGJsb2NrCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnRNUyAoUFNZX0RBVEEgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCkKK3sKKyAgV29yZDMyIHcsIHdPZmZzZXQ7CisgIHdPZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvcih3PTA7IHc8VFJBTlNfRkFDOyB3KyspIHsKKyAgICBDYWxjQmFuZEVuZXJneU1TKHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzBdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddKTsKKyAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjgwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXFjX21haW4uYw0KKw0KKwlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJxY19tYWluLmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGpfdGhyLmgiCisjaW5jbHVkZSAic2ZfZXN0aW0uaCIKKyNpbmNsdWRlICJzdGF0X2JpdHMuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAiZHluX2JpdHMuaCIKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorI2luY2x1ZGUgIm1lbWFsaWduLmgiCisKKwordHlwZWRlZiBlbnVteworICBGUkFNRV9MRU5fQllURVNfTU9EVUxPID0gIDEsCisgIEZSQU1FX0xFTl9CWVRFU19JTlQgICAgPSAgMgorfUZSQU1FX0xFTl9SRVNVTFRfTU9ERTsKKworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXhGaWxsRWxlbUJpdHMgPSA3ICsgMjcwKjg7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBXb3JkMTYgY2FsY01heFZhbHVlSW5TZmIoV29yZDE2IHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJPZmZzZXRbTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHF1YW50U3BlY3RydW1bRlJBTUVfTEVOX0xPTkddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2IG1heFZhbHVlW01BWF9HUk9VUEVEX1NGQl0pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjYWxjRnJhbWVMZW4KKyogZGVzY3JpcHRpb246IGVzdGltYXRlIHRoZSBmcmFtZSBsZW5ndGggYWNjb3JkaW5nIHRoZSBiaXRyYXRlcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNhbGNGcmFtZUxlbihXb3JkMzIgYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX1JFU1VMVF9NT0RFIG1vZGUpCit7CisKKyAgV29yZDMyIHJlc3VsdDsKKyAgV29yZDMyIHF1b3Q7CisKKyAgcmVzdWx0ID0gKEZSQU1FX0xFTl9MT05HID4+IDMpICogYml0UmF0ZTsKKyAgcXVvdCA9IHJlc3VsdCAvIHNhbXBsZVJhdGU7CisKKyAgIAorICBpZiAobW9kZSA9PSBGUkFNRV9MRU5fQllURVNfTU9EVUxPKSB7CisgICAgcmVzdWx0IC09IHF1b3QgKiBzYW1wbGVSYXRlOworICB9CisgIGVsc2UgeyAvKiBGUkFNRV9MRU5fQllURVNfSU5UICovCisgICAgcmVzdWx0ID0gcXVvdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBmdW5jdGlvbiBuYW1lOmZyYW1lUGFkZGluZworKiAgZGVzY3JpcHRpb246IENhbGN1bGF0ZXMgaWYgcGFkZGluZyBpcyBuZWVkZWQgZm9yIGFjdHVhbCBmcmFtZQorKiAgcmV0dXJuczogcGFkZGluZ09uIG9yIG5vdCAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBmcmFtZVBhZGRpbmcoV29yZDMyIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGFkZGluZ1Jlc3QpCit7CisgIFdvcmQxNiBwYWRkaW5nT247CisgIFdvcmQxNiBkaWZmZXJlbmNlOworCisgIHBhZGRpbmdPbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGRpZmZlcmVuY2UgPSBjYWxjRnJhbWVMZW4oIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gKTsKKyAgKnBhZGRpbmdSZXN0ID0gKnBhZGRpbmdSZXN0IC0gZGlmZmVyZW5jZTsKKworICAgCisgIGlmICgqcGFkZGluZ1Jlc3QgPD0gMCApIHsKKyAgICBwYWRkaW5nT24gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgKnBhZGRpbmdSZXN0ID0gKnBhZGRpbmdSZXN0ICsgc2FtcGxlUmF0ZTsKKyAgfQorCisgIHJldHVybiBwYWRkaW5nT247Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBRQ091dE5ldworKiBkZXNjcmlwdGlvbjogaW5pdCBxY291dCBwYXJhbWV0ZXIKKyogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworV29yZDE2IFFDT3V0TmV3KFFDX09VVCAqaFFDLCBXb3JkMTYgbkNoYW5uZWxzLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgV29yZDMyIGk7DQorICBXb3JkMTYgKnF1YW50U3BlYzsNCisgIFdvcmQxNiAqc2NmOw0KKyAgVVdvcmQxNiAqbWF4VmFsdWVJblNmYjsJCisJDQorICBxdWFudFNwZWMgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFubmVscyAqIEZSQU1FX0xFTl9MT05HICogc2l6ZW9mKFdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsNCisgIGlmKE5VTEwgPT0gcXVhbnRTcGVjKQ0KKwkgIHJldHVybiAxOworICBzY2YgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFubmVscyAqIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7ICAgICANCisgIGlmKE5VTEwgPT0gc2NmKQ0KKyAgew0KKwkgIHJldHVybiAxOw0KKyAgfQorICBtYXhWYWx1ZUluU2ZiID0gKFVXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKFVXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICBpZihOVUxMID09IG1heFZhbHVlSW5TZmIpDQorICB7DQorCSAgcmV0dXJuIDE7DQorICB9DQorDQorICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgeworICAgIGhRQy0+cWNDaGFubmVsW2ldLnF1YW50U3BlYyA9IHF1YW50U3BlYyArIGkqRlJBTUVfTEVOX0xPTkc7CisgICAgCisgICAgaFFDLT5xY0NoYW5uZWxbaV0ubWF4VmFsdWVJblNmYiA9IG1heFZhbHVlSW5TZmIgKyBpKk1BWF9HUk9VUEVEX1NGQjsKKyAgICAKKyAgICBoUUMtPnFjQ2hhbm5lbFtpXS5zY2YgPSBzY2YgKyBpKk1BWF9HUk9VUEVEX1NGQjsKKyAgfQorIAorICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFFDT3V0RGVsZXRlCisqIGRlc2NyaXB0aW9uOiB1bmludCBxY291dCBwYXJhbWV0ZXIKKyogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFFDT3V0RGVsZXRlKFFDX09VVCogaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKK3sKKyAgIFdvcmQzMiBpOw0KKyAgIGlmKGhRQykNCisgICB7DQorICAgICAgaWYoaFFDLT5xY0NoYW5uZWxbMF0ucXVhbnRTcGVjKTsNCisJCSBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLnF1YW50U3BlYywgVk9fSU5ERVhfRU5DX0FBQyk7DQorICAgIA0KKyAgICAgIGlmKGhRQy0+cWNDaGFubmVsWzBdLm1heFZhbHVlSW5TZmIpDQorCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICAgIA0KKwkgIGlmKGhRQy0+cWNDaGFubmVsWzBdLnNjZikNCisJCSAgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5zY2YsIFZPX0lOREVYX0VOQ19BQUMpOw0KKw0KKwkgIGZvciAoaT0wOyBpPE1BWF9DSEFOTkVMUzsgaSsrKSB7DQorCQkgIGhRQy0+cWNDaGFubmVsW2ldLnF1YW50U3BlYyA9IE5VTEw7DQorCQkgIA0KKwkJICBoUUMtPnFjQ2hhbm5lbFtpXS5tYXhWYWx1ZUluU2ZiID0gTlVMTDsNCisJCSAgDQorCQkgIGhRQy0+cWNDaGFubmVsW2ldLnNjZiA9IE5VTEw7DQorCSAgfQ0KKyAgIH0gCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUUNOZXcKKyogZGVzY3JpcHRpb246IHNldCBRQyB0byB6ZXJvCisqIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUUNOZXcoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIHBNZW1PUC0+U2V0KFZPX0lOREVYX0VOQ19BQUMsIGhRQywwLHNpemVvZihRQ19TVEFURSkpOworCisgIHJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUUNEZWxldGUKKyogZGVzY3JpcHRpb246IHVuaW50IHFjb3V0IHBhcmFtZXRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgCisgIC8qIAorICAgICBub3RoaW5nIHRvIGRvCisgICovCisgIGhRQz1OVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFFDSW5pdAorKiBkZXNjcmlwdGlvbjogaW5pdCBRRCBwYXJhbWV0ZXIKKyogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBRQ0luaXQoUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgc3RydWN0IFFDX0lOSVQgKmluaXQpCit7CisgIGhRQy0+bkNoYW5uZWxzICAgICAgID0gaW5pdC0+ZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOyAgICAgICAgICAgICAgCisgIGhRQy0+bWF4Qml0c1RvdCAgICAgID0gaW5pdC0+bWF4Qml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGhRQy0+Yml0UmVzVG90ICAgICAgID0gc3ViKGluaXQtPmJpdFJlcywgaW5pdC0+YXZlcmFnZUJpdHMpOworICBoUUMtPmF2ZXJhZ2VCaXRzVG90ICA9IGluaXQtPmF2ZXJhZ2VCaXRzOyAgICAgICAgICAgICAgICAgICAgICAgIAorICBoUUMtPm1heEJpdEZhYyAgICAgICA9IGluaXQtPm1heEJpdEZhYzsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7ICAgICAgICAgICAgCisKKyAgaFFDLT5nbG9iU3RhdEJpdHMgICAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIElEX0VORCAqLyAKKworICAvKiBjaGFubmVsIGVsZW1lbnRzIGluaXQgKi8KKyAgSW5pdEVsZW1lbnRCaXRzKCZoUUMtPmVsZW1lbnRCaXRzLAorICAgICAgICAgICAgICAgICAgKmluaXQtPmVsSW5mbywKKyAgICAgICAgICAgICAgICAgIGluaXQtPmJpdHJhdGUsCisgICAgICAgICAgICAgICAgICBpbml0LT5hdmVyYWdlQml0cywKKyAgICAgICAgICAgICAgICAgIGhRQy0+Z2xvYlN0YXRCaXRzKTsKKworICAvKiB0aHJlc2hvbGQgcGFyYW1ldGVyIGluaXQgKi8KKyAgQWRqVGhySW5pdCgmaFFDLT5hZGpUaHIsCisgICAgICAgICAgICAgaW5pdC0+bWVhblBlLAorICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHMuY2hCaXRyYXRlKTsKKworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBmdW5jdGlvbiBuYW1lOiBRQ01haW4KKyogZGVzY3JpcHRpb246ICBxdWFudGl6YXRpb24gYW5kIGNvZGluZyB0aGUgc3BlY3RydW0KKyogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUUNNYWluKFFDX1NUQVRFKiBoUUMsICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCisgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCisgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKKwkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcykgICAgICAKK3sKKyAgV29yZDE2IG1heENoRHluQml0c1tNQVhfQ0hBTk5FTFNdOworICBXb3JkMTYgY2hCaXREaXN0cmlidXRpb25bTUFYX0NIQU5ORUxTXTsgIAorICBXb3JkMzIgY2g7CisgICAKKyAgaWYgKGVsQml0cy0+Yml0UmVzTGV2ZWwgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICAKKyAgaWYgKGVsQml0cy0+Yml0UmVzTGV2ZWwgPiBlbEJpdHMtPm1heEJpdFJlc0JpdHMpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkID0gY291bnRTdGF0aWNCaXRkZW1hbmQocHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIA0KKwkJCQkJCQkJCQkJCQkgIHFjT3V0RWxlbWVudC0+YWR0c1VzZWQpOworCisgICAKKyAgaWYgKGFuY2lsbGFyeURhdGFCeXRlcykgeworICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSA3ICsgKGFuY2lsbGFyeURhdGFCeXRlcyA8PCAzKTsKKyAgICAgCisgICAgaWYgKGFuY2lsbGFyeURhdGFCeXRlcyA+PSAxNSkKKyAgICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkICsgODsKKyAgfQorICBlbHNlIHsKKyAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gMDsgCisgIH0KKworICBDYWxjRm9ybUZhY3RvcihoUUMtPmxvZ1NmYkZvcm1GYWN0b3IsIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsIGhRQy0+bG9nU2ZiRW5lcmd5LCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworCisgIC8qYWRqdXN0IHRocmVzaG9sZHMgZm9yIHRoZSBkZXNpcmVkIGJpdHJhdGUgKi8KKyAgQWRqdXN0VGhyZXNob2xkcygmaFFDLT5hZGpUaHIsCisgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjaEJpdERpc3RyaWJ1dGlvbiwKKyAgICAgICAgICAgICAgICAgICBoUUMtPmxvZ1NmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICBoUUMtPnNmYk5SZWxldmFudExpbmVzLCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBxY091dEVsZW1lbnQsCisJCQkJICAgZWxCaXRzLAorCQkJCSAgIG5DaGFubmVscywKKwkJCQkgICBoUUMtPm1heEJpdEZhYyk7CisKKyAgLyplc3RpbWF0ZSBzY2FsZSBmYWN0b3JzICovCisgIEVzdGltYXRlU2NhbGVGYWN0b3JzKHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5sb2dTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKKworICAvKiBjb25kaXRpb24gdG8gcHJldmVudCBlbXB0eSBiaXRyZXNlcnZvaXIgKi8KKyAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7CisgICAgV29yZDMyIG1heER5bkJpdHM7CisgICAgbWF4RHluQml0cyA9IGVsQml0cy0+YXZlcmFnZUJpdHMgKyBlbEJpdHMtPmJpdFJlc0xldmVsIC0gNzsgLyogLTcgYmVjLiBvZiBhbGlnbiBiaXRzICovCisgICAgbWF4RHluQml0cyA9IG1heER5bkJpdHMgLSBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZDsKKyAgICBtYXhDaER5bkJpdHNbY2hdID0gZXh0cmFjdF9sKGNoQml0RGlzdHJpYnV0aW9uW2NoXSAqIG1heER5bkJpdHMgLyAxMDAwKTsKKyAgfQorCisgIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIFdvcmQzMiBjaER5bkJpdHM7CisgICAgRmxhZyAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkOworICAgIFdvcmQzMiBpdGVyOworICAgIGl0ZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBkbyB7CisgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBRdWFudGl6ZVNwZWN0cnVtKHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ubWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5zY2YsCisgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjKTsKKyAgICAgICAKKyAgICAgIGlmIChjYWxjTWF4VmFsdWVJblNmYihwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ubWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLm1heFZhbHVlSW5TZmIpID4gTUFYX1FVQU5UKSB7CisgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisKKyAgICAgIGNoRHluQml0cyA9IGR5bkJpdENvdW50KHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5tYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5zY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0Q2hhbm5lbFtjaF0uc2VjdGlvbkRhdGEpOworICAgICAgIAorICAgICAgaWYgKGNoRHluQml0cyA+PSBtYXhDaER5bkJpdHNbY2hdKSB7CisgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgICAgCisgICAgICBpZiAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkKSB7CisgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiA9IHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiArIDE7CisgICAgICB9CisKKyAgICAgIGl0ZXIgPSBpdGVyICsgMTsKKyAgICAgICAKKyAgICB9IHdoaWxlKCFjb25zdHJhaW50c0Z1bGZpbGxlZCk7CisKKyAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIGNoRHluQml0czsKKworICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlOyAgICAgICAgIAorICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrID0gcHN5T3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrOyAgICAgIAorICAgIHFjT3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGUgID0gcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGU7ICAgICAgIAorICB9CisKKyAgLyogc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uICovCisgIEFkalRoclVwZGF0ZShhZGpUaHJTdGF0ZUVsZW1lbnQsIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQpOworCisgIHsKKyAgICBXb3JkMTYgYml0UmVzU3BhY2UgPSBlbEJpdHMtPm1heEJpdFJlc0JpdHMgLSBlbEJpdHMtPmJpdFJlc0xldmVsOworICAgIFdvcmQxNiBkZWx0YUJpdFJlcyA9IGVsQml0cy0+YXZlcmFnZUJpdHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgKHFjT3V0RWxlbWVudC0+c3RhdGljQml0c1VzZWQgKworICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkKTsKKworICAgIHFjT3V0RWxlbWVudC0+ZmlsbEJpdHMgPSBtYXgoMCwgKGRlbHRhQml0UmVzIC0gYml0UmVzU3BhY2UpKTsKKyAgfQorCisgIHJldHVybiAwOyAvKiBPSyAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY2FsY01heFZhbHVlSW5TZmIKKyogZGVzY3JpcHRpb246ICBzZWFyY2ggdGhlIG1heCBTcGVjdHJ1bSBpbiBvbmUgc2ZiCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjYWxjTWF4VmFsdWVJblNmYihXb3JkMTYgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk9mZnNldFtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjdHJ1bVtGUkFNRV9MRU5fTE9OR10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgbWF4VmFsdWVbTUFYX0dST1VQRURfU0ZCXSkKK3sKKyAgV29yZDE2IHNmYk9mZnMsIHNmYjsKKyAgV29yZDE2IG1heFZhbHVlQWxsOworCisgIG1heFZhbHVlQWxsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgIFdvcmQxNiBsaW5lOworICAgICAgV29yZDE2IG1heFRoaXNTZmI7CisgICAgICBtYXhUaGlzU2ZiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZm9yIChsaW5lID0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXTsgbGluZSA8IHNmYk9mZnNldFtzZmJPZmZzK3NmYisxXTsgbGluZSsrKSB7CisgICAgICAgIFdvcmQxNiBhYnNWYWw7CisgICAgICAgIGFic1ZhbCA9IGFic19zKHF1YW50U3BlY3RydW1bbGluZV0pOworICAgICAgICBtYXhUaGlzU2ZiID0gbWF4KG1heFRoaXNTZmIsIGFic1ZhbCk7CisgICAgICB9CisKKyAgICAgIG1heFZhbHVlW3NmYk9mZnMrc2ZiXSA9IG1heFRoaXNTZmI7ICAgICAgICAgICAgICAgIAorICAgICAgbWF4VmFsdWVBbGwgPSBtYXgobWF4VmFsdWVBbGwsIG1heFRoaXNTZmIpOworICAgIH0KKyAgfQorICByZXR1cm4gbWF4VmFsdWVBbGw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB1cGRhdGVCaXRyZXMKKyogZGVzY3JpcHRpb246IHVwZGF0ZSBiaXRyZXNlcnZvaXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHVwZGF0ZUJpdHJlcyhRQ19TVEFURSogcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICBRQ19PVVQqICAgcWNPdXQpCisgICAgICAgICAgICAgICAgICAKK3sKKyAgRUxFTUVOVF9CSVRTICplbEJpdHM7CisgCisgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBlbEJpdHMgPSAmcWNLZXJuZWwtPmVsZW1lbnRCaXRzOworCisgICAKKyAgaWYgKGVsQml0cy0+YXZlcmFnZUJpdHMgPiAwKSB7CisgICAgLyogY29uc3RhbnQgYml0cmF0ZSAqLworICAgIFdvcmQxNiBiaXRzVXNlZDsKKyAgICBiaXRzVXNlZCA9IChxY091dC0+cWNFbGVtZW50LnN0YXRpY0JpdHNVc2VkICsgcWNPdXQtPnFjRWxlbWVudC5keW5CaXRzVXNlZCkgKworICAgICAgICAgICAgICAgICAgIChxY091dC0+cWNFbGVtZW50LmFuY0JpdHNVc2VkICsgcWNPdXQtPnFjRWxlbWVudC5maWxsQml0cyk7CisgICAgZWxCaXRzLT5iaXRSZXNMZXZlbCA9IGVsQml0cy0+Yml0UmVzTGV2ZWwgKyAoZWxCaXRzLT5hdmVyYWdlQml0cyAtIGJpdHNVc2VkKTsKKyAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gcWNLZXJuZWwtPmJpdFJlc1RvdCArIGVsQml0cy0+Yml0UmVzTGV2ZWw7CisgIH0KKyAgZWxzZSB7CisgICAgLyogdmFyaWFibGUgYml0cmF0ZSAqLworICAgIGVsQml0cy0+Yml0UmVzTGV2ZWwgPSBlbEJpdHMtPm1heEJpdHM7ICAgICAgICAgICAKKyAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gcWNLZXJuZWwtPm1heEJpdHNUb3Q7ICAgICAgCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uCisqIGRlc2NyaXB0aW9uOiBjb3VudCBiaXRzIHVzZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgRmluYWxpemVCaXRDb25zdW1wdGlvbihRQ19TVEFURSAqcWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KQoreworICBXb3JkMzIgbkZ1bGxGaWxsRWxlbTsNCisgIFdvcmQzMiB0b3RGaWxsQml0czsNCisgIFdvcmQxNiBkaWZmQml0czsgIAorICBXb3JkMTYgYml0c1VzZWQ7CisKKyAgdG90RmlsbEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCA9IHFjS2VybmVsLT5nbG9iU3RhdEJpdHM7ICAgICAKKyAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICs9IHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQ7CisgIHFjT3V0LT50b3REeW5CaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQ7CisgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQ7CisgIHFjT3V0LT50b3RGaWxsQml0cyAgICAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7CisgICAKKyAgaWYgKHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMpIHsKKyAgICB0b3RGaWxsQml0cyArPSBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzOworICB9CisKKyAgbkZ1bGxGaWxsRWxlbSA9IChtYXgoKHFjT3V0LT50b3RGaWxsQml0cyAtIDEpLCAwKSAvIG1heEZpbGxFbGVtQml0cykgKiBtYXhGaWxsRWxlbUJpdHM7DQorICAKKyAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzIC0gbkZ1bGxGaWxsRWxlbTsKKworICAvKiBjaGVjayBmaWxsIGVsZW1lbnRzICovCisgICAKKyAgaWYgKHFjT3V0LT50b3RGaWxsQml0cyA+IDApIHsKKyAgICAvKiBtaW5pbXVtIEZpbGxlbGVtZW50IGNvbnRhaW5zIDcgKFRBRyArIGJ5dGUgY250KSBiaXRzICovCisgICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gbWF4KDcsIHFjT3V0LT50b3RGaWxsQml0cyk7CisgICAgLyogZmlsbCBlbGVtZW50IHNpemUgZXF1YWxzIG4qOCArIDcgKi8KKyAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgKyAoKDggLSAoKHFjT3V0LT50b3RGaWxsQml0cyAtIDcpICYgMHgwMDA3KSkgJiAweDAwMDcpOyAgICAgCisgIH0KKworICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgKyBuRnVsbEZpbGxFbGVtOworCisgIC8qIG5vdyBkaXN0cmlidXRlIGV4dHJhIGZpbGxiaXRzIGFuZCBhbGlnbmJpdHMgb3ZlciBjaGFubmVsIGVsZW1lbnRzICovCisgIHFjT3V0LT5hbGlnbkJpdHMgPSA3IC0gKChxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEFuY0JpdHNVc2VkICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gMSkgJiAweDAwMDcpOyAgICAgICAgICAgICAKKworICAgICAKKyAgaWYgKCAocWNPdXQtPmFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzID09IDgpICYmCisgICAgICAgKHFjT3V0LT50b3RGaWxsQml0cyA+IDgpKQorICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyAtIDg7CisKKyAgIAorICBkaWZmQml0cyA9IHFjT3V0LT5hbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0czsKKyAgIAorICBpZihkaWZmQml0cz49MCkgeworICAgIHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMgKz0gZGlmZkJpdHM7CisgIH0KKworICBiaXRzVXNlZCA9IHFjT3V0LT50b3REeW5CaXRzVXNlZCArIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCArIHFjT3V0LT50b3RBbmNCaXRzVXNlZDsKKyAgYml0c1VzZWQgPSBiaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5hbGlnbkJpdHM7CisgICAKKyAgaWYgKGJpdHNVc2VkID4gcWNLZXJuZWwtPm1heEJpdHNUb3QpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGJpdHNVc2VkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQWRqdXN0Qml0cmF0ZQorKiBkZXNjcmlwdGlvbjogIGFkanVzdHMgZnJhbWVsZW5ndGggdmlhIHBhZGRpbmcgb24gYSBmcmFtZSB0byBmcmFtZSBiYXNpcywKKyogICAgICAgICAgICAgICB0byBhY2hpZXZlIGEgYml0cmF0ZSB0aGF0IGRlbWFuZHMgYSBub24gYnl0ZSBhbGlnbmVkCisqICAgICAgICAgICAgICAgZnJhbWVsZW5ndGgKKyogcmV0dXJuOiAgICAgICBlcnJvcmNvZGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAgICAgICAgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgYml0UmF0ZSwgICAgLyogdG90YWwgYml0cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICBzYW1wbGVSYXRlKSAvKiBvdXRwdXQgc2FtcGxpbmcgcmF0ZSAqLworeworICBXb3JkMTYgcGFkZGluZ09uOworICBXb3JkMTYgZnJhbWVMZW47CisgIFdvcmQxNiBjb2RlQml0czsKKyAgV29yZDE2IGNvZGVCaXRzTGFzdDsKKworICAvKiBEbyB3ZSBuZWVkIGEgZXh0cmEgcGFkZGluZyBieXRlPyAqLworICBwYWRkaW5nT24gPSBmcmFtZVBhZGRpbmcoYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFDLT5wYWRkaW5nLnBhZGRpbmdSZXN0KTsKKworICAvKiBmcmFtZSBsZW5ndGggKi8KKyAgZnJhbWVMZW4gPSBwYWRkaW5nT24gKyBjYWxjRnJhbWVMZW4oYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX0lOVCk7CisKKyAgZnJhbWVMZW4gPSBmcmFtZUxlbiA8PCAzOworICBjb2RlQml0c0xhc3QgPSBoUUMtPmF2ZXJhZ2VCaXRzVG90IC0gaFFDLT5nbG9iU3RhdEJpdHM7CisgIGNvZGVCaXRzICAgICA9IGZyYW1lTGVuIC0gaFFDLT5nbG9iU3RhdEJpdHM7CisKKyAgLyogY2FsY3VsYXRlIGJpdHMgZm9yIGV2ZXJ5IGNoYW5uZWwgZWxlbWVudCAqLyAgIAorICBpZiAoY29kZUJpdHMgIT0gY29kZUJpdHNMYXN0KSB7CisgICAgV29yZDE2IHRvdGFsQml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzID0gKGhRQy0+ZWxlbWVudEJpdHMucmVsYXRpdmVCaXRzICogY29kZUJpdHMpID4+IDE2OyAvKiByZWxhdGl2ZUJpdHMgd2FzIHNjYWxlZCBkb3duIGJ5IDIgKi8KKyAgICB0b3RhbEJpdHMgKz0gaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0czsKKworICAgIGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHMgPSBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzICsgKGNvZGVCaXRzIC0gdG90YWxCaXRzKTsKKyAgfQorCisgIGhRQy0+YXZlcmFnZUJpdHNUb3QgPSBmcmFtZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3F1YW50aXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWYxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlxdWFudGl6ZS5jDQorDQorCUNvbnRlbnQ6CXF1YW50aXphdGlvbiBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInF1YW50aXplLmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorCisjZGVmaW5lIE1BTlRfRElHSVRTIDkKKyNkZWZpbmUgTUFOVF9TSVpFICAgKDE8PE1BTlRfRElHSVRTKQorCitzdGF0aWMgY29uc3QgV29yZDMyIFhST1VORCA9IDB4MzNlNDI1YWY7IC8qIGZpbmFsIHJvdW5kaW5nIGNvbnN0YW50ICgtMC4wOTQ2ZisgMC41ZikgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpwb3czNCAKKyogZGVzY3JpcHRpb246IGNhbGN1bGF0ZSAkeF57XGZyYWN7M317NH19LCBmb3IgMC41IDwgeCA8IDEuMCQuICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX19pbmxpbmUgV29yZDMyIHBvdzM0KFdvcmQzMiB4KQoreworICAvKiBpbmRleCB0YWJsZSB1c2luZyBNQU5UX0RJR0lUUyBiaXRzLCBidXQgbWFzayBvdXQgdGhlIHNpZ24gYml0IGFuZCB0aGUgTVNCCisgICAgIHdoaWNoIGlzIGFsd2F5cyBvbmUgKi8gICAKKyAgcmV0dXJuIG1UYWJfM180Wyh4ID4+IChJTlRfQklUUy0yLU1BTlRfRElHSVRTKSkgJiAoTUFOVF9TSVpFLTEpXTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpxdWFudGl6ZVNpbmdsZUxpbmUgCisqIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0gIAorKiAgICAgICAgICAgICAgcXVhU3BlY3RydW0gPSBtZGN0U3BlY3RydW1eMy80KjJeKC0oMy8xNikqZ2FpbikgICAgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgcXVhbnRpemVTaW5nbGVMaW5lKGNvbnN0IFdvcmQxNiBnYWluLCBjb25zdCBXb3JkMzIgYWJzU3BlY3RydW0pCit7CisgIFdvcmQzMiBlLCBtaW51c0ZpbmFsRXhwLCBmaW5hbFNoaWZ0OworICBXb3JkMzIgeDsKKyAgV29yZDE2IHF1YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIAorICBpZiAoYWJzU3BlY3RydW0pIHsKKyAgICBlID0gbm9ybV9sKGFic1NwZWN0cnVtKTsKKyAgICB4ID0gcG93MzQoYWJzU3BlY3RydW0gPDwgZSk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGZpbmFsIGZyYWN0aW9uYWwgZXhwb25lbnQgdGltZXMgMTYgKHdhcyAzKig0KmUgKyBnYWluKSArIChJTlRfQklUUy0xKSoxNikgKi8KKyAgICBtaW51c0ZpbmFsRXhwID0gKGUgPDwgMikgKyBnYWluOworICAgIG1pbnVzRmluYWxFeHAgPSAobWludXNGaW5hbEV4cCA8PCAxKSArIG1pbnVzRmluYWxFeHA7CisgICAgbWludXNGaW5hbEV4cCA9IG1pbnVzRmluYWxFeHAgKyAoKElOVF9CSVRTLTEpIDw8IDQpOworCisgICAgLyogc2VwYXJhdGUgdGhlIGV4cG9uZW50IGludG8gYSBzaGlmdCwgYW5kIGEgbXVsdGlwbHkgKi8KKyAgICBmaW5hbFNoaWZ0ID0gbWludXNGaW5hbEV4cCA+PiA0OworICAgICAKKyAgICBpZiAoZmluYWxTaGlmdCA8IElOVF9CSVRTKSB7CisgICAgICB4ID0gTF9tcHlfd3goeCwgcG93MnRvbWludXNOb3ZlcjE2W21pbnVzRmluYWxFeHAgJiAxNV0pOworCisgICAgICB4ICs9IFhST1VORCA+PiAoSU5UX0JJVFMgLSBmaW5hbFNoaWZ0KTsKKworICAgICAgLyogc2hpZnQgYW5kIHF1YW50aXplICovDQorCSAgZmluYWxTaGlmdC0tOw0KKw0KKwkgIGlmKGZpbmFsU2hpZnQgPj0gMCkNCisJCSAgeCA+Pj0gZmluYWxTaGlmdDsNCisJICBlbHNlDQorCQkgIHggPDw9ICgtZmluYWxTaGlmdCk7DQorCQkNCisJICBxdWEgPSBzYXR1cmF0ZSh4KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcXVhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpxdWFudGl6ZUxpbmVzIAorKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHNwZWN0cnVtIGxpbmVzICAKKyogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pICAgIAorKiAgaW5wdXQ6IGdsb2JhbCBnYWluLCBudW1iZXIgb2YgbGluZXMgdG8gcHJvY2Vzcywgc3BlY3RyYWwgZGF0YSAgICAgICAgIAorKiAgb3V0cHV0OiBxdWFudGl6ZWQgc3BlY3RydW0KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcXVhbnRpemVMaW5lcyhjb25zdCBXb3JkMTYgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhU3BlY3RydW0pCit7CisgIFdvcmQzMiBsaW5lOworICBXb3JkMzIgbSA9IGdhaW4mMzsKKyAgV29yZDMyIGcgPSAoZ2FpbiA+PiAyKSArIDQ7DQorICBXb3JkMzIgbWRjdFNwZUw7DQorICBXb3JkMTYgKnBxdWF0OworICAgIC8qIGdhaW4mMyAqLw0KKw0KKyAgcHF1YXQgPSBxdWFudEJvcmRlcnNbbV07DQorDQorICBnICs9IDE2Ow0KKyAgDQorICBpZihnID49IDApDQorICB7DQorCWZvciAobGluZT0wOyBsaW5lPG5vT2ZMaW5lczsgbGluZSsrKSB7CisJICBXb3JkMzIgcXVhOworCSAgcXVhID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIA0KKwkgIG1kY3RTcGVMID0gbWRjdFNwZWN0cnVtW2xpbmVdOw0KKwkKKwkgIGlmIChtZGN0U3BlTCkgeworCQlXb3JkMzIgc2E7CisJCVdvcmQzMiBzYVNoZnQ7CisKKyAgICAgICAgc2EgPSBMX2FicyhtZGN0U3BlTCk7CisgICAgICAgIC8vc2FTaGZ0ID0gTF9zaHIoc2EsIDE2ICsgZyk7DQorCSAgICBzYVNoZnQgPSBzYSA+PiBnOworCisgICAgICAgIGlmIChzYVNoZnQgPiBwcXVhdFswXSkgeworICAgICAgICAgCisgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7CisgICAgICAgICAgICAgCisgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOworCQkgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMiA6IC0yOworCQkJfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgeworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMyA6IC0zOworCQkJICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHF1YSA9IHF1YW50aXplU2luZ2xlTGluZShnYWluLCBzYSk7CisgICAgICAgICAgICAgICAgLyogYWRqdXN0IHRoZSBzaWduLiBTaW5jZSAwIDwgcXVhIDwgMSwgdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuICovCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobWRjdFNwZUwgPCAwKQorICAgICAgICAgICAgICAgICAgcXVhID0gLXF1YTsKKwkJCSAgfQorCQkJfQorCQkgIH0KKwkJfQorCSAgfQorICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSBxdWEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0NCisgIH0NCisgIGVsc2UNCisgIHsNCisJZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsNCisJICBXb3JkMzIgcXVhOw0KKwkgIHF1YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgDQorCSAgbWRjdFNwZUwgPSBtZGN0U3BlY3RydW1bbGluZV07DQorCQ0KKwkgIGlmIChtZGN0U3BlTCkgew0KKwkJV29yZDMyIHNhOw0KKwkJV29yZDMyIHNhU2hmdDsNCisNCisgICAgICAgIHNhID0gTF9hYnMobWRjdFNwZUwpOw0KKyAgICAgICAgc2FTaGZ0ID0gc2EgPDwgZzsNCisNCisgICAgICAgIGlmIChzYVNoZnQgPiBwcXVhdFswXSkgew0KKyAgICAgICAgIA0KKyAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbMV0pIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDEgOiAtMTsNCisJCSAgfQ0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgew0KKyAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsNCisJCQl9DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7DQorICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsNCisJCQkgIH0NCisgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOw0KKyAgICAgICAgICAgICAgICAvKiBhZGp1c3QgdGhlIHNpZ24uIFNpbmNlIDAgPCBxdWEgPCAxLCB0aGlzIGNhbm5vdCBvdmVyZmxvdy4gKi8NCisgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkNCisgICAgICAgICAgICAgICAgICBxdWEgPSAtcXVhOw0KKwkJCSAgfQ0KKwkJCX0NCisJCSAgfQ0KKwkJfQ0KKwkgIH0NCisgICAgICBxdWFTcGVjdHJ1bVtsaW5lXSA9IHF1YSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCX0JICANCisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmlxdWFudGl6ZUxpbmVzIAorKiBkZXNjcmlwdGlvbjogaXF1YW50aXplcyBzcGVjdHJ1bSBsaW5lcyB3aXRob3V0IHNpZ24KKyogICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSA9IGlxdWFTcGVjdHJ1bV40LzMgKjJeKDAuMjUqZ2FpbikgCisqIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MscXVhbnRpemVkIHNwZWN0cnVtICAgICAgICAKKyogb3V0cHV0OiBzcGVjdHJhbCBkYXRhCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGlxdWFudGl6ZUxpbmVzKGNvbnN0IFdvcmQxNiBnYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5vT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqbWRjdFNwZWN0cnVtKQoreworICBXb3JkMzIgICBpcXVhbnRpemVybW9kOworICBXb3JkMzIgICBpcXVhbnRpemVyc2hpZnQ7CisgIFdvcmQzMiAgIGxpbmU7CisKKyAgaXF1YW50aXplcm1vZCA9IGdhaW4gJiAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpcXVhbnRpemVyc2hpZnQgPSBnYWluID4+IDI7CisKKyAgZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKKyAgICAgCisgICAgaWYoIHF1YW50U3BlY3RydW1bbGluZV0gIT0gMCApIHsKKyAgICAgIFdvcmQzMiBhY2N1OworICAgICAgV29yZDMyIGV4OworCSAgV29yZDMyIHRhYkluZGV4OworICAgICAgV29yZDMyIHNwZWNFeHA7CisgICAgICBXb3JkMzIgcyx0OworCisgICAgICBhY2N1ID0gcXVhbnRTcGVjdHJ1bVtsaW5lXTsKKworICAgICAgZXggPSBub3JtX2woYWNjdSk7CisgICAgICBhY2N1ID0gYWNjdSA8PCBleDsKKyAgICAgIHNwZWNFeHAgPSBJTlRfQklUUy0xIC0gZXg7CisKKyAgICAgIHRhYkluZGV4ID0gKGFjY3UgPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsgICAgICAgIAorCisgICAgICAvKiBjYWxjdWxhdGUgIm1hbnRpc3NhIiBeNC8zICovCisgICAgICBzID0gbVRhYl80XzNbdGFiSW5kZXhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoIHNjZk1vZCAqLworICAgICAgdCA9IHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIC8qIG11bHRpcGx5ICJtYW50aXNzYSIgXjQvMyB3aXRoIGV4cG9uZW50IG11bHRpcGxpZXIgKi8KKyAgICAgIGFjY3UgPSBNVUxISUdIKHMsIHQpOworCisgICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IHNoaWZ0ZXIgKi8KKyAgICAgIHNwZWNFeHAgPSBzcGVjRXhwVGFibGVDb21iX2VuY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBzcGVjRXhwICs9IGlxdWFudGl6ZXJzaGlmdCArIDE7DQorCSAgaWYoc3BlY0V4cCA+PSAwKQ0KKwkJICBtZGN0U3BlY3RydW1bbGluZV0gPSBhY2N1IDw8IHNwZWNFeHA7DQorCSAgZWxzZQ0KKwkJICBtZGN0U3BlY3RydW1bbGluZV0gPSBhY2N1ID4+ICgtc3BlY0V4cCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbWRjdFNwZWN0cnVtW2xpbmVdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBRdWFudGl6ZVNwZWN0cnVtCisqIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgdGhlIGVudGlyZSBzcGVjdHJ1bQorKiByZXR1cm5zOgorKiBpbnB1dDogbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIHRvIGJlIHF1YW50aXplZCwgLi4uCisqIG91dHB1dDogcXVhbnRpemVkIHNwZWN0cnVtCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUXVhbnRpemVTcGVjdHJ1bShXb3JkMTYgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2FsZWZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFudGl6ZWRTcGVjdHJ1bSkKK3sKKyAgV29yZDMyIHNmYk9mZnMsIHNmYjsKKworICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKSB7CisgICAgV29yZDMyIHNmYk5leHQgOworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYiA9IHNmYk5leHQpIHsKKyAgICAgIFdvcmQxNiBzY2FsZWZhY3RvciA9IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIC8qIGNvYWxlc2NlIHNmYnMgd2l0aCB0aGUgc2FtZSBzY2FsZWZhY3RvciAqLworICAgICAgZm9yIChzZmJOZXh0ID0gc2ZiKzE7CisgICAgICAgICAgIHNmYk5leHQgPCBtYXhTZmJQZXJHcm91cCAmJiBzY2FsZWZhY3RvciA9PSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJOZXh0XTsKKyAgICAgICAgICAgc2ZiTmV4dCsrKSA7CisKKyAgICAgIHF1YW50aXplTGluZXMoZ2xvYmFsR2FpbiAtIHNjYWxlZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJOZXh0XSAtIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCisgICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCisgICAgICAgICAgICAgICAgICAgIHF1YW50aXplZFNwZWN0cnVtICsgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSk7CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6Y2FsY1NmYkRpc3QgCisqIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgYW5kIHJlcXVhbnRpemVzIGxpbmVzIHRvIGNhbGN1bGF0ZSBkaXN0b3J0aW9uCisqIGlucHV0OiAgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHF1YW50aXplZCwgLi4uCisqIG91dHB1dDogZGlzdG9ydGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMzIgY2FsY1NmYkRpc3QoY29uc3QgV29yZDMyICpzcGVjLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2ZiV2lkdGgsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICBnYWluKQoreworICBXb3JkMzIgbGluZTsKKyAgV29yZDMyIGRpc3Q7CisgIFdvcmQzMiBtID0gZ2FpbiYzOworICBXb3JkMzIgZyA9IChnYWluID4+IDIpICsgNDsNCisgIFdvcmQzMiBnMiA9IChnIDw8IDEpICsgMTsNCisgIFdvcmQxNiAqcHF1YXQsICpyZXBxdWF0Ow0KKyAgICAvKiBnYWluJjMgKi8KKw0KKyAgcHF1YXQgPSBxdWFudEJvcmRlcnNbbV07DQorICByZXBxdWF0ID0gcXVhbnRSZWNvblttXTsKKwkNCisgIGRpc3QgPSAwOyAgDQorICBnICs9IDE2Ow0KKyAgaWYoZzIgPCAwICYmIGcgPj0gMCkNCisgIHsJICAKKwkgIGcyID0gLWcyOw0KKwkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewkJICAKKwkJICBpZiAoc3BlY1tsaW5lXSkgewkJCSAgCisJCQkgIFdvcmQzMiBkaWZmOworCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsKKwkJCSAgV29yZDMyIHNhOworCQkJICBXb3JkMzIgc2FTaGZ0OworCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOworCQkJICAvL3NhU2hmdCA9IHJvdW5kMTYoTF9zaHIoc2EsIGcpKTsKKwkJCSAgLy9zYVNoZnQgPSBMX3NocihzYSwgMTYrZyk7DQorCQkJICBzYVNoZnQgPSBzYSA+PiBnOw0KKworCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMF0pIHsNCisJCQkJICBkaXN0U2luZ2xlID0gKHNhU2hmdCAqIHNhU2hmdCkgPj4gZzI7DQorCQkJICB9DQorCQkJICBlbHNlIHsNCisJCQkJICANCisJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMV0pIHsNCisJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMF07DQorCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOw0KKwkJCQkgIH0NCisJCQkJICBlbHNlIHsNCisJCQkJCSAgDQorCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgew0KKwkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMV07DQorCQkJCQkJICBkaXN0U2luZ2xlID0gKGRpZmYgKiBkaWZmKSA+PiBnMjsNCisJCQkJCSAgfQ0KKwkJCQkJICBlbHNlIHsNCisJCQkJCQkgIA0KKwkJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7DQorCQkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMl07DQorCQkJCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7DQorCQkJCQkJICB9DQorCQkJCQkJICBlbHNlIHsNCisJCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsNCisJCQkJCQkJICBXb3JkMzIgaXF2YWwsIGRpZmYzMjsNCisJCQkJCQkJICAvKiBub3cgdGhhdCB3ZSBoYXZlIHF1YW50aXplZCB4LCByZS1xdWFudGl6ZSBpdC4gKi8NCisJCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOw0KKwkJCQkJCQkgIGRpZmYzMiA9IHNhIC0gaXF2YWw7DQorCQkJCQkJCSAgZGlzdFNpbmdsZSA9IGZpeG11bChkaWZmMzIsIGRpZmYzMik7DQorCQkJCQkJICB9DQorCQkJCQkgIH0NCisJCQkJICB9DQorCQkJICB9DQorCQkJICANCisJCQkgIGRpc3QgPSBMX2FkZChkaXN0LCBkaXN0U2luZ2xlKTsNCisJCSAgfQorCSAgfQ0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKwkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewkJICANCisJCSAgaWYgKHNwZWNbbGluZV0pIHsJCQkgIA0KKwkJCSAgV29yZDMyIGRpZmY7DQorCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsNCisJCQkgIFdvcmQzMiBzYTsNCisJCQkgIFdvcmQzMiBzYVNoZnQ7DQorCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOw0KKwkJCSAgLy9zYVNoZnQgPSByb3VuZDE2KExfc2hyKHNhLCBnKSk7DQorCQkJICBzYVNoZnQgPSBMX3NocihzYSwgZyk7DQorDQorCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMF0pIHsNCisJCQkJICBkaXN0U2luZ2xlID0gTF9zaGwoKHNhU2hmdCAqIHNhU2hmdCksIGcyKTsNCisJCQkgIH0NCisJCQkgIGVsc2Ugew0KKwkJCQkgIA0KKwkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgew0KKwkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFswXTsNCisJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsNCisJCQkJICB9DQorCQkJCSAgZWxzZSB7DQorCQkJCQkgIA0KKwkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsNCisJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzFdOw0KKwkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsNCisJCQkJCSAgfQ0KKwkJCQkJICBlbHNlIHsNCisJCQkJCQkgIA0KKwkJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7DQorCQkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMl07DQorCQkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsNCisJCQkJCQkgIH0NCisJCQkJCQkgIGVsc2Ugew0KKwkJCQkJCQkgIFdvcmQxNiBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOw0KKwkJCQkJCQkgIFdvcmQzMiBpcXZhbCwgZGlmZjMyOw0KKwkJCQkJCQkgIC8qIG5vdyB0aGF0IHdlIGhhdmUgcXVhbnRpemVkIHgsIHJlLXF1YW50aXplIGl0LiAqLw0KKwkJCQkJCQkgIGlxdWFudGl6ZUxpbmVzKGdhaW4sIDEsICZxdWEsICZpcXZhbCk7DQorCQkJCQkJCSAgZGlmZjMyID0gc2EgLSBpcXZhbDsNCisJCQkJCQkJICBkaXN0U2luZ2xlID0gZml4bXVsKGRpZmYzMiwgZGlmZjMyKTsNCisJCQkJCQkgIH0NCisJCQkJCSAgfQ0KKwkJCQkgIH0NCisJCQkgIH0NCisJCQkgIGRpc3QgPSBMX2FkZChkaXN0LCBkaXN0U2luZ2xlKTsNCisJCSAgfQ0KKwkgIH0JICANCisgIH0KKworICByZXR1cm4gZGlzdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGIzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCkBAIC0wLDAgKzEsODgyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlzZl9lc3RpbS5jDQorDQorCUNvbnRlbnQ6CVNjYWxlIGZhY3RvciBlc3RpbWF0aW9uIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInNmX2VzdGltLmgiCisjaW5jbHVkZSAicXVhbnRpemUuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorCitzdGF0aWMgY29uc3QgV29yZDE2IE1BWF9TQ0ZfREVMVEEgPSA2MDsKKworLyohCitjb25zdGFudHMgcmVmZXJlbmNlIGluIGNvbW1lbnRzIAorCisgQzAgPSA2Ljc1ZjsKKyBDMSA9IC02OS4zMzI5NWY7ICAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikgCisgQzIgPSA0LjBmOworIEMzID0gMi42NjY2NjY2NmY7CisgCisgIFBFX0MxID0gMy4wZjsgICAgICAgIGxvZyg4LjApL2xvZygyKSAKKyAgUEVfQzIgPSAxLjMyMTkyODFmOyAgbG9nKDIuNSkvbG9nKDIpIAorICBQRV9DMyA9IDAuNTU5MzU3M2Y7ICAxLUMyL0MxIAorICAKKyovCisKKyNkZWZpbmUgRkZfU1FSVF9CSVRTICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEZGX1NRUlRfVEFCTEVfU0laRSAgICAgICAgICAgICAgKDE8PEZGX1NRUlRfQklUUyAtIDE8PChGRl9TUVJUX0JJVFMtMikpCisjZGVmaW5lIENPRUYwOF8zMQkJMHg2NjY2NjY2NgkJLyogMC44KigxIDw8IDMxKSAqLw0KKyNkZWZpbmUgUEVfQzFfOAkJCTI0CQkJCS8qIFBFX0MxKjggKi8NCisjZGVmaW5lIFBFX0MyXzE2CQkyMQkJCQkvKiBQRV9DMio4L1BFX0MzICovDQorI2RlZmluZSBQRV9TQ0FMRQkJMHgwNTlhCQkJLyogMC43ICogKDEgPDwgKDE1IC0gMSAtIDMpKSovDQorDQorI2RlZmluZSBTQ0FMRV9FU1RJTUFURV9DT0VGCTB4NTU1NQkJLyogKDguODU4NS8oNCpsb2cyKDEwKSkpICogKDEgPDwgMTUpKi8NCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZm9ybWZhY19zcXJ0CisqIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBzcXJ0KHgpLzI1NiAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitfX2lubGluZSBXb3JkMzIgZm9ybWZhY19zcXJ0KFdvcmQzMiB4KQoreworCVdvcmQzMiB5OworCVdvcmQzMiBwcmVzaGlmdCwgcG9zdHNoaWZ0OworCQorCQorCWlmICh4PT0wKSByZXR1cm4gMDsKKwlwcmVzaGlmdCAgPSBub3JtX2woeCkgLSAoSU5UX0JJVFMtMS1GRl9TUVJUX0JJVFMpOworCXBvc3RzaGlmdCA9IHByZXNoaWZ0ID4+IDE7CisJcHJlc2hpZnQgID0gcG9zdHNoaWZ0IDw8IDE7CisJcG9zdHNoaWZ0ID0gcG9zdHNoaWZ0ICsgODsJICAvKiBzcXJ0LzI1NiAqLworCWlmKHByZXNoaWZ0ID49IDApDQorCQl5ID0geCA8PCBwcmVzaGlmdDsgICAgICAgIC8qIG5vdyAxLzQgPD0geSA8IDEgKi8NCisJZWxzZQ0KKwkJeSA9IHggPj4gKC1wcmVzaGlmdCk7DQorCXkgPSBmb3JtZmFjX3NxcnR0YWJsZVt5LTMyXTsNCisJDQorCWlmKHBvc3RzaGlmdCA+PSAwKQ0KKwkJeSA9IHkgPj4gcG9zdHNoaWZ0Ow0KKwllbHNlDQorCQl5ID0geSA8PCAoLXBvc3RzaGlmdCk7DQorCQ0KKwlyZXR1cm4geTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENhbGNGb3JtRmFjdG9yQ2hhbm5lbAorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgZm9ybSBmYWN0b3Igb25lIGNoYW5uZWwKKyoJCQkJZmZhYyhuKSA9IHNxcnQoYWJzKFgoaykpICsgc3FydChhYnMoWChrKzEpKSArIC4uLi4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbikKK3sKKwlXb3JkMzIgc2Zidywgc2ZidzE7DQorCVdvcmQzMiBpLCBqOworCVdvcmQzMiBzZmJPZmZzLCBzZmIsIHNoaWZ0OworCQ0KKwlzZmJ3ID0gc2ZidzEgPSAwOw0KKwlmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKwkJZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCQkJaSA9IHNmYk9mZnMrc2ZiOyAgICAgIAorCQkJCisJCQlpZiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W2ldID4gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW2ldKSB7CisJCQkJV29yZDMyIGFjY3UsIGF2Z0Zvcm1GYWN0b3IsaVNmYldpZHRoOw0KKwkJCQlXb3JkMzIgKm1kY3RTcGVjOworCQkJCXNmYncgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOw0KKwkJCQlpU2ZiV2lkdGggPSBpbnZTQkZbKHNmYncgPj4gMikgLSAxXTsNCisJCQkJbWRjdFNwZWMgPSBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gKyBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOworCQkJCWFjY3UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJLyogY2FsYyBzdW0gb2Ygc3FydChzcGVjKSAqLworCQkJCWZvciAoaj1zZmJ3OyBqOyBqLS0pIHsNCisJCQkJCWFjY3UgKz0gZm9ybWZhY19zcXJ0KExfYWJzKCptZGN0U3BlYykpOyBtZGN0U3BlYysrOw0KKwkJCQl9CisJCQkJbG9nU2ZiRm9ybUZhY3RvcltpXSA9IGlMb2c0KGFjY3UpOworCQkJCWxvZ1NmYkVuZXJneVtpXSA9IGlMb2c0KHBzeU91dENoYW4tPnNmYkVuZXJneVtpXSk7CisJCQkJYXZnRm9ybUZhY3RvciA9IGZpeG11bChyc3FydChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0sSU5UX0JJVFMpLCBpU2ZiV2lkdGgpOworCQkJCWF2Z0Zvcm1GYWN0b3IgPSByc3FydCgoV29yZDMyKWF2Z0Zvcm1GYWN0b3IsSU5UX0JJVFMpID4+IDEwOworCQkJCS8qIHJlc3VsdCBpcyBtdWx0aXBsaWVkIGJ5IDQgKi8KKwkJCQlpZihhdmdGb3JtRmFjdG9yKQorCQkJCQlzZmJOUmVsZXZhbnRMaW5lc1tpXSA9IGFjY3UgLyBhdmdGb3JtRmFjdG9yOworCQkJCWVsc2UKKwkJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAweDdmZmY7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBzZXQgbnVtYmVyIG9mIGxpbmVzIHRvIHplcm8gKi8KKwkJCQlzZmJOUmVsZXZhbnRMaW5lc1tpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGltcHJvdmVTY2YKKyogZGVzY3JpcHRpb246ICBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgaW1wcm92ZVNjZihXb3JkMzIgKnNwZWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2ZiV2lkdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgdGhyZXNoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKmRpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCkKK3sKKwlXb3JkMzIgY250OworCVdvcmQzMiBzZmJEaXN0OworCVdvcmQzMiBzY2ZCZXN0OworCVdvcmQzMiB0aHJlc2gxMjUgPSBMX2FkZCh0aHJlc2gsICh0aHJlc2ggPj4gMikpOworCQorCXNjZkJlc3QgPSBzY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQorCS8qIGNhbGMgcmVhbCBkaXN0b3J0aW9uICovCisJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOworCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOyAgICAgDQorCWlmKCFzZmJEaXN0KQ0KKwkgIHJldHVybiBzY2ZCZXN0OworCQorCWlmIChzZmJEaXN0ID4gdGhyZXNoMTI1KSB7CisJCVdvcmQzMiBzY2ZFc3RpbWF0ZWQ7CisJCVdvcmQzMiBzZmJEaXN0QmVzdDsKKwkJc2NmRXN0aW1hdGVkID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkKKwkJY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXdoaWxlIChzZmJEaXN0ID4gdGhyZXNoMTI1ICYmIChjbnQgPCAzKSkgeworCQkJCisJCQlzY2YgPSBzY2YgKyAxOworCQkJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOworCQkJCisJCQlpZiAoc2ZiRGlzdCA8IHNmYkRpc3RCZXN0KSB7CisJCQkJc2NmQmVzdCA9IHNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCQljbnQgPSBjbnQgKyAxOworCQl9CisJCWNudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlzY2YgPSBzY2ZFc3RpbWF0ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJc2ZiRGlzdCA9IHNmYkRpc3RCZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXdoaWxlICgoc2ZiRGlzdCA+IHRocmVzaDEyNSkgJiYgKGNudCA8IDEpICYmIChzY2YgPiBtaW5TY2YpKSB7CisJCQkKKwkJCXNjZiA9IHNjZiAtIDE7CisJCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7CisJCQkKKwkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKKwkJCQlzY2ZCZXN0ID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJY250ID0gY250ICsgMTsKKwkJfQ0KKwkJKmRpc3QgPSBzZmJEaXN0QmVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJfQorCWVsc2UgeworCQlXb3JkMzIgc2ZiRGlzdEJlc3Q7IAorCQlXb3JkMzIgc2ZiRGlzdEFsbG93ZWQ7CisJCVdvcmQzMiB0aHJlc2gwOCA9IGZpeG11bChDT0VGMDhfMzEsIHRocmVzaCk7CisJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkKKwkJaWYgKHNmYkRpc3QgPCB0aHJlc2gwOCkKKwkJCXNmYkRpc3RBbGxvd2VkID0gc2ZiRGlzdDsKKwkJZWxzZQorCQkJc2ZiRGlzdEFsbG93ZWQgPSB0aHJlc2gwODsKKwkJZm9yIChjbnQ9MDsgY250PDM7IGNudCsrKSB7CisJCQlzY2YgPSBzY2YgKyAxOworCQkJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOworCQkJCisJCQlpZiAoZml4bXVsKENPRUYwOF8zMSxzZmJEaXN0KSA8IHNmYkRpc3RBbGxvd2VkKSB7CisJCQkJKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2ZCZXN0ICsgMTsKKwkJCQlzY2ZCZXN0ID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJfQorCQkqZGlzdCA9IHNmYkRpc3RCZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl9CisJCisJLyogcmV0dXJuIGJlc3Qgc2NhbGVmYWN0b3IgKi8KKwlyZXR1cm4gc2NmQmVzdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudFNpbmdsZVNjZkJpdHMKKyogZGVzY3JpcHRpb246ICBjb3VudCBzaW5nbGUgc2NmIGJpdHMgaW4gaHVmZnVtCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjb3VudFNpbmdsZVNjZkJpdHMoV29yZDE2IHNjZiwgV29yZDE2IHNjZkxlZnQsIFdvcmQxNiBzY2ZSaWdodCkKK3sKKwlXb3JkMTYgc2NmQml0czsKKwkKKwlzY2ZCaXRzID0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZkxlZnQgLSBzY2YpICsKKwkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZiAtIHNjZlJpZ2h0KTsKKwkKKwlyZXR1cm4gc2NmQml0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjYWxjU2luZ2xlU3BlY1BlCisqIGRlc2NyaXB0aW9uOiAgbGRSYXRpbyA9IGxvZzIoZW4obikpIC0gMCwzNzUqc2NmR2FpbihuKQorKgkJCQluYml0cyA9IDAuNypuTGluZXMqbGRSYXRpb24gZm9yIGxkUmF0aW9uID49IGMxCisqCQkJCW5iaXRzID0gMC43Km5MaW5lcyooYzIgKyBjMypsZFJhdGlvKSBmb3IgbGRSYXRpb24gPCBjMSAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNhbGNTaW5nbGVTcGVjUGUoV29yZDE2IHNjZiwgV29yZDE2IHNmYkNvbnN0UGVQYXJ0LCBXb3JkMTYgbkxpbmVzKQoreworCVdvcmQzMiBzcGVjUGU7CisJV29yZDMyIGxkUmF0aW87CisJV29yZDMyIHNjZjM7CisJCisJbGRSYXRpbyA9IHNmYkNvbnN0UGVQYXJ0IDw8IDM7IC8qICAoc2ZiQ29uc3RQZVBhcnQgLTAuMzc1KnNjZikqOCAqLworCXNjZjMgPSBzY2YgKyBzY2YgKyBzY2Y7CisJbGRSYXRpbyA9IGxkUmF0aW8gLSBzY2YzOworICAgIAorCWlmIChsZFJhdGlvIDwgUEVfQzFfOCkgeworCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLyAKKwkJbGRSYXRpbyA9IChsZFJhdGlvICsgUEVfQzJfMTYpID4+IDE7CisJfQorCXNwZWNQZSA9IG5MaW5lcyAqIGxkUmF0aW87CisJc3BlY1BlID0gKHNwZWNQZSAqIFBFX1NDQUxFKSA+PiAxNDsKKwkKKwlyZXR1cm4gc2F0dXJhdGUoc3BlY1BlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50U2NmQml0c0RpZmYKKyogZGVzY3JpcHRpb246ICBjb3VudCBkaWZmZXJlbnQgc2NmIGJpdHMgdXNlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgY291bnRTY2ZCaXRzRGlmZihXb3JkMTYgKnNjZk9sZCwgV29yZDE2ICpzY2ZOZXcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJDbnQsIFdvcmQxNiBzdGFydFNmYiwgV29yZDE2IHN0b3BTZmIpCit7CisJV29yZDMyIHNjZkJpdHNEaWZmOworCVdvcmQzMiBzZmIsIHNmYkxhc3Q7CisJV29yZDMyIHNmYlByZXYsIHNmYk5leHQ7CisJCisJc2NmQml0c0RpZmYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKKwkvKiBzZWFyY2ggZm9yIGZpcnN0IHJlbGV2YW50IHNmYiAqLworCXNmYkxhc3QgPSBzdGFydFNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl3aGlsZSAoc2ZiTGFzdCA8IHN0b3BTZmIgJiYgc2NmT2xkW3NmYkxhc3RdID09IFZPQUFDX1NIUlRfTUlOKSB7CisJCQorCQlzZmJMYXN0ID0gc2ZiTGFzdCArIDE7CisJfQorCS8qIHNlYXJjaCBmb3IgcHJldmlvdXMgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCisJc2ZiUHJldiA9IHN0YXJ0U2ZiIC0gMTsKKwl3aGlsZSAoKHNmYlByZXY+PTApICYmIHNjZk9sZFtzZmJQcmV2XSA9PSBWT0FBQ19TSFJUX01JTikgeworCQkKKwkJc2ZiUHJldiA9IHNmYlByZXYgLSAxOworCX0KKwkKKwlpZiAoc2ZiUHJldj49MCkgeworCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYlByZXZdIC0gc2NmTmV3W3NmYkxhc3RdKSAtCisJCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYlByZXZdIC0gc2NmT2xkW3NmYkxhc3RdKTsKKwl9CisJLyogbm93IGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgZGlmZnMgb2YgcmVsZXZhbnQgc2ZicyAqLworCWZvciAoc2ZiPXNmYkxhc3QrMTsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisJCQorCQlpZiAoc2NmT2xkW3NmYl0gIT0gVk9BQUNfU0hSVF9NSU4pIHsKKwkJCXNjZkJpdHNEaWZmICs9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZOZXdbc2ZiTGFzdF0gLSBzY2ZOZXdbc2ZiXSkgLQorCQkJCWJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZPbGRbc2ZiTGFzdF0gLSBzY2ZPbGRbc2ZiXSk7CisJCQlzZmJMYXN0ID0gc2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCX0KKwkvKiBzZWFyY2ggZm9yIG5leHQgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCisJc2ZiTmV4dCA9IHN0b3BTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXdoaWxlIChzZmJOZXh0IDwgc2ZiQ250ICYmIHNjZk9sZFtzZmJOZXh0XSA9PSBWT0FBQ19TSFJUX01JTikgeworCQkKKwkJc2ZiTmV4dCA9IHNmYk5leHQgKyAxOworCX0KKwkKKwlpZiAoc2ZiTmV4dCA8IHNmYkNudCkKKwkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJOZXh0XSkgLQorCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYk5leHRdKTsKKwkKKwlyZXR1cm4gc2F0dXJhdGUoc2NmQml0c0RpZmYpOworfQorCitzdGF0aWMgV29yZDE2IGNhbGNTcGVjUGVEaWZmKFdvcmQxNiAqc2NmT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNjZk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXJ0U2ZiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0b3BTZmIpCit7CisJV29yZDMyIHNwZWNQZURpZmY7CisJV29yZDMyIHNmYjsKKwkKKwlzcGVjUGVEaWZmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCisJLyogbG9vcCB0aHJvdWdoIGFsbCBzZmJzIGFuZCBjb3VudCBwZSBkaWZmZXJlbmNlICovCisJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkKKwkJCisJCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgeworCQkJV29yZDMyIGxkUmF0aW9PbGQsIGxkUmF0aW9OZXc7CisJCQlXb3JkMzIgc2NmMzsKKwkJCQorCQkJCisJCQlpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9PSBNSU5fMTYpIHsKKwkJCQlzZmJDb25zdFBlUGFydFtzZmJdID0gKChsb2dTZmJFbmVyZ3lbc2ZiXSAtCisJCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiXSkgKyAxMS04KjQrMykgPj4gMjsKKwkJCX0KKwkJCQorCQkJCisJCQlsZFJhdGlvT2xkID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSA8PCAzOworCQkJc2NmMyA9IHNjZk9sZFtzZmJdICsgc2NmT2xkW3NmYl0gKyBzY2ZPbGRbc2ZiXTsKKwkJCWxkUmF0aW9PbGQgPSBsZFJhdGlvT2xkIC0gc2NmMzsKKwkJCWxkUmF0aW9OZXcgPSBzZmJDb25zdFBlUGFydFtzZmJdIDw8IDM7CisJCQlzY2YzID0gc2NmTmV3W3NmYl0gKyBzY2ZOZXdbc2ZiXSArIHNjZk5ld1tzZmJdOworCQkJbGRSYXRpb05ldyA9IGxkUmF0aW9OZXcgLSBzY2YzOworCQkJCisJCQlpZiAobGRSYXRpb09sZCA8IFBFX0MxXzgpIHsKKwkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLworCQkJCWxkUmF0aW9PbGQgPSAobGRSYXRpb09sZCArIFBFX0MyXzE2KSA+PiAxOworCQkJfQorCQkJCisJCQlpZiAobGRSYXRpb05ldyA8IFBFX0MxXzgpIHsKKwkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLworCQkJCWxkUmF0aW9OZXcgPSAobGRSYXRpb05ldyArIFBFX0MyXzE2KSA+PiAxOworCQkJfQorCQkJCisJCQlzcGVjUGVEaWZmICs9ICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJdICogKGxkUmF0aW9OZXcgLSBsZFJhdGlvT2xkKTsKKwkJfQorCX0KKwkKKwlzcGVjUGVEaWZmID0gKHNwZWNQZURpZmYgKiBQRV9TQ0FMRSkgPj4gMTQ7CisJCisJcmV0dXJuIHNhdHVyYXRlKHNwZWNQZURpZmYpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYXNzaW1pbGF0ZVNpbmdsZVNjZgorKiBkZXNjcmlwdGlvbjogIHNlYXJjaGVkIGZvciBzaW5nbGUgc2NhbGVmYWN0b3IgYmFuZHMsIHdoZXJlIHRoZSBudW1iZXIgb2YgYml0cyBnYWluZWQKKyoJCQkJYnkgdXNpbmcgYSBzbWFsbGVyIHNjZmdhaW4obikgaXMgZ3JlYXRlciB0aGFuIHRoZSBlc3RpbWF0ZWQgaW5jcmVhc2VkCisqCQkJCWJpdCBkZW1hbmQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhc3NpbWlsYXRlU2luZ2xlU2NmKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2ZDYWxjdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnICAgIHJlc3RhcnRPblN1Y2Nlc3MpCit7CisJV29yZDMyIHNmYkxhc3QsIHNmYkFjdCwgc2ZiTmV4dCwgc2NmQWN0LCBzY2ZNaW47CisJV29yZDE2ICpzY2ZMYXN0LCAqc2NmTmV4dDsKKwlXb3JkMzIgc2ZiUGVPbGQsIHNmYlBlTmV3OworCVdvcmQzMiBzZmJEaXN0TmV3OworCVdvcmQzMiBqOworCUZsYWcgICBzdWNjZXNzOworCVdvcmQxNiBkZWx0YVBlLCBkZWx0YVBlTmV3LCBkZWx0YVBlVG1wOworCVdvcmQxNiAqcHJldlNjZkxhc3QgPSBwc3lPdXRDaGFuLT5wcmV2U2NmTGFzdDsKKwlXb3JkMTYgKnByZXZTY2ZOZXh0ID0gcHN5T3V0Q2hhbi0+cHJldlNjZk5leHQ7CisJV29yZDE2ICpkZWx0YVBlTGFzdCA9IHBzeU91dENoYW4tPmRlbHRhUGVMYXN0OworCUZsYWcgICB1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkOworCQorCXN1Y2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWRlbHRhUGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQorCWZvcihqPTA7ajxwc3lPdXRDaGFuLT5zZmJDbnQ7aisrKXsKKwkJcHJldlNjZkxhc3Rbal0gPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlwcmV2U2NmTmV4dFtqXSA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCWRlbHRhUGVMYXN0W2pdID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl9DQorCQorCXNmYkxhc3QgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNmYkFjdCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNmYk5leHQgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNjZkxhc3QgPSAwOworCXNjZk5leHQgPSAwOworCXNjZk1pbiA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWRvIHsKKwkJLyogc2VhcmNoIGZvciBuZXcgcmVsZXZhbnQgc2ZiICovCisJCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKKwkJd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQgJiYgc2NmW3NmYk5leHRdID09IE1JTl8xNikgeworCQkJCisJCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7CisJCX0KKwkJCisJCWlmICgoc2ZiTGFzdD49MCkgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgeworCQkJLyogcmVsZXZhbnQgc2NmcyB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0ICovCisJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7CisJCQlzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKKwkJCXNjZk1pbiAgPSBtaW4oKnNjZkxhc3QsICpzY2ZOZXh0KTsKKwkJfQorCQllbHNlIHsKKwkJCQorCQkJaWYgKHNmYkxhc3QgPT0gLTEgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgeworCQkJCS8qIGZpcnN0IHJlbGV2YW50IHNjZiAqLworCQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCXNjZkxhc3QgPSAmc2NmQWN0OworCQkJCXNjZk5leHQgPSBzY2YgKyBzZmJOZXh0OworCQkJCXNjZk1pbiAgPSAqc2NmTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQkJZWxzZSB7CisJCQkJCisJCQkJaWYgKChzZmJMYXN0Pj0wKSAmJiAoc2ZiQWN0Pj0wKSAmJiBzZmJOZXh0ID09IHBzeU91dENoYW4tPnNmYkNudCkgeworCQkJCQkvKiBsYXN0IHJlbGV2YW50IHNjZiAqLworCQkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OworCQkJCQlzY2ZOZXh0ID0gJnNjZkFjdDsKKwkJCQkJc2NmTWluICA9ICpzY2ZMYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKHNmYkFjdD49MCkKKwkJCXNjZk1pbiA9IG1heChzY2ZNaW4sIG1pblNjZltzZmJBY3RdKTsKKwkJCisJCWlmICgoc2ZiQWN0ID49IDApICYmIAorCQkJKHNmYkxhc3Q+PTAgfHwgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgJiYgCisJCQlzY2ZBY3QgPiBzY2ZNaW4gJiYgCisJCQkoKnNjZkxhc3QgIT0gcHJldlNjZkxhc3Rbc2ZiQWN0XSB8fCAKKwkJCSpzY2ZOZXh0ICE9IHByZXZTY2ZOZXh0W3NmYkFjdF0gfHwgCisJCQlkZWx0YVBlIDwgZGVsdGFQZUxhc3Rbc2ZiQWN0XSkpIHsKKwkJCXN1Y2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkKKwkJCS8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIGFjdHVhbCBzY2YgKi8JCQkKKwkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdID09IE1JTl8xNikgeworCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBsb2dTZmJFbmVyZ3lbc2ZiQWN0XSAtCisJCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiQWN0XSArIDExLTgqNDsgLyogNCpsb2cyKDYuNzUpIC0gMzIgKi8KKwkJCQkKKwkJCQlpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA8IDApCisJCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBzZmJDb25zdFBlUGFydFtzZmJBY3RdICsgMzsKKwkJCQlzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA+PiAyOworCQkJfQorCQkJCisJCQlzZmJQZU9sZCA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCisJCQkJY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwgKnNjZkxhc3QsICpzY2ZOZXh0KTsKKwkJCWRlbHRhUGVOZXcgPSBkZWx0YVBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG8geworCQkJCXNjZkFjdCA9IHNjZkFjdCAtIDE7CisJCQkJLyogY2hlY2sgb25seSBpZiB0aGUgc2FtZSBjaGVjayB3YXMgbm90IGRvbmUgYmVmb3JlICovCisJCQkJCisJCQkJaWYgKHNjZkFjdCA8IG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSkgeworCQkJCQlzZmJQZU5ldyA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCisJCQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOworCQkJCQkvKiB1c2UgbmV3IHNjZiBpZiBubyBpbmNyZWFzZSBpbiBwZSBhbmQgCisJCQkJCXF1YW50aXphdGlvbiBlcnJvciBpcyBzbWFsbGVyICovCisJCQkJCWRlbHRhUGVUbXAgPSBkZWx0YVBlICsgc2ZiUGVOZXcgLSBzZmJQZU9sZDsKKwkJCQkJCisJCQkJCWlmIChkZWx0YVBlVG1wIDwgMTApIHsKKwkJCQkJCXNmYkRpc3ROZXcgPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rCisJCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdLAorCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCsxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XSksCisJCQkJCQkJc2NmQWN0KTsKKwkJCQkJCWlmIChzZmJEaXN0TmV3IDwgc2ZiRGlzdFtzZmJBY3RdKSB7CisJCQkJCQkJLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLworCQkJCQkJCXNjZltzZmJBY3RdID0gc2NmQWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQlzZmJEaXN0W3NmYkFjdF0gPSBzZmJEaXN0TmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGVUbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCXN1Y2Nlc3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCX0KKwkJCQkJCS8qIG1hcmsgYXMgYWxyZWFkeSBjaGVja2VkICovCisJCQkJCQkKKwkJCQkJCWlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKSB7CisJCQkJCQkJbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdID0gc2NmQWN0OyAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQl9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOworCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkvKiBzYXZlIHBhcmFtZXRlcnMgdG8gYXZvaWQgbXVsdGlwbGUgY29tcHV0YXRpb25zIG9mIHRoZSBzYW1lIHNmYiAqLworCQkJcHJldlNjZkxhc3Rbc2ZiQWN0XSA9ICpzY2ZMYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwcmV2U2NmTmV4dFtzZmJBY3RdID0gKnNjZk5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRlbHRhUGVMYXN0W3NmYkFjdF0gPSBkZWx0YVBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCQorCQlpZiAoc3VjY2VzcyAmJiByZXN0YXJ0T25TdWNjZXNzKSB7CisJCQkvKiBzdGFydCBhZ2FpbiBhdCBmaXJzdCBzZmIgKi8KKwkJCXNmYkxhc3QgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc2ZiQWN0ICA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzZmJOZXh0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXNjZkxhc3QgPSAwOworCQkJc2NmTmV4dCA9IDA7CisJCQlzY2ZNaW4gID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXN1Y2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCWVsc2UgeworCQkJLyogc2hpZnQgc2ZicyBmb3IgbmV4dCBiYW5kICovCisJCQlzZmJMYXN0ID0gc2ZiQWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXNmYkFjdCAgPSBzZmJOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCQorICB9IHdoaWxlIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFzc2ltaWxhdGVNdWx0aXBsZVNjZgorKiBkZXNjcmlwdGlvbjogIHNjYWxlZmFjdG9yIGRpZmZlcmVuY2UgcmVkdWN0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYXNzaW1pbGF0ZU11bHRpcGxlU2NmKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNjZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzKQoreworCVdvcmQzMiBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiLCBzY2ZNaW4sIHNjZk1heCwgc2NmQWN0OworCUZsYWcgICBwb3NzaWJsZVJlZ2lvbkZvdW5kOworCVdvcmQzMiBkZWx0YVNjZkJpdHM7CisJV29yZDMyIGRlbHRhU3BlY1BlOworCVdvcmQzMiBkZWx0YVBlLCBkZWx0YVBlTmV3OworCVdvcmQzMiBzZmJDbnQ7CisJV29yZDMyICpzZmJEaXN0TmV3ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdE5ldzsKKwlXb3JkMTYgKnNjZlRtcCA9IHBzeU91dENoYW4tPnByZXZTY2ZMYXN0OworCisJZGVsdGFQZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNmYkNudCA9IHBzeU91dENoYW4tPnNmYkNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKKwkvKiBjYWxjIG1pbiBhbmQgbWF4IHNjYWxmYWN0b3JzICovCisJc2NmTWluID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXNjZk1heCA9IE1JTl8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrKykgeworCQkKKwkJaWYgKHNjZltzZmJdICE9IE1JTl8xNikgeworCQkJc2NmTWluID0gbWluKHNjZk1pbiwgc2NmW3NmYl0pOworCQkJc2NmTWF4ID0gbWF4KHNjZk1heCwgc2NmW3NmYl0pOworCQl9CisJfQorCQorCWlmIChzY2ZNYXggIT0gIE1JTl8xNikgeworCQkKKwkJc2NmQWN0ID0gc2NmTWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkKKwkJZG8geworCQkJc2NmQWN0ID0gc2NmQWN0IC0gMTsKKwkJCWZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7CisJCQkJc2NmVG1wW3NmYl0gPSBzY2Zbc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQkJc3RvcFNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkbyB7CisJCQkJc2ZiID0gc3RvcFNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQorCQkJCXdoaWxlIChzZmIgPCBzZmJDbnQgJiYgKHNjZltzZmJdID09IE1JTl8xNiB8fCBzY2Zbc2ZiXSA8PSBzY2ZBY3QpKSB7CisJCQkJCXNmYiA9IHNmYiArIDE7CisJCQkJfQorCQkJCXN0YXJ0U2ZiID0gc2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzZmIgPSBzZmIgKyAxOworCQkJCQorCQkJCXdoaWxlIChzZmIgPCBzZmJDbnQgJiYgKHNjZltzZmJdID09IE1JTl8xNiB8fCBzY2Zbc2ZiXSA+IHNjZkFjdCkpIHsKKwkJCQkJc2ZiID0gc2ZiICsgMTsKKwkJCQl9CisJCQkJc3RvcFNmYiA9IHNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQorCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkKKwkJCQlpZiAoc3RhcnRTZmIgPCBzZmJDbnQpIHsKKwkJCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkJCQkJCisJCQkJCQlpZiAoc2NmW3NmYl0hPU1JTl8xNikgeworCQkJCQkJCQorCQkJCQkJCWlmIChzY2ZBY3QgPCBtaW5TY2Zbc2ZiXSkgeworCQkJCQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJCisJCQkJaWYgKHBvc3NpYmxlUmVnaW9uRm91bmQpIHsgLyogcmVnaW9uIGZvdW5kICovCisJCQkJCQorCQkJCQkvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLworCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisJCQkJCQkKKwkJCQkJCWlmIChzY2ZUbXBbc2ZiXSE9TUlOXzE2KQorCQkJCQkJCXNjZlRtcFtzZmJdID0gc2NmQWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJfQorCQkJCQkKKwkJCQkJLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCisJCQkJCWRlbHRhU2NmQml0cyA9IGNvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7CisJCQkJCWRlbHRhU3BlY1BlID0gY2FsY1NwZWNQZURpZmYoc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAorCQkJCQkJbG9nU2ZiRW5lcmd5LCBsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywgCisJCQkJCQlzdGFydFNmYiwgc3RvcFNmYik7CisJCQkJCWRlbHRhUGVOZXcgPSBkZWx0YVBlICsgZGVsdGFTY2ZCaXRzICsgZGVsdGFTcGVjUGU7CisJCQkJCQorCQkJCQkKKwkJCQkJaWYgKGRlbHRhUGVOZXcgPCAxMCkgeworCQkJCQkJV29yZDMyIGRpc3RPbGRTdW0sIGRpc3ROZXdTdW07CisJCQkJCQkKKwkJCQkJCS8qIHF1YW50aXplIGFuZCBjYWxjIHN1bSBvZiBuZXcgZGlzdG9ydGlvbiAqLworCQkJCQkJZGlzdE9sZFN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCWRpc3ROZXdTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisJCQkJCQkJCisJCQkJCQkJaWYgKHNjZlRtcFtzZmJdICE9IE1JTl8xNikgeworCQkJCQkJCQlkaXN0T2xkU3VtID0gTF9hZGQoZGlzdE9sZFN1bSwgc2ZiRGlzdFtzZmJdKTsKKwkJCQkJCQkJCisJCQkJCQkJCXNmYkRpc3ROZXdbc2ZiXSA9IGNhbGNTZmJEaXN0KHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArCisJCQkJCQkJCQlwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl0sIAorCQkJCQkJCQkJKHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiKzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdKSwKKwkJCQkJCQkJCXNjZkFjdCk7CisJCQkJCQkJCQorCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHNmYkRpc3ROZXdbc2ZiXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdKSB7CisJCQkJCQkJCQlkaXN0TmV3U3VtID0gZGlzdE9sZFN1bSA8PCAxOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQkJZGlzdE5ld1N1bSA9IExfYWRkKGRpc3ROZXdTdW0sIHNmYkRpc3ROZXdbc2ZiXSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZiAoZGlzdE5ld1N1bSA8IGRpc3RPbGRTdW0pIHsKKwkJCQkJCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAoc2NmW3NmYl0hPU1JTl8xNikgeworCQkJCQkJCQkJc2NmW3NmYl0gPSBzY2ZBY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQkJCXNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9ICAgICAgICAKKwkJCX0gd2hpbGUgKHN0b3BTZmIgPD0gc2ZiQ250KTsgICAgICAKKwkJfSB3aGlsZSAoc2NmQWN0ID4gc2NmTWluKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsCisqIGRlc2NyaXB0aW9uOiAgZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyBmb3Igb25lIGNoYW5uZWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJGb3JtRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqc2ZiTlJlbGV2YW50TGluZXMpCit7CisJV29yZDMyIGksIGo7CisJV29yZDMyIHRocmVzaCwgZW5lcmd5OworCVdvcmQzMiBlbmVyZ3lQYXJ0LCB0aHJlc2hvbGRQYXJ0OworCVdvcmQzMiBzY2ZJbnQsIG1pblNjZiwgbWF4U2NmLCBtYXhBbGxvd2VkU2NmLCBsYXN0U2Y7CisJV29yZDMyIG1heFNwZWM7CisJV29yZDMyICpzZmJEaXN0ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdDsKKwlXb3JkMTYgKm1pblNmTWF4UXVhbnQgPSBwc3lPdXRDaGFuLT5taW5TZk1heFF1YW50OworCVdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCA9IHBzeU91dENoYW4tPm1pblNjZkNhbGN1bGF0ZWQ7CisJCisJCisJZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKKwkJV29yZDMyIHNiZndpdGgsIHNiZlN0YXJ0Ow0KKwkJV29yZDMyICptZGN0U3BlYzsKKwkJdGhyZXNoID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQllbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQ0KKwkJc2JmU3RhcnQgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOw0KKwkJc2Jmd2l0aCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXSAtIHNiZlN0YXJ0Ow0KKwkJbWRjdFNwZWMgPSBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rc2JmU3RhcnQ7DQorCQkKKwkJbWF4U3BlYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkvKiBtYXhpbXVtIG9mIHNwZWN0cnVtICovCisJCWZvciAoaj1zYmZ3aXRoOyBqOyBqLS0gKSB7DQorCQkJV29yZDMyIGFic1NwZWMgPSBMX2FicygqbWRjdFNwZWMpOyBtZGN0U3BlYysrOw0KKwkJCW1heFNwZWMgfD0gYWJzU3BlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQl9CisJCQorCQkvKiBzY2ZzIHdpdGhvdXQgZW5lcmd5IG9yIHdpdGggdGhyZXNoPmVuZXJneSBhcmUgbWFya2VkIHdpdGggTUlOXzE2ICovCisJCXNjZltpXSA9IE1JTl8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJbWluU2ZNYXhRdWFudFtpXSA9IE1JTl8xNjsgICAgCisJCQorCQlpZiAoKG1heFNwZWMgPiAwKSAmJiAoZW5lcmd5ID4gdGhyZXNoKSkgeworCQkJCisJCQllbmVyZ3lQYXJ0ID0gbG9nU2ZiRm9ybUZhY3RvcltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJdGhyZXNob2xkUGFydCA9IGlMb2c0KHRocmVzaCk7ICAKKwkJCS8qIC0yMCA9IDQqbG9nMig2Ljc1KSAtIDMyICovDQorCQkJc2NmSW50ID0gKCh0aHJlc2hvbGRQYXJ0IC0gZW5lcmd5UGFydCAtIDIwKSAqIFNDQUxFX0VTVElNQVRFX0NPRUYpID4+IDE1OworCQkJCisJCQltaW5TZk1heFF1YW50W2ldID0gaUxvZzQobWF4U3BlYykgLSA2ODsgLyogNjggIC0xNi8zKmxvZyhNQVhfUVVBTlQrMC41LWxvZ0NvbikvbG9nKDIpICsgMSAqLworCQkJCisJCQkKKwkJCWlmIChtaW5TZk1heFF1YW50W2ldID4gc2NmSW50KSB7CisJCQkJc2NmSW50ID0gbWluU2ZNYXhRdWFudFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCQkKKwkJCS8qIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzICovCisJCQlzY2ZJbnQgPSBpbXByb3ZlU2NmKHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bStzYmZTdGFydCwNCisJCQkJc2Jmd2l0aCwNCisJCQkJdGhyZXNoLCBzY2ZJbnQsIG1pblNmTWF4UXVhbnRbaV0sIA0KKwkJCQkmc2ZiRGlzdFtpXSwgJm1pblNjZkNhbGN1bGF0ZWRbaV0pOworCQkJCisJCQlzY2ZbaV0gPSBzY2ZJbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJfQorCQorCQorCS8qIHNjYWxlZmFjdG9yIGRpZmZlcmVjZSByZWR1Y3Rpb24gICovCisJeworCQlXb3JkMTYgc2ZiQ29uc3RQZVBhcnRbTUFYX0dST1VQRURfU0ZCXTsKKwkJZm9yKGk9MDtpPHBzeU91dENoYW4tPnNmYkNudDtpKyspIHsKKwkJCXNmYkNvbnN0UGVQYXJ0W2ldID0gTUlOXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCX0KKwkJCisJCWFzc2ltaWxhdGVTaW5nbGVTY2YocHN5T3V0Q2hhbiwgc2NmLCAKKwkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCisJCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywgbWluU2NmQ2FsY3VsYXRlZCwgMSk7CisJCQorCQlhc3NpbWlsYXRlTXVsdGlwbGVTY2YocHN5T3V0Q2hhbiwgc2NmLCAKKwkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCisJCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcyk7CisJfQorCisJLyogZ2V0IG1heCBzY2FsZWZhYyBmb3IgZ2xvYmFsIGdhaW4gKi8KKwltYXhTY2YgPSBNSU5fMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwltaW5TY2YgPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlmb3IgKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgeworCQkKKwkJaWYgKG1heFNjZiA8IHNjZltpXSkgeworCQkJbWF4U2NmID0gc2NmW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCQkKKwkJaWYgKChzY2ZbaV0gIT0gTUlOXzE2KSAmJiAobWluU2NmID4gc2NmW2ldKSkgeworCQkJbWluU2NmID0gc2NmW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCX0KKwkvKiBsaW1pdCBzY2YgZGVsdGEgKi8KKwltYXhBbGxvd2VkU2NmID0gbWluU2NmICsgTUFYX1NDRl9ERUxUQTsKKwlmb3IoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisJCQorCQlpZiAoKHNjZltpXSAhPSBNSU5fMTYpICYmIChtYXhBbGxvd2VkU2NmIDwgc2NmW2ldKSkgeworCQkJc2NmW2ldID0gbWF4QWxsb3dlZFNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCX0KKwkvKiBuZXcgbWF4U2NmIGlmIGFueSBzY2YgaGFzIGJlZW4gbGltaXRlZCAqLworCQorCWlmIChtYXhBbGxvd2VkU2NmIDwgbWF4U2NmKSB7CisJCW1heFNjZiA9IG1heEFsbG93ZWRTY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl9CisJCisJLyogY2FsYyBsb29wIHNjYWxlZmFjdG9ycyAqLworCQorCWlmIChtYXhTY2YgPiBNSU5fMTYpIHsKKwkJKmdsb2JhbEdhaW4gPSBtYXhTY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlsYXN0U2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQorCQlmb3IoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisJCQkKKwkJCWlmIChzY2ZbaV0gPT0gTUlOXzE2KSB7CisJCQkJc2NmW2ldID0gbGFzdFNmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJLyogc2V0IGJhbmQgZXhwbGljaXRlbHkgdG8gemVybyAqLworCQkJCWZvciAoaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXTsgaisrKSB7CisJCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlzY2ZbaV0gPSBtYXhTY2YgLSBzY2ZbaV07CisJCQkJbGFzdFNmID0gc2NmW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCX0KKwl9CisJZWxzZXsKKwkJKmdsb2JhbEdhaW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkvKiBzZXQgc3BlY3RydW0gZXhwbGljaXRlbHkgdG8gemVybyAqLworCQlmb3IoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisJCQlzY2ZbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZm9yIChqPXBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07IGo8cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdOyBqKyspIHsKKwkJCQlwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjRm9ybUZhY3RvcgorKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIEZvcm0gZmFjdG9ycyBmb3IgYWxsIGNoYW5uZWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitDYWxjRm9ybUZhY3RvcihXb3JkMTYgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKK3sKKwlXb3JkMTYgajsKKwkKKwlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgeworCQlDYWxjRm9ybUZhY3RvckNoYW5uZWwobG9nU2ZiRm9ybUZhY3RvcltqXSwgc2ZiTlJlbGV2YW50TGluZXNbal0sIGxvZ1NmYkVuZXJneVtqXSwgJnBzeU91dENoYW5uZWxbal0pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBFc3RpbWF0ZVNjYWxlRmFjdG9ycworKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIHNjYWxlIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpCit7CisJV29yZDE2IGo7CisJCisJZm9yIChqPTA7IGo8bkNoYW5uZWxzOyBqKyspIHsKKwkJRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKCZwc3lPdXRDaGFubmVsW2pdLAorCQkJcWNPdXRDaGFubmVsW2pdLnNjZiwKKwkJCSYocWNPdXRDaGFubmVsW2pdLmdsb2JhbEdhaW4pLAorCQkJbG9nU2ZiRW5lcmd5W2pdLAorCQkJbG9nU2ZiRm9ybUZhY3RvcltqXSwKKwkJCXNmYk5SZWxldmFudExpbmVzW2pdKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NwcmVhZGluZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3ByZWFkaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmYzdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NwcmVhZGluZy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXNwcmVhZGluZy5jDQorDQorCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJzcHJlYWRpbmcuaCINCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFNwcmVhZGluZ01heAorKiBkZXNjcmlwdGlvbjogIHNwcmVhZGluZyB0aGUgZW5lcmd5CisqCQkJCSBoaWdoZXIgZnJlcXVlbmNpZXMgdGhyKG4pID0gbWF4KHRocihuKSwgc2gobikqdGhyKG4tMSkpCisqCQkJCSBsb3dlciBmcmVxdWVuY2llcyAgdGhyKG4pID0gbWF4KHRocihuKSwgc2wobikqdGhyKG4rMSkpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgU3ByZWFkaW5nTWF4KGNvbnN0IFdvcmQxNiBwYkNudCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKm1hc2tMb3dGYWN0b3IsDQorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrSGlnaEZhY3RvciwNCisgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBiU3ByZWFkZWRFbmVyZ3kpDQorew0KKyAgV29yZDMyIGk7DQorDQorICAvKiBzbG9wZSB0byBoaWdoZXIgZnJlcXVlbmNpZXMgKi8NCisgIGZvciAoaT0xOyBpPHBiQ250OyBpKyspIHsNCisgICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTF9tcHlfbHMocGJTcHJlYWRlZEVuZXJneVtpLTFdLCBtYXNrSGlnaEZhY3RvcltpXSkpOw0KKyAgfQ0KKyAgLyogc2xvcGUgdG8gbG93ZXIgZnJlcXVlbmNpZXMgKi8NCisgIGZvciAoaT1wYkNudCAtIDI7IGk+PTA7IGktLSkgew0KKyAgICBwYlNwcmVhZGVkRW5lcmd5W2ldID0gbWF4KHBiU3ByZWFkZWRFbmVyZ3lbaV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21weV9scyhwYlNwcmVhZGVkRW5lcmd5W2krMV0sIG1hc2tMb3dGYWN0b3JbaV0pKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTYxMDRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXN0YXRfYml0cy5jDQorDQorCUNvbnRlbnQ6CVN0YXRpYyBiaXQgY291bnRlciBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic3RhdF9iaXRzLmgiCisjaW5jbHVkZSAiYml0ZW5jLmgiCisjaW5jbHVkZSAidG5zLmgiCisKKwordHlwZWRlZiBlbnVtIHsKKyAgU0lfSURfQklUUyAgICAgICAgICAgICAgICA9KDMpLAorICBTSV9GSUxMX0NPVU5UX0JJVFMgICAgICAgID0oNCksCisgIFNJX0ZJTExfRVNDX0NPVU5UX0JJVFMgICAgPSg4KSwKKyAgU0lfRklMTF9FWFRFTlRJT05fQklUUyAgICA9KDQpLAorICBTSV9GSUxMX05JQkJMRV9CSVRTICAgICAgID0oNCksCisgIFNJX1NDRV9CSVRTICAgICAgICAgICAgICAgPSg0KSwKKyAgU0lfQ1BFX0JJVFMgICAgICAgICAgICAgICA9KDUpLAorICBTSV9DUEVfTVNfTUFTS19CSVRTICAgICAgID0oMikgLAorICBTSV9JQ1NfSU5GT19CSVRTX0xPTkcgICAgID0oMSsyKzErNisxKSwKKyAgU0lfSUNTX0lORk9fQklUU19TSE9SVCAgICA9KDErMisxKzQrNyksCisgIFNJX0lDU19CSVRTICAgICAgICAgICAgICAgPSg4KzErMSsxKQorfSBTSV9CSVRTOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnRNc01hc2tCaXRzCisqIGRlc2NyaXB0aW9uOiAgIGNvdW50IG1zIHN0ZXJlbyBiaXRzIGRlbWFuZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgY291bnRNc01hc2tCaXRzKFdvcmQxNiAgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVE9PTFNJTkZPICp0b29sc0luZm8pCit7CisgIFdvcmQxNiBtc0JpdHMsIHNmYk9mZiwgc2ZiOworICBtc0JpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIAorICBzd2l0Y2godG9vbHNJbmZvLT5tc0RpZ2VzdCkgeworICAgIGNhc2UgTVNfTk9ORToKKyAgICBjYXNlIE1TX0FMTDoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNU19TT01FOgorICAgICAgZm9yKHNmYk9mZj0wOyBzZmJPZmY8c2ZiQ250OyBzZmJPZmYrPXNmYlBlckdyb3VwKQorICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspCisgICAgICAgICAgbXNCaXRzICs9IDE7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4obXNCaXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB0bnNDb3VudAorKiBkZXNjcmlwdGlvbjogICBjb3VudCB0bnMgYml0IGRlbWFuZCAgY29yZSBmdW5jdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgdG5zQ291bnQoVE5TX0lORk8gKnRuc0luZm8sIFdvcmQxNiBibG9ja1R5cGUpCit7CisKKyAgV29yZDMyIGksIGs7CisgIEZsYWcgdG5zUHJlc2VudDsKKyAgV29yZDMyIG51bU9mV2luZG93czsKKyAgV29yZDMyIGNvdW50OworICBXb3JkMzIgY29lZkJpdHM7DQorICBXb3JkMTYgKnB0Y29lZjsKKworICBjb3VudCA9IDA7ICAgICAgIA0KKyAgCisgIGlmIChibG9ja1R5cGUgPT0gMikKKyAgICBudW1PZldpbmRvd3MgPSA4OworICBlbHNlCisgICAgbnVtT2ZXaW5kb3dzID0gMTsKKyAgdG5zUHJlc2VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgIAorICAgIGlmICh0bnNJbmZvLT50bnNBY3RpdmVbaV0hPTApIHsKKyAgICAgIHRuc1ByZXNlbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorICAgCisgIGlmICh0bnNQcmVzZW50KSB7CisgICAgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KKyAgICAvKmNvdW50ICs9IDE7ICovCisgICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgICAKKyAgICAgIGlmIChibG9ja1R5cGUgPT0gMikKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAKKyAgICAgIGlmICh0bnNJbmZvLT50bnNBY3RpdmVbaV0pIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgIAorICAgICAgICBpZiAoYmxvY2tUeXBlID09IDIpIHsKKyAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgaWYgKHRuc0luZm8tPm9yZGVyW2ldKSB7CisgICAgICAgICAgY291bnQgKz0gMTsgLypkaXJlY3Rpb24qLworICAgICAgICAgIGNvdW50ICs9IDE7IC8qY29lZl9jb21wcmVzc2lvbiAqLwkKKyAgICAgICAgICAgCisgICAgICAgICAgaWYgKHRuc0luZm8tPmNvZWZSZXNbaV0gPT0gNCkgeworICAgICAgICAgICAgcHRjb2VmID0gdG5zSW5mby0+Y29lZiArIGkqVE5TX01BWF9PUkRFUl9TSE9SVDsNCisJCQljb2VmQml0cyA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrKSB7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoKHB0Y29lZltrXSA+IDMpIHx8IChwdGNvZWZba10gPCAtNCkpIHsKKyAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb2VmQml0cyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcHRjb2VmID0gdG5zSW5mby0+Y29lZiArIGkqVE5TX01BWF9PUkRFUl9TSE9SVDsNCisJCQlmb3Ioaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICgocHRjb2VmW2tdID4gMSkgfHwgKHB0Y29lZltrXSA8IC0yKSkgeworICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrICkgeworICAgICAgICAgICAgY291bnQgKz0gY29lZkJpdHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9DQorICAKKyAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudFRuc0JpdHMKKyogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQgIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgY291bnRUbnNCaXRzKFROU19JTkZPICp0bnNJbmZvLFdvcmQxNiBibG9ja1R5cGUpCit7CisgIHJldHVybih0bnNDb3VudCh0bnNJbmZvLCBibG9ja1R5cGUpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudFN0YXRpY0JpdGRlbWFuZAorKiBkZXNjcmlwdGlvbjogICBjb3VudCBzdGF0aWMgYml0IGRlbWFuZCBpbmNsdWRlIHRucyAgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IGNvdW50U3RhdGljQml0ZGVtYW5kKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgDQorCQkJCQkJCVdvcmQxNiBhZHRzVXNlZCkKK3sKKyAgV29yZDMyIHN0YXRCaXRzOworICBXb3JkMzIgY2g7CisgIAorICBzdGF0Qml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisgIC8qIGlmIGFkdHMgdXNlZCwgYWRkIDU2IGJpdHMgKi8KKyAgaWYoYWR0c1VzZWQpIHN0YXRCaXRzICs9IDU2OworCisgICAKKyAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgIHN0YXRCaXRzICs9IFNJX0lEX0JJVFMrU0lfU0NFX0JJVFMrU0lfSUNTX0JJVFM7CisgICAgICBzdGF0Qml0cyArPSBjb3VudFRuc0JpdHMoJihwc3lPdXRDaGFubmVsWzBdLnRuc0luZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2UpOworICAgICAgIAorICAgICAgc3dpdGNoKHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2UpeworICAgICAgICBjYXNlIExPTkdfV0lORE9XOgorICAgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKKyAgICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX0xPTkc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfU0hPUlQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBzdGF0Qml0cyArPSBTSV9JRF9CSVRTK1NJX0NQRV9CSVRTKzIqU0lfSUNTX0JJVFM7CisKKyAgICAgIHN0YXRCaXRzICs9IFNJX0NQRV9NU19NQVNLX0JJVFM7CisgICAgICBzdGF0Qml0cyArPSBjb3VudE1zTWFza0JpdHMocHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQsCisJCQkJCQkJCSAgcHN5T3V0Q2hhbm5lbFswXS5zZmJQZXJHcm91cCwKKwkJCQkJCQkJICBwc3lPdXRDaGFubmVsWzBdLm1heFNmYlBlckdyb3VwLAorCQkJCQkJCQkgICZwc3lPdXRFbGVtZW50LT50b29sc0luZm8pOworICAgICAgIAorICAgICAgc3dpdGNoIChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKSB7CisgICAgICAgIGNhc2UgTE9OR19XSU5ET1c6CisgICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgICAgICBjYXNlIFNUT1BfV0lORE9XOgorICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfTE9ORzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19TSE9SVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvcihjaD0wOyBjaDwyOyBjaCsrKQorICAgICAgICBzdGF0Qml0cyArPSBjb3VudFRuc0JpdHMoJihwc3lPdXRDaGFubmVsW2NoXS50bnNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLndpbmRvd1NlcXVlbmNlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHN0YXRCaXRzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDg5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpAQCAtMCwwICsxLDkzMiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdG5zLmMNCisNCisJQ29udGVudDoJRGVmaW5pdGlvbiBUTlMgdG9vbHMgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImFzc2VydC5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJ0bnMuaCIKKyNpbmNsdWRlICJ0bnNfcGFyYW0uaCIKKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInRuc19mdW5jLmgiCisKKyNkZWZpbmUgVE5TX01PRElGWV9CRUdJTiAgICAgICAgIDI2MDAgIC8qIEh6ICovCisjZGVmaW5lIFJBVElPX1BBVENIX0xPV0VSX0JPUkRFUiAzODAgICAvKiBIeiAqLworI2RlZmluZSBUTlNfR0FJTl9USFJFU0gJCQkgMTQxICAgLyogMS40MSoxMDAgKi8NCisjZGVmaW5lIE5PUk1fQ09FRgkJCQkgMHgwMjhmNWMyOA0KKworc3RhdGljIGNvbnN0IFdvcmQzMiBUTlNfUEFSQ09SX1RIUkVTSCA9IDB4MGNjY2NjY2Q7IC8qIDAuMSooMSA8PCAzMSkgKi8NCisvKiBMaW1pdCBiYW5kcyB0byA+IDIuMCBrSHogKi8NCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWluQmFuZE51bWJlckxvbmdbMTJdID0NCit7IDExLCAxMiwgMTUsIDE2LCAxNywgMjAsIDI1LCAyNiwgMjQsIDI4LCAzMCwgMzEgfTsNCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWluQmFuZE51bWJlclNob3J0WzEyXSA9DQoreyAyLCAyLCAyLCAzLCAzLCA0LCA2LCA2LCA4LCAxMCwgMTAsIDEyIH07DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIE1haW4vTG93IFByb2ZpbGUgVE5TIFBhcmFtZXRlcnMgICAgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbMTJdID0NCit7IDMxLCAzMSwgMzQsIDQwLCA0MiwgNTEsIDQ2LCA0NiwgNDIsIDQyLCA0MiwgMzkgfTsNCisNCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWF4QmFuZHNTaG9ydE1haW5Mb3dbMTJdID0NCit7IDksIDksIDEwLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0IH07CisKKworc3RhdGljIHZvaWQgQ2FsY1dlaWdodGVkU3BlY3RydW0oY29uc3QgV29yZDMyIHNwZWN0cnVtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2VpZ2h0ZWRTcGVjdHJ1bVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyKiBzZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYqIHNmYk9mZnNldCwgV29yZDE2IGxwY1N0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBscGNTdG9wTGluZSwgV29yZDE2IGxwY1N0YXJ0QmFuZCxXb3JkMTYgbHBjU3RvcEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBXb3JrMzIpOworCisKKwordm9pZCBBdXRvQ29ycmVsYXRpb24oY29uc3QgV29yZDE2IGlucHV0W10sIFdvcmQzMiBjb3JyW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNhbXBsZXMsIFdvcmQxNiBjb3JyQ29lZmYpOworc3RhdGljIFdvcmQxNiBBdXRvVG9QYXJjb3IoV29yZDMyIHdvcmtCdWZmZXJbXSwgV29yZDMyIHJlZmxDb2VmZltdLCBXb3JkMTYgbnVtT2ZDb2VmZik7CisKK3N0YXRpYyBXb3JkMTYgQ2FsY1Ruc0ZpbHRlcihjb25zdCBXb3JkMTYqIHNpZ25hbCwgY29uc3QgV29yZDMyIHdpbmRvd1tdLCBXb3JkMTYgbnVtT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zT3JkZXIsIFdvcmQzMiBwYXJjb3JbXSk7CisKKworc3RhdGljIHZvaWQgUGFyY29yMkluZGV4KGNvbnN0IFdvcmQzMiBwYXJjb3JbXSwgV29yZDE2IGluZGV4W10sIFdvcmQxNiBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKTsKKworc3RhdGljIHZvaWQgSW5kZXgyUGFyY29yKGNvbnN0IFdvcmQxNiBpbmRleFtdLCBXb3JkMzIgcGFyY29yW10sIFdvcmQxNiBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKTsKKworCisKK3N0YXRpYyB2b2lkIEFuYWx5c2lzRmlsdGVyTGF0dGljZShjb25zdCBXb3JkMzIgc2lnbmFsW10sIFdvcmQxNiBudW1PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBwYXJDb2VmZltdLCBXb3JkMTYgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIG91dHB1dFtdKTsKKworCisvKioKKyoKKyogZnVuY3Rpb24gbmFtZTogRnJlcVRvQmFuZFdpdGhSb3VuZGluZworKiBkZXNjcmlwdGlvbjogIFJldHJpZXZlIGluZGV4IG9mIG5lYXJlc3QgYmFuZCBib3JkZXIKKyogcmV0dXJudDoJCWluZGV4CisqCisqLworc3RhdGljIFdvcmQxNiBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFdvcmQzMiBmcmVxLCAgICAgICAgICAgICAgICAgICAvKiE8IGZyZXF1ZW5jeSBpbiBIZXJ0eiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBmcywgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIZXJ0eiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZkJhbmRzLCAgICAgICAgICAgICAvKiE8IHRvdGFsIG51bWJlciBvZiBiYW5kcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZFN0YXJ0T2Zmc2V0KSAvKiE8IHRhYmxlIG9mIGJhbmQgYm9yZGVycyAqLworeworICBXb3JkMzIgbGluZU51bWJlciwgYmFuZDsKKyAgV29yZDMyIHRlbXAsIHNoaWZ0OworCisgIC8qICBhc3NlcnQoZnJlcSA+PSAwKTsgICovCisgIHNoaWZ0ID0gbm9ybV9sKGZzKTsKKyAgbGluZU51bWJlciA9IChleHRyYWN0X2woZml4bXVsKChiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10gPDwgMiksRGl2XzMyKGZyZXEgPDwgc2hpZnQsZnMgPDwgc2hpZnQpKSkgKyAxKSA+PiAxOworIAorICAvKiBmcmVxID4gZnMvMiAqLworICB0ZW1wID0gbGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYgKHRlbXAgPj0gMCkKKyAgICByZXR1cm4gbnVtT2ZCYW5kczsKKworICAvKiBmaW5kIGJhbmQgdGhlIGxpbmUgbnVtYmVyIGxpZXMgaW4gKi8KKyAgZm9yIChiYW5kPTA7IGJhbmQ8bnVtT2ZCYW5kczsgYmFuZCsrKSB7CisgICAgdGVtcCA9IGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAodGVtcCA+IDApIGJyZWFrOworICB9CisKKyAgdGVtcCA9IChsaW5lTnVtYmVyIC0gYmFuZFN0YXJ0T2Zmc2V0W2JhbmRdKTsKKyAgdGVtcCA9ICh0ZW1wIC0gKGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYgKCB0ZW1wID4gMCApCisgIHsKKyAgICBiYW5kID0gYmFuZCArIDE7CisgIH0KKworICByZXR1cm4gZXh0cmFjdF9sKGJhbmQpOworfQorCisKKy8qKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcKKyogZGVzY3JpcHRpb246ICBGaWxsIFROU19DT05GSUcgc3RydWN0dXJlIHdpdGggc2Vuc2libGUgY29udGVudCBmb3IgbG9uZyBibG9ja3MKKyogcmV0dXJuczoJCTAgaWYgc3VjY2VzcworKgorKi8KK1dvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdFJhdGUsICAgICAgICAgIC8qITwgYml0cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLCAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLCAgICAgICAgICAgICAvKiE8IFROUyBDb25maWcgc3RydWN0IChtb2RpZmllZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcEMsIC8qITwgcHN5IGNvbmZpZyBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSkgICAgICAgICAgICAgIC8qITwgdG5zIGFjdGl2ZSBmbGFnICovCit7CisKKyAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsOworICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHRDLT50bnNTdGFydEZyZXEgPSAxMjc1OworICB0Qy0+Y29lZlJlcyAgICAgID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIHRvIGF2b2lkIGludGVnZXIgZGl2aXNpb24gKi8KKyAgaWYgKCBzdWIoY2hhbm5lbHMsMikgPT0gMCApIHsgCisgICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlID4+IDE7ICAgIAorICB9CisgIGVsc2UgeworICAgIGJpdHJhdGVQZXJDaGFubmVsID0gYml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKKworICB0Qy0+dG5zQWN0aXZlID0gYWN0aXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIG5vdyBjYWxjIGJhbmQgYW5kIGxpbmUgYm9yZGVycyAqLworICB0Qy0+dG5zU3RvcEJhbmQgPSBtaW4ocEMtPnNmYkNudCwgdEMtPnRuc01heFNmYik7CisgIHRDLT50bnNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0b3BCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPnRuc1N0YXJ0QmFuZCA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcodEMtPnRuc1N0YXJ0RnJlcSwgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CisKKyAgdEMtPnRuc01vZGlmeUJlZ2luQ2IgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFROU19NT0RJRllfQkVHSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOworCisgIHRDLT50bnNSYXRpb1BhdGNoTG93ZXN0Q2IgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFJBVElPX1BBVENIX0xPV0VSX0JPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CisKKworICB0Qy0+dG5zU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPmxwY1N0b3BCYW5kID0gdG5zTWF4QmFuZHNMb25nTWFpbkxvd1twQy0+c2FtcFJhdGVJZHhdOworICB0Qy0+bHBjU3RvcEJhbmQgPSBtaW4odEMtPmxwY1N0b3BCYW5kLCBwQy0+c2ZiQWN0aXZlKTsKKworICB0Qy0+bHBjU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07ICAgDQorICANCisgIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyTG9uZ1twQy0+c2FtcFJhdGVJZHhdOworCisgIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPnRocmVzaG9sZCA9IFROU19HQUlOX1RIUkVTSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworICByZXR1cm4oMCk7Cit9CisKKy8qKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0CisqIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIHNob3J0IGJsb2NrcworKiByZXR1cm5zOgkJMCBpZiBzdWNjZXNzCisqCisqLworV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdFJhdGUsICAgICAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLCAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLCAgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcEMsIC8qITwgcHN5IGNvbmZpZyBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAgLyohPCB0bnMgYWN0aXZlIGZsYWcgKi8KK3sKKyAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsOworICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUl9TSE9SVDsKKyAgdEMtPnRuc1N0YXJ0RnJlcSA9IDI3NTA7CisgIHRDLT5jb2VmUmVzICAgICAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgLyogdG8gYXZvaWQgaW50ZWdlciBkaXZpc2lvbiAqLworICBpZiAoIHN1YihjaGFubmVscywyKSA9PSAwICkgeworICAgIGJpdHJhdGVQZXJDaGFubmVsID0gTF9zaHIoYml0UmF0ZSwxKTsgICAgCisgIH0KKyAgZWxzZSB7CisgICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICB0Qy0+dG5zTWF4U2ZiID0gdG5zTWF4QmFuZHNTaG9ydE1haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKKworICB0Qy0+dG5zQWN0aXZlID0gYWN0aXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIG5vdyBjYWxjIGJhbmQgYW5kIGxpbmUgYm9yZGVycyAqLworICB0Qy0+dG5zU3RvcEJhbmQgPSBtaW4ocEMtPnNmYkNudCwgdEMtPnRuc01heFNmYik7CisgIHRDLT50bnNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0b3BCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPnRuc1N0YXJ0QmFuZD1GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LCAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKKworICB0Qy0+dG5zTW9kaWZ5QmVnaW5DYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoVE5TX01PRElGWV9CRUdJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CisKKyAgdEMtPnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKKworCisgIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPmxwY1N0b3BCYW5kID0gdG5zTWF4QmFuZHNTaG9ydE1haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsNCisKKyAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7CisKKyAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICB0Qy0+bHBjU3RhcnRCYW5kID0gdG5zTWluQmFuZE51bWJlclNob3J0W3BDLT5zYW1wUmF0ZUlkeF07DQorCisgIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPnRocmVzaG9sZCA9IFROU19HQUlOX1RIUkVTSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgcmV0dXJuKDApOworfQorCisvKioKKyoKKyogZnVuY3Rpb24gbmFtZTogVG5zRGV0ZWN0CisqIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlIFROUyBmaWx0ZXIgYW5kIGRlY2lkZSBvbiBUTlMgdXNhZ2UgCisqIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKKyoKKyovCitXb3JkMzIgVG5zRGV0ZWN0KFROU19EQVRBKiB0bnNEYXRhLCAgICAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLworICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgV29yZDMyKiBwU2NyYXRjaFRucywgICAgICAvKiE8IHBvaW50ZXIgdG8gc2NyYXRjaCBzcGFjZSAqLworICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiT2Zmc2V0W10sIC8qITwgc2NhbGVmYWN0b3Igc2l6ZSBhbmQgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwgICAgICAgICAvKiE8IHNwZWN0cmFsIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLCAgICAvKiE8IHN1YmJsb2NrIG51bSAqLworICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLCAgICAgICAgIC8qITwgYmxvY2t0eXBlIChsb25nIG9yIHNob3J0KSAqLworICAgICAgICAgICAgICAgICBXb3JkMzIgKiBzZmJFbmVyZ3kpICAgICAgIC8qITwgc2ZiLXdpc2UgZW5lcmd5ICovCit7CisKKyAgV29yZDMyICBwcmVkaWN0aW9uR2FpbjsKKyAgV29yZDMyICB0ZW1wOworICBXb3JkMzIqIHBXb3JrMzIgPSAmcFNjcmF0Y2hUbnNbc3ViQmxvY2tOdW1iZXIgPj4gOF07CisgIFdvcmQxNiogcFdlaWdodGVkU3BlY3RydW0gPSAoV29yZDE2ICopJnBTY3JhdGNoVG5zW3N1YkJsb2NrTnVtYmVyID4+IDhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmICh0Qy50bnNBY3RpdmUpIHsKKyAgICBDYWxjV2VpZ2h0ZWRTcGVjdHJ1bShzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwV2VpZ2h0ZWRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdG9wTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmszMik7CisKKyAgICB0ZW1wID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIHRlbXAgIT0gMCApIHsKKyAgICAgICAgcHJlZGljdGlvbkdhaW4gPSBDYWxjVG5zRmlsdGVyKCAmcFdlaWdodGVkU3BlY3RydW1bdEMubHBjU3RhcnRMaW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5hY2ZXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcExpbmUgLSB0Qy5scGNTdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wYXJjb3IpOworCisKKyAgICAgICAgdGVtcCA9IHByZWRpY3Rpb25HYWluIC0gdEMudGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICggdGVtcCA+IDAgKSB7CisgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47ICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNleworCisgICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wYXJjb3IpOworCisgICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICggdGVtcCA+IDAgKSB7CisgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0ucHJlZGljdGlvbkdhaW4gPSBwcmVkaWN0aW9uR2FpbjsgICAgIAorICAgIH0KKworICB9CisgIGVsc2V7CisKKyAgICB0ZW1wID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIHRlbXAgIT0gMCApIHsKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IDA7ICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisKKyAgcmV0dXJuKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBUbnNTeW5jCisqIGRlc2NyaXB0aW9uOiB1cGRhdGUgdG5zIHBhcmFtZXRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFRuc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAorICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAorICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgdEMsCisgICAgICAgICAgICAgY29uc3QgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAorICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpCit7CisgICBUTlNfU1VCQkxPQ0tfSU5GTyAqc2JJbmZvRGVzdDsKKyAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7CisgICBXb3JkMzIgaSwgdGVtcDsKKworICAgdGVtcCA9ICBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGlmICggdGVtcCAhPSAwICkgeworICAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgfQorICAgZWxzZSB7CisgICAgICBzYkluZm9EZXN0ID0gJnRuc0RhdGFEZXN0LT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07ICAgICAgICAgICAgICAgICAgICAgCisgICAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsgICAgICAgICAgICAgICAgICAgICAgCisgICB9CisKKyAgIGlmICgxMDAqYWJzX3Moc2JJbmZvRGVzdC0+cHJlZGljdGlvbkdhaW4gLSBzYkluZm9TcmMtPnByZWRpY3Rpb25HYWluKSA8CisgICAgICAgKDMgKiBzYkluZm9EZXN0LT5wcmVkaWN0aW9uR2FpbikpIHsKKyAgICAgIHNiSW5mb0Rlc3QtPnRuc0FjdGl2ZSA9IHNiSW5mb1NyYy0+dG5zQWN0aXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGZvciAoIGk9MDsgaTwgdEMubWF4T3JkZXI7IGkrKykgeworICAgICAgICBzYkluZm9EZXN0LT5wYXJjb3JbaV0gPSBzYkluZm9TcmMtPnBhcmNvcltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogVG5zRW5jb2RlCisqIGRlc2NyaXB0aW9uOiBkbyBUTlMgZmlsdGVyaW5nCisqIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFRuc0VuY29kZShUTlNfSU5GTyogdG5zSW5mbywgICAgIC8qITwgdG5zIGluZm8gc3RydWN0dXJlIChtb2RpZmllZCkgKi8KKyAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsICAgICAvKiE8IHRucyBkYXRhIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCisgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZlNmYiwgICAgICAgLyohPCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCisgICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsICAgICAgICAgLyohPCB0bnMgY29uZmlnIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgICBXb3JkMTYgbG93UGFzc0xpbmUsICAgIC8qITwgbG93cGFzcyBsaW5lICovCisgICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sICAgICAgLyohPCBzcGVjdHJhbCBkYXRhIChtb2RpZmllZCkgKi8KKyAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLCAvKiE8IHN1YmJsb2NrIG51bSAqLworICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlKSAgICAgIC8qITwgYmxvY2t0eXBlIChsb25nIG9yIHNob3J0KSAqLworeworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRlbXBfczsKKyAgV29yZDMyIHRlbXA7DQorICBUTlNfU1VCQkxPQ0tfSU5GTyAqcHN1YkJsb2NrSW5mbzsKKworICB0ZW1wX3MgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZiAoIHRlbXBfcyAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHBzdWJCbG9ja0luZm8gPSAmdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsNCisJaWYgKHBzdWJCbG9ja0luZm8tPnRuc0FjdGl2ZSA9PSAwKSB7CisgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICBQYXJjb3IySW5kZXgocHN1YkJsb2NrSW5mby0+cGFyY29yLAorICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPmNvZWYsCisgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCisgICAgICAgICAgICAgICAgICAgdEMuY29lZlJlcyk7CisKKyAgICAgIEluZGV4MlBhcmNvcih0bnNJbmZvLT5jb2VmLAorICAgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKKyAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKKworICAgICAgZm9yIChpPXRDLm1heE9yZGVyIC0gMTsgaT49MDsgaS0tKSAgeworICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldIC0gVE5TX1BBUkNPUl9USFJFU0g7ICAgICAgICAgCisgICAgICAgIGlmICggdGVtcCA+IDAgKQorICAgICAgICAgIGJyZWFrOworICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldICsgVE5TX1BBUkNPUl9USFJFU0g7ICAgICAgICAgCisgICAgICAgIGlmICggdGVtcCA8IDAgKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdID0gaSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGZvciAoaT1zdWJCbG9ja051bWJlcisxOyBpPFRSQU5TX0ZBQzsgaSsrKSB7CisgICAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSA9IHRDLmNvZWZSZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdID0gbnVtT2ZTZmIgLSB0Qy50bnNTdGFydEJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbih0Qy50bnNTdG9wTGluZSxsb3dQYXNzTGluZSkgLSB0Qy50bnNTdGFydExpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSk7CisKKyAgICB9CisgIH0gICAgIC8qIGlmIChibG9ja1R5cGUhPVNIT1JUX1dJTkRPVykgKi8KKyAgZWxzZSAvKnNob3J0IGJsb2NrKi8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwc3ViQmxvY2tJbmZvID0gJnRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsNCisJaWYgKHBzdWJCbG9ja0luZm8tPnRuc0FjdGl2ZSA9PSAwKSB7CisgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICBQYXJjb3IySW5kZXgocHN1YkJsb2NrSW5mby0+cGFyY29yLAorICAgICAgICAgICAgICAgICAgICZ0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyKlROU19NQVhfT1JERVJfU0hPUlRdLAorICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAorICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOworCisgICAgICBJbmRleDJQYXJjb3IoJnRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXIqVE5TX01BWF9PUkRFUl9TSE9SVF0sCisgICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAorICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAorICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOworICAgICAgZm9yIChpPSh0Qy5tYXhPcmRlciAtIDEpOyBpPj0wOyBpLS0pICB7CisgICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsgICAgCisgICAgICAgICBpZiAoIHRlbXAgPiAwICkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldICsgVE5TX1BBUkNPUl9USFJFU0g7ICAgIAorICAgICAgICBpZiAoIHRlbXAgPCAwICkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSA9IGkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdG5zSW5mby0+Y29lZlJlc1tzdWJCbG9ja051bWJlcl0gPSB0Qy5jb2VmUmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXSA9IG51bU9mU2ZiIC0gdEMudG5zU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksICh0Qy50bnNTdG9wTGluZSAtIHRDLnRuc1N0YXJ0TGluZSksCisgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdLAorICAgICAgICAgICAgICAgICAmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pKTsKKworICAgIH0KKyAgfQorCisgIHJldHVybigwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogbV9wb3cyX2NvcmRpYworKiBkZXNjcmlwdGlvbjogSXRlcmF0aXZlIHBvd2VyIGZ1bmN0aW9uCisqCisqCUNhbGN1bGF0ZXMgcG93KDIuMCx4LTEuMCooc2NhbGUrMSkpIHdpdGggSU5UX0JJVFMgYml0IHByZWNpc2lvbgorKgl1c2luZyBtb2RpZmllZCBjb3JkaWMgYWxnb3JpdGhtCisqIHJldHVybnM6ICAgICB0aGUgcmVzdWx0IG9mIHBvdzIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQzMiBtX3BvdzJfY29yZGljKFdvcmQzMiB4LCBXb3JkMTYgc2NhbGUpCit7CisgIFdvcmQzMiBrOworCisgIFdvcmQzMiBhY2N1X3kgPSAweDQwMDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBhY2N1X3kgPSBMX3NocihhY2N1X3ksc2NhbGUpOworCisgIGZvcihrPTE7IGs8SU5UX0JJVFM7IGsrKykgeworICAgIGNvbnN0IFdvcmQzMiB6ID0gbV9sb2cyX3RhYmxlW2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHdoaWxlKExfc3ViKHgseikgPj0gMCkgeworICAgICAgIAorICAgICAgeCA9IExfc3ViKHgsIHopOworICAgICAgYWNjdV95ID0gTF9hZGQoYWNjdV95LCAoYWNjdV95ID4+IGspKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuKGFjY3VfeSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENhbGNXZWlnaHRlZFNwZWN0cnVtCisqIGRlc2NyaXB0aW9uOiBDYWxjdWxhdGUgd2VpZ2h0ZWQgc3BlY3RydW0gZm9yIExQQyBjYWxjdWxhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBDYWxjV2VpZ2h0ZWRTcGVjdHJ1bShjb25zdCBXb3JkMzIgIHNwZWN0cnVtW10sICAgICAgICAgLyohPCBpbnB1dCBzcGVjdHJ1bSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICB3ZWlnaHRlZFNwZWN0cnVtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneSwgICAgICAgICAgLyohPCBzZmIgZW5lcmdpZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0b3BMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0b3BCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpwV29yazMyKQoreworICAgICNkZWZpbmUgSU5UX0JJVFNfU0NBTCAxPDwoSU5UX0JJVFMvMikKKworICAgIFdvcmQzMiBpLCBzZmIsIHNoaWZ0OworICAgIFdvcmQzMiBtYXhTaGlmdDsKKyAgICBXb3JkMzIgdG1wX3MsIHRtcDJfczsKKyAgICBXb3JkMzIgdG1wLCB0bXAyOworICAgIFdvcmQzMiBtYXhXUzsKKyAgICBXb3JkMzIgdG5zU2ZiTWVhbltNQVhfU0ZCXTsgICAgLyogbGVuZ3RoIFtscGNTdG9wQmFuZC1scGNTdGFydEJhbmRdIHNob3VsZCBiZSBzdWZmaWNpZW50IGhlcmUgKi8KKworICAgIG1heFdTID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgICAvKiBjYWxjIDEuMCoyXi1JTlRfQklUUy8yL3NxcnQoZW4pICovCisgICAgZm9yKCBzZmIgPSBscGNTdGFydEJhbmQ7IHNmYiA8IGxwY1N0b3BCYW5kOyBzZmIrKykgeworCisgICAgICB0bXAyID0gc2ZiRW5lcmd5W3NmYl0gLSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYoIHRtcDIgPiAwKSB7CisgICAgICAgIHRtcCA9IHJzcXJ0KHNmYkVuZXJneVtzZmJdLCBJTlRfQklUUyk7CisJCWlmKHRtcCA+IElOVF9CSVRTX1NDQUwpIA0KKwkJew0KKwkJCXNoaWZ0ID0gIG5vcm1fbCh0bXApOw0KKwkJCXRtcCA9IERpdl8zMiggSU5UX0JJVFNfU0NBTCA8PCBzaGlmdCwgdG1wIDw8IHNoaWZ0ICk7IAorCQl9CisJCWVsc2UKKwkJeworCQkJdG1wID0gMHg3ZmZmZmZmZjsgCisJCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0bXAgPSAweDdmZmZmZmZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfSAKKyAgICAgIHRuc1NmYk1lYW5bc2ZiXSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICAvKiBzcHJlYWQgbm9ybWFsaXplZCB2YWx1ZXMgZnJvbSBzZmJzIHRvIGxpbmVzICovCisgICAgc2ZiID0gbHBjU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgdG1wID0gdG5zU2ZiTWVhbltzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZm9yICggaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7CisgICAgICB0bXBfcyA9IHNmYk9mZnNldFtzZmIgKyAxXSAtIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpZiAoIHRtcF9zID09IDAgKSB7CisgICAgICAgIHNmYiA9IHNmYiArIDE7CisgICAgICAgIHRtcDJfcyA9IHNmYiArIDEgLSBscGNTdG9wQmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICh0bXAyX3MgPD0gMCkgeworICAgICAgICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICB9CisgICAgICBwV29yazMyW2ldID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIC8qZmlsdGVyIGRvd24qLworICAgIGZvciAoaT0obHBjU3RvcExpbmUgLSAyKTsgaT49bHBjU3RhcnRMaW5lOyBpLS0peworICAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgKyAxXSkgPj4gMTsKKyAgICB9CisgICAgLyogZmlsdGVyIHVwICovCisgICAgZm9yIChpPShscGNTdGFydExpbmUgKyAxKTsgaTxscGNTdG9wTGluZTsgaSsrKXsKKyAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgLSAxXSkgPj4gMTsKKyAgICB9CisKKyAgICAvKiB3ZWlnaHQgYW5kIG5vcm1hbGl6ZSAqLworICAgIGZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7CisgICAgICBwV29yazMyW2ldID0gTVVMSElHSChwV29yazMyW2ldLCBzcGVjdHJ1bVtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbWF4V1MgfD0gTF9hYnMocFdvcmszMltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBtYXhTaGlmdCA9IG5vcm1fbChtYXhXUyk7CisNCisJbWF4U2hpZnQgPSAxNiAtIG1heFNoaWZ0Ow0KKyAgICBpZihtYXhTaGlmdCA+PSAwKQ0KKwl7DQorCQlmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspew0KKwkJCXdlaWdodGVkU3BlY3RydW1baV0gPSBwV29yazMyW2ldID4+IG1heFNoaWZ0Ow0KKwkJfQ0KKyAgICB9DQorCWVsc2UNCisJew0KKwkJbWF4U2hpZnQgPSAtbWF4U2hpZnQ7DQorCQlmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspew0KKwkJCXdlaWdodGVkU3BlY3RydW1baV0gPSBzYXR1cmF0ZShwV29yazMyW2ldIDw8IG1heFNoaWZ0KTsNCisJCX0NCisJfQorfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQ2FsY1Ruc0ZpbHRlcgorKiBkZXNjcmlwdGlvbjogIExQQyBjYWxjdWxhdGlvbiBmb3Igb25lIFROUyBmaWx0ZXIKKyogcmV0dXJuczogICAgICBwcmVkaWN0aW9uIGdhaW4KKyogaW5wdXQ6ICAgICAgICBzaWduYWwgc3BlY3RydW0sIGFjZiB3aW5kb3csIG5vLiBvZiBzcGVjdHJhbCBsaW5lcywKKyogICAgICAgICAgICAgICAgbWF4LiBUTlMgb3JkZXIsIHB0ci4gdG8gcmVmbGVjdGlvbiBvY2VmZmljaWVudHMKKyogb3V0cHV0OiAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cworKihoYWxmKSB3aW5kb3cgc2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIHRuc09yZGVyICEhKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgV29yZDE2IENhbGNUbnNGaWx0ZXIoY29uc3QgV29yZDE2ICpzaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIHdpbmRvd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZkxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0bnNPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgcGFyY29yW10pCit7CisgIFdvcmQzMiBwYXJjb3JXb3JrQnVmZmVyWzIqVE5TX01BWF9PUkRFUisxXTsKKyAgV29yZDMyIHByZWRpY3Rpb25HYWluOworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRuc09yZGVyUGx1czEgPSB0bnNPcmRlciArIDE7CisKKyAgYXNzZXJ0KHRuc09yZGVyIDw9IFROU19NQVhfT1JERVIpOyAgICAgIC8qIHJlbW92ZSBhc3NlcnRzIGxhdGVyPyAoYnRnKSAqLworCisgIGZvcihpPTA7aTx0bnNPcmRlcjtpKyspIHsKKyAgICBwYXJjb3JbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIEF1dG9Db3JyZWxhdGlvbihzaWduYWwsIHBhcmNvcldvcmtCdWZmZXIsIG51bU9mTGluZXMsIHRuc09yZGVyUGx1czEpOworCisgIC8qIGVhcmx5IHJldHVybiBpZiBzaWduYWwgaXMgdmVyeSBsb3c6IHNpZ25hbCBwcmVkaWN0aW9uIG9mZiwgd2l0aCB6ZXJvIHBhcmNvciBjb2VmZnMgKi8KKyAgaWYgKHBhcmNvcldvcmtCdWZmZXJbMF0gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBwcmVkaWN0aW9uR2FpbiA9IEF1dG9Ub1BhcmNvcihwYXJjb3JXb3JrQnVmZmVyLCBwYXJjb3IsIHRuc09yZGVyKTsKKworICByZXR1cm4ocHJlZGljdGlvbkdhaW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQXV0b0NvcnJlbGF0aW9uCisqIGRlc2NyaXB0aW9uOiAgY2FsYy4gYXV0b2NvcnJlbGF0aW9uIChhY2YpCisqIHJldHVybnM6ICAgICAgLQorKiBpbnB1dDogICAgICAgIGlucHV0IHZhbHVlcywgbm8uIG9mIGlucHV0IHZhbHVlcywgbm8uIG9mIGFjZiB2YWx1ZXMKKyogb3V0cHV0OiAgICAgICBhY2YgdmFsdWVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQVJNVjVFDQordm9pZCBBdXRvQ29ycmVsYXRpb24oY29uc3QgV29yZDE2CQkgaW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgY29ycltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBjb3JyQ29lZmYpIHsKKyAgV29yZDMyIGksIGosIGlzYW1wbGVzOworICBXb3JkMzIgYWNjdTsKKyAgV29yZDMyIHNjZjsKKworICBzY2YgPSAxMCAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKw0KKyAgaXNhbXBsZXMgPSBzYW1wbGVzOworICAvKiBjYWxjIGZpcnN0IGNvcnJDb2VmOiAgUlswXSA9IHN1bSB7IHRbaV0gKiB0W2ldIH0gOyBpID0gMC4uTi0xICovCisgIGFjY3UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvcihqPTA7IGo8aXNhbXBsZXM7IGorKykgeworICAgIGFjY3UgPSBMX2FkZChhY2N1LCAoKGlucHV0W2pdICogaW5wdXRbal0pID4+IHNjZikpOw0KKyAgfQorICBjb3JyWzBdID0gYWNjdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIGVhcmx5IHRlcm1pbmF0aW9uIGlmIGFsbCBjb3JyIGNvZWZmcyBhcmUgbGlrZWx5IGdvaW5nIHRvIGJlIHplcm8gKi8KKyAgaWYoY29yclswXSA9PSAwKSByZXR1cm4gOworCisgIC8qIGNhbGMgYWxsIG90aGVyIGNvcnJDb2VmOiAgUltqXSA9IHN1bSB7IHRbaV0gKiB0W2kral0gfSA7IGkgPSAwLi4oTi1qLTEpLCBqPTEuLnAgKi8KKyAgZm9yKGk9MTsgaTxjb3JyQ29lZmY7IGkrKykgeworICAgIGlzYW1wbGVzID0gaXNhbXBsZXMgLSAxOworICAgIGFjY3UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvcihqPTA7IGo8aXNhbXBsZXM7IGorKykgeworICAgICAgYWNjdSA9IExfYWRkKGFjY3UsICgoaW5wdXRbal0gKiBpbnB1dFtqK2ldKSA+PiBzY2YpKTsNCisgICAgfQorICAgIGNvcnJbaV0gPSBhY2N1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9Cit9ICAgIAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBBdXRvVG9QYXJjb3IKKyogZGVzY3JpcHRpb246ICBjb252ZXJzaW9uIGF1dG9jb3JyZWxhdGlvbiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cworKiByZXR1cm5zOiAgICAgIHByZWRpY3Rpb24gZ2FpbgorKiBpbnB1dDogICAgICAgIDxvcmRlcisxPiBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBvdXRwdXQgdmFsdWVzICg9b3JkZXIpLAorKiAgICAgICAgICAgICAgIHB0ci4gdG8gd29ya2J1ZmZlciAocmVxdWlyZWQgc2l6ZTogMipvcmRlcikKKyogb3V0cHV0OiAgICAgICA8b3JkZXI+IHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgQXV0b1RvUGFyY29yKFdvcmQzMiB3b3JrQnVmZmVyW10sIFdvcmQzMiByZWZsQ29lZmZbXSwgV29yZDE2IG51bU9mQ29lZmYpIHsKKworICBXb3JkMzIgaSwgaiwgc2hpZnQ7CisgIFdvcmQzMiAqcFdvcmtCdWZmZXI7IC8qIHRlbXAgcG9pbnRlciAqLworICBXb3JkMzIgcHJlZGljdGlvbkdhaW4gPSAwOworICBXb3JkMzIgbnVtLCBkZW5vbTsKKyAgV29yZDMyIHRlbXAsIHdvcmtCdWZmZXIwOworICAgCisKKyAgbnVtID0gd29ya0J1ZmZlclswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdGVtcCA9IHdvcmtCdWZmZXJbbnVtT2ZDb2VmZl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wOyBpPG51bU9mQ29lZmYtMTsgaSsrKSB7CisgICAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB3b3JrQnVmZmVyW2kgKyAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKKyAgICBXb3JkMzIgcmVmYzsKKworICAgICAKKyAgICBpZiAod29ya0J1ZmZlclswXSA8IExfYWJzKHdvcmtCdWZmZXJbaSArIG51bU9mQ29lZmZdKSkgeworICAgICAgcmV0dXJuIDAgOworICAgIH0KKwlzaGlmdCA9IG5vcm1fbCh3b3JrQnVmZmVyWzBdKTsNCisJd29ya0J1ZmZlcjAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgd29ya0J1ZmZlclswXSA8PCBzaGlmdCk7CisgICAgLyogY2FsY3VsYXRlIHJlZmMgPSAtd29ya0J1ZmZlcltudW1PZkNvZWZmK2ldIC8gd29ya0J1ZmZlclswXTsgLTEgPD0gcmVmYyA8IDEgKi8KKwlyZWZjID0gTF9uZWdhdGUoZml4bXVsKHdvcmtCdWZmZXJbbnVtT2ZDb2VmZiArIGldLCB3b3JrQnVmZmVyMCkpOworCisgICAgcmVmbENvZWZmW2ldID0gcmVmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHBXb3JrQnVmZmVyID0gJih3b3JrQnVmZmVyW251bU9mQ29lZmZdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgZm9yKGo9aTsgajxudW1PZkNvZWZmOyBqKyspIHsKKyAgICAgIFdvcmQzMiBhY2N1MSwgYWNjdTI7CisgICAgICBhY2N1MSA9IExfYWRkKHBXb3JrQnVmZmVyW2pdLCBmaXhtdWwocmVmYywgd29ya0J1ZmZlcltqIC0gaV0pKTsKKyAgICAgIGFjY3UyID0gTF9hZGQod29ya0J1ZmZlcltqIC0gaV0sIGZpeG11bChyZWZjLCBwV29ya0J1ZmZlcltqXSkpOworICAgICAgcFdvcmtCdWZmZXJbal0gPSBhY2N1MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgd29ya0J1ZmZlcltqIC0gaV0gPSBhY2N1MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorCisgIGRlbm9tID0gTVVMSElHSCh3b3JrQnVmZmVyWzBdLCBOT1JNX0NPRUYpOworICAgCisgIGlmIChkZW5vbSAhPSAwKSB7CisgICAgV29yZDMyIHRlbXA7DQorCXNoaWZ0ID0gbm9ybV9sKGRlbm9tKTsNCisJdGVtcCA9IERpdl8zMigxIDw8IHNoaWZ0LCBkZW5vbSA8PCBzaGlmdCk7CisgICAgcHJlZGljdGlvbkdhaW4gPSBmaXhtdWwobnVtLCB0ZW1wKTsKKyAgfQorCisgIHJldHVybiBleHRyYWN0X2wocHJlZGljdGlvbkdhaW4pOworfQorCisKKworc3RhdGljIFdvcmQxNiBTZWFyY2gzKFdvcmQzMiBwYXJjb3IpCit7CisgIFdvcmQzMiBpbmRleCA9IDA7CisgIFdvcmQzMiBpOworICBXb3JkMzIgdGVtcDsKKyAgIAorICBmb3IgKGk9MDtpPDg7aSsrKSB7CisgICAgdGVtcCA9IExfc3ViKCBwYXJjb3IsIHRuc0NvZWZmM0JvcmRlcnNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKHRlbXAgPiAwKQorICAgICAgaW5kZXg9aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA0KTsKK30KKworc3RhdGljIFdvcmQxNiBTZWFyY2g0KFdvcmQzMiBwYXJjb3IpCit7CisgIFdvcmQzMiBpbmRleCA9IDA7CisgIFdvcmQzMiBpOworICBXb3JkMzIgdGVtcDsKKyAgIAorCisgIGZvciAoaT0wO2k8MTY7aSsrKSB7CisgICAgdGVtcCA9IExfc3ViKHBhcmNvciwgdG5zQ29lZmY0Qm9yZGVyc1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKHRlbXAgPiAwKQorICAgICAgaW5kZXg9aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA4KTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbm5hbWU6IFBhcmNvcjJJbmRleAorKiBkZXNjcmlwdGlvbjogIHF1YW50aXphdGlvbiBpbmRleCBmb3IgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUGFyY29yMkluZGV4KGNvbnN0IFdvcmQzMiBwYXJjb3JbXSwgICAvKiE8IHBhcmNvciBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgaW5kZXhbXSwgICAgICAgICAgLyohPCBxdWFudGl6ZWQgY29lZmYgaW5kaWNlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgICAvKiE8IGZpbHRlciBvcmRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiaXRzUGVyQ29lZmYpIHsgICAvKiE8IHF1YW50aXplciByZXNvbHV0aW9uICovCisgIFdvcmQzMiBpOworICBXb3JkMzIgdGVtcDsKKworICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspIHsKKyAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIGluZGV4W2ldID0gU2VhcmNoMyhwYXJjb3JbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9IAorICAgIGVsc2UgeworICAgICAgaW5kZXhbaV0gPSBTZWFyY2g0KHBhcmNvcltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb25uYW1lOiBJbmRleDJQYXJjb3IKKyogZGVzY3JpcHRpb246ICBJbnZlcnNlIHF1YW50aXphdGlvbiBmb3IgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgSW5kZXgyUGFyY29yKGNvbnN0IFdvcmQxNiBpbmRleFtdLCAgLyohPCBxdWFudGl6ZWQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHBhcmNvcltdLCAgICAgICAvKiE8IHB0ci4gdG8gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMgKG91dHB1dCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3JkZXIsICAgICAgICAgIC8qITwgbm8uIG9mIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiaXRzUGVyQ29lZmYpICAgLyohPCBxdWFudGl6ZXIgcmVzb2x1dGlvbiAqLworeworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRlbXA7CisKKyAgZm9yIChpPTA7IGk8b3JkZXI7IGkrKykgeworICAgIHRlbXAgPSBiaXRzUGVyQ29lZmYgLSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICggdGVtcCA9PSAwICkgeworICAgICAgICBwYXJjb3JbaV0gPSB0bnNDb2VmZjRbaW5kZXhbaV0gKyA4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmYzW2luZGV4W2ldICsgNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9ubmFtZTogRklSTGF0dGljZQorKiBkZXNjcmlwdGlvbjogIGluIHBsYWNlIGxhdHRpY2UgZmlsdGVyaW5nIG9mIHNwZWN0cmFsIGRhdGEKKyogcmV0dXJuczoJCXBvaW50ZXIgdG8gbW9kaWZpZWQgZGF0YQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDMyIEZJUkxhdHRpY2UoV29yZDE2IG9yZGVyLCAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgeCwgICAgICAgICAgICAgICAvKiE8IHNwZWN0cmFsIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnN0YXRlX3BhciwgICAgICAvKiE8IGZpbHRlciBzdGF0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKmNvZWZfcGFyKSAvKiE8IGZpbHRlciBjb2VmZmljaWVudHMgKi8KK3sKKyAgIFdvcmQzMiBpOworICAgV29yZDMyIGFjY3UsdG1wLHRtcFNhdmU7CisKKyAgIHggPSB4ID4+IDE7CisgICB0bXBTYXZlID0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIGZvciAoaT0wOyBpPChvcmRlciAtIDEpOyBpKyspIHsKKworICAgICB0bXAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHgpLCBzdGF0ZV9wYXJbaV0pOworICAgICB4ICAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHN0YXRlX3BhcltpXSksIHgpOworCisgICAgIHN0YXRlX3BhcltpXSA9IHRtcFNhdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIHRtcFNhdmUgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICAvKiBsYXN0IHN0YWdlOiBvbmx5IG5lZWQgaGFsZiBvcGVyYXRpb25zICovCisgIGFjY3UgPSBmaXhtdWwoc3RhdGVfcGFyW29yZGVyIC0gMV0sIGNvZWZfcGFyWyhvcmRlciAtIDEpXSk7CisgIHN0YXRlX3Bhclsob3JkZXIgLSAxKV0gPSB0bXBTYXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICB4ID0gTF9hZGQoYWNjdSwgeCk7CisgIHggPSBMX2FkZCh4LCB4KTsKKworICByZXR1cm4geDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9ubmFtZTogQW5hbHlzaXNGaWx0ZXJMYXR0aWNlCisqIGRlc2NyaXB0aW9uOiAgZmlsdGVycyBzcGVjdHJhbCBsaW5lcyB3aXRoIFROUyBmaWx0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKGNvbnN0ICBXb3JkMzIgc2lnbmFsW10sICAvKiE8IGlucHV0IHNwZWN0cnVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bU9mTGluZXMsICAgICAgIC8qITwgbm8uIG9mIGxpbmVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgIFdvcmQzMiBwYXJDb2VmZltdLC8qITwgUEFSQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3JkZXIsICAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgb3V0cHV0W10pICAgICAgICAgLyohPCBmaWx0ZXJlZCBzaWduYWwgdmFsdWVzICovCit7CisKKyAgV29yZDMyIHN0YXRlX3BhcltUTlNfTUFYX09SREVSXTsKKyAgV29yZDMyIGo7CisKKyAgZm9yICggaj0wOyBqPFROU19NQVhfT1JERVI7IGorKyApIHsKKyAgICBzdGF0ZV9wYXJbal0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIGZvcihqPTA7IGo8bnVtT2ZMaW5lczsgaisrKSB7CisgICAgb3V0cHV0W2pdID0gRklSTGF0dGljZShvcmRlcixzaWduYWxbal0sc3RhdGVfcGFyLHBhckNvZWZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9ubmFtZTogQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcworKiBkZXNjcmlwdGlvbjogIENoYW5nZSB0aHJlc2hvbGRzIGFjY29yZGluZyB0byB0bnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKFdvcmQxNiBzdGFydENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wQ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywgLyohPCBUTlMgc3ViYmxvY2sgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqdGhyZXNob2xkcykgICAgICAgIC8qITwgdGhyZXNob2xkcyAobW9kaWZpZWQpICovCit7CisgIFdvcmQzMiBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmIChzdWJJbmZvLnRuc0FjdGl2ZSkgeworICAgIGZvcihpPXN0YXJ0Q2I7IGk8c3RvcENiOyBpKyspIHsKKyAgICAgIC8qIHRocmVzaG9sZHNbaV0gKiAwLjI1ICovCisgICAgICB0aHJlc2hvbGRzW2ldID0gKHRocmVzaG9sZHNbaV0gPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMTdiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDY3MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdHJhbnNmb3JtLmMNCisNCisJQ29udGVudDoJTURDVCBUcmFuc2Zvcm0gZnVuY3Rpb25zcw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJ0cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisNCisNCisjZGVmaW5lIExTX1RSQU5TICgoRlJBTUVfTEVOX0xPTkctRlJBTUVfTEVOX1NIT1JUKS8yKSAvKiA0NDggKi8NCisjZGVmaW5lIFNRUlQxXzIgMHg1YTgyNzk5YQkvKiBzcXJ0KDEvMikgaW4gUTMxICovDQorI2RlZmluZSBzd2FwMihwMCxwMSkgXA0KKwl0ID0gcDA7IHQxID0gKigmKHAwKSsxKTsJXA0KKwlwMCA9IHAxOyAqKCYocDApKzEpID0gKigmKHAxKSsxKTsJXA0KKwlwMSA9IHQ7ICooJihwMSkrMSkgPSB0MQkNCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogU2h1ZmZsZQorKiBkZXNjcmlwdGlvbjogIFNodWZmbGUgcG9pbnRzIHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBTaHVmZmxlKGludCAqYnVmLCBpbnQgbnVtLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRUYWIpDQorew0KKyAgICBpbnQgKnBhcnQwLCAqcGFydDE7DQorCWludCBpLCBqOw0KKwlpbnQgdCwgdDE7DQorDQorCXBhcnQwID0gYnVmOw0KKyAgICBwYXJ0MSA9IGJ1ZiArIG51bTsNCisJDQorCXdoaWxlICgoaSA9ICpiaXRUYWIrKykgIT0gMCkgew0KKyAgICAgICAgaiA9ICpiaXRUYWIrKzsNCisNCisgICAgICAgIHN3YXAyKHBhcnQwWzQqaSswXSwgcGFydDBbNCpqKzBdKTsJDQorICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaiswXSk7CQ0KKyAgICAgICAgc3dhcDIocGFydDFbNCppKzBdLCBwYXJ0MFs0KmorMl0pOwkNCisgICAgICAgIHN3YXAyKHBhcnQxWzQqaSsyXSwgcGFydDFbNCpqKzJdKTsJDQorICAgIH0NCisNCisgICAgZG8gew0KKyAgICAgICAgc3dhcDIocGFydDBbNCppKzJdLCBwYXJ0MVs0KmkrMF0pOwkNCisgICAgfSB3aGlsZSAoKGkgPSAqYml0VGFiKyspICE9IDApOw0KK30NCisNCisjaWYgIWRlZmluZWQoQVJNVjVFKSAmJiAhZGVmaW5lZChBUk1WN05lb24pDQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUmFkaXg0Rmlyc3QKKyogZGVzY3JpcHRpb246ICBSYWRpeCA0IHBvaW50IHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgUmFkaXg0Rmlyc3QoaW50ICpidWYsIGludCBudW0pDQorew0KKyAgICBpbnQgcjAsIHIxLCByMiwgcjM7DQorCWludCByNCwgcjUsIHI2LCByNzsNCisJDQorCWZvciAoOyBudW0gIT0gMDsgbnVtLS0pIA0KKwl7DQorCQlyMCA9IGJ1ZlswXSArIGJ1ZlsyXTsNCisJCXIxID0gYnVmWzFdICsgYnVmWzNdOw0KKwkJcjIgPSBidWZbMF0gLSBidWZbMl07DQorCQlyMyA9IGJ1ZlsxXSAtIGJ1ZlszXTsNCisJCXI0ID0gYnVmWzRdICsgYnVmWzZdOw0KKwkJcjUgPSBidWZbNV0gKyBidWZbN107DQorCQlyNiA9IGJ1Zls0XSAtIGJ1Zls2XTsNCisJCXI3ID0gYnVmWzVdIC0gYnVmWzddOw0KKw0KKwkJYnVmWzBdID0gcjAgKyByNDsNCisJCWJ1ZlsxXSA9IHIxICsgcjU7DQorCQlidWZbNF0gPSByMCAtIHI0Ow0KKwkJYnVmWzVdID0gcjEgLSByNTsNCisJCWJ1ZlsyXSA9IHIyICsgcjc7DQorCQlidWZbM10gPSByMyAtIHI2Ow0KKwkJYnVmWzZdID0gcjIgLSByNzsNCisJCWJ1Zls3XSA9IHIzICsgcjY7DQorDQorCQlidWYgKz0gODsNCisJfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUmFkaXg4Rmlyc3QKKyogZGVzY3JpcHRpb246ICBSYWRpeCA4IHBvaW50IHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgUmFkaXg4Rmlyc3QoaW50ICpidWYsIGludCBudW0pDQorew0KKyAgIGludCByMCwgcjEsIHIyLCByMzsNCisgICBpbnQgaTAsIGkxLCBpMiwgaTM7DQorICAgaW50IHI0LCByNSwgcjYsIHI3Ow0KKyAgIGludCBpNCwgaTUsIGk2LCBpNzsNCisgICBpbnQgdDAsIHQxLCB0MiwgdDM7DQorDQorCWZvciAoIDsgbnVtICE9IDA7IG51bS0tKSANCisJew0KKwkJcjAgPSBidWZbMF0gKyBidWZbMl07DQorCQlpMCA9IGJ1ZlsxXSArIGJ1ZlszXTsNCisJCXIxID0gYnVmWzBdIC0gYnVmWzJdOw0KKwkJaTEgPSBidWZbMV0gLSBidWZbM107DQorCQlyMiA9IGJ1Zls0XSArIGJ1Zls2XTsNCisJCWkyID0gYnVmWzVdICsgYnVmWzddOw0KKwkJcjMgPSBidWZbNF0gLSBidWZbNl07DQorCQlpMyA9IGJ1Zls1XSAtIGJ1Zls3XTsNCisNCisJCXI0ID0gKHIwICsgcjIpID4+IDE7DQorCQlpNCA9IChpMCArIGkyKSA+PiAxOw0KKwkJcjUgPSAocjAgLSByMikgPj4gMTsNCisJCWk1ID0gKGkwIC0gaTIpID4+IDE7DQorCQlyNiA9IChyMSAtIGkzKSA+PiAxOw0KKwkJaTYgPSAoaTEgKyByMykgPj4gMTsNCisJCXI3ID0gKHIxICsgaTMpID4+IDE7DQorCQlpNyA9IChpMSAtIHIzKSA+PiAxOw0KKw0KKwkJcjAgPSBidWZbIDhdICsgYnVmWzEwXTsNCisJCWkwID0gYnVmWyA5XSArIGJ1ZlsxMV07DQorCQlyMSA9IGJ1ZlsgOF0gLSBidWZbMTBdOw0KKwkJaTEgPSBidWZbIDldIC0gYnVmWzExXTsNCisJCXIyID0gYnVmWzEyXSArIGJ1ZlsxNF07DQorCQlpMiA9IGJ1ZlsxM10gKyBidWZbMTVdOw0KKwkJcjMgPSBidWZbMTJdIC0gYnVmWzE0XTsNCisJCWkzID0gYnVmWzEzXSAtIGJ1ZlsxNV07DQorDQorCQl0MCA9IChyMCArIHIyKSA+PiAxOw0KKwkJdDEgPSAoaTAgKyBpMikgPj4gMTsNCisJCXQyID0gKHIwIC0gcjIpID4+IDE7DQorCQl0MyA9IChpMCAtIGkyKSA+PiAxOw0KKw0KKwkJYnVmWyAwXSA9IHI0ICsgdDA7DQorCQlidWZbIDFdID0gaTQgKyB0MTsNCisJCWJ1ZlsgOF0gPSByNCAtIHQwOw0KKwkJYnVmWyA5XSA9IGk0IC0gdDE7DQorCQlidWZbIDRdID0gcjUgKyB0MzsNCisJCWJ1ZlsgNV0gPSBpNSAtIHQyOw0KKwkJYnVmWzEyXSA9IHI1IC0gdDM7DQorCQlidWZbMTNdID0gaTUgKyB0MjsNCisNCisJCXIwID0gcjEgLSBpMzsNCisJCWkwID0gaTEgKyByMzsNCisJCXIyID0gcjEgKyBpMzsNCisJCWkyID0gaTEgLSByMzsNCisNCisJCXQwID0gTVVMSElHSChTUVJUMV8yLCByMCAtIGkwKTsNCisJCXQxID0gTVVMSElHSChTUVJUMV8yLCByMCArIGkwKTsNCisJCXQyID0gTVVMSElHSChTUVJUMV8yLCByMiAtIGkyKTsNCisJCXQzID0gTVVMSElHSChTUVJUMV8yLCByMiArIGkyKTsNCisNCisJCWJ1ZlsgNl0gPSByNiAtIHQwOw0KKwkJYnVmWyA3XSA9IGk2IC0gdDE7DQorCQlidWZbMTRdID0gcjYgKyB0MDsNCisJCWJ1ZlsxNV0gPSBpNiArIHQxOw0KKwkJYnVmWyAyXSA9IHI3ICsgdDM7DQorCQlidWZbIDNdID0gaTcgLSB0MjsNCisJCWJ1ZlsxMF0gPSByNyAtIHQzOw0KKwkJYnVmWzExXSA9IGk3ICsgdDI7DQorDQorCQlidWYgKz0gMTY7DQorCX0NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFJhZGl4NEZGVAorKiBkZXNjcmlwdGlvbjogIFJhZGl4IDQgcG9pbnQgZmZ0IGNvcmUgZnVuY3Rpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgUmFkaXg0RkZUKGludCAqYnVmLCBpbnQgbnVtLCBpbnQgYmduLCBpbnQgKnR3aWRUYWIpDQorew0KKwlpbnQgcjAsIHIxLCByMiwgcjM7DQorCWludCByNCwgcjUsIHI2LCByNzsNCisJaW50IHQwLCB0MTsNCisJaW50IHNpbngsIGNvc3g7DQorCWludCBpLCBqLCBzdGVwOw0KKwlpbnQgKnhwdHIsICpjc3B0cjsNCisNCisJZm9yIChudW0gPj49IDI7IG51bSAhPSAwOyBudW0gPj49IDIpIA0KKwl7DQorCQlzdGVwID0gMipiZ247DQorCQl4cHRyID0gYnVmOw0KKw0KKyAgICAJZm9yIChpID0gbnVtOyBpICE9IDA7IGktLSkgDQorCQl7DQorCQkJY3NwdHIgPSB0d2lkVGFiOw0KKw0KKwkJCWZvciAoaiA9IGJnbjsgaiAhPSAwOyBqLS0pIA0KKwkJCXsNCisJCQkJcjAgPSB4cHRyWzBdOw0KKwkJCQlyMSA9IHhwdHJbMV07DQorCQkJCXhwdHIgKz0gc3RlcDsNCisJCQkJDQorCQkJCXQwID0geHB0clswXTsNCisJCQkJdDEgPSB4cHRyWzFdOwkJCQkNCisJCQkJY29zeCA9IGNzcHRyWzBdOw0KKwkJCQlzaW54ID0gY3NwdHJbMV07DQorCQkJCXIyID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypiciArIHNpbipiaSAqLw0KKwkJCQlyMyA9IE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCk7CQkvKiBjb3MqYmkgLSBzaW4qYnIgKi8NCisJCQkJeHB0ciArPSBzdGVwOw0KKw0KKwkJCQl0MCA9IHIwID4+IDI7DQorCQkJCXQxID0gcjEgPj4gMjsNCisJCQkJcjAgPSB0MCAtIHIyOw0KKwkJCQlyMSA9IHQxIC0gcjM7DQorCQkJCXIyID0gdDAgKyByMjsNCisJCQkJcjMgPSB0MSArIHIzOw0KKwkJCQkNCisJCQkJdDAgPSB4cHRyWzBdOw0KKwkJCQl0MSA9IHhwdHJbMV07DQorCQkJCWNvc3ggPSBjc3B0clsyXTsNCisJCQkJc2lueCA9IGNzcHRyWzNdOw0KKwkJCQlyNCA9IE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSk7CQkvKiBjb3MqY3IgKyBzaW4qY2kgKi8NCisJCQkJcjUgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmNpIC0gc2luKmNyICovDQorCQkJCXhwdHIgKz0gc3RlcDsNCisJCQkJDQorCQkJCXQwID0geHB0clswXTsNCisJCQkJdDEgPSB4cHRyWzFdOw0KKwkJCQljb3N4ID0gY3NwdHJbNF07DQorCQkJCXNpbnggPSBjc3B0cls1XTsNCisJCQkJcjYgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmNyICsgc2luKmNpICovDQorCQkJCXI3ID0gTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKTsJCS8qIGNvcypjaSAtIHNpbipjciAqLw0KKwkJCQljc3B0ciArPSA2Ow0KKw0KKwkJCQl0MCA9IHI0Ow0KKwkJCQl0MSA9IHI1Ow0KKwkJCQlyNCA9IHQwICsgcjY7DQorCQkJCXI1ID0gcjcgLSB0MTsNCisJCQkJcjYgPSB0MCAtIHI2Ow0KKwkJCQlyNyA9IHI3ICsgdDE7DQorDQorCQkJCXhwdHJbMF0gPSByMCArIHI1Ow0KKwkJCQl4cHRyWzFdID0gcjEgKyByNjsNCisJCQkJeHB0ciAtPSBzdGVwOw0KKw0KKwkJCQl4cHRyWzBdID0gcjIgLSByNDsNCisJCQkJeHB0clsxXSA9IHIzIC0gcjc7DQorCQkJCXhwdHIgLT0gc3RlcDsNCisNCisJCQkJeHB0clswXSA9IHIwIC0gcjU7DQorCQkJCXhwdHJbMV0gPSByMSAtIHI2Ow0KKwkJCQl4cHRyIC09IHN0ZXA7DQorDQorCQkJCXhwdHJbMF0gPSByMiArIHI0Ow0KKwkJCQl4cHRyWzFdID0gcjMgKyByNzsNCisJCQkJeHB0ciArPSAyOw0KKwkJCX0NCisJCQl4cHRyICs9IDMqc3RlcDsNCisJCX0NCisJCXR3aWRUYWIgKz0gMypzdGVwOw0KKwkJYmduIDw8PSAyOw0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUHJlTURDVAorKiBkZXNjcmlwdGlvbjogIHByZXBhcmUgTURDVCBwcm9jZXNzIGZvciBuZXh0IEZGVCBjb21wdXRlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIFByZU1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKQ0KK3sNCisJaW50IGk7DQorCWludCB0cjEsIHRpMSwgdHIyLCB0aTI7DQorCWludCBjb3NhLCBzaW5hLCBjb3NiLCBzaW5iOw0KKwlpbnQgKmJ1ZjE7DQorCQ0KKwlidWYxID0gYnVmMCArIG51bSAtIDE7DQorDQorCWZvcihpID0gbnVtID4+IDI7IGkgIT0gMDsgaS0tKQ0KKwl7DQorCQljb3NhID0gKmNzcHRyKys7CQ0KKwkJc2luYSA9ICpjc3B0cisrOwkNCisJCWNvc2IgPSAqY3NwdHIrKzsJDQorCQlzaW5iID0gKmNzcHRyKys7CQkNCisNCisJCXRyMSA9ICooYnVmMCArIDApOw0KKwkJdGkyID0gKihidWYwICsgMSk7DQorCQl0cjIgPSAqKGJ1ZjEgLSAxKTsNCisJCXRpMSA9ICooYnVmMSArIDApOw0KKwkJDQorCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpOw0KKwkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKTsJCQ0KKwkJDQorCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0aTIpIC0gTVVMSElHSChzaW5iLCB0cjIpOwkJDQorCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpOw0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUG9zdE1EQ1QKKyogZGVzY3JpcHRpb246ICAgcG9zdCBNRENUIHByb2Nlc3MgYWZ0ZXIgbmV4dCBGRlQgZm9yIE1EQ1QKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgUG9zdE1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKQ0KK3sNCisJaW50IGk7DQorCWludCB0cjEsIHRpMSwgdHIyLCB0aTI7DQorCWludCBjb3NhLCBzaW5hLCBjb3NiLCBzaW5iOw0KKwlpbnQgKmJ1ZjE7DQorDQorCWJ1ZjEgPSBidWYwICsgbnVtIC0gMTsNCisJDQorCWZvcihpID0gbnVtID4+IDI7IGkgIT0gMDsgaS0tKQ0KKwl7DQorCQljb3NhID0gKmNzcHRyKys7CQ0KKwkJc2luYSA9ICpjc3B0cisrOwkNCisJCWNvc2IgPSAqY3NwdHIrKzsJDQorCQlzaW5iID0gKmNzcHRyKys7DQorDQorCQl0cjEgPSAqKGJ1ZjAgKyAwKTsNCisJCXRpMSA9ICooYnVmMCArIDEpOw0KKwkJdGkyID0gKihidWYxICsgMCk7DQorCQl0cjIgPSAqKGJ1ZjEgLSAxKTsNCisNCisJCSpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSk7DQorCQkqYnVmMS0tID0gTVVMSElHSChzaW5hLCB0cjEpIC0gTVVMSElHSChjb3NhLCB0aTEpOwkJDQorCQkNCisJCSpidWYwKysgPSBNVUxISUdIKHNpbmIsIHRyMikgLSBNVUxISUdIKGNvc2IsIHRpMik7DQorCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpOwkNCisJfQ0KK30NCisjZW5kaWYNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBNZGN0X0xvbmcKKyogZGVzY3JpcHRpb246ICB0aGUgbG9uZyBibG9jayBtZGN0LCBpbmNsdWRlIGxvbmdfc3RhcnQgYmxvY2ssIGVuZF9sb25nIGJsb2NrCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgTWRjdF9Mb25nKGludCAqYnVmKQ0KK3sNCisJUHJlTURDVChidWYsIDEwMjQsIGNvc3NpbnRhYiArIDEyOCk7DQorDQorCVNodWZmbGUoYnVmLCA1MTIsIGJpdHJldlRhYiArIDE3KTsNCisJUmFkaXg4Rmlyc3QoYnVmLCA1MTIgPj4gMyk7CQkJCQkJDQorCVJhZGl4NEZGVChidWYsIDUxMiA+PiAzLCA4LCAoaW50ICopdHdpZFRhYjUxMik7DQorDQorCVBvc3RNRENUKGJ1ZiwgMTAyNCwgY29zc2ludGFiICsgMTI4KTsJDQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IE1kY3RfU2hvcnQKKyogZGVzY3JpcHRpb246ICB0aGUgc2hvcnQgYmxvY2sgbWRjdCAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordm9pZCBNZGN0X1Nob3J0KGludCAqYnVmKQ0KK3sNCisJUHJlTURDVChidWYsIDEyOCwgY29zc2ludGFiKTsNCisNCisJU2h1ZmZsZShidWYsIDY0LCBiaXRyZXZUYWIpOw0KKwlSYWRpeDRGaXJzdChidWYsIDY0ID4+IDIpOwkJCQkJCQ0KKwlSYWRpeDRGRlQoYnVmLCA2NCA+PiAyLCA0LCAoaW50ICopdHdpZFRhYjY0KTsJDQorDQorCVBvc3RNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOwkNCit9DQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBzaGlmdE1kY3REZWxheUJ1ZmZlcgorKiBkZXNjcmlwdGlvbjogICAgdGhlIG1kY3QgZGVsYXkgYnVmZmVyIGhhcyBhIHNpemUgb2YgMTYwMCwKKyogIHNvIHRoZSBjYWxjdWxhdGlvbiBvZiBMT05HLFNUT1AgbXVzdCBiZSAgc3BpbHQgaW4gdHdvIAorKiAgcGFzc2VzIHdpdGggMTAyNCBzYW1wbGVzIGFuZCBhIG1pZCBzaGlmdCwKKyogIHRoZSBTSE9SVCB0cmFuc2Zvcm1zIGNhbiBiZSBjb21wbGV0ZWQgaW4gdGhlIGRlbGF5IGJ1ZmZlciwKKyogIGFuZCBhZnRlcndhcmRzIGEgc2hpZnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzaGlmdE1kY3REZWxheUJ1ZmZlcihXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwgLyohIHN0YXJ0IG9mIG1kY3QgZGVsYXkgYnVmZmVyICovCisJCQkJCQkJCSBXb3JkMTYgKnRpbWVTaWduYWwsICAgICAgLyohIHBvaW50ZXIgdG8gbmV3IHRpbWUgc2lnbmFsIHNhbXBsZXMsIGludGVybGVhdmVkICovCisJCQkJCQkJCSBXb3JkMTYgY2hJbmNyZW1lbnQgICAgICAgLyohIG51bWJlciBvZiBjaGFubmVscyAqLworCQkJCQkJCQkgKQoreworCVdvcmQzMiBpOworCVdvcmQxNiAqc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXI7CisJV29yZDE2ICpkc0J1ZiA9IG1kY3REZWxheUJ1ZmZlcitGUkFNRV9MRU5fTE9ORzsKKworCWZvcihpID0gMDsgaSA8IEJMT0NLX1NXSVRDSElOR19PRkZTRVQtRlJBTUVfTEVOX0xPTkc7IGkrPSA4KQorCXsKKwkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7CisJCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOworCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKKwkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7CisJfQorCisJc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXIgKyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUZSQU1FX0xFTl9MT05HOworCWRzQnVmID0gdGltZVNpZ25hbDsKKworCWZvcihpPTA7IGk8RlJBTUVfTEVOX0xPTkc7IGkrPTgpCisJeyAgIAorCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKKwkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OworCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKKwkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OworCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKKwl9Cit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZQorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBtYXggcG9zc2libGUgc2NhbGUgZmFjdG9yIGZvciBpbnB1dCB2ZWN0b3Igb2Ygc2hvcnRzCisqIHJldHVybnM6ICAgICAgTWF4aW11bSBzY2FsZSBmYWN0b3IKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIFdvcmQxNiBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUoY29uc3QgV29yZDE2ICp2ZWN0b3IsIC8qITwgUG9pbnRlciB0byBpbnB1dCB2ZWN0b3IgKi8NCisJCQkJCQkJCQkJCQlXb3JkMTYgbGVuLCAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovDQorCQkJCQkJCQkJCQkJV29yZDE2IHN0cmlkZSkgICAgICAgIC8qITwgU3RyaWRlIG9mIGlucHV0IHZlY3RvciAqLw0KK3sNCisJV29yZDE2IG1heFZhbCA9IDA7DQorCVdvcmQxNiBhYnNWYWw7DQorCVdvcmQxNiBpOw0KKw0KKwlmb3IoaT0wOyBpPGxlbjsgaSsrKXsNCisJCWFic1ZhbCA9IGFic19zKHZlY3RvcltpKnN0cmlkZV0pOw0KKwkJbWF4VmFsIHw9IGFic1ZhbDsNCisJfQ0KKw0KKwlyZXR1cm4oIG1heFZhbCA/IG5vcm1fcyhtYXhWYWwpIDogMTUpOw0KK30NCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFRyYW5zZm9ybV9SZWFsCisqIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlIHRyYW5zZm9ybSBmaWx0ZXIgZm9yIGlucHV0IHZlY3RvciBvZiBzaG9ydHMKKyogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFRyYW5zZm9ybV9SZWFsKFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICpyZWFsT3V0LAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZQorICAgICAgICAgICAgICAgICAgICApCit7CisJV29yZDMyIGksdzsKKwlXb3JkMzIgdGltZVNpZ25hbFNhbXBsZTsKKwlXb3JkMzIgd3MxLHdzMjsKKwlXb3JkMTYgKmRjdEluMCwgKmRjdEluMTsNCisJV29yZDMyICpvdXREYXRhMCwgKm91dERhdGExOw0KKwlXb3JkMzIgKndpblB0cjsKKworCVdvcmQzMiBkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZixtaW5TZjsKKwlXb3JkMzIgaGVhZFJvb209MDsKKwkKKwlzd2l0Y2goYmxvY2tUeXBlKXsKKwkJCisJCQorCWNhc2UgTE9OR19XSU5ET1c6CisJCS8qCisJCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyA0NDggbmV3IHRpbWVTaWduYWwgc2FtcGxlcworCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCisJCSovCisJCWRlbGF5QnVmZmVyU2YgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUobWRjdERlbGF5QnVmZmVyLEJMT0NLX1NXSVRDSElOR19PRkZTRVQsMSk7CisJCXRpbWVTaWduYWxTZiAgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUodGltZVNpZ25hbCwyKkZSQU1FX0xFTl9MT05HLUJMT0NLX1NXSVRDSElOR19PRkZTRVQsY2hJbmNyZW1lbnQpOworCQltaW5TZiA9IG1pbihkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZik7CisJCW1pblNmID0gbWluKG1pblNmLDE0KTsKKwkJCisJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKKwkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOworCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yOworCQkKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLworCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKKwkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsgCisJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOworCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOworCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKKwkJCXdpblB0ciArKzsKKwkJCS8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLworCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsKKwkJfQorCQkKKwkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOworCQkKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCisJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKKwkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOworCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsgCisJCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOworCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspeyAgICAKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKKwkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7CisJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOworCQkJd2luUHRyKys7CisJCQkvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KKwkJCSpvdXREYXRhMC0tID0gLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7IAorCQl9CisKKwkJTWRjdF9Mb25nKHJlYWxPdXQpOw0KKwkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLw0KKwkJbWluU2YgPSAxNCAtIG1pblNmOworCQkqbWRjdFNjYWxlPW1pblNmOyAKKwkJYnJlYWs7CisJCQorCWNhc2UgU1RBUlRfV0lORE9XOgorCQkvKgorCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgbm8gdGltZVNpZ25hbCBzYW1wbGVzCisJCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKKwkJKi8KKwkJbWluU2YgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUobWRjdERlbGF5QnVmZmVyLEJMT0NLX1NXSVRDSElOR19PRkZTRVQsMSk7CisJCW1pblNmID0gbWluKG1pblNmLDE0KTsKKworCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMjsgCQkKKwkJd2luUHRyID0gKGludCAqKUxvbmdXaW5kb3dLQkQ7CisKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLworCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspeworCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOworCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKKwkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQl3aW5QdHIgKys7CisJCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovDQorCQl9CisJCQorCQlzaGlmdE1kY3REZWxheUJ1ZmZlcihtZGN0RGVsYXlCdWZmZXIsdGltZVNpZ25hbCxjaEluY3JlbWVudCk7CisJCQorCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsgCisJCWZvcihpPTA7aTxMU19UUkFOUztpKyspeworCQkJKm91dERhdGEwLS0gPSAtbWRjdERlbGF5QnVmZmVyW2ldIDw8ICgxNSAtIDIgKyBtaW5TZik7ICAKKwkJfQorCQkKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCisJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlciArIExTX1RSQU5TOworCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDEgLSBMU19UUkFOUzsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDEgLUxTX1RSQU5TOyAKKwkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKKwkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7CisJCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKKwkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKKwkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQl3aW5QdHIrKzsKKwkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovDQorCQl9CisKKwkJTWRjdF9Mb25nKHJlYWxPdXQpOworCQkvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCisJCW1pblNmID0gMTQgLSBtaW5TZjsKKwkJKm1kY3RTY2FsZT0gbWluU2Y7CisJCWJyZWFrOworCQkKKwljYXNlIFNUT1BfV0lORE9XOgorCQkvKgorCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUyAoMTYwMC00NDggKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIDQ0OCBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCisJCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKKwkJKi8KKwkJZGVsYXlCdWZmZXJTZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrTFNfVFJBTlMsQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUywxKTsKKwkJdGltZVNpZ25hbFNmICA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZSh0aW1lU2lnbmFsLDIqRlJBTUVfTEVOX0xPTkctQkxPQ0tfU1dJVENISU5HX09GRlNFVCxjaEluY3JlbWVudCk7CisJCW1pblNmID0gbWluKGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmKTsgICAgCisJCW1pblNmID0gbWluKG1pblNmLDEzKTsKKwkJCisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKKwkJZm9yKGk9MDtpPExTX1RSQU5TO2krKyl7CisJCQkqb3V0RGF0YTArKyA9IC0oKmRjdEluMS0tKSA8PCAoMTUgLSAyICsgbWluU2YpOyAgICAKKwkJfQorCQkKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLworCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKKwkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgKyBMU19UUkFOUzsgCisJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CisJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspeworCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOworCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4xLS0pIDw8IG1pblNmOworCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKKwkJCXdpblB0cisrOworCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKwkJfQorCQkKKwkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOworCQkKKwkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCisJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKKwkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOworCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsgCisJCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOworCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspeworCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjArKykgPDwgbWluU2Y7CisJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICooKndpblB0ciAmIDB4ZmZmZik7CisJCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKKwkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQkqb3V0RGF0YTAtLSA9ICAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKwkJCXdpblB0cisrOw0KKwkJfQorCQkKKwkJTWRjdF9Mb25nKHJlYWxPdXQpOworCQltaW5TZiA9IDE0IC0gbWluU2Y7CisJCSptZGN0U2NhbGU9IG1pblNmOyAvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCisJCWJyZWFrOworCQkKKwljYXNlIFNIT1JUX1dJTkRPVzoKKwkJLyoKKwkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQgKDE2MDAgKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIG5vIG5ldyB0aW1lU2lnbmFsIHNhbXBsZXMKKwkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQorCQkqLwkJCisJCW1pblNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcitUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JULDkqRlJBTUVfTEVOX1NIT1JULDEpOworCQltaW5TZiA9IG1pbihtaW5TZiwxMCk7CisJCQorCQkKKwkJZm9yKHc9MDt3PFRSQU5TX0ZBQzt3KyspeworCQkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyK3cqRlJBTUVfTEVOX1NIT1JUK1RSQU5TRk9STV9PRkZTRVRfU0hPUlQ7CisJCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIrdypGUkFNRV9MRU5fU0hPUlQrVFJBTlNGT1JNX09GRlNFVF9TSE9SVCArIEZSQU1FX0xFTl9TSE9SVC0xOworCQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX1NIT1JULzI7IAorCQkJb3V0RGF0YTEgPSByZWFsT3V0ICsgRlJBTUVfTEVOX1NIT1JULzIgLSAxOyAKKworCQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKKwkJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspeworCQkJCXRpbWVTaWduYWxTYW1wbGU9ICpkY3RJbjAgPDwgbWluU2Y7CisJCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqZGN0SW4xIDw8IG1pblNmOworCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKwkJCQkKKwkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMCArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7CisJCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKKwkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMSArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7CisJCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCQkqb3V0RGF0YTEtLSA9ICAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKw0KKwkJCQl3aW5QdHIrKzsNCisJCQkJZGN0SW4wKys7DQorCQkJCWRjdEluMS0tOw0KKwkJCX0KKworCQkJTWRjdF9TaG9ydChyZWFsT3V0KTsKKwkJCXJlYWxPdXQgKz0gRlJBTUVfTEVOX1NIT1JUOworCQl9CisJCQ0KKwkJbWluU2YgPSAxMSAtIG1pblNmOworCQkqbWRjdFNjYWxlID0gbWluU2Y7IC8qIHVwZGF0ZSBzY2FsZSBmYWN0b3IgKi8KKwkJCisJCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKKwkJYnJlYWs7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oCmluZGV4IDA2MjAzNjcuLjNlYmQ5MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZV90eXBlXzNncHAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWVfdHlwZV8zZ3BwLmgKQEAgLTg3LDIyICs4NywyMiBAQAogCiAgICAgZW51bSBGcmFtZV9UeXBlXzNHUFAKICAgICB7Ci0gICAgICAgIEFNUl80NzUgPSAwLAotICAgICAgICBBTVJfNTE1LAotICAgICAgICBBTVJfNTksCi0gICAgICAgIEFNUl82NywKLSAgICAgICAgQU1SXzc0LAotICAgICAgICBBTVJfNzk1LAotICAgICAgICBBTVJfMTAyLAotICAgICAgICBBTVJfMTIyLAotICAgICAgICBBTVJfU0lELAotICAgICAgICBHU01fRUZSX1NJRCwKLSAgICAgICAgVERNQV9FRlJfU0lELAotICAgICAgICBQRENfRUZSX1NJRCwKLSAgICAgICAgRk9SX0ZVVFVSRV9VU0UxLAotICAgICAgICBGT1JfRlVUVVJFX1VTRTIsCi0gICAgICAgIEZPUl9GVVRVUkVfVVNFMywKLSAgICAgICAgQU1SX05PX0RBVEEKKyAgICAgICAgQU1SXzQ3NSA9IDAsICAgICAgICAvKiA0Ljc1IGticHMgICAgKi8KKyAgICAgICAgQU1SXzUxNSwgICAgICAgICAgICAvKiA1LjE1IGticHMgICAgKi8KKyAgICAgICAgQU1SXzU5LCAgICAgICAgICAgICAvKiA1Ljkga2JwcyAgICAgKi8KKyAgICAgICAgQU1SXzY3LCAgICAgICAgICAgICAvKiA2Ljcga2JwcyAgICAgKi8KKyAgICAgICAgQU1SXzc0LCAgICAgICAgICAgICAvKiA3LjQga2JwcyAgICAgKi8KKyAgICAgICAgQU1SXzc5NSwgICAgICAgICAgICAvKiA3Ljk1IGticHMgICAgKi8KKyAgICAgICAgQU1SXzEwMiwgICAgICAgICAgICAvKiAxMC4yIGticHMgICAgKi8KKyAgICAgICAgQU1SXzEyMiwgICAgICAgICAgICAvKiAxMi4yIGticHMgICAgKi8KKyAgICAgICAgQU1SX1NJRCwgICAgICAgICAgICAvKiBHU00gQU1SIERUWCAgKi8KKyAgICAgICAgR1NNX0VGUl9TSUQsICAgICAgICAvKiBHU00gRUZSIERUWCAgKi8KKyAgICAgICAgVERNQV9FRlJfU0lELCAgICAgICAvKiBURE1BIEVGUiBEVFggKi8KKyAgICAgICAgUERDX0VGUl9TSUQsICAgICAgICAvKiBQREMgRUZSIERUWCAgKi8KKyAgICAgICAgRk9SX0ZVVFVSRV9VU0UxLCAgICAvKiBVbnVzZWQgMSAgICAgKi8KKyAgICAgICAgRk9SX0ZVVFVSRV9VU0UyLCAgICAvKiBVbnVzZWQgMiAgICAgKi8KKyAgICAgICAgRk9SX0ZVVFVSRV9VU0UzLCAgICAvKiBVbnVzZWQgMyAgICAgKi8KKyAgICAgICAgQU1SX05PX0RBVEEgICAgICAgICAvKiBObyBkYXRhICAgICAgKi8KICAgICB9OwogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAKaW5kZXggNzcyODU5Ny4uZmIzMDBkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BTVJOQkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcApAQCAtMTE3LDcgKzExNyw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAKICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oCmluZGV4IDY3M2E5NGEuLmE5ZmRiMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2dzbWFtcl9kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9nc21hbXJfZGVjLmgKQEAgLTg3LDYgKzg3LDggQEAKIAogI2luY2x1ZGUgImdzbV9hbXJfdHlwZWRlZnMuaCIKICNpbmNsdWRlICJwdmFtcm5iZGVjb2Rlcl9hcGkuaCIKKyNpbmNsdWRlICJmcmFtZV90eXBlXzNncHAuaCIKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKQEAgLTExNywyNSArMTE5LDYgQEAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEVOVU1FUkFURUQgVFlQRURFRidTCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgZW51bSBGcmFtZV9UeXBlXzNHUFAKLSAgICB7Ci0gICAgICAgIEFNUl80NzUgPSAwLCAgICAgICAgLyogNC43NSBrYnBzICAgICovCi0gICAgICAgIEFNUl81MTUsICAgICAgICAgICAgLyogNS4xNSBrYnBzICAgICovCi0gICAgICAgIEFNUl81OSwgICAgICAgICAgICAgLyogNS45IGticHMgICAgICovCi0gICAgICAgIEFNUl82NywgICAgICAgICAgICAgLyogNi43IGticHMgICAgICovCi0gICAgICAgIEFNUl83NCwgICAgICAgICAgICAgLyogNy40IGticHMgICAgICovCi0gICAgICAgIEFNUl83OTUsICAgICAgICAgICAgLyogNy45NSBrYnBzICAgICovCi0gICAgICAgIEFNUl8xMDIsICAgICAgICAgICAgLyogMTAuMiBrYnBzICAgICovCi0gICAgICAgIEFNUl8xMjIsICAgICAgICAgICAgLyogMTIuMiBrYnBzICAgICovCi0gICAgICAgIEFNUl9TSUQsICAgICAgICAgICAgLyogR1NNIEFNUiBEVFggICovCi0gICAgICAgIEdTTV9FRlJfU0lELCAgICAgICAgLyogR1NNIEVGUiBEVFggICovCi0gICAgICAgIFRETUFfRUZSX1NJRCwgICAgICAgLyogVERNQSBFRlIgRFRYICovCi0gICAgICAgIFBEQ19FRlJfU0lELCAgICAgICAgLyogUERDIEVGUiBEVFggICovCi0gICAgICAgIEZPUl9GVVRVUkVfVVNFMSwgICAgLyogVW51c2VkIDEgICAgICovCi0gICAgICAgIEZPUl9GVVRVUkVfVVNFMiwgICAgLyogVW51c2VkIDIgICAgICovCi0gICAgICAgIEZPUl9GVVRVUkVfVVNFMywgICAgLyogVW51c2VkIDMgICAgICovCi0gICAgICAgIEFNUl9OT19EQVRBCi0gICAgfTsgICAgICAvKiBObyBkYXRhICAgICAgKi8KIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgU1RSVUNUVVJFUyBUWVBFREVGJ1MKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQU1STkJFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQU1STkJFbmNvZGVyLmNwcAppbmRleCBmMzQ5NjcxLi45NGE3OWFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FNUk5CRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BTVJOQkVuY29kZXIuY3BwCkBAIC0yOSw4ICsyOSw5IEBACiBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMTYwOwogc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGUgPSA4MDAwOwogCi1BTVJOQkVuY29kZXI6OkFNUk5CRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKK0FNUk5CRW5jb2Rlcjo6QU1STkJFbmNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCiAgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1CdWZmZXJHcm91cChOVUxMKSwKICAgICAgIG1FbmNTdGF0ZShOVUxMKSwKQEAgLTY5LDcgKzcwLDEwIEBACiB9CiAKIHN0YXR1c190IEFNUk5CRW5jb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RhcnQoKSB3aGVuIGVuY29kZXIgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CiAKICAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKICAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDMyKSk7CkBAIC03OCw3ICs4Miw3IEBACiAgICAgICAgICAgICAgICAgJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSwgZmFsc2UgLyogZHR4X2VuYWJsZSAqLyksCiAgICAgICAgICAgICAgMCk7CiAKLSAgICBtU291cmNlLT5zdGFydCgpOworICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CiAKICAgICBtQW5jaG9yVGltZVVzID0gMDsKICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKQEAgLTk2LDcgKzEwMCwxMCBAQAogfQogCiBzdGF0dXNfdCBBTVJOQkVuY29kZXI6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KIAogICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0xMTksMjggKzEyNiwxNiBAQAogc3A8TWV0YURhdGE+IEFNUk5CRW5jb2Rlcjo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBzcmNGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKIAotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotCi0gICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7Ci0gICAgQ0hFQ0tfRVEobnVtQ2hhbm5lbHMsIDEpOwotCi0gICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0tfRVEoc2FtcGxlUmF0ZSwga1NhbXBsZVJhdGUpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwogICAgIH0KIAotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBTVJOQkVuY29kZXIiKTsKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFNUk5CRW5jb2RlciIpOwogCi0gICAgcmV0dXJuIG1ldGE7CisgICAgcmV0dXJuIG1NZXRhOwogfQogCiBzdGF0dXNfdCBBTVJOQkVuY29kZXI6OnJlYWQoCkBAIC0xNTAsNyArMTQ1LDEwIEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgQ0hFQ0sob3B0aW9ucyA9PSBOVUxMIHx8ICFvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKTsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBDSEVDSyhvcHRpb25zID09IE5VTEwgfHwgIW9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKTsKKyAgICBib29sIHJlYWRGcm9tU291cmNlID0gZmFsc2U7CisgICAgaW50NjRfdCB3YWxsQ2xvY2tUaW1lVXMgPSAtMTsKIAogICAgIHdoaWxlIChtTnVtSW5wdXRTYW1wbGVzIDwga051bVNhbXBsZXNQZXJGcmFtZSkgewogICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKQEAgLTE3MCwxMiArMTY4LDE3IEBACiAKICAgICAgICAgICAgIHNpemVfdCBhbGlnbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBDSEVDS19FUShhbGlnbiwgMCk7CisgICAgICAgICAgICByZWFkRnJvbVNvdXJjZSA9IHRydWU7CiAKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIHdhbGxDbG9ja1RpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUFuY2hvclRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgY29weSA9CkBAIC0yMjEsOCArMjI0LDE0IEBACiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgcmVzKTsKIAogICAgIC8vIEVhY2ggZnJhbWUgb2YgMTYwIHNhbXBsZXMgaXMgMjBtcyBsb25nLgorICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSBtTnVtRnJhbWVzT3V0cHV0ICogMjAwMDBMTDsKICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbU51bUZyYW1lc091dHB1dCAqIDIwMDAwKTsKKyAgICAgICAgICAgIGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbWVkaWFUaW1lVXMpOworCisgICAgaWYgKHJlYWRGcm9tU291cmNlICYmIHdhbGxDbG9ja1RpbWVVcyAhPSAtMSkgeworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLAorICAgICAgICAgICAgbWVkaWFUaW1lVXMgLSB3YWxsQ2xvY2tUaW1lVXMpOworICAgIH0KIAogICAgICsrbU51bUZyYW1lc091dHB1dDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ3NtYW1yX2VuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ3NtYW1yX2VuYy5oCmluZGV4IDM5MGE0NGQuLjY3YzdhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dzbWFtcl9lbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmgKQEAgLTg2LDYgKzg2LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaW5jbHVkZSAiZ3NtX2Ftcl90eXBlZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lX3R5cGVfM2dwcC5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTM3LDI2ICsxMzgsNiBAQAogICAgICAgICBOX01PREVTICAgLyogTm90IFVzZWQgICovCiAgICAgfTsKIAotICAgIGVudW0gRnJhbWVfVHlwZV8zR1BQCi0gICAgewotICAgICAgICBBTVJfNDc1ID0gMCwgICAgICAgIC8qIDQuNzUga2JwcyAgICAqLwotICAgICAgICBBTVJfNTE1LCAgICAgICAgICAgIC8qIDUuMTUga2JwcyAgICAqLwotICAgICAgICBBTVJfNTksICAgICAgICAgICAgIC8qIDUuOSBrYnBzICAgICAqLwotICAgICAgICBBTVJfNjcsICAgICAgICAgICAgIC8qIDYuNyBrYnBzICAgICAqLwotICAgICAgICBBTVJfNzQsICAgICAgICAgICAgIC8qIDcuNCBrYnBzICAgICAqLwotICAgICAgICBBTVJfNzk1LCAgICAgICAgICAgIC8qIDcuOTUga2JwcyAgICAqLwotICAgICAgICBBTVJfMTAyLCAgICAgICAgICAgIC8qIDEwLjIga2JwcyAgICAqLwotICAgICAgICBBTVJfMTIyLCAgICAgICAgICAgIC8qIDEyLjIga2JwcyAgICAqLwotICAgICAgICBBTVJfU0lELCAgICAgICAgICAgIC8qIEdTTSBBTVIgRFRYICAqLwotICAgICAgICBHU01fRUZSX1NJRCwgICAgICAgIC8qIEdTTSBFRlIgRFRYICAqLwotICAgICAgICBURE1BX0VGUl9TSUQsICAgICAgIC8qIFRETUEgRUZSIERUWCAqLwotICAgICAgICBQRENfRUZSX1NJRCwgICAgICAgIC8qIFBEQyBFRlIgRFRYICAqLwotICAgICAgICBGT1JfRlVUVVJFX1VTRTEsICAgIC8qIFVudXNlZCAxICAgICAqLwotICAgICAgICBGT1JfRlVUVVJFX1VTRTIsICAgIC8qIFVudXNlZCAyICAgICAqLwotICAgICAgICBGT1JfRlVUVVJFX1VTRTMsICAgIC8qIFVudXNlZCAzICAgICAqLwotICAgICAgICBBTVJfTk9fREFUQSAgICAgICAgIC8qIE5vIGRhdGEgICAgICAqLwotICAgIH07Ci0KICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IFNUUlVDVFVSRVMgVFlQRURFRidTCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQU1SV0JEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCmluZGV4IGMxN2MxMDAuLjJhMjE0NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCkBAIC0xMzUsNyArMTM1LDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewogICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwogCiAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BTVJXQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FNUldCRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyZjA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BTVJXQkVuY29kZXIuY3BwCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBTVJXQkVuY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBTVJXQkVuY29kZXIuaCIKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisjaW5jbHVkZSAiY21uTWVtb3J5LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworc3RhdGljIGNvbnN0IGludDMyX3Qga0JpdHNQZXJTYW1wbGUgPSAxNjsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSAoa0JpdHNQZXJTYW1wbGUgLyA4KSAqIGtOdW1TYW1wbGVzUGVyRnJhbWU7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IDE2MDAwOworc3RhdGljIGNvbnN0IGludDMyX3Qga051bUNoYW5uZWxzID0gMTsKKworQU1SV0JFbmNvZGVyOjpBTVJXQkVuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1NZXRhKG1ldGEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAorICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAorICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCisgICAgICBtQXBpSGFuZGxlKE5VTEwpLAorICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpLAorICAgICAgbUFuY2hvclRpbWVVcygwKSwKKyAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCisgICAgICBtTnVtSW5wdXRTYW1wbGVzKDApIHsKK30KKworc3RhdGljIFZPQU1SV0JNT0RFIHBpY2tNb2RlRnJvbUJpdFJhdGUoaW50MzJfdCBicHMpIHsKKyAgICBDSEVDSyhicHMgPj0gMCk7CisgICAgaWYgKGJwcyA8PSA2NjAwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01ENjY7CisgICAgfSBlbHNlIGlmIChicHMgPD0gODg1MCkgeworICAgICAgICByZXR1cm4gVk9BTVJXQl9NRDg4NTsKKyAgICB9IGVsc2UgaWYgKGJwcyA8PSAxMjY1MCkgeworICAgICAgICByZXR1cm4gVk9BTVJXQl9NRDEyNjU7CisgICAgfSBlbHNlIGlmIChicHMgPD0gMTQyNTApIHsKKyAgICAgICAgcmV0dXJuIFZPQU1SV0JfTUQxNDI1OworICAgIH0gZWxzZSBpZiAoYnBzIDw9IDE1ODUwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01EMTU4NTsKKyAgICB9IGVsc2UgaWYgKGJwcyA8PSAxODI1MCkgeworICAgICAgICByZXR1cm4gVk9BTVJXQl9NRDE4MjU7CisgICAgfSBlbHNlIGlmIChicHMgPD0gMTk4NTApIHsKKyAgICAgICAgcmV0dXJuIFZPQU1SV0JfTUQxOTg1OworICAgIH0gZWxzZSBpZiAoYnBzIDw9IDIzMDUwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgcmV0dXJuIFZPQU1SV0JfTUQyMzg1OworfQorCitzdGF0dXNfdCBBTVJXQkVuY29kZXI6OmluaXRDaGVjaygpIHsKKyAgICBDSEVDSyhtQXBpSGFuZGxlID09IE5VTEwgJiYgbUVuY29kZXJIYW5kbGUgPT0gTlVMTCk7CisgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJm1CaXRSYXRlKSk7CisKKyAgICBtQXBpSGFuZGxlID0gbmV3IFZPX0FVRElPX0NPREVDQVBJOworICAgIENIRUNLKG1BcGlIYW5kbGUpOworCisgICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QU1SV0JFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgQ0hFQ0sobU1lbU9wZXJhdG9yICE9IE5VTEwpOworICAgIG1NZW1PcGVyYXRvci0+QWxsb2MgPSBjbW5NZW1BbGxvYzsKKyAgICBtTWVtT3BlcmF0b3ItPkNvcHkgPSBjbW5NZW1Db3B5OworICAgIG1NZW1PcGVyYXRvci0+RnJlZSA9IGNtbk1lbUZyZWU7CisgICAgbU1lbU9wZXJhdG9yLT5TZXQgPSBjbW5NZW1TZXQ7CisgICAgbU1lbU9wZXJhdG9yLT5DaGVjayA9IGNtbk1lbUNoZWNrOworCisgICAgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSB1c2VyRGF0YTsKKyAgICBtZW1zZXQoJnVzZXJEYXRhLCAwLCBzaXplb2YodXNlckRhdGEpKTsKKyAgICB1c2VyRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKKyAgICB1c2VyRGF0YS5tZW1EYXRhID0gKFZPX1BUUikgbU1lbU9wZXJhdG9yOworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KCZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXQgQU1SV0IgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgQU1SV0IgZW5jb2RlciQKKyAgICBWT0FNUldCTU9ERSBtb2RlID0gcGlja01vZGVGcm9tQml0UmF0ZShtQml0UmF0ZSk7CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfTU9ERSwgICZtb2RlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1vZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBWT0FNUldCRlJBTUVUWVBFIHR5cGUgPSBWT0FNUldCX1JGQzMyNjc7CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfRlJBTUVUWVBFLCAmdHlwZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIGZyYW1lIHR5cGUgdG8gJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitBTVJXQkVuY29kZXI6On5BTVJXQkVuY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFNUldCRW5jb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisKKyAgICAvLyBUaGUgbGFyZ2VzdCBidWZmZXIgc2l6ZSBpcyBoZWFkZXIgKyA0NzcgYml0cworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoMTAyNCkpOworCisgICAgQ0hFQ0tfRVEoT0ssIGluaXRDaGVjaygpKTsKKworICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNUldCRW5jb2Rlcjo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RvcCgpIHdoZW4gZW5jb2RlciBoYXMgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOworCisKKyAgICBDSEVDS19FUShWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7CisgICAgbUVuY29kZXJIYW5kbGUgPSBOVUxMOworCisgICAgZGVsZXRlIG1BcGlIYW5kbGU7CisgICAgbUFwaUhhbmRsZSA9IE5VTEw7CisKKyAgICBkZWxldGUgbU1lbU9wZXJhdG9yOworICAgIG1NZW1PcGVyYXRvcjsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQU1SV0JFbmNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFNUldCRW5jb2RlciIpOworCisgICAgcmV0dXJuIG1NZXRhOworfQorCitzdGF0dXNfdCBBTVJXQkVuY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHN0YXR1c190IGVycjsKKworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpOworICAgIGJvb2wgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKKyAgICBpbnQ2NF90IHdhbGxDbG9ja1RpbWVVcyA9IC0xOworCisgICAgd2hpbGUgKG1OdW1JbnB1dFNhbXBsZXMgPCBrTnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbXNldCgmbUlucHV0RnJhbWVbbU51bUlucHV0U2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGtOdW1TYW1wbGVzUGVyRnJhbWUgLSBtTnVtSW5wdXRTYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBhbGlnbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBDSEVDS19FUShhbGlnbiwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIHdhbGxDbG9ja1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUFuY2hvclRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29weSA9CisgICAgICAgICAgICAoa051bVNhbXBsZXNQZXJGcmFtZSAtIG1OdW1JbnB1dFNhbXBsZXMpICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAorICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltSW5wdXRCdWZmZXItPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBjb3B5KTsKKworICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZSgKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgbU51bUlucHV0U2FtcGxlcyArPSBjb3B5IC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAobU51bUlucHV0U2FtcGxlcyA+PSBrTnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzICU9IGtOdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgICAgICBicmVhazsgIC8vIEdldCBhIHdob2xlIGlucHV0IGZyYW1lIDY0MCBieXRlcworICAgICAgICB9CisgICAgfQorCisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKikgbUlucHV0RnJhbWU7CisgICAgaW5wdXREYXRhLkxlbmd0aCA9IGtJbnB1dEJ1ZmZlclNpemU7CisgICAgQ0hFQ0soVk9fRVJSX05PTkUgPT0gbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCZpbnB1dERhdGEpKTsKKworICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgT0spOworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CisKKyAgICBWT19DT0RFQ0JVRkZFUiBvdXRwdXREYXRhOworICAgIG1lbXNldCgmb3V0cHV0RGF0YSwgMCwgc2l6ZW9mKG91dHB1dERhdGEpKTsKKyAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dHB1dEluZm87CisgICAgbWVtc2V0KCZvdXRwdXRJbmZvLCAwLCBzaXplb2Yob3V0cHV0SW5mbykpOworCisgICAgVk9fVTMyIHJldCA9IFZPX0VSUl9OT05FOworICAgIG91dHB1dERhdGEuQnVmZmVyID0gb3V0UHRyOworICAgIG91dHB1dERhdGEuTGVuZ3RoID0gYnVmZmVyLT5zaXplKCk7CisgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBDSEVDSyhyZXQgPT0gVk9fRVJSX05PTkUgfHwgcmV0ID09IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOworCisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgb3V0cHV0RGF0YS5MZW5ndGgpOworICAgICsrbU51bUZyYW1lc091dHB1dDsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSBtTnVtRnJhbWVzT3V0cHV0ICogMjAwMDBMTDsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUFuY2hvclRpbWVVcyArIG1lZGlhVGltZVVzKTsKKyAgICBpZiAocmVhZEZyb21Tb3VyY2UgJiYgd2FsbENsb2NrVGltZVVzICE9IC0xKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEcmlmdFRpbWUsIG1lZGlhVGltZVVzIC0gd2FsbENsb2NrVGltZVVzKTsKKyAgICB9CisKKyAgICAqb3V0ID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5MzI4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTIwIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisgCQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlBTVJXQkVuY29kZXIuY3BwIFwKKwlzcmMvYXV0b2NvcnIuYyBcCisJc3JjL2F6X2lzcC5jIFwKKwlzcmMvYml0cy5jIFwKKwlzcmMvYzJ0NjRmeC5jIFwKKwlzcmMvYzR0NjRmeC5jIFwKKwlzcmMvY29udm9sdmUuYyBcCisJc3JjL2Nvcl9oX3guYyBcCisJc3JjL2RlY2ltNTQuYyBcCisJc3JjL2RlZW1waC5jIFwKKwlzcmMvZHR4LmMgXAorCXNyYy9nX3BpdGNoLmMgXAorCXNyYy9ncGNsaXAuYyBcCisJc3JjL2hvbWluZy5jIFwKKwlzcmMvaHA0MDAuYyBcCisJc3JjL2hwNTAuYyBcCisJc3JjL2hwNmsuYyBcCisJc3JjL2hwX3dzcC5jIFwKKwlzcmMvaW50X2xwYy5jIFwKKwlzcmMvaXNwX2F6LmMgXAorCXNyYy9pc3BfaXNmLmMgXAorCXNyYy9sYWdfd2luZC5jIFwKKwlzcmMvbGV2aW5zb24uYyBcCisJc3JjL2xvZzIuYyBcCisJc3JjL2xwX2RlYzIuYyBcCisJc3JjL21hdGhfb3AuYyBcCisJc3JjL29wZXJfMzJiLmMgXAorCXNyYy9wX21lZF9vbC5jIFwKKwlzcmMvcGl0X3NocnAuYyBcCisJc3JjL3BpdGNoX2Y0LmMgXAorCXNyYy9wcmVkX2x0NC5jIFwKKwlzcmMvcHJlZW1waC5jIFwKKwlzcmMvcV9nYWluMi5jIFwKKwlzcmMvcV9wdWxzZS5jIFwKKwlzcmMvcWlzZl9ucy5jIFwKKwlzcmMvcXBpc2ZfMnMuYyBcCisJc3JjL3JhbmRvbS5jIFwKKwlzcmMvcmVzaWR1LmMgXAorCXNyYy9zY2FsZS5jIFwKKwlzcmMvc3RyZWFtLmMgXAorCXNyYy9zeW5fZmlsdC5jIFwKKwlzcmMvdXBkdF90YXIuYyBcCisJc3JjL3V0aWwuYyBcCisJc3JjL3ZvQU1SV0JFbmMuYyBcCisJc3JjL3ZvaWNlZmFjLmMgXAorCXNyYy93Yl92YWQuYyBcCisJc3JjL3dlaWdodF9hLmMgXAorCXNyYy9tZW1fYWxpZ24uYworCisKK2lmZXEgKCQoVk9UVCksIHY1KQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKwlzcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIFwKKwlzcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIFwKKwlzcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIFwKKwlzcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCisKK2VuZGlmCisKK2lmZXEgKCQoVk9UVCksIHY3KQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKwlzcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIFwKKwlzcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zIFwKKwlzcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIFwKKwlzcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zCisKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorCSQoTE9DQUxfUEFUSCkvc3JjIFwKKwkkKExPQ0FMX1BBVEgpL2luYworCitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCisKK2lmZXEgKCQoVk9UVCksIHY1KQorTE9DQUxfQ0ZMQUdTICs9IC1EQVJNIC1EQVNNX09QVAorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NykKK0xPQ0FMX0NGTEFHUyArPSAtREFSTSAtREFSTVY3IC1EQVNNX09QVAorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNworZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmQzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCkBAIC0wLDAgKzEsMzY0IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKyNpZmRlZiBMSU5VWA0KKyNpbmNsdWRlIDxkbGZjbi5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICAgICAgPHN0ZGlvLmg+DQorI2luY2x1ZGUgICAgICA8c3RkbGliLmg+DQorI2luY2x1ZGUgICAgICA8dGltZS5oPg0KKyNpbmNsdWRlICAgICAgInZvQU1SV0IuaCINCisjaW5jbHVkZSAgICAgICJjbW5NZW1vcnkuaCINCisNCisjZGVmaW5lIFZPQU1SV0JfUkZDMzI2N19IRUFERVJfSU5GTyAiIyFBTVItV0JcbiINCisNCisjZGVmaW5lICBJTlBVVF9TSVpFICAgNjQwDQorI2RlZmluZSAgT1VUUFVUX1NJWkUgIDEwMjQNCit1bnNpZ25lZCBjaGFyICBJbnB1dEJ1ZltJTlBVVF9TSVpFXTsNCit1bnNpZ25lZCBjaGFyICBPdXRwdXRCdWZbT1VUUFVUX1NJWkVdOw0KKw0KK3ZvaWQgdXNhZ2UgKHZvaWQpIHsNCisJcHJpbnRmICgiQU1SX1dCIEVuY29kZXIgSEVMUCAgIERpc3BsYXlzIHRoaXMgdGV4dFxuIik7DQorCXByaW50ZiAoIlxuIik7DQorCXByaW50ZiAoIlVzYWdlOlxuIik7DQorCXByaW50ZiAoIkFNUldCRW5jIFtvcHRpb25zXSBJbnB1dF9maWxlIG91dHB1dF9maWxlIFxuIik7DQorCXByaW50ZiAoIlxuIik7DQorCXByaW50ZiAoIk9wdGlvbnMgK00qICtGKiArRFRYIFxuIik7DQorCXByaW50ZiAoIlN1cHBvcnQgXG4iKTsNCisJcHJpbnRmICgiT3B0aW9ucyArTSogZm9yIHNldGluZyBjb21wcmVzc2lvbiBiaXRyYXRlIG1vZGUsIGRlZmF1bHQgaXMgMjMuODVrYnBzXG4iKTsNCisJcHJpbnRmICgiICtNMCA9IDYuNmticHMgXG4iKTsNCisJcHJpbnRmICgiICtNMSA9IDguODVrYnBzIFxuIik7DQorCXByaW50ZiAoIiArTTIgPSAxMi42NWticHMgXG4iKTsNCisJcHJpbnRmICgiICtNMyA9IDE0LjI1a2JwcyBcbiIpOw0KKwlwcmludGYgKCIgK000ID0gMTUuNThrYnBzIFxuIik7DQorCXByaW50ZiAoIiArTTUgPSAxOC4yNWticHMgXG4iKTsNCisJcHJpbnRmICgiICtNNiA9IDE5Ljg1a2JwcyBcbiIpOw0KKwlwcmludGYgKCIgK003ID0gMjMuMDVrYnBzIFxuIik7DQorCXByaW50ZiAoIiArTTggPSAyMy44NWticHMgXG4iKTsNCisJcHJpbnRmICgiXG4iKTsNCisJcHJpbnRmICgiT3B0aW9ucyArRiogZm9yIHNldHRpbmcgb3V0cHV0IGZyYW1lIFR5cGUsIGRlZmF1bHQgaXMgUkZDMzI2NyBcbiIpOw0KKwlwcmludGYgKCIrRjAgZm9yIEFNUl9XQiBEZWZ1YWx0IGJpdCBleHRlcm4gc2hvcnQgZGF0YSBmcmFtZSB0eXBlIFxuIik7DQorCXByaW50ZiAoIitGMSBmb3IgQU1SX1dCX0lUVSBiaXQgZXh0ZXJuIHNob3J0IGRhdGEgZnJhbWUgdHlwZSBcbiIpOw0KKwlwcmludGYgKCIrRjIgZm9yIFJGQzMyNjdcbiAiKTsNCisJcHJpbnRmICgiXG4iKTsNCisJcHJpbnRmICgiT3B0aW9ucyArRFRYIGVuYWJsZSBEVFggbW9kZSwgZGVmYXVsdCBpcyBkaXNhYmxlLlxuIik7DQorCXByaW50ZiAoIkZpbGUgbmFtZXMsIGlucHV0IHJhdyBQQ00gZGF0YSwgYW5kIG91dHB1dCBpcyBBTVJfV0IgYml0LXN0cmVhbSBmaWxlLlxuIik7DQorCXByaW50ZiAoIlxuIik7DQorfQ0KKw0KK2ludCAgR2V0TmV4dEJ1ZihGSUxFKiBpbkZpbGUsdW5zaWduZWQgY2hhciogZHN0LGludCBzaXplKQ0KK3sNCisJaW50IHNpemUyID0gKGludClmcmVhZChkc3QsIHNpemVvZihzaWduZWQgY2hhciksIHNpemUsaW5GaWxlKTsNCisJcmV0dXJuIHNpemUyOw0KK30NCisNCit0eXBlZGVmIGludCAoVk9fQVBJICogVk9HRVRBVURJT0VOQ0FQSSkgKFZPX0FVRElPX0NPREVDQVBJICogcEVuY0hhbmRsZSk7DQorDQoraW50IGVuY29kZSgNCisJCSAgIGludCBtb2RlLCANCisJCSAgIHNob3J0ICAgYWxsb3dfZHR4LA0KKwkJICAgVk9BTVJXQkZSQU1FVFlQRSBmcmFtZVR5cGUsDQorCQkgICBjb25zdCBjaGFyKiBzcmNmaWxlLCANCisJCSAgIGNvbnN0IGNoYXIqIGRzdGZpbGUNCisJCSAgICkNCit7DQorCWludAkJCXJldCA9IDA7DQorCWludCAgICAgICAgIHJldHVybkNvZGU7DQorCUZJTEUJCSpmc3JjID0gTlVMTDsNCisJRklMRQkJKmZkc3QgPSBOVUxMOw0KKwlpbnQgICAgICAgICBmcmFtZW51bSA9IDA7DQorCWludCAgICAgICAgIGVvZkZpbGUgPSAwOw0KKwlpbnQgICAgICAgICBzaXplMSA9IDA7DQorCWludCAgICAgICAgIFJlbGVuczsNCisNCisJVk9fQVVESU9fQ09ERUNBUEkgICAgICAgQXVkaW9BUEk7DQorCVZPX01FTV9PUEVSQVRPUiAgICAgICAgIG1vcGVyOw0KKwlWT19DT0RFQ19JTklUX1VTRVJEQVRBICB1c2VEYXRhOw0KKwlWT19IQU5ETEUgICAgICAgICAgICAgICBoQ29kZWM7DQorCVZPX0NPREVDQlVGRkVSICAgICAgICAgIGluRGF0YTsNCisJVk9fQ09ERUNCVUZGRVIgICAgICAgICAgb3V0RGF0YTsNCisJVk9fQVVESU9fT1VUUFVUSU5GTyAgICAgb3V0Rm9ybWF0Ow0KKw0KKwl1bnNpZ25lZCBjaGFyICppbkJ1ZiA9IElucHV0QnVmOw0KKwl1bnNpZ25lZCBjaGFyICpvdXRCdWYgPSBPdXRwdXRCdWY7DQorDQorDQorI2lmZGVmIExJTlVYDQorCXZvaWQgICpoYW5kbGUgPSBOVUxMOw0KKwl2b2lkICAqcGZ1bmM7DQorCVZPR0VUQVVESU9FTkNBUEkgcEdldEFQSTsNCisjZW5kaWYNCisNCisJY2xvY2tfdCAgIHN0YXJ0LCBmaW5pc2g7DQorCWRvdWJsZSAgICBkdXJhdGlvbiA9IDAuMDsNCisNCisJaWYgKChmc3JjID0gZm9wZW4gKHNyY2ZpbGUsICJyYiIpKSA9PSBOVUxMKQ0KKwl7DQorCQlyZXQgPSAtMTsNCisJCWdvdG8gc2FmZV9leGl0Ow0KKwl9DQorDQorCWlmICgoZmRzdCA9IGZvcGVuIChkc3RmaWxlLCAid2IiKSkgPT0gTlVMTCkNCisJew0KKwkJcmV0ID0gLTE7DQorCQlnb3RvIHNhZmVfZXhpdDsNCisJfQ0KKw0KKwltb3Blci5BbGxvYyA9IGNtbk1lbUFsbG9jOw0KKwltb3Blci5Db3B5ID0gY21uTWVtQ29weTsNCisJbW9wZXIuRnJlZSA9IGNtbk1lbUZyZWU7DQorCW1vcGVyLlNldCA9IGNtbk1lbVNldDsNCisJbW9wZXIuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisNCisJdXNlRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsNCisJdXNlRGF0YS5tZW1EYXRhID0gKFZPX1BUUikoJm1vcGVyKTsNCisNCisjaWZkZWYgTElOVVgNCisJaGFuZGxlID0gZGxvcGVuKCIvZGF0YS9sb2NhbC90bXAvdm9BTVJXQkVuYy5zbyIsIFJUTERfTk9XKTsNCisJaWYoaGFuZGxlID09IDApDQorCXsNCisJCXByaW50Zigib3BlbiBkbGwgZXJyb3IuLi4uLi4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QU1SV0JFbmNBUEkiKTsJDQorCWlmKHBmdW5jID09IDApDQorCXsNCisJCXByaW50Zigib3BlbiBmdW5jdGlvbiBlcnJvci4uLi4uLiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXBHZXRBUEkgPSAoVk9HRVRBVURJT0VOQ0FQSSlwZnVuYzsNCisNCisJcmV0dXJuQ29kZSAgPSBwR2V0QVBJKCZBdWRpb0FQSSk7DQorCWlmKHJldHVybkNvZGUpDQorCXsNCisJCXByaW50ZigiZ2V0IEFQSXMgZXJyb3IuLi4uLi4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKyNlbHNlDQorCXJldCA9IHZvR2V0QU1SV0JFbmNBUEkoJkF1ZGlvQVBJKTsNCisJaWYocmV0KQ0KKwl7DQorCQlyZXQgPSAtMTsNCisJCXByaW50ZigiZ2V0IEFQSXMgZXJyb3IuLi4uLi4iKTsNCisJCWdvdG8gc2FmZV9leGl0Ow0KKwl9DQorI2VuZGlmIA0KKw0KKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEluaXQgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCXJldCA9IEF1ZGlvQVBJLkluaXQoJmhDb2RlYywgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VEYXRhKTsNCisNCisJaWYocmV0KQ0KKwl7DQorCQlyZXQgPSAtMTsNCisJCXByaW50ZigiQVBJcyBpbml0IGVycm9yLi4uLi4uIik7DQorCQlnb3RvIHNhZmVfZXhpdDsNCisJfQ0KKw0KKwlSZWxlbnMgPSBHZXROZXh0QnVmKGZzcmMsSW5wdXRCdWYsSU5QVVRfU0laRSk7DQorCWlmKFJlbGVucyE9SU5QVVRfU0laRSAmJiAhZmVvZihmc3JjKSkNCisJew0KKwkJcmV0ID0gLTE7IC8vSW52YWxpZCBtYWdpYyBudW1iZXINCisJCXByaW50ZigiZ2V0IG5leHQgYnVmZmVyIGVycm9yLi4uLi4uIik7DQorCQlnb3RvIHNhZmVfZXhpdDsNCisJfQ0KKw0KKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIHNldCBlbmNvZGUgTW9kZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKwlyZXQgPSBBdWRpb0FQSS5TZXRQYXJhbShoQ29kZWMsIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEUsICZmcmFtZVR5cGUpOw0KKwlyZXQgPSBBdWRpb0FQSS5TZXRQYXJhbShoQ29kZWMsIFZPX1BJRF9BTVJXQl9NT0RFLCAmbW9kZSk7DQorCXJldCA9IEF1ZGlvQVBJLlNldFBhcmFtKGhDb2RlYywgVk9fUElEX0FNUldCX0RUWCwgJmFsbG93X2R0eCk7DQorDQorCWlmKGZyYW1lVHlwZSA9PSBWT0FNUldCX1JGQzMyNjcpDQorCXsNCisJCS8qIHdyaXRlIFJGQzMyNjcgSGVhZGVyIGluZm8gdG8gaW5kaWNhdGUgc2luZ2xlIGNoYW5uZWwgQU1SIGZpbGUgc3RvcmFnZSBmb3JtYXQgKi8NCisJCXNpemUxID0gKGludClzdHJsZW4oVk9BTVJXQl9SRkMzMjY3X0hFQURFUl9JTkZPKTsNCisJCW1lbWNweShvdXRCdWYsIFZPQU1SV0JfUkZDMzI2N19IRUFERVJfSU5GTywgc2l6ZTEpOw0KKwkJb3V0QnVmICs9IHNpemUxOw0KKwl9DQorDQorCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCXByaW50ZigiIFxuIC0tLS0tLS0tLS0tLS0tLS0gUnVubmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIik7DQorDQorCWRvew0KKwkJaW5EYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopaW5CdWY7DQorCQlpbkRhdGEuTGVuZ3RoID0gUmVsZW5zOw0KKwkJb3V0RGF0YS5CdWZmZXIgPSBvdXRCdWY7DQorDQorCQlzdGFydCA9IGNsb2NrKCk7DQorDQorCQkvKiBkZWNvZGUgb25lIGFtciBibG9jayAqLw0KKwkJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLlNldElucHV0RGF0YShoQ29kZWMsJmluRGF0YSk7DQorDQorCQlkbyB7DQorCQkJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLkdldE91dHB1dERhdGEoaENvZGVjLCZvdXREYXRhLCAmb3V0Rm9ybWF0KTsNCisJCQlpZihyZXR1cm5Db2RlID09IDApDQorCQkJew0KKwkJCQlmcmFtZW51bSsrOw0KKwkJCQlwcmludGYoIiBGcmFtZXMgcHJvY2Vzc2VkOiAlaGRcciIsIGZyYW1lbnVtKTsNCisJCQkJaWYoZnJhbWVudW0gPT0gMSkNCisJCQkJew0KKwkJCQkJZndyaXRlKE91dHB1dEJ1ZiwgMSwgb3V0RGF0YS5MZW5ndGggKyBzaXplMSwgZmRzdCk7DQorCQkJCQlmZmx1c2goZmRzdCk7CQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZndyaXRlKG91dERhdGEuQnVmZmVyLCAxLCBvdXREYXRhLkxlbmd0aCwgZmRzdCk7DQorCQkJCQlmZmx1c2goZmRzdCk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZihyZXR1cm5Db2RlID09IFZPX0VSUl9MSUNFTlNFX0VSUk9SKQ0KKwkJCXsNCisJCSAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHRpbWUgcmVhY2ggdXBwZXIgbGltaXQuLi4uLi4iKTsNCisJCSAgICAgICAgZ290byBzYWZlX2V4aXQ7DQorCQkJfQ0KKwkJfSB3aGlsZShyZXR1cm5Db2RlICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOw0KKw0KKwkJZmluaXNoID0gY2xvY2soKTsNCisJCWR1cmF0aW9uICs9IGZpbmlzaCAtIHN0YXJ0Ow0KKw0KKwkJaWYgKCFlb2ZGaWxlKSB7DQorCQkJUmVsZW5zID0gR2V0TmV4dEJ1Zihmc3JjLCBJbnB1dEJ1ZiwgSU5QVVRfU0laRSk7DQorCQkJaW5CdWYgPSBJbnB1dEJ1ZjsNCisJCQlpZiAoZmVvZihmc3JjKSAmJiBSZWxlbnMgPT0gMCkNCisJCQkJZW9mRmlsZSA9IDE7DQorCQl9DQorCX0gd2hpbGUgKCFlb2ZGaWxlICYmIHJldHVybkNvZGUpOw0KKwkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEVuZCBFbmNvZGluZyBTZWN0aW9uICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitzYWZlX2V4aXQ6DQorCXJldHVybkNvZGUgPSBBdWRpb0FQSS5VbmluaXQoaENvZGVjKTsNCisNCisJcHJpbnRmKCAiXG4lMi41ZiBzZWNvbmRzXG4iLCAoZG91YmxlKWR1cmF0aW9uL0NMT0NLU19QRVJfU0VDKTsNCisNCisJaWYgKGZzcmMpDQorCQlmY2xvc2UoZnNyYyk7DQorCWlmIChmZHN0KQ0KKwkJZmNsb3NlKGZkc3QpOw0KKw0KKyNpZmRlZiBMSU5VWA0KKwlkbGNsb3NlKGhhbmRsZSk7DQorI2VuZGlmDQorDQorCXJldHVybiByZXQ7DQorfQ0KKw0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgIC8vIGZvciBnY2MgY29tcGlsZXI7DQorew0KKwlpbnQgICAgIG1vZGUsIHI7DQorCWludCAgICAgYXJnLCBmaWxlbmFtZT0wOw0KKwljaGFyICAgICppbkZpbGVOYW1lID0gTlVMTDsNCisJY2hhciAgICAqb3V0RmlsZU5hbWUgPSBOVUxMOw0KKwlzaG9ydCAgIGFsbG93X2R0eDsNCisJVk9BTVJXQkZSQU1FVFlQRSBmcmFtZVR5cGU7DQorDQorCXByaW50ZigiXG4iKTsNCisJcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKipBZGFwdGl2ZSBNdWx0aS1SYXRlIFdpZGUgQmFuZCBFbmNvZGVyIChBTVItV0IpKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7DQorCXByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipERUZJTklUSU9OUzoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsNCisJcHJpbnRmKCJBTVItV0IgZW5jb2RlciBzY2hlbWUgaXMgYmFzZWQgb24gdGhlIHByaW5jaXBsZSBvZiBBbGdlYnJhaWMgQ29kZSBFeGNpdGVkIExpbmVhciBQcmVkaWN0aW9uIGFsZ29yaXRobVxuIik7DQorCXByaW50ZigiVGhlIEFNUi1XQiBlbmNvZGVyIGNvbXByZXNzaW9uIE1PTk8gbGluZXIgUENNIHNwZWVjaCBpbnB1dCBkYXRhIGF0IDE2a0h6IHNhbXBsaW5nIHJhdGVcbiIpOw0KKwlwcmludGYoInRvIG9uZSBvZiBuaW5lIGRhdGEgcmF0ZSBtb2Rlcy02LjYwLCA4Ljg1LCAxMi42NSwgMTQuMjUsIDE1Ljg1LCAxOC4yNSwgMTkuMjUsIDIzLjA1IGFuZCAyMy44NWticHMuXG4iKTsNCisJcHJpbnRmKCJUaGUgZW5jb2RlciBzdXBwb3J0cyBvdXRwdXQgZm9ybWF0IEFNUldCIElUVSwgQU1SV0IgUkZDMzI2Ny5cbiIpOw0KKwlwcmludGYoIlxuIik7DQorDQorCS8qRW5jb2RlciBEZWZhdWx0IHNldHRpbmcgKi8NCisJbW9kZSA9IFZPQU1SV0JfTUQyMzg1Ow0KKwlhbGxvd19kdHggPSAwOw0KKwlmcmFtZVR5cGUgPSBWT0FNUldCX1JGQzMyNjc7DQorDQorCWlmKGFyZ2MgPCAzKXsNCisJCXVzYWdlKCk7DQorCQlyZXR1cm4gMDsNCisJfWVsc2V7DQorCQlmb3IgKGFyZyA9IDE7IGFyZyA8IGFyZ2M7IGFyZysrKSB7DQorCQkJaWYgKGFyZ3YgW2FyZ10gWzBdID09ICcrJykgew0KKwkJCQlpZihhcmd2W2FyZ11bMV0gPT0gJ00nKQ0KKwkJCQl7DQorCQkJCQlzd2l0Y2goYXJndlthcmddWzJdKQ0KKwkJCQkJew0KKwkJCQkJY2FzZSAnMCc6IG1vZGUgPSBWT0FNUldCX01ENjY7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICcxJzogbW9kZSA9IFZPQU1SV0JfTUQ4ODU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICcyJzogbW9kZSA9IFZPQU1SV0JfTUQxMjY1Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSAnMyc6IG1vZGUgPSBWT0FNUldCX01EMTQyNTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzQnOiBtb2RlID0gVk9BTVJXQl9NRDE1ODU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICc1JzogbW9kZSA9IFZPQU1SV0JfTUQxODI1Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSAnNic6IG1vZGUgPSBWT0FNUldCX01EMTk4NTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzcnOiBtb2RlID0gVk9BTVJXQl9NRDIzMDU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICc4JzogbW9kZSA9IFZPQU1SV0JfTUQyMzg1Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJZGVmYXVsdDoNCisJCQkJCQl1c2FnZSgpOw0KKwkJCQkJCXByaW50ZiAoIkludmFsaWQgcGFyYW1ldGVyICclcycuXG4iLCBhcmd2IFthcmddKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfWVsc2UgaWYoYXJndlthcmddWzFdID09ICdGJykNCisJCQkJew0KKwkJCQkJc3dpdGNoKGFyZ3ZbYXJnXVsyXSkNCisJCQkJCXsNCisJCQkJCWNhc2UgJzAnOiBmcmFtZVR5cGUgPSBWT0FNUldCX0RFRkFVTFQ7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICcxJzogZnJhbWVUeXBlID0gVk9BTVJXQl9JVFU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICcyJzogZnJhbWVUeXBlID0gVk9BTVJXQl9SRkMzMjY3IDsNCisJCQkJCQlicmVhazsgDQorCQkJCQlkZWZhdWx0Og0KKwkJCQkJCXVzYWdlKCk7DQorCQkJCQkJcHJpbnRmICgiSW52YWxpZCBwYXJhbWV0ZXIgJyVzJy5cbiIsIGFyZ3YgW2FyZ10pOw0KKwkJCQkJCWJyZWFrOw0KKw0KKw0KKwkJCQkJfQ0KKwkJCQl9ZWxzZSBpZihzdHJjbXAgKGFyZ3ZbYXJnXSwgIitEVFgiKSA9PSAwKQ0KKwkJCQl7DQorCQkJCQlhbGxvd19kdHggPSAxOw0KKwkJCQl9DQorDQorCQkJfSBlbHNlIHsNCisJCQkJc3dpdGNoIChmaWxlbmFtZSkgew0KKwkJCQkJCWNhc2UgMDogDQorCQkJCQkJCWluRmlsZU5hbWUgID0gYXJndlthcmddOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQljYXNlIDE6IA0KKwkJCQkJCQlvdXRGaWxlTmFtZSA9IGFyZ3ZbYXJnXTsgDQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCWRlZmF1bHQ6DQorCQkJCQkJCXVzYWdlICgpOw0KKwkJCQkJCQlmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIHBhcmFtZXRlciAnJXMnLlxuIiwgYXJndiBbYXJnXSk7DQorCQkJCQkJCXJldHVybiAwOw0KKwkJCQl9DQorCQkJCWZpbGVuYW1lKys7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXIgPSBlbmNvZGUobW9kZSwgYWxsb3dfZHR4LCBmcmFtZVR5cGUsIGluRmlsZU5hbWUsIG91dEZpbGVOYW1lKTsNCisJaWYocikNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogJWRcbiIsIHIpOw0KKwl9DQorCXJldHVybiByOw0KK30NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRiMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IAlBTVJXQl9FX1NBTVBMRS5jCisJCitMT0NBTF9TUkNfRklMRVMgKz0gCVwKKwkuLi8uLi8uLi9Db21tb24vY21uTWVtb3J5LmMgCisKK0xPQ0FMX01PRFVMRSA6PSBUZXN0dm9BTVJXQkVuYworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ2b0FNUldCRW5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoTE9DQUxfUEFUSCkvIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL0NvbW1vbiBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9JbmNsdWRlIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoVk9fQ0ZMQUdTKQorCQoraW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViODc2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZQpAQCAtMCwwICsxLDU2IEBACisjLyoNCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyAqKg0KKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjICoqDQorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyAqKg0KKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyAqLw0KKw0KKyMgdGFyZ2V0Ng0KKyMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQ0KK1ZPVFQ6PSB2Ng0KKw0KKw0KKyMgbW9kdWxlIHR5cGUNCisjIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlDQorVk9NVDo9IGV4ZQ0KKw0KKw0KKyMgbW9kdWxlIG1hY3Jvcw0KKyMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuIA0KKyMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZSANCitWT01NOj0gI0FSTVY1RQ0KKw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCitWT1RBUkdFVDo9IHZvQU1SV0JFbmNfVGVzdA0KKw0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIA0KKw0KKyMgZGVwZW5kZW50IGxpYnJhcmllcy4NCitWT0RFUExJQlM6PS1sZGwNCisNCisNCisjIG1vZHVsZSBzb3VyY2UNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQ0KK2luY2x1ZGUgLi4vbXMubWsNCisNCisNCisjIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQNCitWT1JFTERJUjo9Li4vDQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvbXMubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9tcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGU4OTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvbXMubWsKQEAgLTAsMCArMSwyNCBAQAorIy8qDQorIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyMgKioNCisjICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIyAqKg0KKyMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMgKioNCisjICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyMgKi8NCisjIHBsZWFzZSBsaXN0IGFsbCBvYmplY3RzIG5lZWRlZCBieSB5b3VyIHRhcmdldCBoZXJlDQorT0JKUzo9QU1SV0JfRV9TQU1QTEUubyBjbW5NZW1vcnkubw0KKwkJCQ0KKyMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZSANCitWT1NSQ0RJUjo9Li4vIFwNCisgICAgICAgICAgLi4vLi4vLi4vLi4vQ29tbW9uIFwNCisJICAuLi8uLi8uLi8uLi9JbmNsdWRlDQorCQkJCQkNCisJCQkJDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZkYTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUKQEAgLTAsMCArMSw1MyBAQAorIy8qDQorIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyMgKioNCisjICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorIyAqKg0KKyMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMgKioNCisjICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyMgKi8NCisNCisjIHRhcmdldCB0eXBlDQorIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pDQorVk9UVDo9IHY1DQorDQorDQorIyBtb2R1bGUgdHlwZQ0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUNCitWT01UOj0gbGliDQorDQorDQorIyBtb2R1bGUgbWFjcm9zDQorIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gDQoraWZlcSAoJChWT1RUKSwgdjUpDQorVk9NTTo9LURBUk0gLURBU01fT1BUDQorZW5kaWYNCisNCisjIHBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlDQorVk9UQVJHRVQ6PSBsaWJ2b0FNUldCRW5jdjUNCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tayANCisNCisjIGRlcGVuZGVudCBsaWJyYXJpZXMuDQorVk9ERVBMSUJTOj0tbGRsIC1sc3RkYysrIC1sY3V0aWxzDQorDQorIyBtb2R1bGUgc291cmNlDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUNCitpbmNsdWRlIC4uL21zLm1rDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkDQorVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg2NDExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQpAQCAtMCwwICsxLDUzIEBACisjLyoNCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyAqKg0KKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjICoqDQorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyAqKg0KKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyAqLw0KKw0KKyMgdGFyZ2V0IHR5cGUNCisjIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikNCitWT1RUOj0gdjcNCisNCisNCisjIG1vZHVsZSB0eXBlDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQ0KK1ZPTVQ6PSBsaWINCisNCisNCisjIG1vZHVsZSBtYWNyb3MNCisjIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiANCitpZmVxICgkKFZPVFQpLCB2NykNCitWT01NOj0tREFSTSAtREFSTVY3IC1EQVNNX09QVA0KK2VuZGlmDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQ0KK1ZPVEFSR0VUOj0gbGlidm9BTVJXQkVuY3Y3DQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsgDQorDQorIyBkZXBlbmRlbnQgbGlicmFyaWVzLg0KK1ZPREVQTElCUzo9LWxkbCAtbHN0ZGMrKyAtbGN1dGlscw0KKw0KKyMgbW9kdWxlIHNvdXJjZQ0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlDQoraW5jbHVkZSAuLi9tcy5taw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZA0KK1ZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi8uLi9SZWxlYXNlDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3M2ExYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIy8qCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisjICoqCisjICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAqKgorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICoqCisjICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjICovCisjIEp1c3QgYWN0aW5nIGFzIEZhdGhlciBNYWtlZmlsZSBvZiBNb2R1bGVzCisjIHBsZWFzZSBrZWVwIHRoZSBuYW1lICdtYWtlZmlsZScgdW5jaGFuZ2VkCisgCisjIE1vZHVsZSBTdWJkaXJzCitWT01TRDo9JChkaXIgJChzaGVsbCBmaW5kIC4gLW5hbWUgJ01ha2VmaWxlJykpCisKK2FsbDoKKwlmb3IgZGlyIGluICQoVk9NU0QpOyBcCisJCWRvIFwKKwkJCSQoTUFLRSkgLUMgJCRkaXI7IFwKKwkJZG9uZQorCisuUEhPTlk6Y2xlYW4gZGV2ZWwKK2NsZWFuOgorCWZvciBkaXIgaW4gJChWT01TRCk7IFwKKwkJZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBjbGVhbjsgXAorCQlkb25lCisKK2RldmVsOgorCWZvciBkaXIgaW4gJChWT01TRCk7IFwKKwkJZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBkZXZlbDsgXAorCQlkb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY2MjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tcy5tawpAQCAtMCwwICsxLDQzIEBACisjLyoNCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyAqKg0KKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjICoqDQorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyAqKg0KKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyAqLw0KKyMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZSANCitWT1NSQ0RJUjo9Li4vLi4vLi4vaW5jIFwNCisgICAgICAgICAgLi4vLi4vLi4vc3JjIFwNCisJICAuLi8uLi8uLi8uLi8uLi9JbmNsdWRlIA0KKw0KKyMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUNCitPQkpTOj0gYXV0b2NvcnIubyBhel9pc3AubyBiaXRzLm8gYzJ0NjRmeC5vIGM0dDY0ZngubyBjb252b2x2ZS5vIGNvcl9oX3gubyBkZWNpbTU0Lm8gXA0KKyAgICAgICBkZWVtcGgubyBkdHgubyBnX3BpdGNoLm8gZ3BjbGlwLm8gaG9taW5nLm8gaHA0MDAubyBocDUwLm8gaHA2ay5vIGhwX3dzcC5vIFwNCisgICAgICAgaW50X2xwYy5vIGlzcF9hei5vIGlzcF9pc2YubyBsYWdfd2luZC5vIGxldmluc29uLm8gbG9nMi5vIGxwX2RlYzIubyBtYXRoX29wLm8gbWVtX2FsaWduLm8gXA0KKyAgICAgICBvcGVyXzMyYi5vIHBfbWVkX29sLm8gcGl0X3NocnAubyBwaXRjaF9mNC5vIHByZWRfbHQ0Lm8gcHJlZW1waC5vIHFfZ2FpbjIubyBxX3B1bHNlLm8gXA0KKyAgICAgICBxaXNmX25zLm8gcXBpc2ZfMnMubyByYW5kb20ubyByZXNpZHUubyBzY2FsZS5vIHN0cmVhbS5vIHN5bl9maWx0Lm8gdXBkdF90YXIubyB1dGlsLm8gXA0KKyAgICAgICB2b0FNUldCRW5jLm8gdm9pY2VmYWMubyB3Yl92YWQubyB3ZWlnaHRfYS5vDQorCQkJDQorDQoraWZlcSAoJChWT1RUKSwgdjUpDQorT0JKUyArPSBjb3JfaF92ZWNfb3B0Lm8gRGVlbXBoXzMyX29wdC5vIERvdF9wX29wdC5vIEZpbHRfNmtfN2tfb3B0Lm8gcmVzaWR1X2FzbV9vcHQubyBcDQorICAgICAgIHNjYWxlX3NpZ19vcHQubyBTeW5fZmlsdF8zMl9vcHQubyBzeW5fZmlsdF9vcHQubyBwcmVkX2x0NF8xX29wdC5vIGNvbnZvbHZlX29wdC5vIFwNCisgICAgICAgTm9ybV9Db3JyX29wdC5vDQorVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RQ0KK2VuZGlmDQorDQoraWZlcSAoJChWT1RUKSwgdjcpDQorT0JKUys9IGNvcl9oX3ZlY19uZW9uLm8gRGVlbXBoXzMyX25lb24ubyBEb3RfcF9uZW9uLm8gRmlsdF82a183a19uZW9uLm8gcmVzaWR1X2FzbV9uZW9uLm8gXA0KKyAgICAgICBzY2FsZV9zaWdfbmVvbi5vIFN5bl9maWx0XzMyX25lb24ubyBzeW5fZmlsdF9uZW9uLm8gcHJlZF9sdDRfMV9uZW9uLm8gY29udm9sdmVfbmVvbi5vIFwNCisgICAgICAgTm9ybV9Db3JyX25lb24ubw0KK1ZPU1JDRElSKz0gLi4vLi4vLi4vc3JjL2FzbS9BUk1WNw0KK2VuZGlmDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2RvYy92b0FNUldCRW5jb2RlclNESy5wZGYgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFkZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2RvYy92b0FNUldCRW5jb2RlclNESy5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9hY2VscC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9hY2VscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjM4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmgKQEAgLTAsMCArMSw1MjEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBBQ0VMUC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgRnVuY3Rpb24JCQkgCQkJICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisjaWZuZGVmIF9fQUNFTFBfSF9fDQorI2RlZmluZSBfX0FDRUxQX0hfXw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImNvZF9tYWluLmgiDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIExQQyBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK1dvcmQxNiBtZWRpYW41KFdvcmQxNiB4W10pOw0KKw0KK3ZvaWQgQXV0b2NvcnIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IElucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiByX2hbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKG1zYikgICAgICAgICAgICovDQorCQlXb3JkMTYgcl9sW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IEF1dG9jb3JyZWxhdGlvbnMgIChsc2IpICAgICAgICAgICAqLw0KKwkgICAgICk7DQorDQordm9pZCBMYWdfd2luZG93KA0KKwkJV29yZDE2IHJfaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKG1zYikgICAgICAgICAgKi8NCisJCVdvcmQxNiByX2xbXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IEF1dG9jb3JyZWxhdGlvbnMgIChsc2IpICAgICAgICAgICovDQorCSAgICAgICApOw0KKw0KK3ZvaWQgSW5pdF9MZXZpbnNvbigNCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICA6c3RhdGljIG1lbW9yeSAoMTggd29yZHMpICovDQorCQkpOw0KKw0KK3ZvaWQgTGV2aW5zb24oDQorCQlXb3JkMTYgUmhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBSaFtNKzFdIFZlY3RvciBvZiBhdXRvY29ycmVsYXRpb25zIChtc2IpICovDQorCQlXb3JkMTYgUmxbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBSbFtNKzFdIFZlY3RvciBvZiBhdXRvY29ycmVsYXRpb25zIChsc2IpICovDQorCQlXb3JkMTYgQVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTIgOiBBW01dICAgIExQQyBjb2VmZmljaWVudHMgIChtID0gMTYpICAgICAgICovDQorCQlXb3JkMTYgcmNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiByY1tNXSAgIFJlZmxlY3Rpb24gY29lZmZpY2llbnRzLiAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOnN0YXRpYyBtZW1vcnkgKDE4IHdvcmRzKSAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKTsNCisNCit2b2lkIEF6X2lzcCgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IHByZWRpY3RvciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBJbW1pdHRhbmNlIHNwZWN0cmFsIHBhaXJzICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG9sZF9pc3BbXSAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb2xkIGlzcFtdIChpbiBjYXNlIG5vdCBmb3VuZCBNIHJvb3RzKSAgKi8NCisJICAgKTsNCisNCit2b2lkIElzcF9BeigNCisJCVdvcmQxNiBpc3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IEltbWl0dGFuY2Ugc3BlY3RyYWwgcGFpcnMgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTEyIDogcHJlZGljdG9yIGNvZWZmaWNpZW50cyAob3JkZXIgPSBNKSAgICovDQorCQlXb3JkMTYgbSwNCisJCVdvcmQxNiBhZGFwdGl2ZV9zY2FsaW5nICAgICAgICAgICAgICAgLyogKGkpIDAgICA6IGFkYXB0aXZlIHNjYWxpbmcgZGlzYWJsZWQgKi8NCisJCS8qICAgICAxICAgOiBhZGFwdGl2ZSBzY2FsaW5nIGVuYWJsZWQgICovDQorCSAgICk7DQorDQordm9pZCBJc3BfaXNmKA0KKwkJV29yZDE2IGlzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaXNwW21dIChyYW5nZTogLTE8PXZhbDwxKSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGlzZltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogaXNmW21dIG5vcm1hbGl6ZWQgKHJhbmdlOiAwLjA8PXZhbDw9MC41KSAqLw0KKwkJV29yZDE2IG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKTsNCisNCit2b2lkIElzZl9pc3AoDQorCQlXb3JkMTYgaXNmW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpc2ZbbV0gbm9ybWFsaXplZCAocmFuZ2U6IDAuMDw9dmFsPD0wLjUpICovDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBpc3BbbV0gKHJhbmdlOiAtMTw9dmFsPDEpICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICApOw0KKw0KK3ZvaWQgSW50X2lzcCgNCisJCVdvcmQxNiBpc3Bfb2xkW10sICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc3BzIGZyb20gcGFzdCBmcmFtZSAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc3BfbmV3W10sICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc3BzIGZyb20gcHJlc2VudCBmcmFtZSAgICAgICAgICAgKi8NCisJCVdvcmQxNiBmcmFjW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBmb3IgMyBmaXJzdCBzdWJmciAoUTE1KSAgKi8NCisJCVdvcmQxNiBBeltdICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBMUCBjb2VmZmljaWVudHMgaW4gNCBzdWJmcmFtZXMgICAgKi8NCisJICAgICk7DQorDQordm9pZCBXZWlnaHRfYSgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSAgTFBDIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGFwW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTEyIDogU3BlY3RyYWwgZXhwYW5kZWQgTFBDIGNvZWZmaWNpZW50cyAgICovDQorCQlXb3JkMTYgZ2FtbWEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBTcGVjdHJhbCBleHBhbnNpb24gZmFjdG9yLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExQQyBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICk7DQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGlzZiBxdWFudGl6ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgUXBpc2ZfMnNfNDZiKA0KKwkJV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogKGlvKVExNSA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbmJfc3VydiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBudW1iZXIgb2Ygc3Vydml2b3IgKDEsIDIsIDMgb3IgNCkgICAgKi8NCisJCSk7DQorDQordm9pZCBRcGlzZl8yc18zNmIoDQorCQlXb3JkMTYgKiBpc2YxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiAoaW8pUTE1IDogcGFzdCBJU0YgcXVhbnRpemVyICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuYl9zdXJ2ICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBzdXJ2aXZvciAoMSwgMiwgMyBvciA0KSAgICAqLw0KKwkJKTsNCisNCit2b2lkIERwaXNmXzJzXzQ2YigNCisJCVdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6ZWQgSVNGIGluIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogaS8wICAgOiBwYXN0IElTRiBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZvbGQsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGFzdCBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX2J1ZiwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzZiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgYmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogQmFkIGZyYW1lIGluZGljYXRvciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGVuY19kZWMNCisJCSk7DQorDQordm9pZCBEcGlzZl8yc18zNmIoDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcXVhbnRpemVkIElTRiBpbiBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBwYXN0X2lzZnEsICAgICAgICAgICAgICAgICAgIC8qIGkvMCAgIDogcGFzdCBJU0YgcXVhbnRpemVyICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmb2xkLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBhc3QgcXVhbnRpemVkIElTRiAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9idWYsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc2YgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGJmaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IEJhZCBmcmFtZSBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBlbmNfZGVjDQorCQkpOw0KKw0KK3ZvaWQgUWlzZl9ucygNCisJCVdvcmQxNiAqIGlzZjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGluZGljZSAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgKi8NCisJICAgICk7DQorDQordm9pZCBEaXNmX25zKA0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9xICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgICovDQorCSAgICApOw0KKw0KK1dvcmQxNiBTdWJfVlEoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHJldHVybiBxdWFudGl6YXRpb24gaW5kZXggICAgICovDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogSVNGIHJlc2lkdWFsIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGRpY28sICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBxdWFudGl6YXRpb24gY29kZWJvb2sgICAgICAgICAqLw0KKwkJV29yZDE2IGRpbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGRpbWVudGlvbiBvZiB2ZWN0b3IgICAgICAgICAgICovDQorCQlXb3JkMTYgZGljb19zaXplLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc2l6ZSBvZiBxdWFudGl6YXRpb24gY29kZWJvb2sgKi8NCisJCVdvcmQzMiAqIGRpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBlcnJvciBvZiBxdWFudGl6YXRpb24gICAgICAgICAqLw0KKwkgICAgICk7DQorDQordm9pZCBSZW9yZGVyX2lzZigNCisJCVdvcmQxNiAqIGlzZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgUTE1OiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiBtaW5fZGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSAgOiBtaW5pbXVtIGRpc3RhbmNlIHRvIGtlZXAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICAgOiBudW1iZXIgb2YgSVNGICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCSk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgSW5pdF9EZWNpbV8xMms4KA0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IG1lbW9yeSAoMipOQl9DT0VGX0RPV04pIHNldCB0byB6ZXJvcyAqLw0KKwkJKTsNCit2b2lkIERlY2ltXzEyazgoDQorCQlXb3JkMTYgc2lnMTZrW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgc2lnbmFsIHRvIGRvd25zYW1wbGluZyAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBsZW5ndGggb2YgaW5wdXQgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZzEyazhbXSwgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGRlY2ltYXRlZCBzaWduYWwgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5ICgyKk5CX0NPRUZfRE9XTikgKi8NCisJICAgICAgICk7DQorDQordm9pZCBJbml0X0hQNTBfMTJrOChXb3JkMTYgbWVtW10pOw0KK3ZvaWQgSFA1MF8xMms4KA0KKwkJV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc2lnbmFsICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmdodCBvZiBzaWduYWwgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsdGVyIG1lbW9yeSBbNl0gICAqLw0KKwkgICAgICApOw0KK3ZvaWQgSW5pdF9IUDQwMF8xMms4KFdvcmQxNiBtZW1bXSk7DQordm9pZCBIUDQwMF8xMms4KA0KKwkJV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc2lnbmFsICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmdodCBvZiBzaWduYWwgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsdGVyIG1lbW9yeSBbNl0gICAqLw0KKwkgICAgICAgKTsNCisNCit2b2lkIEluaXRfRmlsdF82a183ayhXb3JkMTYgbWVtW10pOw0KK3ZvaWQgRmlsdF82a183aygNCisJCVdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5IChzaXplPTMwKSAgICAgICAgKi8NCisJICAgICAgICk7DQordm9pZCBGaWx0XzZrXzdrX2FzbSgNCisJCVdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5IChzaXplPTMwKSAgICAgICAgKi8NCisJICAgICAgICk7DQorDQordm9pZCBMUF9EZWNpbTIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogc2lnbmFsIHRvIHByb2Nlc3MgICAgICAgICAqLw0KKwkJV29yZDE2IGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKHNpemU9MykgICAgICAgICAgICovDQorCSAgICAgICk7DQorDQordm9pZCBQcmVlbXBoKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICk7DQordm9pZCBQcmVlbXBoMigNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IGlucHV0IHNpZ25hbCBvdmVyd3JpdHRlbiBieSB0aGUgb3V0cHV0ICovDQorCQlXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBwcmVlbXBoYXNpcyBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbGVuZ2h0IG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeFstMV0pICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKTsNCit2b2lkIERlZW1waCgNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IGlucHV0IHNpZ25hbCBvdmVyd3JpdHRlbiBieSB0aGUgb3V0cHV0ICovDQorCQlXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBkZWVtcGhhc2lzIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeVstMV0pICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICk7DQordm9pZCBEZWVtcGgyKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICk7DQordm9pZCBEZWVtcGhfMzIoDQorCQlXb3JkMTYgeF9oaVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDMxLi4xNikgKi8NCisJCVdvcmQxNiB4X2xvW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MTUuLjQpICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAoeDE2KSAgICAgICovDQorCQlXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBkZWVtcGhhc2lzIGZhY3RvciAgICAgICAgKi8NCisJCVdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICovDQorCSAgICAgICk7DQorDQordm9pZCBEZWVtcGhfMzJfYXNtKA0KKwkJV29yZDE2IHhfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQzMS4uMTYpICovDQorCQlXb3JkMTYgeF9sb1tdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDE1Li40KSAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgKHgxNikgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICovDQorCSAgICAgICk7DQorDQordm9pZCBDb252b2x2ZSgNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgICAgOiBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgMTIgYml0czogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKTsNCisNCit2b2lkIENvbnZvbHZlX2FzbSgNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgICAgOiBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgMTIgYml0czogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKTsNCisNCit2b2lkIFJlc2lkdSgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNwZWVjaCAodmFsdWVzIHhbLW0uLi0xXSBhcmUgbmVlZGVkICAgICAgICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IHJlc2lkdWFsIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCSk7DQorDQordm9pZCBSZXNpZHVfb3B0KA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3BlZWNoICh2YWx1ZXMgeFstbS4uLTFdIGFyZSBuZWVkZWQgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcmVzaWR1YWwgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJKTsNCisNCit2b2lkIFN5bl9maWx0KA0KKwlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovDQorCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBtZW1bXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXJpbmcuICAgKi8NCisJV29yZDE2IHVwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogMD1ubyB1cGRhdGUsIDE9dXBkYXRlIG9mIG1lbW9yeS4gICAgICAgICAqLw0KKwkpOw0KKw0KK3ZvaWQgU3luX2ZpbHRfYXNtKA0KKwlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovDQorCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyaW5nLiAgICovDQorCSk7DQorDQordm9pZCBTeW5fZmlsdF8zMigNCisJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovDQorCVdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykgICAgKi8NCisJV29yZDE2IFFuZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovDQorCVdvcmQxNiBzaWdfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgc2lnX2xvW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgbG93ICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovDQorCSk7DQorDQordm9pZCBTeW5fZmlsdF8zMl9hc20oDQorCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAqLw0KKwlXb3JkMTYgbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIgICAgICAgICAgICAgKi8NCisJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUW5ldzogZXhjaXRhdGlvbiAoZXhjW2ldID4+IFFuZXcpICAgICovDQorCVdvcmQxNiBRbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4YyBzY2FsaW5nID0gMChtaW4pIHRvIDgobWF4KSAqLw0KKwlXb3JkMTYgc2lnX2hpW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgaGlnaCAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHNpZ19sb1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGxvdyAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAqLw0KKwkpOw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgIHBpdGNoIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitXb3JkMTYgUGl0Y2hfb2woICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBvcGVuIGxvb3AgcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaWduYWwgdXNlZCB0byBjb21wdXRlIHRoZSBvcGVuIGxvb3AgcGl0Y2ggKi8NCisvKiBzaWduYWxbLXBpdF9tYXhdIHRvIHNpZ25hbFstMV0gc2hvdWxkIGJlIGtub3duICovDQorICAgICBXb3JkMTYgcGl0X21pbiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbWluaW11bSBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgcGl0X21heCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbWF4aW11bSBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgTF9mcmFtZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbGVuZ3RoIG9mIGZyYW1lIHRvIGNvbXB1dGUgcGl0Y2ggICAgICAgICAgICovDQorKTsNCisNCitXb3JkMTYgUGl0Y2hfbWVkX29sKCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBvcGVuIGxvb3AgcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB3c3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaWduYWwgdXNlZCB0byBjb21wdXRlIHRoZSBvcGVuIGxvb3AgcGl0Y2ggKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd3NwWy1waXRfbWF4XSB0byB3c3BbLTFdIHNob3VsZCBiZSBrbm93biAgICovDQorICAgICBDb2Rlcl9TdGF0ZSAqc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGdsb2JhbCBjb2RlYyBzdHJ1Y3R1cmUgKi8NCisgICAgIFdvcmQxNiBMX2ZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBsZW5ndGggb2YgZnJhbWUgdG8gY29tcHV0ZSBwaXRjaCAgICAgICAgICAgKi8NCispOw0KKw0KK1dvcmQxNiBNZWRfb2xhZyggICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgOiBtZWRpYW4gb2YgIDUgcHJldmlvdXMgb3Blbi1sb29wIGxhZ3MgICAgICAgKi8NCisgICAgIFdvcmQxNiBwcmV2X29sX2xhZywgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgIDogcHJldmlvdXMgb3Blbi1sb29wIGxhZyAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgb2xkX29sX2xhZ1s1XQ0KKyk7DQorDQordm9pZCBJbml0X0hwX3dzcChXb3JkMTYgbWVtW10pOw0KK3ZvaWQgc2NhbGVfbWVtX0hwX3dzcChXb3JkMTYgbWVtW10sIFdvcmQxNiBleHApOw0KK3ZvaWQgSHBfd3NwKA0KKyAgICAgV29yZDE2IHdzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiB3c3BbXSAgc2lnbmFsICAgICAgICovDQorICAgICBXb3JkMTYgaHBfd3NwW10sICAgICAgICAgICAgICAgICAgICAgIC8qIG8gICA6IGh5cGFzcyB3c3BbXSAgICAgICAgKi8NCisgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKyAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBmaWx0ZXIgbWVtb3J5IFs5XSAgICovDQorKTsNCisNCitXb3JkMTYgUGl0Y2hfZnI0KCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IHBpdGNoIHBlcmlvZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4Y2l0YXRpb24gYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHRhcmdldCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygc3ludGgvd2d0IGZpbHRlcnMgKi8NCisgICAgIFdvcmQxNiB0MF9taW4sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgaW4gdGhlIHNlYXJjaGVkIHJhbmdlLiAgKi8NCisgICAgIFdvcmQxNiB0MF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1heGltdW0gdmFsdWUgaW4gdGhlIHNlYXJjaGVkIHJhbmdlLiAgKi8NCisgICAgIFdvcmQxNiAqIHBpdF9mcmFjLCAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IGNob3NlbiBmcmFjdGlvbiAoMCwgMSwgMiBvciAzKS4gICAgICAgKi8NCisgICAgIFdvcmQxNiBpX3N1YmZyLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGluZGljYXRvciBmb3IgZmlyc3Qgc3ViZnJhbWUuICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB0MF9mcjIsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgZm9yIHJlc29sdXRpb24gMS8yICAgICAgKi8NCisgICAgIFdvcmQxNiB0MF9mcjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgZm9yIHJlc29sdXRpb24gMSAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExlbmd0aCBvZiBzdWJmcmFtZSAgICAgICAgICAgICAgICAgICAgKi8NCispOw0KK3ZvaWQgUHJlZF9sdDQoDQorICAgICBXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogZXhjaXRhdGlvbiBidWZmZXIgKi8NCisgICAgIFdvcmQxNiBUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLw0KKyAgICAgV29yZDE2IGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovDQorICAgICBXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc3ViZnJhbWUgc2l6ZSAgICAgKi8NCispOw0KKw0KK3ZvaWQgcHJlZF9sdDRfYXNtKA0KKyAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovDQorICAgICBXb3JkMTYgVDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaW50ZWdlciBwaXRjaCBsYWcgKi8NCisgICAgIFdvcmQxNiBmcmFjLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBvZiBsYWcgICAqLw0KKyAgICAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHN1YmZyYW1lIHNpemUgICAgICovDQorKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICBnYWluIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorV29yZDE2IEdfcGl0Y2goICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTQgOiBHYWluIG9mIHBpdGNoIGxhZyBzYXR1cmF0ZWQgdG8gMS4yICAgKi8NCisgICAgIFdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IFBpdGNoIHRhcmdldC4gICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHkxW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZmlsdGVyZWQgYWRhcHRpdmUgY29kZWJvb2suICAgICAgICAgICovDQorICAgICBXb3JkMTYgZ19jb2VmZltdLCAgICAgICAgICAgICAgICAgICAgIC8qIDogQ29ycmVsYXRpb25zIG5lZWQgZm9yIGdhaW4gcXVhbnRpemF0aW9uLiAqLw0KKyAgICAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiA6IExlbmd0aCBvZiBzdWJmcmFtZS4gICAgICAgICAgICAgICAgICAqLw0KKyk7DQordm9pZCBJbml0X1FfZ2FpbjIoDQorICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCAgOnN0YXRpYyBtZW1vcnkgKDIgd29yZHMpICAgICAgKi8NCispOw0KK1dvcmQxNiBRX2dhaW4yKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gaW5kZXggb2YgcXVhbnRpemF0aW9uLiAgICAgICAgKi8NCisgICAgIFdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFFfeG46VGFyZ2V0IHZlY3Rvci4gICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHkxW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUV94bjpBZGFwdGl2ZSBjb2RlYm9vay4gICAgICAgICAgICovDQorICAgICBXb3JkMTYgUV94biwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOnhuIGFuZCB5MSBmb3JtYXQgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB5MltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFE5ICA6RmlsdGVyZWQgaW5ub3ZhdGl2ZSB2ZWN0b3IuICAqLw0KKyAgICAgV29yZDE2IGNvZGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDpJbm5vdmF0aXZlIHZlY3Rvci4gICAgICAgICAgICovDQorICAgICBXb3JkMTYgZ19jb2VmZltdLCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOkNvcnJlbGF0aW9ucyA8eG4geTE+IDx5MSB5MT4gKi8NCisvKiBDb21wdXRlIGluIEdfcGl0Y2goKS4gICAgICAgICovDQorICAgICBXb3JkMTYgTF9zdWJmciwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOlN1YmZyYW1lIGxlbmdodC4gICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBuYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBiaXRzICg2IG9yIDcpICAgICAqLw0KKyAgICAgV29yZDE2ICogZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKVExNDpQaXRjaCBnYWluLiAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMzIgKiBnYWluX2NvZCwgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTYgOkNvZGUgZ2Fpbi4gICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBncF9jbGlwLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IEdwIENsaXBwaW5nIGZsYWcgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDpzdGF0aWMgbWVtb3J5ICgyIHdvcmRzKSAgICAgICovDQorKTsNCisNCit2b2lkIEluaXRfRF9nYWluMigNCisgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICA6c3RhdGljIG1lbW9yeSAoNCB3b3JkcykgICAgICAqLw0KKyk7DQordm9pZCBEX2dhaW4yKA0KKyAgICAgV29yZDE2IGluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDppbmRleCBvZiBxdWFudGl6YXRpb24uICAgICAgICovDQorICAgICBXb3JkMTYgbmJpdHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBudW1iZXIgb2YgYml0cyAoNiBvciA3KSAgICAgKi8NCisgICAgIFdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFE5ICA6SW5ub3ZhdGl2ZSB2ZWN0b3IuICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IExfc3ViZnIsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDpTdWJmcmFtZSBsZW5naHQuICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiBnYWluX3BpdCwgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTQgOlBpdGNoIGdhaW4uICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQzMiAqIGdhaW5fY29kLCAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNiA6Q29kZSBnYWluLiAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGJmaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDpiYWQgZnJhbWUgaW5kaWNhdG9yICAgICAgICAgICovDQorICAgICBXb3JkMTYgcHJldl9iZmksICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA6IFByZXZpb3VzIEJGIGluZGljYXRvciAgICAgICovDQorICAgICBXb3JkMTYgc3RhdGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA6IFN0YXRlIG9mIEJGSCAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgdW51c2FibGVfZnJhbWUsICAgICAgICAgICAgICAgIC8qIChpKSA6IFVGIGluZGljYXRvciAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgdmFkX2hpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgICAgIDpudW1iZXIgb2Ygbm9uLXNwZWVjaCBmcmFtZXMgICovDQorICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOnN0YXRpYyBtZW1vcnkgKDQgd29yZHMpICAgICAgKi8NCispOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgIGFjZWxwIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCit2b2lkIGNvcl9oX3goDQorICAgICBXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IHRhcmdldCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGRuW10gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgPDEyYml0IDogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAgICovDQorKTsNCit2b2lkIEFDRUxQXzJ0NjRfZngoDQorICAgICBXb3JkMTYgZG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgeFtdIGFuZCBIW10gICAgICAqLw0KKyAgICAgV29yZDE2IGNuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgPDEyYiA6IHJlc2lkdWFsIGFmdGVyIGxvbmcgdGVybSBwcmVkaWN0aW9uICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBIW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMjogaW1wdWxzZSByZXNwb25zZSBvZiB3ZWlnaHRlZCBzeW50aGVzaXMgZmlsdGVyICovDQorICAgICBXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGFsZ2VicmFpYyAoZml4ZWQpIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAqLw0KKyAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTkgOiBmaWx0ZXJlZCBmaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIDogaW5kZXggKDEyKTogNSsxKzUrMSA9IDExIGJpdHMuICAgICAgICAgICAgICAgICAgICAgKi8NCispOw0KKw0KK3ZvaWQgQUNFTFBfNHQ2NF9meCgNCisgICAgIFdvcmQxNiBkbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDwxMmIgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCB4W10gYW5kIEhbXSAgICAgICovDQorICAgICBXb3JkMTYgY25bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogcmVzaWR1YWwgYWZ0ZXIgbG9uZyB0ZXJtIHByZWRpY3Rpb24gICAgICAgICAqLw0KKyAgICAgV29yZDE2IEhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisgICAgIFdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFE5IDogYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgICovDQorICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGZpbHRlcmVkIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IG5iYml0cywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgOiAyMCwgMzYsIDQ0LCA1MiwgNjQsIDcyIG9yIDg4IGJpdHMgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBzZXJfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDogYml0IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgX2luZGV4W10gICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSA6IGluZGV4ICgyMCk6IDUrNSs1KzUgPSAyMCBiaXRzLiAgICAgICAgICAgICAgICAgICAqLw0KKwkJCQkJICAgLyogKG8pIDogaW5kZXggKDM2KTogOSs5KzkrOSA9IDM2IGJpdHMuICAgICAgICAgICAgICAgICAgICovDQorCQkJCQkgICAvKiAobykgOiBpbmRleCAoNDQpOiAxMys5KzEzKzkgPSA0NCBiaXRzLiAgICAgICAgICAgICAgICAgKi8NCisJCQkJCSAgIC8qIChvKSA6IGluZGV4ICg1Mik6IDEzKzEzKzEzKzEzID0gNTIgYml0cy4gICAgICAgICAgICAgICAqLw0KKwkJCQkJICAgLyogKG8pIDogaW5kZXggKDY0KTogMisyKzIrMisxNCsxNCsxNCsxNCA9IDY0IGJpdHMuICAgICAgICovDQorCQkJCQkgICAvKiAobykgOiBpbmRleCAoNzIpOiAxMCsyKzEwKzIrMTArMTQrMTArMTQgPSA3MiBiaXRzLiAgICAgKi8NCisJCQkJCSAgIC8qIChvKSA6IGluZGV4ICg4OCk6IDExKzExKzExKzExKzExKzExKzExKzExID0gODggYml0cy4gICAqLw0KKyk7DQorDQordm9pZCBQaXRfc2hycCgNCisgICAgIFdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBpbXB1bHNlIHJlc3BvbnNlIChvciBhbGdlYnJhaWMgY29kZSkgKi8NCisgICAgIFdvcmQxNiBwaXRfbGFnLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBzaGFycCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwaXRjaCBzaGFycGVuaW5nIGZhY3RvciAoUTE1KSAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzdWJmcmFtZSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgKi8NCispOw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCit2b2lkIENvcHkoDQorICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogaW5wdXQgdmVjdG9yICAgKi8NCisgICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgOiBvdXRwdXQgdmVjdG9yICAqLw0KKyAgICAgV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHZlY3RvciBsZW5ndGggICovDQorKTsNCit2b2lkIFNldF96ZXJvKA0KKyAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiB2ZWN0b3IgdG8gY2xlYXIgICAgICovDQorICAgICBXb3JkMTYgTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IGxlbmd0aCBvZiB2ZWN0b3IgICAgKi8NCispOw0KK3ZvaWQgVXBkdF90YXIoDQorICAgICBXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBvbGQgdGFyZ2V0IChmb3IgcGl0Y2ggc2VhcmNoKSAgICAgKi8NCisgICAgIFdvcmQxNiAqIHgyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEwICA6IG5ldyB0YXJnZXQgKGZvciBjb2RlYm9vayBzZWFyY2gpICAqLw0KKyAgICAgV29yZDE2ICogeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogZmlsdGVyZWQgYWRhcHRpdmUgY29kZWJvb2sgdmVjdG9yICovDQorICAgICBXb3JkMTYgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTQgOiBhZGFwdGl2ZSBjb2RlYm9vayBnYWluICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHN1YmZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAqLw0KKyk7DQorV29yZDE2IHZvaWNlX2ZhY3RvciggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBmYWN0b3IgKC0xPXVudm9pY2VkIHRvIDE9dm9pY2VkKSAqLw0KKyAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUV9leGM6IHBpdGNoIGV4Y2l0YXRpb24gICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBRX2V4YywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4YyBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTQgOiBnYWluIG9mIHBpdGNoICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGNvZGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDogRml4ZWQgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgKi8NCisgICAgIFdvcmQxNiBnYWluX2NvZGUsICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IGdhaW4gb2YgY29kZSAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzdWJmcmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAqLw0KKyk7DQordm9pZCBTY2FsZV9zaWcoDQorICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogc2lnbmFsIHRvIHNjYWxlICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzaXplIG9mIHhbXSAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IGV4cG9uZW50OiB4ID0gcm91bmQoeCA8PCBleHApICovDQorKTsNCisNCit2b2lkIFNjYWxlX3NpZ19vcHQoDQorICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogc2lnbmFsIHRvIHNjYWxlICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzaXplIG9mIHhbXSAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IGV4cG9uZW50OiB4ID0gcm91bmQoeCA8PCBleHApICovDQorKTsNCisNCitXb3JkMTYgUmFuZG9tKFdvcmQxNiAqIHNlZWQpOw0KKw0KK3ZvaWQgSW5pdF9ncF9jbGlwKA0KKyAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgOiBtZW1vcnkgb2YgZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCispOw0KK1dvcmQxNiBHcF9jbGlwKA0KKyAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IG1lbW9yeSBvZiBnYWluIG9mIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKyk7DQordm9pZCBHcF9jbGlwX3Rlc3RfaXNmKA0KKyAgICAgV29yZDE2IGlzZltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IGlzZiB2YWx1ZXMgKGluIGZyZXF1ZW5jeSBkb21haW4pICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IG1lbW9yeSBvZiBnYWluIG9mIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKyk7DQordm9pZCBHcF9jbGlwX3Rlc3RfZ2Fpbl9waXQoDQorICAgICBXb3JkMTYgZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZ2FpbiBvZiBxdWFudGl6ZWQgcGl0Y2ggICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorKTsNCisNCisNCisjZW5kaWYgICAvL19fQUNFTFBfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iYXNpY19vcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iYXNpY19vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmY4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Jhc2ljX29wLmgKQEAgLTAsMCArMSwxMDk0IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKyNpZm5kZWYgX19CQVNJQ19PUF9IX18NCisjZGVmaW5lIF9fQkFTSUNfT1BfSF9fDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorDQorI2RlZmluZSBNQVhfMzIgKFdvcmQzMikweDdmZmZmZmZmTA0KKyNkZWZpbmUgTUlOXzMyIChXb3JkMzIpMHg4MDAwMDAwMEwNCisNCisjZGVmaW5lIE1BWF8xNiAoV29yZDE2KSszMjc2NwkvKiAweDdmZmYgKi8NCisjZGVmaW5lIE1JTl8xNiAoV29yZDE2KS0zMjc2OAkvKiAweDgwMDAgKi8NCisNCisNCisjaWZkZWYgTElOVVgNCisjZGVmaW5lICBzdGF0aWNfdm8gIHN0YXRpYyBfX2lubGluZV9fDQorI2Vsc2UNCisjZGVmaW5lICBzdGF0aWNfdm8gIHN0YXRpYyBfX2lubGluZQ0KKyNlbmRpZiANCisNCisjZGVmaW5lIHNhdHVyYXRlKExfdmFyMSkgKCgoTF92YXIxKSA+IDBYMDAwMDdmZmZMKSA/IChNQVhfMTYpOiAoKChMX3ZhcjEpIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpID8gKE1JTl8xNik6ICgoTF92YXIxKSAmIDB4ZmZmZikpKQ0KKw0KKyNkZWZpbmUgYWJzX3MoeCkgICAgICAgKChXb3JkMTYpKCgoeCkgIT0gTUlOXzE2KSA/ICgoKHgpID49IDApID8gKHgpIDogKC0oeCkpKSA6IE1BWF8xNikpICAvKiBTaG9ydCBhYnMsICAgICAgICAgICAxICAgKi8NCisjZGVmaW5lIExfZGVwb3NpdF9oKHgpICgoKFdvcmQzMikoeCkpIDw8IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgYml0IHZhcjEgLT4gTVNCLCAgICAgMiAqLw0KKyNkZWZpbmUgTF9kZXBvc2l0X2woeCkgKChXb3JkMzIpKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBiaXQgdmFyMSAtPiBMU0IsICAgICAyICovDQorI2RlZmluZSBMX2Ficyh4KSAoKCh4KSAhPSBNSU5fMzIpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzMyKSAgICAgICAgICAgICAgICAgIC8qIExvbmcgYWJzLCAgICAgICAgICAgICAgMyovDQorI2RlZmluZSBuZWdhdGUodmFyMSkgKChXb3JkMTYpKCgodmFyMSkgPT0gTUlOXzE2KSA/IE1BWF8xNiA6ICgtKHZhcjEpKSkpICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IG5lZ2F0ZSwgICAgICAgIDEqLw0KKyNkZWZpbmUgTF9uZWdhdGUoTF92YXIxKSAoKChMX3ZhcjEpID09IChNSU5fMzIpKSA/IChNQVhfMzIpIDogKC0oTF92YXIxKSkpICAgICAgICAgICAgICAgICAvKiBMb25nIG5lZ2F0ZSwgICAgIDIqLw0KKw0KKw0KKyNkZWZpbmUgZXh0cmFjdF9oKGEpCQkJKChXb3JkMTYpKGEgPj4gMTYpKQ0KKyNkZWZpbmUgZXh0cmFjdF9sKHgpICAgICAgICAgICAgCShXb3JkMTYpKCh4KSkNCisjZGVmaW5lIGFkZDEoYSxiKQkJCShhICsgYikNCisjZGVmaW5lIHZvX0xfbXN1KGEsYixjKQkJCSggYSAtICgoIGIgKiBjICkgPDwgMSkgKQ0KKyNkZWZpbmUgdm9fbXVsdDMyKGEsIGIpICAgICAgICAgKChhKSAqIChiKSkNCisjZGVmaW5lIHZvX211bHQoYSxiKQkJCSgoIGEgKiBiICkgPj4gMTUgKQ0KKyNkZWZpbmUJdm9fTF9tdWx0KGEsYikJICAgIAkJKCgoYSkgKiAoYikpIDw8IDEpDQorI2RlZmluZSB2b19zaHJfcih2YXIxLCB2YXIyKSAgIAkJKCh2YXIxKygoV29yZDE2KSgxTDw8KHZhcjItMSkpKSk+PnZhcjIpDQorI2RlZmluZSB2b19zdWIoYSxiKQkJCShhIC0gYikNCisjZGVmaW5lIHZvX0xfZGVwb3NpdF9oKGEpCQkoKFdvcmQzMikoKGEpIDw8IDE2KSkNCisjZGVmaW5lIHZvX3JvdW5kKGEpCQkJKChhICsgMHgwMDAwODAwMCkgPj4gMTYpDQorI2RlZmluZSB2b19leHRyYWN0X2woYSkJCQkoKFdvcmQxNikoYSkpDQorI2RlZmluZSB2b19MX2FkZChhLGIpCQkJKGEgKyBiKQ0KKyNkZWZpbmUgdm9fTF9zdWIoYSxiKQkJCShhIC0gYikNCisjZGVmaW5lIHZvX211bHRfcihhLGIpCQkJKCgoIGEgKiBiICkgKyAweDQwMDAgKSA+PiAxNSApDQorI2RlZmluZSB2b19uZWdhdGUoYSkJCSAgICAgICAgKC1hKQ0KKyNkZWZpbmUgdm9fTF9zaHJfcihMX3ZhcjEsIHZhcjIpICAgICAgICAoKExfdmFyMSsoKFdvcmQzMikoMUw8PCh2YXIyLTEpKSkpPj52YXIyKQ0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHJvdG90eXBlcyBmb3IgYmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCitzdGF0aWNfdm8gV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsJCQkJLyogU2hvcnQgYWRkLDEgKi8NCitzdGF0aWNfdm8gV29yZDE2IHN1YiAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsJCQkJLyogU2hvcnQgc3ViLDEgKi8NCitzdGF0aWNfdm8gV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHNoaWZ0IGxlZnQsICAgIDEgICAqLw0KK3N0YXRpY192byBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgc2hpZnQgcmlnaHQsICAgMSAgICovDQorc3RhdGljX3ZvIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBtdWx0LCAgICAgICAgICAxICAgKi8NCitzdGF0aWNfdm8gV29yZDMyIExfbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgbXVsdCwgICAgICAgICAgIDEgICAqLw0KK3N0YXRpY192byBXb3JkMTYgdm9yb3VuZCAoV29yZDMyIExfdmFyMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmQsICAgICAgICAgICAgICAgMSAgICovDQorc3RhdGljX3ZvIFdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsgICAgICAgICAgICAJLyogTWFjLCAgMSAgKi8NCitzdGF0aWNfdm8gV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgIAkJLyogTXN1LCAgMSAgKi8NCitzdGF0aWNfdm8gV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsgICAJCSAJLyogTG9uZyBhZGQsICAgICAgICAyICovDQorc3RhdGljX3ZvIFdvcmQzMiBMX3N1YiAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7ICAgCQkJLyogTG9uZyBzdWIsICAgICAgICAyICovDQorc3RhdGljX3ZvIFdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7ICAgICAgCQkgCS8qIE11bHQgd2l0aCByb3VuZCwgMiAqLw0KK3N0YXRpY192byBXb3JkMzIgTF9zaGwyKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsgICAgICAgICAgICAgCQkvKiB2YXIyID4gMCovDQorc3RhdGljX3ZvIFdvcmQzMiBMX3NobCAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOyAgICAJIAkgCS8qIExvbmcgc2hpZnQgbGVmdCwgMiAqLw0KK3N0YXRpY192byBXb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsgICAgCSAJIAkvKiBMb25nIHNoaWZ0IHJpZ2h0LCAyKi8NCitzdGF0aWNfdm8gV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsgCQkJCS8qIExvbmcgc2hpZnQgcmlnaHQgd2l0aCByb3VuZCwgIDMgICAqLw0KK3N0YXRpY192byBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSk7ICAgICAgICAgICAgIAkJCQkvKiBTaG9ydCBub3JtLCAgICAgICAgICAgMTUgICovDQorc3RhdGljX3ZvIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsgCQkJCS8qIFNob3J0IGRpdmlzaW9uLCAgICAgICAxOCAgKi8NCitzdGF0aWNfdm8gV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSk7ICAgICAgICAgICAJCQkJLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLyAgIA0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIFBlcmZvcm1zIHRoZSBhZGRpdGlvbiAodmFyMSt2YXIyKSB3aXRoIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247fA0KK3wgICAgdGhlIDE2IGJpdCByZXN1bHQgaXMgc2V0IGF0ICszMjc2NyB3aGVuIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMzI3NjggICB8DQorfCAgICB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCitzdGF0aWNfdm8gV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDE2IHZhcl9vdXQ7DQorCVdvcmQzMiBMX3N1bTsNCisJTF9zdW0gPSAoV29yZDMyKSB2YXIxICsgdmFyMjsNCisJdmFyX291dCA9IHNhdHVyYXRlIChMX3N1bSk7DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IHN1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgUGVyZm9ybXMgdGhlIHN1YnRyYWN0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dS0gICB8DQorfCAgICByYXRpb247IHRoZSAxNiBiaXQgcmVzdWx0IGlzIHNldCBhdCArMzI3Njcgd2hlbiBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgIHwNCit8ICAgIC0zMjc2OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgc3ViIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJV29yZDMyIExfZGlmZjsNCisJTF9kaWZmID0gKFdvcmQzMikgdmFyMSAtIHZhcjI7DQorCXZhcl9vdXQgPSBzYXR1cmF0ZSAoTF9kaWZmKTsNCisJcmV0dXJuICh2YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogc2hsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAxNiBiaXQgaW5wdXQgdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLlplcm8gZmlsbHwNCit8ICAgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0ICAgfA0KK3wgICB2YXIxIHJpZ2h0IGJ5IC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gY2FzZSBvZiB8DQorfCAgIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDE2IHZhcl9vdXQ7DQorCVdvcmQzMiByZXN1bHQ7DQorCWlmICh2YXIyIDwgMCkNCisJew0KKwkJaWYgKHZhcjIgPCAtMTYpDQorCQkJdmFyMiA9IC0xNjsNCisJCXZhcl9vdXQgPSB2YXIxID4+ICgoV29yZDE2KS12YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOw0KKwkJaWYgKCh2YXIyID4gMTUgJiYgdmFyMSAhPSAwKSB8fCAocmVzdWx0ICE9IChXb3JkMzIpICgoV29yZDE2KSByZXN1bHQpKSkNCisJCXsNCisJCQl2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPiAwKSA/IE1BWF8xNiA6IE1JTl8xNik7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJdmFyX291dCA9IGV4dHJhY3RfbCAocmVzdWx0KTsNCisJCX0NCisJfQ0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIHJpZ2h0IHZhcjIgcG9zaXRpb25zIHdpdGggICAgfA0KK3wgICBzaWduIGV4dGVuc2lvbi4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgdmFyMSBsZWZ0IGJ5ICB8DQorfCAgIC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gY2FzZSBvZiB1bmRlcmZsb3dzIG9yIHwNCit8ICAgb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJaWYgKHZhcjIgPCAwKQ0KKwl7DQorCQlpZiAodmFyMiA8IC0xNikNCisJCQl2YXIyID0gLTE2Ow0KKwkJdmFyX291dCA9IHNobCh2YXIxLCAoV29yZDE2KS12YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWlmICh2YXIyID49IDE1KQ0KKwkJew0KKwkJCXZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA8IDApID8gLTEgOiAwKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpZiAodmFyMSA8IDApDQorCQkJew0KKwkJCQl2YXJfb3V0ID0gKFdvcmQxNikofigofnZhcjEpID4+IHZhcjIpKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJdmFyX291dCA9IChXb3JkMTYpKHZhcjEgPj4gdmFyMik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IG11bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgUGVyZm9ybXMgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHZhcjEgYnkgdmFyMiBhbmQgZ2l2ZXMgYSAxNiBiaXQgcmVzdWx0ICB8DQorfCAgICB3aGljaCBpcyBzY2FsZWQgaS5lLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIG11bHQodmFyMSx2YXIyKSA9IGV4dHJhY3RfbChMX3NocigodmFyMSB0aW1lcyB2YXIyKSwxNSkpIGFuZCAgfA0KK3wgICAgICAgICAgICAgbXVsdCgtMzI3NjgsLTMyNzY4KSA9IDMyNzY3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJV29yZDMyIExfcHJvZHVjdDsNCisJTF9wcm9kdWN0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsNCisJTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsNCisJaWYgKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKQ0KKwkJTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7DQorCXZhcl9vdXQgPSBzYXR1cmF0ZSAoTF9wcm9kdWN0KTsNCisJcmV0dXJuICh2YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9tdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIExfbXVsdCBpcyB0aGUgMzIgYml0IHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSB0aW1lcyB2YXIyICAgIHwNCit8ICAgd2l0aCBvbmUgc2hpZnQgbGVmdCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgIExfbXVsdCh2YXIxLHZhcjIpID0gTF9zaGwoKHZhcjEgdGltZXMgdmFyMiksMSkgYW5kICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICBMX211bHQoLTMyNzY4LC0zMjc2OCkgPSAyMTQ3NDgzNjQ3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9tdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0Ow0KKwlMX3Zhcl9vdXQgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOw0KKwlpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQ0KKwl7DQorCQlMX3Zhcl9vdXQgKj0gMjsNCisJfQ0KKwllbHNlDQorCXsNCisJCUxfdmFyX291dCA9IE1BWF8zMjsNCisJfQ0KKwlyZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IHJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSb3VuZCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgMzIgYml0IGlucHV0IG51bWJlciBpbnRvIHRoZSBNUyAxNiBiaXRzICB8DQorfCAgIHdpdGggc2F0dXJhdGlvbi4gU2hpZnQgdGhlIHJlc3VsdGluZyBiaXRzIHJpZ2h0IGJ5IDE2IGFuZCByZXR1cm4gdGhlIDE2IHwNCit8ICAgYml0IG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICByb3VuZChMX3ZhcjEpID0gZXh0cmFjdF9oKExfYWRkKExfdmFyMSwzMjc2OCkpICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgdm9yb3VuZCAoV29yZDMyIExfdmFyMSkNCit7DQorCVdvcmQxNiB2YXJfb3V0Ow0KKwlXb3JkMzIgTF9yb3VuZGVkOw0KKwlMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7DQorCXZhcl9vdXQgPSBleHRyYWN0X2ggKExfcm91bmRlZCk7DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IExfbWFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBBZGQgdGhlIDMyIGJpdCAgICB8DQorfCAgIHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLCByZXR1cm4gYSAzMiBiaXQgcmVzdWx0OiAgICAgICAgICAgICAgIHwNCit8ICAgICAgICBMX21hYyhMX3ZhcjMsdmFyMSx2YXIyKSA9IExfYWRkKExfdmFyMyxMX211bHQodmFyMSx2YXIyKSkuICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQ7DQorCVdvcmQzMiBMX3Byb2R1Y3Q7DQorCUxfcHJvZHVjdCA9ICgodmFyMSAqIHZhcjIpIDw8IDEpOw0KKwlMX3Zhcl9vdXQgPSBMX2FkZCAoTF92YXIzLCBMX3Byb2R1Y3QpOw0KKwlyZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IExfbXN1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBTdWJ0cmFjdCB0aGUgMzIgICB8DQorfCAgIGJpdCByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbiwgcmV0dXJuIGEgMzIgYml0IHJlc3VsdDogICAgICAgICAgIHwNCit8ICAgICAgICBMX21zdShMX3ZhcjMsdmFyMSx2YXIyKSA9IExfc3ViKExfdmFyMyxMX211bHQodmFyMSx2YXIyKSkuICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQ7DQorCVdvcmQzMiBMX3Byb2R1Y3Q7DQorCUxfcHJvZHVjdCA9ICh2YXIxICogdmFyMik8PDE7DQorCUxfdmFyX291dCA9IExfc3ViIChMX3ZhcjMsIExfcHJvZHVjdCk7DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDMyIGJpdHMgYWRkaXRpb24gb2YgdGhlIHR3byAzMiBiaXRzIHZhcmlhYmxlcyAoTF92YXIxK0xfdmFyMikgd2l0aCAgICAgIHwNCit8ICAgb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjsgdGhlIHJlc3VsdCBpcyBzZXQgYXQgKzIxNDc0ODM2NDcgd2hlbiAgfA0KK3wgICBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgLTIxNDc0ODM2NDggd2hlbiB1bmRlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIyICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQ0KK3sNCisJV29yZDMyIExfdmFyX291dDsNCisJTF92YXJfb3V0ID0gTF92YXIxICsgTF92YXIyOw0KKwlpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSA9PSAwKQ0KKwl7DQorCQlpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpDQorCQl7DQorCQkJTF92YXJfb3V0ID0gKExfdmFyMSA8IDApID8gTUlOXzMyIDogTUFYXzMyOw0KKwkJfQ0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9zdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDMyIGJpdHMgc3VidHJhY3Rpb24gb2YgdGhlIHR3byAzMiBiaXRzIHZhcmlhYmxlcyAoTF92YXIxLUxfdmFyMikgd2l0aCAgIHwNCit8ICAgb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjsgdGhlIHJlc3VsdCBpcyBzZXQgYXQgKzIxNDc0ODM2NDcgd2hlbiAgfA0KK3wgICBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgLTIxNDc0ODM2NDggd2hlbiB1bmRlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIyICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDMyIExfc3ViIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQ0KK3sNCisJV29yZDMyIExfdmFyX291dDsNCisJTF92YXJfb3V0ID0gTF92YXIxIC0gTF92YXIyOw0KKwlpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSAhPSAwKQ0KKwl7DQorCQlpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpDQorCQl7DQorCQkJTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IE1JTl8zMiA6IE1BWF8zMjsNCisJCX0NCisJfQ0KKwlyZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IG11bHRfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBTYW1lIGFzIG11bHQgd2l0aCByb3VuZGluZywgaS5lLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgbXVsdF9yKHZhcjEsdmFyMikgPSBleHRyYWN0X2woTF9zaHIoKCh2YXIxICogdmFyMikgKyAxNjM4NCksMTUpKSBhbmQgIHwNCit8ICAgICBtdWx0X3IoLTMyNzY4LC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgbXVsdF9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJV29yZDMyIExfcHJvZHVjdF9hcnI7DQorCUxfcHJvZHVjdF9hcnIgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovDQorCUxfcHJvZHVjdF9hcnIgKz0gKFdvcmQzMikgMHgwMDAwNDAwMEw7ICAgICAgLyogcm91bmQgKi8NCisJTF9wcm9kdWN0X2FyciAmPSAoV29yZDMyKSAweGZmZmY4MDAwTDsNCisJTF9wcm9kdWN0X2FyciA+Pj0gMTU7ICAgICAgIC8qIHNoaWZ0ICovDQorCWlmIChMX3Byb2R1Y3RfYXJyICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpICAgLyogc2lnbiBleHRlbmQgd2hlbiBuZWNlc3NhcnkgKi8NCisJew0KKwkJTF9wcm9kdWN0X2FyciB8PSAoV29yZDMyKSAweGZmZmYwMDAwTDsNCisJfQ0KKwl2YXJfb3V0ID0gc2F0dXJhdGUgKExfcHJvZHVjdF9hcnIpOw0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3NobCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDMyIGJpdCBpbnB1dCBMX3ZhcjEgbGVmdCB2YXIyIHBvc2l0aW9ucy4gWmVybyAgfA0KK3wgICBmaWxsIHRoZSB2YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSAgICB8DQorfCAgIHNoaWZ0IExfdmFyMSByaWdodCBieSAtdmFyMiB3aXRoIHNpZ24gZXh0ZW5zaW9uLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIHwNCit8ICAgY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQgPSAwTDsNCisJaWYgKHZhcjIgPD0gMCkNCisJew0KKwkJaWYgKHZhcjIgPCAtMzIpDQorCQkJdmFyMiA9IC0zMjsNCisJCUxfdmFyX291dCA9IChMX3ZhcjEgPj4gKFdvcmQxNiktdmFyMik7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlmb3IgKDsgdmFyMiA+IDA7IHZhcjItLSkNCisJCXsNCisJCQlpZiAoTF92YXIxID4gKFdvcmQzMikgMFgzZmZmZmZmZkwpDQorCQkJew0KKwkJCQlMX3Zhcl9vdXQgPSBNQVhfMzI7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhjMDAwMDAwMEwpDQorCQkJCXsNCisJCQkJCS8vT3ZlcmZsb3cgPSAxOw0KKwkJCQkJTF92YXJfb3V0ID0gTUlOXzMyOw0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQl9DQorCQkJTF92YXIxICo9IDI7DQorCQkJTF92YXJfb3V0ID0gTF92YXIxOw0KKwkJfQ0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX3NobDIoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0ID0gMEw7DQorDQorCWZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQ0KKwl7DQorCQlpZiAoTF92YXIxID4gKFdvcmQzMikgMFgzZmZmZmZmZkwpDQorCQl7DQorCQkJTF92YXJfb3V0ID0gTUFYXzMyOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkNCisJCQl7DQorCQkJCUxfdmFyX291dCA9IE1JTl8zMjsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwkJTF92YXIxIDw8PTEgOw0KKwkJTF92YXJfb3V0ID0gTF92YXIxOw0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9zaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAzMiBiaXQgaW5wdXQgTF92YXIxIHJpZ2h0IHZhcjIgcG9zaXRpb25zIHdpdGggIHwNCit8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IExfdmFyMSBsZWZ0ICAgfA0KK3wgICBieSAtdmFyMiBhbmQgemVybyBmaWxsIHRoZSAtdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gU2F0dXJhdGUgdGhlIHJlc3VsdCB8DQorfCAgIGluIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0Ow0KKwlpZiAodmFyMiA8IDApDQorCXsNCisJCWlmICh2YXIyIDwgLTMyKQ0KKwkJCXZhcjIgPSAtMzI7DQorCQlMX3Zhcl9vdXQgPSBMX3NobDIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWlmICh2YXIyID49IDMxKQ0KKwkJew0KKwkJCUxfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyAtMSA6IDA7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaWYgKExfdmFyMSA8IDApDQorCQkJew0KKwkJCQlMX3Zhcl9vdXQgPSB+KCh+TF92YXIxKSA+PiB2YXIyKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJTF92YXJfb3V0ID0gTF92YXIxID4+IHZhcjI7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9zaHJfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFNhbWUgYXMgTF9zaHIoTF92YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluICAgIHwNCit8ICAgY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgLSBJZiB2YXIyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICBpZiAoTF9zdWIoTF9zaGwoTF9zaHIoTF92YXIxLHZhcjIpLDEpLExfc2hyKExfdmFyMSxzdWIodmFyMiwxKSkpKXwNCit8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9zaHIoTF92YXIxLHZhcjIpICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICBMX3Nocl9yKExfdmFyMSx2YXIyKSA9IExfYWRkKExfc2hyKExfdmFyMSx2YXIyKSwxKSAgICB8DQorfCAgICAtIElmIHZhcjIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikuICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9zaHJfciAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0Ow0KKwlpZiAodmFyMiA+IDMxKQ0KKwl7DQorCQlMX3Zhcl9vdXQgPSAwOw0KKwl9DQorCWVsc2UNCisJew0KKwkJTF92YXJfb3V0ID0gTF9zaHIgKExfdmFyMSwgdmFyMik7DQorCQlpZiAodmFyMiA+IDApDQorCQl7DQorCQkJaWYgKChMX3ZhcjEgJiAoKFdvcmQzMikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkNCisJCQl7DQorCQkJCUxfdmFyX291dCsrOw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IG5vcm1fcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQcm9kdWNlcyB0aGUgbnVtYmVyIG9mIGxlZnQgc2hpZnQgbmVlZGVkIHRvIG5vcm1hbGl6ZSB0aGUgMTYgYml0IHZhcmlhLSB8DQorfCAgIGJsZSB2YXIxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSBvZiAxNjM4NCBhbmQgIHwNCit8ICAgbWF4aW11bSBvZiAzMjc2NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSAgfA0KK3wgICBvZiAtMzI3NjggYW5kIG1heGltdW0gb2YgLTE2Mzg0OyBpbiBvcmRlciB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgdGhlICB8DQorfCAgIGZvbGxvd2luZyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICBub3JtX3ZhcjEgPSBzaGwodmFyMSxub3JtX3ModmFyMSkpLiAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgMDAwZi4gICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpDQorew0KKwlXb3JkMTYgdmFyX291dCA9IDA7DQorCWlmICh2YXIxID09IDApDQorCXsNCisJCXZhcl9vdXQgPSAwOw0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYgKHZhcjEgPT0gLTEpDQorCQl7DQorCQkJdmFyX291dCA9IDE1Ow0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmICh2YXIxIDwgMCkNCisJCQl7DQorCQkJCXZhcjEgPSAoV29yZDE2KX52YXIxOw0KKwkJCX0NCisJCQlmb3IgKHZhcl9vdXQgPSAwOyB2YXIxIDwgMHg0MDAwOyB2YXJfb3V0KyspDQorCQkJew0KKwkJCQl2YXIxIDw8PSAxOw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBkaXZfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHJvZHVjZXMgYSByZXN1bHQgd2hpY2ggaXMgdGhlIGZyYWN0aW9uYWwgaW50ZWdlciBkaXZpc2lvbiBvZiB2YXIxICBieSAgfA0KK3wgICB2YXIyOyB2YXIxIGFuZCB2YXIyIG11c3QgYmUgcG9zaXRpdmUgYW5kIHZhcjIgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsICB8DQorfCAgIHRvIHZhcjE7IHRoZSByZXN1bHQgaXMgcG9zaXRpdmUgKGxlYWRpbmcgYml0IGVxdWFsIHRvIDApIGFuZCB0cnVuY2F0ZWQgIHwNCit8ICAgdG8gMTYgYml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJZiB2YXIxID0gdmFyMiB0aGVuIGRpdih2YXIxLHZhcjIpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyMSA8PSB2YXIyIGFuZCB2YXIyICE9IDAuICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiB2YXIxIDw9IHZhcjIgPD0gMHgwMDAwIDdmZmYgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIEl0J3MgYSBRMTUgdmFsdWUgKHBvaW50IGJldHdlZW4gYjE1IGFuZCBiMTQpLiAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dCA9IDA7DQorCVdvcmQxNiBpdGVyYXRpb247DQorCVdvcmQzMiBMX251bTsNCisJV29yZDMyIExfZGVub207DQorCWlmICgodmFyMSA8IDApIHx8ICh2YXIyIDwgMCkpDQorCXsNCisJCXZhcl9vdXQgPSBNQVhfMTY7DQorCQlyZXR1cm4gdmFyX291dDsNCisJfQ0KKwlpZiAodmFyMiA9PSAwKQ0KKwl7DQorCQl2YXJfb3V0ID0gTUFYXzE2Ow0KKwkJcmV0dXJuIHZhcl9vdXQ7DQorCX0NCisJaWYgKHZhcjEgPT0gMCkNCisJew0KKwkJdmFyX291dCA9IDA7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZiAodmFyMSA9PSB2YXIyKQ0KKwkJew0KKwkJCXZhcl9vdXQgPSBNQVhfMTY7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJTF9udW0gPSBMX2RlcG9zaXRfbCAodmFyMSk7DQorCQkJTF9kZW5vbSA9IExfZGVwb3NpdF9sKHZhcjIpOw0KKwkJCWZvciAoaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgMTU7IGl0ZXJhdGlvbisrKQ0KKwkJCXsNCisJCQkJdmFyX291dCA8PD0gMTsNCisJCQkJTF9udW0gPDw9IDE7DQorCQkJCWlmIChMX251bSA+PSBMX2Rlbm9tKQ0KKwkJCQl7DQorCQkJCQlMX251bSAtPSBMX2Rlbm9tOyAgICAgIA0KKwkJCQkJdmFyX291dCArPSAxOyAgICAgICAgICANCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0cyBuZWVkZWQgdG8gbm9ybWFsaXplIHRoZSAzMiBiaXQgdmFyaWEtfA0KK3wgICBibGUgTF92YXIxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSBvZiAgICAgICAgICB8DQorfCAgIDEwNzM3NDE4MjQgYW5kIG1heGltdW0gb2YgMjE0NzQ4MzY0NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGluLXwNCit8ICAgdGVydmFsIHdpdGggbWluaW11bSBvZiAtMjE0NzQ4MzY0OCBhbmQgbWF4aW11bSBvZiAtMTA3Mzc0MTgyNDsgaW4gb3JkZXIgfA0KK3wgICB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIDogICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICBub3JtX0xfdmFyMSA9IExfc2hsKExfdmFyMSxub3JtX2woTF92YXIxKSkuICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMWYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpDQorew0KKwlXb3JkMTYgdmFyX291dCA9IDA7DQorCWlmIChMX3ZhcjEgIT0gMCkNCisJew0KKwkJdmFyX291dCA9IDMxOw0KKwkJaWYgKExfdmFyMSAhPSAoV29yZDMyKSAweGZmZmZmZmZmTCkNCisJCXsNCisJCQlMX3ZhcjEgXj0gKExfdmFyMSA+PjMxKTsNCisJCQlmb3IgKHZhcl9vdXQgPSAwOyBMX3ZhcjEgPCAoV29yZDMyKSAweDQwMDAwMDAwTDsgdmFyX291dCsrKQ0KKwkJCXsNCisJCQkJTF92YXIxIDw8PSAxOw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisjZW5kaWYgLy9fX0JBU0lDX09QX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxNDZkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYml0cy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqICAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICAgICAgTnVtYmVyIG9mIGJpdHMgZm9yIGRpZmZlcmVudCBtb2RlcwkJCSAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX0JJVFNfSF9fDQorI2RlZmluZSBfX0JJVFNfSF9fDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKyNpbmNsdWRlICJjb2RfbWFpbi5oIg0KKw0KKyNkZWZpbmUgTkJCSVRTXzdrICAgICAxMzIgICAgICAgICAgICAgICAgICAvKiA2LjYwayAgKi8NCisjZGVmaW5lIE5CQklUU185ayAgICAgMTc3ICAgICAgICAgICAgICAgICAgLyogOC44NWsgICovDQorI2RlZmluZSBOQkJJVFNfMTJrICAgIDI1MyAgICAgICAgICAgICAgICAgIC8qIDEyLjY1ayAqLw0KKyNkZWZpbmUgTkJCSVRTXzE0ayAgICAyODUgICAgICAgICAgICAgICAgICAvKiAxNC4yNWsgKi8NCisjZGVmaW5lIE5CQklUU18xNmsgICAgMzE3ICAgICAgICAgICAgICAgICAgLyogMTUuODVrICovDQorI2RlZmluZSBOQkJJVFNfMThrICAgIDM2NSAgICAgICAgICAgICAgICAgIC8qIDE4LjI1ayAqLw0KKyNkZWZpbmUgTkJCSVRTXzIwayAgICAzOTcgICAgICAgICAgICAgICAgICAvKiAxOS44NWsgKi8NCisjZGVmaW5lIE5CQklUU18yM2sgICAgNDYxICAgICAgICAgICAgICAgICAgLyogMjMuMDVrICovDQorI2RlZmluZSBOQkJJVFNfMjRrICAgIDQ3NyAgICAgICAgICAgICAgICAgIC8qIDIzLjg1ayAqLw0KKw0KKyNkZWZpbmUgTkJCSVRTX1NJRCAgICAzNQ0KKyNkZWZpbmUgTkJfQklUU19NQVggICBOQkJJVFNfMjRrDQorDQorI2RlZmluZSBCSVRfMCAgICAgKFdvcmQxNiktMTI3DQorI2RlZmluZSBCSVRfMSAgICAgKFdvcmQxNikxMjcNCisjZGVmaW5lIEJJVF8wX0lUVSAoV29yZDE2KTB4MDA3Rg0KKyNkZWZpbmUgQklUXzFfSVRVIChXb3JkMTYpMHgwMDgxDQorDQorI2RlZmluZSBTSVpFX01BWDEgICgzK05CX0JJVFNfTUFYKSAgICAgICAgICAvKiBzZXJpYWwgc2l6ZSBtYXggKi8NCisjZGVmaW5lIFRYX0ZSQU1FX1RZUEUgKFdvcmQxNikweDZiMjENCisjZGVmaW5lIFJYX0ZSQU1FX1RZUEUgKFdvcmQxNikweDZiMjANCisNCitzdGF0aWMgY29uc3QgV29yZDE2IG5iX29mX2JpdHNbTlVNX09GX01PREVTXSA9IHsNCisJTkJCSVRTXzdrLA0KKwlOQkJJVFNfOWssDQorCU5CQklUU18xMmssDQorCU5CQklUU18xNGssDQorCU5CQklUU18xNmssDQorCU5CQklUU18xOGssDQorCU5CQklUU18yMGssDQorCU5CQklUU18yM2ssDQorCU5CQklUU18yNGssDQorCU5CQklUU19TSUQNCit9Ow0KKw0KKy8qdHlwZWRlZiBzdHJ1Y3QNCit7DQorV29yZDE2IHNpZF91cGRhdGVfY291bnRlcjsNCitXb3JkMTYgc2lkX2hhbmRvdmVyX2RlYnQ7DQorV29yZDE2IHByZXZfZnQ7DQorfSBUWF9TdGF0ZTsNCisqLw0KKw0KKy8vdHlwZWRlZiBzdHJ1Y3QNCisvL3sNCisvLwlXb3JkMTYgcHJldl9mdDsNCisvLwlXb3JkMTYgcHJldl9tb2RlOw0KKy8vfSBSWF9TdGF0ZTsNCisNCitpbnQgUGFja0JpdHMoV29yZDE2IHBybXNbXSwgV29yZDE2IGNvZGluZ19tb2RlLCBXb3JkMTYgbW9kZSwgQ29kZXJfU3RhdGUgKnN0KTsNCisNCisNCit2b2lkIFBhcm1fc2VyaWFsKA0KKwkJV29yZDE2IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBhcmFtZXRlciB2YWx1ZSAqLw0KKwkJV29yZDE2IG5vX29mX2JpdHMsICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG51bWJlciBvZiBiaXRzICAqLw0KKwkJV29yZDE2ICoqIHBybXMNCisJCSk7DQorDQorDQorI2VuZGlmICAvL19fQklUU19IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Nuc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZGJkODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Nuc3QuaApAQCAtMCwwICsxLDgxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgQ05TVC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgIENvZGVjIGNvbnN0YW50IHBhcmFtZXRlcnMgKGNvZGVyIGFuZCBkZWNvZGVyKSAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX0NOU1RfSF9fDQorI2RlZmluZSBfX0NOU1RfSF9fDQorDQorI2RlZmluZSBMX0ZSQU1FMTZrICAgMzIwICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIHNpemUgYXQgMTZrSHogICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTF9GUkFNRSAgICAgIDI1NiAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIExfU1VCRlIxNmsgICA4MCAgICAgICAgICAgICAgICAgICAgLyogU3ViZnJhbWUgc2l6ZSBhdCAxNmtIeiAgICAgICAgICAgICAgICAgICAgICovDQorDQorI2RlZmluZSBMX1NVQkZSICAgICAgNjQgICAgICAgICAgICAgICAgICAgIC8qIFN1YmZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTkJfU1VCRlIgICAgIDQgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3ViZnJhbWUgcGVyIGZyYW1lICAgICAgICAgICAgICAgKi8NCisNCisjZGVmaW5lIExfTkVYVCAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgLyogT3ZlcmhlYWQgaW4gTFAgYW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICovDQorI2RlZmluZSBMX1dJTkRPVyAgICAgMzg0ICAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIGluIExQIGFuYWx5c2lzICAgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTF9UT1RBTCAgICAgIDM4NCAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBzaXplIG9mIHNwZWVjaCBidWZmZXIuICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIE0gICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgLyogT3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovDQorI2RlZmluZSBNMTZrICAgICAgICAgMjANCisNCisjZGVmaW5lIExfRklMVDE2ayAgICAxNSAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgb2YgZG93bi1zYW1wbGluZyBmaWx0ZXIgICAgICAgICAgICAgICovDQorI2RlZmluZSBMX0ZJTFQgICAgICAgMTIgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IG9mIHVwLXNhbXBsaW5nIGZpbHRlciAgICAgICAgICAgICAgICAqLw0KKw0KKyNkZWZpbmUgR1BfQ0xJUCAgICAgIDE1NTY1ICAgICAgICAgICAgICAgICAvKiBQaXRjaCBnYWluIGNsaXBwaW5nID0gMC45NSBRMTQgICAgICAgICAgICAgKi8NCisjZGVmaW5lIFBJVF9TSEFSUCAgICAyNzg1MyAgICAgICAgICAgICAgICAgLyogcGl0Y2ggc2hhcnBlbmluZyBmYWN0b3IgPSAwLjg1IFExNSAgICAgICAgICovDQorDQorI2RlZmluZSBQSVRfTUlOICAgICAgMzQgICAgICAgICAgICAgICAgICAgIC8qIE1pbmltdW0gcGl0Y2ggbGFnIHdpdGggcmVzb2x1dGlvbiAxLzQgICAgICAqLw0KKyNkZWZpbmUgUElUX0ZSMiAgICAgIDEyOCAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIHBpdGNoIGxhZyB3aXRoIHJlc29sdXRpb24gMS8yICAgICAgKi8NCisjZGVmaW5lIFBJVF9GUjFfOWIgICAxNjAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBwaXRjaCBsYWcgd2l0aCByZXNvbHV0aW9uIDEgICAgICAgICovDQorI2RlZmluZSBQSVRfRlIxXzhiICAgOTIgICAgICAgICAgICAgICAgICAgIC8qIE1pbmltdW0gcGl0Y2ggbGFnIHdpdGggcmVzb2x1dGlvbiAxICAgICAgICAqLw0KKyNkZWZpbmUgUElUX01BWCAgICAgIDIzMSAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIExfSU5URVJQT0wgICAoMTYrMSkgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIGZpbHRlciBmb3IgaW50ZXJwb2xhdGlvbiAgICAgICAgICovDQorDQorI2RlZmluZSBPUExfREVDSU0gICAgMiAgICAgICAgICAgICAgICAgICAgIC8qIERlY2ltYXRpb24gaW4gb3Blbi1sb29wIHBpdGNoIGFuYWx5c2lzICAgICAqLw0KKw0KKyNkZWZpbmUgUFJFRU1QSF9GQUMgIDIyMjgyICAgICAgICAgICAgICAgICAvKiBwcmVlbXBoYXNpcyBmYWN0b3IgKDAuNjggaW4gUTE1KSAgICAgICAgICAgKi8NCisjZGVmaW5lIEdBTU1BMSAgICAgICAzMDE0NyAgICAgICAgICAgICAgICAgLyogV2VpZ2h0aW5nIGZhY3RvciAobnVtZXJhdG9yKSAoMC45MiBpbiBRMTUpICovDQorI2RlZmluZSBUSUxUX0ZBQyAgICAgMjIyODIgICAgICAgICAgICAgICAgIC8qIHRpbHQgZmFjdG9yIChkZW5vbWluYXRvcikgKDAuNjggaW4gUTE1KSAgICAqLw0KKw0KKyNkZWZpbmUgUV9NQVggICAgICAgIDggICAgICAgICAgICAgICAgICAgICAvKiBzY2FsaW5nIG1heCBmb3Igc2lnbmFsIChzZWUgc3luX2ZpbHRfMzIpICAgKi8NCisNCisjZGVmaW5lIFJBTkRPTV9JTklUU0VFRCAgMjE4NDUgICAgICAgICAgICAgLyogb3duIHJhbmRvbSBpbml0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICovDQorDQorI2RlZmluZSBMX01FQU5CVUYgICAgICAgIDMNCisjZGVmaW5lIE9ORV9QRVJfTUVBTkJVRiAxMDkyMw0KKw0KKyNkZWZpbmUgTU9ERV83ayAgICAgICAwDQorI2RlZmluZSBNT0RFXzlrICAgICAgIDENCisjZGVmaW5lIE1PREVfMTJrICAgICAgMg0KKyNkZWZpbmUgTU9ERV8xNGsgICAgICAzDQorI2RlZmluZSBNT0RFXzE2ayAgICAgIDQNCisjZGVmaW5lIE1PREVfMThrICAgICAgNQ0KKyNkZWZpbmUgTU9ERV8yMGsgICAgICA2DQorI2RlZmluZSBNT0RFXzIzayAgICAgIDcNCisjZGVmaW5lIE1PREVfMjRrICAgICAgOA0KKyNkZWZpbmUgTVJEVFggICAgICAgICA5DQorI2RlZmluZSBOVU1fT0ZfTU9ERVMgIDEwICAgICAgICAgICAgICAgICAgIC8qIHNlZSBiaXRzLmggZm9yIGJpdHMgZGVmaW5pdGlvbiAgICAgICAgICAgICAqLw0KKw0KKyNkZWZpbmUgRUhGX01BU0sgKFdvcmQxNikweDAwMDggICAgICAgICAgICAvKiBob21pbmcgZnJhbWUgcGF0dGVybiAgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisjZW5kaWYgLy9fX0NOU1RfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9jb2RfbWFpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9jb2RfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDU3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBDT0RfTUFJTi5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgU3RhdGljIG1lbW9yeSBpbiB0aGUgZW5jb2RlcgkJCQkgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorI2lmbmRlZiBfX0NPRF9NQUlOX0hfXw0KKyNkZWZpbmUgX19DT0RfTUFJTl9IX18NCisNCisjaW5jbHVkZSAiY25zdC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29kZXIgY29uc3RhbnQgcGFyYW1ldGVycyAqLw0KKw0KKyNpbmNsdWRlICJ3Yl92YWQuaCINCisjaW5jbHVkZSAiZHR4LmgiDQorI2luY2x1ZGUgInN0cmVhbS5oIg0KKyNpbmNsdWRlICJ2b0FNUldCLmgiDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIFdvcmQxNiBtZW1fZGVjaW1bMiAqIExfRklMVDE2a107ICAgICAgIC8qIHNwZWVjaCBkZWNpbWF0ZWQgZmlsdGVyIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgbWVtX3NpZ19pbls2XTsgICAgICAgICAgICAgICAgICAvKiBocDUwIGZpbHRlciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9wcmVlbXBoOyAgICAgICAgICAgICAgICAgICAgLyogc3BlZWNoIHByZWVtcGggZmlsdGVyIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgb2xkX3NwZWVjaFtMX1RPVEFMIC0gTF9GUkFNRV07ICAvKiBvbGQgc3BlZWNoIHZlY3RvciBhdCAxMi44a0h6ICovDQorICAgIFdvcmQxNiBvbGRfd3NwW1BJVF9NQVggLyBPUExfREVDSU1dOyAgIC8qIG9sZCBkZWNpbWF0ZWQgd2VpZ2h0ZWQgc3BlZWNoIHZlY3RvciAqLw0KKyAgICBXb3JkMTYgb2xkX2V4Y1tQSVRfTUFYICsgTF9JTlRFUlBPTF07ICAvKiBvbGQgZXhjaXRhdGlvbiB2ZWN0b3IgKi8NCisgICAgV29yZDE2IG1lbV9sZXZpbnNvbltNICsgMl07ICAgICAgICAgICAgLyogbGV2aW5zb24gcm91dGluZSBtZW1vcnkgKi8NCisgICAgV29yZDE2IGlzcG9sZFtNXTsgICAgICAgICAgICAgICAgICAgICAgLyogb2xkIGlzcCAoaW1taXR0YW5jZSBzcGVjdHJhbCBwYWlycykgKi8NCisgICAgV29yZDE2IGlzcG9sZF9xW01dOyAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemVkIG9sZCBpc3AgKi8NCisgICAgV29yZDE2IHBhc3RfaXNmcVtNXTsgICAgICAgICAgICAgICAgICAgLyogcGFzdCBpc2YgcXVhbnRpemVyICovDQorICAgIFdvcmQxNiBtZW1fd3NwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdzcCB2ZWN0b3IgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1fZGVjaW0yWzNdOyAgICAgICAgICAgICAgICAgIC8qIHdzcCBkZWNpbWF0aW9uIGZpbHRlciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV93MDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IHZlY3RvciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9zeW5bTV07ICAgICAgICAgICAgICAgICAgICAgLyogc3ludGhlc2lzIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgdGlsdF9jb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiB0aWx0IG9mIGNvZGUgKi8NCisgICAgV29yZDE2IG9sZF93c3BfbWF4OyAgICAgICAgICAgICAgICAgICAgLyogb2xkIHdzcCBtYXhpbXVtIHZhbHVlICovDQorICAgIFdvcmQxNiBvbGRfd3NwX3NoaWZ0OyAgICAgICAgICAgICAgICAgIC8qIG9sZCB3c3Agc2hpZnQgKi8NCisgICAgV29yZDE2IFFfb2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2xkIHNjYWxpbmcgZmFjdG9yICovDQorICAgIFdvcmQxNiBRX21heFsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG9sZCBtYXhpbXVtIHNjYWxpbmcgZmFjdG9yICovDQorICAgIFdvcmQxNiBncF9jbGlwWzJdOyAgICAgICAgICAgICAgICAgICAgIC8qIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgbWVtb3J5ICovDQorICAgIFdvcmQxNiBxdWFfZ2Fpbls0XTsgICAgICAgICAgICAgICAgICAgIC8qIGdhaW4gcXVhbnRpemVyIG1lbW9yeSAqLw0KKw0KKyAgICBXb3JkMTYgb2xkX1QwX21lZDsNCisgICAgV29yZDE2IG9sX2dhaW47DQorICAgIFdvcmQxNiBhZGFfdzsNCisgICAgV29yZDE2IG9sX3dnaHRfZmxnOw0KKyAgICBXb3JkMTYgb2xkX29sX2xhZ1s1XTsNCisgICAgV29yZDE2IGhwX3dzcF9tZW1bOV07DQorICAgIFdvcmQxNiBvbGRfaHBfd3NwW0xfRlJBTUUgLyBPUExfREVDSU0gKyAoUElUX01BWCAvIE9QTF9ERUNJTSldOw0KKyAgICBWYWRWYXJzICp2YWRTdDsNCisgICAgZHR4X2VuY1N0YXRlICpkdHhfZW5jU3Q7DQorICAgIFdvcmQxNiBmaXJzdF9mcmFtZTsNCisgICAgV29yZDE2IGlzZm9sZFtNXTsgICAgICAgICAgICAgICAgICAgICAgLyogb2xkIGlzZiAoZnJlcXVlbmN5IGRvbWFpbikgKi8NCisgICAgV29yZDMyIExfZ2NfdGhyZXM7ICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIGZvciBub2lzZSBlbmhhbmNlciAqLw0KKyAgICBXb3JkMTYgbWVtX3N5bl9oaVtNXTsgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCBzeW50aGVzaXMgbWVtb3J5IChNU0IpICovDQorICAgIFdvcmQxNiBtZW1fc3luX2xvW01dOyAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHN5bnRoZXNpcyBtZW1vcnkgKExTQikgKi8NCisgICAgV29yZDE2IG1lbV9kZWVtcGg7ICAgICAgICAgICAgICAgICAgICAgLyogc3BlZWNoIGRlZW1waCBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1fc2lnX291dFs2XTsgICAgICAgICAgICAgICAgIC8qIGhwNTAgZmlsdGVyIG1lbW9yeSBmb3Igc3ludGhlc2lzICovDQorICAgIFdvcmQxNiBtZW1faHA0MDBbNl07ICAgICAgICAgICAgICAgICAgIC8qIGhwNDAwIGZpbHRlciBtZW1vcnkgZm9yIHN5bnRoZXNpcyAqLw0KKyAgICBXb3JkMTYgbWVtX292ZXJzYW1wWzIgKiBMX0ZJTFRdOyAgICAgICAvKiBzeW50aGVzaXMgb3ZlcnNhbXBsZWQgZmlsdGVyIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgbWVtX3N5bl9oZltNXTsgICAgICAgICAgICAgICAgICAvKiBIRiBzeW50aGVzaXMgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1faGZbMiAqIExfRklMVDE2a107ICAgICAgICAgIC8qIEhGIGJhbmQtcGFzcyBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1faGYyWzIgKiBMX0ZJTFQxNmtdOyAgICAgICAgIC8qIEhGIGJhbmQtcGFzcyBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBzZWVkMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBtZW1vcnkgZm9yIEhGIGdlbmVyYXRpb24gKi8NCisgICAgV29yZDE2IHZhZF9oaXN0Ow0KKyAgICBXb3JkMTYgZ2Fpbl9hbHBoYTsNCisgICAgLyogIFRYX1N0YXRlIHN0cnVjdHVyZSAgKi8NCisJV29yZDE2IHNpZF91cGRhdGVfY291bnRlcjsNCisgICAgV29yZDE2IHNpZF9oYW5kb3Zlcl9kZWJ0Ow0KKyAgICBXb3JkMTYgcHJldl9mdDsNCisJV29yZDE2IGFsbG93X2R0eDsNCisJLypzb21lIGlucHV0L291dHB1dCBidWZmZXIgcGFyYW1ldGVycyAqLw0KKwl1bnNpZ25lZCBjaGFyICAgICAgICppbnB1dFN0cmVhbTsNCisJaW50CQkJICAgICAgICBpbnB1dFNpemU7DQorCVZPQU1SV0JNT0RFICAJCW1vZGU7DQorCVZPQU1SV0JGUkFNRVRZUEUJZnJhbWVUeXBlOw0KKwl1bnNpZ25lZCBzaG9ydCAgICAgICpvdXRwdXRTdHJlYW07DQorCWludAkJCSAgICAgICAgb3V0cHV0U2l6ZTsNCisJRnJhbWVTdHJlYW0gICAgICAgICAqc3RyZWFtOw0KKwlWT19NRU1fT1BFUkFUT1IgICAgICpwdm9NZW1vcDsNCisJVk9fTUVNX09QRVJBVE9SICAgICB2b01lbW9wcmF0b3I7DQorCVZPX1BUUiAgICAgICAgICAgICAgaENoZWNrOw0KK30gQ29kZXJfU3RhdGU7DQorDQordHlwZWRlZiB2b2lkKiBIQU1SRU5DOw0KKw0KKyNlbmRpZiAgLy9fX0NPRF9NQUlOX0hfXw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZHR4LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2R0eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmMyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2R0eC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgRFRYLkgJCQkJCSAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICBTdGF0aWMgbWVtb3J5LCBjb25zdGFudHMgYW5kIGZyYW1ldHlwZXMgZm9yIHRoZSBEVFggCQkgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNpZm5kZWYgX19EVFhfSF9fDQorI2RlZmluZSBfX0RUWF9IX18NCisNCisjZGVmaW5lIERUWF9NQVhfRU1QVFlfVEhSRVNIIDUwDQorI2RlZmluZSBEVFhfSElTVF9TSVpFIDgNCisjZGVmaW5lIERUWF9ISVNUX1NJWkVfTUlOX09ORSA3DQorI2RlZmluZSBEVFhfRUxBUFNFRF9GUkFNRVNfVEhSRVNIICgyNCArIDcgLTEpDQorI2RlZmluZSBEVFhfSEFOR19DT05TVCA3ICAgICAgICAgICAgICAgICAgIC8qIHlpZWxkcyBlaWdodCBmcmFtZXMgb2YgU1AgSEFOR09WRVIgICovDQorI2RlZmluZSBJTlZfTUVEX1RIUkVTSCAxNDU2NA0KKyNkZWZpbmUgSVNGX0dBUCAgMTI4ICAgICAgICAgICAgICAgICAgICAgICAvKiA1MCAqLw0KKyNkZWZpbmUgT05FX01JTlVTX0lTRl9HQVAgMTYzODQgLSBJU0ZfR0FQDQorI2RlZmluZSBJU0ZfR0FQICAgMTI4DQorI2RlZmluZSBJU0ZfRElUSF9HQVAgICA0NDgNCisjZGVmaW5lIElTRl9GQUNUT1JfTE9XIDI1Ng0KKyNkZWZpbmUgSVNGX0ZBQ1RPUl9TVEVQIDINCisjZGVmaW5lIEdBSU5fVEhSIDE4MA0KKyNkZWZpbmUgR0FJTl9GQUNUT1IgNzUNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgV29yZDE2IGlzZl9oaXN0W00gKiBEVFhfSElTVF9TSVpFXTsNCisgICAgV29yZDE2IGxvZ19lbl9oaXN0W0RUWF9ISVNUX1NJWkVdOw0KKyAgICBXb3JkMTYgaGlzdF9wdHI7DQorICAgIFdvcmQxNiBsb2dfZW5faW5kZXg7DQorICAgIFdvcmQxNiBjbmdfc2VlZDsNCisgICAgLyogRFRYIGhhbmRsZXIgc3R1ZmYgKi8NCisgICAgV29yZDE2IGR0eEhhbmdvdmVyQ291bnQ7DQorICAgIFdvcmQxNiBkZWNBbmFFbGFwc2VkQ291bnQ7DQorICAgIFdvcmQzMiBEWzI4XTsNCisgICAgV29yZDMyIHN1bURbRFRYX0hJU1RfU0laRV07DQorfSBkdHhfZW5jU3RhdGU7DQorDQorI2RlZmluZSBTUEVFQ0ggMA0KKyNkZWZpbmUgRFRYIDENCisjZGVmaW5lIERUWF9NVVRFIDINCisNCisjZGVmaW5lIFRYX1NQRUVDSCAwDQorI2RlZmluZSBUWF9TSURfRklSU1QgMQ0KKyNkZWZpbmUgVFhfU0lEX1VQREFURSAyDQorI2RlZmluZSBUWF9OT19EQVRBIDMNCisNCisjZGVmaW5lIFJYX1NQRUVDSF9HT09EIDANCisjZGVmaW5lIFJYX1NQRUVDSF9QUk9CQUJMWV9ERUdSQURFRCAxDQorI2RlZmluZSBSWF9TUEVFQ0hfTE9TVCAyDQorI2RlZmluZSBSWF9TUEVFQ0hfQkFEIDMNCisjZGVmaW5lIFJYX1NJRF9GSVJTVCA0DQorI2RlZmluZSBSWF9TSURfVVBEQVRFIDUNCisjZGVmaW5lIFJYX1NJRF9CQUQgNg0KKyNkZWZpbmUgUlhfTk9fREFUQSA3DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoNCisgKiBERUZJTklUSU9OIE9GIERBVEEgVFlQRVMNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorV29yZDE2IGR0eF9lbmNfaW5pdChkdHhfZW5jU3RhdGUgKiogc3QsIFdvcmQxNiBpc2ZfaW5pdFtdLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7DQorV29yZDE2IGR0eF9lbmNfcmVzZXQoZHR4X2VuY1N0YXRlICogc3QsIFdvcmQxNiBpc2ZfaW5pdFtdKTsNCit2b2lkIGR0eF9lbmNfZXhpdChkdHhfZW5jU3RhdGUgKiogc3QsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsNCisNCitXb3JkMTYgZHR4X2VuYygNCisgICAgIGR0eF9lbmNTdGF0ZSAqIHN0LCAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGlzZltNXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBvICAgOiBDTiBJU0YgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiBleGMyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG8gICA6IENOIGV4Y2l0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqKiBwcm1zDQorKTsNCisNCitXb3JkMTYgZHR4X2J1ZmZlcigNCisgICAgIGR0eF9lbmNTdGF0ZSAqIHN0LCAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGlzZl9uZXdbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBpc2YgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMzIgZW5yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHJlc2lkdWFsIGVuZXJneSAoaW4gTF9GUkFNRSkgICAgKi8NCisgICAgIFdvcmQxNiBjb2RlY19tb2RlDQorKTsNCisNCit2b2lkIHR4X2R0eF9oYW5kbGVyKGR0eF9lbmNTdGF0ZSAqIHN0LCAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHZhZF9mbGFnLCAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiB2YWQgZGVjaXNpb24gICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiB1c2VkTW9kZSAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IG1vZGUgY2hhbmdlZCBvciBub3QgICAgKi8NCispOw0KKw0KK3ZvaWQgUWlzZl9ucygNCisgICAgIFdvcmQxNiAqIGlzZjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisgICAgIFdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIGluZGljZSAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgKi8NCispOw0KKw0KKw0KK3ZvaWQgRGlzZl9ucygNCisgICAgIFdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiBpc2ZfcSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICAqLw0KKyk7DQorDQorI2VuZGlmICAvL19fRFRYX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZ3JpZDEwMC50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2dyaWQxMDAudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWUxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2dyaWQxMDAudGFiCkBAIC0wLDAgKzEsNTMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICBUYWJsZSBmb3IgYXpfaXNwKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVmVjdG9yIGdyaWRbXSBpcyBpbiBRMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBncmlkWzBdID0gMS4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogZ3JpZFtncmlkX3BvaW50cysxXSA9IC0xLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIGZvciAoaSA9IDE7IGkgPCBncmlkX3BvaW50czsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGdyaWRbaV0gPSBjb3MoKDYuMjgzMTg1MzA3KmkpLygyLjAqZ3JpZF9wb2ludHMpKTsgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyogVmVyc2lvbiAxMDEgcG9pbnRzICovDQorDQorI2RlZmluZSAgIEdSSURfUE9JTlRTICAgICAxMDANCisNCitjb25zdCBXb3JkMTYgdm9ncmlkW0dSSURfUE9JTlRTKzFdID17DQorICAgIDMyNzY3LCAgICAgMzI3NTEsICAgICAzMjcwMywgICAgIDMyNjIyLCAgICAgMzI1MDksICAgICAzMjM2NCwNCisgICAgMzIxODcsICAgICAzMTk3OCwgICAgIDMxNzM4LCAgICAgMzE0NjYsICAgICAzMTE2NCwgICAgIDMwODMwLA0KKyAgICAzMDQ2NiwgICAgIDMwMDcyLCAgICAgMjk2NDksICAgICAyOTE5NiwgICAgIDI4NzE0LCAgICAgMjgyMDQsDQorICAgIDI3NjY2LCAgICAgMjcxMDEsICAgICAyNjUwOSwgICAgIDI1ODkxLCAgICAgMjUyNDgsICAgICAyNDU3OSwNCisgICAgMjM4ODYsICAgICAyMzE3MCwgICAgIDIyNDMxLCAgICAgMjE2NjksICAgICAyMDg4NywgICAgIDIwMDgzLA0KKyAgICAxOTI2MCwgICAgIDE4NDE4LCAgICAgMTc1NTcsICAgICAxNjY4MCwgICAgIDE1Nzg2LCAgICAgMTQ4NzYsDQorICAgIDEzOTUxLCAgICAgMTMwMTMsICAgICAxMjA2MiwgICAgIDExMDk5LCAgICAgMTAxMjUsICAgICAgOTE0MSwNCisgICAgIDgxNDksICAgICAgNzE0OCwgICAgICA2MTQwLCAgICAgIDUxMjYsICAgICAgNDEwNiwgICAgICAzMDgzLA0KKyAgICAgMjA1NywgICAgICAxMDI5LCAgICAgICAgIDAsICAgICAtMTAyOSwgICAgIC0yMDU3LCAgICAgLTMwODMsDQorICAgIC00MTA2LCAgICAgLTUxMjYsICAgICAtNjE0MCwgICAgIC03MTQ4LCAgICAgLTgxNDksICAgICAtOTE0MSwNCisgICAtMTAxMjUsICAgIC0xMTA5OSwgICAgLTEyMDYyLCAgICAtMTMwMTMsICAgIC0xMzk1MSwgICAgLTE0ODc2LA0KKyAgIC0xNTc4NiwgICAgLTE2NjgwLCAgICAtMTc1NTcsICAgIC0xODQxOCwgICAgLTE5MjYwLCAgICAtMjAwODMsDQorICAgLTIwODg3LCAgICAtMjE2NjksICAgIC0yMjQzMSwgICAgLTIzMTcwLCAgICAtMjM4ODYsICAgIC0yNDU3OSwNCisgICAtMjUyNDgsICAgIC0yNTg5MSwgICAgLTI2NTA5LCAgICAtMjcxMDEsICAgIC0yNzY2NiwgICAgLTI4MjA0LA0KKyAgIC0yODcxNCwgICAgLTI5MTk2LCAgICAtMjk2NDksICAgIC0zMDA3MiwgICAgLTMwNDY2LCAgICAtMzA4MzAsDQorICAgLTMxMTY0LCAgICAtMzE0NjYsICAgIC0zMTczOCwgICAgLTMxOTc4LCAgICAtMzIxODcsICAgIC0zMjM2NCwNCisgICAtMzI1MDksICAgIC0zMjYyMiwgICAgLTMyNzAzLCAgICAtMzI3NTEsICAgIC0zMjc2MH07DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9oYW1fd2luZC50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hhbV93aW5kLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY4NjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9oYW1fd2luZC50YWIKQEAgLTAsMCArMSw3MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKiBIYW1taW5nX2NvcyB3aW5kb3cgZm9yIExQQyBhbmFseXNpcy4gICAgICAgICAgICAgICAgICovDQorLyogICBDcmVhdGUgd2l0aCBmdW5jdGlvbiBoYW1tX2Nvcyh3aW5kb3csMzg0LTEyOCwxMjgpICAqLw0KKw0KKyNkZWZpbmUgTF9XSU5ET1cgMzg0DQorDQorY29uc3QgV29yZDE2IHZvX3dpbmRvd1tMX1dJTkRPV10gPSB7DQorICAgIDI2MjEsICAgIDI2MjIsICAgIDI2MjYsICAgIDI2MzIsICAgIDI2NDAsICAgIDI2NTAsICAgIDI2NjIsICAgIDI2NzcsDQorICAgIDI2OTQsICAgIDI3MTQsICAgIDI3MzUsICAgIDI3NTksICAgIDI3ODUsICAgIDI4MTQsICAgIDI4NDQsICAgIDI4NzcsDQorICAgIDI5MTIsICAgIDI5NDksICAgIDI5ODksICAgIDMwMzEsICAgIDMwNzUsICAgIDMxMjEsICAgIDMxNjksICAgIDMyMjAsDQorICAgIDMyNzMsICAgIDMzMjgsICAgIDMzODUsICAgIDM0NDQsICAgIDM1MDYsICAgIDM1NjksICAgIDM2MzUsICAgIDM3MDMsDQorICAgIDM3NzMsICAgIDM4NDUsICAgIDM5MTksICAgIDM5OTYsICAgIDQwNzQsICAgIDQxNTUsICAgIDQyMzcsICAgIDQzMjEsDQorICAgIDQ0MDgsICAgIDQ0OTYsICAgIDQ1ODcsICAgIDQ2ODAsICAgIDQ3NzQsICAgIDQ4NzAsICAgIDQ5NjksICAgIDUwNjksDQorICAgIDUxNzEsICAgIDUyNzUsICAgIDUzODEsICAgIDU0ODksICAgIDU1OTksICAgIDU3MTAsICAgIDU4MjQsICAgIDU5MzksDQorICAgIDYwNTYsICAgIDYxNzQsICAgIDYyOTUsICAgIDY0MTcsICAgIDY1NDEsICAgIDY2NjYsICAgIDY3OTMsICAgIDY5MjIsDQorICAgIDcwNTIsICAgIDcxODUsICAgIDczMTgsICAgIDc0NTMsICAgIDc1OTAsICAgIDc3MjgsICAgIDc4NjgsICAgIDgwMDksDQorICAgIDgxNTIsICAgIDgyOTYsICAgIDg0NDIsICAgIDg1ODksICAgIDg3MzcsICAgIDg4ODcsICAgIDkwMzgsICAgIDkxOTEsDQorICAgIDkzNDQsICAgIDk0OTksICAgIDk2NTUsICAgIDk4MTMsICAgIDk5NzEsICAgMTAxMzEsICAgMTAyOTIsICAgMTA0NTQsDQorICAgMTA2MTcsICAgMTA3ODEsICAgMTA5NDYsICAgMTExMTMsICAgMTEyODAsICAgMTE0NDgsICAgMTE2MTcsICAgMTE3ODcsDQorICAgMTE5NTgsICAgMTIxMzAsICAgMTIzMDMsICAgMTI0NzYsICAgMTI2NTAsICAgMTI4MjUsICAgMTMwMDEsICAgMTMxNzgsDQorICAgMTMzNTUsICAgMTM1MzMsICAgMTM3MTEsICAgMTM4OTAsICAgMTQwNzAsICAgMTQyNTAsICAgMTQ0MzEsICAgMTQ2MTIsDQorICAgMTQ3OTMsICAgMTQ5NzUsICAgMTUxNTgsICAgMTUzNDEsICAgMTU1MjQsICAgMTU3MDgsICAgMTU4OTEsICAgMTYwNzYsDQorICAgMTYyNjAsICAgMTY0NDUsICAgMTY2MjksICAgMTY4MTQsICAgMTY5OTksICAgMTcxODUsICAgMTczNzAsICAgMTc1NTUsDQorICAgMTc3NDAsICAgMTc5MjYsICAgMTgxMTEsICAgMTgyOTYsICAgMTg0ODEsICAgMTg2NjYsICAgMTg4NTEsICAgMTkwMzYsDQorICAgMTkyMjEsICAgMTk0MDUsICAgMTk1ODksICAgMTk3NzMsICAgMTk5NTYsICAgMjAxMzksICAgMjAzMjIsICAgMjA1MDQsDQorICAgMjA2ODYsICAgMjA4NjcsICAgMjEwNDgsICAgMjEyMjksICAgMjE0MDgsICAgMjE1ODgsICAgMjE3NjcsICAgMjE5NDUsDQorICAgMjIxMjIsICAgMjIyOTksICAgMjI0NzUsICAgMjI2NTEsICAgMjI4MjUsICAgMjI5OTksICAgMjMxNzIsICAgMjMzNDQsDQorICAgMjM1MTYsICAgMjM2ODYsICAgMjM4NTYsICAgMjQwMjUsICAgMjQxOTIsICAgMjQzNTksICAgMjQ1MjUsICAgMjQ2ODksDQorICAgMjQ4NTMsICAgMjUwMTYsICAgMjUxNzcsICAgMjUzMzcsICAgMjU0OTYsICAgMjU2NTQsICAgMjU4MTEsICAgMjU5NjcsDQorICAgMjYxMjEsICAgMjYyNzQsICAgMjY0MjYsICAgMjY1NzYsICAgMjY3MjUsICAgMjY4NzMsICAgMjcwMTksICAgMjcxNjQsDQorICAgMjczMDgsICAgMjc0NTAsICAgMjc1OTAsICAgMjc3MjksICAgMjc4NjcsICAgMjgwMDMsICAgMjgxMzcsICAgMjgyNzAsDQorICAgMjg0MDEsICAgMjg1MzEsICAgMjg2NTksICAgMjg3ODUsICAgMjg5MTAsICAgMjkwMzMsICAgMjkxNTQsICAgMjkyNzQsDQorICAgMjkzOTEsICAgMjk1MDcsICAgMjk2MjIsICAgMjk3MzQsICAgMjk4NDUsICAgMjk5NTMsICAgMzAwNjAsICAgMzAxNjUsDQorICAgMzAyNjgsICAgMzAzNzAsICAgMzA0NjksICAgMzA1NjYsICAgMzA2NjIsICAgMzA3NTUsICAgMzA4NDcsICAgMzA5MzYsDQorICAgMzEwMjQsICAgMzExMDksICAgMzExOTMsICAgMzEyNzQsICAgMzEzNTQsICAgMzE0MzEsICAgMzE1MDYsICAgMzE1NzksDQorICAgMzE2NTEsICAgMzE3MTksICAgMzE3ODYsICAgMzE4NTEsICAgMzE5MTQsICAgMzE5NzQsICAgMzIwMzIsICAgMzIwODgsDQorICAgMzIxNDIsICAgMzIxOTQsICAgMzIyNDMsICAgMzIyOTEsICAgMzIzMzYsICAgMzIzNzksICAgMzI0MTksICAgMzI0NTgsDQorICAgMzI0OTQsICAgMzI1MjgsICAgMzI1NjAsICAgMzI1ODksICAgMzI2MTcsICAgMzI2NDIsICAgMzI2NjQsICAgMzI2ODUsDQorICAgMzI3MDMsICAgMzI3MTksICAgMzI3MzMsICAgMzI3NDQsICAgMzI3NTMsICAgMzI3NjAsICAgMzI3NjQsICAgMzI3NjcsDQorICAgMzI3NjcsICAgMzI3NjUsICAgMzI3NTcsICAgMzI3NDUsICAgMzI3MjcsICAgMzI3MDUsICAgMzI2NzgsICAgMzI2NDYsDQorICAgMzI2MDksICAgMzI1NjcsICAgMzI1MjAsICAgMzI0NjgsICAgMzI0MTEsICAgMzIzNDksICAgMzIyODMsICAgMzIyMTEsDQorICAgMzIxMzUsICAgMzIwNTQsICAgMzE5NjgsICAgMzE4NzcsICAgMzE3ODEsICAgMzE2ODEsICAgMzE1NzUsICAgMzE0NjUsDQorICAgMzEzNTEsICAgMzEyMzEsICAgMzExMDcsICAgMzA5NzgsICAgMzA4NDQsICAgMzA3MDYsICAgMzA1NjMsICAgMzA0MTUsDQorICAgMzAyNjMsICAgMzAxMDYsICAgMjk5NDUsICAgMjk3NzksICAgMjk2MDksICAgMjk0MzQsICAgMjkyNTUsICAgMjkwNzEsDQorICAgMjg4ODMsICAgMjg2OTEsICAgMjg0OTQsICAgMjgyOTMsICAgMjgwODcsICAgMjc4NzgsICAgMjc2NjQsICAgMjc0NDYsDQorICAgMjcyMjQsICAgMjY5OTcsICAgMjY3NjcsICAgMjY1MzMsICAgMjYyOTQsICAgMjYwNTIsICAgMjU4MDYsICAgMjU1NTUsDQorICAgMjUzMDEsICAgMjUwNDMsICAgMjQ3ODIsICAgMjQ1MTYsICAgMjQyNDcsICAgMjM5NzQsICAgMjM2OTgsICAgMjM0MTgsDQorICAgMjMxMzQsICAgMjI4NDcsICAgMjI1NTcsICAgMjIyNjMsICAgMjE5NjUsICAgMjE2NjUsICAgMjEzNjEsICAgMjEwNTQsDQorICAgMjA3NDMsICAgMjA0MzAsICAgMjAxMTMsICAgMTk3OTQsICAgMTk0NzEsICAgMTkxNDYsICAgMTg4MTcsICAgMTg0ODYsDQorICAgMTgxNTIsICAgMTc4MTUsICAgMTc0NzYsICAgMTcxMzQsICAgMTY3ODksICAgMTY0NDIsICAgMTYwOTIsICAgMTU3NDAsDQorICAgMTUzODUsICAgMTUwMjgsICAgMTQ2NjksICAgMTQzMDgsICAgMTM5NDQsICAgMTM1NzksICAgMTMyMTEsICAgMTI4NDEsDQorICAgMTI0NzAsICAgMTIwOTYsICAgMTE3MjEsICAgMTEzNDQsICAgMTA5NjUsICAgMTA1ODQsICAgMTAyMDIsICAgIDk4MTksDQorICAgIDk0MzMsICAgIDkwNDcsICAgIDg2NTksICAgIDgyNzAsICAgIDc4NzksICAgIDc0ODgsICAgIDcwOTUsICAgIDY3MDEsDQorICAgIDYzMDYsICAgIDU5MTAsICAgIDU1MTQsICAgIDUxMTYsICAgIDQ3MTgsICAgIDQzMTksICAgIDM5MTksICAgIDM1MTksDQorICAgIDMxMTgsICAgIDI3MTYsICAgIDIzMTUsICAgIDE5MTMsICAgIDE1MTAsICAgIDExMDgsICAgICA3MDUsICAgICAzMDJ9Ow0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaG9taW5nLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaG9taW5nLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYzZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ob21pbmcudGFiCkBAIC0wLDAgKzEsMTIzIEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKw0KKyNkZWZpbmUgREhGX1BBUk1TX01BWCAzMiAgICAgICAgICAgICAgIC8qIGhvbWluZyBmcmFtZSBwYXR0ZXJuICAqLw0KKyNkZWZpbmUgTlVNX09GX1NQTU9ERVMgOQ0KKw0KKyNkZWZpbmUgUFJNTCAxNQ0KKyNkZWZpbmUgUFJNTl83ayBOQkJJVFNfN2svUFJNTCArIDENCisjZGVmaW5lIFBSTU5fOWsgTkJCSVRTXzlrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzEyayBOQkJJVFNfMTJrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzE0ayBOQkJJVFNfMTRrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzE2ayBOQkJJVFNfMTZrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzE4ayBOQkJJVFNfMThrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzIwayBOQkJJVFNfMjBrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzIzayBOQkJJVFNfMjNrL1BSTUwgKyAxDQorI2RlZmluZSBQUk1OXzI0ayBOQkJJVFNfMjRrL1BSTUwgKyAxDQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTdrW1BSTU5fN2tdID0NCit7DQorICAzMTY4LCAyOTk1NCwgMjkyMTMsIDE2MTIxLCANCisJNjQsIDEzNDQwLCAzMDYyNCwgMTY0MzAsIA0KKyAxOTAwOA0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTlrW1BSTU5fOWtdID0NCit7DQorICAgMzE2OCwgMzE2NjUsICA5OTQzLCA5MTIzLCANCisgIDE1NTk5LCAgNDM1OCwgMjAyNDgsIDIwNDgsIA0KKyAgMTcwNDAsIDI3Nzg3LCAxNjgxNiwgMTM4ODgNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00xMmtbUFJNTl8xMmtdID0NCit7DQorICAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTI4LCANCisgIDM2NDcsICA4MTI5LCAzMDkzMCwgMjc5MjYsIA0KKyAxODg4MCwgMTIzMTksICAgNDk2LCAgMTA0MiwgDQorICA0MDYxLCAyMDQ0NiwgMjU2MjksIDI4MDY5LCANCisgMTM5NDgNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00xNGtbUFJNTl8xNGtdID0NCit7DQorICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzEsIA0KKyAgIDI0ODE1LCAgIDY1NSwgMjY2MTYsIDI2NzY0LCANCisgICAgNzIzOCwgMTkxMzYsICA2MTQ0LCAgICA4OCwgDQorCTQxNTgsIDI1NzMzLCAzMDU2NywgMzA0OTQsIA0KKwkyMjEsIDIwMzIxLCAxNzgyMw0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTE2a1tQUk1OXzE2a10gPQ0KK3sNCisgICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMSwgDQorICAgMjQ4MTUsICAgNzAwLCAgMzgyNCwgIDcyNzEsIA0KKyAgIDI2NDAwLCAgOTUyOCwgIDY1OTQsIDI2MTEyLCANCisgICAgIDEwOCwgIDIwNjgsIDEyODY3LCAxNjMxNywgDQorICAgMjMwMzUsIDI0NjMyLCAgNzUyOCwgIDE3NTIsIA0KKyAgICA2NzU5LCAyNDU3Ng0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTE4a1tQUk1OXzE4a10gPQ0KK3sNCisgICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzUsIA0KKwkxNDc4NywgMTQ0MjMsIDMwNDc3LCAyNDkyNywgDQorCTI1MzQ1LCAzMDE1NCwgICA5MTYsICA1NzI4LCANCisJMTg5NzgsICAyMDQ4LCAgIDUyOCwgMTY0NDksIA0KKwkgMjQzNiwgIDM1ODEsIDIzNTI3LCAyOTQ3OSwgDQorCSA4MjM3LCAxNjgxMCwgMjcwOTEsIDE5MDUyLCANCisJICAgIDANCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00yMGtbUFJNTl8yMGtdID0NCit7DQorICAgICAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTI5LCANCisJIDg2MzcsIDMxODA3LCAyNDY0NiwgICA3MzYsIA0KKwkyODY0MywgIDI5NzcsICAyNTY2LCAyNTU2NCwgDQorCTEyOTMwLCAxMzk2MCwgIDIwNDgsICAgODM0LCANCisJIDMyNzAsICA0MTAwLCAyNjkyMCwgMTYyMzcsIA0KKwkzMTIyNywgMTc2NjcsIDE1MDU5LCAyMDU4OSwgDQorCTMwMjQ5LCAyOTEyMywgMA0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTIza1tQUk1OXzIza10gPQ0KK3sNCisJIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzIsIA0KKwkxNjc0OCwgIDMyMDIsIDI4MTc5LCAxNjMxNywgDQorCTMwNTkwLCAxNTg1NywgMTk5NjAsICA4ODE4LCANCisJMjE3MTEsIDIxNTM4LCAgNDI2MCwgMTY2OTAsIA0KKwkyMDIyNCwgIDM2NjYsICA0MTk0LCAgOTQ5NywgDQorCTE2MzIwLCAxNTM4OCwgIDU3NTUsIDMxNTUxLCANCisJMTQwODAsICAzNTc0LCAxNTkzMiwgICAgNTAsIA0KKwkyMzM5MiwgMjYwNTMsIDMxMjE2DQorfTsNCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMjRrW1BSTU5fMjRrXSA9DQorew0KKwkgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzNCwgDQorCTI0Nzc2LCAgNTg1NywgMTg0NzUsIDI4NTM1LCANCisJMjk2NjIsIDE0MzIxLCAxNjcyNSwgIDQzOTYsIA0KKwkyOTM1MywgMTAwMDMsIDE3MDY4LCAyMDUwNCwgDQorCSAgNzIwLCAgICAgMCwgIDg0NjUsIDEyNTgxLCANCisJMjg4NjMsIDI0Nzc0LCAgOTcwOSwgMjYwNDMsIA0KKwkgNzk0MSwgMjc2NDksIDEzOTY1LCAxNTIzNiwgDQorCTE4MDI2LCAyMjA0NywgMTY2ODEsICAzOTY4DQorfTsNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2lzcF9pc2YudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIwZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYgpAQCAtMCwwICsxLDYyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorIHwgVGFibGVzIGZvciBmdW5jdGlvbiBJc2ZfaXNwKCkgYW5kIElzcF9pc2YoKSAgICAgICAgIHwNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKiB0YWJsZSBvZiBjb3MoeCkgaW4gUTE1ICovDQorDQorY29uc3Qgc3RhdGljIFdvcmQxNiB0YWJsZVsxMjldID0gew0KKyAgMzI3NjcsDQorICAzMjc1OCwgIDMyNzI5LCAgMzI2NzksICAzMjYxMCwgIDMyNTIyLCAgMzI0MTMsICAzMjI4NiwgIDMyMTM4LA0KKyAgMzE5NzIsICAzMTc4NiwgIDMxNTgxLCAgMzEzNTcsICAzMTExNCwgIDMwODUzLCAgMzA1NzIsICAzMDI3NCwNCisgIDI5OTU3LCAgMjk2MjIsICAyOTI2OSwgIDI4ODk5LCAgMjg1MTEsICAyODEwNiwgIDI3Njg0LCAgMjcyNDYsDQorICAyNjc5MSwgIDI2MzIwLCAgMjU4MzMsICAyNTMzMCwgIDI0ODEyLCAgMjQyNzksICAyMzczMiwgIDIzMTcwLA0KKyAgMjI1OTUsICAyMjAwNiwgIDIxNDAzLCAgMjA3ODgsICAyMDE2MCwgIDE5NTIwLCAgMTg4NjgsICAxODIwNSwNCisgIDE3NTMxLCAgMTY4NDYsICAxNjE1MSwgIDE1NDQ3LCAgMTQ3MzMsICAxNDAxMCwgIDEzMjc5LCAgMTI1NDAsDQorICAxMTc5MywgIDExMDM5LCAgMTAyNzksICAgOTUxMiwgICA4NzQwLCAgIDc5NjIsICAgNzE4MCwgICA2MzkzLA0KKyAgIDU2MDIsICAgNDgwOCwgICA0MDExLCAgIDMyMTIsICAgMjQxMSwgICAxNjA4LCAgICA4MDQsICAgICAgMCwNCisgICAtODA0LCAgLTE2MDgsICAtMjQxMSwgIC0zMjEyLCAgLTQwMTEsICAtNDgwOCwgIC01NjAyLCAgLTYzOTMsDQorICAtNzE4MCwgIC03OTYyLCAgLTg3NDAsICAtOTUxMiwgLTEwMjc5LCAtMTEwMzksIC0xMTc5MywgLTEyNTQwLA0KKyAtMTMyNzksIC0xNDAxMCwgLTE0NzMzLCAtMTU0NDcsIC0xNjE1MSwgLTE2ODQ2LCAtMTc1MzEsIC0xODIwNSwNCisgLTE4ODY4LCAtMTk1MjAsIC0yMDE2MCwgLTIwNzg4LCAtMjE0MDMsIC0yMjAwNiwgLTIyNTk1LCAtMjMxNzAsDQorIC0yMzczMiwgLTI0Mjc5LCAtMjQ4MTIsIC0yNTMzMCwgLTI1ODMzLCAtMjYzMjAsIC0yNjc5MSwgLTI3MjQ2LA0KKyAtMjc2ODQsIC0yODEwNiwgLTI4NTExLCAtMjg4OTksIC0yOTI2OSwgLTI5NjIyLCAtMjk5NTcsIC0zMDI3NCwNCisgLTMwNTcyLCAtMzA4NTMsIC0zMTExNCwgLTMxMzU3LCAtMzE1ODEsIC0zMTc4NiwgLTMxOTcyLCAtMzIxMzgsDQorIC0zMjI4NiwgLTMyNDEzLCAtMzI1MjIsIC0zMjYxMCwgLTMyNjc5LCAtMzI3MjksIC0zMjc1OCwgLTMyNzY4fTsNCisNCisvKiBzbG9wZSBpbiBRMTEgdXNlZCB0byBjb21wdXRlIHkgPSBhY29zKHgpICovDQorDQorY29uc3Qgc3RhdGljIFdvcmQxNiBzbG9wZVsxMjhdID0geyANCisgLTI2MjE0LCAtOTAzOSwgLTUyNDMsIC0zNzk5LCAtMjk3OSwgLTI0MDUsIC0yMDY0LCAtMTc3MSwNCisgLTE1NzksIC0xNDA5LCAtMTI3OSwgLTExNzAsIC0xMDc5LCAtMTAwNCwgLTkzMywgLTg4MCwNCisgLTgyNywgLTc4MywgLTc0MywgLTcwOCwgLTY3NiwgLTY0NywgLTYyMSwgLTU5OSwNCisgLTU3NiwgLTU1NywgLTUzOCwgLTUyMSwgLTUwNiwgLTQ5MiwgLTQ3OSwgLTQ2NiwNCisgLTQ1NiwgLTQ0NSwgLTQzNSwgLTQyNiwgLTQxNywgLTQxMCwgLTQwMiwgLTM5NSwNCisgLTM4OSwgLTM4MywgLTM3NywgLTM3MiwgLTM2NywgLTM2MywgLTM1OSwgLTM1NSwNCisgLTM1MSwgLTM0OCwgLTM0NSwgLTM0MiwgLTM0MCwgLTMzNywgLTMzNSwgLTMzMywNCisgLTMzMSwgLTMzMCwgLTMyOSwgLTMyOCwgLTMyNywgLTMyNiwgLTMyNiwgLTMyNiwNCisgLTMyNiwgLTMyNiwgLTMyNiwgLTMyNywgLTMyOCwgLTMyOSwgLTMzMCwgLTMzMSwNCisgLTMzMywgLTMzNSwgLTMzNywgLTM0MCwgLTM0MiwgLTM0NSwgLTM0OCwgLTM1MSwNCisgLTM1NSwgLTM1OSwgLTM2MywgLTM2NywgLTM3MiwgLTM3NywgLTM4MywgLTM4OSwNCisgLTM5NSwgLTQwMiwgLTQxMCwgLTQxNywgLTQyNiwgLTQzNSwgLTQ0NSwgLTQ1NiwNCisgLTQ2NiwgLTQ3OSwgLTQ5MiwgLTUwNiwgLTUyMSwgLTUzOCwgLTU1NywgLTU3NiwNCisgLTU5OSwgLTYyMSwgLTY0NywgLTY3NiwgLTcwOCwgLTc0MywgLTc4MywgLTgyNywNCisgLTg4MCwgLTkzMywgLTEwMDQsIC0xMDc5LCAtMTE3MCwgLTEyNzksIC0xNDA5LCAtMTU3OSwNCisgLTE3NzEsIC0yMDY0LCAtMjQwNSwgLTI5NzksIC0zNzk5LCAtNTI0MywgLTkwMzksIC0yNjIxNH07DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sYWdfd2luZC50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xhZ193aW5kLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTc1ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sYWdfd2luZC50YWIKQEAgLTAsMCArMSw4MSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyB8IFRhYmxlIG9mIGxhZ193aW5kb3cgZm9yIGF1dG9jb3JyZWxhdGlvbi4gICAgICAgICAgICB8DQorIHwgbm9pc2UgZmxvb3IgPSAxLjAwMDEgICA9ICgwLjk5OTkgIG9uIHJbMV0gLi5yWzE2XSkgIHwNCisgfCBCYW5kd2lkdGggZXhwYW5zaW9uID0gNjAgSHogICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IFNhbXBsaW5nIGZyZXF1ZW5jeSAgPSAxMjgwMCBIeiAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBTcGVjaWFsIGRvdWJsZSBwcmVjaXNpb24gZm9ybWF0LiBTZWUgIm1hdGhfb3AuYyIgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMF0gPSAgMS4wMDAwMDAwMCAgICAobm90IHN0b3JlZCkgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxXSA9ICAwLjk5OTQ2NjQyICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzJdID0gIDAuOTk4MTY2ODAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbM10gPSAgMC45OTYwMDQ1MiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFs0XSA9ICAwLjk5Mjk4NTEzICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzVdID0gIDAuOTg5MTE2NTUgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbNl0gPSAgMC45ODQ0MDg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFs3XSA9ICAwLjk3ODg3Mzk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzhdID0gIDAuOTcyNTI2MTkgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbOV0gPSAgMC45NjUzODE4NiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxMF09ICAwLjk1NzQ1OTAzICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzExXT0gIDAuOTQ4Nzc3OTcgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMTJdPSAgMC45MzkzNjAzOCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxM109ICAwLjkyOTIyOTg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzE0XT0gIDAuOTE4NDExNTUgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMTVdPSAgMC45MDY5MzIxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxNl09ICAwLjg5NDgxOTY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNkZWZpbmUgTSAxNg0KKw0KK3N0YXRpYyBXb3JkMTYgdm9sYWdfaFtNXSA9IHsNCisgICAgICAzMjc1MCwNCisgICAgICAzMjcwNywNCisgICAgICAzMjYzNywNCisgICAgICAzMjUzOCwNCisgICAgICAzMjQxMSwNCisgICAgICAzMjI1NywNCisgICAgICAzMjA3NSwNCisgICAgICAzMTg2NywNCisgICAgICAzMTYzMywNCisgICAgICAzMTM3NCwNCisgICAgICAzMTA4OSwNCisgICAgICAzMDc4MCwNCisgICAgICAzMDQ0OSwNCisgICAgICAzMDA5NCwNCisgICAgICAyOTcxOCwNCisgICAgICAyOTMyMX07DQorDQorc3RhdGljIFdvcmQxNiB2b2xhZ19sW01dID0gew0KKyAgICAgIDE2ODk2LA0KKyAgICAgIDMwNDY0LA0KKyAgICAgICAyNDk2LA0KKyAgICAgICA0NDgwLA0KKyAgICAgIDEyMTYwLA0KKyAgICAgICAzNTIwLA0KKyAgICAgIDI0MzIwLA0KKyAgICAgIDI0MTkyLA0KKyAgICAgIDIwNzM2LA0KKyAgICAgICAgNTc2LA0KKyAgICAgIDE4MjQwLA0KKyAgICAgIDMxNDg4LA0KKyAgICAgICAgMTI4LA0KKyAgICAgIDE2NzA0LA0KKyAgICAgIDExNTIwLA0KKyAgICAgIDE0Nzg0fTsNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmRiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzIuaApAQCAtMCwwICsxLDYyIEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICAgRmlsZSAgICAgICAgICAgICA6IGxvZzIuaA0KKyogICAgICBQdXJwb3NlICAgICAgICAgIDogQ29tcHV0ZXMgbG9nMihMX3gpDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisjaWZuZGVmIF9fTE9HMl9IX18NCisjZGVmaW5lIF9fTE9HMl9IX18NCisgDQorLyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyANCisvKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIERBVEEgVFlQRVMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorIA0KKy8qDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkFUSU9OIE9GIFBST1RPVFlQRVMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQordm9pZCBMb2cyICgNCisJCVdvcmQzMiBMX3gsICAgICAgICAvKiAoaSkgOiBpbnB1dCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKmV4cG9uZW50LCAgLyogKG8pIDogSW50ZWdlciBwYXJ0IG9mIExvZzIuICAgKHJhbmdlOiAwPD12YWw8PTMwKSAqLw0KKwkJV29yZDE2ICpmcmFjdGlvbiAgIC8qIChvKSA6IEZyYWN0aW9uYWwgcGFydCBvZiBMb2cyLiAocmFuZ2U6IDA8PXZhbDwxKSovDQorCSAgKTsNCisNCit2b2lkIExvZzJfbm9ybSAoDQorCQlXb3JkMzIgTF94LCAgICAgICAgIC8qIChpKSA6IGlucHV0IHZhbHVlIChub3JtYWxpemVkKSAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBleHAsICAgICAgICAgLyogKGkpIDogbm9ybV9sIChMX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICpleHBvbmVudCwgICAvKiAobykgOiBJbnRlZ2VyIHBhcnQgb2YgTG9nMi4gICAocmFuZ2U6IDA8PXZhbDw9MzApICovDQorCQlXb3JkMTYgKmZyYWN0aW9uICAgIC8qIChvKSA6IEZyYWN0aW9uYWwgcGFydCBvZiBMb2cyLiAocmFuZ2U6IDA8PXZhbDwxKSAgKi8NCisJICAgICAgICk7DQorDQorI2VuZGlmICAvL19fTE9HMl9IX18NCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzJfdGFiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzJfdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MWFlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMl90YWIuaApAQCAtMCwwICsxLDM1IEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgICBGaWxlICAgICAgICAgICAgIDogbG9nMi50YWINCisqICAgICAgUHVycG9zZSAgICAgICAgICA6IFRhYmxlIGZvciByb3V0aW5lIExvZzIoKS4NCisqICAgICAgJElkICQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgdGFibGVbMzNdID0NCit7DQorICAgIDAsIDE0NTUsIDI4NjYsIDQyMzYsIDU1NjgsIDY4NjMsIDgxMjQsIDkzNTIsIDEwNTQ5LCAxMTcxNiwNCisgICAgMTI4NTUsIDEzOTY3LCAxNTA1NCwgMTYxMTcsIDE3MTU2LCAxODE3MiwgMTkxNjcsIDIwMTQyLCAyMTA5NywgMjIwMzMsDQorICAgIDIyOTUxLCAyMzg1MiwgMjQ3MzUsIDI1NjAzLCAyNjQ1NSwgMjcyOTEsIDI4MTEzLCAyODkyMiwgMjk3MTYsIDMwNDk3LA0KKyAgICAzMTI2NiwgMzIwMjMsIDMyNzY3DQorfTsNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21haW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTdjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21haW4uaApAQCAtMCwwICsxLDQ1IEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgTUFJTi5ICSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgIE1haW4gZnVuY3Rpb25zCQkJCQkJCSAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX01BSU5fSF9fDQorI2RlZmluZSBfX01BSU5fSF9fDQorDQordm9pZCBjb2RlcigNCisgICAgIFdvcmQxNiAqIG1vZGUsICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiAgdXNlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHNwZWVjaDE2a1tdLCAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6ICAzMjAgbmV3IHNwZWVjaCBzYW1wbGVzIChhdCAxNiBrSHopICAgICovDQorICAgICBXb3JkMTYgcHJtc1tdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogIG91dHB1dCBwYXJhbWV0ZXJzICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2ICogc2VyX3NpemUsICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6ICBiaXQgcmF0ZSBvZiB0aGUgdXNlZCBtb2RlICAgKi8NCisgICAgIHZvaWQgKnNwZV9zdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgLyogaS9vICAgOiAgU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGFsbG93X2R0eCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6ICBEVFggT04vT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorKTsNCisNCisNCisNCit2b2lkIFJlc2V0X2VuY29kZXIodm9pZCAqc3QsIFdvcmQxNiByZXNldF9hbGwpOw0KKw0KKw0KK1dvcmQxNiBlbmNvZGVyX2hvbWluZ19mcmFtZV90ZXN0KFdvcmQxNiBpbnB1dF9mcmFtZVtdKTsNCisNCisjZW5kaWYgLy9fX01BSU5fSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYXRoX29wLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21hdGhfb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWUyOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYXRoX29wLmgKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIE1BVEhfT1AuSAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICBNYXRoZW1hdGljYWwgb3BlcmF0aW9ucwkJCQkJICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmIF9fTUFUSF9PUF9IX18NCisjZGVmaW5lIF9fTUFUSF9PUF9IX18NCisNCitXb3JkMzIgSXNxcnQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEzMSA6IG91dHB1dCB2YWx1ZSAocmFuZ2U6IDA8PXZhbDwxKSAgICAgICAgICovDQorCQlXb3JkMzIgTF94ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBpbnB1dCB2YWx1ZSAgKHJhbmdlOiAwPD12YWw8PTdmZmZmZmZmKSAqLw0KKwkgICAgKTsNCisNCit2b2lkIElzcXJ0X24oDQorCQlXb3JkMzIgKiBmcmFjLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIFEzMTogbm9ybWFsaXplZCB2YWx1ZSAoMS4wIDwgZnJhYyA8PSAwLjUpICovDQorCQlXb3JkMTYgKiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgIDogZXhwb25lbnQgKHZhbHVlID0gZnJhYyB4IDJeZXhwb25lbnQpICovDQorCSAgICApOw0KKw0KK1dvcmQzMiBQb3cyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTAgIDogcmVzdWx0ICAgICAgIChyYW5nZTogMDw9dmFsPD0weDdmZmZmZmZmKSAqLw0KKwkJV29yZDE2IGV4cG9uYW50LCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogSW50ZWdlciBwYXJ0LiAgICAgIChyYW5nZTogMDw9dmFsPD0zMCkgICAqLw0KKwkJV29yZDE2IGZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogRnJhY3Rpb25uYWwgcGFydC4gIChyYW5nZTogMC4wPD12YWw8MS4wKSAqLw0KKwkgICApOw0KKw0KK1dvcmQzMiBEb3RfcHJvZHVjdDEyKCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTMxOiBub3JtYWxpemVkIHJlc3VsdCAoMSA8IHZhbCA8PSAtMSkgKi8NCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHkgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiB2ZWN0b3IgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogZXhwb25lbnQgb2YgcmVzdWx0ICgwLi4rMzApICAgICAgICovDQorCQkpOw0KKw0KK1dvcmQzMiBEb3RfcHJvZHVjdDEyX2FzbSggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEzMTogbm9ybWFsaXplZCByZXN1bHQgKDEgPCB2YWwgPD0gLTEpICovDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHggdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB5IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogdmVjdG9yIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IGV4cG9uZW50IG9mIHJlc3VsdCAoMC4uKzMwKSAgICAgICAqLw0KKwkJKTsNCisjZW5kaWYgLy9fX01BVEhfT1BfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWVtX2FsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZGVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWVtX2FsaWduLmgKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJbWVtX2FsaWduLmgNCisNCisJQ29udGVudDoJTWVtb3J5IGFsbG9jIGFsaWdubWVudHMgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fVk9fTUVNX0FMSUdOX0hfXw0KKyNkZWZpbmUgX19WT19NRU1fQUxJR05fSF9fDQorDQorI2luY2x1ZGUgInZvTWVtLmgiDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisNCitleHRlcm4gdm9pZCAqbWVtX21hbGxvYyhWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgYWxpZ25tZW50LCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7DQorZXh0ZXJuIHZvaWQgbWVtX2ZyZWUoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHZvaWQgKm1lbV9wdHIsIHVuc2lnbmVkIGludCBDb2RlY0lEKTsNCisNCisjZW5kaWYJLyogX19WT19NRU1fQUxJR05fSF9fICovDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWltZV9pby50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjODZhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWltZV9pby50YWIKQEAgLTAsMCArMSwzNjggQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisNCitzdGF0aWMgVVdvcmQ4IHRvY19ieXRlWzE2XSA9IHsweDA0LCAweDBDLCAweDE0LCAweDFDLCAweDI0LCAweDJDLCAweDM0LCAweDNDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQsIDB4NEMsIDB4NTQsIDB4NUMsIDB4NjQsIDB4NkMsIDB4NzQsIDB4N0N9Ow0KKw0KKy8qIG51bWJlciBvZiBzcGVlY2ggYml0cyBmb3IgYWxsIG1vZGVzICovDQorc3RhdGljIFdvcmQxNiB1bnBhY2tlZF9zaXplWzE2XSA9IHsxMzIsICAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzcsICAgMzUsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDB9Ow0KKw0KKy8qIHNpemUgb2YgcGFja2VkIGZyYW1lIGZvciBlYWNoIG1vZGUsIGV4Y2x1ZGluZyBUT0MgYnl0ZSAqLw0KK3N0YXRpYyBXb3JkMTYgcGFja2VkX3NpemVbMTZdID0gezE3LCAyMywgMzIsIDM2LCA0MCwgNDYsIDUwLCA1OCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgIDUsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Ow0KKw0KKy8qIG51bWJlciBvZiB1bnVzZWQgc3BlZWNoIGJpdHMgaW4gcGFja2VkIGZvcm1hdCBmb3IgZWFjaCBtb2RlICovDQorc3RhdGljIFdvcmQxNiB1bnVzZWRfc2l6ZVsxNl0gPSB7NCwgNywgMywgMywgMywgMywgMywgMywgMywgMCwgMCwgMCwgMCwgMCwgMCwgMH07DQorDQorLyogc29ydGluZyB0YWJsZXMgZm9yIGFsbCBtb2RlcyAqLw0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF82NjBbMTMyXSA9IHsNCisgICAgIDAsICAgNSwgICA2LCAgIDcsICA2MSwgIDg0LCAxMDcsIDEzMCwgIDYyLCAgODUsDQorICAgICA4LCAgIDQsICAzNywgIDM4LCAgMzksICA0MCwgIDU4LCAgODEsIDEwNCwgMTI3LA0KKyAgICA2MCwgIDgzLCAxMDYsIDEyOSwgMTA4LCAxMzEsIDEyOCwgIDQxLCAgNDIsICA4MCwNCisgICAxMjYsICAgMSwgICAzLCAgNTcsIDEwMywgIDgyLCAxMDUsICA1OSwgICAyLCAgNjMsDQorICAgMTA5LCAxMTAsICA4NiwgIDE5LCAgMjIsICAyMywgIDY0LCAgODcsICAxOCwgIDIwLA0KKyAgICAyMSwgIDE3LCAgMTMsICA4OCwgIDQzLCAgODksICA2NSwgMTExLCAgMTQsICAyNCwNCisgICAgMjUsICAyNiwgIDI3LCAgMjgsICAxNSwgIDE2LCAgNDQsICA5MCwgIDY2LCAxMTIsDQorICAgICA5LCAgMTEsICAxMCwgIDEyLCAgNjcsIDExMywgIDI5LCAgMzAsICAzMSwgIDMyLA0KKyAgICAzNCwgIDMzLCAgMzUsICAzNiwgIDQ1LCAgNTEsICA2OCwgIDc0LCAgOTEsICA5NywNCisgICAxMTQsIDEyMCwgIDQ2LCAgNjksICA5MiwgMTE1LCAgNTIsICA3NSwgIDk4LCAxMjEsDQorICAgIDQ3LCAgNzAsICA5MywgMTE2LCAgNTMsICA3NiwgIDk5LCAxMjIsICA0OCwgIDcxLA0KKyAgICA5NCwgMTE3LCAgNTQsICA3NywgMTAwLCAxMjMsICA0OSwgIDcyLCAgOTUsIDExOCwNCisgICAgNTUsICA3OCwgMTAxLCAxMjQsICA1MCwgIDczLCAgOTYsIDExOSwgIDU2LCAgNzksDQorICAgMTAyLCAxMjUNCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF84ODVbMTc3XSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAgIDcsICAgNSwgICAzLCAgNDcsICA0OCwgIDQ5LCAxMTIsDQorICAgMTEzLCAxMTQsICA3NSwgMTA2LCAxNDAsIDE3MSwgIDgwLCAxMTEsIDE0NSwgMTc2LA0KKyAgICA3NywgMTA4LCAxNDIsIDE3MywgIDc4LCAxMDksIDE0MywgMTc0LCAgNzksIDExMCwNCisgICAxNDQsIDE3NSwgIDc2LCAxMDcsIDE0MSwgMTcyLCAgNTAsIDExNSwgIDUxLCAgIDIsDQorICAgICAxLCAgODEsIDExNiwgMTQ2LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLA0KKyAgICAxNiwgIDI1LCAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwNCisgICAgMTUsICA1MiwgMTE3LCAgMzEsICA4MiwgMTQ3LCAgIDksICAzMywgIDExLCAgODMsDQorICAgMTQ4LCAgNTMsIDExOCwgIDI4LCAgMjcsICA4NCwgMTQ5LCAgMzQsICAzNSwgIDI5LA0KKyAgICA0NiwgIDMyLCAgMzAsICA1NCwgMTE5LCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwNCisgICAgODUsIDE1MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NSwgIDYwLCAgNjUsDQorICAgIDcwLCAgODYsICA5MSwgIDk2LCAxMDEsIDEyMCwgMTI1LCAxMzAsIDEzNSwgMTUxLA0KKyAgIDE1NiwgMTYxLCAxNjYsICA1NiwgIDg3LCAxMjEsIDE1MiwgIDYxLCAgOTIsIDEyNiwNCisgICAxNTcsICA2NiwgIDk3LCAxMzEsIDE2MiwgIDcxLCAxMDIsIDEzNiwgMTY3LCAgNTcsDQorICAgIDg4LCAxMjIsIDE1MywgIDYyLCAgOTMsIDEyNywgMTU4LCAgNjcsICA5OCwgMTMyLA0KKyAgIDE2MywgIDcyLCAxMDMsIDEzNywgMTY4LCAgNTgsICA4OSwgMTIzLCAxNTQsICA2MywNCisgICAgOTQsIDEyOCwgMTU5LCAgNjgsICA5OSwgMTMzLCAxNjQsICA3MywgMTA0LCAxMzgsDQorICAgMTY5LCAgNTksICA5MCwgMTI0LCAxNTUsICA2NCwgIDk1LCAxMjksIDE2MCwgIDY5LA0KKyAgIDEwMCwgMTM0LCAxNjUsICA3NCwgMTA1LCAxMzksIDE3MA0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzEyNjVbMjUzXSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAgOTMsIDE0MywgMTk2LCAyNDYsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LA0KKyAgICA5NCwgMTQ0LCAxOTcsIDI0NywgIDk5LCAxNDksIDIwMiwgMjUyLCAgOTYsIDE0NiwNCisgICAxOTksIDI0OSwgIDk3LCAxNDcsIDIwMCwgMjUwLCAxMDAsIDIwMywgIDk4LCAxNDgsDQorICAgMjAxLCAyNTEsICA5NSwgMTQ1LCAxOTgsIDI0OCwgIDUyLCAgIDIsICAgMSwgMTAxLA0KKyAgIDIwNCwgMTU1LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMTU2LCAgMzEsIDEwMiwgMjA1LCAgIDksICAzMywgIDExLCAxMDMsIDIwNiwgIDU0LA0KKyAgIDE1NywgIDI4LCAgMjcsIDEwNCwgMjA3LCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwNCisgICAgMzAsICA1NSwgMTU4LCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTA1LCAyMDgsDQorICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTA2LCAxNTksIDIwOSwgIDU3LA0KKyAgICA2NiwgIDc1LCAgODQsIDEwNywgMTE2LCAxMjUsIDEzNCwgMTYwLCAxNjksIDE3OCwNCisgICAxODcsIDIxMCwgMjE5LCAyMjgsIDIzNywgIDU4LCAxMDgsIDE2MSwgMjExLCAgNjIsDQorICAgMTEyLCAxNjUsIDIxNSwgIDY3LCAxMTcsIDE3MCwgMjIwLCAgNzEsIDEyMSwgMTc0LA0KKyAgIDIyNCwgIDc2LCAxMjYsIDE3OSwgMjI5LCAgODAsIDEzMCwgMTgzLCAyMzMsICA4NSwNCisgICAxMzUsIDE4OCwgMjM4LCAgODksIDEzOSwgMTkyLCAyNDIsICA1OSwgMTA5LCAxNjIsDQorICAgMjEyLCAgNjMsIDExMywgMTY2LCAyMTYsICA2OCwgMTE4LCAxNzEsIDIyMSwgIDcyLA0KKyAgIDEyMiwgMTc1LCAyMjUsICA3NywgMTI3LCAxODAsIDIzMCwgIDgxLCAxMzEsIDE4NCwNCisgICAyMzQsICA4NiwgMTM2LCAxODksIDIzOSwgIDkwLCAxNDAsIDE5MywgMjQzLCAgNjAsDQorICAgMTEwLCAxNjMsIDIxMywgIDY0LCAxMTQsIDE2NywgMjE3LCAgNjksIDExOSwgMTcyLA0KKyAgIDIyMiwgIDczLCAxMjMsIDE3NiwgMjI2LCAgNzgsIDEyOCwgMTgxLCAyMzEsICA4MiwNCisgICAxMzIsIDE4NSwgMjM1LCAgODcsIDEzNywgMTkwLCAyNDAsICA5MSwgMTQxLCAxOTQsDQorICAgMjQ0LCAgNjEsIDExMSwgMTY0LCAyMTQsICA2NSwgMTE1LCAxNjgsIDIxOCwgIDcwLA0KKyAgIDEyMCwgMTczLCAyMjMsICA3NCwgMTI0LCAxNzcsIDIyNywgIDc5LCAxMjksIDE4MiwNCisgICAyMzIsICA4MywgMTMzLCAxODYsIDIzNiwgIDg4LCAxMzgsIDE5MSwgMjQxLCAgOTIsDQorICAgMTQyLCAxOTUsIDI0NSAgICAgICAgICAgICAgICAgICAgICAgICANCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF8xNDI1WzI4NV0gPSB7DQorICAgICAwLCAgIDQsICAgNiwgMTAxLCAxNTksIDIyMCwgMjc4LCAgIDcsICAgNSwgICAzLA0KKyAgICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwNCisgICAxMDIsIDE2MCwgMjIxLCAyNzksIDEwNywgMTY1LCAyMjYsIDI4NCwgMTA0LCAxNjIsDQorICAgMjIzLCAyODEsIDEwNSwgMTYzLCAyMjQsIDI4MiwgMTA4LCAyMjcsIDEwNiwgMTY0LA0KKyAgIDIyNSwgMjgzLCAxMDMsIDE2MSwgMjIyLCAyODAsICA1MiwgICAyLCAgIDEsIDEwOSwNCisgICAyMjgsIDE3MSwgIDE5LCAgMjEsICAxMiwgIDE3LCAgMTgsICAyMCwgIDE2LCAgMjUsDQorICAgIDEzLCAgMTAsICAxNCwgIDI0LCAgMjMsICAyMiwgIDI2LCAgIDgsICAxNSwgIDUzLA0KKyAgIDE3MiwgIDMxLCAxMTAsIDIyOSwgICA5LCAgMzMsICAxMSwgMTExLCAyMzAsICA1NCwNCisgICAxNzMsICAyOCwgIDI3LCAxMTIsIDIzMSwgIDM0LCAgMzUsICAyOSwgIDQ2LCAgMzIsDQorICAgIDMwLCAgNTUsIDE3NCwgIDM3LCAgMzYsICAzOSwgIDM4LCAgNDAsIDExMywgMjMyLA0KKyAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNTYsIDExNCwgMTc1LCAyMzMsICA2MiwNCisgICAxMjAsIDE4MSwgMjM5LCAgNzUsIDEzMywgMTk0LCAyNTIsICA1NywgMTE1LCAxNzYsDQorICAgMjM0LCAgNjMsIDEyMSwgMTgyLCAyNDAsICA3MCwgMTI4LCAxODksIDI0NywgIDc2LA0KKyAgIDEzNCwgMTk1LCAyNTMsICA4MywgMTQxLCAyMDIsIDI2MCwgIDkyLCAxNTAsIDIxMSwNCisgICAyNjksICA4NCwgMTQyLCAyMDMsIDI2MSwgIDkzLCAxNTEsIDIxMiwgMjcwLCAgODUsDQorICAgMTQzLCAyMDQsIDI2MiwgIDk0LCAxNTIsIDIxMywgMjcxLCAgODYsIDE0NCwgMjA1LA0KKyAgIDI2MywgIDk1LCAxNTMsIDIxNCwgMjcyLCAgNjQsIDEyMiwgMTgzLCAyNDEsICA3NywNCisgICAxMzUsIDE5NiwgMjU0LCAgNjUsIDEyMywgMTg0LCAyNDIsICA3OCwgMTM2LCAxOTcsDQorICAgMjU1LCAgODcsIDE0NSwgMjA2LCAyNjQsICA5NiwgMTU0LCAyMTUsIDI3MywgIDU4LA0KKyAgIDExNiwgMTc3LCAyMzUsICA2NiwgMTI0LCAxODUsIDI0MywgIDcxLCAxMjksIDE5MCwNCisgICAyNDgsICA3OSwgMTM3LCAxOTgsIDI1NiwgIDg4LCAxNDYsIDIwNywgMjY1LCAgOTcsDQorICAgMTU1LCAyMTYsIDI3NCwgIDU5LCAxMTcsIDE3OCwgMjM2LCAgNjcsIDEyNSwgMTg2LA0KKyAgIDI0NCwgIDcyLCAxMzAsIDE5MSwgMjQ5LCAgODAsIDEzOCwgMTk5LCAyNTcsICA4OSwNCisgICAxNDcsIDIwOCwgMjY2LCAgOTgsIDE1NiwgMjE3LCAyNzUsICA2MCwgMTE4LCAxNzksDQorICAgMjM3LCAgNjgsIDEyNiwgMTg3LCAyNDUsICA3MywgMTMxLCAxOTIsIDI1MCwgIDgxLA0KKyAgIDEzOSwgMjAwLCAyNTgsICA5MCwgMTQ4LCAyMDksIDI2NywgIDk5LCAxNTcsIDIxOCwNCisgICAyNzYsICA2MSwgMTE5LCAxODAsIDIzOCwgIDY5LCAxMjcsIDE4OCwgMjQ2LCAgNzQsDQorICAgMTMyLCAxOTMsIDI1MSwgIDgyLCAxNDAsIDIwMSwgMjU5LCAgOTEsIDE0OSwgMjEwLA0KKyAgIDI2OCwgMTAwLCAxNTgsIDIxOSwgMjc3DQorfTsNCisNCitzdGF0aWMgV29yZDE2IHNvcnRfMTU4NVszMTddID0gew0KKyAgICAgMCwgICA0LCAgIDYsIDEwOSwgMTc1LCAyNDQsIDMxMCwgICA3LCAgIDUsICAgMywNCisgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsDQorICAgMTEwLCAxNzYsIDI0NSwgMzExLCAxMTUsIDE4MSwgMjUwLCAzMTYsIDExMiwgMTc4LA0KKyAgIDI0NywgMzEzLCAxMTMsIDE3OSwgMjQ4LCAzMTQsIDExNiwgMjUxLCAxMTQsIDE4MCwNCisgICAyNDksIDMxNSwgMTExLCAxNzcsIDI0NiwgMzEyLCAgNTIsICAgMiwgICAxLCAxMTcsDQorICAgMjUyLCAxODcsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LA0KKyAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywNCisgICAxODgsICAzMSwgMTE4LCAyNTMsICAgOSwgIDMzLCAgMTEsIDExOSwgMjU0LCAgNTQsDQorICAgMTg5LCAgMjgsICAyNywgMTIwLCAyNTUsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLA0KKyAgICAzMCwgIDU1LCAxOTAsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxMjEsIDI1NiwNCisgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxMjIsIDE5MSwgMjU3LCAgNjMsDQorICAgMTI5LCAxOTgsIDI2NCwgIDc2LCAxNDIsIDIxMSwgMjc3LCAgODksIDE1NSwgMjI0LA0KKyAgIDI5MCwgMTAyLCAxNjgsIDIzNywgMzAzLCAgNTcsIDEyMywgMTkyLCAyNTgsICA3MCwNCisgICAxMzYsIDIwNSwgMjcxLCAgODMsIDE0OSwgMjE4LCAyODQsICA5NiwgMTYyLCAyMzEsDQorICAgMjk3LCAgNjIsIDEyOCwgMTk3LCAyNjMsICA3NSwgMTQxLCAyMTAsIDI3NiwgIDg4LA0KKyAgIDE1NCwgMjIzLCAyODksIDEwMSwgMTY3LCAyMzYsIDMwMiwgIDU4LCAxMjQsIDE5MywNCisgICAyNTksICA3MSwgMTM3LCAyMDYsIDI3MiwgIDg0LCAxNTAsIDIxOSwgMjg1LCAgOTcsDQorICAgMTYzLCAyMzIsIDI5OCwgIDU5LCAxMjUsIDE5NCwgMjYwLCAgNjQsIDEzMCwgMTk5LA0KKyAgIDI2NSwgIDY3LCAxMzMsIDIwMiwgMjY4LCAgNzIsIDEzOCwgMjA3LCAyNzMsICA3NywNCisgICAxNDMsIDIxMiwgMjc4LCAgODAsIDE0NiwgMjE1LCAyODEsICA4NSwgMTUxLCAyMjAsDQorICAgMjg2LCAgOTAsIDE1NiwgMjI1LCAyOTEsICA5MywgMTU5LCAyMjgsIDI5NCwgIDk4LA0KKyAgIDE2NCwgMjMzLCAyOTksIDEwMywgMTY5LCAyMzgsIDMwNCwgMTA2LCAxNzIsIDI0MSwNCisgICAzMDcsICA2MCwgMTI2LCAxOTUsIDI2MSwgIDY1LCAxMzEsIDIwMCwgMjY2LCAgNjgsDQorICAgMTM0LCAyMDMsIDI2OSwgIDczLCAxMzksIDIwOCwgMjc0LCAgNzgsIDE0NCwgMjEzLA0KKyAgIDI3OSwgIDgxLCAxNDcsIDIxNiwgMjgyLCAgODYsIDE1MiwgMjIxLCAyODcsICA5MSwNCisgICAxNTcsIDIyNiwgMjkyLCAgOTQsIDE2MCwgMjI5LCAyOTUsICA5OSwgMTY1LCAyMzQsDQorICAgMzAwLCAxMDQsIDE3MCwgMjM5LCAzMDUsIDEwNywgMTczLCAyNDIsIDMwOCwgIDYxLA0KKyAgIDEyNywgMTk2LCAyNjIsICA2NiwgMTMyLCAyMDEsIDI2NywgIDY5LCAxMzUsIDIwNCwNCisgICAyNzAsICA3NCwgMTQwLCAyMDksIDI3NSwgIDc5LCAxNDUsIDIxNCwgMjgwLCAgODIsDQorICAgMTQ4LCAyMTcsIDI4MywgIDg3LCAxNTMsIDIyMiwgMjg4LCAgOTIsIDE1OCwgMjI3LA0KKyAgIDI5MywgIDk1LCAxNjEsIDIzMCwgMjk2LCAxMDAsIDE2NiwgMjM1LCAzMDEsIDEwNSwNCisgICAxNzEsIDI0MCwgMzA2LCAxMDgsIDE3NCwgMjQzLCAzMDkNCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF8xODI1WzM2NV0gPSB7DQorICAgICAwLCAgIDQsICAgNiwgMTIxLCAxOTksIDI4MCwgMzU4LCAgIDcsICAgNSwgICAzLA0KKyAgICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwNCisgICAxMjIsIDIwMCwgMjgxLCAzNTksIDEyNywgMjA1LCAyODYsIDM2NCwgMTI0LCAyMDIsDQorICAgMjgzLCAzNjEsIDEyNSwgMjAzLCAyODQsIDM2MiwgMTI4LCAyODcsIDEyNiwgMjA0LA0KKyAgIDI4NSwgMzYzLCAxMjMsIDIwMSwgMjgyLCAzNjAsICA1MiwgICAyLCAgIDEsIDEyOSwNCisgICAyODgsIDIxMSwgIDE5LCAgMjEsICAxMiwgIDE3LCAgMTgsICAyMCwgIDE2LCAgMjUsDQorICAgIDEzLCAgMTAsICAxNCwgIDI0LCAgMjMsICAyMiwgIDI2LCAgIDgsICAxNSwgIDUzLA0KKyAgIDIxMiwgIDMxLCAxMzAsIDI4OSwgICA5LCAgMzMsICAxMSwgMTMxLCAyOTAsICA1NCwNCisgICAyMTMsICAyOCwgIDI3LCAxMzIsIDI5MSwgIDM0LCAgMzUsICAyOSwgIDQ2LCAgMzIsDQorICAgIDMwLCAgNTUsIDIxNCwgIDM3LCAgMzYsICAzOSwgIDM4LCAgNDAsIDEzMywgMjkyLA0KKyAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNTYsIDEzNCwgMjE1LCAyOTMsIDE5OCwNCisgICAyOTksIDEzNiwgMTIwLCAxMzgsICA2MCwgMjc5LCAgNTgsICA2MiwgMzU3LCAxMzksDQorICAgMTQwLCAyOTUsIDE1NiwgIDU3LCAyMTksIDI5NywgIDYzLCAyMTcsIDEzNywgMTcwLA0KKyAgIDMwMCwgMjIyLCAgNjQsIDEwNiwgIDYxLCAgNzgsIDI5NCwgIDkyLCAxNDIsIDE0MSwNCisgICAxMzUsIDIyMSwgMjk2LCAzMDEsIDM0MywgIDU5LCAyOTgsIDE4NCwgMzI5LCAzMTUsDQorICAgMjIwLCAyMTYsIDI2NSwgMjUxLCAyMTgsIDIzNywgMzUyLCAyMjMsIDE1NywgIDg2LA0KKyAgIDE3MSwgIDg3LCAxNjQsIDM1MSwgMTExLCAzMDIsICA2NSwgMTc4LCAxMTUsIDMyMywNCisgICAgNzIsIDE5MiwgMTAxLCAxNzksICA5MywgIDczLCAxOTMsIDE1MSwgMzM3LCAzMDksDQorICAgMTQzLCAyNzQsICA2OSwgMzI0LCAxNjUsIDE1MCwgIDk3LCAzMzgsIDExMCwgMzEwLA0KKyAgIDMzMCwgMjczLCAgNjgsIDEwNywgMTc1LCAyNDUsIDExNCwgIDc5LCAxMTMsIDE4OSwNCisgICAyNDYsIDI1OSwgMTc0LCAgNzEsIDE4NSwgIDk2LCAzNDQsIDEwMCwgMzIyLCAgODMsDQorICAgMzM0LCAzMTYsIDMzMywgMjUyLCAxNjEsIDM0OCwgMTQ3LCAgODIsIDI2OSwgMjMyLA0KKyAgIDI2MCwgMzA4LCAzNTMsIDM0NywgMTYzLCAyMzEsIDMwNiwgMzIwLCAxODgsIDI3MCwNCisgICAxNDYsIDE3NywgMjY2LCAzNTAsIDI1NiwgIDg1LCAxNDksIDExNiwgMTkxLCAxNjAsDQorICAgMjM4LCAyNTgsIDMzNiwgMzA1LCAyNTUsICA4OCwgMjI0LCAgOTksIDMzOSwgMjMwLA0KKyAgIDIyOCwgMjI3LCAyNzIsIDI0MiwgMjQxLCAzMTksIDIzMywgMzExLCAxMDIsICA3NCwNCisgICAxODAsIDI3NSwgIDY2LCAxOTQsIDE1MiwgMzI1LCAxNzIsIDI0NywgMjQ0LCAyNjEsDQorICAgMTE3LCAxNTgsIDE2NiwgMzU0LCAgNzUsIDE0NCwgMTA4LCAzMTIsICA5NCwgMTg2LA0KKyAgIDMwMywgIDgwLCAyMzQsICA4OSwgMTk1LCAxMTIsIDM0MCwgMTgxLCAzNDUsIDMxNywNCisgICAzMjYsIDI3NiwgMjM5LCAxNjcsIDExOCwgMzEzLCAgNzAsIDM1NSwgMzI3LCAyNTMsDQorICAgMTkwLCAxNzYsIDI3MSwgMTA0LCAgOTgsIDE1MywgMTAzLCAgOTAsICA3NiwgMjY3LA0KKyAgIDI3NywgMjQ4LCAyMjUsIDI2MiwgMTgyLCAgODQsIDE1NCwgMjM1LCAzMzUsIDE2OCwNCisgICAzMzEsIDE5NiwgMzQxLCAyNDksIDE2MiwgMzA3LCAxNDgsIDM0OSwgMjYzLCAzMjEsDQorICAgMjU3LCAyNDMsIDIyOSwgMzU2LCAxNTksIDExOSwgIDY3LCAxODcsIDE3MywgMTQ1LA0KKyAgIDI0MCwgIDc3LCAzMDQsIDMzMiwgMzE0LCAzNDIsIDEwOSwgMjU0LCAgODEsIDI3OCwNCisgICAxMDUsICA5MSwgMzQ2LCAzMTgsIDE4MywgMjUwLCAxOTcsIDMyOCwgIDk1LCAxNTUsDQorICAgMTY5LCAyNjgsIDIyNiwgMjM2LCAyNjQgICAgICAgICAgICAgICAgIA0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzE5ODVbMzk3XSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAxMjksIDIxNSwgMzA0LCAzOTAsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LA0KKyAgIDEzMCwgMjE2LCAzMDUsIDM5MSwgMTM1LCAyMjEsIDMxMCwgMzk2LCAxMzIsIDIxOCwNCisgICAzMDcsIDM5MywgMTMzLCAyMTksIDMwOCwgMzk0LCAxMzYsIDMxMSwgMTM0LCAyMjAsDQorICAgMzA5LCAzOTUsIDEzMSwgMjE3LCAzMDYsIDM5MiwgIDUyLCAgIDIsICAgMSwgMTM3LA0KKyAgIDMxMiwgMjI3LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMjI4LCAgMzEsIDEzOCwgMzEzLCAgIDksICAzMywgIDExLCAxMzksIDMxNCwgIDU0LA0KKyAgIDIyOSwgIDI4LCAgMjcsIDE0MCwgMzE1LCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwNCisgICAgMzAsICA1NSwgMjMwLCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTQxLCAzMTYsDQorICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTQyLCAyMzEsIDMxNywgIDYzLA0KKyAgICA3MywgIDkyLCAzNDAsICA4MiwgMzI0LCAxNDksIDM1MywgMTU5LCAzMzQsIDE2NSwNCisgICAzMzgsIDE3OCwgMTYzLCAyNTQsICA3NywgMTY4LCAyNTcsIDE1MywgMzQzLCAgNTcsDQorICAgMjQ4LCAyMzgsICA3OSwgMjUyLCAxNjYsICA2NywgIDgwLCAyMDEsIDEwMSwgMjY3LA0KKyAgIDE0MywgMTY0LCAzNDEsIDI1NSwgMzM5LCAxODcsIDM3NiwgMzE4LCAgNzgsIDMyOCwNCisgICAzNjIsIDExNSwgMjMyLCAyNDIsIDI1MywgMjkwLCAyNzYsICA2MiwgIDU4LCAxNTgsDQorICAgIDY4LCAgOTMsIDE3OSwgMzE5LCAxNDgsIDE2OSwgMTU0LCAgNzIsIDM4NSwgMzI5LA0KKyAgIDMzMywgMzQ0LCAxMDIsICA4MywgMTQ0LCAyMzMsIDMyMywgMTI0LCAyNDMsIDE5MiwNCisgICAzNTQsIDIzNywgIDY0LCAyNDcsIDIwMiwgMjA5LCAxNTAsIDExNiwgMzM1LCAyNjgsDQorICAgMjM5LCAyOTksIDE4OCwgMTk2LCAyOTgsICA5NCwgMTk1LCAyNTgsIDEyMywgMzYzLA0KKyAgIDM4NCwgMTA5LCAzMjUsIDM3MSwgMTcwLCAzNzAsICA4NCwgMTEwLCAyOTUsIDE4MCwNCisgICAgNzQsIDIxMCwgMTkxLCAxMDYsIDI5MSwgMjA1LCAzNjcsIDM4MSwgMzc3LCAyMDYsDQorICAgMzU1LCAxMjIsIDExOSwgMTIwLCAzODMsIDE2MCwgMTA1LCAxMDgsIDI3NywgMzgwLA0KKyAgIDI5NCwgMjg0LCAyODUsIDM0NSwgMjA4LCAyNjksIDI0OSwgMzY2LCAzODYsIDMwMCwNCisgICAyOTcsIDI1OSwgMTI1LCAzNjksIDE5NywgIDk3LCAxOTQsIDI4NiwgMjExLCAyODEsDQorICAgMjgwLCAxODMsIDM3MiwgIDg3LCAxNTUsIDI4MywgIDU5LCAzNDgsIDMyNywgMTg0LA0KKyAgICA3NiwgMTExLCAzMzAsIDIwMywgMzQ5LCAgNjksICA5OCwgMTUyLCAxNDUsIDE4OSwNCisgICAgNjYsIDMyMCwgMzM3LCAxNzMsIDM1OCwgMjUxLCAxOTgsIDE3NCwgMjYzLCAyNjIsDQorICAgMTI2LCAyNDEsIDE5MywgIDg4LCAzODgsIDExNywgIDk1LCAzODcsIDExMiwgMzU5LA0KKyAgIDI4NywgMjQ0LCAxMDMsIDI3MiwgMzAxLCAxNzEsIDE2MiwgMjM0LCAyNzMsIDEyNywNCisgICAzNzMsIDE4MSwgMjkyLCAgODUsIDM3OCwgMzAyLCAxMjEsIDEwNywgMzY0LCAzNDYsDQorICAgMzU2LCAyMTIsIDI3OCwgMjEzLCAgNjUsIDM4MiwgMjg4LCAyMDcsIDExMywgMTc1LA0KKyAgICA5OSwgMjk2LCAzNzQsIDM2OCwgMTk5LCAyNjAsIDE4NSwgMzM2LCAzMzEsIDE2MSwNCisgICAyNzAsIDI2NCwgMjUwLCAyNDAsICA3NSwgMzUwLCAxNTEsICA2MCwgIDg5LCAzMjEsDQorICAgMTU2LCAyNzQsIDM2MCwgMzI2LCAgNzAsIDI4MiwgMTY3LCAxNDYsIDM1MiwgIDgxLA0KKyAgICA5MSwgMzg5LCAyNjYsIDI0NSwgMTc3LCAyMzUsIDE5MCwgMjU2LCAyMDQsIDM0MiwNCisgICAxMjgsIDExOCwgMzAzLCAxMDQsIDM3OSwgMTgyLCAxMTQsIDM3NSwgMjAwLCAgOTYsDQorICAgMjkzLCAxNzIsIDIxNCwgMzY1LCAyNzksICA4NiwgMjg5LCAzNTEsIDM0NywgMzU3LA0KKyAgIDI2MSwgMTg2LCAxNzYsIDI3MSwgIDkwLCAxMDAsIDE0NywgMzIyLCAyNzUsIDM2MSwNCisgICAgNzEsIDMzMiwgIDYxLCAyNjUsIDE1NywgMjQ2LCAyMzYgICAgICAgICANCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF8yMzA1WzQ2MV0gPSB7DQorICAgICAwLCAgIDQsICAgNiwgMTQ1LCAyNDcsIDM1MiwgNDU0LCAgIDcsICAgNSwgICAzLA0KKyAgICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwNCisgICAxNDYsIDI0OCwgMzUzLCA0NTUsIDE1MSwgMjUzLCAzNTgsIDQ2MCwgMTQ4LCAyNTAsDQorICAgMzU1LCA0NTcsIDE0OSwgMjUxLCAzNTYsIDQ1OCwgMTUyLCAzNTksIDE1MCwgMjUyLA0KKyAgIDM1NywgNDU5LCAxNDcsIDI0OSwgMzU0LCA0NTYsICA1MiwgICAyLCAgIDEsIDE1MywNCisgICAzNjAsIDI1OSwgIDE5LCAgMjEsICAxMiwgIDE3LCAgMTgsICAyMCwgIDE2LCAgMjUsDQorICAgIDEzLCAgMTAsICAxNCwgIDI0LCAgMjMsICAyMiwgIDI2LCAgIDgsICAxNSwgIDUzLA0KKyAgIDI2MCwgIDMxLCAxNTQsIDM2MSwgICA5LCAgMzMsICAxMSwgMTU1LCAzNjIsICA1NCwNCisgICAyNjEsICAyOCwgIDI3LCAxNTYsIDM2MywgIDM0LCAgMzUsICAyOSwgIDQ2LCAgMzIsDQorICAgIDMwLCAgNTUsIDI2MiwgIDM3LCAgMzYsICAzOSwgIDM4LCAgNDAsIDE1NywgMzY0LA0KKyAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNTYsIDE1OCwgMjYzLCAzNjUsIDE4MSwNCisgICAxOTIsIDE3MCwgIDc5LCAgNTcsIDM5OSwgIDkwLCAxNTksIDI5NywgMzc3LCAzNjYsDQorICAgMjc1LCAgNjgsIDE4MywgMzg4LCAyODYsIDE5NCwgMjk5LCA5MiAsICA3MCwgMTgyLA0KKyAgIDQwMSwgMTcyLCAgNTksICA5MSwgIDU4LCA0MDAsIDM2OCwgMTYxLCAgODEsIDE2MCwNCisgICAyNjQsIDE3MSwgIDgwLCAzODksIDM5MCwgMzc4LCAzNzksIDE5MywgMjk4LCAgNjksDQorICAgMjY2LCAyNjUsIDM2NywgMjc3LCAyODgsIDI3NiwgMjg3LCAxODQsICA2MCwgMTk1LA0KKyAgICA4MiwgIDkzLCAgNzEsIDM2OSwgNDAyLCAxNzMsIDE2MiwgNDQ0LCAzMDAsIDM5MSwNCisgICAgOTgsICA3NiwgMjc4LCAgNjEsIDI2NywgMzc0LCAxMzUsIDQxMSwgMTY3LCAxMDIsDQorICAgMzgwLCAyMDAsICA4NywgMTc4LCAgNjUsICA5NCwgMjA0LCAxMjQsICA3MiwgMzQyLA0KKyAgIDE4OSwgMzA1LCAzODEsIDM5NiwgNDMzLCAzMDEsIDIyNiwgNDA3LCAyODksIDIzNywNCisgICAxMTMsIDIxNSwgMTg1LCAxMjgsIDMwOSwgNDAzLCAxMTYsIDMyMCwgMTk2LCAzMzEsDQorICAgMzcwLCA0MjIsIDE3NCwgIDY0LCAzOTIsICA4MywgNDI1LCAyMTksIDEzNCwgMTg4LA0KKyAgIDQzMiwgMTEyLCA0MjcsIDEzOSwgMjc5LCAxNjMsIDQzNiwgMjA4LCA0NDcsIDIxOCwNCisgICAyMzYsIDIyOSwgIDk3LCAyOTQsIDM4NSwgMjMwLCAxNjYsIDI2OCwgMTc3LCA0NDMsDQorICAgMjI1LCA0MjYsIDEwMSwgMjcyLCAxMzgsIDEyNywgMjkwLCAxMTcsIDM0NywgMTk5LA0KKyAgIDQxNCwgIDk1LCAxNDAsIDI0MCwgNDEwLCAzOTUsIDIwOSwgMTI5LCAyODMsIDM0NiwNCisgICAxMDUsIDI0MSwgNDM3LCAgODYsIDMwOCwgNDQ4LCAyMDMsIDM0NSwgMTg2LCAxMDcsDQorICAgMjIwLCA0MTUsIDMzNCwgMzE5LCAxMDYsIDMxMywgMTE4LCAxMjMsICA3MywgMjA3LA0KKyAgIDQyMSwgMjE0LCAzODQsIDM3MywgNDM4LCAgNjIsIDM3MSwgMzQxLCAgNzUsIDQ0OSwNCisgICAxNjgsIDMyMywgMTY0LCAyNDIsIDQxNiwgMzI0LCAzMDQsIDE5NywgMzM1LCA0MDQsDQorICAgMjcxLCAgNjMsIDE5MSwgMzI1LCAgOTYsIDE2OSwgMjMxLCAyODAsIDMxMiwgMTg3LA0KKyAgIDQwNiwgIDg0LCAyMDEsIDEwMCwgIDY3LCAzODIsIDE3NSwgMzM2LCAyMDIsIDMzMCwNCisgICAyNjksIDM5MywgMzc2LCAzODMsIDI5MywgMzA3LCA0MDksIDE3OSwgMjg1LCAzMTQsDQorICAgMzAyLCAzNzIsIDM5OCwgMTkwLCAxODAsICA4OSwgIDk5LCAxMDMsIDIzMiwgIDc4LA0KKyAgICA4OCwgIDc3LCAxMzYsIDM4NywgMTY1LCAxOTgsIDM5NCwgMTI1LCAxNzYsIDQyOCwNCisgICAgNzQsIDM3NSwgMjM4LCAyMjcsICA2NiwgMjczLCAyODIsIDE0MSwgMzA2LCA0MTIsDQorICAgMTE0LCAgODUsIDEzMCwgMzQ4LCAxMTksIDI5MSwgMjk2LCAzODYsIDIzMywgMzk3LA0KKyAgIDMwMywgNDA1LCAyODQsIDQ0NSwgNDIzLCAyMjEsIDIxMCwgMjA1LCA0NTAsIDEwOCwNCisgICAyNzQsIDQzNCwgMjE2LCAzNDMsIDMzNywgMTQyLCAyNDMsIDMyMSwgNDA4LCA0NTEsDQorICAgMzEwLCAyOTIsIDEyMCwgMTA5LCAyODEsIDQzOSwgMjcwLCA0MjksIDMzMiwgMjk1LA0KKyAgIDQxOCwgMjExLCAzMTUsIDIyMiwgMzI2LCAxMzEsIDQzMCwgMjQ0LCAzMjcsIDM0OSwNCisgICA0MTcsIDMxNiwgMTQzLCAzMzgsIDQ0MCwgMjM0LCAxMTAsIDIxMiwgNDUyLCAyNDUsDQorICAgMTIxLCA0MTksIDM1MCwgMjIzLCAxMzIsIDQ0MSwgMzI4LCA0MTMsIDMxNywgMzM5LA0KKyAgIDEyNiwgMTA0LCAxMzcsIDQ0NiwgMzQ0LCAyMzksIDQzNSwgMTE1LCAzMzMsIDIwNiwNCisgICAzMjIsIDIxNywgMjI4LCA0MjQsIDQ1MywgMzExLCAzNTEsIDExMSwgNDQyLCAyMjQsDQorICAgMjEzLCAxMjIsIDQzMSwgMzQwLCAyMzUsIDI0NiwgMTMzLCAxNDQsIDQyMCwgMzI5LA0KKyAgIDMxOA0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzIzODVbNDc3XSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAxNDUsIDI1MSwgMzYwLCA0NjYsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LA0KKyAgIDE0NiwgMjUyLCAzNjEsIDQ2NywgMTUxLCAyNTcsIDM2NiwgNDcyLCAxNDgsIDI1NCwNCisgICAzNjMsIDQ2OSwgMTQ5LCAyNTUsIDM2NCwgNDcwLCAxNTYsIDM3MSwgMTUwLCAyNTYsDQorICAgMzY1LCA0NzEsIDE0NywgMjUzLCAzNjIsIDQ2OCwgIDUyLCAgIDIsICAgMSwgMTU3LA0KKyAgIDM3MiwgMjY3LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMjY4LCAgMzEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMjU4LCAyNTksIDI2MCwgMjYxLA0KKyAgIDM2NywgMzY4LCAzNjksIDM3MCwgNDczLCA0NzQsIDQ3NSwgNDc2LCAxNTgsIDM3MywNCisgICAgIDksICAzMywgIDExLCAxNTksIDM3NCwgIDU0LCAyNjksICAyOCwgIDI3LCAxNjAsDQorICAgMzc1LCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwgIDMwLCAgNTUsIDI3MCwgMzcsDQorICAgIDM2LCAgMzksICAzOCwgIDQwLCAxNjEsIDM3NiwgIDQxLCAgNDIsICA0MywgIDQ0LA0KKyAgICA0NSwgIDU2LCAxNjIsIDI3MSwgMzc3LCAxODUsIDE5NiwgMTc0LCAgNzksICA1NywNCisgICA0MTEsICA5MCwgMTYzLCAzMDUsIDM4OSwgMzc4LCAyODMsICA2OCwgMTg3LCA0MDAsDQorICAgMjk0LCAxOTgsIDMwNywgIDkyLCAgNzAsIDE4NiwgNDEzLCAxNzYsICA1OSwgIDkxLA0KKyAgICA1OCwgNDEyLCAzODAsIDE2NSwgIDgxLCAxNjQsIDI3MiwgMTc1LCAgODAsIDQwMSwNCisgICA0MDIsIDM5MCwgMzkxLCAxOTcsIDMwNiwgIDY5LCAyNzQsIDI3MywgMzc5LCAyODUsDQorICAgMjk2LCAyODQsIDI5NSwgMTg4LCAgNjAsIDE5OSwgIDgyLCAgOTMsICA3MSwgMzgxLA0KKyAgIDQxNCwgMTc3LCAxNjYsIDQ1NiwgMzA4LCA0MDMsICA5OCwgIDc2LCAyODYsICA2MSwNCisgICAyNzUsIDM4NiwgMTM1LCA0MjMsIDE3MSwgMTAyLCAzOTIsIDIwNCwgIDg3LCAxODIsDQorICAgIDY1LCAgOTQsIDIwOCwgMTI0LCAgNzIsIDM1MCwgMTkzLCAzMTMsIDM5MywgNDA4LA0KKyAgIDQ0NSwgMzA5LCAyMzAsIDQxOSwgMjk3LCAyNDEsIDExMywgMjE5LCAxODksIDEyOCwNCisgICAzMTcsIDQxNSwgMTE2LCAzMjgsIDIwMCwgMzM5LCAzODIsIDQzNCwgMTc4LCAgNjQsDQorICAgNDA0LCAgODMsIDQzNywgMjIzLCAxMzQsIDE5MiwgNDQ0LCAxMTIsIDQzOSwgMTM5LA0KKyAgIDI4NywgMTY3LCA0NDgsIDIxMiwgNDU5LCAyMjIsIDI0MCwgMjMzLCAgOTcsIDMwMiwNCisgICAzOTcsIDIzNCwgMTcwLCAyNzYsIDE4MSwgNDU1LCAyMjksIDQzOCwgMTAxLCAyODAsDQorICAgMTM4LCAxMjcsIDI5OCwgMTE3LCAzNTUsIDIwMywgNDI2LCAgOTUsIDE0MCwgMjQ0LA0KKyAgIDQyMiwgNDA3LCAyMTMsIDEyOSwgMjkxLCAzNTQsIDEwNSwgMjQ1LCA0NDksICA4NiwNCisgICAzMTYsIDQ2MCwgMjA3LCAzNTMsIDE5MCwgMTA3LCAyMjQsIDQyNywgMzQyLCAzMjcsDQorICAgMTA2LCAzMjEsIDExOCwgMTIzLCAgNzMsIDIxMSwgNDMzLCAyMTgsIDM5NiwgMzg1LA0KKyAgIDQ1MCwgIDYyLCAzODMsIDM0OSwgIDc1LCA0NjEsIDE3MiwgMzMxLCAxNjgsIDI0NiwNCisgICA0MjgsIDMzMiwgMzEyLCAyMDEsIDM0MywgNDE2LCAyNzksICA2MywgMTk1LCAzMzMsDQorICAgIDk2LCAxNzMsIDIzNSwgMjg4LCAzMjAsIDE5MSwgNDE4LCAgODQsIDIwNSwgMTAwLA0KKyAgICA2NywgMzk0LCAxNzksIDM0NCwgMjA2LCAzMzgsIDI3NywgNDA1LCAzODgsIDM5NSwNCisgICAzMDEsIDMxNSwgNDIxLCAxODMsIDI5MywgMzIyLCAzMTAsIDM4NCwgNDEwLCAxOTQsDQorICAgMTg0LCAgODksICA5OSwgMTAzLCAyMzYsICA3OCwgIDg4LCAgNzcsIDEzNiwgMzk5LA0KKyAgIDE2OSwgMjAyLCA0MDYsIDEyNSwgMTgwLCA0NDAsICA3NCwgMzg3LCAyNDIsIDIzMSwNCisgICAgNjYsIDI4MSwgMjkwLCAxNDEsIDMxNCwgNDI0LCAxMTQsICA4NSwgMTMwLCAzNTYsDQorICAgMTE5LCAyOTksIDMwNCwgMzk4LCAyMzcsIDQwOSwgMzExLCA0MTcsIDI5MiwgNDU3LA0KKyAgIDQzNSwgMjI1LCAyMTQsIDIwOSwgNDYyLCAxMDgsIDI4MiwgNDQ2LCAyMjAsIDM1MSwNCisgICAzNDUsIDE0MiwgMjQ3LCAzMjksIDQyMCwgNDYzLCAzMTgsIDMwMCwgMTIwLCAxMDksDQorICAgMjg5LCA0NTEsIDI3OCwgNDQxLCAzNDAsIDMwMywgNDMwLCAyMTUsIDMyMywgMjI2LA0KKyAgIDMzNCwgMTMxLCA0NDIsIDI0OCwgMzM1LCAzNTcsIDQyOSwgMzI0LCAxNDMsIDM0NiwNCisgICA0NTIsIDIzOCwgMTEwLCAyMTYsIDQ2NCwgMjQ5LCAxMjEsIDQzMSwgMzU4LCAyMjcsDQorICAgMTMyLCA0NTMsIDMzNiwgNDI1LCAzMjUsIDM0NywgMTI2LCAxMDQsIDEzNywgNDU4LA0KKyAgIDM1MiwgMjQzLCA0NDcsIDExNSwgMzQxLCAyMTAsIDMzMCwgMjIxLCAyMzIsIDQzNiwNCisgICA0NjUsIDMxOSwgMzU5LCAxMTEsIDQ1NCwgMjI4LCAyMTcsIDEyMiwgNDQzLCAzNDgsDQorICAgMjM5LCAyNTAsIDEzMywgMTQ0LCA0MzIsIDMzNywgMzI2ICAgICAgICAgDQorfTsNCisNCitzdGF0aWMgV29yZDE2IHNvcnRfU0lEWzM1XSA9IHsNCisgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwNCisgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwNCisgICAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwNCisgICAzMCwgMzEsIDMyLCAzMywgMzQNCit9Ow0KKw0KKy8qIHBvaW50ZXIgdGFibGUgZm9yIGJpdCBzb3J0aW5nIHRhYmxlcyAqLw0KK3N0YXRpYyBXb3JkMTYgKnNvcnRfcHRyWzE2XSA9IHsgc29ydF82NjAsIHNvcnRfODg1LCBzb3J0XzEyNjUsIHNvcnRfMTQyNSwgc29ydF8xNTg1LCBzb3J0XzE4MjUsIHNvcnRfMTk4NSwgc29ydF8yMzA1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0XzIzODUsIHNvcnRfU0lELCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMfTsNCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL29wZXJfMzJiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL29wZXJfMzJiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1OWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaApAQCAtMCwwICsxLDMxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qIERvdWJsZSBwcmVjaXNpb24gb3BlcmF0aW9ucyAqLw0KKy8qICRJZCQgKi8NCisNCisjaWZuZGVmIF9fT1BFUl8zMkJfSF9fDQorI2RlZmluZSBfX09QRVJfMzJCX0hfXw0KKw0KK3ZvaWQgVk9fTF9FeHRyYWN0IChXb3JkMzIgTF8zMiwgV29yZDE2ICpoaSwgV29yZDE2ICpsbyk7DQorV29yZDMyIExfQ29tcCAoV29yZDE2IGhpLCBXb3JkMTYgbG8pOw0KK1dvcmQzMiBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpOw0KK1dvcmQzMiBNcHlfMzJfMTYgKFdvcmQxNiBoaSwgV29yZDE2IGxvLCBXb3JkMTYgbik7DQorV29yZDMyIERpdl8zMiAoV29yZDMyIExfbnVtLCBXb3JkMTYgZGVub21faGksIFdvcmQxNiBkZW5vbV9sbyk7DQorDQorI2VuZGlmIC8vX19PUEVSXzMyQl9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX28uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzRjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX28uaApAQCAtMCwwICsxLDUyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgUF9NRURfTy5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgIE1lZGlhbiBvcGVuLWxvb3AgbGFnIHNlYXJjaAkJCQkgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX1BfTUVEX09fSF9fDQorI2RlZmluZSBfX1BfTUVEX09fSF9fDQorDQorV29yZDE2IFBpdGNoX21lZF9vbCggICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogb3BlbiBsb29wIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgd3NwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc2lnbmFsIHVzZWQgdG8gY29tcHV0ZSB0aGUgb3BlbiBsb29wIHBpdGNoICovDQorCQkvKiB3c3BbLXBpdF9tYXhdIHRvIHdzcFstMV0gc2hvdWxkIGJlIGtub3duICAgKi8NCisJCVdvcmQxNiBMX21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBtaW5pbXVtIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMX21heCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBtYXhpbXVtIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMX2ZyYW1lLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBsZW5ndGggb2YgZnJhbWUgdG8gY29tcHV0ZSBwaXRjaCAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMXzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBvbGRfIG9wZW4tbG9vcCBwaXRjaCAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBub3JtYWxpemUgY29ycmVsYXRpb24gb2YgaHBfd3NwIGZvciB0aGUgTGFnICovDQorCQlXb3JkMTYgKiBocF93c3BfbWVtLCAgICAgICAgICAgICAgICAgIC8qIGk6byAgIDogbWVtb3J5IG9mIHRoZSBoeXBhc3MgZmlsdGVyIGZvciBocF93c3BbXSAobGc9OSkgICAqLw0KKwkJV29yZDE2ICogb2xkX2hwX3dzcCwgICAgICAgICAgICAgICAgICAvKiBpOm8gICA6IGh5cGFzcyB3c3BbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHdnaHRfZmxnICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzIHdlaWdodGluZyBmdW5jdGlvbiB1c2VkICAgICAgICAgICAgICAgICAqLw0KKwkJKTsNCisNCitXb3JkMTYgTWVkX29sYWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IDogbWVkaWFuIG9mICA1IHByZXZpb3VzIG9wZW4tbG9vcCBsYWdzICAgICAgICovDQorCQlXb3JkMTYgcHJldl9vbF9sYWcsICAgICAgICAgICAgICAgICAgIC8qIGlucHV0ICA6IHByZXZpb3VzIG9wZW4tbG9vcCBsYWcgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG9sZF9vbF9sYWdbNV0NCisJICAgICAgICk7DQorDQordm9pZCBIcF93c3AoDQorCQlXb3JkMTYgd3NwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHdzcFtdICBzaWduYWwgICAgICAgKi8NCisJCVdvcmQxNiBocF93c3BbXSwgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogaHlwYXNzIHdzcFtdICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBsZW5naHQgb2Ygc2lnbmFsICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGZpbHRlciBtZW1vcnkgWzldICAgKi8NCisJICAgKTsNCisNCisjZW5kaWYgIC8vX19QX01FRF9PX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfb2wudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vbC50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiZDFkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfb2wudGFiCkBAIC0wLDAgKzEsNDcgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgfCBUYWJsZSBmb3IgZnVuY3Rpb24gUGl0Y2hfbWVkX29sKCkJCQkJICAgfA0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyBzdGF0aWMgV29yZDE2IGNvcnJ3ZWlnaHRbMTk5XT0gew0KKw0KKyAxMDc3MiwgMTA3OTQsIDEwODE2LCAxMDgzOSwgMTA4NjIsIDEwODg1LCAxMDkwOCwgMTA5MzIsIDEwOTU1LCAxMDk4MCwNCisgMTEwMDQsIDExMDI5LCAxMTA1NCwgMTEwNzksIDExMTA1LCAxMTEzMSwgMTExNTcsIDExMTgzLCAxMTIxMCwgMTEyMzgsDQorIDExMjY1LCAxMTI5MywgMTEzMjIsIDExMzUwLCAxMTM3OSwgMTE0MDksIDExNDM5LCAxMTQ2OSwgMTE1MDAsIDExNTMxLA0KKyAxMTU2MywgMTE1OTUsIDExNjI4LCAxMTY2MSwgMTE2OTQsIDExNzI4LCAxMTc2MywgMTE3OTgsIDExODM0LCAxMTg3MCwNCisgMTE5MDcsIDExOTQ1LCAxMTk4MywgMTIwMjIsIDEyMDYxLCAxMjEwMSwgMTIxNDIsIDEyMTg0LCAxMjIyNiwgMTIyNzAsDQorIDEyMzE0LCAxMjM1OCwgMTI0MDQsIDEyNDUxLCAxMjQ5OCwgMTI1NDcsIDEyNTk2LCAxMjY0NywgMTI2OTksIDEyNzUxLA0KKyAxMjgwNSwgMTI4NjEsIDEyOTE3LCAxMjk3NSwgMTMwMzQsIDEzMDk1LCAxMzE1NywgMTMyMjEsIDEzMjg2LCAxMzM1MywNCisgMTM0MjIsIDEzNDkzLCAxMzU2NiwgMTM2NDEsIDEzNzE5LCAxMzc5OCwgMTM4ODAsIDEzOTY1LCAxNDA1MywgMTQxNDMsDQorIDE0MjM3LCAxNDMzNCwgMTQ0MzUsIDE0NTM5LCAxNDY0OCwgMTQ3NjEsIDE0ODc5LCAxNTAwMiwgMTUxMzAsIDE1MjY1LA0KKyAxNTQwNiwgMTU1NTQsIDE1NzEwLCAxNTg3NCwgMTYwNTYsIDE2Mzg0LCAxNjM4NCwgMTYzODQsIDE2Mzg0LCAxNjM4NCwNCisgMTYzODQsIDE2Mzg0LCAxNjA1NiwgMTU4NzQsIDE1NzEwLCAxNTU1NCwgMTU0MDYsIDE1MjY1LCAxNTEzMCwgMTUwMDIsDQorIDE0ODc5LCAxNDc2MSwgMTQ2NDgsIDE0NTM5LCAxNDQzNSwgMTQzMzQsIDE0MjM3LCAxNDE0MywgMTQwNTMsIDEzOTY1LA0KKyAxMzg4MCwgMTM3OTgsIDEzNzE5LCAxMzY0MSwgMTM1NjYsIDEzNDkzLCAxMzQyMiwgMTMzNTMsIDEzMjg2LCAxMzIyMSwNCisgMTMxNTcsIDEzMDk1LCAxMzAzNCwgMTI5NzUsIDEyOTE3LCAxMjg2MSwgMTI4MDUsIDEyNzUxLCAxMjY5OSwgMTI2NDcsDQorIDEyNTk2LCAxMjU0NywgMTI0OTgsIDEyNDUxLCAxMjQwNCwgMTIzNTgsIDEyMzE0LCAxMjI3MCwgMTIyMjYsIDEyMTg0LA0KKyAxMjE0MiwgMTIxMDEsIDEyMDYxLCAxMjAyMiwgMTE5ODMsIDExOTQ1LCAxMTkwNywgMTE4NzAsIDExODM0LCAxMTc5OCwNCisgMTE3NjMsIDExNzI4LCAxMTY5NCwgMTE2NjEsIDExNjI4LCAxMTU5NSwgMTE1NjMsIDExNTMxLCAxMTUwMCwgMTE0NjksDQorIDExNDM5LCAxMTQwOSwgMTEzNzksIDExMzUwLCAxMTMyMiwgMTEyOTMsIDExMjY1LCAxMTIzOCwgMTEyMTAsIDExMTgzLA0KKyAxMTE1NywgMTExMzEsIDExMTA1LCAxMTA3OSwgMTEwNTQsIDExMDI5LCAxMTAwNCwgMTA5ODAsIDEwOTU1LCAxMDkzMiwNCisgMTA5MDgsIDEwODg1LCAxMDg2MiwgMTA4MzksIDEwODE2LCAxMDc5NCwgMTA3NzIsIDEwNzUwLCAxMDcyOH07DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX2dhaW4yLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9nYWluMi50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwZGVlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9nYWluMi50YWIKQEAgLTAsMCArMSwyMjggQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogVGFibGVzIGZvciBmdW5jdGlvbiBxX2dhaW4yKCkgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGdfcGl0Y2goUTE0KSwgIGdfY29kZShRMTEpICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogcGl0Y2ggZ2FpbiBhcmUgb3JkZXJlZCBpbiB0YWJsZSB0byByZWR1Y2UgY29tcGxleGl0eSAqDQorICogZHVyaW5nIHF1YW50aXphdGlvbiBvZiBnYWlucy4gICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNkZWZpbmUgbmJfcXVhX2dhaW42YiAgNjQgICAgIC8qIE51bWJlciBvZiBxdWFudGl6YXRpb24gbGV2ZWwgKi8NCisjZGVmaW5lIG5iX3F1YV9nYWluN2IgIDEyOCAgICAvKiBOdW1iZXIgb2YgcXVhbnRpemF0aW9uIGxldmVsICovDQorDQorDQorc3RhdGljIFdvcmQxNiB0X3F1YV9nYWluNmJbNjQqMl0gPSB7DQorICAgMTU2NiwgIDEzMzIsDQorICAgMTU3NywgIDM1NTcsDQorICAgMzA3MSwgIDY0OTAsDQorICAgNDE5MywgMTAxNjMsDQorICAgNDQ5NiwgIDI1MzQsDQorICAgNTAxOSwgIDQ0ODgsDQorICAgNTU4NiwgMTU2MTQsDQorICAgNTcyNSwgIDE0MjIsDQorICAgNjQ1MywgICA1ODAsDQorICAgNjcyNCwgIDY4MzEsDQorICAgNzY1NywgIDM1MjcsDQorICAgODA3MiwgIDIwOTksDQorICAgODIzMiwgIDUzMTksDQorICAgODgyNywgIDg3NzUsDQorICAgOTc0MCwgIDI4NjgsDQorICAgOTg1NiwgIDE0NjUsDQorICAxMDA4NywgMTI0ODgsDQorICAxMDI0MSwgIDQ0NTMsDQorICAxMDg1OSwgIDY2MTgsDQorICAxMTMyMSwgIDM1ODcsDQorICAxMTQxNywgIDE4MDAsDQorICAxMTY0MywgIDI0MjgsDQorICAxMTcxOCwgICA5ODgsDQorICAxMjMxMiwgIDUwOTMsDQorICAxMjUyMywgIDg0MTMsDQorICAxMjU3NCwgMjYyMTQsDQorICAxMjYwMSwgIDMzOTYsDQorICAxMzE3MiwgIDE2MjMsDQorICAxMzI4NSwgIDI0MjMsDQorICAxMzQxOCwgIDYwODcsDQorICAxMzQ1OSwgMTI4MTAsDQorICAxMzY1NiwgIDM2MDcsDQorICAxNDExMSwgIDQ1MjEsDQorICAxNDE0NCwgIDEyMjksDQorICAxNDQyNSwgIDE4NzEsDQorICAxNDQzMSwgIDcyMzQsDQorICAxNDQ0NSwgIDI4MzQsDQorICAxNDYyOCwgMTAwMzYsDQorICAxNDg2MCwgMTc0OTYsDQorICAxNTE2MSwgIDM2MjksDQorICAxNTIwOSwgIDU4MTksDQorICAxNTI5OSwgIDIyNTYsDQorICAxNTUxOCwgIDQ3MjIsDQorICAxNTY2MywgIDEwNjAsDQorICAxNTc1OSwgIDc5NzIsDQorICAxNTkzOSwgMTE5NjQsDQorICAxNjAyMCwgIDI5OTYsDQorICAxNjA4NiwgIDE3MDcsDQorICAxNjUyMSwgIDQyNTQsDQorICAxNjU3NiwgIDYyMjQsDQorICAxNjg5NCwgIDIzODAsDQorICAxNjkwNiwgICA2ODEsDQorICAxNzIxMywgIDg0MDYsDQorICAxNzYxMCwgIDM0MTgsDQorICAxNzg5NSwgIDUyNjksDQorICAxODE2OCwgMTE3NDgsDQorICAxODIzMCwgIDE1NzUsDQorICAxODYwNywgMzI3NjcsDQorICAxODcyOCwgMjE2ODQsDQorICAxOTEzNywgIDI1NDMsDQorICAxOTQyMiwgIDY1NzcsDQorICAxOTQ0NiwgIDQwOTcsDQorICAxOTQ1MCwgIDkwNTYsDQorICAyMDM3MSwgMTQ4ODV9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgdF9xdWFfZ2FpbjdiWzEyOCoyXSA9IHsNCisgICAgMjA0LCAgIDQ0MSwNCisgICAgNDY0LCAgMTk3NywNCisgICAgODY5LCAgMTA3NywNCisgICAxMDcyLCAgMzA2MiwNCisgICAxMjgxLCAgNDc1OSwNCisgICAxNjQ3LCAgMTUzOSwNCisgICAxODQ1LCAgNzAyMCwNCisgICAxODUzLCAgIDYzNCwNCisgICAxOTk1LCAgMjMzNiwNCisgICAyMzUxLCAxNTQwMCwNCisgICAyNjYxLCAgMTE2NSwNCisgICAyNzAyLCAgMzkwMCwNCisgICAyNzEwLCAxMDEzMywNCisgICAzMTk1LCAgMTc1MiwNCisgICAzNDk4LCAgMjYyNCwNCisgICAzNjYzLCAgIDg0OSwNCisgICAzOTg0LCAgNTY5NywNCisgICA0MjE0LCAgMzM5OSwNCisgICA0NDE1LCAgMTMwNCwNCisgICA0Njk1LCAgMjA1NiwNCisgICA1Mzc2LCAgNDU1OCwNCisgICA1Mzg2LCAgIDY3NiwNCisgICA1NTE4LCAyMzU1NCwNCisgICA1NTY3LCAgNzc5NCwNCisgICA1NjQ0LCAgMzA2MSwNCisgICA1NjcyLCAgMTUxMywNCisgICA1OTU3LCAgMjMzOCwNCisgICA2NTMzLCAgMTA2MCwNCisgICA2ODA0LCAgNTk5OCwNCisgICA2ODIwLCAgMTc2NywNCisgICA2OTM3LCAgMzgzNywNCisgICA3Mjc3LCAgIDQxNCwNCisgICA3MzA1LCAgMjY2NSwNCisgICA3NDY2LCAxMTMwNCwNCisgICA3OTQyLCAgIDc5NCwNCisgICA4MDA3LCAgMTk4MiwNCisgICA4MDA3LCAgMTM2NiwNCisgICA4MzI2LCAgMzEwNSwNCisgICA4MzM2LCAgNDgxMCwNCisgICA4NzA4LCAgNzk1NCwNCisgICA4OTg5LCAgMjI3OSwNCisgICA5MDMxLCAgMTA1NSwNCisgICA5MjQ3LCAgMzU2OCwNCisgICA5MjgzLCAgMTYzMSwNCisgICA5NjU0LCAgNjMxMSwNCisgICA5ODExLCAgMjYwNSwNCisgIDEwMTIwLCAgIDY4MywNCisgIDEwMTQzLCAgNDE3OSwNCisgIDEwMjQ1LCAgMTk0NiwNCisgIDEwMzM1LCAgMTIxOCwNCisgIDEwNDY4LCAgOTk2MCwNCisgIDEwNjUxLCAgMzAwMCwNCisgIDEwOTUxLCAgMTUzMCwNCisgIDEwOTY5LCAgNTI5MCwNCisgIDExMjAzLCAgMjMwNSwNCisgIDExMzI1LCAgMzU2MiwNCisgIDExNzcxLCAgNjc1NCwNCisgIDExODM5LCAgMTg0OSwNCisgIDExOTQxLCAgNDQ5NSwNCisgIDExOTU0LCAgMTI5OCwNCisgIDExOTc1LCAxNTIyMywNCisgIDExOTc3LCAgIDg4MywNCisgIDExOTg2LCAgMjg0MiwNCisgIDEyNDM4LCAgMjE0MSwNCisgIDEyNTkzLCAgMzY2NSwNCisgIDEyNjM2LCAgODM2NywNCisgIDEyNjU4LCAgMTU5NCwNCisgIDEyODg2LCAgMjYyOCwNCisgIDEyOTg0LCAgNDk0MiwNCisgIDEzMTQ2LCAgMTExNSwNCisgIDEzMjI0LCAgIDUyNCwNCisgIDEzMzQxLCAgMzE2MywNCisgIDEzMzk5LCAgMTkyMywNCisgIDEzNTQ5LCAgNTk2MSwNCisgIDEzNjA2LCAgMTQwMSwNCisgIDEzNjU1LCAgMjM5OSwNCisgIDEzNzgyLCAgMzkwOSwNCisgIDEzODY4LCAxMDkyMywNCisgIDE0MjI2LCAgMTcyMywNCisgIDE0MjMyLCAgMjkzOSwNCisgIDE0Mjc4LCAgNzUyOCwNCisgIDE0NDM5LCAgNDU5OCwNCisgIDE0NDUxLCAgIDk4NCwNCisgIDE0NDU4LCAgMjI2NSwNCisgIDE0NzkyLCAgMTQwMywNCisgIDE0ODE4LCAgMzQ0NSwNCisgIDE0ODk5LCAgNTcwOSwNCisgIDE1MDE3LCAxNTM2MiwNCisgIDE1MDQ4LCAgMTk0NiwNCisgIDE1MDY5LCAgMjY1NSwNCisgIDE1NDA1LCAgOTU5MSwNCisgIDE1NDA1LCAgNDA3OSwNCisgIDE1NTcwLCAgNzE4MywNCisgIDE1Njg3LCAgMjI4NiwNCisgIDE1NjkxLCAgMTYyNCwNCisgIDE1Njk5LCAgMzA2OCwNCisgIDE1NzcyLCAgNTE0OSwNCisgIDE1ODY4LCAgMTIwNSwNCisgIDE1OTcwLCAgIDY5NiwNCisgIDE2MjQ5LCAgMzU4NCwNCisgIDE2MzM4LCAgMTkxNywNCisgIDE2NDI0LCAgMjU2MCwNCisgIDE2NDgzLCAgNDQzOCwNCisgIDE2NTI5LCAgNjQxMCwNCisgIDE2NjIwLCAxMTk2NiwNCisgIDE2ODM5LCAgODc4MCwNCisgIDE3MDMwLCAgMzA1MCwNCisgIDE3MDMzLCAxODMyNSwNCisgIDE3MDkyLCAgMTU2OCwNCisgIDE3MTIzLCAgNTE5NywNCisgIDE3MzUxLCAgMjExMywNCisgIDE3Mzc0LCAgIDk4MCwNCisgIDE3NTY2LCAyNjIxNCwNCisgIDE3NjA5LCAgMzkxMiwNCisgIDE3NjM5LCAzMjc2NywNCisgIDE4MTUxLCAgNzg3MSwNCisgIDE4MTk3LCAgMjUxNiwNCisgIDE4MjAyLCAgNTY0OSwNCisgIDE4Njc5LCAgMzI4MywNCisgIDE4OTMwLCAgMTM3MCwNCisgIDE5MjcxLCAxMzc1NywNCisgIDE5MzE3LCAgNDEyMCwNCisgIDE5NDYwLCAgMTk3MywNCisgIDE5NjU0LCAxMDAxOCwNCisgIDE5NzY0LCAgNjc5MiwNCisgIDE5OTEyLCAgNTEzNSwNCisgIDIwMDQwLCAgMjg0MSwNCisgIDIxMjM0LCAxOTgzM307DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX3B1bHNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY1NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX3B1bHNlLmgKQEAgLTAsMCArMSw2NiBAQAorDQorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFFfUFVMU0UuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBDb2RpbmcgYW5kIGRlY29kaW5nIG9mIGFsZ2VicmFpYyBjb2RlYm9vawkJCSAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmICBfX1FfUFVMU0VfSF9fDQorI2RlZmluZSAgX19RX1BVTFNFX0hfXw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorDQorV29yZDMyIHF1YW50XzFwX04xKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKE4rMSkgYml0cyAgICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAgICAgICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorV29yZDMyIHF1YW50XzJwXzJOMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDIqTikrMSBiaXRzICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLw0KKwkJV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfM3BfM04xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMypOKSsxIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovDQorCQlXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8NCisJCVdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorV29yZDMyIHF1YW50XzRwXzROMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDQqTikrMSBiaXRzICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLw0KKwkJV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovDQorCQlXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8NCisJCVdvcmQxNiBwb3M0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSA0ICAgICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorV29yZDMyIHF1YW50XzRwXzROKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNCpOIGJpdHMgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi40ICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorV29yZDMyIHF1YW50XzVwXzVOKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNSpOIGJpdHMgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi41ICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorV29yZDMyIHF1YW50XzZwXzZOXzIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDYqTiktMiBiaXRzICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi42ICAqLw0KKwkJV29yZDE2IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorDQorDQorI2VuZGlmIC8vX19RX1BVTFNFX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcWlzZl9ucy50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3Fpc2ZfbnMudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjBkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3Fpc2ZfbnMudGFiCkBAIC0wLDAgKzEsMzQ3IEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBxaXNmX25zLmgNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogUXVhbnRpemF0aW9uIHRhYmxlcyBmb3Igc3BsaXQgYnkgNSBWUSBvZiBJU0ZzIGZvciBhIGJhY2tncm91bmQgbm9pc2UgZGF0YWJhc2UNCisgKiBWZXJzaW9uIHdoaXRoIG5vIHByZWRpY3Rpb24NCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNkZWZpbmUgT1JERVIgICAxNiAgICAgICAgICAgIC8qIG9yZGVyIG9mIGxpbmVhciBwcmVkaWN0aW9uIGZpbHRlciAqLw0KKyNkZWZpbmUgSVNGX0dBUCAxMjgNCisNCisjZGVmaW5lIFNJWkVfQktfTk9JU0UxICA2NA0KKyNkZWZpbmUgU0laRV9CS19OT0lTRTIgIDY0DQorI2RlZmluZSBTSVpFX0JLX05PSVNFMyAgNjQNCisjZGVmaW5lIFNJWkVfQktfTk9JU0U0ICAzMg0KKyNkZWZpbmUgU0laRV9CS19OT0lTRTUgIDMyDQorDQorDQorLyogbWVhbnMgb2YgSVNGcyAqLw0KKyBzdGF0aWMgV29yZDE2IG1lYW5faXNmX25vaXNlW09SREVSXSA9IHsNCisNCisgICA0NzgsICAxMTAwLCAgMjIxMywgIDMyNjcsICA0MjE5LCAgNTIyMiwgIDYxOTgsICA3MjQwLA0KKyAgODIyOSwgIDkxNTMsIDEwMDk4LCAxMTEwOCwgMTIxNDQsIDEzMTg0LCAxNDE2NSwgIDM4MDN9Ow0KKw0KKw0KKy8qIDI4IGJpdHMgKi8NCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogIGlzZiBjb2RlYm9va3M6ICBzcGxpdC1ieS01IFZRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgY29kZWJvb2sgICB2ZWN0b3IgZGltZW5zaW9uICAgIG51bWJlciBvZiB2ZWN0b3JzICAgICAgICAgICAgICAgICAqDQorICogIH5+fn5+fn5+ICAgfn5+fn5+fn5+fn5+fn5+fiAgICB+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAxICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDMgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICA0ICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgNSAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAxc3Qgc3BsaXQ6ICAgaXNmMCB0byBpc2YxDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKw0KKyBzdGF0aWMgV29yZDE2IGRpY28xX2lzZl9ub2lzZVtTSVpFX0JLX05PSVNFMSoyXSA9IHsNCisNCisgIC0yNjksICAtNjczLA0KKyAgLTIyMiwgIC01MzcsDQorICAtMjMzLCAgLTQzMCwNCisgIC0xMzgsICAtNDUxLA0KKyAgLTIxMiwgIC0zMzEsDQorICAtMTkyLCAgLTI0MSwNCisgICAtODcsICAtMjMxLA0KKyAgLTE5MSwgIC0xMjgsDQorICAgLTcwLCAgLTEwNiwNCisgIC0xNjQsICAgIC02LA0KKyAgICA3NCwgIC0xNzksDQorICAgIDI3LCAgIC0zMywNCisgIC0xMDIsICAgIDc0LA0KKyAgLTE2MiwgICAxMTUsDQorICAgLTk0LCAgIDE3MiwNCisgICAgLTYsICAgMTMwLA0KKyAgLTE0MywgICAyMzQsDQorICAgIDE0LCAgIDIxOCwNCisgICAtNjUsICAgMjcwLA0KKyAgICA4OCwgICAxODIsDQorICAtMTI0LCAgIDM0MSwNCisgICAtNDQsICAgMzgxLA0KKyAgICAzOCwgICAzMzUsDQorICAgMTE3LCAgIDI3NCwNCisgIC0xMTIsICAgNDU0LA0KKyAgICA3NCwgICA0MzEsDQorICAgIC01LCAgIDQ4OCwNCisgICAxNzUsICAgMzg0LA0KKyAgIC04MywgICA1NjEsDQorICAgMTIyLCAgIDUyOSwNCisgICAgMjEsICAgNjAxLA0KKyAgIDIyOSwgICA0ODEsDQorICAgMjMxLCAgIDMwMywNCisgICAyMjYsICAgNjA4LA0KKyAgIDMwMCwgICAzNzIsDQorICAgMjEwLCAgIDE4NywNCisgICAzMDYsICAgMjY1LA0KKyAgIDMyOCwgICA0NzMsDQorICAgMzgyLCAgIDMzMSwNCisgICAzNzEsICAgMTMyLA0KKyAgIDEzOSwgICAgNTgsDQorICAgMzY1LCAgICAyMSwNCisgICAyNTAsICAgLTgyLA0KKyAgIDQ0MywgICAyMTgsDQorICAgNDgzLCAgIDExMCwNCisgICA0MjYsICAgNDE1LA0KKyAgIDU3OSwgICAyMjIsDQorICAgNTE4LCAgIDMzMywNCisgICA1NzMsICAgNDQ4LA0KKyAgIDQ1NSwgICA1MjksDQorICAgNjg1LCAgIDMyOSwNCisgICAzMzIsICAgNTgwLA0KKyAgIDU5NSwgICA1OTMsDQorICAgNDY4LCAgIDY0NSwNCisgICA3NjIsICAgNTE3LA0KKyAgIDMyNiwgICA3MDksDQorICAgNDg1LCAgIDc5MywNCisgICAxMzAsICAgNjg0LA0KKyAgIDY3MSwgICA3MzcsDQorICAgMzU0LCAgIDg3NiwNCisgICAgODgsICAgODA2LA0KKyAgIC02NSwgICA3MDYsDQorICAgLTM1LCAgMTAxNiwNCisgICAyNjYsICAxMTIzfTsNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAybmQgc3BsaXQ6ICAgaXNmMiB0byBpc2Y0DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyBzdGF0aWMgV29yZDE2IGRpY28yX2lzZl9ub2lzZVtTSVpFX0JLX05PSVNFMiozXSA9IHsNCisNCisgIC04MjQsICAtODg0LCAgLTk0OSwNCisgIC04MDUsICAtNDU2LCAgLTQxOCwNCisgIC00NDIsICAtNDM4LCAgLTU0MSwNCisgIC0yMTcsICAtNTc4LCAgLTc5MywNCisgIC0xNjgsICAtNDQ0LCAgLTU4MiwNCisgIC0yODcsICAtNDkyLCAgLTI3NCwNCisgIC01NTIsICAtMjk3LCAgLTMwMCwNCisgIC0xNjMsICAtMzMzLCAgLTM1OCwNCisgIC0zNzAsICAtMjMyLCAgLTIzMiwNCisgIC0xNzUsICAtMzU4LCAgLTE1OSwNCisgIC0zODEsICAgLTIxLCAgLTM1NywNCisgIC0xODQsICAtMTU5LCAgLTE2MiwNCisgICAtNTMsICAtMTkxLCAgLTI4MCwNCisgICAgMTgsICAtMjY3LCAgLTIxNSwNCisgIC0xMzgsICAgIDYxLCAgLTI4MywNCisgICAgNzEsICAgLTk1LCAgLTI5NCwNCisgICAgMTMsICAtMTU2LCAgLTU0NiwNCisgICAgIDAsICAgLTgzLCAgIC03OSwNCisgICAgNDQsICAgIDk3LCAgLTMxNiwNCisgICAxNzgsICAgLTUyLCAgLTIxMywNCisgICAyMjIsICAtMjYxLCAgLTQyMiwNCisgICAyMzcsICAtMTE4LCAgIC00NCwNCisgICAxNDEsICAgMTQ1LCAgLTEzMiwNCisgICAzNjMsICAgIDgxLCAgLTI4NywNCisgICAyMTMsICAgIDY1LCAgICAzNCwNCisgIC0xMDcsICAgIDk0LCAgICAtNSwNCisgICAgOTEsICAgLTI5LCAgIDEyNiwNCisgIC0zNTUsICAgIDUxLCAgIC00MSwNCisgIC0yMTksICAgLTc2LCAgIDE0NSwNCisgICAtNjMsICAgMTAwLCAgIDI0NCwNCisgIC03MTksICAgIDQ0LCAgICAyNywNCisgIC01NzIsICAtMTI0LCAgIDE1NSwNCisgIC00MjMsICAgMTMzLCAgIDMxNSwNCisgIC05MTcsICAgIDcxLCAgIDIyNCwNCisgIC0yNjgsICAgMzE4LCAgIDEzMSwNCisgICAtOTMsICAtMTkwLCAgIDQyMCwNCisgICAtOTcsICAgMTIyLCAgIDQ5MSwNCisgICAtNzksICAgMzE3LCAgIDM1NSwNCisgICAxMzAsICAgMTAwLCAgIDMyNSwNCisgICAgODYsICAtMjkzLCAgIDIxMCwNCisgICAxMzMsICAgMjU4LCAgIDE2MSwNCisgICAxNzYsICAgLTczLCAgIDQ2NSwNCisgICAxOTUsICAgMzAwLCAgIDM4NCwNCisgICAzNDgsICAgIDIyLCAgIDIyMSwNCisgICAzNzYsICAgMTgzLCAgIDQwOSwNCisgICAzNzcsICAgMjg2LCAgIDIwMiwNCisgICAyNDIsICAgMjEzLCAgIDY1OSwNCisgICAyNTcsICAgNTY1LCAgIDI0OCwNCisgICAzNDQsICAgNDA4LCAgIC03NiwNCisgICA0MDUsICAgNDQwLCAgIDUwOSwNCisgICA2MTIsICAgMzg1LCAgIDM3OSwNCisgICA1MzYsICAgNjA3LCAgIDIxNiwNCisgICAtNTYsICAgNTgyLCAgIDE5MiwNCisgICAxMDAsICAgNTE3LCAgIDU2NywNCisgIC0zNjUsICAgNDQ4LCAgIDQ0NSwNCisgICA3MjgsICAgMzQ3LCAgICAxMCwNCisgICA1MDUsICAgMzU3LCAgIDc1OSwNCisgICA2MzYsICAgNTgyLCAgIDY1OCwNCisgICAzMzUsICAgNTE3LCAgIDg1MiwNCisgICAzNzgsICAgODA5LCAgIDU3MiwNCisgIC0xOTUsICAgODc4LCAgIDgyOSwNCisgICA1MjksICAgNzA3LCAgIDk4NywNCisgICA5MTgsICAgNzI2LCAgIDM5MiwNCisgIDEyNTAsICAgOTk3LCAgMTA2M307DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogM3JkIHNwbGl0OiAgIGlzZjUgdG8gaXNmNw0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisgc3RhdGljIFdvcmQxNiBkaWNvM19pc2Zfbm9pc2VbU0laRV9CS19OT0lTRTMqM10gPSB7DQorDQorICAtODA1LCAgLTgzOCwgIC03NzQsDQorICAtNTIyLCAgLTYyNywgIC04MjgsDQorICAtNDc3LCAgLTQ4NiwgIC02MDMsDQorICAtMjk1LCAgLTQ4MSwgIC02MzQsDQorICAtMzY2LCAgLTM4NCwgIC0zOTMsDQorICAtMTg2LCAgLTQxNCwgIC0zOTYsDQorICAtMjM3LCAgLTM5NCwgIC0xMDYsDQorICAtMjUyLCAgLTIwMiwgIC0yNzUsDQorICAgLTYxLCAgLTE3NywgIC00NDIsDQorICAgLTg0LCAgLTE5OCwgIC0xOTksDQorICAtMTc5LCAgLTEyNSwgICAtMzEsDQorICAgLTcyLCAgIC00NywgIC0xNjMsDQorICAtMjk4LCAgLTIyMCwgICAyMTUsDQorICAgLTY0LCAgLTE2OCwgICAyNTEsDQorICAtMTMzLCAgIDE1NiwgICAtNTksDQorICAgLTMwLCAgICAtMiwgICAxMjcsDQorICAgIDU0LCAgICA2NiwgICAtNjEsDQorICAtMjMzLCAgICAyMSwgICAyNTEsDQorICAgMjA5LCAgIC01MCwgICAgMzIsDQorICAgIDMzLCAgIDE5NCwgICAxMzYsDQorICAtMTE3LCAgIC0xOCwgICA0NzUsDQorICAgMjAyLCAgICA0NiwgICAzMDksDQorICAgMjU2LCAgIDE4NSwgICAgNTMsDQorICAgIDM1LCAgIDIwMCwgICAzOTAsDQorICAgMjAwLCAgIDI2MywgICAyNDIsDQorICAtMjE2LCAgIDMwMiwgICAyOTQsDQorICAgMTI4LCAgIDM1OCwgICAgIDAsDQorICAgIDE5LCAgIDQzMSwgICAyODcsDQorICAgMjI0LCAgIDQ0NywgICAyODAsDQorICAgMzY3LCAgIDE2NSwgICAyMTMsDQorICAgMzk3LCAgIDMxNCwgICAzMTksDQorICAgMzgzLCAgIDM3OSwgICAgNzUsDQorICAgMjc3LCAgIDMyNSwgICA0NjIsDQorICAgMzk0LCAgIDUwNSwgICAzMzQsDQorICAgMjUxLCAgICA5OCwgIC0yMTMsDQorICAgNDUwLCAgIDE1MywgICA0NDgsDQorICAgNTY1LCAgIDIyNiwgICAgNzYsDQorICAgNDcwLCAgIDM4MywgICA1MDIsDQorICAgNjM1LCAgIDM5MCwgICAyNzgsDQorICAgMjM3LCAgIDEzNSwgICA2MjAsDQorICAgMzQyLCAgIDQwMSwgICA2NDksDQorICAgMzMxLCAgIDU1MSwgICA1MTgsDQorICAgMTMwLCAgIDQxOCwgICA1OTIsDQorICAgNTMxLCAgIDMwNiwgICA3MzcsDQorICAgNzI5LCAgIDM4OSwgICA1ODAsDQorICAgNDk3LCAgIDU1NywgICA2OTksDQorICAgMjk2LCAgIDM4MywgICA4NzQsDQorICAgMjgzLCAgIDYyNCwgICA3NTksDQorICAgMTI2LCAgIDYyMiwgICA0NzYsDQorICAgNTU5LCAgIDU5NSwgICA0NzIsDQorICAgMzgyLCAgIDc3MCwgICA2MTYsDQorICAgNzE5LCAgIDYxMywgICA3NDUsDQorICAgNTQwLCAgIDYzOSwgICA5MjgsDQorICAgNTE3LCAgIDgyNiwgICA4MDEsDQorICAgNjg0LCAgIDgxMSwgICA2MDQsDQorICAgNzUyLCAgIDc4NiwgICA4NTcsDQorICAgOTMzLCAgIDY2MSwgICAzNTAsDQorICAgNjk0LCAgIDQ1MCwgIDEwNjEsDQorICAgNTYyLCAgIDkxMSwgIDEwNTEsDQorICAgODI0LCAgIDgxMywgIDExMDQsDQorICAgNzU4LCAgMTA0NywgICA4ODIsDQorICAxMTQwLCAgIDkxNywgICA4ODksDQorICAxMDM5LCAgMTI0NiwgIDE0MjYsDQorICAxNDgzLCAgMTY2NiwgIDE4NzZ9Ow0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDR0aCBzcGxpdDogICBpc2Y4IHRvIGlzZjExDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyBzdGF0aWMgV29yZDE2IGRpY280X2lzZl9ub2lzZVtTSVpFX0JLX05PSVNFNCo0XSA9IHsNCisNCisgIC03NzYsICAtODU0LCAgLTg5MSwgIC05MjAsDQorICAtNTUyLCAgLTYxMCwgIC02NjMsICAtNzQxLA0KKyAgLTMyMSwgIC0zNzAsICAtNDc2LCAgLTU2NSwNCisgICAyNzQsICAtMTYwLCAgLTQ1NiwgICAyMDEsDQorICAgMjY1LCAgICA2NywgIC0xNjAsICAtMzA2LA0KKyAgICAtOCwgIC0yMTAsICAgIDc5LCAgIDI3MiwNCisgICAxNjMsICAgMjM2LCAgIDMwNywgICAzMDgsDQorICAgNTc4LCAgIDMxNywgICAgNjQsICAgMjk4LA0KKyAgICAtOSwgICAxOTcsICAgMzQyLCAgIDYyMCwNCisgICAzNDMsICAgMjMyLCAgIDMxNCwgICA2MjIsDQorICAgMTczLCAgIDE0OSwgICA1NDgsICAgNTI3LA0KKyAgIDM1NiwgICAzNzAsICAgNDgxLCAgIDM3NiwNCisgICAxMzUsICAgNDQ0LCAgIDQ4OCwgICA1NTYsDQorICAgMzkxLCAgIDQ3MSwgICA0ODcsICAgNjUzLA0KKyAgIDIyOCwgICA0MjQsICAgNTc2LCAgIDgzNSwNCisgICA0MjIsICAgMzcyLCAgIDcyMiwgICA2ODIsDQorICAgMjk1LCAgIDY3MywgICA2OTMsICAgNjM1LA0KKyAgIDUzOSwgICA1OTYsICAgNTkwLCAgIDQ0OSwNCisgICA0NzUsICAgNjE4LCAgIDY1OSwgICA4MTgsDQorICAgNzM1LCAgIDUxNywgICA0OTEsICAgNjczLA0KKyAgIDYwMiwgICAzNDYsICAgMjU3LCAgIDg3NywNCisgICA2MjUsICAgNjM1LCAgIDg0OSwgICA3MjAsDQorICAgNzI3LCAgIDgxOCwgICA2OTgsICAgNTk1LA0KKyAgIDY1MywgICA0ODEsICAgNjkwLCAgMTEzOSwNCisgICA4MTQsICAgNzYyLCAgIDcwNCwgICA5MDgsDQorICAgNTA3LCAgIDc0NywgICA4OTgsICAgOTM2LA0KKyAgIDg0OCwgICA4NTUsICAgOTI0LCAgIDc4NSwNCisgICA2NDYsICAxMDM3LCAgIDg4MiwgICA3OTUsDQorICAgNzcyLCAgIDg0NSwgIDEwMjQsICAxMTUxLA0KKyAgMTEzMywgICA5ODMsICAgODE4LCAgIDkyMSwNCisgICA5NDAsICAxMDY4LCAgMTI1MiwgIDEzMDIsDQorICAxNTg4LCAgMTc2NywgIDE3MTgsICAxNTEzfTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiA1dGggc3BsaXQ6ICAgaXNmMTIgdG8gaXNmMTUNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorIHN0YXRpYyBXb3JkMTYgZGljbzVfaXNmX25vaXNlW1NJWkVfQktfTk9JU0U1KjRdID0gew0KKyAgLTgxMCwgIC04NzksICAtOTQ1LCAgLTI1NCwNCisgICAyNDgsICAgMTg0LCAgIDY3MSwgICAxMjgsDQorICAgMjg4LCAgIDcwMywgICA5MTgsICAgIDk5LA0KKyAgIDY1OCwgICA1NTgsICAgNjYyLCAgIDIxOSwNCisgICA1NTIsICAgNTg1LCAgIDkxMCwgICAyMDgsDQorICAgNTU5LCAgIDgwNCwgICA3NTksICAgMTE5LA0KKyAgIDYwNiwgICA3NzQsICAgOTIxLCAgLTEzOSwNCisgICA3ODIsICAgNzYxLCAgIDc0OCwgICAyMDgsDQorICAgNzU2LCAgIDcwOCwgICA5ODMsICAgIDU2LA0KKyAgIDU0NCwgICA4NjQsICAxMDEwLCAgIDE1MiwNCisgICA3MzcsICAgNjk4LCAgIDk4NywgICAyOTksDQorICAgNzcxLCAgIDkyNCwgICA4NzksICAgMTAzLA0KKyAgIDUzNiwgICA3ODUsICAgOTYxLCAgIDQwNSwNCisgICA2NjcsICAgOTE2LCAgIDgwMSwgICAzMjgsDQorICAgNzM4LCAgIDcwNSwgICA3NzMsICAgNDM5LA0KKyAgIDgyMywgICA4NzEsICAgOTkyLCAgIDM1NSwNCisgICA2NDAsICAxMDA0LCAgMTA1MiwgICAzNjksDQorICAgNzI0LCAgIDgyMiwgICA5NDksICAgNTk3LA0KKyAgIDQxNSwgICA2NTUsICAgNzI5LCAgIDQ4MiwNCisgIDEwMDksICAgODk2LCAgIDc5MywgICAzNjMsDQorICAgOTA4LCAgIDgwMywgICA2ODcsICAgLTI1LA0KKyAgMTAxNiwgICA4MzgsICAxMDExLCAgIDE4OSwNCisgICA5NDcsICAxMTEyLCAgIDk0MiwgICAyMjIsDQorICAgOTE0LCAgMTA0OSwgICA5ODEsICAgNTI3LA0KKyAgIDk1NiwgICA5ODcsICAxMDExLCAgLTEyMCwNCisgICA3ODEsICAxMDQ5LCAgMTEyMSwgICAgOTIsDQorICAxMTc4LCAgMTA1MywgICA4ODQsICAgIDQ3LA0KKyAgMTEyMywgIDEwNTksICAxMTgyLCAgIDExOCwNCisgICA5MzMsICAgOTcyLCAgMTI3NywgICAzNTcsDQorICAxMTA5LCAgIDkxOCwgIDExMDEsICAgNTAzLA0KKyAgMTAzOSwgIDEyODYsICAxMjIwLCAgIDMxNywNCisgIDEzNTEsICAxMjA3LCAgMTAxMCwgICAzMjZ9Ow0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcXBpc2ZfMnMudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NjlhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcXBpc2ZfMnMudGFiCkBAIC0wLDAgKzEsMTM2MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgcXBpc2ZfMnMuaA0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBRdWFudGl6YXRpb24gdGFibGVzIGZvciB0d28tc3RhZ2Ugb2YgSVNGcyAoc3BsaXQgYnkgMiBpbiAxc3Qgc3RhZ2UpDQorICogVmVyc2lvbiB3aGl0aCBwcmVkaWN0aW9uIE1VID0gMC4yNQ0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2RlZmluZSBPUkRFUiAgIDE2ICAgICAgICAgICAgLyogb3JkZXIgb2YgbGluZWFyIHByZWRpY3Rpb24gZmlsdGVyICovDQorI2RlZmluZSBJU0ZfR0FQIDEyOCAgICAgICAgICAgLyogNTAgSHogKi8NCisjZGVmaW5lIE5fU1VSViAgNA0KKw0KKyNkZWZpbmUgU0laRV9CSzEgIDI1Ng0KKyNkZWZpbmUgU0laRV9CSzIgIDI1Ng0KKyNkZWZpbmUgU0laRV9CSzIxIDY0DQorI2RlZmluZSBTSVpFX0JLMjIgMTI4DQorI2RlZmluZSBTSVpFX0JLMjMgMTI4DQorI2RlZmluZSBTSVpFX0JLMjQgMzINCisjZGVmaW5lIFNJWkVfQksyNSAzMg0KKw0KKyNkZWZpbmUgU0laRV9CSzIxXzM2YiAxMjgNCisjZGVmaW5lIFNJWkVfQksyMl8zNmIgMTI4DQorI2RlZmluZSBTSVpFX0JLMjNfMzZiIDY0DQorDQorLyogbWVhbnMgb2YgSVNGcyAqLw0KK3N0YXRpYyBXb3JkMTYgbWVhbl9pc2ZbT1JERVJdID0gew0KKw0KKyAgIDczOCwgIDEzMjYsICAyMzM2LCAgMzU3OCwgIDQ1OTYsICA1NjYyLCAgNjcxMSwgIDc3MzAsDQorICA4NzUwLCAgOTc1MywgMTA3MDUsIDExNzI4LCAxMjgzMywgMTM5NzEsIDE1MDQzLCAgNDAzN307DQorDQorLyogNDYgYml0cyAqLw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgaXNmIGNvZGVib29rczogIHR3by1zdGFnZSBWUSB3aXRoIHNwbGl0LWJ5LTUgaW4gMm5kIHN0YWdlICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBjb2RlYm9vayAgIHZlY3RvciBkaW1lbnNpb24gICAgbnVtYmVyIG9mIHZlY3RvcnMgICAgICAgICAgICAgICAgICoNCisgKiAgfn5+fn5+fn4gICB+fn5+fn5+fn5+fn5+fn5+ICAgIH5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAqDQorICogICAgIDFfMSAgICAgICAgICAgIDkgICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAxXzIgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl8xICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDJfMiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyXzMgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl80ICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDJfNSAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogMXN0IHN0YWdlIGNvZGVib29rOyAxc3Qgc3BsaXQ6ICAgaXNmMCB0byBpc2Y4DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzFfaXNmW1NJWkVfQksxKjldID0gew0KKw0KKyAgIDU3OSwgIDEwODEsICAxMDM1LCAgIDM5MCwgICAgIDMsICAtMjYzLCAgLTE5OCwgICAtODIsICAgIDM4LA0KKyAgICAxOCwgICAtNjgsICAgLTEyLCAgIDMxMywgICA3NjEsICAgNDA1LCAgIDI0OSwgICAxMTEsICAgLTc2LA0KKyAgIDc0MCwgIDEyNjMsICAxMjkyLCAgMTAwNiwgICA5OTcsICAxMDE5LCAgMTAxNywgICA5NzYsICAgOTIzLA0KKyAgIC05MSwgICA4MjcsICAgOTQ4LCAgIDY0OCwgICA2MTMsICAgNTM1LCAgIDUyMiwgICA0OTAsICAgNDIxLA0KKyAgICA0MSwgICAtNDQsICAtMjgxLCAgLTQ3MiwgICA2NTIsICAgNTM0LCAgIDE5MywgICAxMzUsICAgLTkwLA0KKyAgICA0MSwgIC0xMjEsICAtMzU2LCAgIC02MCwgICA2NjMsICAgMzA3LCAgICA2MSwgICAtNDgsICAtMzQ0LA0KKyAgIDU1NywgICA5NDYsICAxMDQ5LCAgIDg2NywgICA4NDYsICAgOTkwLCAgMTExMiwgIDEyNjIsICAxMjQxLA0KKyAgLTExOCwgIC0yMDQsICAgMzI4LCAgIDUxMiwgICA4NzAsICAgNzkzLCAgIDYxMCwgICA0MDIsICAgMTg2LA0KKyAgIDE1NiwgICAyOTMsICAgIDc0LCAgLTMzOCwgIC00NzUsICAtODk3LCAgLTU5NCwgIC0xNjEsICAtNDk3LA0KKyAgIDIyNiwgICAxMzEsICAtMTM4LCAgIDMwNywgICAxNjksICAtMjcxLCAgLTE2NCwgIC0zODcsICAtNjI0LA0KKyAgICA2MiwgICAtMzIsICAgLTYxLCAgLTI1MiwgIC01NDEsICAtODI4LCAtMTAyNywgIC01MjMsICAtNjYyLA0KKyAgIDEwMiwgICAtNjEsICAgMTQxLCAgIDExMiwgIC0yNzAsICAtMjUxLCAgLTU0MSwgICAgMjUsICAtMTUwLA0KKyAgICAgNiwgIC0xMzIsICAtMzU2LCAgLTY4NiwgICAtOTYsICAtMzIyLCAgLTUyMiwgICAtMzEsICAtMzI2LA0KKyAgIC0zNiwgIC0yMDksICAtNTIxLCAgLTIyOSwgICAzMDcsICAtMTMyLCAgICAtNSwgICAtOTksICAtMzg0LA0KKyAgICA2MCwgICAtNTEsICAtMjM3LCAgLTY2OCwgIC05NzMsICAtNDA3LCAgLTcwOCwgICAtNzUsICAtMTcyLA0KKyAgICAyNiwgIC0xMzgsICAtMjY2LCAgIDExMSwgIC0zMDIsICAgIDQzLCAgLTI3OCwgIC0zNTYsICAtMzU5LA0KKyAgIDU3MCwgICA4MjIsICAgNDk2LCAgLTE1NCwgIC0zMTIsICAgLTkyLCAgIDEzNywgICAyNzksICAgMzcxLA0KKyAgLTE0NiwgICAzNjgsICAgNDA5LCAgICA2OCwgICAgIDYsICAgIDc3LCAgIDE2NywgICAyMDIsICAgMTYyLA0KKyAgIDYzMywgICA4OTgsICAgOTk2LCAgIDc1NiwgICA2NjIsICAgNjgzLCAgIDc4MywgICA5MDksICAgOTk2LA0KKyAgLTEwMywgICAyOTQsICAgNjA3LCAgIDQxNSwgICA0ODMsICAgNDYyLCAgIDQ4MCwgICA0MzEsICAgNDA4LA0KKyAgLTEyMCwgIC0zMzgsICAtNjEyLCAgLTUyNCwgICA1ODQsICAgMzMxLCAgICA5MiwgICA0MzMsICAgMjc2LA0KKyAgLTE3OCwgIC0yOTMsICAtMTU0LCAgIC00MSwgICAyNjksICAgMTAwLCAgICAtOSwgICAyMTMsICAgMTYwLA0KKyAgIDgzMCwgICA3MzYsICAgMjc4LCAgIDgyMCwgIDEyNTQsICAgNjg2LCAgIDcxMiwgIDEwMzksICAgNDczLA0KKyAgLTIxOCwgIC0zMDQsICAgNDYzLCAgIDQ1NCwgICAzOTcsICAgMjczLCAgIDIwMiwgICAyODYsICAgMjczLA0KKyAgLTIzMiwgICAgIDcsICAgICA2LCAgLTM4OCwgIC00NzIsICAtNDI3LCAgLTM3OCwgIC0xNjcsICAtMTAwLA0KKyAgLTI5NCwgIC0xODMsICAgMTM0LCAgIC00NywgICAxMDEsICAgLTg4LCAgIC04NCwgIC0xMTcsICAgIC0zLA0KKyAgICA1NywgICAgMTcsICAtMjAyLCAgLTYzNCwgIC05ODksIC0xMTE5LCAgLTUzMywgICAxNzYsICAgLTM2LA0KKyAgIDEyMCwgICAtMjgsICAgIDIzLCAgIDExMSwgIC0zMTksICAgMzE4LCAgIC0yMiwgICAtNzcsICAgMjY2LA0KKyAgLTI3MSwgIC00NjQsICAtNDM0LCAgLTY1OCwgIC02NDAsICAtMzg1LCAgLTM4NSwgICAtOTksICAgLTY5LA0KKyAgLTE5OCwgIC0yNTksICAtMjY2LCAgIC00NCwgICAtMzksICAtMTM5LCAgLTEzNywgICAxNzEsICAgIDY2LA0KKyAgICAgOSwgIC0xNDUsICAtMzc3LCAgLTg0NiwgLTEwMDAsICAtMTExLCAgLTMyNSwgICAzNDIsICAgMTM1LA0KKyAgIC04MSwgIC0yODYsICAtMzgwLCAgIDE5MiwgICAtNTcsICAgMzA3LCAgICA3NiwgICAtMjQsICAtMTQwLA0KKyAgIDY3NywgICA3MDIsICAgMjQ3LCAgICA1NiwgICAyNDksICAgMTQxLCAgLTEwNSwgIC0yMzYsICAgLTk5LA0KKyAgICAzNiwgICAtMzksICAgLTY5LCAgIDM0OCwgICAxOTgsICAgLTkzLCAgIDMyMiwgICAgOTEsICAgLTcyLA0KKyAgIDUwMywgICA4ODUsICAxNTA4LCAgMTMwNywgIDEyODIsICAxMTcyLCAgMTExOSwgIDEyMDksICAxMDYxLA0KKyAgIDQxNiwgICA3MTksICAgOTg5LCAgMTIyNywgIDEwMDEsICAxMDUyLCAgIDk1NCwgICA3NDEsICAxMDQ0LA0KKyAgLTEyNywgIC0zNzYsICAtNjU3LCAgIDEzOSwgICA2MjMsICAgMjIzLCAgIDUwMSwgICAzMDYsICAgMjIwLA0KKyAgLTExMywgIC0zODQsICAtNzk2LCAgIDUwNCwgICA0MzgsICAgIDg1LCAgIDIxMywgICAtODMsICAtMTk0LA0KKyAgIDU4NSwgIDExMzIsICAxMjMzLCAgMTA5MSwgIDEyNDcsICAxNDMzLCAgMTUxMiwgIDE0NDgsICAxMzE0LA0KKyAgLTE3NCwgIC00MjIsICAgICA3LCAgMTE1NSwgIDEwODksICAxMTgyLCAgMTAwMywgICA5NDUsICAgODA2LA0KKyAgICAgOCwgIC0xMjYsICAtMzE3LCAgLTEwMywgIC0zNTEsICAtNjk1LCAgIC05OCwgIC0yNjgsICAtNTM3LA0KKyAgICAzMywgIC0xMDMsICAtMjkwLCAgIDE2NywgICAtMzksICAtNDA3LCAgICA0NCwgIC0yMDgsICAtMzc1LA0KKyAgIDEwNCwgICAtMjMsICAgLTY0LCAgLTI5MSwgIC02MzcsICAtODUxLCAtMTA4NCwgICAtNjEsICAtMTEyLA0KKyAgIC03NSwgIC0zMDYsICAtNDM0LCAgIDIxOCwgIC0xNDgsICAtMzU0LCAgLTY4MCwgIC0xMzMsICAtMjE2LA0KKyAgLTEyMSwgIC0zNzcsICAtNzE4LCAgIC05NywgIC0xMzAsICAtMzYxLCAgLTE1NiwgIC0zNzksICAtNTk5LA0KKyAgIC01NiwgIC0yNTQsICAtNTg2LCAgIDIzNSwgICAxNTcsICAtMjE0LCAgICAxMSwgIC0yNjAsICAtMTQ5LA0KKyAgLTEyNCwgIC0yNjcsICAtMzk3LCAgLTU4MCwgIC01OTMsICAtNTI3LCAgLTgwNSwgIC0zODUsICAgMzQ2LA0KKyAgLTE5MywgIC00NDAsICAtNzA4LCAgLTM1MSwgIC0xNDEsICAtMjU1LCAgLTQ5OSwgIC0xNDcsICAtMTg1LA0KKyAgIDQ0OCwgICA2NjAsICAgNDk0LCAgIDIwOCwgICA1MDksICAgNDYxLCAgIDMzOCwgICAyOTEsICAgMTQ5LA0KKyAgLTIyMywgICAgODgsICAgMzM1LCAgIDE1OSwgICAyMTIsICAgMTkxLCAgIDI4NiwgICAzMDgsICAgMjA1LA0KKyAgIC0zMSwgICA0NjksICAgODAzLCAgIDY1OSwgICA2MTksICAgNjU4LCAgIDg0MywgICA5ODcsICAxMTEzLA0KKyAgLTE3MSwgIC0yNDIsICAgNTE0LCAgIDM2MiwgICAyOTUsICAgNTI0LCAgIDU1MiwgICA2OTQsICAgNTg1LA0KKyAgIC02NCwgIC0zMDgsICAtNDQ4LCAgIC0yMSwgICAyODQsICAgNzg2LCAgIDQ0NiwgICAyODksICAgIDkyLA0KKyAgLTIxOCwgIC0zOTAsICAgIC03LCAgIDE2OSwgICAyMDYsICAgMzMwLCAgIDM1MiwgICA0MDgsICAgMzU4LA0KKyAgIC0zNiwgICA3MDIsICAgOTU5LCAgIDg1OSwgICA4NjEsICAxMTE1LCAgMTI2OSwgIDEzNTcsICAxMzA1LA0KKyAgLTEzMywgIC0zNDEsICAgLTY1LCAgIDY3OCwgICA0MTcsICAgNDQwLCAgIDQ4NiwgICA1MTgsICAgNzgwLA0KKyAgICAzMywgICAtNDQsICAtMTkxLCAgLTM0NCwgIC00NjEsICAtNzU1LCAgLTIwMSwgICAyMTcsICAgLTMxLA0KKyAgLTM1MywgIC01NDcsICAgLTQ0LCAgIDEyMywgICAtNjEsICAgLTY4LCAgIC03OSwgICAgMjksICAgIDYwLA0KKyAgICA3MywgICAtNTcsICAtNDA2LCAgLTc2NiwgLTEyNDMsIC0xMjAzLCAgIDI0MCwgICA0MDAsICAgMTY1LA0KKyAgIC03MywgIC0yODIsICAtNjAxLCAgLTIxMywgIC0xNzEsICAtMzc1LCAgIDMzMiwgICAgMzUsICAtMTAzLA0KKyAgIC0yOSwgIC0yMDcsICAtNTUzLCAgLTQ3NiwgIC02MzgsICAtOTA4LCAgIDE3MiwgICAtMjIsICAtMTM1LA0KKyAgLTE5MiwgIC0yMzksICAtMTY0LCAgLTEwMywgIC0xMTEsICAgLTQ3LCAgIDE1MywgICAxMjUsICAgMTEwLA0KKyAgICAtMSwgIC0yMDMsICAtNTcwLCAtMTAzMCwgLTE0MjQsICAtNTM1LCAgIDE1NSwgICAgIDEsICAgMTQ3LA0KKyAgLTMzMywgIC02NTMsICAtODY1LCAgLTE5NywgIC0xNTgsICAgLTIxLCAgIC00NCwgICAgOTUsICAgMTA4LA0KKyAgIDM4OSwgICA1ODgsICAgNDkwLCAgICAzMywgIC0yMzcsICAtNTI0LCAgLTYyOCwgIC0xMzYsICAtMjYwLA0KKyAgICA0MCwgIC0xNzcsICAtNDYyLCAgIDQ1MywgICA4NjIsICAgMzgwLCAgIDEzMSwgIC0xMzAsICAtNDA1LA0KKyAgIDg0MiwgIDE2NzgsICAxODQxLCAgMTU0OSwgIDE0NzQsICAxMjU2LCAgMTA4MiwgICA5MDUsICAgNzQyLA0KKyAgIDM3MCwgIDEyMTYsICAxNzY4LCAgMTYzMywgIDEyMTIsICAgNjM2LCAgICAyMiwgIC0zMzAsICAgIDcxLA0KKyAgIC03NiwgIC0yODEsICAtNzQxLCAgLTc0MiwgICA4OTgsICAgNjE5LCAgIDI3NywgICAgNzEsICAtMjIyLA0KKyAgIC0zMiwgIC0yNjUsICAtNTU2LCAgIC0yNSwgICA5OTQsICAgNjgyLCAgIDMwNSwgICAxMjYsICAtMTY1LA0KKyAgICA3MywgICA3MzgsICAgODkzLCAgIDk2OCwgICA5OTMsICAxNzY4LCAgMjI3MywgIDE4NDAsICAxMzkxLA0KKyAgIC02OSwgIC0zNDksICAtNTg1LCAgIDIzNCwgIDExNTgsICAgOTAzLCAgIDYyNiwgICA1MTAsICAgMjUxLA0KKyAgICAtMSwgICAtOTksICAtMjcyLCAgLTIxMCwgIC02MDMsICAtMzUxLCAgLTU0MCwgIC04MTEsICAtMzgzLA0KKyAgIC0xNiwgIC0yMzAsICAtNTA0LCAgIDQxMCwgICAxNDksICAtMjA1LCAgLTM0MywgIC02NTEsICAtNjM5LA0KKyAgIDEwMywgICAgLTksICAtMjI3LCAgLTIwNSwgIC01NjIsICAtNzgxLCAtMTA3OSwgLTEyMDgsICAtMTU2LA0KKyAgIDE0MywgICAgNjMsICAtMTM1LCAgIC02NywgIC0zMTcsICAtNjAyLCAgLTc4NCwgLTExNTQsICAtNjQwLA0KKyAgLTE0NCwgIC0zOTEsICAtNjc0LCAgLTYyMiwgIC0yMDAsICAtMjU0LCAgLTY2MCwgIC05NDcsICAtMzk1LA0KKyAgIC00MCwgIC0yNTAsICAtNjI1LCAgICAyNywgICA1NDMsICAgIDk0LCAgLTEzMSwgIC0zODYsICAtNjczLA0KKyAgLTEyMywgIC0zNzEsICAtNzU3LCAgLTQ1MSwgIC01NjQsICAtNjE0LCAgLTQxNSwgIC03MTEsICAgLTM1LA0KKyAgLTExNiwgIC0zMDksICAtNTkzLCAgLTI2OCwgICAyMzksICAgLTMzLCAgLTMzOCwgIC02NTAsICAtMTM1LA0KKyAgICA5NCwgICAyNTEsICAgNTU0LCAgICA1NywgIC0zMTIsICAtNDIzLCAgLTE1NCwgICAtNTcsICAgMjM1LA0KKyAgLTI2OCwgICAtNzEsICAgMzgxLCAgIDExNCwgICAtNDQsICAgLTg3LCAgIDEyNSwgICAxNzMsICAgMTMzLA0KKyAgMTUxMywgIDE3MTQsICAxMjM4LCAgIDUzNCwgICAyNzYsICAgMzE1LCAgIDQ2MSwgICA0NTksICAgNTA4LA0KKyAgLTEzMSwgICAtMTksICAxMTQ5LCAgIDY3MCwgICA0ODYsICAgMzU2LCAgIDMwOSwgICAzNjksICAgMjk2LA0KKyAgLTIyMywgIC01MDEsICAtODk5LCAgLTcyMiwgICAtNzAsICAgICA2LCAgIDEzMSwgICAzMTAsICAgMzk0LA0KKyAgIC05OSwgIC0zMDMsICAtNTE3LCAgIDI0OSwgICAgNjQsICAgLTUzLCAgIDEzNSwgICAtMTEsICAgNDUzLA0KKyAgLTE0NywgIC0zOTksICAtNzMwLCAgLTQwMSwgICA4MTcsICAgNzM4LCAgIDgwMiwgICA3NDksICAgNTc1LA0KKyAgLTE1NCwgIC00MzUsICAtNzM5LCAgIDgwMCwgICA1OTMsICAgMzY2LCAgIDUyOSwgICAzMTgsICAgMzI2LA0KKyAgLTIyNCwgICAgNDUsICAgLTM5LCAgLTM4NywgIC01MTUsICAtNTE4LCAgLTYwOCwgIC0zODQsICAtMzIxLA0KKyAgLTMxNSwgIC0zNzcsICAgMTQzLCAgLTEwMSwgIC0xMTMsICAtMzc3LCAgLTE3NywgIC0xNDQsICAgLTEyLA0KKyAgIDExNywgICAgNDAsICAtMjM5LCAgLTY1MSwgLTEwNTEsICAtNTgxLCAgLTczNywgIC05OTAsICAtMzI4LA0KKyAgICAyNiwgICAtNTAsICAtMTU3LCAgIC0yMywgIC00NTMsICAtMjgzLCAgLTUzMSwgIC01NDYsICAgMTkyLA0KKyAgLTI1MiwgIC01MDEsICAtNzQzLCAgLTU4OSwgIC02MjcsICAtNDk5LCAgLTMyOCwgIC0xMTgsICAgLTcyLA0KKyAgLTMyNCwgIC00OTQsICAtMjQ0LCAgLTMwNiwgIC0xNDQsICAtMTc3LCAgLTI2MiwgIC0xMzUsICAgLTc4LA0KKyAgIC0zNiwgIC0yMzQsICAtNTE5LCAgLTk2MSwgLTEyOTAsICAtMzE0LCAgLTQ3OSwgIC0zNzEsICAgLTQ1LA0KKyAgIC05NSwgIC0yOTIsICAtNTM1LCAgICAtOCwgIC0zMDAsICAgMTEyLCAgLTE2NCwgIC0yNzcsICAgMTk4LA0KKyAgIC05OSwgIC0xMjgsICAgODgwLCAgIDgzNiwgICA1NzksICAgMzUxLCAgICAyMywgICAtOTUsICAtMjE3LA0KKyAgIC0yNywgIC0yNTgsICAgMTI0LCAgMTAxMSwgICA1OTcsICAgNDI1LCAgIDE0NCwgICAgIDcsICAgLTczLA0KKyAgIDQyMSwgIDEyOTMsICAxNjQwLCAgMTYyMywgIDE3NDIsICAxNjE3LCAgMTQ5OSwgIDEyODQsICAxMDA2LA0KKyAgIC05NSwgICA3NTIsICAxNjgwLCAgMTU2OSwgIDE2MTgsICAxNDM2LCAgMTIwMCwgICA5ODAsICAgNzEyLA0KKyAgIC02OSwgIC0zMDAsICAtNjgzLCAgLTQzNSwgIDExMzIsICAgODk5LCAgIDUwNCwgICAzMzIsICAgMTA5LA0KKyAgIC03NCwgIC0zMjMsICAtNjM3LCAgIDU2MywgIDEwNzQsICAgNjA4LCAgIDM3MSwgICAxMDUsICAgLTQ5LA0KKyAgIC03OCwgICA4MzEsICAxMTk0LCAgMTExMCwgIDEzNzgsICAxNDgxLCAgMTQ5MiwgIDEzNjUsICAxMjE3LA0KKyAgLTI1OSwgIC0xMjEsICAxNDQwLCAgMTMzNCwgIDE2MjgsICAxNDkwLCAgMTQzOCwgIDEyMjMsICAgOTMzLA0KKyAgIC04MiwgIC0zMDYsICAtNjEzLCAgLTIyMiwgIC0zNzgsICAtNjc1LCAgLTU0NSwgIC02NzEsICAtODQ1LA0KKyAgICA1MywgIC0xMjQsICAtMzQ3LCAgIDQyMiwgICAgNTIsICAtMTI1LCAgLTI3MCwgIC01MjksICAgICA5LA0KKyAgICA3OSwgICAtODksICAtMzIwLCAgLTY2MiwgIC05OTksIC0xMTk5LCAtMTI0MywgIC02NzYsICAtMjk3LA0KKyAgIC02OCwgIC0yNzMsICAtNjExLCAgIDEzNywgIC0xNDYsICAtMzk3LCAgLTYyNywgIC04NDUsICAtMjIwLA0KKyAgLTExMiwgIC0zNDYsICAtNzk3LCAgLTgyNiwgICAyMzQsICAtMTMyLCAgLTE4OCwgIC0yNzgsICAtNTIyLA0KKyAgLTE1OSwgIC00MDUsICAtNzM0LCAgLTQxOSwgICAyOTMsICAgIDc0LCAgLTE2NywgIC0xNjcsICAgMTg0LA0KKyAgLTE1MywgIC00MzcsICAtODMzLCAtMTA4MCwgIC0zMzYsICAtNDcyLCAgLTU2MSwgIC0zNDAsICAtMjUzLA0KKyAgLTE2OSwgIC00MjMsICAtODIwLCAgLTkwNCwgIC0xMzEsICAgLTE5LCAgLTM0NiwgIC02MDQsICAgIDMxLA0KKyAgICAzMywgICAtMzEsICAgMzEyLCAgICA2MiwgIC0xNDgsICAgIDQ5LCAgIC01OSwgICA1NjQsICAgNDg2LA0KKyAgLTMwNiwgIC0zMzMsICAgMTk0LCAgIC00NCwgICAgNjcsICAgIDcyLCAgIDE0NywgICAyMDUsICAgMjQzLA0KKyAgLTIwNywgICAtNDksICAxMzYwLCAgIDk4MywgICA5NjksICAgOTkxLCAgMTAxNCwgIDExMTAsICAgOTczLA0KKyAgLTIxMSwgIC0xNzIsICAgODgzLCAgIDYyNywgICA3MTEsICAgNjc0LCAgIDcwNSwgICA3OTgsICAgNzQ2LA0KKyAgIC04OCwgIC0zMjUsICAtNzYzLCAgLTk3NCwgICA2ODcsICAgOTA4LCAgIDUxNCwgICAzODIsICAgMTcyLA0KKyAgLTI5MiwgIC02MTIsICAtODA1LCAgICA2MywgICAxMzEsICAgMjcwLCAgIDI1OSwgICAzNTIsICAgMzQ4LA0KKyAgLTIzNSwgICAtODQsICAgOTU1LCAgIDgxOCwgIDExMjAsICAxMjg5LCAgMTU1OSwgIDE0ODAsICAxMjg1LA0KKyAgLTE4MCwgIC00NjEsICAtNjE0LCAgIDY1NywgICA2OTEsICAgNzQ1LCAgIDg1NCwgICA3ODMsICAgNzEzLA0KKyAgIC05NywgIC0zMDksICAtNDc3LCAgLTYxNCwgIC03NzcsICAtNzM0LCAgLTc2OCwgIC01MjYsICAtNDcyLA0KKyAgLTM0NCwgIC00NzYsICAgLTM1LCAgLTE2OSwgICAgNDksICAgLTc3LCAgLTE1MCwgIC0yNDAsICAtMTQxLA0KKyAgIC01MiwgIC0yNjgsICAtNjM5LCAgLTkxOSwgLTEyNzgsIC0xMTEzLCAgLTM0MiwgIC0zMzMsICAtMTUxLA0KKyAgIC02OCwgIC0yNDIsICAtNTg1LCAgIC03MywgIC0yMDksICAtNDc4LCAgLTE1OSwgIC00MjksICAgMTMzLA0KKyAgLTE5NywgIC00OTksIC0xMDA1LCAtMTI2OCwgIC0yNzIsICAtMjI0LCAgLTEwNSwgICAtNjcsICAgIDE3LA0KKyAgLTM2MywgIC02MTgsICAtNDE0LCAgLTExNiwgICAtNjIsICAgIDIwLCAgICAxMCwgICAxMTYsICAgMTA4LA0KKyAgLTE5NSwgIC00NzUsICAtOTA2LCAtMTI2MCwgIC04OTEsICAtNDQxLCAgLTI3NywgIC0xNDIsICAgLTI4LA0KKyAgLTIyNiwgIC01MTksICAtOTUwLCAgLTcwMCwgIC0yNzUsICAtMjY2LCAgLTExNiwgIC0xMDUsICAgIDgyLA0KKyAgIDQwNCwgICA1MTEsICAgNTIwLCAgIDMyNywgICAgMTcsICAtMTk0LCAgLTMzMywgIC01MzYsICAtNTg2LA0KKyAgLTExNCwgIC0xMzAsICAgMjc2LCAgIDIzNywgICAyMDQsICAgMzQyLCAgIDEzNSwgICAtMTYsICAtMTExLA0KKyAgIDY3MCwgIDEyMDgsICAxMTY4LCAgIDg2MCwgICA3NDIsICAgNjAxLCAgIDUyOCwgICA0MDMsICAgMzA5LA0KKyAgIDM5NywgICA2MjEsICAgOTY2LCAgIDc1MiwgICA1NzksICAgMzk4LCAgIDQwMCwgICAzMjksICAgMjUyLA0KKyAgIDE5MSwgICAxODAsICAtMTM3LCAgLTQ2NywgICAyNzIsICAgMTA2LCAgIC05NSwgICAgMTcsICAtMTkyLA0KKyAgIC04MCwgIC0yOTAsICAtNjI2LCAgIDE5NCwgICA1OTgsICAgMTk2LCAgICAyMSwgIC0yODEsICAgIDc3LA0KKyAgIDUxMCwgICA4NjQsICAxMTA4LCAgIDgwNywgICA5MzksICAgOTAyLCAgIDkyNSwgICA3MTcsICAgNDgxLA0KKyAgIDEzNywgICAzNjcsICAgNTM0LCAgIDc2NCwgICA2NzAsICAgMzgyLCAgIDI5NiwgICAxNTMsICAgIDg0LA0KKyAgIDMwMywgICA0OTcsICAgMTQ0LCAgIC04NSwgIC0xMjUsICAtNTM5LCAgLTQ4MiwgIC00NjQsICAtNzY0LA0KKyAgIDIzMywgICAzNDcsICAgIDY4LCAgLTE0NywgICAxNjksICAtMjEwLCAgLTI0MiwgIC0yMjYsICAtNDgyLA0KKyAgIDMwNywgICA0MjIsICAgMTU0LCAgLTE3NSwgIC0zODYsICAtNzIyLCAgLTcyNCwgIC05MDQsIC0xMDE1LA0KKyAgIDMwOSwgICAzMDgsICAgMTYwLCAgIC02MCwgIC00NzAsICAtNDIwLCAgLTU5OCwgIC03OTEsICAtMjE5LA0KKyAgICA2OCwgICAxMjEsICAtMTM3LCAgLTU2MCwgIC0xNDYsICAtNDQ2LCAgLTUxNSwgIC00OTQsICAtNzI5LA0KKyAgIDEzMCwgICAgNTMsICAtMjI3LCAgICA0NiwgICA0NzQsICAgIDMyLCAgLTE2MSwgIC0xOTIsICAtNDkwLA0KKyAgIDIxMywgICAxNjQsICAgLTcxLCAgLTQ2NSwgIC04NzYsICAtMTYxLCAgLTQ1NiwgIC01ODcsICAgLTQ4LA0KKyAgIDIxOCwgICAxMTcsICAgIDM5LCAgIDE3NywgIC0xOTQsICAgLTg4LCAgLTIyNiwgIC00MTgsICAgIDUwLA0KKyAgIDIxMCwgICA1NDcsICAgNTY5LCAgIDI3OSwgICAxMjEsICAgLTQ0LCAgIC01MCwgICAgMTAsICAgLTg0LA0KKyAgICA1OCwgICAxNDAsICAgMTgyLCAgICAtNSwgICAyNjcsICAgMTE3LCAgIDEwNiwgICAyMTEsICAgMTk4LA0KKyAgIDUzOSwgICA4MzUsICAgOTEzLCAgIDcxOSwgICA2MTcsICAgNTQ0LCAgIDU5MSwgICA1NjUsICAgNjQyLA0KKyAgIDE1MywgICA1NTksICAgODcyLCAgIDQ2MCwgICAyMjIsICAgMTA4LCAgIDE4OCwgICAxODAsICAgMTgzLA0KKyAgIDE1OCwgICAxMTksICAgMjg0LCAgLTE1MywgIC0yNzEsICAgMjI5LCAgICA4NywgICAxMTAsICAgLTU3LA0KKyAgLTE4MywgICAgODIsICAgMTE4LCAgICAyMSwgICAgMTMsICAgIDQwLCAgIDExOCwgICAxOTEsICAgMTg1LA0KKyAgIDE2MiwgICA4ODksICAgNjU0LCAgIDEwOCwgICAtMzQsICAgMjQ0LCAgIDQ4OCwgICA1NjEsICAgNTMyLA0KKyAgIDE2MywgICAgNTYsICAgNjA5LCAgIDM0MSwgICAgNTAsICAgMzI5LCAgICA2OCwgICAyNjYsICAgMjE4LA0KKyAgIDEwMCwgICAyMDYsICAgIDE4LCAgLTMwNCwgIC0xMDcsICAtNDM2LCAgLTQ4NywgICAtNjUsICAtMzA2LA0KKyAgIC04NiwgICAxNTQsICAgMTM0LCAgIC0zMCwgICAtNDUsICAgLTczLCAgLTEwNCwgICAtODAsICAgLTk2LA0KKyAgIDI0NSwgICAzMzAsICAgIDEwLCAgLTQ0MCwgIC04NDksIC0xMDgyLCAgICA3OSwgICAgNDAsICAtMjY1LA0KKyAgIDE5NiwgICAzNzIsICAgMjcyLCAgLTE4MSwgIC00OTMsICAtMzg5LCAgIDI3NSwgICAgODAsICAgLTU5LA0KKyAgICAgMiwgICAtMTIsICAtMjQ2LCAgLTUwNSwgIC0xMDAsICAtNDM2LCAgICAyMSwgIC0xODcsICAtNDMxLA0KKyAgLTIyMSwgICAtNDgsICAgIDM2LCAgLTI3MSwgIC0xODYsICAtMTQ3LCAgLTEwOSwgICAgMjYsICAgIDcxLA0KKyAgIDIxMywgICAxNDAsICAgIDcyLCAgLTM1MSwgIC02MjAsICAgLTg0LCAgLTM2MywgICAgNjksICAgIDQ2LA0KKyAgICA5MSwgICAxNjcsICAgIC0zLCAgIC05NSwgICAtOTksICAtMTA1LCAgIC00OCwgICAxMTQsICAgMTQ3LA0KKyAgIDI1OSwgICAyNDksICAgMTcyLCAgIDYwNywgICA0MDYsICAgIDUyLCAgICA1OSwgIC0xODksICAtMzIwLA0KKyAgIDExNSwgICAtODUsICAgLTU0LCAgIDU3NCwgICAxMjgsICAgMjI2LCAgIC01OSwgIC0yNTMsICAgMTMwLA0KKyAgIC02MiwgIDEwMzMsICAxMzA4LCAgMTAzNSwgIDExMjcsICAxMDk4LCAgMTAyOSwgICA5NjEsICAgODIzLA0KKyAgICAzOSwgICAzNjQsICAgNzU3LCAgIDk0MCwgICA3MjgsICAgNjYwLCAgIDY1OSwgICA1ODMsICAgNzcwLA0KKyAgLTExNSwgIC0zMzgsICAtNzYwLCAgLTQ3MSwgICAzOTQsICAgIDM3LCAgIDQ0MSwgICAxNzgsICAgICA2LA0KKyAgIC01NywgIC0zMDUsICAtNTI1LCAgIDc5NiwgICA0NTMsICAgMTg4LCAgICAtNCwgIC0xMTQsICAgMjQ4LA0KKyAgICA3MSwgICA0NDQsICAgNzk3LCAgIDczMSwgIDEwOTYsICAxMTU3LCAgMTIyMiwgIDEwMjksICAgODExLA0KKyAgIDEzNSwgICAzNTksICAgNTUxLCAgIDQyNSwgICA3NDksICAgODE1LCAgIDg3NCwgICA3MDQsICAgNTAyLA0KKyAgIDEzMiwgICAyNDcsICAgICAwLCAgLTIwNiwgIC00NDksICAtNzUwLCAgLTI1OCwgIC01MTQsICAtNjMzLA0KKyAgIDI0OCwgICAyNDksICAgIDkxLCAgIDEyMSwgIC0xOTUsICAtNDk5LCAgIC05MCwgIC0yODIsICAtNDM1LA0KKyAgICA3OCwgICAgMjAsICAtMjc3LCAgLTYyMywgIC05ODMsIC0xMjI0LCAgLTQxNSwgIC00NTgsICAtNjM5LA0KKyAgIDM0NywgICA1MDksICAgMjA4LCAgLTE3OSwgIC00NjQsICAtNzI4LCAgIC03NiwgIC0yMzcsICAtNDg2LA0KKyAgLTEwMywgIC0zNDMsICAtNzU2LCAgLTcxMywgIC0yNjUsICAtNjA5LCAgLTE5MSwgIC0zOTgsICAtNjM2LA0KKyAgLTEyMSwgIC0zODMsICAtNzQ5LCAgIDU2NywgICAyNTIsICAgLTM2LCAgLTM1NCwgIC00MTcsICAgLTUwLA0KKyAgIDIwNCwgICAxMDAsICAtMTQ5LCAgLTY1MCwgLTEwODEsICAgLTQ3LCAgICAtNywgIC0yNjMsICAgMTExLA0KKyAgIC00NiwgIC0xODAsICAtMjY3LCAgLTMyNCwgIC01NjIsICAtMzk0LCAgLTY5MiwgICAzOTgsICAgMjkyLA0KKyAgIDQ4MiwgICA2NzAsICAgNjgzLCAgIDYyNCwgICA0NDIsICAgMTY1LCAgIDExNiwgICAgMzYsICAtMTQ5LA0KKyAgIDEwOCwgICAyNDcsICAgMjkxLCAgIDI0NywgICAzNTUsICAgMTIyLCAgIDEwOSwgICAyMjQsICAgMjk2LA0KKyAgIC0xNCwgICA5NDUsICAgOTkwLCAgIDgwMSwgICA3NTUsICAgODE1LCAgIDg0NywgICA5MTMsICAgODkyLA0KKyAgIDI5MiwgICAzNDksICAgNzI1LCAgIDQ4MiwgICAzODgsICAgMzI5LCAgIDQyOSwgICA2MjAsICAgNjY3LA0KKyAgIC0zNCwgICAxOTcsICAgMjEzLCAgLTEyNywgICAgODQsICAgNDk0LCAgIDYyMCwgICA1NzUsICAgMzc1LA0KKyAgIDEyNiwgICAyMDcsICAgMTcyLCAgIDE2NywgICAzNjIsICAgMjAyLCAgIDI5NiwgICAzOTUsICAgNDU1LA0KKyAgICAtNiwgICAyNTAsICAgNTM5LCAgIDQ2NywgICA2MzYsICAgODAxLCAgMTE0OSwgIDEyODcsICAxMTE4LA0KKyAgICAyNywgICAyNDAsICAgMzY5LCAgIDI4MCwgICA0NDAsICAgNDExLCAgIDYzNCwgICA4OTIsICAgOTUzLA0KKyAgIDE1OSwgICAxNzAsICAgLTU4LCAgLTM5NSwgIC03OTcsICAtNjkwLCAgICA3NywgIC0yMTEsICAtMzM0LA0KKyAgICAtNSwgICAtMjgsICAgLTEzLCAgIC03NCwgIC0zMzUsICAtNjAzLCAgIDMwMCwgICAgODgsICAtMjA1LA0KKyAgICA4MiwgICAtMzMsICAtMzY0LCAgLTY5OCwgLTEyMDMsIC0xMTUzLCAgIDExMCwgIC0xNDYsICAtMjg5LA0KKyAgIDExMywgICAgIDEsICAtMjQzLCAgLTU4OCwgIC05OTQsICAtNDk2LCAgIDQxNCwgICAxNjAsICAgIDQyLA0KKyAgIC01NiwgIC0yNDcsICAtNDQwLCAgLTY5MywgIC05OTYsICAtNDc5LCAgICAxMSwgIC0xNzgsICAtMzU3LA0KKyAgLTE1MSwgIC0zNTMsICAtMzI3LCAgLTIxMSwgIC0zNDAsICAgMTQxLCAgICA2NSwgICA0MjUsICAgNDUzLA0KKyAgICAzNCwgIC0xNjksICAtNDU1LCAgLTkzMiwgLTEyMTUsICAgMTM4LCAgIDQ5OSwgICAyNTYsICAgMzI0LA0KKyAgICA2OCwgICAxMzksICAgLTE1LCAgLTU0NywgIC00NzgsICAgIDE3LCAgIDMwNiwgICA1MDIsICAgNDgxLA0KKyAgIC0zMiwgIC0xMzQsICAgNDQ1LCAgIDEyOSwgIC0xNDMsICAtMjQ0LCAgLTUwMywgIC01MDcsICAtNTk5LA0KKyAgICA2MSwgIC0xNDAsICAtMzQ1LCAgIDQ5NiwgICA0NTgsICAgIC0yLCAgICAyMCwgIC0yMjcsICAtNTE0LA0KKyAgIDM5NCwgIDE3NjUsICAxNjY2LCAgMTMzOSwgIDExMTcsICAgODA2LCAgIDY0MiwgICA0NzksICAgMzgwLA0KKyAgIDIxNSwgICA1MTksICAgOTIwLCAgMTA1MywgIDEwOTAsICAgNzkxLCAgIDUyOCwgICAyOTAsICAgMTU1LA0KKyAgIC01NCwgIC0yMzMsICAtNjQ3LCAgLTYwMiwgICA2MzksICAgMjk0LCAgICAtMiwgIC0xNjcsICAtNDQyLA0KKyAgIC03OCwgIC0zMTUsICAtNzkxLCAgLTExMywgICA4MjAsICAgNDAzLCAgIDE1OCwgIC0xMTYsICAtMzU2LA0KKyAgIDUyOSwgIDE4NTEsICAyMDAzLCAgMTIyOCwgICA2MjIsICAgLTQxLCAgLTQxNiwgICAzNDQsICAgODE5LA0KKyAgLTEwNSwgIC0zNzksICAtMjM2LCAgMTIyNCwgICA4OTMsICAgNzQ5LCAgIDU2OCwgICAzNTYsICAgMjE0LA0KKyAgIC0xNywgIC0xOTksICAtMTQ0LCAgICA1MCwgIC0yODMsICAtMjQ3LCAgLTU3OCwgIC04NDYsIC0xMDg3LA0KKyAgICA2OSwgICAtMTEsICAtMzgxLCAgLTIwNiwgICAyMDksICAtMjg0LCAgLTM4NywgIC00MTYsICAtNzE2LA0KKyAgICAzOSwgICAgLTUsICAtMTQ1LCAgLTM3NCwgIC02ODIsICAtOTA5LCAtMTA3NCwgLTExNjksIC0xMDY2LA0KKyAgIDI4NywgICAyMjYsICAgIDY3LCAgLTIyMSwgIC02NjIsICAtMTcxLCAgLTQyMSwgIC02NDIsICAtNzA3LA0KKyAgLTEzMiwgIC0zNDgsICAtNTM4LCAgLTQ0OCwgICAtMjAsICAgIC00LCAgLTM1NCwgIC03NDgsICAtOTMzLA0KKyAgICAgNCwgICAtNzUsICAtMjg5LCAgLTU5OCwgICAzMTcsICAgIDUyLCAgLTIwOCwgIC0yOTcsICAtNTU5LA0KKyAgIC04OCwgIC0yNjQsICAtMzU4LCAgLTU4OSwgIC02MzEsICAtMjQ4LCAgLTUyMywgIC04MjIsIC0xMDcxLA0KKyAgICA3MCwgICAgLTgsICAgIDU0LCAgLTMxNCwgIC01MTUsICAgIDkyLCAgLTE0NiwgIC0yNzQsICAtNDkzLA0KKyAgIDE5OSwgICAgNjIsICAgMzkxLCAgIDE1OCwgIC0xNDEsICAgIDcxLCAgLTIxOSwgIC0yMDMsICAtMjA3LA0KKyAgIDE1MiwgICAgNDAsICAgMzI5LCAgIDE2MiwgICAtMjksICAgIDQ4LCAgLTE0OSwgICAxMDgsICAgMTI3LA0KKyAgIDYzNSwgIDEwNTgsICAgODgzLCAgIDQ5MiwgICAzNzIsICAgMzEyLCAgIDMxNywgICAyNzQsICAgMjQxLA0KKyAgIDI2NywgICA3MjIsICAxMjU2LCAgIDg4MiwgICA2MjUsICAgMjQ4LCAgICAgOCwgICAtODEsICAgLTYwLA0KKyAgIC01OCwgIC0xMzgsICAtMjkxLCAgLTYwMCwgICAtMTIsICAgIC0yLCAgIC0zOSwgICAxNDcsICAgMTE3LA0KKyAgLTEwNywgIC0zNDUsICAtNTEzLCAgIDQ1OSwgICAgNzYsICAgIDkyLCAgLTI3MiwgICAzODgsICAgMjYyLA0KKyAgIDM2MiwgICA1MTYsICAgMjAzLCAgLTQwOSwgIC03MTYsICAtODMxLCAgLTMzMSwgICAxODUsICAgMjA5LA0KKyAgLTExNywgIC0zOTEsICAtMjk4LCAgIDY3MSwgICAyOTIsICAgNTM4LCAgIDI1NywgICAxNjYsICAgLTM4LA0KKyAgLTEwMiwgIC0zMTksICAtMTk0LCAgLTI4MywgIC01NzMsICAtMjYyLCAgLTU3OSwgIC0yMTksICAtNDQ0LA0KKyAgLTIzNSwgICAgNzgsICAgIDExLCAgLTE2OCwgIC0xMDEsICAtMjI5LCAgLTI2MywgIC0zMjEsICAtMTIzLA0KKyAgICA3MCwgICAgNTAsICAtMTcwLCAgLTU5OSwgIC05OTYsICAtNTg4LCAgLTI2MywgIC01MTYsICAtNDU1LA0KKyAgIDM5NCwgICAzNjMsICAgMjI5LCAgLTEzNiwgIC01MzgsICAgIDIxLCAgLTE4MywgIC0zNDgsICAtMjAxLA0KKyAgLTEyNCwgIC0zNjgsICAtNjQwLCAgLTg3OSwgIC04NDcsICAtMjA5LCAgLTQwOSwgIC00OTQsICAtNTE1LA0KKyAgLTEyNywgIC0zNDEsICAtNTQxLCAgLTQyNSwgIC01MTAsICAgLTEwLCAgLTI1MiwgIC00NzMsICAtMjkxLA0KKyAgICA4NCwgICAtNjksICAtMjAxLCAgLTY3NiwgIC04NjgsICAgMTAzLCAgLTMxMSwgIC0xMzIsICAtMzIwLA0KKyAgICAgNSwgIC0xNzMsICAtMTg4LCAgLTI5NywgIC02MjgsICAgMTk3LCAgIC01NywgICAgIDcsICAgLTExLA0KKyAgICA0OSwgIC0xNjAsICAgIDU2LCAgIDU1OCwgICAxMTEsICAgIDMzLCAgLTMxMSwgIC00NDAsICAtNDYzLA0KKyAgICAtMSwgIC0yNDYsICAtMzA3LCAgIDg2MiwgICA0NTMsICAgMTM5LCAgLTE3MCwgIC0zNTUsICAtMjMyLA0KKyAgIDI3OSwgICA5NjYsICAxNjQyLCAgMTQ3OCwgIDE0NjMsICAxMTIzLCAgIDc5NSwgICA1MjUsICAgMzM5LA0KKyAgLTE5NywgICAtMzgsICAxNzAyLCAgMTMzMSwgIDEyNTIsICAgOTUwLCAgIDY5MiwgICA1MDQsICAgNDI2LA0KKyAgLTEwOCwgIC0zNDQsICAtODYxLCAtMTE3MiwgICA0NDQsICAgMzU0LCAgICA4OCwgICAtNDYsICAtMjIwLA0KKyAgIC01MywgIC0zMjEsICAtNDk0LCAgMTExMywgICA3NDQsICAgMzY0LCAgIDE5OCwgICAtMzQsICAgLTc1LA0KKyAgIDQ1NywgICA5NTUsICAxMTc3LCAgMTIxNCwgIDE0MjcsICAxNDU3LCAgMTM0NSwgICA5MTcsICAgNTM5LA0KKyAgIC02OSwgICAxOTksICAgODk3LCAgMTE0MCwgIDEzNDMsICAxMTgzLCAgIDk3NywgICA3NDIsICAgNTIyLA0KKyAgIDEyMiwgICAgNDQsICAtMjY5LCAgICAyNywgIC0xNTUsICAtNTYyLCAgLTMwNywgIC01OTAsICAtNzczLA0KKyAgIDE1NCwgICAgNDIsICAtMTYwLCAgIDI1MiwgIC0xMjksICAtMzA1LCAgLTQ3MSwgIC03MzMsICAtMzcxLA0KKyAgIDEzNSwgICAxODUsICAgLTgyLCAgLTQxNiwgIC03MjIsICAtOTEzLCAgLTUwNCwgIC03NDMsICAtODgwLA0KKyAgIDE0OSwgICAyMTQsICAgLTg0LCAgLTMyOSwgIC02ODAsICAtODM1LCAgLTQyNiwgIC02NjEsICAgLTgxLA0KKyAgLTEyOCwgIC0zODAsICAtNzM1LCAgLTk5OCwgIC0zMzcsICAgIDE3LCAgLTE4MiwgIC00NjcsICAtNjk3LA0KKyAgIC04NCwgIC0yOTAsICAtNTEwLCAgLTU5MiwgICAgMTMsICAgNDQwLCAgIDE1NCwgICAtMzgsICAtMjc5LA0KKyAgICA3MCwgICAtNjEsICAtMjQ2LCAgLTcyNywgLTEwNDcsICAgLTgwLCAgLTM4MSwgIC01MzUsICAtNzA0LA0KKyAgIDE3OCwgICAgLTIsICAtMTQ2LCAgLTY3MCwgIC05MzgsICAgNDgyLCAgIDEzOCwgICAgNjMsICAgIDY1LA0KKyAgIC0xMSwgICAgMTUsICAgNzcyLCAgIDQ0MywgICAxNDIsICAgLTIwLCAgLTIwOSwgIC0xMjYsICAtMTYxLA0KKyAgIC0zMiwgIC0yNDksICAgIDk1LCAgIDU1MiwgICAxMjQsICAgIDMwLCAgLTM0MywgICAgODIsICAgLTg2LA0KKyAgIDE0OCwgICA3NTEsICAxNTE1LCAgMTEwNSwgICA4NjcsICAgNjA2LCAgIDQ3NCwgICA0NDgsICAgMzk5LA0KKyAgLTE2MywgIC0yNTcsICAgODk5LCAgMTA5NywgICA5MDYsICAgNzUxLCAgIDUwMiwgICAzOTAsICAgMjk0LA0KKyAgIC01MSwgIC0yNTgsICAtNDQ3LCAgLTgwNiwgIC0zNjgsICAgNzYzLCAgIDQ2NCwgICAzNjQsICAgMTgzLA0KKyAgLTE2NiwgIC0zNzQsICAtMzY3LCAgICA4NywgICAgMzUsICAgMzk5LCAgIDQxOCwgICA4NTYsICAgODMzLA0KKyAgLTIwNSwgIC0zMTAsICAgNTg4LCAgIDc3OCwgICA3ODUsICAxMDY1LCAgMTExOCwgIDEyNDUsICAxMTU3LA0KKyAgLTE3MywgIC0zMTIsICAgMTA3LCAgIDM0NSwgICA0MDAsICAgNzkwLCAgIDg3MCwgIDExMTMsICAxMDAxLA0KKyAgICAtNywgIC0xMjAsICAtMzg3LCAgLTQxMCwgIC02MTQsICAtOTQzLCAgLTIyNiwgIC0zODQsICAtNDkxLA0KKyAgLTIwMywgIC0yODgsICAgLTUxLCAgLTMzMSwgICAtOTAsICAtMTc4LCAgLTQwOCwgIC01NzMsICAtMzM4LA0KKyAgICA1NiwgICAtMjksICAtMjczLCAgLTYyNywgLTEwNDEsICAtNzk4LCAgLTI0NywgIC00NjcsICAgMTQ4LA0KKyAgICA2NiwgICAgLTIsICAtMjA1LCAgLTIwNSwgIC01NzUsICAtMzQ5LCAgIC01NywgIC0zNTIsICAgLTU4LA0KKyAgIC00NSwgIC0yMjUsICAtNDcxLCAgLTkyNCwgIC00OTcsICAgIDc3LCAgIC0zMiwgICAgNDQsICAtMTM1LA0KKyAgLTI3NywgIC00OTEsICAtNDk3LCAgLTUwMiwgIC00MjQsICAtMjAyLCAgLTEzNywgICAgNzcsICAgIDk2LA0KKyAgICAyNiwgIC0xNzksICAtNDY5LCAtMTAwOCwgLTEyNjAsICAgMjYyLCAgIC0zNSwgIC0xMzIsICAtMjU5LA0KKyAgIC02NiwgIC0yMzIsICAtNDQ3LCAgLTUzMywgIC03ODksICAtMTkxLCAgLTEwMCwgIC0yNjcsICAgMzY0fTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAxc3Qgc3RhZ2UgY29kZWJvb2s7IDJuZCBzcGxpdDogICBpc2Y5IHRvIGlzZjE1DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzJfaXNmW1NJWkVfQksyKjddID0gew0KKw0KKyAgMTM1NywgIDEzMTMsICAxMTM2LCAgIDc4NCwgICA0MzgsICAgMTgxLCAgIDE0NSwNCisgICA2MzYsICAgNjQ4LCAgIDY2NywgICA1NjgsICAgNDQyLCAgIDIxNywgICAzNjIsDQorICAgNDI3LCAgIDQ0MCwgICA2NzQsICAgNTI0LCAgIDMzMiwgICAxMTcsICAtNDE3LA0KKyAgIDEyMSwgICAyOTUsICAgNDY4LCAgIDQ2NSwgICAyMzAsICAgIDQ0LCAgLTIyMSwNCisgIC0xNDcsICAtMjQwLCAgIDE0OSwgICAgODAsICAgMzkwLCAgIDI3OCwgICAxMDYsDQorICAtNDE4LCAgLTU1NiwgICA1NTIsICAgNTExLCAgIDIzNSwgICAxNDQsICAgLTk1LA0KKyAgICA0MywgICAxOTMsICAgMjc0LCAgIDE1MCwgICAgNjcsICAgIDM0LCAgLTI3MywNCisgICAtNDMsICAtMTI2LCAgIDE3MSwgICA0MTYsICAgMjgyLCAgICA2MywgIC0zNTQsDQorICAtMzcyLCAgIC04NiwgIC0zNDQsICAtMTA4LCAgIC05NCwgIC0xODIsICAgLTg5LA0KKyAgLTYwMCwgIC04NDAsICAtMjAwLCAgIDQ2NSwgICAyNTgsICAgLTExLCAgLTI1MywNCisgICAtNDgsICAgMzI5LCAgICA5NywgIC0yOTAsICAtNTQzLCAgLTc5NSwgIC0zNTQsDQorICAtNTcwLCAgLTExNywgICAxODcsICAgIDEwLCAgLTEzMywgIC00MTYsICAgLTc2LA0KKyAgLTYxOCwgIC0xMjksICAtMjQ3LCAgLTM3MSwgICAgNDUsICAgLTc2LCAgIDI3NywNCisgLTEwMjIsIC0xMDc5LCAgIDEyNiwgICA0NzQsICAgMjU0LCAgIDEyNywgICAgNTIsDQorICAtMjgxLCAgICA3NiwgIC0xNjcsICAtMzYxLCAgLTI4MywgIC01NTEsICAtMjgzLA0KKyAgLTExOSwgICAtNTIsICAgIC0xLCAgIDEzNCwgICAtMzIsICAtMjA0LCAgLTQxNSwNCisgIDEwNjQsICAgODI3LCAgIDYzNywgICA2ODQsICAgNDY0LCAgIDIwOSwgICAgMTIsDQorICAgNDgyLCAgIDQxNiwgICA0NDksICAgMzcxLCAgIDMzNSwgICAyOTQsICAgMTk0LA0KKyAgIDcxOSwgICA1NzYsICAgMzY1LCAgIDEzNSwgICAxMTMsICAgIDkxLCAgLTE5OSwNCisgICAyOTgsICAgMTc2LCAgIDQ5MywgICAzNjYsICAgMTk0LCAgIDE2MywgICAgMzYsDQorICAgLTM1LCAgLTIzNiwgIC0yNTksICAgLTM2LCAgICAtNCwgICAgOTksICAgMTUyLA0KKyAgIC05OCwgIC0zMDYsICAgLTI3LCAgIDIyOCwgICAgOTAsICAgMTExLCAgIC04NiwNCisgICAgOTEsICAgIDEzLCAgLTIxMSwgIC0yNTgsICAtMTA2LCAgICA4NiwgICAtNjQsDQorICAgIDczLCAgIC0zNSwgICAtNTcsICAgLTMxLCAgIDE2MiwgICAgMzUsICAtMTkyLA0KKyAgLTEwOSwgIC0zMzUsICAtNjI5LCAgIC02NiwgICAtNjEsICAtMTI4LCAgIDMyMiwNCisgIC00OTUsICAtNjY5LCAgLTcyOCwgICAxOTMsICAgIDMxLCAgLTIyMCwgICAxMjIsDQorICAgMzI0LCAgICA5NSwgICAtODksICAgLTkxLCAgLTQwOSwgIC03MTAsICAtMTU0LA0KKyAgICAgMCwgIC0yMzQsICAgIDkyLCAgICAzMywgIC0zNDMsICAtNjA5LCAgLTIyMCwNCisgIC0zNDMsICAtNDA4LCAgLTQ3NiwgIC02NTUsICAtMTUzLCAgICA4MiwgICAyMjIsDQorICAtNDkwLCAgLTc0NSwgIC0yNTUsICAgIDQ5LCAgIC00OCwgICAxMzUsICAtMTI3LA0KKyAgIDExOSwgICAtNjcsICAtMzI4LCAgLTM5MCwgIC0yNzIsICAtNTQ1LCAgIC01NiwNCisgICAtNTcsICAtMTMwLCAgIC0xMCwgICAgLTcsICAtMTY0LCAgIC00NywgICAtMjIsDQorICAgOTg0LCAgMTA2NCwgICA5NjEsICAgNTY4LCAgIDIxMCwgICAtMjcsICAgIDE2LA0KKyAgIDgxMSwgICA2OTEsICAgNzU0LCAgIDUxNCwgICAyMjQsICAgLTM1LCAgIDE2NiwNCisgICA2NjIsICAgNzA0LCAgIDYxOCwgICAzODYsICAgIDU3LCAgLTIxMSwgIC0yNTcsDQorICAgNTEwLCAgIDM1OSwgICA0MTgsICAgMzkzLCAgICA5MSwgIC0xNDQsICAgLTE4LA0KKyAgLTE5MywgICAtMzEsICAgLTI3LCAgIDIyMywgICAgODksICAtMTQzLCAgICAyNCwNCisgIC0xMTIsICAgLTk4LCAgIDQ3MSwgICAzMTksICAgMTg1LCAgICAgMywgICAxNzUsDQorICAgMjUyLCAgIDE0NiwgICAtNDcsICAgMjcyLCAgICA0OCwgIC0yMTEsICAtMjM0LA0KKyAgIDE0NiwgICAgNjksICAgMjAzLCAgIDM2NCwgICAgNjgsICAgLTUyLCAgICA1MSwNCisgIC0yNTksICAtNDc4LCAgLTY5NywgIC0zNDksICAtNzU4LCAgLTUwMSwgICAgNjMsDQorICAtNTAxLCAgLTc2OSwgIC0yODksICAgIDc5LCAgLTMxMSwgIC00OTcsICAtMTA2LA0KKyAgIDI1MSwgICAgNTMsICAtMjM1LCAgLTQ2OSwgIC04OTUsICAtODg0LCAgIDE0NSwNCisgIC00MTYsICAtNTUxLCAgIDE0MCwgIC0xMzMsICAtNTIzLCAgLTc3NSwgICAgNDQsDQorICAtMzI2LCAgLTQyMywgIC03MTMsICAtNDk3LCAgIC04NiwgIC00MzEsICAgIDk5LA0KKyAgLTc1NywgIC03NzIsICAtMTYwLCAgIC03NiwgICAtNDYsICAgLTMyLCAgIDM3OSwNCisgICAgODUsICAgLTM1LCAgLTIwMCwgIC00MDEsICAtNjYzLCAtMTA0MCwgIC0yNDcsDQorICAtMTgwLCAgLTMzMCwgICAtOTIsICAtMzc2LCAgICAyNywgIC0xODMsICAtMTEwLA0KKyAgMTI3OSwgIDEwODYsICAgNzgxLCAgIDUwMiwgICAzMjQsICAgMTY0LCAgIDE1NywNCisgICA2ODIsICAgNDY2LCAgIDQ0OSwgICAyNzcsICAgMTQ2LCAgICAyOCwgICA0MDksDQorICAgNjM1LCAgIDQ3MiwgICAzOTAsICAgMTA3LCAgLTIzMiwgIC01MzgsICAtMTM5LA0KKyAgIDE5NiwgICAzOTYsICAgMzMyLCAgIDIxMywgICAyMDksICAgLTI5LCAgIC04MSwNCisgICAxNTAsICAgLTk1LCAgLTMxMiwgICAgNzYsICAgLTc3LCAgLTMyMCwgICAtNTAsDQorICAgIDQ2LCAgICAgOSwgICAgNDcsICAgMTc1LCAgIDEzOSwgICAgMzAsICAgMzg0LA0KKyAgIDIxOCwgICAyMDYsICAgLTI0LCAgLTI1MCwgICAtOTYsICAtMjc2LCAgLTE4MywNCisgICAgMjYsICAgMTE5LCAgICAzOCwgICAgMTQsICAgIC00LCAgLTEzMywgICAtNTIsDQorICAtNDc3LCAgLTYxNCwgIC05ODcsICAtNzE1LCAgLTYzMSwgIC04MTMsICAgMjAwLA0KKyAgLTc0NCwgLTEwMDksIC0xMDY1LCAgLTc0NSwgIC02MzEsICAtMTcxLCAgICAxOCwNCisgIC0xMzcsICAtMjUxLCAgLTQ4MywgIC02MTMsICAtOTgwLCAtMTIwMywgICAgMTIsDQorICAtNjA1LCAgLTc2NywgIC01NjIsICAtNjg2LCAtMTA4OCwgIC01MTUsICAgIDU4LA0KKyAgLTIwMiwgIC00MjgsICAtNzgyLCAtMTA3MiwgICAtOTYsICAtMjM0LCAgLTE3OSwNCisgIC00ODAsICAtNzA5LCAtMTA3MCwgIC04OTcsICAtMTMxLCAgIC05MiwgICAzMjEsDQorICAtMTQ1LCAgLTE5MywgIC01MTIsICAtNzI5LCAgLTU3MiwgIC03NjUsICAtMjEwLA0KKyAgLTMzMSwgIC01ODUsICAtNTI1LCAgLTYzMSwgIC0yODEsICAtMjA4LCAgLTMwMywNCisgIDExNjUsICAxMTA0LCAgIDkzOSwgICA4MjgsICAgNzE2LCAgIDQyNiwgICAxNTUsDQorICAgICA2LCAgLTEwOSwgICA4MjAsICAgNzc4LCAgIDQxNSwgICAxMTMsICAgLTI3LA0KKyAgIDM4MSwgICAzMzksICAgMzE0LCAgIDI2NSwgICAxMjEsICAgIC05LCAgLTQ3NCwNCisgIC0zNzMsICAgIDQ3LCAgIDU4NCwgICA0NDIsICAgIDk5LCAgLTIzMSwgIC0xMTMsDQorICAtNDk2LCAgIC0zOCwgIC0yODUsICAgMjYyLCAgIDMwNSwgICAxNzAsICAgICA0LA0KKyAgLTU4NywgIC01NTYsICAgIDY5LCAgICA2NiwgICA0NzEsICAgMzU0LCAgICAxMywNCisgIC0xMzgsICAgIDcwLCAgIC0xOCwgICAxMDYsICAgIDY3LCAgIDE2NywgIC0zMDIsDQorICAtNDQ1LCAgLTE0MSwgICAxODUsICAgMTkxLCAgIDE1MSwgICAgODMsICAtMTMzLA0KKyAgLTI1NywgIC01MjEsICAtNzIwLCAgLTE5OCwgICAxMzQsICAgLTQ2LCAgLTE4MiwNCisgIC04MTksIC0xMTY4LCAgLTc3NywgICA1MTIsICAgMzU5LCAgICA5NSwgIC0xMTMsDQorICAgMTM3LCAgICAtMiwgICAtNzQsICAtMTM4LCAgLTQwMSwgIC0xMTQsICAtMzcxLA0KKyAgLTI0MiwgIC00NjYsICAgMjA0LCAgIDIyMywgICAtMzEsICAtMjEyLCAgLTE5MiwNCisgIC01MzIsICAtNjM3LCAgLTQ2NiwgIC02ODYsICAgMjU2LCAgIDI3NywgIC0xMzksDQorIC0xMTQxLCAtMTI0NCwgIC0zODEsICAgLTc1LCAgIC01NCwgICAgMTQsICAgIDg4LA0KKyAgLTMxMSwgICAxMTUsICAtMTQzLCAgLTQ5OSwgIC0zNDMsICAgMTI0LCAgLTQxNiwNCisgIC02MTYsICAtMTQ3LCAgLTEzNSwgICAgNDMsICAgIC00LCAgIDEyMSwgIC0zNjksDQorICAgODM1LCAgIDc4MywgICA2NDEsICAgMzkwLCAgIDM1NSwgICAzNTAsICAgIDY0LA0KKyAgICA3MiwgICAxOTQsICAgNDQzLCAgIDQ2NywgICA0MzYsICAgMjE5LCAgIDM3MiwNCisgICA0NjQsICAgMzY5LCAgIDE5MiwgICAgIDQsICAtMTU2LCAgIC03MiwgIC0yMjYsDQorICAgIDU3LCAgIDIwNiwgICAzMDMsICAgMjA1LCAgIDE4OCwgICAxMDEsICAgMjY1LA0KKyAgIC00MCwgIC0yMDUsICAtNDg4LCAgLTE4NCwgICAyNzYsICAgIDY0LCAgIC0yNiwNCisgIC0yMTcsICAtNDMzLCAgLTI5NywgICAxMzcsICAgMzI4LCAgIDMwOCwgIC0yODksDQorICAgMzc4LCAgICA4MSwgIC0zMDgsICAtNDY1LCAgICA1NywgICAtMzcsICAgMjI3LA0KKyAgLTEwMCwgICAgMjQsICAgLTM2LCAgLTE1MSwgICAxOTksICAgICA4LCAgIDE0MywNCisgIC00MjYsICAtNjk3LCAtMTA1OSwgIC0xMzMsICAgMzg4LCAgIDE2MSwgICAzMjEsDQorICAtNjQ0LCAtMTAyMywgLTEyNzEsICAgIDM5LCAgICA2NiwgIC0xMjMsICAgIDcwLA0KKyAgIDM3MiwgICAxNzcsICAtMTczLCAgLTU1NiwgIC01NTMsICAtMzA0LCAgLTE4OSwNCisgIC0xMTcsICAtMzY5LCAgLTQyNSwgIC0xMjIsICAtNDYyLCAgLTE1MiwgICAtNzMsDQorICAtNjQ5LCAgLTg1MCwgLTExODksICAtNzY3LCAgIDQ5NywgICAzNjAsICAgMjIyLA0KKyAgLTc5OCwgLTExMzksIC0xNDU1LCAgLTE5MCwgICA0MzAsICAgMjM0LCAgIDE3OSwNCisgICAgNDIsICAgLTk0LCAgLTQwNSwgIC02OTIsICAgIDM4LCAgLTIwMiwgIC0yNDYsDQorICAtMTY5LCAgLTM2NiwgIC0yOTAsICAgLTg4LCAgIC02NCwgICAgMzIsICAtMjkyLA0KKyAgMTAxMCwgICA5MjMsICAgOTM4LCAgIDcxMCwgICA0NjUsICAgMjMwLCAgIDM0MiwNCisgICAyMTcsICAgMzAwLCAgMTA1NCwgICA2NzUsICAgIDY4LCAgLTQ1OCwgIC0xNzksDQorICAgIDc4LCAgIDQ1MywgICAzMTYsICAgIDE4LCAgLTIzNywgIC00OTYsICAtMjQzLA0KKyAgIDE2NywgICAgMjEsICAgNDI0LCAgIDIxNSwgICAtOTEsICAtMzAzLCAgLTE3MCwNCisgIC0yOTAsICAgLTgxLCAgIC03MCwgICAtNjcsICAgIDQwLCAgICA1NCwgICAtNTksDQorICAtMzUzLCAgLTQyNywgICAtOTAsICAgIDUzLCAgICA5NCwgICAgIDksICAgIDU0LA0KKyAgIC0yOCwgICAzMTgsICAgMjgzLCAgICAxNSwgIC0yNDAsICAgLTU4LCAgICA3OSwNCisgICAtNzUsICAtMTIxLCAgIDIyOSwgICAgMzUsICAgIDU4LCAgICAgNiwgIC0xMzMsDQorICAtMzUxLCAgLTUxNCwgIC03NDQsICAtODM0LCAgLTcwNSwgIC0xMzcsICAgMTY0LA0KKyAtMTEyNCwgLTEzODgsIC0xMDU1LCAgLTIzMCwgICAtNzMsICAgIDQwLCAgICAzNiwNCisgIC0xNjMsICAtMjMzLCAgLTUzMiwgIC03ODUsIC0xMTcwLCAgLTY5NywgICAgOTYsDQorICAtNzg4LCAgLTk1OSwgIC0yNDYsICAtNDMwLCAgLTYyNCwgIC0xNjUsICAgIC04LA0KKyAgLTg1NiwgIC01NDAsICAtNjMwLCAgLTkwNywgIC0zMzcsICAgLTcwLCAgICA3NiwNCisgIC05MzcsIC0xMDQyLCAgLTY1OSwgIC03MzMsICAtMjA4LCAgIDE5OSwgICAtMjYsDQorICAtNTIzLCAgICA3OCwgICAtOTgsICAtNTAxLCAgLTg2OSwgIC04OTAsICAgLTgxLA0KKyAgLTYyNCwgIC03MDMsICAgLTQ1LCAgLTM0OCwgICAtMjUsICAgIDg3LCAgLTE4NiwNCisgIDEwMDUsICAgODIzLCAgIDU0NiwgICAyNDksICAgIDkwLCAgIC0yMiwgICAyMDcsDQorICAgMjk4LCAgIDM5NywgICAzODEsICAgMzE5LCAgIDIwMCwgICAgNjIsICAgMzAzLA0KKyAgIDQ3MywgICAzNzksICAgMTMzLCAgLTI0NywgIC02MzIsICAtNDQxLCAgICA3NSwNCisgICAyODQsICAgMjA4LCAgIDM5MSwgICAxMTUsICAgLTI1LCAgICA0NCwgICAgOTUsDQorICAgLTcyLCAgICA3OSwgICAtOTUsICAgLTYzLCAgLTEyOSwgIC0yOTMsICAgMjAzLA0KKyAgLTE2NCwgIC0zNDksICAgMTE1LCAgIDEyMiwgICAgNjksICAgIC0xLCAgIDM3OCwNCisgICAzNDgsICAgMTcwLCAgICA5OSwgICAgNTgsICAtMTc5LCAgLTMwMiwgICAxODgsDQorICAtMTkwLCAgICAtMiwgICAxNTAsICAgIDIzLCAgIC01MSwgICAtMTEsICAgMjE2LA0KKyAgLTYxNSwgIC04NjMsIC0xMDkwLCAtMTQyNywgIC04MDIsICAgLTQ4LCAgICAtNiwNCisgIC05NjEsIC0xMjc2LCAtMTU0OCwgIC03MjcsICAgLTU4LCAgICA1NiwgICAyMjMsDQorICAtMTI0LCAgLTI1NSwgIC01NjEsICAtOTg4LCAtMTI3NywgIC0xNDgsICAgLTgyLA0KKyAgLTQ4MCwgIC02NjAsICAtODkxLCAtMTE5MSwgLTEzMzksICAtMzI1LCAgICAyMCwNCisgIC02MjEsICAtOTE3LCAtMTI5NiwgLTEzNTAsICAgMjY0LCAgIDI4OSwgICAgNTAsDQorICAtODQ0LCAtMTAyMiwgLTEzNDUsIC0xMzI5LCAgLTI5MywgICAgNDYsICAgMjc4LA0KKyAgLTI2MCwgIC00NjgsICAtODI5LCAtMTE3NiwgIC01MzMsICAtNTYwLCAgIC03OCwNCisgIC0yMTUsICAtNDg0LCAgLTgyMiwgLTEyMzMsICAtNzkxLCAgICAxNSwgIC0xMzgsDQorICAxMzAxLCAgMTMxNywgIDEyNjIsICAxMDQ4LCAgIDcxNiwgICAzNTcsICAgLTY0LA0KKyAgIDU3OCwgICA4MjQsICAgOTI1LCAgIDgwMiwgICA2MzAsICAgMzYyLCAgIDEwMiwNCisgICA0NzAsICAgOTI1LCAgIDc2NywgICA1MTQsICAgMzI3LCAgIDE5MCwgIC0xMTIsDQorICAgMjI1LCAgIDQ5MiwgICA0OTUsICAgNDM3LCAgIDU5OCwgICAzODQsICAgLTQ1LA0KKyAgICA0MywgICAgODIsICAgLTQyLCAgIDE3NSwgICA1MTksICAgMzQyLCAgIC02NCwNCisgIC0zMDQsICAtMTU0LCAgIDE1OSwgICA1NzYsICAgNDAzLCAgIDIyMSwgICAzMjcsDQorICAgMjE0LCAgIDI0NCwgICAxMjIsICAgLTYyLCAgIDMxMiwgICAgOTIsICAtMTYwLA0KKyAgIDIxOCwgICAyMDgsICAgMzEwLCAgIDI2OCwgICAzMDYsICAgMzIzLCAgLTE5OSwNCisgIC0yODUsICAtMjY5LCAgIC03OSwgIC0xMjQsICAtMTQzLCAgLTE1MywgICAyMzYsDQorICAtMjA1LCAgLTM4NCwgIC00MjYsICAgMzQ0LCAgICA1OSwgIC0xODUsICAtMTg0LA0KKyAgLTI3MiwgICAyNDcsICAgMTI2LCAgLTIxMCwgIC01MTgsICAtNDY4LCAgICA3OCwNCisgICAtOTksICAtMTIwLCAgIDUwMiwgICAxNjAsICAtMjgwLCAgLTU1NywgICAzMDQsDQorICAtNDIzLCAgIC0xNywgIC0yODMsICAtNDQzLCAgIDIxNSwgICAyMTIsICAtMTQwLA0KKyAgLTU2NCwgIC02ODQsICAtMjI4LCAgIDUxMCwgICAzNjEsICAgMTMwLCAgIDMyMywNCisgIC00MjgsICAgMzM1LCAgICA5OCwgICAtNjUsICAgIDM2LCAgLTIxNSwgIC0yNDYsDQorICAtMzYyLCAgICA1MSwgICAzNjQsICAgLTE2LCAgLTIzNCwgICAxNTAsICAtMTY1LA0KKyAgIDkxNCwgICA4ODMsICAgNzUxLCAgIDY1MywgICA2NzYsICAgNDY0LCAgLTE1MywNCisgICA2MzEsICAgNTQ1LCAgIDUzNSwgICA3MjAsICAgNTk2LCAgIDM2MCwgICAtODEsDQorICAgNzgzLCAgIDcxMiwgICA1MTIsICAgNDM5LCAgIDM0MSwgICAyNTEsICAtMzkxLA0KKyAgIDQ5NywgICA0MTcsICAgMjQ5LCAgIDM3MiwgICAyOTUsICAgMTczLCAgLTE5MywNCisgICAxMjgsICAtMTEwLCAgLTM4NSwgICAgOTMsICAgIDM5LCAgIDE3MywgIC0yMzEsDQorICAgMjE2LCAgIC01OSwgIC0yNTMsICAgNDYyLCAgIDM4OSwgICAxNTQsICAgIDY5LA0KKyAgIDQ1NSwgICAyNzAsICAgIC00LCAgLTMzNywgICAtNDksICAgMjMzLCAgLTMyMiwNCisgICAzMDcsICAgMTQzLCAgICA1MywgICAyMTgsICAgMTI4LCAgIDIzNiwgIC0xNTYsDQorICAgLTM3LCAgLTE4NiwgIC0yNDAsICAtNDExLCAgLTExMCwgICAgIDksICAgMzk5LA0KKyAgLTE0MCwgIC0zNjUsICAtNjI4LCAgIDI1OCwgICAzODAsICAgMjE0LCAgIDI3NywNCisgICAxMzEsICAgNDU0LCAgIDE3NywgIC0yODUsICAtNTIwLCAgIDEwOCwgIC0yMTQsDQorICAgIDc3LCAgLTE0MSwgICAyMDEsICAtMTIzLCAgLTQ5MCwgIC0xMzEsICAgIDYwLA0KKyAgIC0xNCwgIC0xOTQsICAtNTIxLCAgLTc0MSwgICAyNzMsICAgMzYyLCAgIC0zMywNCisgIC0zNjIsICAtNTY2LCAgLTI4NywgIC0yMjgsICAgMTYxLCAgIDIzNywgICAzMTcsDQorICAtMjY5LCAgIDE5NSwgICAtNzUsICAtMzc1LCAgLTIwNCwgICAgMTEsICAgIDc3LA0KKyAgLTEyOCwgIC0yNjQsICAtMTU2LCAgLTIyMywgIC00NzUsICAgMjY1LCAgICAyNywNCisgIDEyMzgsICAxMTQ3LCAgIDkxNiwgICA2ODksICAgNDMyLCAgIDIxMCwgIC0yODAsDQorICAgODAwLCAgIDY2NCwgICA4NzksICAgNzI2LCAgIDQxMSwgICAxNjAsICAtMTY0LA0KKyAgIDQ1NCwgICA2ODYsICAgNTM2LCAgIDI3NSwgICAxNDcsICAgIDQ2LCAgIDExMSwNCisgICAzMDMsICAgNDg2LCAgIDUxMiwgICAzNTUsICAgMjQxLCAgIDE4MSwgICAtNjksDQorICAgIDc5LCAgICA5MiwgICAgMjksICAgMTQ3LCAgIDIzMywgICAgNTIsICAgIDE3LA0KKyAgLTE3MSwgICAyODksICAgMTMxLCAgIDQzOSwgICAyNzEsICAgICAzLCAgIC0xMCwNCisgICA0MTMsICAgMjQxLCAgIDE0NCwgICAxNzQsICAgMTU1LCAgICAtMiwgICAgMTQsDQorICAgIDU4LCAgIDIxNywgICAyNDcsICAgMjE5LCAgIDE0OSwgICAxNzUsICAgLTE4LA0KKyAgIDIyOCwgICAgLTgsICAtMjQwLCAgLTIwNiwgIC01MTMsICAtMTkxLCAgIDIwMiwNCisgICAtOTYsICAtMjcyLCAgLTQ1NCwgICAgMzMsICAtMzAwLCAgLTU3NSwgICAgNDYsDQorICAgLTEwLCAgLTEwOCwgIC0yNDYsICAtMzQ3LCAgLTc3MCwgIC01MzUsICAgICA5LA0KKyAgLTMyNiwgIC00MzAsICAgLTYxLCAgLTMyMSwgIC03MDQsICAtMjk5LCAgIDIwMSwNCisgICAgLTEsICAtMjgwLCAgLTYwMywgIC00MTksICAtMTg1LCAgICAxOCwgICAtMzYsDQorICAtNTE2LCAgLTUyMiwgIC0zNzksICAtMjkxLCAgLTE4MSwgICAtOTcsICAgIDI3LA0KKyAgLTE1OSwgIC0zMTMsICAtNTI1LCAgLTIyNCwgIC01MTAsICAtODMxLCAgLTE5NywNCisgIC0yOTIsICAtNDU5LCAgIC01OSwgIC0zMTAsICAtNTYyLCAgLTE0MywgIC0zNTEsDQorICAxMDY2LCAgIDkxMiwgICA2MzEsICAgMzg5LCAgIDIwNywgICAgODYsICAtMjI0LA0KKyAgIDU5NiwgICA1MTIsICAgNTk2LCAgIDUwNSwgICAzMTQsICAgMTIyLCAgIC00OCwNCisgICA3ODcsICAgODYxLCAgIDQ0MSwgICAtOTMsICAtMzAzLCAgICAzMywgIC0xOTAsDQorICAgMjU3LCAgIDQ2OSwgICAzMzcsICAgIDUxLCAgICAxNSwgICAyOTgsICAgLTkzLA0KKyAgIDI5NSwgICAgNzMsICAtMTE5LCAgICAyNSwgICAgMzYsICAgIDIzLCAgIDEwOCwNCisgICAtMjgsICAgIC0zLCAgIC0zMiwgICAxMTQsICAgIDIxLCAgIDE4NSwgICAxMDcsDQorICAgNDgyLCAgIDMwNSwgICAgMTUsICAtMjc5LCAgLTMxOSwgICAgNTIsICAgIDk2LA0KKyAgIDIyNiwgICAgNDYsICAgMTE1LCAgICA3MiwgIC0xMzYsICAgMTMzLCAgLTEyNSwNCisgICAgMTgsICAtMjA3LCAgLTU1OSwgIC01OTAsICAtNTAzLCAgLTQ4MiwgICAzMjEsDQorICAtNTcxLCAgLTc4OSwgIC05NTEsICAtMTcyLCAgLTQ0MSwgIC01MzgsICAgMTEzLA0KKyAgIDE4MSwgICAgMTQsICAtMzEwLCAgLTY0MSwgLTEwMDEsICAtMjAyLCAgIDE1OSwNCisgIC0xMzYsICAtMzkzLCAgLTQzMywgIC01MTMsICAtOTExLCAgLTE0NCwgICAtMjIsDQorICAgIDcyLCAgLTI2NSwgIC03MDYsICAtOTU0LCAgLTE1OSwgICAgNTMsICAgMzMyLA0KKyAgLTMzOCwgIC01OTEsICAtODUyLCAgLTM4MywgIC0zOTUsICAgIDU2LCAgICA0NCwNCisgICAgNDMsICAtMTU4LCAgLTQ2NCwgIC04OTcsICAtNjMxLCAgLTE1NywgIC0yOTQsDQorICAtMTYxLCAgLTEyOCwgIC0zMjgsICAtNTczLCAgLTQ4MywgIC0xMjUsICAgIDExLA0KKyAgMTAxNywgICA5MDYsICAxMDUxLCAgMTAwNSwgICA2NzksICAgMzQxLCAgLTEwMiwNCisgICAzNTksICAgMzM0LCAgMTU2NywgIDEzMTQsICAgNzIzLCAgIDEwNSwgICAgMTAsDQorICAgLTY1LCAgIDcyNiwgICA1MjksICAgMzAxLCAgIDIyMCwgICAgNDMsICAtMjczLA0KKyAgLTUxMCwgICA0MzYsICAgNzE5LCAgIDU2NiwgICAzNTgsICAgMTc5LCAgIDExNCwNCisgIC01NjAsICAgMjk4LCAgIDEzMywgIC0xMjAsICAgMzQyLCAgIDIyNSwgICAgMTQsDQorICAtODk5LCAgLTEwMSwgICAyMTcsICAgNjE3LCAgIDQwMCwgICAxNDYsICAgLTU4LA0KKyAgIC00MSwgICAzNTIsICAgIDgyLCAgLTE5NiwgICAgMzksICAgMTIxLCAgLTE2NywNCisgIC0yMTIsICAgIDU5LCAgIDQ0NywgICAyODQsICAgNDIzLCAgIDI1MCwgIC0xNjksDQorICAtMzcxLCAgLTQ4NCwgIC01OTYsICAgIDMwLCAgIC00MSwgICAyNDksICAgIDIyLA0KKyAgLTM3MiwgIC02NTAsICAtNzk0LCAgIDQ3NywgICA0NDUsICAgMjE2LCAgIC03OSwNCisgIC0zNTIsICAgMjc1LCAgICAxNywgIC00NDMsICAtOTI5LCAgICA5MiwgICAgMTksDQorICAtNjk5LCAgLTY5NiwgICA0MzEsICAgMjY0LCAgIC00OSwgIC0zMTAsICAgMTgyLA0KKyAgLTk3OCwgIC0yMTcsICAtNDMwLCAgLTQwMCwgICAxMDEsICAgMjYxLCAgICA3MiwNCisgIC05MjksICAtODg5LCAgLTM1NywgICAtMTMsICAgNDYzLCAgIDM3OCwgICAyMzYsDQorICAtODI2LCAgICA1NiwgICAgMzAsICAtMjk5LCAgLTM2MCwgIC0xMjgsICAgLTUxLA0KKyAgLTg3OCwgIC0yOTksICAtMTExLCAgICA3NSwgICAgNjUsICAgIDM2LCAgICAgMywNCisgICA4MTcsICAgMzY4LCAgIC0yNSwgICAzNTQsICAgNjk3LCAgIDU5MSwgIC0xNzMsDQorICAgMzA5LCAgIDIxMiwgICAyMjIsICAgNzUxLCAgIDQ4NCwgICAxNDAsICAgLTU2LA0KKyAgIDU5MywgICAzNzksICAgIDcwLCAgICAtOCwgICAyNTgsICAgMTgwLCAgIDExMCwNCisgICAxNjUsICAgLTQ2LCAgIDI1NSwgICAyOTcsICAgMjE5LCAgIDI3MywgICAxMDUsDQorICAgMTYwLCAgIC03MCwgIC0zNTgsICAtMTgxLCAgIDM3OSwgICAzMzAsICAgMzE5LA0KKyAgLTIzOCwgIC0zNjksICAtMTk4LCAgIDc0MCwgICA1ODAsICAgMzE5LCAgLTE0MywNCisgICAyMDEsICAgMTA5LCAgLTIwMiwgIC00NTYsICAgMzI4LCAgIDI3NiwgIC0xNDEsDQorICAgMjAzLCAgIDE3MCwgICAxMTEsICAgIDQyLCAgIDIwNywgICAzNjAsICAgMTg4LA0KKyAgLTM0NSwgIC0zOTksICAtNTEzLCAgLTIzMywgICA2NTAsICAgNDIyLCAgICA4MSwNCisgIC02MzUsICAtOTYxLCAtMTIyMCwgICA0NjMsICAgNTM5LCAgIDIwNCwgICAyMDksDQorICAgMjAyLCAgIC0yNSwgIC0xOTQsICAtNDk4LCAgLTc4NywgICAxOTMsICAtMTQzLA0KKyAgLTQ0OSwgIC01MzgsICAgMTk1LCAgLTEwNiwgIC0zMzEsICAgIDY4LCAgICA2MiwNCisgIC0yMjgsICAtNDc3LCAgLTg0MCwgIC01NzYsICAgMzE3LCAgIDEyOCwgICAyODMsDQorICAtNjcxLCAgLTkzNywgIC04MDcsICAtMTE0LCAgIDM5MSwgICAzMzUsICAgLTYyLA0KKyAgIDI0NiwgICAgIDIsICAtMzE0LCAgLTY3OSwgIC0zMDMsICAgMTgwLCAgIC04OCwNCisgIC0xMDcsICAtMjcyLCAgICA5MCwgIC0xOTgsICAgLTI4LCAgIDI5MCwgIC0xMTIsDQorICAgODg1LCAgMTE0OSwgIDEwMjEsICAgNzEyLCAgIDQ5NiwgICAyODEsICAgLTgzLA0KKyAgIDI2OSwgICA0OTIsICAgNzg3LCAgIDY0MywgICAzNDcsICAgIDcwLCAgIDEyNCwNCisgICAzMzYsICAgNjM2LCAgIDQ5OSwgICAgOTIsICAtMjI5LCAgLTE3OSwgICAxOTEsDQorICAgIDI2LCAgIDQwMiwgICA1NjQsICAgMzQwLCAgIDE0OSwgICAtMTEsICAgMTM1LA0KKyAgLTQ0MCwgICA1NjEsICAgNDcwLCAgIDIwNCwgICAtNzIsICAtMTg2LCAgIDE0MCwNCisgIC03MjAsICAgIDE0LCAgIDM1NSwgICAyMjksICAgIDY4LCAgLTEzMywgICA0NjUsDQorICAgMTEwLCAgIDMxMCwgICAxMDMsICAgIDEyLCAgIDEwNiwgICAgMjksICAgMTU4LA0KKyAgLTE3OCwgICAxMTMsICAgMTYxLCAgIDE0MiwgICAxMjEsICAgMTE1LCAgICAyNywNCisgIC02NTEsICAtNDE0LCAgLTY0NSwgIC0xNTIsICAtMTY0LCAgIC0xMywgIC00MjksDQorICAtNjM5LCAgLTk0NCwgIC02ODEsICAtMTA0LCAgIC04MSwgICAgNTIsICAtMTg5LA0KKyAgLTY2MywgIC0xNjQsICAtMzE2LCAgLTY4MywgIC05NTQsICAtMjA1LCAgIC04MywNCisgIC02MDksICAtNjY5LCAgLTE3MiwgIC01MTcsICAtNjk0LCAgIDI4MywgICAtODAsDQorICAtNjQ2LCAgLTE1MiwgIC0zODMsICAtNjc4LCAgLTI0NiwgICAtNDAsICAtMTQzLA0KKyAgLTc0NywgIC03OTYsICAtNzQ1LCAgLTM5MCwgICAtOTgsICAgIDQzLCAgIDI3NSwNCisgIC01OTksICAtMTk5LCAgLTM5OCwgIC00MzMsICAtNDM2LCAgLTUzOCwgICAgMzEsDQorIC0xMTA3LCAgLTU2OCwgIC0zNzYsICAtMjY1LCAgLTEyNiwgICAtMjEsICAgICAxLA0KKyAgIDg0NywgICA1NzMsICAgMzA4LCAgIDM5MiwgICAzMDUsICAgMTAxLCAgICA1NSwNCisgICAyNzMsICAgMjkzLCAgIDIwMSwgICAyNjcsICAgMzQ2LCAgIDIwMSwgICAxMjMsDQorICAgNzI3LCAgIDQ4MCwgICAyMjYsICAgICAyLCAgIC02NSwgIC0xMzgsICAgMTY0LA0KKyAgIDI3MywgICAyMDgsICAgMTczLCAgIDI5MiwgICAgMTIsICAgMjUzLCAgIDE3NCwNCisgICAzNDAsICAgMjA3LCAgIDE4MCwgICAgODgsICAgMTE2LCAgICA0NiwgICA0NzUsDQorICAtNDYwLCAgLTE2NiwgICAtMzAsICAgIDEzLCAgIDExMCwgICAxNzMsICAgMzk2LA0KKyAgIDEzNywgICAgODgsICAgIDQzLCAgLTEzNywgICAtOTQsICAgIDM0LCAgIDI4NCwNCisgICAgOTYsICAgLTE0LCAgIDIyNiwgICAgNDAsICAgIDYzLCAgICA3MCwgICAxMzAsDQorICAtNDY3LCAgLTczNSwgLTEwMTIsIC0xMTc0LCAgLTMwNywgICAzMDUsICAgLTY3LA0KKyAgLTYxMiwgIC05MjAsIC0xMTQ2LCAgLTU2NywgICAgLTgsICAgIDkyLCAgIC0yNSwNCisgIC0xODIsICAtMjcxLCAgLTQ5MiwgIC03NTQsICAtODU3LCAgIDI4NywgICAtNzUsDQorICAtNDk0LCAgLTc4NywgIC02ODksICAtNjgzLCAgLTcwOSwgICAxMzcsICAtMzI2LA0KKyAgLTI4OCwgIC01NTAsICAtOTAzLCAtMTEwNSwgICAzMzQsICAgMzIxLCAgIC02MiwNCisgIC0zNTQsICAtNjUzLCAgLTgzNCwgIC00NDUsICAgICAxLCAgIDM3NywgIC0xNTIsDQorICAtMTYyLCAgLTMwNiwgIC02MDgsICAtOTM3LCAgLTI5NywgICAyNDcsICAtMTkyLA0KKyAgLTIzNCwgIC00NzcsICAtMjQ0LCAgLTQ4OCwgIC0yNjYsICAgMzQyLCAgLTMzMn07DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogMm5kIHN0YWdlIGNvZGVib29rOyAxc3Qgc3BsaXQ6ICAgaXNmMl8wIHRvIGlzZjJfMg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisNCitzdGF0aWMgV29yZDE2IGRpY28yMV9pc2ZbU0laRV9CSzIxKjNdID0gew0KKw0KKyAgIDMyOSwgICA0MDksICAgMjQ5LA0KKyAgIC0zMywgICA1MDUsICAgMTYwLA0KKyAgIC0yOSwgICAtMTQsICAgNTgyLA0KKyAgLTI2MiwgICAxMjcsICAgMzU0LA0KKyAgIDE0NSwgICAyMzcsICAgMTc1LA0KKyAgLTE1MiwgICAyNDUsICAgMTIyLA0KKyAgICAyNywgICAgNDIsICAgMzQwLA0KKyAgIC04NCwgICAtOTMsICAgMzExLA0KKyAgIDI4NSwgICAyMjIsICAtMTU2LA0KKyAgICA0NywgICAtNDMsICAtNTA0LA0KKyAgIDIzNCwgICAxMjEsICAgMzg1LA0KKyAgIDEwNCwgIC0zMTcsICAgIDQ1LA0KKyAgIDE3NiwgICAxOTUsICAgICA4LA0KKyAgIDEwNCwgICAtNTksICAgLTk0LA0KKyAgIDE3NywgICAgNTMsICAgMTkyLA0KKyAgIC0zNCwgIC0xMjcsICAgMTUyLA0KKyAgIDU3MCwgICAyNzcsICAgLTM0LA0KKyAgIC02NywgIC0zMjksICAtNjM5LA0KKyAgLTE1NywgIC0yNzIsICAgNDYyLA0KKyAgLTE3NywgIC00NjIsICAgMTk4LA0KKyAgIDMyMiwgICAxNzksICAgMTE1LA0KKyAgLTM4NiwgICAxNzEsICAgIDE5LA0KKyAgICAxOSwgICAtMTIsICAgMTk1LA0KKyAgLTEyMCwgIC0yNTIsICAgMjAxLA0KKyAgIDMwNCwgICAgMzYsICAtMzM2LA0KKyAgLTEyOCwgIC0yMjEsICAtMzgwLA0KKyAgIDE3MSwgIC0xODUsICAgMjk2LA0KKyAgLTI0MiwgIC0zMTIsICAgIDIzLA0KKyAgIDE5OCwgICAgMzksICAgIDE2LA0KKyAgICAtMywgIC0xNzcsICAtMTExLA0KKyAgIDExMSwgICAtOTMsICAgIDc2LA0KKyAgIC05MiwgIC0yMjMsICAgICA0LA0KKyAgIDE3NywgICA0MDYsICAgLTQ0LA0KKyAgLTE2OCwgICAzODAsICAtMTQ5LA0KKyAgICAtNCwgICAyNzMsICAgMzMxLA0KKyAgLTQyMCwgICA1MTMsICAgMjc3LA0KKyAgICAyMSwgICAyNDcsICAgIDQ3LA0KKyAgIC01OCwgICAxMzEsICAgIC0yLA0KKyAgICAtMywgICAxMzQsICAgMTgwLA0KKyAgLTE0NSwgICAgNDAsICAgMTc1LA0KKyAgIDE4OSwgICAgNzQsICAtMTQ1LA0KKyAgIC0yNywgICAtNDUsICAtMzI1LA0KKyAgIDM3MCwgIC0xMTQsICAgLTIxLA0KKyAgIC04MywgIC00MTUsICAtMTczLA0KKyAgICA3NywgICAgOTUsICAgLTUxLA0KKyAgIC00MCwgICAtMzAsICAgLTY3LA0KKyAgICA3MSwgICAgODgsICAgIDg2LA0KKyAgIC0zNSwgICAtOTgsICAgIDE0LA0KKyAgICA2OSwgICAxOTcsICAtMzM0LA0KKyAgLTE5NiwgICAgNzksICAtMjMxLA0KKyAgLTM0OCwgIC0xMzcsICAgMjE4LA0KKyAgLTM1MiwgICAtODksICAgLTg1LA0KKyAgICA0NywgICAyMDEsICAtMTMwLA0KKyAgLTE2NSwgICAgMzcsICAgLTE1LA0KKyAgIC00MywgICAgIDMsICAgIDg2LA0KKyAgLTE2MSwgIC0xMDgsICAgIDc5LA0KKyAgICA4MywgICAgMjEsICAtMjM3LA0KKyAgIC04MSwgIC0xNDksICAtMjM4LA0KKyAgIDE1MCwgIC0xODYsICAtMjUxLA0KKyAgLTE4NiwgIC0yNDksICAtMTYyLA0KKyAgIC0xOSwgICAgNjYsICAtMTM5LA0KKyAgIC0yNiwgICAtNTAsICAtMTgxLA0KKyAgICAyNCwgICAgMTEsICAgICAwLA0KKyAgLTEzMCwgIC0xMDUsICAgLTk4fTsNCisNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAybmQgc3RhZ2UgY29kZWJvb2s7IDJuZCBzcGxpdDogICBpc2YyXzMgdG8gaXNmMl81DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzIyX2lzZltTSVpFX0JLMjIqM10gPSB7DQorDQorICAtMTI3LCAgIDMxMCwgICAgNDIsDQorICAtMjQyLCAgIDE5NywgICAgIDUsDQorICAtMTUxLCAgICA4NCwgICAtMTcsDQorICAtMjE0LCAgIDEyNywgIC0xNDksDQorICAtMjQ3LCAgLTEzMSwgICAxNTksDQorICAtMjY4LCAgLTI2NywgICAtOTUsDQorICAtMjE3LCAgICAgMSwgICAtNzksDQorICAtMjcxLCAgIC04MCwgIC0xODUsDQorICAgLTQ1LCAgIDQzNiwgICAxNTksDQorICAgMTY1LCAgIDE5OSwgICAzOTEsDQorICAgLTMzLCAgICA4MSwgICAxODcsDQorICAgLTY2LCAgIC00MiwgICAzNTUsDQorICAtMjk4LCAgIC01NywgICAzNDMsDQorICAtMTA4LCAgLTUzNywgICAyMjYsDQorICAtMTQ0LCAgIC0yMywgICAxOTMsDQorICAgMTc2LCAgLTQwMiwgICAgODcsDQorICAgIDUzLCAgIDI5NiwgICAgMjUsDQorICAgLTg0LCAgIDI1MywgIC0xMDQsDQorICAgLTU4LCAgIDEwNSwgIC0xMjYsDQorICAtMTY5LCAgIDE3NCwgIC0zMTQsDQorICAgLTQ4LCAgICA0NCwgIC0yOTQsDQorICAtMTY0LCAgLTQxNywgIC0yNDIsDQorICAtMTM5LCAgICAgMywgIC0xOTQsDQorICAtMTU1LCAgLTIwNywgIC0yMTEsDQorICAgMTE5LCAgIDMyMiwgICAyMTMsDQorICAgMzMzLCAgICA1MCwgICAzODAsDQorICAgMjM3LCAgIDI0NywgICAgLTIsDQorICAgNDY2LCAgIC0xNiwgICAyMDEsDQorICAgMjM4LCAgLTI1NSwgIC0xMDcsDQorICAgIDY3LCAgLTQ0MCwgIC0xNDksDQorICAgMTIyLCAgIC04OCwgIC0xMzksDQorICAgIDg4LCAgLTI0NywgICAtNzMsDQorICAgLTQxLCAgIDIzMSwgICAxNjcsDQorICAgLTYyLCAgIDE1NSwgICAgMTYsDQorICAgLTY1LCAgICAxNiwgICAgNzcsDQorICAgLTY4LCAgICAtMiwgICAtNjMsDQorICAtMTUxLCAgLTMwMCwgICAxNjAsDQorICAgLTE4LCAgLTMzMywgICAgNTQsDQorICAgLTU2LCAgIC05NCwgICAgIDUsDQorICAgICAyLCAgLTE5MCwgICAgMTQsDQorICAgIDkyLCAgIDE0OCwgICAyMDksDQorICAgMTA4LCAgICAgOSwgICAyNzIsDQorICAgMTA4LCAgICAzNSwgICAxMTAsDQorICAgMTQyLCAgIC04NSwgICAxNDUsDQorICAgIDQ3LCAgLTE1NywgICAyNzksDQorICAgICAzLCAgLTMyMCwgICAyNDYsDQorICAgIDQzLCAgIC03MiwgICAgNjgsDQorICAgIDg2LCAgLTIxNywgICAxMzUsDQorICAgIDM2LCAgIDE0MCwgICAgNzksDQorICAgIDU2LCAgIDE3NSwgICAtNDksDQorICAgIDI2LCAgICA0NSwgICAgIDMsDQorICAgIDczLCAgICA1NSwgIC0xMDEsDQorICAgMTA5LCAgLTE4MywgIC0yNDIsDQorICAgIC00LCAgLTI4MywgIC0yNDIsDQorICAgIDQ4LCAgIC02OCwgICAtNDgsDQorICAgIC02LCAgLTE1MywgIC0xMjIsDQorICAgMTYxLCAgIDE5NiwgICAgOTYsDQorICAgMjMyLCAgICA4MCwgICAxOTAsDQorICAgMTY1LCAgICA5NywgICAgMTEsDQorICAgMjU4LCAgIC0zMSwgICAgNzEsDQorICAgMjY3LCAgIC03NywgICAtOTEsDQorICAgMzExLCAgLTIwOSwgICAgODcsDQorICAgMTUyLCAgIC0xNCwgICAtMjIsDQorICAgMTUwLCAgLTE0OSwgICAgIDksDQorICAtMzI0LCAgIDU1NywgICAxODcsDQorICAtMzg0LCAgIDMwNywgICAgNDYsDQorICAtMjUxLCAgICAyNywgICAgNzcsDQorICAtMzY1LCAgICA3NywgICAtNTIsDQorICAtNDgyLCAgIC04NCwgICAxNjAsDQorICAtNDI0LCAgLTUxNSwgICAtNjQsDQorICAtMjk0LCAgLTEyMCwgICAgLTQsDQorICAtNDc2LCAgLTExNiwgIC0xMDksDQorICAgLTk3LCAgIDMxOCwgICAzNjUsDQorICAgMTA2LCAgIDYyNywgICA0NDUsDQorICAtMTkwLCAgIDEyMCwgICAyODcsDQorICAtMTQ2LCAgICA2NSwgICA2MTksDQorICAtNDI3LCAgIDI0MiwgICAzNjMsDQorICAtMzYxLCAgLTM3MSwgICA0MzIsDQorICAtMzQ3LCAgIDEwMiwgICAxNjgsDQorICAtNjI5LCAgIDE5NSwgICAtMTQsDQorICAgLTY1LCAgIDQ3NiwgICAtNDcsDQorICAtMjk3LCAgIDMyMCwgIC0xNjgsDQorICAgLTU1LCAgIDM1NiwgIC0yNjQsDQorICAtMzkxLCAgICA4MiwgIC0yODYsDQorICAgLTUxLCAgIC0zMSwgIC01NTYsDQorICAtMTc4LCAgLTM5OSwgIC01ODYsDQorICAtMjA1LCAgIC00OSwgIC0zNjAsDQorICAtMzQzLCAgLTIzOCwgIC0zMzcsDQorICAgMjIwLCAgIDQ1NywgICAgNTgsDQorICAgNTYxLCAgIDQ2NywgICAyNTksDQorICAgMzQwLCAgIDI3MCwgIC0xNjgsDQorICAgNDUwLCAgICA3NywgIC0yODAsDQorICAgIDYwLCAgIDE2NywgIC00MTMsDQorICAgMTMzLCAgLTI1MiwgIC00OTIsDQorICAgMjE2LCAgIDE1NywgIC0yOTAsDQorICAgMjgyLCAgICAgMCwgIC00OTUsDQorICAtMjI2LCAgIDI5MywgICAxODMsDQorICAtMTU3LCAgIDEzNSwgICAxMjIsDQorICAtMTU4LCAgIC01OSwgICAgMzksDQorICAtMTMzLCAgLTExOCwgICAtOTcsDQorICAtMzMyLCAgLTMwOSwgICAxMTMsDQorICAtMTYwLCAgLTQyNSwgICAgLTYsDQorICAtMTQ5LCAgLTIxMSwgICAgMjQsDQorICAgLTgwLCAgLTI3NywgICAtOTAsDQorICAgLTExLCAgIDEyNSwgICAzMzgsDQorICAgMTMwLCAgIC03MSwgICA0NjUsDQorICAgICA1LCAgIC00NSwgICAxODQsDQorICAgMjM3LCAgIC05NSwgICAyNTMsDQorICAtMTM5LCAgLTE5NywgICAyOTcsDQorICAgLTE5LCAgLTMwMCwgICA1MTEsDQorICAgLTYzLCAgLTE1MiwgICAxMzksDQorICAgMjUwLCAgLTI4OSwgICAzMzYsDQorICAgMTI0LCAgIDMzOSwgIC0xNTAsDQorICAgIDM0LCAgIDE3NiwgIC0yMDgsDQorICAgMTcxLCAgIDE2NiwgIC0xMTYsDQorICAgIDk0LCAgICAzOCwgIC0yMjksDQorICAgIDc1LCAgIC02NSwgIC0zMzksDQorICAgLTc4LCAgLTIwNSwgIC0zODUsDQorICAgICAwLCAgIC0zMCwgIC0xNjMsDQorICAgLTU2LCAgLTExMCwgIC0yNDIsDQorICAgMzIxLCAgIDI0NCwgICAxOTQsDQorICAgNTA1LCAgIDIzOCwgICAgLTEsDQorICAgMzE3LCAgIDExNiwgICAgNjUsDQorICAgMzA5LCAgICA4OCwgICAtNzQsDQorICAgNDUyLCAgIC01MSwgICAtNTAsDQorICAgMzM0LCAgLTIxNywgIC0yOTAsDQorICAgMjExLCAgICA0MSwgIC0xNTIsDQorICAgMjM4LCAgIC01NSwgIC0yNjB9Ow0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDJuZCBzdGFnZSBjb2RlYm9vazsgM3JkIHNwbGl0OiAgIGlzZjJfNiB0byBpc2YyXzgNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMjNfaXNmW1NJWkVfQksyMyozXSA9IHsNCisNCisgICAtMTAsICAgMTUxLCAgIDM1OSwNCisgICAxMzYsICAgMjk4LCAgIDIyMywNCisgICAyNTUsICAtMTA0LCAgIDI5MCwNCisgICA0MjMsICAgICA2LCAgIDE4MywNCisgIC0yNzAsICAtMjY5LCAgIC05OCwNCisgICAtNTIsICAgLTgyLCAgICAxMywNCisgICAtODIsICAtMjc0LCAgIC05NywNCisgICAgOTAsICAtMjQ2LCAgIC03MiwNCisgIC0yOTksICAgLTcwLCAgIDQyMSwNCisgICAtODgsICAgMzY1LCAgIDQzMCwNCisgICAxODcsICAtMzE4LCAgIDM4MSwNCisgICAzODAsICAgIDM3LCAgIDQ4OCwNCisgIC0zNzMsICAtMzE2LCAgICA3OSwNCisgIC0zMDgsICAtMTAxLCAgICAgNSwNCisgIC0xMzUsICAtNDUxLCAgICAgOCwNCisgICAgNzIsICAtNDIxLCAgLTE1NCwNCisgICAxODAsICAgMTcwLCAgLTEyMSwNCisgICAgNjIsICAgMTc3LCAgIC00MCwNCisgICAzMjYsICAgIDgwLCAgLTEwNSwNCisgICAyNDgsICAgMjYzLCAgICAtNSwNCisgIC0xNjgsICAtMTgxLCAgLTIyMSwNCisgICAgLTIsICAgLTIzLCAgLTE1OCwNCisgICAtMTQsICAtMTQ5LCAgLTEyMSwNCisgICAxMTksICAgLTkxLCAgLTE0NywNCisgICAxMTksICAgMzMyLCAgLTE1MywNCisgICAgNDksICAgMzAzLCAgICAzNCwNCisgICA0NDIsICAgLTU1LCAgIC02OSwNCisgICAyMTcsICAgNDU0LCAgICA1OCwNCisgIC0zNTksICAtMTg3LCAgLTM3NSwNCisgICAtNDIsICAgIDUwLCAgLTI3NCwNCisgICAgLTgsICAtMjY3LCAgLTI0OSwNCisgICAgODUsICAgLTg2LCAgLTM0NiwNCisgICAtNzcsICAgLTQwLCAgIDM0NSwNCisgICAgODksICAgMTM0LCAgIDIxOSwNCisgICAxNTYsICAgLTgwLCAgIDE2MCwNCisgICAxMDgsICAgIDQwLCAgIDExNiwNCisgIC0xNTgsICAtMjA2LCAgICAyOSwNCisgICAgIDUsICAgLTMyLCAgIDE3NSwNCisgICAtNjUsICAtMTU4LCAgIDE0NiwNCisgICAgNTUsICAgLTc4LCAgICA3MywNCisgIC0xMTQsICAtMjIyLCAgIDM1MywNCisgICAtNDcsICAgIDgxLCAgIDIxMSwNCisgICAgNDksICAtMTUxLCAgIDI2OCwNCisgICAxMDUsICAgICA0LCAgIDMwMiwNCisgIC0yNjMsICAtMTMyLCAgIDE4MywNCisgIC0xNTEsICAgLTI4LCAgIDIwMSwNCisgIC0xNzcsICAtMzA3LCAgIDE2NiwNCisgICAxMDEsICAtMjIxLCAgIDEzMCwNCisgICAgNzQsICAgIDU4LCAgIC05OCwNCisgICAgMzIsICAgIDQ0LCAgICAxMywNCisgICAxOTQsICAgIDMwLCAgLTE0MiwNCisgICAxNzAsICAgIDk2LCAgICAgOCwNCisgIC0xMzYsICAtMTE5LCAgIC05MSwNCisgICAtNjUsICAgICA4LCAgIC01NSwNCisgICAgIDMsICAtMTg4LCAgICAxMiwNCisgICAgNDUsICAgLTYzLCAgIC00OSwNCisgICAxNDksICAgLTIxLCAgIC0xOSwNCisgICAgMjQsICAgMTQ0LCAgICA5NSwNCisgICAyNTQsICAgLTIyLCAgICA2MCwNCisgICAxNjEsICAgMTk2LCAgICA5NiwNCisgIC0xNTgsICAgLTYxLCAgICA0OCwNCisgICAtNzAsICAgIDMzLCAgICA4MiwNCisgICAtMjMsICAtMzIxLCAgICA1OCwNCisgICAxNTUsICAtMTQ3LCAgICAgNSwNCisgIC0zNjQsICAgMzI4LCAgICA3NywNCisgICAtMjEsICAgNDUzLCAgIDE3MywNCisgIC0xMDgsICAgIDgyLCAgIDYzMCwNCisgICAzNjcsICAgMjYzLCAgIDIwOCwNCisgIC0zMDAsICAgLTYyLCAgLTE3NiwNCisgIC0yMDUsICAgMTQzLCAgLTE1OCwNCisgIC0xNjksICAtNDEwLCAgLTI2NCwNCisgICAyNTcsICAtMjY5LCAgLTEwMCwNCisgIC02MzYsICAgMjg5LCAgICAtMiwNCisgIC0yOTIsICAgNjI3LCAgIDE3MywNCisgIC0zODIsICAtMzYzLCAgIDM4NywNCisgICAyNDgsICAgNTI0LCAgIDQ0NywNCisgIC01MjEsICAtMTExLCAgLTEwNywNCisgIC0zOTUsICAgMTE4LCAgLTI3NCwNCisgIC0zNDMsICAtNjgwLCAgLTEyNSwNCisgIC0xNzIsICAtNDQ3LCAgLTY2MywNCisgICAgNzUsICAgMTQ4LCAgLTM2NywNCisgICAtNzksICAgMjYzLCAgIC05NCwNCisgICAyNDksICAgMTQ4LCAgLTI4NiwNCisgICAzODAsICAgMjcxLCAgLTE2MiwNCisgIC0xNDIsICAgIC00LCAgLTE4NiwNCisgICAtNTcsICAgMTExLCAgLTEyNSwNCisgICAtMzUsICAtMTA4LCAgLTI1NCwNCisgICAxMDAsICAgIDI5LCAgLTI0MiwNCisgICAtODAsICAgMzAzLCAgLTI2NCwNCisgICAtNzgsICAgNDY0LCAgIC01NywNCisgICAyNDgsICAgLTIyLCAgLTQ5NCwNCisgICA2NjEsICAgNjYyLCAgICA0NCwNCisgIC0xOTMsICAgLTQwLCAgLTMzMCwNCisgIC0xNzgsICAgMTQ1LCAgLTMzNywNCisgICAtOTAsICAtMTk5LCAgLTQwMCwNCisgICAtNDAsICAgLTIzLCAgLTQ5OCwNCisgIC0xOTIsICAgMTE0LCAgIDMxNSwNCisgICAtNDEsICAgMjQ0LCAgIDE5MCwNCisgICAgODgsICAgLTk3LCAgIDQ4NSwNCisgICAyNDEsICAgIDgwLCAgIDIxMiwNCisgIC0yNDYsICAgIDQwLCAgICA4NywNCisgIC0xNTYsICAgMTQ3LCAgIDEzNCwNCisgICAgLTIsICAtMzM0LCAgIDIzOSwNCisgICAzMDgsICAtMjAzLCAgIDExMCwNCisgIC00NTksICAgMjUxLCAgIDQyMiwNCisgIC0yMTgsICAgMzEwLCAgIDIyOCwNCisgICAtODYsICAtMzQ2LCAgIDY1NCwNCisgICAxODQsICAgMTc1LCAgIDQyNSwNCisgIC00ODEsICAgLTYzLCAgIDE2OSwNCisgIC0zNDksICAgMTE3LCAgIDE4OCwNCisgIC0xMjUsICAtNTYwLCAgIDMxMCwNCisgICAxNTgsICAtNDE2LCAgICA5NCwNCisgICAgNDYsICAgMTcxLCAgLTE5MiwNCisgICAtNjMsICAgMTU3LCAgICAxNCwNCisgICAyNTYsICAgLTM1LCAgLTI3MSwNCisgICAzMjIsICAgMTIzLCAgICA1MywNCisgIC0yMTQsICAgICA0LCAgIC03NiwNCisgIC0xNTYsICAgIDg2LCAgIC0xOCwNCisgICAxMjgsICAtMTk3LCAgLTIzMiwNCisgICAyNjUsICAgLTkwLCAgIC05OCwNCisgIC0zMDgsICAgMzMyLCAgLTE0NSwNCisgIC0xMzEsICAgMzA4LCAgICA1OCwNCisgICA1MDksICAgIDU5LCAgLTMzOSwNCisgICA1NjIsICAgMTk2LCAgIC0xNCwNCisgIC0zNzgsICAgMTAwLCAgIC00NywNCisgIC0yMzQsICAgMjAyLCAgICAgMSwNCisgICAxMDQsICAtMjcwLCAgLTQ5MywNCisgICAzMTksICAtMjEwLCAgLTMyNX07DQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogMm5kIHN0YWdlIGNvZGVib29rOyA0dGggc3BsaXQ6ICAgaXNmMl85IHRvIGlzZjJfMTENCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMjRfaXNmW1NJWkVfQksyNCozXSA9IHsNCisNCisgICAtNzksICAgLTg5LCAgICAtNCwNCisgIC0xNzEsICAgIDc3LCAgLTIxMSwNCisgICAxNjAsICAtMTkzLCAgICA5OCwNCisgICAxMjAsICAtMTAzLCAgIDMyMywNCisgICAgMzIsICAgLTIyLCAgLTEyOSwNCisgICAgNzIsICAgIDc4LCAgLTI2OCwNCisgICAxODIsICAgLTc2LCAgIC02NiwNCisgICAzMDksICAgIDk5LCAgLTE0NSwNCisgIC0yMjksICAtMTU3LCAgIC04NCwNCisgIC0zODMsICAgIDk4LCAgIC03MSwNCisgICAtOTAsICAtMzUyLCAgICAxMiwNCisgIC0yODQsICAtMTc4LCAgIDE3OCwNCisgICAtNjUsICAtMTI1LCAgLTE2NiwNCisgICAtODcsICAtMTc1LCAgLTM1MSwNCisgICAgNDIsICAtMTk4LCAgIC00OCwNCisgICAxNTQsICAtMTQwLCAgLTI0MywNCisgICAtNzcsICAgIDE4LCAgIDEwOCwNCisgICAtMzksICAgMzU1LCAgICA5MSwNCisgICAgODcsICAgICA4LCAgIDE1NSwNCisgICAgLTQsICAgMTU4LCAgIDIzOSwNCisgICAxMjgsICAgIDk1LCAgIC01NCwNCisgICAgIDcsICAgMjQ2LCAgLTEyNCwNCisgICAyNTgsICAgIDE1LCAgICA4OSwNCisgICAyMDYsICAgMjE2LCAgICA5OCwNCisgIC0yMDEsICAgICA5LCAgICAxOCwNCisgIC0zMTIsICAgMjMzLCAgIDIwNCwNCisgICAtMzksICAtMTc0LCAgIDE1NSwNCisgIC0xNDQsICAgIC05LCAgIDI4NCwNCisgICAtNTcsICAgIDcwLCAgIC02OSwNCisgIC0xNTcsICAgMTg3LCAgICAxOCwNCisgICAgNTQsICAgLTMwLCAgICAyMywNCisgICAgMjQsICAgMTM1LCAgICA1NX07DQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogMm5kIHN0YWdlIGNvZGVib29rOyA1dGggc3BsaXQ6ICAgaXNmMl8xMiB0byBpc2YyXzE1DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzI1X2lzZltTSVpFX0JLMjUqNF0gPSB7DQorDQorICAgMTY5LCAgIDE0MiwgIC0xMTksICAgMTE1LA0KKyAgIDIwNiwgICAtMjAsICAgIDk0LCAgIDIyNiwNCisgIC0xMDYsICAgMzEzLCAgIC0yMSwgICAgMTYsDQorICAgLTYyLCAgIDE2MSwgICAgNzEsICAgMjU1LA0KKyAgIC04OSwgICAxMDEsICAtMTg1LCAgIDEyNSwNCisgICAgNzIsICAgLTMwLCAgLTIwMSwgICAzNDQsDQorICAtMjU4LCAgICAzMywgICAgLTgsICAgIDgxLA0KKyAgLTEwNCwgIC0xNTQsICAgIDcyLCAgIDI5NiwNCisgICAxNDQsICAgLTY4LCAgLTI2OCwgICAtMjUsDQorICAgIDgxLCAgIC03OCwgICAtODcsICAgMTA2LA0KKyAgICAyMiwgICAxNTUsICAtMTg2LCAgLTExOSwNCisgICAtNDYsICAgLTI4LCAgICAyNywgICAgOTEsDQorICAtMTE0LCAgIC0zNywgIC0xNzUsICAgLTMzLA0KKyAgIC05NCwgIC0yMjIsICAtMTg5LCAgIDEyMiwNCisgIC0xMzIsICAtMTE5LCAgLTE5MSwgIC0yNzAsDQorICAtMTcyLCAgLTE3MywgICAgMTgsICAgLTQzLA0KKyAgIDI3OSwgICAxMzUsICAgLTQyLCAgLTEyOCwNCisgICAxODcsICAgLTg2LCAgIDIyOSwgIC0xMzgsDQorICAgMTU5LCAgIDI0MCwgICAxNDAsICAgIDQ2LA0KKyAgICA2OSwgICAgMjUsICAgMjI3LCAgICA3NywNCisgICAgMjEsICAgMTE1LCAgICAxMywgICAgIDgsDQorICAgIDY4LCAgLTI0OCwgICAxMjYsICAgIDgxLA0KKyAgLTE1MCwgICAxMzcsICAgMjA3LCAgICAtOSwNCisgIC0xNTQsICAtMTMzLCAgIDI4OSwgICAgNjcsDQorICAgMTQzLCAgIC0zNywgICAtODYsICAtMzI2LA0KKyAgIDE4MCwgICAtMzIsICAgIDE5LCAgIC0yMywNCisgICAgMjYsICAgMTY4LCAgIDExNiwgIC0yMzMsDQorICAgLTMyLCAgIC0yNiwgICAxMTgsICAgLTc4LA0KKyAgICAgMywgICAgLTgsICAgLTQ1LCAgLTExNSwNCisgICAgNTcsICAtMjE1LCAgIC01NCwgICAtODMsDQorICAtMjA5LCAgIDExMiwgICAtMjIsICAtMTY3LA0KKyAgIC05MSwgIC0xNTEsICAgMTY4LCAgLTI2Mn07DQorDQorDQorDQorICAgICAgIC8qIDM2IGJpdCAqLw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgaXNmIGNvZGVib29rczogIHR3by1zdGFnZSBWUSB3aXRoIHNwbGl0LWJ5LTMgaW4gMm5kIHN0YWdlICAgICAgICAqDQorICogICAgICAgICAgICAgICAgMXN0IHN0YWdlIGlzIGtlcHQgdGhlIHNhbWUgYXMgdGhlIDQ2IGJpdCBxdWFudGl6ZXIgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgY29kZWJvb2sgICB2ZWN0b3IgZGltZW5zaW9uICAgIG51bWJlciBvZiB2ZWN0b3JzICAgICAgICAgICAgICAgICAqDQorICogIH5+fn5+fn5+ICAgfn5+fn5+fn5+fn5+fn5+fiAgICB+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAxXzEgICAgICAgICAgICA5ICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMV8yICAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDJfMSAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyXzIgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl8zICAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitzdGF0aWMgV29yZDE2IGRpY28yMV9pc2ZfMzZiW1NJWkVfQksyMV8zNmIqNV0gPSB7DQorDQorICAgLTUyLCAgIC05NiwgICAyMTIsICAgMzE1LCAgIC03MywNCisgICAgODIsICAtMjA0LCAgIDM2MywgICAxMzYsICAtMTk3LA0KKyAgLTEyNiwgIC0zMzEsICAgMTgzLCAgIDIxOCwgICAxNDMsDQorICAgLTQ5LCAgIC00MSwgICA1NTcsICAgMjMwLCAgICA3MiwNCisgICAgIDIsICAgLTczLCAgIDE2MywgICAzNzcsICAgMjIxLA0KKyAgIDEzMywgICAxMTEsICAgMjc4LCAgIDIxNSwgIC0xMTAsDQorICAtMTAyLCAgIC0yMCwgICAyODQsICAgMTEzLCAgIDI3MywNCisgICAgODQsICAgMzE5LCAgIDI5MCwgICAgMTgsICAgIDg1LA0KKyAgIC0yNSwgICAgLTUsICAgMTI1LCAgIDEzMiwgIC0yMDQsDQorICAgLTM4LCAgICAtNSwgICAyODYsICAgIC05LCAgLTM1NiwNCisgIC0xNDAsICAtMjU2LCAgICA5MiwgICAxMTcsICAtMTg5LA0KKyAgLTE0NCwgICAxOTEsICAgMzEzLCAgICA1MSwgICAtOTgsDQorICAgMTY3LCAgIC0xMCwgICAgNDQsICAgMjQ3LCAgICAzNiwNCisgICAzODEsICAgMTk3LCAgIDIzOCwgICAgNzQsICAgICA2LA0KKyAgICAzOCwgIC00MDgsICAgIDI5LCAgICAtMywgICAtODUsDQorICAgIDkyLCAgIDI2NiwgICAxNTcsICAgLTI1LCAgLTIwMCwNCisgICAxNjEsICAtMTIxLCAgICA3MCwgICAgODQsICAtMTQwLA0KKyAgIC0xNiwgICAtODYsICAgMTEyLCAgIC05NCwgIC0xODksDQorICAtMjY5LCAgLTI3MCwgICAzNTEsICAgMTA3LCAgIC0yNCwNCisgICAtNjgsICAgLTY3LCAgIDQ5MiwgIC0xMDMsICAtMTU1LA0KKyAgIC01MywgIC0xMzEsICAgIDYyLCAgIDEyMiwgICAgMTAsDQorICAgMTM1LCAgICA4NCwgICAyODMsICAgLTU1LCAgLTEyMCwNCisgICAtMTIsICAtMjE5LCAgIDMzMSwgICAtODEsICAgMTY3LA0KKyAgIDIyMCwgIC0xMzYsICAgMTQ3LCAgLTE3MiwgICAtNDIsDQorICAgMTQwLCAgIC05NSwgIC0xMDksICAgLTg4LCAgLTE5NCwNCisgICAgIDAsICAgIC0yLCAgICAtNCwgICAtMzMsICAtMzgxLA0KKyAgIC02NiwgIC0yMTcsICAgMTUyLCAgLTE4NiwgIC00MDIsDQorICAgMjQ0LCAgIDEwOCwgICAxNTYsICAtMTQwLCAgLTM5NSwNCisgICAxMTMsICAtMTM2LCAgLTE5NiwgICAxMTAsICAgLTI0LA0KKyAgIDIxNCwgICAxMTgsICAgIDExLCAgIC02NCwgIC0xMzEsDQorICAtMTEwLCAgLTI4NiwgICAgLTYsICAtMzMyLCAgICAxNiwNCisgICAgOTQsICAgIDk3LCAgICA3OSwgIC0yOTEsICAtMjA1LA0KKyAgICAtNSwgICAtMzksICAgLTIwLCAgIDI1MiwgICAtOTYsDQorICAgIDc2LCAgIDE3NCwgICAxMDEsICAgMTYzLCAgICA2MSwNCisgICAtNjksICAtMjM5LCAgIC01NSwgICAzOTksICAgICA2LA0KKyAgLTExNSwgICAzMTksICAgMTY0LCAgIDI3NSwgICAxOTYsDQorICAgLTE1LCAgICAzNiwgICAtNDcsICAgMzMxLCAgIDEyMSwNCisgICAyMjYsICAgMjA5LCAgIDI3MSwgICAzMjUsICAgMTg0LA0KKyAgICAxMywgICAtODAsICAtMjE4LCAgIDQ3MSwgICAzNTMsDQorICAgMjg4LCAgIDM3OCwgICAgMTYsICAgLTUxLCAgIDI1MSwNCisgICAxNzQsICAgMTE2LCAgICA1MiwgICAxNDksICAtMjc5LA0KKyAgIDIzNSwgICAyNzYsICAgIDM5LCAgIDEyMCwgICAtNDgsDQorICAgICAwLCAgLTEwOCwgIC0xMDgsICAgMjQxLCAgLTMzOSwNCisgICAtOTMsICAgNTM0LCAgICA0NSwgICAgMzMsICAgLTg3LA0KKyAgIDE5NCwgICAxNDksICAgLTcxLCAgIDQwNSwgICAtNDQsDQorICAgNDA5LCAgIDM3MCwgICAgODEsICAtMTg2LCAgLTE1NCwNCisgICAgMjUsICAtMTAyLCAgLTQ0OCwgICAxMjQsICAtMTczLA0KKyAgICAyMiwgICA0MDgsICAtMTEwLCAgLTMxMCwgIC0yMTQsDQorICAgLTI2LCAgICAyMywgICAtODMsICAgMTE0LCAgICAxNCwNCisgIC0xMTAsICAgMTY0LCAgICA1MiwgICAyMjMsICAgLTgyLA0KKyAgICAzNywgICAtMjUsICAtMjYzLCAgIDMwNiwgICAtMTUsDQorICAtNDY2LCAgIDQxNSwgICAyOTIsICAgMTY1LCAgIC0xOCwNCisgICAgMjksICAgLTE5LCAgLTE3MSwgICAxNTUsICAgMTgyLA0KKyAgIDE3OSwgICAxNDQsICAgLTI3LCAgIDIzMSwgICAyNTgsDQorICAtMTAzLCAgLTI0NywgIC0zOTYsICAgMjM4LCAgIDExMywNCisgICAzNzUsICAtMTU0LCAgLTEwOSwgICAgLTQsICAgMTU2LA0KKyAgICA5OCwgICAgODUsICAtMjkyLCAgICAtNSwgIC0xMjQsDQorICAgMTE2LCAgIDEzOSwgIC0xMTYsICAgLTk4LCAgLTI5NCwNCisgICAtMTQsICAgLTgzLCAgLTI3OCwgIC0xMTcsICAtMzc4LA0KKyAgIDEwNiwgICAgMzMsICAtMTA2LCAgLTM0NCwgIC00ODQsDQorICAgMTE5LCAgICAxNywgIC00MTIsICAgMTM4LCAgIDE2NiwNCisgICAzODQsICAgMTAxLCAgLTIwNCwgICAgODgsICAtMTU2LA0KKyAgLTEyMSwgIC0yODQsICAtMzAwLCAgICAtMSwgIC0xNjYsDQorICAgMjgwLCAgICAzMywgIC0xNTIsICAtMzEzLCAgIC04MSwNCisgICAtMzcsICAgIDIyLCAgIDIyOSwgICAxNTMsICAgIDM3LA0KKyAgIC02MCwgICAtODMsICAgMjM2LCAgICAtOCwgICAtNDEsDQorICAtMTY5LCAgLTIyOCwgICAxMjYsICAgLTIwLCAgIDM2MywNCisgIC0yMzUsICAgIDE3LCAgIDM2NCwgIC0xNTYsICAgMTU2LA0KKyAgIC0yNSwgICAtMzAsICAgIDcyLCAgIDE0NCwgICAxNTYsDQorICAgMTUzLCAgIC0yNiwgICAyNTYsICAgIDk3LCAgIDE0NCwNCisgICAtMjEsICAgLTM3LCAgICA0OCwgICAtNjUsICAgMjUwLA0KKyAgICA2MywgICAgNzcsICAgMjczLCAgLTEyOCwgICAxMjQsDQorICAtMTI5LCAgIC0yNiwgICAgNDAsICAgICA5LCAgLTExNSwNCisgICAgLTYsICAgIDgyLCAgICAzOCwgICAtOTAsICAtMTgyLA0KKyAgLTMzNiwgICAtMTMsICAgIDI4LCAgIDE1OCwgICAgOTEsDQorICAgLTMwLCAgIDI0MSwgICAxMzcsICAtMTcwLCAgIC0xNywNCisgICAxNDYsICAgIDE0LCAgIC0xMSwgICAgMzMsICAgIDYxLA0KKyAgIDE5MiwgICAxOTcsICAgIDU0LCAgIC04NCwgICAgODUsDQorICAgIDIzLCAgLTIwMCwgICAtNzgsICAgLTI5LCAgIDE0MCwNCisgICAxMjIsICAgMjM3LCAgIDEwNiwgIC0zNDEsICAgMTM2LA0KKyAgIC01NywgIC0xNDIsICAgLTg1LCAgIC0xNiwgICAtNzQsDQorICAgLTU5LCAgIC05MCwgICAgLTgsICAtMTg3LCAgIC0yMCwNCisgIC0yMTEsICAtMjY3LCAgIDIxNiwgIC0xNzksICAtMTEwLA0KKyAgIC01MCwgICAgLTcsICAgMjIwLCAgLTI2NywgICAtNzAsDQorICAgLTU3LCAgIC00MiwgICAtMTcsICAgLTE1LCAgICA3MSwNCisgICAgMzIsICAgIDIxLCAgICA2MywgIC0xMzcsICAgIDMzLA0KKyAgLTEzNywgIC0xNzUsICAgMTA0LCAgIC02OCwgICAgOTcsDQorICAgLTY3LCAgIC00MywgICAxMzMsICAtMzAxLCAgIDIyMSwNCisgIC0xMTYsICAtMjAwLCAgIC04MSwgICAtOTIsICAtMjcyLA0KKyAgIC02NCwgICAtNDEsICAgLTU0LCAgLTI0NCwgIC0yMjAsDQorICAtMjg3LCAgLTI0MiwgICAtNTAsICAgLTg3LCAgIC04OSwNCisgIC0yNDUsICAgMjM2LCAgIDEwMiwgIC0xNjYsICAtMjk1LA0KKyAgICA2NiwgICAgMjQsICAtMTYyLCAgIC03MSwgICAgOTUsDQorICAgIDY2LCAgIDEzNiwgICAtOTAsICAtMjIwLCAgIC0zNiwNCisgICAtOTgsICAtMTYxLCAgLTIyMiwgIC0xODgsICAgIDI5LA0KKyAgIC0xOCwgICAgMTgsICAgLTE5LCAgLTQxNSwgICAgIDksDQorICAgIDQ5LCAgICA2MSwgICAxMDAsICAgIDM5LCAgIC01NiwNCisgIC0xMTEsICAgIDgyLCAgIDEzNSwgICAtMzEsICAgIDUyLA0KKyAgIC05MCwgIC0xNTMsICAgLTkzLCAgIDE4OSwgICAxODIsDQorICAtMjE0LCAgIDI5NSwgICAxMTksICAgLTc0LCAgIDI4NCwNCisgICAgIDIsICAgMTM3LCAgICAzNywgICAgNDcsICAgMTgyLA0KKyAgICA5MiwgICAxMTcsICAgMTg0LCAgIC01MywgICAzNzMsDQorICAgLTIxLCAgIC0xNCwgICAtMzUsICAgMTM2LCAgIDM5MSwNCisgICAxNDYsICAgMTI5LCAgLTE2NCwgICAtMjgsICAgMzMzLA0KKyAgICA5MiwgICAgODAsICAgLTg0LCAgIDEwMCwgIC0xMzQsDQorICAgIC04LCAgIDIxNywgICAtMzIsICAgICAzLCAgIC00NywNCisgIC0xNTEsICAgMjUxLCAgLTIxNSwgICAxNDIsICAgIDkyLA0KKyAgLTIyNCwgICAzMTAsICAtMTcyLCAgLTI3NSwgICAgOTgsDQorICAgMTU5LCAgIDE1NSwgIC0xNzcsICAgMTEyLCAgICA1MywNCisgICAyMDUsICAgIDI3LCAgICAgOCwgIC0yNDAsICAgMTkyLA0KKyAgIDE2OSwgICAxMjAsICAtMzE5LCAgLTIwMSwgICAxMDYsDQorICAgIDExLCAgICAzNiwgICAtODYsICAtMjM3LCAgIDQ1NSwNCisgIC0xMDksICAtMTU0LCAgLTE2MywgICAxNzQsICAgLTU1LA0KKyAgIC0zOCwgICAgMzIsICAtMTAxLCAgIC03OCwgICAtNTksDQorICAtMjA1LCAgLTMyMSwgICAtOTcsICAgIDY5LCAgICA3OSwNCisgIC0zMTAsICAgIDQ0LCAgICAxOCwgIC0xODUsICAgIDM0LA0KKyAgLTExNSwgICAtMjAsICAtMTQ4LCAgIC0zOSwgICAyMDMsDQorICAgLTI5LCAgIDE1NCwgICAtMzAsICAtMTU4LCAgIDE2NiwNCisgICAtNDUsICAtMTMxLCAgLTMxNywgICAtMjQsICAgMzYzLA0KKyAgLTE2NSwgIC0yMDUsICAtMTEyLCAgLTIyMiwgICAyNjUsDQorICAgLTMyLCAgIC00NCwgIC0xNTAsICAgIDU0LCAgLTE5MywNCisgICAgLTYsICAgLTM4LCAgLTI1NSwgIC0xNjksICAtMTE1LA0KKyAgLTI2NiwgICAgODcsICAtMTg5LCAgIC0zNiwgIC0xNjksDQorICAgLTYwLCAgIC04NywgIC0yNjYsICAtNDM2LCAgLTE3MCwNCisgICAtNjgsICAgLTgxLCAgLTI3OCwgICAgMjQsICAgIDM4LA0KKyAgIC0yMywgICAtMTksICAtMTU1LCAgLTI1NiwgICAxNDEsDQorICAgLTYxLCAgLTIyNiwgIC01NjUsICAtMTc1LCAgICA3MSwNCisgICAgIDksICAgLTI5LCAgLTIzNywgIC01MTUsICAgMjYzfTsNCisNCitzdGF0aWMgV29yZDE2IGRpY28yMl9pc2ZfMzZiW1NJWkVfQksyMl8zNmIqNF0gPSB7DQorDQorICAtMjk4LCAgICAtNiwgICAgOTUsICAgIDMxLA0KKyAgLTIxMywgICAtODcsICAtMTIyLCAgIDI2MSwNCisgICAgIDQsICAgLTQ5LCAgIDIwOCwgICAgMTQsDQorICAtMTI5LCAgLTExMCwgICAgMzAsICAgMTE4LA0KKyAgLTIxNCwgICAyNTgsICAgMTEwLCAgLTIzNSwNCisgICAtNDEsICAgLTE4LCAgLTEyNiwgICAxMjAsDQorICAgMTAzLCAgICA2NSwgICAxMjcsICAgLTM3LA0KKyAgIDEyNiwgICAtMzYsICAgLTI0LCAgICAyNSwNCisgIC0xMzgsICAgLTY3LCAgLTI3OCwgIC0xODYsDQorICAtMTY0LCAgLTE5NCwgIC0yMDEsICAgIDc4LA0KKyAgLTIxMSwgICAtODcsICAgLTUxLCAgLTIyMSwNCisgIC0xNzQsICAgLTc5LCAgIC05NCwgICAtMzksDQorICAgIDIzLCAgICAtNiwgIC0xNTcsICAtMjQwLA0KKyAgICAyMiwgIC0xMTAsICAtMTUzLCAgIC02OCwNCisgICAxNDgsICAgIC01LCAgICAtMiwgIC0xNDksDQorICAgIC0xLCAgLTEzNSwgICAtMzksICAtMTc5LA0KKyAgICA2OCwgICAzNjAsICAtMTE3LCAgIC0xNSwNCisgICAxMzcsICAgIDQ3LCAgLTI3OCwgICAxNDYsDQorICAgMTM2LCAgIDI2MCwgICAxMzUsICAgIDY1LA0KKyAgICA2MSwgICAxMTYsICAgLTQ1LCAgICA5NywNCisgICAyMzEsICAgMzc5LCAgICA4NywgIC0xMjAsDQorICAgMzM4LCAgIDE3NywgIC0yNzIsICAgICAzLA0KKyAgIDI2NiwgICAxNTYsICAgIDI4LCAgIC02OSwNCisgICAyNjAsICAgIDg0LCAgIC04NSwgICAgODYsDQorICAtMjY2LCAgIDE1NCwgIC0yNTYsICAtMTgyLA0KKyAgIC0xNywgICAtNjUsICAtMzA0LCAgICAtNiwNCisgICAtNDAsICAgMTc1LCAgLTE1MSwgIC0xODAsDQorICAgLTI3LCAgICAyNywgICAtODcsICAgLTYzLA0KKyAgIDEyMSwgICAxMTQsICAtMTY2LCAgLTQ2OSwNCisgICAxNTksICAgLTY2LCAgLTMyMywgIC0yMzEsDQorICAgMjE0LCAgIDE1MiwgIC0xNDEsICAtMjEyLA0KKyAgIDEzNywgICAgMzYsICAtMTg0LCAgIC01MSwNCisgIC0yODIsICAtMjM3LCAgICA0MCwgICAgMTAsDQorICAgLTQ4LCAgLTIzNSwgICAtMzcsICAgMjUxLA0KKyAgIC01NCwgIC0zMjMsICAgMTM2LCAgICAyOSwNCisgICAtODgsICAtMTc0LCAgIDIxMywgICAxOTgsDQorICAtMzkwLCAgICA5OSwgICAtNjMsICAtMzc1LA0KKyAgIDEwNywgIC0xNjksICAtMTY0LCAgIDQyNCwNCisgICAgNjksICAtMTExLCAgIDE0MSwgIC0xNjcsDQorICAgIDc0LCAgLTEyOSwgICAgNjUsICAgMTQ0LA0KKyAgLTM1MywgIC0yMDcsICAtMjA1LCAgLTEwOSwNCisgIC0xNjAsICAtMzg2LCAgLTM1NSwgICAgOTgsDQorICAtMTc2LCAgLTQ5MywgICAtMjAsICAtMTQzLA0KKyAgLTI1MiwgIC00MzIsICAgIC0yLCAgIDIxNiwNCisgICAtOTAsICAtMTc0LCAgLTE2OCwgIC00MTEsDQorICAgIDEzLCAgLTI4NCwgIC0yMjksICAtMTYwLA0KKyAgIC04NywgIC0yNzksICAgIDM0LCAgLTI1MSwNCisgICAtNzUsICAtMjYzLCAgIC01OCwgICAtNDIsDQorICAgNDIwLCAgICA1MywgIC0yMTEsICAtMzU4LA0KKyAgIDM4NCwgICAtMzUsICAtMzc0LCAgIDM5NiwNCisgICAgNjgsICAtMjI4LCAgIDMyMywgICAgLTIsDQorICAgMTY3LCAgLTMwNywgICAxOTIsICAgMTk0LA0KKyAgIDQ1OSwgICAzMjksICAgIC01LCAgLTMzMiwNCisgICAzNzUsICAgIDc5LCAgICAtNywgICAzMTMsDQorICAgMjgyLCAgLTEyNCwgICAyMDAsICAgLTkyLA0KKyAgIDI3MSwgIC0xNjIsICAgLTcwLCAgIDE4MCwNCisgIC0xNTcsICAtMjk4LCAgLTUxNCwgIC0zMDksDQorICAgIDU4LCAgLTE2MywgIC01NDYsICAgIDE4LA0KKyAgIDEyNCwgIC0zNjQsICAgMTY3LCAgLTIzOCwNCisgICAgODMsICAtNDExLCAgLTExNywgICAgOTYsDQorICAgMTQwLCAgLTExMiwgIC0zODgsICAtNjI0LA0KKyAgIDI1OSwgIC0xMzMsICAtMzE3LCAgICA0MSwNCisgICAxNjMsICAtMTMwLCAgIC02NCwgIC0zMzQsDQorICAgMjI2LCAgLTE2NSwgIC0xMjQsICAtMTEwLA0KKyAgLTQ2NiwgICAtNjEsICAgICA2LCAgIDIyOSwNCisgIC0xNTMsICAgMjA1LCAgLTE0NSwgICAyNDIsDQorICAtMTU5LCAgICA0OCwgICAxOTUsICAgMTQ4LA0KKyAgIC01OCwgICAgMjgsICAgIDMxLCAgIDI3OSwNCisgIC0zMDMsICAgMTg1LCAgIDI3OSwgICAgLTQsDQorICAgLTYxLCAgIDE5NywgICAgNTksICAgIDg2LA0KKyAgLTExNCwgICAxMjMsICAgMTY4LCAgIC01MiwNCisgICAgMzUsICAgIDM2LCAgIDEwMCwgICAxMjYsDQorICAtNDA3LCAgIDEwMiwgICAtNzcsICAgLTQwLA0KKyAgLTMzOCwgICAgLTEsICAtMzQyLCAgIDE1NiwNCisgIC0xNzksICAgMTA1LCAgIC0zNCwgICAtOTcsDQorICAtMTg1LCAgICA4NCwgICAtMzUsICAgMTA4LA0KKyAgLTEzMywgICAxMDcsICAgLTkxLCAgLTM1NywNCisgIC0xODAsICAgIDU0LCAgLTIyOSwgICAgMjQsDQorICAgLTQ0LCAgICA0NywgICAgNDcsICAtMTgyLA0KKyAgIC02NiwgICAgMTMsICAgIDQ1LCAgICAgNCwNCisgIC0zMzksICAgMjUxLCAgICA2NCwgICAyMjYsDQorICAgLTQyLCAgIDEwMSwgIC0zNTAsICAgMjc1LA0KKyAgIC05OSwgICAzOTgsICAgMTQyLCAgIDEyMSwNCisgICAxMTEsICAgIDEyLCAgLTEwMiwgICAyNjAsDQorICAgICAwLCAgIDUwNSwgICAyNjAsICAgLTk0LA0KKyAgIDE2MSwgICAyODUsICAgLTk2LCAgIDIyNCwNCisgICAgLTQsICAgMjA2LCAgIDMxNCwgICAgMzMsDQorICAgMTY3LCAgIDEzOSwgICAgODgsICAgMjA0LA0KKyAgLTIzNSwgICAzMTYsICAgLTYwLCAgIC0yNSwNCisgICAgLTgsICAtMTUwLCAgLTMxMiwgICAyMDEsDQorICAgLTM2LCAgIDI5MiwgICAgNjEsICAtMTA0LA0KKyAgIC00MCwgICAxNzQsICAtMTYyLCAgICA0MiwNCisgICAtMjEsICAgNDAyLCAgIC0yOSwgIC0zNTEsDQorICAgIDIxLCAgIDE1MiwgIC0zNjAsICAgLTkzLA0KKyAgICA1NywgICAxOTEsICAgMjEyLCAgLTE5NiwNCisgICAgNzYsICAgMTU4LCAgIC0yMSwgICAtNjksDQorICAtMzI4LCAgLTE4NSwgICAzMzEsICAgMTE5LA0KKyAgIC01MywgICAyODUsICAgIDU2LCAgIDMzNywNCisgIC0xMDcsICAgLTI0LCAgIDQwNSwgICAgMjksDQorICAgLTE4LCAgIDEzNywgICAyNzIsICAgMjc3LA0KKyAgLTI1NSwgICAgMjIsICAgMTczLCAgLTE5MSwNCisgICAyOTUsICAgMzIyLCAgIDMyNSwgICAzMDIsDQorICAgIDIxLCAgIC0yNywgICAzMzIsICAtMTc4LA0KKyAgIDExOSwgICAgMTMsICAgMjcxLCAgIDEyOSwNCisgIC00NTUsICAtMTgwLCAgIDExNiwgIC0xOTEsDQorICAtMjI3LCAgICA2MiwgIC0xNDgsICAgNTI0LA0KKyAgLTE3NiwgIC0yODcsICAgMjgyLCAgLTE1NywNCisgIC0yNDMsICAgIDEzLCAgIDE5OSwgICA0MzAsDQorICAgLTU5LCAgIC00OSwgICAxMTUsICAtMzY1LA0KKyAgICA3MiwgIC0xNzIsICAtMTM3LCAgICA5MywNCisgIC0xMzgsICAtMTI2LCAgIDE0MSwgICAtODQsDQorICAgICA1LCAgLTEyNCwgICAgMzgsICAgLTIwLA0KKyAgLTI1OCwgICAzMTEsICAgNjAxLCAgIDIxMywNCisgICAgOTQsICAgMTMwLCAgIC02MSwgICA1MDIsDQorICAgIC0xLCAgLTE1NywgICA0ODUsICAgMzEzLA0KKyAgIDE0NiwgICAtNzQsICAgMTU4LCAgIDM0NSwNCisgICAyNzYsICAgMTM1LCAgIDI4MCwgICAtNTcsDQorICAgNDkwLCAgIDI1MiwgICAgOTksICAgIDQzLA0KKyAgIDI2NywgICAtNzQsICAgNDI5LCAgIDEwNSwNCisgICAyNzgsICAgLTIzLCAgIDExOSwgICAgOTQsDQorICAtNTQyLCAgIDQ4OCwgICAyNTcsICAtMTE1LA0KKyAgIC04NCwgIC0yNDQsICAtNDM4LCAgIDQ3OCwNCisgIC0xMTMsICAtNTQ1LCAgIDM4NywgICAxMDEsDQorICAgLTk1LCAgLTMwNiwgICAxMTEsICAgNDk4LA0KKyAgICA5NSwgICAxNjYsICAgIDIyLCAgLTMwMSwNCisgICA0MjAsICAgLTE1LCAgIC01OCwgICAtNzgsDQorICAgMjcwLCAgICAyOSwgICAxMjIsICAtMjgyLA0KKyAgIDE2MCwgIC0yNDAsICAgIDUwLCAgIC0zOH07DQorDQorc3RhdGljIFdvcmQxNiBkaWNvMjNfaXNmXzM2YltTSVpFX0JLMjNfMzZiKjddID0gew0KKw0KKyAgICA4MSwgICAtMTgsICAgIDY4LCAgIC0yNywgIC0xMjIsICAtMjgwLCAgICAtNCwNCisgICAgNDUsICAtMTc3LCAgIDIwOSwgICAtMzAsICAtMTM2LCAgIC03NCwgICAxMzEsDQorICAgLTQ0LCAgIDEwMSwgICAtNzUsICAgLTg4LCAgIC00OCwgIC0xMzcsICAgLTU0LA0KKyAgLTI0NSwgICAtMjgsICAgIDYzLCAgIC0xOCwgIC0xMTIsICAtMTAzLCAgICA1OCwNCisgICAtNzksICAgIC02LCAgIDIyMCwgICAtNjUsICAgMTE0LCAgIC0zNSwgICAtNTAsDQorICAgMTA5LCAgIC02NSwgICAxNDMsICAtMTE0LCAgIDEyOSwgICAgNzYsICAgMTI1LA0KKyAgIDE2NiwgICAgOTAsICAgLTYxLCAgLTI0MiwgICAxODYsICAgLTc0LCAgIC00MywNCisgICAtNDYsICAgLTkyLCAgICA0OSwgIC0yMjcsICAgIDI0LCAgLTE1NSwgICAgMzksDQorICAgIDY3LCAgICA4NSwgICAgOTksICAgLTQyLCAgICA1MywgIC0xODQsICAtMjgxLA0KKyAgIDE0MiwgIC0xMjIsICAgICAwLCAgICAyMSwgIC0xNDIsICAgLTE1LCAgIC0xNywNCisgICAyMjMsICAgIDkyLCAgIC0yMSwgICAtNDgsICAgLTgyLCAgIC0xNCwgIC0xNjcsDQorICAgIDUxLCAgIC0zNywgIC0yNDMsICAgLTMwLCAgIC05MCwgICAgMTgsICAgLTU2LA0KKyAgICA1NCwgICAxMDUsICAgIDc0LCAgICA4NiwgICAgNjksICAgIDEzLCAgLTEwMSwNCisgICAxOTYsICAgIDcyLCAgIC04OSwgICAgNDMsICAgIDY1LCAgICAxOSwgICAgMzksDQorICAgMTIxLCAgICAzNCwgICAxMzEsICAgLTgyLCAgICAyNSwgICAyMTMsICAtMTU2LA0KKyAgIDEwMSwgIC0xMDIsICAtMTM2LCAgIC0yMSwgICAgNTcsICAgMjE0LCAgICAyMiwNCisgICAgMzYsICAtMTI0LCAgIDIwNSwgICAyMDQsICAgIDU4LCAgLTE1NiwgICAtODMsDQorICAgIDgzLCAgLTExNywgICAxMzcsICAgMTM3LCAgICA4NSwgICAxMTYsICAgIDQ0LA0KKyAgIC05MiwgIC0xNDgsICAgLTY4LCAgICAxMSwgIC0xMDIsICAtMTk3LCAgLTIyMCwNCisgICAtNzYsICAtMTg1LCAgIC01OCwgICAxMzIsICAgLTI2LCAgLTE4MywgICAgODUsDQorICAgIC03LCAgIC0zMSwgICAgLTIsICAgIDIzLCAgIDIwNSwgIC0xNTEsICAgIDEwLA0KKyAgIC0yNywgICAtMzcsICAgIC01LCAgIC0xOCwgICAyOTIsICAgMTMxLCAgICAgMSwNCisgICAxMTcsICAtMTY4LCAgICAgOSwgICAtOTMsICAgIDgwLCAgIC01OSwgIC0xMjUsDQorICAtMTgyLCAgLTI0NCwgICAgOTgsICAgLTI0LCAgIDEzNSwgICAtMjIsICAgIDk0LA0KKyAgIDIyMSwgICAgOTcsICAgMTA2LCAgICA0MiwgICAgNDMsICAtMTYwLCAgICA4MywNCisgICAgMjUsICAgLTY0LCAgIC0yMSwgICAgIDYsICAgIDE0LCAgIC0xNSwgICAxNTQsDQorICAgMTI2LCAgICAxNSwgIC0xNDAsICAgMTUwLCAgIC0xMCwgIC0yMDcsICAtMTE0LA0KKyAgICA3OSwgICAtNjMsICAtMjExLCAgIC03MCwgICAtMjgsICAtMjE3LCAgIDE2NSwNCisgICAgNDYsICAgIDM4LCAgIC0yMiwgICAyODEsICAgMTMyLCAgIC02MiwgICAxMDksDQorICAgMTEyLCAgICA1NCwgIC0xMTIsICAgLTkzLCAgIDIwOCwgICAgMjcsICAgMjk2LA0KKyAgIDExNSwgICAgMTAsICAtMTQ3LCAgICA0MSwgICAyMTYsICAgIDQyLCAgLTI3NiwNCisgICAgNTAsICAtMTE1LCAgLTI1NCwgICAxNjcsICAgMTE3LCAgICAtMiwgICAgNjEsDQorICAgIDE3LCAgIDE0NCwgICAgMzQsICAgLTcyLCAgLTE4NiwgIC0xNTAsICAgMjcyLA0KKyAgIC0yOSwgICAtNjYsICAgLTg5LCAgIC05NSwgIC0xNDksICAgMTI5LCAgIDI1MSwNCisgICAxMjIsICAgICAwLCAgIC01MCwgIC0yMzQsICAgLTkxLCAgICAzNiwgICAgMjYsDQorICAtMTA1LCAgLTEwMiwgICAtODgsICAtMTIxLCAgLTIzNiwgICAgLTcsICAgLTExLA0KKyAgLTIwNCwgICAxMDksICAgICA1LCAgLTE5MSwgICAxMDUsICAgLTE1LCAgIDE2MywNCisgICAtODAsICAgIDMyLCAgIC0yNCwgIC0yMDksICAgIDQxLCAgIDI5NCwgICAgNzAsDQorICAtMTA2LCAgIC05NCwgIC0yMDQsICAtMTE4LCAgIDEyMCwgICAtNTAsICAgLTM3LA0KKyAgIC04MiwgIC0yNDEsICAgIDQ2LCAgLTEzMSwgICAtMjksICAgMTUwLCAgIC01NSwNCisgICAgMzMsICAgMTU1LCAgIDEyMCwgICAtODksICAgIC04LCAgICAgNywgICAgNjIsDQorICAgMjEzLCAgICA4MiwgICAgNjEsICAgIDE4LCAgLTE2MSwgICAxNDQsICAgMTUyLA0KKyAgICAzMCwgICAxMzEsICAgIDY1LCAgIC04NywgIC0yNTUsICAgLTE3LCAgLTEwNywNCisgICAgLTgsICAgIDg1LCAgIC02NCwgICAgNTEsICAtMTYyLCAgIDIyMywgICAtNTMsDQorICAtMTM0LCAgIDI2MSwgICAgNjksICAgLTU2LCAgIDIxOCwgICAgNzIsICAtMTExLA0KKyAgICAgMiwgICAxNTUsICAtMTEzLCAgIC04NywgICAgNDksICAgIDg1LCAgIC0yOCwNCisgIC0xNjMsICAgIDQyLCAgICAtMSwgIC0xOTYsICAgICA3LCAgICAzOSwgIC0yNDUsDQorICAgIDE0LCAgLTEzNywgICAtNzksICAgIDExLCAgLTE2MCwgICAyMDIsICAtMjkzLA0KKyAgIC05NCwgICAgMzMsICAgMjA4LCAgIDEwMCwgICAgNTYsICAgLTQ0LCAgIDMyNiwNCisgICAtNzgsICAgLTQxLCAgIDIzMiwgICAgMTMsICAtMTQyLCAgIDIyNywgICAgODAsDQorICAgLTE2LCAgIC04NywgICAyMDEsICAgIDMzLCAgLTEzMywgICAgMTUsICAtMTgzLA0KKyAgIC01OCwgIC0xOTIsICAgLTQ3LCAgIDE4NCwgIC0xMjgsICAgMTMzLCAgICA5OSwNCisgIC0yMDUsICAgIDExLCAgLTE1NSwgICAgNzgsICAgIDUyLCAgICA3MiwgICAxNDEsDQorICAtMjQ2LCAgICAyNiwgICAgOTksICAgMTUxLCAgICA1OSwgICAxMTUsICAgLTY0LA0KKyAgIC03OSwgICAtNDcsICAgLTE2LCAgIC0xNCwgICAgIDYsICAgIDQ3LCAgIC00MywNCisgICAtNzIsICAtMTc4LCAgIC0yNywgICAxNjIsICAgMTEyLCAgICA0MywgIC0xNzQsDQorICAtMTc1LCAgIDIzOCwgICAxODYsICAgIDcxLCAgIC01NCwgIC0xODgsICAgLTc2LA0KKyAgLTIyNSwgICAyMzMsICAgIDM5LCAgIC0zOSwgIC0xNTgsICAgMTIyLCAgICA0NCwNCisgICAtMjYsICAgIDQzLCAgICA4NCwgICAxMzAsICAgLTkzLCAgIC01MSwgICAgMjIsDQorICAgICAzLCAgICA5MiwgIC0xNTAsICAgMTM2LCAgLTE4MiwgICAtNTcsICAgIDk3LA0KKyAgLTEzMSwgICAxNzksICAgLTc4LCAgICA4MCwgICAgOTEsICAtMTY1LCAgICA5MCwNCisgICAgLTIsICAgMTQ4LCAgICAxNSwgICAxMzAsICAgIDY1LCAgIDE3NSwgICAxMTcsDQorICAtMTM4LCAgIDExNCwgIC0xMzcsICAgMTMyLCAgICAgMywgICAtMTAsICAtMTg2LA0KKyAgIDE0MCwgICAgLTQsICAgLTM3LCAgIDI1NCwgICAtNjIsICAgIDkyLCAgLTEwOX07DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiYzEzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvc3RyZWFtLmgKQEAgLTAsMCArMSw0NyBAQAorDQorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitGaWxlOgkJc3RyZWFtLmgNCisNCitDb250YWluczogICAgICAgVk9NRSBBUEkgQnVmZmVyIE9wZXJhdG9yIEltcGxlbWVudCBIZWFkZXINCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2lmbmRlZiBfX1NUUkVBTV9IX18NCisjZGVmaW5lIF9fU1RSRUFNX0hfXw0KKw0KKyNpbmNsdWRlICJ2b01lbS5oIg0KKyNkZWZpbmUgRnJhbWVfTWF4c2l6ZSAgMTAyNCAqIDIgIC8vV29yayBCdWZmZXIgMTBLIA0KKyNkZWZpbmUgRnJhbWVfTWF4Qnl0ZSAgNjQwICAgICAgICAvL0FNUl9XQiBFbmNvZGVyIG9uZSBmcmFtZSAzMjAgc2FtcGxlcyA9IDY0MCBCeXRlcw0KKyNkZWZpbmUgTUlOKGEsYikJICgoYSkgPCAoYik/IChhKSA6IChiKSkNCisNCit0eXBlZGVmIHN0cnVjdHsNCisJdW5zaWduZWQgY2hhciAqc2V0X3B0cjsNCisJdW5zaWduZWQgY2hhciAqZnJhbWVfcHRyOw0KKwl1bnNpZ25lZCBjaGFyICpmcmFtZV9wdHJfYms7DQorCWludCAgc2V0X2xlbjsNCisJaW50ICBmcmFtZWJ1ZmZlcl9sZW47IA0KKwlpbnQgIGZyYW1lX3N0b3JlbGVuOw0KKwlpbnQgIHVzZWRfbGVuOw0KK31GcmFtZVN0cmVhbTsNCisNCit2b2lkIHZvQVdCX1VwZGF0ZUZyYW1lQnVmZmVyKEZyYW1lU3RyZWFtICpzdHJlYW0sIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsNCit2b2lkIHZvQVdCX0luaXRGcmFtZUJ1ZmZlcihGcmFtZVN0cmVhbSAqc3RyZWFtKTsNCit2b2lkIHZvQVdCX0ZsdXNoRnJhbWVCdWZmZXIoRnJhbWVTdHJlYW0gKnN0cmVhbSk7DQorI2VuZGlmIC8vX19TVFJFQU1fSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThjMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmLmgKQEAgLTAsMCArMSw2NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgIEZpbGUgICAgICAgICAgICAgOiB0eXBlZGVmLmMNCisqICAgICAgUHVycG9zZSAgICAgICAgICA6IEJhc2ljIHR5cGVzLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfX1RZUEVERUZfSF9fDQorI2RlZmluZSBfX1RZUEVERUZfSF9fDQorDQorI3VuZGVmIE9SSUdJTkFMX1RZUEVERUZfSCAvKiBkZWZpbmUgdG8gZ2V0ICJvcmlnaW5hbCIgRVRTSSB2ZXJzaW9uDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0eXBlZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKyNpZmRlZiBPUklHSU5BTF9UWVBFREVGX0gNCisvKg0KKyAqIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgZnJvbSB0aGUgRVRTSSBmaWxlIHR5cGVkZWYuaA0KKyAqLw0KKyAgIA0KKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1pUQ19fKQ0KK3R5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7DQordHlwZWRlZiBzaG9ydCBXb3JkMTY7DQordHlwZWRlZiBsb25nIFdvcmQzMjsNCit0eXBlZGVmIGludCBGbGFnOw0KKw0KKyNlbGlmIGRlZmluZWQoX19zdW4pDQordHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsNCit0eXBlZGVmIHNob3J0IFdvcmQxNjsNCit0eXBlZGVmIGxvbmcgV29yZDMyOw0KK3R5cGVkZWYgaW50IEZsYWc7DQorDQorI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX3VuaXgpDQordHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsNCit0eXBlZGVmIHNob3J0IFdvcmQxNjsNCit0eXBlZGVmIGludCBXb3JkMzI7DQordHlwZWRlZiBpbnQgRmxhZzsNCisNCisjZW5kaWYNCisjZWxzZSAvKiBub3Qgb3JpZ2luYWwgdHlwZWRlZi5oICovDQorDQorLyoNCisgKiB1c2UgKGltcHJvdmVkKSB0eXBlIGRlZmluaXRpb24gZmlsZSB0eXBkZWZzLmggYW5kIGFkZCBhICJGbGFnIiB0eXBlDQorICovDQorI2luY2x1ZGUgInR5cGVkZWZzLmgiDQordHlwZWRlZiBpbnQgRmxhZzsNCisNCisjZW5kaWYNCisNCisjZW5kaWYgIC8vX19UWVBFREVGX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI2NTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmcy5oCkBAIC0wLDAgKzEsMjExIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qDQorKg0KKyogICAgICBGaWxlICAgICAgICAgICAgIDogdHlwZWRlZnMuaA0KKyogICAgICBEZXNjcmlwdGlvbiAgICAgIDogRGVmaW5pdGlvbiBvZiBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkYXRhDQorKiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBhbmQgY29uc3RhbnRzDQorKg0KKyoNCisqICAgICAgVGhlIGZvbGxvd2luZyBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkYXRhIHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nDQorKiAgICAgIHByZXByb2Nlc3NvciAoI2RlZmluZSkgY29uc3RhbnRzIGFyZSBkZWZpbmVkOg0KKyoNCisqICAgICAgICBkZWZpbmVkIHR5cGUgIG1lYW5pbmcgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgY29uc3RhbnRzDQorKiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyogICAgICAgIENoYXIgICAgICAgICAgY2hhcmFjdGVyICAgICAgICAgKG5vbmUpDQorKiAgICAgICAgQm9vbCAgICAgICAgICBib29sZWFuICAgICAgICAgICB0cnVlLCBmYWxzZQ0KKyogICAgICAgIFdvcmQ4ICAgICAgICAgOC1iaXQgc2lnbmVkICAgICAgbWluV29yZDgsICAgbWF4V29yZDgNCisqICAgICAgICBVV29yZDggICAgICAgIDgtYml0IHVuc2lnbmVkICAgIG1pblVXb3JkOCwgIG1heFVXb3JkOA0KKyogICAgICAgIFdvcmQxNiAgICAgICAgMTYtYml0IHNpZ25lZCAgICAgbWluV29yZDE2LCAgbWF4V29yZDE2DQorKiAgICAgICAgVVdvcmQxNiAgICAgICAxNi1iaXQgdW5zaWduZWQgICBtaW5VV29yZDE2LCBtYXhVV29yZDE2DQorKiAgICAgICAgV29yZDMyICAgICAgICAzMi1iaXQgc2lnbmVkICAgICBtaW5Xb3JkMzIsICBtYXhXb3JkMzINCisqICAgICAgICBVV29yZDMyICAgICAgIDMyLWJpdCB1bnNpZ25lZCAgIG1pblVXb3JkMzIsIG1heFVXb3JkMzINCisqICAgICAgICBGbG9hdCAgICAgICAgIGZsb2F0aW5nIHBvaW50ICAgIG1pbkZsb2F0LCAgIG1heEZsb2F0DQorKg0KKyoNCisqICAgICAgVGhlIGZvbGxvd2luZyBjb21waWxlIHN3aXRjaGVzIGFyZSAjZGVmaW5lZDoNCisqDQorKiAgICAgICAgUExBVEZPUk0gICAgICBzdHJpbmcgaW5kaWNhdGluZyBwbGF0Zm9ybSBwcm9nYW0gaXMgY29tcGlsZWQgb24NCisqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlczogIk9TRiIsICJQQyIsICJTVU4iDQorKg0KKyogICAgICAgIE9TRiAgICAgICAgICAgb25seSBkZWZpbmVkIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGFuIEFscGhhDQorKiAgICAgICAgUEMgICAgICAgICAgICBvbmx5IGRlZmluZWQgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBQQw0KKyogICAgICAgIFNVTiAgICAgICAgICAgb25seSBkZWZpbmVkIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGEgU3VuDQorKiAgICAgICAgDQorKiAgICAgICAgTFNCRklSU1QgICAgICBpcyBkZWZpbmVkIGlmIHRoZSBieXRlIG9yZGVyIG9uIHRoaXMgcGxhdGZvcm0gaXMNCisqICAgICAgICAgICAgICAgICAgICAgICJsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IiAtPiBkZWZpbmVkIG9uIERFQyBBbHBoYQ0KKyogICAgICAgICAgICAgICAgICAgICAgYW5kIFBDLCB1bmRlZmluZWQgb24gU3VuDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisNCisjaWZuZGVmIF9fVFlQRURFRlNfSF9fDQorI2RlZmluZSBfX1RZUEVERUZTX0hfXw0KKw0KKy8qDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorI2luY2x1ZGUgPGZsb2F0Lmg+DQorI2luY2x1ZGUgPGxpbWl0cy5oPg0KKw0KKw0KKw0KKy8qDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisvKg0KKyAqKioqKioqKiogZGVmaW5lIGNoYXIgdHlwZQ0KKyAqLw0KK3R5cGVkZWYgY2hhciBDaGFyOw0KKw0KKy8qDQorICoqKioqKioqKiBkZWZpbmUgOCBiaXQgc2lnbmVkL3Vuc2lnbmVkIHR5cGVzICYgY29uc3RhbnRzDQorICovDQorI2lmIFNDSEFSX01BWCA9PSAxMjcNCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4Ow0KKyNkZWZpbmUgbWluV29yZDggIFNDSEFSX01JTg0KKyNkZWZpbmUgbWF4V29yZDggIFNDSEFSX01BWA0KKw0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVV29yZDg7DQorI2RlZmluZSBtaW5VV29yZDggMA0KKyNkZWZpbmUgbWF4VVdvcmQ4IFVDSEFSX01BWA0KKyNlbHNlDQorI2Vycm9yIGNhbm5vdCBmaW5kIDgtYml0IHR5cGUNCisjZW5kaWYNCisNCisNCisvKg0KKyAqKioqKioqKiogZGVmaW5lIDE2IGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMNCisgKi8NCisjaWYgSU5UX01BWCA9PSAzMjc2Nw0KK3R5cGVkZWYgaW50IFdvcmQxNjsNCisjZGVmaW5lIG1pbldvcmQxNiAgICAgSU5UX01JTg0KKyNkZWZpbmUgbWF4V29yZDE2ICAgICBJTlRfTUFYDQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVdvcmQxNjsNCisjZGVmaW5lIG1pblVXb3JkMTYgICAgMA0KKyNkZWZpbmUgbWF4VVdvcmQxNiAgICBVSU5UX01BWA0KKyNlbGlmIFNIUlRfTUFYID09IDMyNzY3DQordHlwZWRlZiBzaG9ydCBXb3JkMTY7DQorI2RlZmluZSBtaW5Xb3JkMTYgICAgIFNIUlRfTUlODQorI2RlZmluZSBtYXhXb3JkMTYgICAgIFNIUlRfTUFYDQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV29yZDE2Ow0KKyNkZWZpbmUgbWluVVdvcmQxNiAgICAwDQorI2RlZmluZSBtYXhVV29yZDE2ICAgIFVTSFJUX01BWA0KKyNlbHNlDQorI2Vycm9yIGNhbm5vdCBmaW5kIDE2LWJpdCB0eXBlDQorI2VuZGlmDQorDQorDQorLyoNCisgKioqKioqKioqIGRlZmluZSAzMiBiaXQgc2lnbmVkL3Vuc2lnbmVkIHR5cGVzICYgY29uc3RhbnRzDQorICovDQorI2lmIElOVF9NQVggPT0gMjE0NzQ4MzY0Nw0KK3R5cGVkZWYgaW50IFdvcmQzMjsNCisjZGVmaW5lIG1pbldvcmQzMiAgICAgSU5UX01JTg0KKyNkZWZpbmUgbWF4V29yZDMyICAgICBJTlRfTUFYDQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVdvcmQzMjsNCisjZGVmaW5lIG1pblVXb3JkMzIgICAgMA0KKyNkZWZpbmUgbWF4VVdvcmQzMiAgICBVSU5UX01BWA0KKyNlbGlmIExPTkdfTUFYID09IDIxNDc0ODM2NDcNCit0eXBlZGVmIGxvbmcgV29yZDMyOw0KKyNkZWZpbmUgbWluV29yZDMyICAgICBMT05HX01JTg0KKyNkZWZpbmUgbWF4V29yZDMyICAgICBMT05HX01BWA0KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVV29yZDMyOw0KKyNkZWZpbmUgbWluVVdvcmQzMiAgICAwDQorI2RlZmluZSBtYXhVV29yZDMyICAgIFVMT05HX01BWA0KKyNlbHNlDQorI2Vycm9yIGNhbm5vdCBmaW5kIDMyLWJpdCB0eXBlDQorI2VuZGlmDQorDQorLyoNCisgKioqKioqKioqIGRlZmluZSBmbG9hdGluZyBwb2ludCB0eXBlICYgY29uc3RhbnRzDQorICovDQorLyogdXNlICIjaWYgMCIgYmVsb3cgaWYgRmxvYXQgc2hvdWxkIGJlIGRvdWJsZTsNCisgICB1c2UgIiNpZiAxIiBiZWxvdyBpZiBGbG9hdCBzaG91bGQgYmUgZmxvYXQNCisgKi8NCisjaWYgMA0KK3R5cGVkZWYgZmxvYXQgRmxvYXQ7DQorI2RlZmluZSBtYXhGbG9hdCAgICAgIEZMVF9NQVgNCisjZGVmaW5lIG1pbkZsb2F0ICAgICAgRkxUX01JTg0KKyNlbHNlDQordHlwZWRlZiBkb3VibGUgRmxvYXQ7DQorI2RlZmluZSBtYXhGbG9hdCAgICAgIERCTF9NQVgNCisjZGVmaW5lIG1pbkZsb2F0ICAgICAgREJMX01JTg0KKyNlbmRpZg0KKw0KKy8qDQorICoqKioqKioqKiBkZWZpbmUgY29tcGxleCB0eXBlDQorICovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgRmxvYXQgcjsgIC8qIHJlYWwgICAgICBwYXJ0ICovDQorICBGbG9hdCBpOyAgLyogaW1hZ2luYXJ5IHBhcnQgKi8NCit9IENQWDsNCisNCisvKg0KKyAqKioqKioqKiogZGVmaW5lIGJvb2xlYW4gdHlwZQ0KKyAqLw0KK3R5cGVkZWYgaW50IEJvb2w7DQorI2RlZmluZSBmYWxzZSAwDQorI2RlZmluZSB0cnVlIDENCisNCisvKiAqKioqKipBdm9pZCBmdW5jdGlvbiBtdWx0aXBsZSBkZWZpbml0aW9uKioqKioqICovDQorI2RlZmluZSAgICAgQXV0b2NvcnIgICAgICAgICB2b0FXQl9BdXRvY29ycg0KKyNkZWZpbmUgICAgIENvbnZvbHZlICAgICAgICAgdm9BV0JfQ29udm9sdmUNCisjZGVmaW5lICAgICBjb3JfaF94ICAgICAgICAgIHZvQVdCX2Nvcl9oX3gNCisjZGVmaW5lICAgICBkdHhfZW5jX2luaXQgICAgIHZvQVdCX2R0eF9lbmNfaW5pdA0KKyNkZWZpbmUgICAgIGR0eF9lbmNfcmVzZXQgICAgdm9BV0JfZHR4X2VuY19yZXNldA0KKyNkZWZpbmUgICAgIGR0eF9lbmNfZXhpdCAgICAgdm9BV0JfZHR4X2VuY19leGl0DQorI2RlZmluZSAgICAgZHR4X2VuYyAgICAgICAgICB2b0FXQl9kdHhfZW5jDQorI2RlZmluZSAgICAgZHR4X2J1ZmZlciAgICAgICB2b0FXQl9kdHhfYnVmZmVyDQorI2RlZmluZSAgICAgdHhfZHR4X2hhbmRsZXIgICB2b0FXQl90eF9kdHhfaGFuZGxlcg0KKyNkZWZpbmUgICAgIEdfcGl0Y2ggICAgICAgICAgdm9BV0JfR19waXRjaA0KKyNkZWZpbmUgICAgIElzcF9BeiAgICAgICAgICAgdm9BV0JfSXNwX0F6DQorI2RlZmluZSAgICAgTGFnX3dpbmRvdyAgICAgICB2b0FXQl9MYWdfd2luZG93DQorI2RlZmluZSAgICAgTG9nMl9ub3JtICAgICAgICB2b0FXQl9Mb2cyX25vcm0NCisjZGVmaW5lICAgICBMb2cyICAgICAgICAgICAgIHZvQVdCX0xvZzINCisjZGVmaW5lICAgICBQb3cyICAgICAgICAgICAgIHZvQVdCX1BvdzINCisjZGVmaW5lICAgICBMX0NvbXAgICAgICAgICAgIHZvQVdCX0xfQ29tcA0KKyNkZWZpbmUgICAgIE1weV8zMiAgICAgICAgICAgdm9BV0JfTXB5XzMyDQorI2RlZmluZSAgICAgTXB5XzMyXzE2ICAgICAgICB2b0FXQl9NcHlfMzJfMTYNCisjZGVmaW5lICAgICBEaXZfMzIgICAgICAgICAgIHZvQVdCX0Rpdl8zMg0KKyNkZWZpbmUgICAgIFBpdF9zaHJwICAgICAgICAgdm9BV0JfUGl0X3NocnANCisjZGVmaW5lICAgICBRaXNmX25zICAgICAgICAgIHZvQVdCX1Fpc2ZfbnMNCisjZGVmaW5lICAgICBEaXNmX25zICAgICAgICAgIHZvQVdCX0Rpc2ZfbnMNCisjZGVmaW5lICAgICBSZXNpZHUgICAgICAgICAgIHZvQVdCX1Jlc2lkdQ0KKyNkZWZpbmUgICAgIFN5bl9maWx0ICAgICAgICAgdm9BV0JfU3luX2ZpbHQNCisjZGVmaW5lICAgICBTZXRfemVybyAgICAgICAgIHZvQVdCX1NldF96ZXJvDQorI2RlZmluZSAgICAgQ29weSAgICAgICAgICAgICB2b0FXQl9Db3B5DQorI2RlZmluZSAgICAgdm9pY2VfZmFjdG9yICAgICB2b0FXQl92b2ljZV9mYWN0b3INCisjZGVmaW5lICAgICBTeW5fZmlsdF8zMiAgICAgIHZvQVdCX1N5bl9maWx0XzMyDQorI2RlZmluZSAgICAgSXNmX2lzcCAgICAgICAgICB2b0FXQl9Jc2ZfaXNwDQorI2RlZmluZSAgICAgTGV2aW5zb24gICAgICAgICB2b0FXQl9MZXZpbnNvbg0KKyNkZWZpbmUgICAgIG1lZGlhbjUgICAgICAgICAgdm9BV0JfbWVkaWFuNSAgICAgICAgICAgDQorI2RlZmluZSAgICAgUHJlZF9sdDQgICAgICAgICB2b0FXQl9QcmVkX2x0NA0KKyNkZWZpbmUgICAgIFJlb3JkZXJfaXNmICAgICAgdm9BV0JfUmVvcmRlcl9pc2YNCisjZGVmaW5lICAgICBEcGlzZl8yc18zNmIgICAgIHZvQVdCX0RwaXNmXzJzXzM2Yg0KKyNkZWZpbmUgICAgIERwaXNmXzJzXzQ2YiAgICAgdm9BV0JfRHBpc2ZfMnNfNDZiDQorI2RlZmluZSAgICAgRG90X3Byb2R1Y3QxMiAgICB2b0FXQl9Eb3RfcHJvZHVjdDEyDQorI2RlZmluZSAgICAgbWVtX21hbGxvYyAgICAgICB2b0FXQl9tZW1fbWFsbG9jDQorI2RlZmluZSAgICAgbWVtX2ZyZWUgICAgICAgICB2b0FXQl9tZW1fZnJlZQ0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2VuZGlmICAvLyNkZWZpbmUgX19UWVBFREVGU19IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3diX3ZhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzMzYWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWQuaApAQCAtMCwwICsxLDc4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBXQl9WQUQuSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIEZ1bmN0aW9ucyBhbmQgc3RhdGljIG1lbW9yeSBmb3IgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0aW9uLiAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNpZm5kZWYgX19XQl9WQURfSF9fDQorI2RlZmluZSBfX1dCX1ZBRF9IX18NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUw0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAid2JfdmFkX2MuaCINCisjaW5jbHVkZSAidm9NZW0uaCINCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBEQVRBIFRZUEVTDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisJV29yZDE2IGJja3JfZXN0W0NPTVBMRU5dOyAgICAgICAgICAgICAgLyogYmFja2dyb3VuZCBub2lzZSBlc3RpbWF0ZSAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgYXZlX2xldmVsW0NPTVBMRU5dOyAgICAgICAgICAgICAvKiBhdmVyYWdlZCBpbnB1dCBjb21wb25lbnRzIGZvciBzdGF0aW9uYXJ5ICovDQorCS8qIGVzdGltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IG9sZF9sZXZlbFtDT01QTEVOXTsgICAgICAgICAgICAgLyogaW5wdXQgbGV2ZWxzIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAgICAgICAqLw0KKwlXb3JkMTYgc3ViX2xldmVsW0NPTVBMRU5dOyAgICAgICAgICAgICAvKiBpbnB1dCBsZXZlbHMgY2FsY3VsYXRlZCBhdCB0aGUgZW5kIG9mIGEgZnJhbWUgKGxvb2thaGVhZCkgICovDQorCVdvcmQxNiBhX2RhdGE1W0ZfNVRIX0NOVF1bMl07ICAgICAgICAgIC8qIG1lbW9yeSBmb3IgdGhlIGZpbHRlciBiYW5rICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IGFfZGF0YTNbRl8zVEhfQ05UXTsgICAgICAgICAgICAgLyogbWVtb3J5IGZvciB0aGUgZmlsdGVyIGJhbmsgICAgICAgICAgICAgICAqLw0KKw0KKwlXb3JkMTYgYnVyc3RfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKiBjb3VudHMgbGVuZ3RoIG9mIGEgc3BlZWNoIGJ1cnN0ICAgICAgICAgICovDQorCVdvcmQxNiBoYW5nX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmdvdmVyIGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHN0YXRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGlvbmFyeSBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKwkvKiBOb3RlIHRoYXQgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgaG9sZHMgMTUgZmxhZ3MuIEVhY2ggZmxhZyByZXNlcnZlcyAxIGJpdCBvZiB0aGUNCisJICogdmFyaWFibGUuIFRoZSBuZXdlc3QgZmxhZyBpcyBpbiB0aGUgYml0IDE1IChhc3N1bWluZyB0aGF0IExTQiBpcyBiaXQgMSBhbmQgTVNCIGlzIGJpdCAxNikuICovDQorCVdvcmQxNiB2YWRyZWc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzIGZvciBpbnRlcm1lZGlhdGUgVkFEIGRlY2lzaW9ucyAgICAgKi8NCisJV29yZDE2IHRvbmVfZmxhZzsgICAgICAgICAgICAgICAgICAgICAgLyogdG9uZSBkZXRlY3Rpb24gZmxhZ3MgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKwlXb3JkMTYgc3BfZXN0X2NudDsgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBzcGVlY2ggbGV2ZWwgZXN0aW1hdGlvbiAgICAgICovDQorCVdvcmQxNiBzcF9tYXg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHNwX21heF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgLyogY291bnRzIGZyYW1lcyB0aGF0IGNvbnRhaW5zIHNwZWVjaCAgICAgICAqLw0KKwlXb3JkMTYgc3BlZWNoX2xldmVsOyAgICAgICAgICAgICAgICAgICAvKiBlc3RpbWF0ZWQgc3BlZWNoIGxldmVsICAgICAgICAgICAgICAgICAgICovDQorCVdvcmQzMiBwcmV2X3Bvd19zdW07ICAgICAgICAgICAgICAgICAgIC8qIHBvd2VyIG9mIHByZXZpb3VzIGZyYW1lICAgICAgICAgICAgICAgICAgKi8NCisNCit9IFZhZFZhcnM7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoNCisgKiBERUNMQVJBVElPTiBPRiBQUk9UT1RZUEVTDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1dvcmQxNiB3Yl92YWRfaW5pdChWYWRWYXJzICoqIHN0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7DQorV29yZDE2IHdiX3ZhZF9yZXNldChWYWRWYXJzICogc3QpOw0KK3ZvaWQgd2JfdmFkX2V4aXQoVmFkVmFycyAqKiBzdCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOw0KK3ZvaWQgd2JfdmFkX3RvbmVfZGV0ZWN0aW9uKFZhZFZhcnMgKiBzdCwgV29yZDE2IHBfZ2Fpbik7DQorV29yZDE2IHdiX3ZhZChWYWRWYXJzICogc3QsIFdvcmQxNiBpbl9idWZbXSk7DQorDQorI2VuZGlmICAvL19fV0JfVkFEX0hfXw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkX2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVmNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWRfYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBXQl9WQURfQy5ICQkJCSAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBDb25zdGFudHMgZm9yIFZvaWNlIEFjdGl2aXR5IERldGVjdGlvbi4JCQkgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNpZm5kZWYgX19XQl9WQURfQ19IX18NCisjZGVmaW5lIF9fV0JfVkFEX0NfSF9fDQorDQorI2RlZmluZSBGUkFNRV9MRU4gMjU2ICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAoc2FtcGxlcykgb2YgdGhlIGlucHV0IGZyYW1lICAgICAgICAgICovDQorI2RlZmluZSBDT01QTEVOIDEyICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdWItYmFuZHMgdXNlZCBieSBWQUQgICAgICAgICAgICAgICovDQorDQorI2RlZmluZSBVTklSU0hGVCA3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qID0gbG9nMihNQVhfMTYvVU5JVFkpLCBVTklUWSA9IDI1NiAgICAgICovDQorI2RlZmluZSBTQ0FMRSAxMjggICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChVTklUWSpVTklUWSkvNTEyICovDQorDQorI2RlZmluZSBUT05FX1RIUiAoV29yZDE2KSgwLjY1Kk1BWF8xNikgICAgIC8qIFRocmVzaG9sZCBmb3IgdG9uZSBkZXRlY3Rpb24gICAqLw0KKw0KKy8qIGNvbnN0YW50cyBmb3Igc3BlZWNoIGxldmVsIGVzdGltYXRpb24gKi8NCisjZGVmaW5lIFNQX0VTVF9DT1VOVCA4MA0KKyNkZWZpbmUgU1BfQUNUSVZJVFlfQ09VTlQgMjUNCisjZGVmaW5lIEFMUEhBX1NQX1VQIChXb3JkMTYpKCgxLjAgLSAwLjg1KSpNQVhfMTYpDQorI2RlZmluZSBBTFBIQV9TUF9ET1dOIChXb3JkMTYpKCgxLjAgLSAwLjg1KSpNQVhfMTYpDQorDQorI2RlZmluZSBOT01fTEVWRUwgMjA1MCAgICAgICAgICAgICAgICAgICAgIC8qIGFib3V0IC0yNiBkQm92IFExNSAqLw0KKyNkZWZpbmUgU1BFRUNIX0xFVkVMX0lOSVQgTk9NX0xFVkVMICAgICAgICAvKiBpbml0aWFsIHNwZWVjaCBsZXZlbCAqLw0KKyNkZWZpbmUgTUlOX1NQRUVDSF9MRVZFTDEgIChXb3JkMTYpKE5PTV9MRVZFTCAqIDAuMDYzKSAgLyogTk9NX0xFVkVMIC0yNCBkQiAqLw0KKyNkZWZpbmUgTUlOX1NQRUVDSF9MRVZFTDIgIChXb3JkMTYpKE5PTV9MRVZFTCAqIDAuMikgICAgLyogTk9NX0xFVkVMIC0xNCBkQiAqLw0KKyNkZWZpbmUgTUlOX1NQRUVDSF9TTlIgNDA5NiAgICAgICAgICAgICAgICAvKiAwIGRCLCBsb3dlc3QgU05SIGVzdGltYXRpb24sIFExMiAqLw0KKw0KKy8qIFRpbWUgY29uc3RhbnRzIGZvciBiYWNrZ3JvdW5kIHNwZWN0cnVtIHVwZGF0ZSAqLw0KKyNkZWZpbmUgQUxQSEFfVVAxICAgKFdvcmQxNikoKDEuMCAtIDAuOTUpKk1BWF8xNikgICAgICAgLyogTm9ybWFsIHVwZGF0ZSwgdXB3YXJkczogICAqLw0KKyNkZWZpbmUgQUxQSEFfRE9XTjEgKFdvcmQxNikoKDEuMCAtIDAuOTM2KSpNQVhfMTYpICAgICAgLyogTm9ybWFsIHVwZGF0ZSwgZG93bndhcmRzICAqLw0KKyNkZWZpbmUgQUxQSEFfVVAyICAgKFdvcmQxNikoKDEuMCAtIDAuOTg1KSpNQVhfMTYpICAgICAgLyogRm9yY2VkIHVwZGF0ZSwgdXB3YXJkcyAgICAqLw0KKyNkZWZpbmUgQUxQSEFfRE9XTjIgKFdvcmQxNikoKDEuMCAtIDAuOTQzKSpNQVhfMTYpICAgICAgLyogRm9yY2VkIHVwZGF0ZSwgZG93bndhcmRzICAqLw0KKyNkZWZpbmUgQUxQSEEzICAgICAgKFdvcmQxNikoKDEuMCAtIDAuOTUpKk1BWF8xNikgICAgICAgLyogVXBkYXRlIGRvd253YXJkcyAgICAgICAgICAqLw0KKyNkZWZpbmUgQUxQSEE0ICAgICAgKFdvcmQxNikoKDEuMCAtIDAuOSkqTUFYXzE2KSAgICAgICAgLyogRm9yIHN0YXRpb25hcnkgZXN0aW1hdGlvbiAqLw0KKyNkZWZpbmUgQUxQSEE1ICAgICAgKFdvcmQxNikoKDEuMCAtIDAuNSkqTUFYXzE2KSAgICAgICAgLyogRm9yIHN0YXRpb25hcnkgZXN0aW1hdGlvbiAqLw0KKw0KKy8qIENvbnN0YW50cyBmb3IgVkFEIHRocmVzaG9sZCAqLw0KKyNkZWZpbmUgVEhSX01JTiAgKFdvcmQxNikoMS42KlNDQUxFKSAgICAgICAvKiBNaW5pbXVtIHRocmVzaG9sZCAgICAgICAgICAgICAgICovDQorI2RlZmluZSBUSFJfSElHSCAoV29yZDE2KSg2KlNDQUxFKSAgICAgICAgIC8qIEhpZ2hlc3QgdGhyZXNob2xkICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIFRIUl9MT1cgKFdvcmQxNikoMS43KlNDQUxFKSAgICAgICAgLyogTG93ZXN0IHRocmVzaG9sZCAgICAgICAgICAgICAgICovDQorI2RlZmluZSBOT19QMSAzMTc0NCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlsb2cyKDEpLCBOb2lzZSBsZXZlbCBmb3IgaGlnaGVzdCB0aHJlc2hvbGQgKi8NCisjZGVmaW5lIE5PX1AyIDE5Nzg2ICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxvZzIoMC4xKk1BWF8xNiksIE5vaXNlIGxldmVsIGZvciBsb3dlc3QgdGhyZXNob2xkICovDQorI2RlZmluZSBOT19TTE9QRSAoV29yZDE2KShNQVhfMTYqKGZsb2F0KShUSFJfTE9XLVRIUl9ISUdIKS8oZmxvYXQpKE5PX1AyLU5PX1AxKSkNCisNCisjZGVmaW5lIFNQX0NIX01JTiAoV29yZDE2KSgtMC43NSpTQ0FMRSkNCisjZGVmaW5lIFNQX0NIX01BWCAoV29yZDE2KSgwLjc1KlNDQUxFKQ0KKyNkZWZpbmUgU1BfUDEgMjI1MjcgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbG9nMihOT01fTEVWRUwvNCkgKi8NCisjZGVmaW5lIFNQX1AyIDE3ODMyICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxvZzIoTk9NX0xFVkVMKjQpICovDQorI2RlZmluZSBTUF9TTE9QRSAoV29yZDE2KShNQVhfMTYqKGZsb2F0KShTUF9DSF9NQVgtU1BfQ0hfTUlOKS8oZmxvYXQpKFNQX1AyLVNQX1AxKSkNCisNCisvKiBDb25zdGFudHMgZm9yIGhhbmdvdmVyIGxlbmd0aCAqLw0KKyNkZWZpbmUgSEFOR19ISUdIICAxMiAgICAgICAgICAgICAgICAgICAgICAvKiBsb25nZXN0IGhhbmdvdmVyICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIEhBTkdfTE9XICAyICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnRlc3QgaGFuZ292ZXIgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgSEFOR19QMSBUSFJfTE9XICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZm9yIGxvbmdlc3QgaGFuZ292ZXIgKi8NCisjZGVmaW5lIEhBTkdfUDIgKFdvcmQxNikoNCpTQ0FMRSkgICAgICAgICAgLyogdGhyZXNob2xkIGZvciBzaG9ydGVzdCBoYW5nb3ZlciAqLw0KKyNkZWZpbmUgSEFOR19TTE9QRSAoV29yZDE2KShNQVhfMTYqKGZsb2F0KShIQU5HX0xPVy1IQU5HX0hJR0gpLyhmbG9hdCkoSEFOR19QMi1IQU5HX1AxKSkNCisNCisvKiBDb25zdGFudHMgZm9yIGJ1cnN0IGxlbmd0aCAqLw0KKyNkZWZpbmUgQlVSU1RfSElHSCA4ICAgICAgICAgICAgICAgICAgICAgICAvKiBsb25nZXN0IGJ1cnN0IGxlbmd0aCAgICAgICAgICovDQorI2RlZmluZSBCVVJTVF9MT1cgMyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3J0ZXN0IGJ1cnN0IGxlbmd0aCAgICAgICAgKi8NCisjZGVmaW5lIEJVUlNUX1AxIFRIUl9ISUdIICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIGZvciBsb25nZXN0IGJ1cnN0ICovDQorI2RlZmluZSBCVVJTVF9QMiBUSFJfTE9XICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBmb3Igc2hvcnRlc3QgYnVyc3QgKi8NCisjZGVmaW5lIEJVUlNUX1NMT1BFIChXb3JkMTYpKE1BWF8xNiooZmxvYXQpKEJVUlNUX0xPVy1CVVJTVF9ISUdIKS8oZmxvYXQpKEJVUlNUX1AyLUJVUlNUX1AxKSkNCisNCisvKiBQYXJhbWV0ZXJzIGZvciBiYWNrZ3JvdW5kIHNwZWN0cnVtIHJlY292ZXJ5IGZ1bmN0aW9uICovDQorI2RlZmluZSBTVEFUX0NPVU5UIDIwICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBvZiBzdGF0aW9uYXJ5IGRldGVjdGlvbiBjb3VudGVyICAgICAgICAgKi8NCisNCisjZGVmaW5lIFNUQVRfVEhSX0xFVkVMIDE4NCAgICAgICAgICAgICAgICAgLyogVGhyZXNob2xkIGxldmVsIGZvciBzdGF0aW9uYXJpdHkgZGV0ZWN0aW9uICAgICAgICAqLw0KKyNkZWZpbmUgU1RBVF9USFIgMTAwMCAgICAgICAgICAgICAgICAgICAgICAvKiBUaHJlc2hvbGQgZm9yIHN0YXRpb25hcml0eSBkZXRlY3Rpb24gICAgICAgICAgICAgICovDQorDQorLyogTGltaXRzIGZvciBiYWNrZ3JvdW5kIG5vaXNlIGVzdGltYXRlICovDQorI2RlZmluZSBOT0lTRV9NSU4gNDAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gKi8NCisjZGVmaW5lIE5PSVNFX01BWCAyMDAwMCAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSAqLw0KKyNkZWZpbmUgTk9JU0VfSU5JVCAxNTAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsICovDQorDQorLyogVGhyZXNob2xkcyBmb3Igc2lnbmFsIHBvd2VyIChub3cgY2FsY3VsYXRlZCBvbiAyIGZyYW1lcykgKi8NCisjZGVmaW5lIFZBRF9QT1dfTE9XIChXb3JkMzIpMzAwMDBMICAgICAgICAgLyogSWYgaW5wdXQgcG93ZXIgaXMgbG93ZXIgdGhhbiB0aGlzLCBWQUQgaXMgc2V0IHRvIDAgKi8NCisjZGVmaW5lIFBPV19UT05FX1RIUiAoV29yZDMyKTY4NjA4MEwgICAgICAgLyogSWYgaW5wdXQgcG93ZXIgaXMgbG93ZXIsdG9uZSBkZXRlY3Rpb24gZmxhZyBpcyBpZ25vcmVkICovDQorDQorLyogQ29uc3RhbnRzIGZvciB0aGUgZmlsdGVyIGJhbmsgKi8NCisjZGVmaW5lIENPRUZGMyAgIDEzMzYzICAgICAgICAgICAgICAgICAgICAgLyogY29lZmZpY2llbnQgZm9yIHRoZSAzcmQgb3JkZXIgZmlsdGVyICAgICAqLw0KKyNkZWZpbmUgQ09FRkY1XzEgMjE5NTUgICAgICAgICAgICAgICAgICAgICAvKiAxc3QgY29lZmZpY2llbnQgdGhlIGZvciA1dGggb3JkZXIgZmlsdGVyICovDQorI2RlZmluZSBDT0VGRjVfMiA2MzkwICAgICAgICAgICAgICAgICAgICAgIC8qIDJuZCBjb2VmZmljaWVudCB0aGUgZm9yIDV0aCBvcmRlciBmaWx0ZXIgKi8NCisjZGVmaW5lIEZfNVRIX0NOVCA1ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIDV0aCBvcmRlciBmaWx0ZXJzICovDQorI2RlZmluZSBGXzNUSF9DTlQgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiAzdGggb3JkZXIgZmlsdGVycyAqLw0KKw0KKyNlbmRpZiAgIC8vX19XQl9WQURfQ19IX18NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI1ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucwpAQCAtMCwwICsxLDEwNCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAdm9pZCBEZWVtcGhfMzIoDQorQCAgICAgV29yZDE2IHhfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQzMS4uMTYpICovDQorQCAgICAgV29yZDE2IHhfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQxNS4uNCkgICovDQorQCAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAoeDE2KSAgICAgICovDQorQCAgICAgV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICovDQorQCAgICAgV29yZDE2IEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICovDQorQCAgICAgKQ0KKw0KK0B4X2hpICAgICBSTiAgICAgIFIwDQorQHhfbG8gICAgIFJOICAgICAgUjENCitAeVtdICAgICAgUk4gICAgICBSMg0KK0AqbWVtICAgICBSTiAgICAgIFIzDQorDQorICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisgICAgICAgICAgIC5nbG9iYWwgICBEZWVtcGhfMzJfYXNtDQorCSAgIA0KK0RlZW1waF8zMl9hc206DQorDQorICAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorCSAgIE1PViAgICAgICAgICByNCwgIzIgICAgICAgICAgICAgICAgICAgQGk9MA0KKwkgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbMF0NCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzBdDQorCSAgIExEUiAgICAgICAgICByNSwgPTIyMjgyICAgICAgICAgICAgICAgQHI1LS0tbXUNCisJICAgTU9WICAgICAgICAgIHIxMSwgIzB4ODAwMA0KKw0KKyAgICAgICAgICAgQHlbMF0NCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYgICAgICAgICBATF90bXAgPSB4X2hpWzBdPDwxNg0KKwkgICBNT1YgICAgICAgICAgcjgsICByNSwgQVNSICMxICAgICAgICAgIEBmYWMgPSBtdSA+PiAxDQorCSAgIExEUiAgICAgICAgICByNSwgIFtyM10NCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0ICAgICBATF90bXAgKz0geF9sb1swXSA8PCA0DQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzICAgICAgICAgQExfdG1wIDw8PSAzDQorCSAgIE1VTCAgICAgICAgICByOSwgcjUsIHI4DQorCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVsxXSANCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyICAgICAgICAgICAgIEBsb2FkIHhfbG9bMV0gIA0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMSAgICAgICAgIEBMX3RtcCA9IExfbWFjKExfdG1wLCAqbWVtLCBmYWMpDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNiAgICAgICAgQHlbMF0gPSByb3VuZChMX3RtcCkNCisNCisNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYNCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0DQorICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdLCAjMiAgICAgICAgICAgIEB1cGRhdGUgeVswXQ0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMw0KKwkgICBNVUwgICAgICAgICAgcjksIHIxNCwgcjgNCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYgICAgICAgIEB5WzFdID0gcm91bmQoTF90bXApDQorDQorTE9PUDoNCisgICAgICAgICAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVtdDQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzINCisJICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXSwgIzINCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYNCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0DQorCSAgIE1VTCAgICAgICAgICByOSwgcjE0LCByOA0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMw0KKwkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5DQorICAgICAgICAgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbXQ0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyDQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNg0KKw0KKwkgICBNT1YgICAgICAgICAgcjEwLCByNiwgTFNMICMxNg0KKwkgICBBREQgICAgICAgICAgcjEyLCByMTAsIHI3LCBMU0wgIzQNCisJICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXSwgIzINCisJICAgTVVMICAgICAgICAgIHI5LCByMTQsIHI4DQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzDQorCSAgIFFEQUREICAgICAgICByMTAsIHIxMCwgcjkNCisgICAgICAgICAgIEFERCAgICAgICAgICByNCwgcjQsICMyDQorCSAgIE1PViAgICAgICAgICByMTIsIHIxMCwgTFNMICMxDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorICAgICAgICAgICBDTVAgICAgICAgICAgcjQsICM2NA0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYNCisNCisgICAgICAgICAgIEJMVCAgICAgICAgICBMT09QDQorICAgICAgICAgICBTVFIgICAgICAgICAgcjE0LCBbcjNdDQorICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdCSAgIA0KKw0KKyAgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKw0KKwkgICBARU5EUA0KKwkgICAuRU5EDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODMyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMKQEAgLTAsMCArMSw4MCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQFdvcmQzMiBEb3RfcHJvZHVjdDEyKCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTMxOiBub3JtYWxpemVkIHJlc3VsdCAoMSA8IHZhbCA8PSAtMSkgKi8NCitAICAgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHkgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiB2ZWN0b3IgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICAgIFdvcmQxNiAqIGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogZXhwb25lbnQgb2YgcmVzdWx0ICgwLi4rMzApICAgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgIHhbXSAgIC0tLSAgcjANCitAICB5W10gICAtLS0gIHIxDQorQCAgbGcgICAgLS0tICByMg0KK0AgICpleHAgIC0tLSAgcjMNCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorIAkgIC5nbG9iYWwgICBEb3RfcHJvZHVjdDEyX2FzbQ0KKw0KK0RvdF9wcm9kdWN0MTJfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBNT1YgICAgICAgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gMA0KKyAgICAgICAgICBNT1YgICAgICAgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwDQorDQorTE9PUDoNCisgICAgICAgICAgTERSICAgICAgICAgICByNiwgW3IwXSwgIzQNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgW3IxXSwgIzQNCisgICAgICAgICAgTERSICAgICAgICAgICByOCwgW3IwXSwgIzQNCisgICAgICAgICAgU01MQUJCICAgICAgICByNCwgcjYsIHI3LCByNA0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI5LCBbcjFdLCAjNA0KKwkgIFNNTEFUVCAgICAgICAgcjQsIHI2LCByNywgcjQgDQorDQorCSAgTERSICAgICAgICAgICByNiwgW3IwXSwgIzQNCisJICBTTUxBQkIgICAgICAgIHI0LCByOCwgcjksIHI0DQorDQorCSAgTERSICAgICAgICAgICByNywgW3IxXSwgIzQNCisJICBTTUxBVFQgICAgICAgIHI0LCByOCwgcjksIHI0CSAgDQorCSAgTERSICAgICAgICAgICByOCwgW3IwXSwgIzQNCisNCisJICBTTUxBQkIgICAgICAgIHI0LCByNiwgcjcsIHI0DQorCSAgTERSICAgICAgICAgICByOSwgW3IxXSwgIzQNCisJICBTTUxBVFQgICAgICAgIHI0LCByNiwgcjcsIHI0DQorCSAgQUREICAgICAgICAgICByNSwgcjUsICM4DQorCSAgU01MQUJCICAgICAgICByNCwgcjgsIHI5LCByNA0KKwkgIENNUCAgICAgICAgICAgcjUsIHIyDQorCSAgU01MQVRUICAgICAgICByNCwgcjgsIHI5LCByNA0KKwkgIEJMVCAgICAgICAgICAgTE9PUA0KKyAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjEyLCByNCwgTFNMICMxDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjEyLCByMTIsICMxICAgICAgICAgICAgICAgICAgICAgICAgIEAgTF9zdW0gPSAoTF9zdW0gPDwgMSkgICsgMQ0KKwkgIE1PViAgICAgICAgICAgcjQsIHIxMg0KKw0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHIxMiwgIzANCisJICBSU0JMVCAgICAgICAgIHI0LCByMTIsICMwDQorICAgICAgICAgIENMWiAgICAgICAgICAgcjEwLCByNA0KKyAgICAgICAgICBTVUIgICAgICAgICAgIHIxMCwgcjEwLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIHNmdCA9IG5vcm1fbChMX3N1bSkNCisgICAgICAgICAgTU9WICAgICAgICAgICByMCwgcjEyLCBMU0wgcjEwICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IExfc3VtIDw8IHNmdA0KKyAgICAgICAgICBSU0IgICAgICAgICAgIHIxMSwgcjEwLCAjMzAgICAgICAgICAgICAgICAgICAgICAgICBAICpleHAgPSAzMCAtIHNmdA0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMSwgW3IzXSAgICAgICAgICAgICAgICAgICAgIA0KKw0KK0RvdF9wcm9kdWN0MTJfZW5kOg0KKwkJICAgICANCisgICAgICAgICAgTERNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWJkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpAQCAtMCwwICsxLDE4NSBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitAdm9pZCBGaWx0XzZrXzdrKA0KK0AgICAgIFdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBsZW5ndGggb2YgaW5wdXQgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKHNpemU9MzApICAgICAgICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgcjAgICAgLS0tICBzaWduYWxbXQ0KK0AgcjEgICAgLS0tICBsZw0KK0AgcjIgICAgLS0tICBtZW1bXSANCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorICAgICAgICAgIC5nbG9iYWwgIEZpbHRfNmtfN2tfYXNtDQorICAgICAgICAgIC5leHRlcm4gIHZvQVdCX0NvcHkNCisgICAgICAgICAgLmV4dGVybiAgZmlyXzZrXzdrDQorDQorRmlsdF82a183a19hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCQlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIFNVQiAgICAJCXIxMywgcjEzLCAjMjQwICAgICAgICAgICAgICBAIHhbTF9TVUJGUjE2ayArIChMX0ZJUiAtIDEpXQ0KKyAgICAgICAgICBNT1YgICAgIAkJcjgsIHIwICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBzaWduYWxbXSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgCQlyNCwgcjEgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxnIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAJCXI1LCByMiAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbWVtW10gYWRkcmVzcw0KKw0KKyAgICAgICAgICBNT1YgICAgIAkJcjEsIHIxMw0KKyAgICAgICAgICBNT1YgICAgIAkJcjAsIHIyDQorICAgICAgICAgIE1PViAgICAgCQlyMiwgIzMwICAgICAgICAgICAgICAgICAgICAgQCBMX0ZJUiAtIDENCisgICAgICAgICAgQkwgICAgICAJCXZvQVdCX0NvcHkgICAgICAgICAgICAgICAgICAgQCBtZW1jcHkoeCwgbWVtLCAoTF9GSVIgLSAxKTw8MSkNCisNCisgICAgICAgICAgTERSICAgICAJCXIxMCwgTGFibGUxICAgICAgICAgICAgICAgICBAIGdldCBmaXJfN2sgYWRkcmVzcyAgICAgDQorDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXIxNCwgIzAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgICAgICAgICAgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgIEAgY2hhbmdlIG15TWVtQ29weSB0byBDb3B5LCBkdWUgdG8gQ29weSB3aWxsIGNoYW5nZSByMyBjb250ZW50DQorICAgICAgICAgIEFERCAgICAgCSAgICAJcjYsIHIxMywgIzYwICAgICAgICAgICAgICAgIEAgZ2V0IHhbTF9GSVIgLSAxXSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI3LCByMyAgICAgICAgICAgICAgICAgICAgICBAIGdldCBzaWduYWxbaV0NCitMT09QMToNCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjgsICBbcjddLCAjMg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyOSwgIFtyN10sICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI4LCByOCwgQVNSICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI5LCByOSwgQVNSICMyDQorICAgICAgICAgIExEUlNIICAgICAgICAgCXIxMSwgW3I3XSwgIzINCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjEyLCBbcjddLCAjMg0KKyAgICAgICAgICBNT1YgICAgICAgICAgIAlyMTEsIHIxMSwgQVNSICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXIxMiwgcjEyLCBBU1IgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjgsIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXI5LCBbcjZdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIAlyMTEsIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXIxMiwgW3I2XSwgIzINCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjgsICBbcjddLCAjMg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyOSwgIFtyN10sICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI4LCByOCwgQVNSICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI5LCByOSwgQVNSICMyDQorICAgICAgICAgIExEUlNIICAgICAgICAgCXIxMSwgW3I3XSwgIzINCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjEyLCBbcjddLCAjMg0KKyAgICAgICAgICBNT1YgICAgICAgICAgIAlyMTEsIHIxMSwgQVNSICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXIxMiwgcjEyLCBBU1IgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjgsIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXI5LCBbcjZdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIAlyMTEsIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXIxMiwgW3I2XSwgIzINCisgICAgICAgICAgQUREICAgICAgICAgICAJcjE0LCByMTQsICM4DQorICAgICAgICAgIENNUCAgICAgICAgICAgCXIxNCwgIzgwDQorICAgICAgICAgIEJMVCAgICAgICAgICAgCUxPT1AxICAgICAgICAgIA0KKw0KKw0KKyAgICAgICAgICBTVFIgICAgIAkJcjUsIFtzcCwgIy00XSAgICAgICAgICAgICAgIEAgUFVTSCAgcjUgdG8gc3RhY2sNCisNCisgICAgICAgICAgQCBub3QgdXNlIHJlZ2lzdGVyczogcjQsIHIxMCwgcjEyLCByMTQsIHI1DQorICAgICAgICAgIE1PViAgICAgCQlyNCwgcjEzIA0KKyAgICAgICAgICBNT1YgICAgIAkJcjUsICMwICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDAgICAgICAgICAgICAgIA0KK0xPT1AyOg0KKyAgICAgICAgICBMRFIgICAgICAgICAgIAlyMCwgW3IxMF0NCisNCisgICAgICAgICAgTERSU0ggIAkgICAgICAgIHIxLCBbcjRdICAgICAgICAgICAgICAgICAgIEAgbG9hZCB4W2ldDQorICAgICAgICAgIExEUlNIICAgCSAgICAgICAgcjIsIFtyNCwgIzYwXSAgICAgICAgICAgICAgQCBsb2FkIHhbaSArIDMwXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzJdICAgICAgICAgICAgICAgQCBsb2FkIHhbaSArIDFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNywgW3I0LCAjNThdICAgICAgICAgICAgICBAIGxvYWQgeFtpICsgMjldDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICAgICBAIHhbaV0gKyB4W2kgKyAzMF0NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgeFtpICsgMV0gKyB4W2kgKyAyOV0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI4LCBbcjQsICM0XSAgICAgICAgICAgICAgIEAgbG9hZCB4W2kgKyAyXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjksIFtyNCwgIzU2XSAgICAgICAgICAgICAgQCBsb2FkIHhbaSArIDI4XQ0KKw0KKyAgICAgICAgICBTTVVMQkIgICAgICAgICAgICAgICAgcjE0LCByMSwgcjAgICAgICAgICAgICAgICAgQCAoeFtpXSArIHhbaSArIDMwXSkgKiBmaXJfN2tbMF0NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgeFtpICsgMl0gKyB4W2kgKyAyOF0NCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSArIDFdICsgeFtpICsgMjldKSAqIGZpcl83a1sxXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICM0XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjEsIFtyNCwgIzZdICAgICAgICAgICAgICAgQCBsb2FkIHhbaSszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzU0XSAgICAgICAgICAgICAgQCBsb2FkIHhbaSsyN10NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI2LCBbcjQsICM4XSAgICAgICAgICAgICAgIEAgbG9hZCB4W2krNF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI3LCBbcjQsICM1Ml0gICAgICAgICAgICAgIEAgbG9hZCB4W2krMjZdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICAgICBAIHhbaSszXSArIHhbaSsyN10NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgeFtpKzRdICsgeFtpKzI2XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgICAgICAgICAgcjE0LCByOCwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpICsgMl0gKyB4W2kgKyAyOF0pICogZmlyXzdrWzJdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOCwgW3I0LCAjMTBdICAgICAgICAgICAgICBAIGxvYWQgeFtpKzVdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOSwgW3I0LCAjNTBdICAgICAgICAgICAgICBAIGxvYWQgeFtpKzI1XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByMSwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzNdICsgeFtpKzI3XSkgKiBmaXJfN2tbM10NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgeFtpKzVdICsgeFtpKzI1XSANCisgDQorICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzhdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMSwgW3I0LCAjMTJdICAgICAgICAgICAgICBAIHhbaSs2XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzQ4XSAgICAgICAgICAgICAgQCB4W2krMjRdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHI2LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krNF0gKyB4W2krMjZdKSAqIGZpcl83a1s0XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzE0XSAgICAgICAgICAgICAgQCB4W2krN10gDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNywgW3I0LCAjNDZdICAgICAgICAgICAgICBAIHhbaSsyM10NCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjgsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs1XSArIHhbaSsyNV0pICogZmlyXzdrWzVdDQorICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzEyXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjEsIHIxLCByMiAgICAgICAgICAgICAgICAgQCAoeFtpKzZdICsgeFtpKzI0XSkNCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgKHhbaSs3XSArIHhbaSsyM10pDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHIxLCByMCwgcjE0ICAgICAgICAgICBAICh4W2krNl0gKyB4W2krMjRdKSAqIGZpcl83a1s2XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjgsIFtyNCwgIzE2XSAgICAgICAgICAgICAgQCB4W2krOF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICM0NF0gICAgICAgICAgICAgIEAgeFtpKzIyXSANCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs3XSArIHhbaSsyM10pICogZmlyXzdrWzddICANCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjMTZdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMSwgW3I0LCAjMThdICAgICAgICAgICAgICBAIHhbaSs5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzQyXSAgICAgICAgICAgICAgQCB4W2krMjFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNiwgW3I0LCAjMjBdICAgICAgICAgICAgICBAIHhbaSsxMF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI3LCBbcjQsICM0MF0gICAgICAgICAgICAgIEAgeFtpKzIwXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjgsIHI4LCByOSAgICAgICAgICAgICAgICAgQCAoeFtpKzhdICsgeFtpKzIyXSkNCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHIxLCByMSwgcjIgICAgICAgICAgICAgICAgIEAgKHhbaSs5XSArIHhbaSsyMV0pDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICBAICh4W2krMTBdICsgeFtpKzIwXSkNCisgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjgsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs4XSArIHhbaSsyMl0pICogZmlyXzdrWzhdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOCwgW3I0LCAjMjJdICAgICAgICAgICAgICBAIHhbaSsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICMzOF0gICAgICAgICAgICAgIEAgeFtpKzE5XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByMSwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzldICsgeFtpKzIxXSkgKiBmaXJfN2tbOV0NCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjMjBdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMSwgW3I0LCAjMjRdICAgICAgICAgICAgICBAIHhbaSsxMl0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIyLCBbcjQsICMzNl0gICAgICAgICAgICAgIEAgeFtpKzE4XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgICAgICAgICAgcjE0LCByNiwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzEwXSArIHhbaSsyMF0pICogZmlyXzdrWzEwXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzI2XSAgICAgICAgICAgICAgQCB4W2krMTNdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByOCwgcjgsIHI5ICAgICAgICAgICAgICAgICBAICh4W2krMTFdICsgeFtpKzE5XSkgIA0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjcsIFtyNCwgIzM0XSAgICAgICAgICAgICAgQCB4W2krMTddDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHI4LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krMTFdICsgeFtpKzE5XSkgKiBmaXJfN2tbMTFdDQorICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzI0XQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjEsIHIxLCByMiAgICAgICAgICAgICAgICAgQCB4W2krMTJdICsgeFtpKzE4XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjgsIFtyNCwgIzI4XSAgICAgICAgICAgICAgQCB4W2krMTRdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHIxLCByMCwgcjE0ICAgICAgICAgICBAICh4W2krMTJdICsgeFtpKzE4XSkgKiBmaXJfN2tbMTJdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICBAICh4W2krMTNdICsgeFtpKzE3XSkNCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICMzMl0gICAgICAgICAgICAgIEAgeFtpKzE2XSANCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxM10gKyB4W2krMTddKSAqIGZpcl83a1sxM10NCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjMjhdICAgICAgICAgDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByOCwgcjgsIHI5ICAgICAgICAgICAgICAgICBAICh4W2krMTRdICsgeFtpKzE2XSkNCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIxLCBbcjQsICMzMF0gICAgICAgICAgICAgIEAgeFtpKzE1XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgICAgICAgICAgcjE0LCByOCwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzE0XSArIHhbaSsxNl0pICogZmlyXzdrWzE0XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByMSwgcjAsIHIxNCAgICAgICAgICAgQCB4W2krMTVdICogZmlyXzdrWzE1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKyAgICAgICAgICBBREQgICAgIAkJcjUsIHI1LCAjMQ0KKyAgICAgICAgICBBREQgICAgIAkJcjE0LCByMTQsICMweDQwMDANCisgICAgICAgICAgQUREICAgICAJCXI0LCByNCwgIzIgICAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgCQlyMSwgcjE0LCBBU1IgIzE1DQorICAgICAgICAgIENNUCAgICAgCQlyNSwgIzgwDQorICAgICAgICAgIFNUUkggICAgCQlyMSwgW3IzXSwgIzIgICAgICAgICAgICAgICBAc2lnbmFsW2ldID0gKExfdG1wICsgMHg0MDAwKSA+PiAxNQ0KKyAgICAgICAgICBCTFQgICAgIAkJTE9PUDIgICAgICANCisgICAgICAgICAgIA0KKyAgICAgICAgICBMRFIgICAgIAkJcjEsIFtzcCwgIy00XSAgICAgICAgICAgICAgIEBtZW0gYWRkcmVzcw0KKyAgICAgICAgICBBREQgICAgIAkJcjAsIHIxMywgIzE2MCAgICAgICAgICAgICAgIEB4ICsgbGcNCisgICAgICAgICAgTU9WICAgICAJCXIyLCAjMzANCisgICAgICAgICAgQkwgICAgICAJCXZvQVdCX0NvcHkNCisgICAgICAgICAgICAgICAgICAgIA0KK0ZpbHRfNmtfN2tfZW5kOg0KKyAgICAgICAgICBBREQgICAgIAkJcjEzLCByMTMsICMyNDAgIA0KKyAgICAgICAgICBMRE1GRCAgIAkJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKyANCitMYWJsZTE6DQorICAgICAgICAgIC53b3JkICAgCQlmaXJfNmtfN2sNCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDBhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCkBAIC0wLDAgKzEsMjMxIEBACitALyoKK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KK0AgKioKK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitAICoqCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AgKioKK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AgKi8KKworQHN0YXRpYyB2b2lkIE5vcm1fQ29yciAoV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4Y2l0YXRpb24gYnVmZmVyICAgICAgICAgICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHN5bnRoL3dndCBmaWx0ZXJzICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgTF9zdWJmciwgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3ViLWZyYW1lIGxlbmd0aCAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRfbWluLCAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdF9tYXgsICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWF4aW11bSB2YWx1ZSBvZiBwaXRjaCBsYWcuICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjb3JyX25vcm1bXSkgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAgICovCitACisKK0AgcjAgLS0tIGV4Y1tdCitAIHIxIC0tLSB4bltdCitAIHIyIC0tLSBoW10KK0AgcjMgLS0tIExfc3ViZnIKK0AgcjQgLS0tIHRfbWluCitAIHI1IC0tLSB0X21heAorQCByNiAtLS0gY29ycl9ub3JtW10KKworCisJLnNlY3Rpb24gIC50ZXh0IAorICAgICAgICAuZ2xvYmFsICAgTm9ybV9jb3JyX2FzbSAKKyAgICAgICAgLmV4dGVybiAgIENvbnZvbHZlX2FzbQorICAgICAgICAuZXh0ZXJuICAgSXNxcnRfbgorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQCBjb25zdGFudAorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLmVxdSAgICAgICAgIEVYQyAgICAgICAgICAgLCAgIDAKKy5lcXUgICAgICAgICBYTiAgICAgICAgICAgICwgICA0CisuZXF1ICAgICAgICAgSCAgICAgICAgICAgICAsICAgOAorLmVxdSAgICAgICAgIExfU1VCRlIgICAgICAgLCAgIDEyCisuZXF1ICAgICAgICAgdm9TVEFDSyAgICAgICAsICAgMTcyCisuZXF1ICAgICAgICAgVF9NSU4gICAgICAgICAsICAgMjEyCisuZXF1ICAgICAgICAgVF9NQVggICAgICAgICAsICAgMjE2CisuZXF1ICAgICAgICAgQ09SUl9OT1JNICAgICAsICAgMjIwCisgICAgICAgICAgICAgICAgICAKK05vcm1fY29ycl9hc206CisKKyAgICAgICAgU1RNRkQgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0gIAorICAgICAgICBTVUIgICAgICAgIHIxMywgcjEzLCAjdm9TVEFDSworICAKKyAgICAgICAgQUREICAgICAgICByOCwgcjEzLCAjMjAgICAgICAgICAgICAgICAgIEBnZXQgdGhlIGV4Y2ZbTF9TVUJGUl0KKyAgICAgICAgTERSICAgICAgICByNCwgW3IxMywgI1RfTUlOXSAgICAgICAgICAgIEBnZXQgdF9taW4KKyAgICAgICAgUlNCICAgICAgICByMTEsIHI0LCAjMCAgICAgICAgICAgICAgICAgIEBrID0gLXRfbWluCisgICAgICAgIEFERCAgICAgICAgcjUsIHIwLCByMTEsIExTTCAjMSAgICAgICAgICBAZ2V0IHRoZSAmZXhjW2tdICAgCisgICAgICAgIAorICAgICAgICBAdHJhbnNmZXIgQ29udm9sdmUgZnVuY3Rpb24KKyAgICAgICAgU1RNRkQgICAgICAgc3AhLCB7cjAgLSByM30KKyAgICAgICAgTU9WICAgICAgICAgcjAsIHI1CisgICAgICAgIE1PViAgICAgICAgIHIxLCByMgorICAgICAgICBNT1YgICAgICAgICByMiwgcjggICAgICAgICAgICAgICAgICAgICAgIEByMiAtLS0gZXhjZltdCisgICAgICAgIEJMICAgICAgICAgIENvbnZvbHZlX2FzbQorICAgICAgICBMRE1GRCAgICAgICBzcCEsIHtyMCAtIHIzfQorCisgICAgICAgIEAgcjggLS0tIGV4Y2ZbXQorCisJTU9WICAgICAgICAgcjE0LCByMSAgICAgICAgICAgICAgICAgICAgICAgQGNvcHkgeG5bXSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByNSwgIzY0CisgICAgICAgIE1PViAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgQExfdG1wID0gMAorICAgICAgICBNT1YgICAgICAgICByNywgIzEKKworTE9PUDE6CisgICAgICAgIExEUiAgICAgICAgIHI5LCAgW3IxNF0sICM0CisJTERSICAgICAgICAgcjEwLCBbcjE0XSwgIzQKKwlMRFIgICAgICAgICByMTEsIFtyMTRdLCAjNAorCUxEUiAgICAgICAgIHIxMiwgW3IxNF0sICM0CisJU01MQUJCICAgICAgcjYsIHI5LCByOSwgcjYgICAgICAgICAgICAgICBATF90bXAgKz0gKHhuW2ldICogeG5baV0pCisJU01MQVRUICAgICAgcjYsIHI5LCByOSwgcjYgICAgICAgICAgICAgICBATF90bXAgKz0gKHhuW2krMV0gKiB4bltpKzFdKQorICAgICAgICBTTUxBQkIgICAgICByNiwgcjEwLCByMTAsIHI2CisJU01MQVRUICAgICAgcjYsIHIxMCwgcjEwLCByNgorCVNNTEFCQiAgICAgIHI2LCByMTEsIHIxMSwgcjYKKyAgICAgICAgU01MQVRUICAgICAgcjYsIHIxMSwgcjExLCByNgorICAgICAgICBTTUxBQkIgICAgICByNiwgcjEyLCByMTIsIHI2CisgICAgICAgIFNNTEFUVCAgICAgIHI2LCByMTIsIHIxMiwgcjYKKyAgICAgICAgU1VCUyAgICAgICAgcjUsIHI1LCAjOAorICAgICAgICBCTkUgICAgICAgICBMT09QMQorCisJQUREICAgICAgICAgcjksIHI3LCByNiwgTFNMICMxICAgICAgICAgICBATF90bXAgPSAoTF90bXAgPDwgMSkgKyAxCisJQ0xaICAgICAgICAgcjcsIHI5CisJU1VCICAgICAgICAgcjYsIHI3LCAjMSAgICAgICAgICAgICAgICAgICBAZXhwID0gbm9ybV9sKExfdG1wKQorICAgICAgICBSU0IgICAgICAgICByNywgcjYsICMzMiAgICAgICAgICAgICAgICAgIEBleHAgPSAzMiAtIGV4cAorCU1PViAgICAgICAgIHI2LCByNywgQVNSICMxICAgICAgICAgCisJUlNCICAgICAgICAgcjcsIHI2LCAjMCAgICAgICAgICAgICAgICAgICBAc2NhbGUgPSAtKGV4cCA+PiAxKQorCQorICAgICAgICBAbG9vcCBmb3IgZXZlcnkgcG9zc2libGUgcGVyaW9kCisJQGZvcih0ID0gdF9taW5AIHQgPD0gdF9tYXhAIHQrKykKKwlAcjcgLS0tIHNjYWxlIHI0IC0tLSB0X21pbiByOCAtLS0gZXhjZltdCisKK0xPT1BGT1I6CQorICAgICAgICBNT1YgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCAgPSAwCisJTU9WICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICBATF90bXAxID0gMAorCU1PViAgICAgICAgIHI5LCAjNjQgIAorCU1PViAgICAgICAgIHIxMiwgcjEgICAgICAgICAgICAgICAgICAgICAgQGNvcHkgb2YgeG5bXQorCUFERCAgICAgICAgIHIxNCwgcjEzLCAjMjAgICAgICAgICAgICAgICAgQGNvcHkgb2YgZXhjZltdCisJTU9WICAgICAgICAgcjgsICMweDgwMDAKKyAgICAgICAgCQorTE9PUGk6CisJTERSICAgICAgICAgcjExLCBbcjE0XSwgIzQgICAgICAgICAgICAgICBAbG9hZCBleGNmW2ldLCBleGNmW2krMV0KKyAgICAgICAgTERSICAgICAgICAgcjEwLCBbcjEyXSwgIzQgICAgICAgICAgICAgICBAbG9hZCB4bltpXSwgeG5baSsxXQorCVNNTEFCQiAgICAgIHI2LCByMTEsIHIxMSwgcjYgICAgICAgICAgICAgQExfdG1wMSArPSBleGNmW2ldICogZXhjZltpXQorCVNNTEFUVCAgICAgIHI2LCByMTEsIHIxMSwgcjYgICAgICAgICAgICAgQExfdG1wMSArPSBleGNmW2krMV0gKiBleGNmW2krMV0KKyAgICAgICAgU01MQUJCICAgICAgcjUsIHIxMCwgcjExLCByNSAgICAgICAgICAgICBATF90bXAgKz0geG5baV0gKiBleGNmW2ldCisJU01MQVRUICAgICAgcjUsIHIxMCwgcjExLCByNSAgICAgICAgICAgICBATF90bXAgKz0geG5baSsxXSAqIGV4Y2ZbaSsxXQorCUxEUiAgICAgICAgIHIxMSwgW3IxNF0sICM0ICAgICAgICAgICAgICAgQGxvYWQgZXhjZltpKzJdLCBleGNmW2krM10KKwlMRFIgICAgICAgICByMTAsIFtyMTJdLCAjNCAgICAgICAgICAgICAgIEBsb2FkIHhuW2krMl0sIHhuW2krM10KKyAgICAgICAgU01MQUJCICAgICAgcjYsIHIxMSwgcjExLCByNgorCVNNTEFUVCAgICAgIHI2LCByMTEsIHIxMSwgcjYKKwlTTUxBQkIgICAgICByNSwgcjEwLCByMTEsIHI1CisJU01MQVRUICAgICAgcjUsIHIxMCwgcjExLCByNQorCVNVQlMgICAgICAgIHI5LCByOSwgIzQKKyAgICAgICAgQk5FICAgICAgICAgTE9PUGkKKworCUByNSAtLS0gTF90bXAsIHI2IC0tLSBMX3RtcDEKKwlNT1YgICAgICAgICByMTAsICMxCisJQUREICAgICAgICAgcjUsIHIxMCwgcjUsIExTTCAjMSAgICAgICAgICBATF90bXAgPSAoTF90bXAgPDwgMSkgKyAxCisJQUREICAgICAgICAgcjYsIHIxMCwgcjYsIExTTCAjMSAgICAgICAgICBATF90bXAxID0gKExfdG1wMSA8PCAxKSArIDEKKyAKKwlDTFogICAgICAgICByMTAsIHI1ICAgICAgICAKKwlDTVAgICAgICAgICByNSwgIzAKKwlSU0JMVCAgICAgICByMTEsIHI1LCAjMAorCUNMWkxUICAgICAgIHIxMCwgcjExCisJU1VCICAgICAgICAgcjEwLCByMTAsICMxICAgICAgICAgICAgICAgICBAZXhwID0gbm9ybV9sKExfdG1wKQorICAgICAKKwlNT1YgICAgICAgICByNSwgcjUsIExTTCByMTAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCBleHApCisJUlNCICAgICAgICAgcjEwLCByMTAsICMzMCAgICAgICAgICAgICAgICBAZXhwX2NvcnIgPSAzMCAtIGV4cAorCU1PViAgICAgICAgIHIxMSwgcjUsIEFTUiAjMTYgICAgICAgICAgICAgQGNvcnIgPSBleHRyYWN0X2goTF90bXApCisKKwlDTFogICAgICAgICByNSwgcjYKKwlTVUIgICAgICAgICByNSwgcjUsICMxCisJTU9WICAgICAgICAgcjYsIHI2LCBMU0wgcjUgICAgICAgICAgICAgICBATF90bXAgPSAoTF90bXAxIDw8IGV4cCkKKwlSU0IgICAgICAgICByNSwgcjUsICMzMCAgICAgICAgICAgICAgICAgIEBleHBfbm9ybSA9IDMwIC0gZXhwCisKKwlAcjEwIC0tLSBleHBfY29yciwgcjExIC0tLSBjb3JyCisJQHI2ICAtLS0gTF90bXAsIHI1IC0tLSBleHBfbm9ybQorCisJQElzcXJ0X24oJkxfdG1wLCAmZXhwX25vcm0pCisKKwlNT1YgICAgICAgICByMTQsIHIwCisJTU9WICAgICAgICAgcjEyLCByMSAKKworICAgICAgICBTVE1GRCAgICAgICBzcCEsIHtyMCAtIHI0LCByNyAtIHIxMiwgcjE0fQorCUFERCAgICAgICAgIHIxLCBzcCwgIzQKKwlBREQgICAgICAgICByMCwgc3AsICMwCisJU1RSICAgICAgICAgcjYsIFtzcF0KKwlTVFJIICAgICAgICByNSwgW3NwLCAjNF0KKwlCTCAgICAgICAgICBJc3FydF9uCisJTERSICAgICAgICAgcjYsIFtzcF0KKwlMRFJTSCAgICAgICByNSwgW3NwLCAjNF0KKyAgICAgICAgTERNRkQgICAgICAgc3AhLCB7cjAgLSByNCwgcjcgLSByMTIsIHIxNH0KKwlNT1YgICAgICAgICByMCwgcjE0CisJTU9WICAgICAgICAgcjEsIHIxMgorCisKKwlNT1YgICAgICAgICByNiwgcjYsIEFTUiAjMTYgICAgICAgICAgICAgIEBub3JtID0gZXh0cmFjdF9oKExfdG1wKQorCU1VTCAgICAgICAgIHIxMiwgcjYsIHIxMQorCUFERCAgICAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgICAgICAgQExfdG1wID0gdm9fTF9tdWx0KGNvcnIsIG5vcm0pCisgIAorCUFERCAgICAgICAgIHI2LCByMTAsIHI1CisJQUREICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgICBAZXhwX2NvcnIgKyBleHBfbm9ybSArIHNjYWxlCisKKyAgICAgICAgQ01QICAgICAgICAgcjYsICMwCisgICAgICAgIFJTQkxUICAgICAgIHI2LCByNiwgIzAKKwlNT1ZMVCAgICAgICByMTIsIHIxMiwgQVNSIHI2CisgICAgICAgIE1PVkdUICAgICAgIHIxMiwgcjEyLCBMU0wgcjYgICAgICAgICAgICAgQExfdG1wID0gTF9zaGwoTF90bXAsIGV4cF9jb3JyICsgZXhwX25vcm0gKyBzY2FsZSkKKworICAgICAgICBBREQgICAgICAgICByMTIsIHIxMiwgcjgKKyAgICAgICAgTU9WICAgICAgICAgcjEyLCByMTIsIEFTUiAjMTYgICAgICAgICAgICBAdm9fcm91bmQoTF90bXApCisKKyAgICAgICAgTERSICAgICAgICAgcjUsIFtyMTMsICNDT1JSX05PUk1dICAgICAgICBAIGdldCBjb3JyX25vcm0gYWRkcmVzcworCUxEUiAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKKwlBREQgICAgICAgICByMTAsIHI1LCByNCwgTFNMICMxICAgICAgICAgIEAgZ2V0IGNvcnJfbm9ybVt0XSBhZGRyZXNzCisJU1RSSCAgICAgICAgcjEyLCBbcjEwXSAgICAgICAgICAgICAgICAgICBAIGNvcnJfbm9ybVt0XSA9IHZvX3JvdW5kKExfdG1wKQorCisJQ01QICAgICAgICAgcjQsIHI2CisJQkVRICAgICAgICAgTm9ybV9jb3JyX2FzbV9lbmQKKyAKKwlBREQgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgIEAgdF9taW4gKysKKyAgICAgICAgCisJUlNCICAgICAgICAgcjUsIHI0LCAjMCAgICAgICAgICAgICAgICAgICBAIGsKKworCU1PViAgICAgICAgIHI2LCAjNjMgICAgICAgICAgICAgICAgICAgICAgQCBpID0gNjMKKwlNT1YgICAgICAgICByOCwgcjAgICAgICAgICAgICAgICAgICAgICAgIEAgZXhjW10KKwlNT1YgICAgICAgICByOSwgcjIgICAgICAgICAgICAgICAgICAgICAgIEAgaFtdCisJQUREICAgICAgICAgcjEwLCByMTMsICMyMCAgICAgICAgICAgICAgICBAIGV4Y2ZbXQorCisJQUREICAgICAgICAgcjgsIHI4LCByNSwgTFNMICMxICAgICAgICAgICBAIGV4Y1trXSBhZGRyZXNzCisJQUREICAgICAgICAgcjksIHI5LCByNiwgTFNMICMxICAgICAgICAgICBAIGhbaV0gYWRkcmVzcworCUFERCAgICAgICAgIHIxMCwgcjEwLCByNiwgTFNMICMxICAgICAgICAgQCBleGNmW2ldIGFkZHJlc3MKKwlMRFJTSCAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgIEAgdG1wID0gZXhjW2tdCisKK0xPT1BLOgorICAgICAgICBMRFJTSCAgICAgICByOCwgW3I5XSwgIy0yICAgICAgICAgICAgICAgIEAgbG9hZCBoW2ldCisJTERSU0ggICAgICAgcjEyLCBbcjEwLCAjLTJdICAgICAgICAgICAgICBAIGxvYWQgZXhjZltpIC0gMV0KKwlNVUwgICAgICAgICByMTQsIHIxMSwgcjgKKwlNT1YgICAgICAgICByOCwgcjE0LCBBU1IgIzE1CisJQUREICAgICAgICAgcjE0LCByOCwgcjEyCisJU1RSSCAgICAgICAgcjE0LCBbcjEwXSwgIy0yCisJU1VCUyAgICAgICAgcjYsIHI2LCAjMQorCUJHVCAgICAgICAgIExPT1BLCisKKwlMRFJTSCAgICAgICByOCwgW3I5XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBoWzBdCisJTVVMICAgICAgICAgcjE0LCByMTEsIHI4CisgICAgICAgIExEUiAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKKwlNT1YgICAgICAgICByOCwgcjE0LCBBU1IgIzE1CisJU1RSSCAgICAgICAgcjgsIFtyMTBdICAgICAgICAgICAgICAgICAgICAKKworCUNNUCAgICAgICAgIHI0LCByNgorCUJMRSAgICAgICAgIExPT1BGT1IKKworTm9ybV9jb3JyX2FzbV9lbmQ6IAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLICAgICAgCisgICAgICAgIExETUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQorICAgIAorICAgICAgICAuRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTY2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMKQEAgLTAsMCArMSwyMjYgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0B2b2lkIFN5bl9maWx0XzMyKA0KK0AgICAgIFdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAqLw0KK0AgICAgIFdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KSAgICAqLw0KK0AgICAgIFdvcmQxNiBRbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4YyBzY2FsaW5nID0gMChtaW4pIHRvIDgobWF4KSAqLw0KK0AgICAgIFdvcmQxNiBzaWdfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBzaWdfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0ANCitAIGFbXSAgICAgIC0tLSByMA0KK0AgbSAgICAgICAgLS0tIHIxDQorQCBleGNbXSAgICAtLS0gcjINCitAIFFuZXcgICAgIC0tLSByMw0KK0Agc2lnX2hpW10gLS0tIHI0DQorQCBzaWdfbG9bXSAtLS0gcjUNCitAIGxnICAgICAgIC0tLSByNg0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisgICAgICAgICAgLmdsb2JhbCAgU3luX2ZpbHRfMzJfYXNtDQorDQorU3luX2ZpbHRfMzJfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjQsICBbcjEzLCAjNDBdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2hpW10gYWRkcmVzcw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI1LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ19sb1tdIGFkZHJlc3MNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMF0NCisgICAgICAgICAgQUREICAgICAgICAgICByNywgIHIzLCAjNCAgICAgICAgICAgICAgICAgICAgICBAIDQgKyBRX25ldw0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIzLCByNiwgQVNSIHI3ICAgICAgICAgICAgICAgICAgIEAgYTAgPSBBcVswXSA+PiAoNCArIFFfbmV3KQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxNCwgPTB4ZmZmZg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMyXSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjAsICM0XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsyXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI4LCBbcjAsICM2XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICM4XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVs0XQ0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI2LCByNiwgcjE0DQorICAgICAgICAgIEFORCAgICAgICAgICAgcjgsIHI4LCByMTQNCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzJdIC0tIEFxWzFdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjExLCByOCwgcjksIExTTCAjMTYgICAgICAgICAgICAgQCBBcVs0XSAtLSBBcVszXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy00XSAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMSwgW3IxMywgIy04XQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMxMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjAsICMxMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVs2XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI4LCBbcjAsICMxNF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVs3XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMxNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVs4XQ0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI2LCByNiwgcjE0DQorICAgICAgICAgIEFORCAgICAgICAgICAgcjgsIHI4LCByMTQNCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzZdIC0tIEFxWzVdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjExLCByOCwgcjksIExTTCAjMTYgICAgICAgICAgICAgQCBBcVs4XSAtLSBBcVs3XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0xMl0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtMTZdDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzE4XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzIwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzEwXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI4LCBbcjAsICMyMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3IwLCAjMjRdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMTJdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQgDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjgsIHI4LCByMTQNCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzEwXSAtLSBBcVs5XQ0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMSwgcjgsIHI5LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMTJdIC0tIEFxWzExXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0yMF0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtMjRdICANCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IwLCAjMjZdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzI4XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzE0XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI4LCBbcjAsICMzMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3IwLCAjMzJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMTZdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOCwgcjgsIHIxNA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMTRdIC0tIEFxWzEzXQ0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMSwgcjgsIHI5LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMTZdIC0tIEFxWzE1XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0yOF0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtMzJdDQorICAgICAgICAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDANCisgICAgICAgICAgICAgIA0KK0xPT1A6ICAgICAgICAgICAgDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyNSwgIy0yXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNSwgIy00XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTJdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTRdICAgICAgICAgICAgICAgICAgQCBBcVsyXSAtLSBBcVsxXSAgICAgICAgDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNSwgIy02XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjUsICMtOF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTRdDQorDQorICAgICAgICAgIFNNVUxCQiAgICAgICAgcjEyLCByNiwgcjExICAgICAgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xXSAqIEFxWzFdDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyNSwgIy0xMF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTVdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByNywgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0yXSAqIEFxWzJdDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLThdICAgICAgICAgICAgICAgICAgQCBBcVs0XSAtLSBBcVszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjUsICMtMTJdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS02XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktM10gKiBBcVszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjUsICMtMTRdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS03XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktNF0gKiBBcVs0XQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0xMl0gICAgICAgICAgICAgICAgIEAgQXFbNl0gLS0gQXFbNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNSwgIy0xNl0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktOF0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTVdICogQXFbNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyNSwgIy0xOF0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktOV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTZdICogQXFbNl0NCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMTZdICAgICAgICAgICAgICAgICBAIEFxWzhdIC0tIEFxWzddDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsICBbcjUsICMtMjBdICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTEwXQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktN10gKiBBcVs3XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjUsICMtMjJdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xMV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19sb1tpLThdICogQXFbOF0NCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMjBdICAgICAgICAgICAgICAgICBAIEFxWzEwXSAtLSBBcVs5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCxbcjUsICMtMjRdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xMl0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTldICogQXFbOV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I1LCAjLTI2XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTNdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByNywgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xMF0gKiBBcVsxMF0NCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMjRdICAgICAgICAgICAgICAgICBAIEFxWzEyXSAtLSBBcVsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3I1LCAjLTI4XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTRdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xMV0gKiBBcVsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3I1LCAjLTMwXSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTVdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xMl0gKiBBcVsxMl0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMjhdICAgICAgICAgICAgICAgICBAIEFxWzE0XSAtLSBBcVsxM10NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNSwgIy0zMl0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTZdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xM10gKiBBcVsxM10NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTE0XSAqIEFxWzE0XQ0KKyANCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMzJdICAgICAgICAgICAgICAgICBAIEFxWzE2XSAtLSBBcVsxNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IyXSwjMiAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgZXhjW2ldIA0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktMTVdICogQXFbMTVdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xNl0gKiBBcVsxNl0NCisgICAgICAgICAgTVVMICAgICAgICAgICByNywgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgICBAIGV4Y1tpXSAqIGEwIA0KKyAgICAgICAgICBSU0IgICAgICAgICAgIHIxNCwgcjEyLCAjMCAgICAgICAgICAgICAgICAgICAgIEAgTF90bXANCisgICAgICAgICAgTU9WICAgICAgICAgICByMTQsIHIxNCwgQVNSICMxMSAgICAgICAgICAgICAgICBAIExfdG1wID4+PSAxMQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHIxNCwgcjE0LCByNywgTFNMICMxICAgICAgICAgICAgIEAgTF90bXAgKz0gKGV4Y1tpXSAqIGEwKSA8PCAxDQorDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyNCwgIy0yXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNCwgIy00XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTJdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTRdICAgICAgICAgICAgICAgICAgQCBBcVsyXSAtLSBBcVsxXSAgICAgICAgDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNCwgIy02XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjQsICMtOF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTRdDQorICAgICAgICAgIFNNVUxCQiAgICAgICAgcjEyLCByNiwgcjExICAgICAgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0xXSAqIEFxWzFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyNCwgIy0xMF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTVdDQorCSAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTJdICogQXFbMl0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtOF0gICAgICAgICAgICAgICAgICBAIEFxWzRdIC0tIEFxWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNCwgIy0xMl0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTZdDQorDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0zXSAqIEFxWzNdDQorCSAgTERSU0ggICAgICAgICByOSwgW3I0LCAjLTE0XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktN10NCisNCisJICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktNF0gKiBBcVs0XQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0xMl0gICAgICAgICAgICAgICAgIEAgQXFbNl0gLS0gQXFbNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNCwgIy0xNl0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktOF0NCisNCisJICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktNV0gKiBBcVs1XQ0KKw0KKwkgIExEUlNIICAgICAgICAgcjYsICBbcjQsICMtMThdICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTldDQorCSAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTZdICogQXFbNl0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMTZdICAgICAgICAgICAgICAgICBAIEFxWzhdIC0tIEFxWzddDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsICBbcjQsICMtMjBdICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTEwXQ0KKw0KKwkgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS03XSAqIEFxWzddDQorDQorCSAgTERSU0ggICAgICAgICByOSwgW3I0LCAjLTIyXSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktMTFdDQorDQorCSAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19oaVtpLThdICogQXFbOF0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMjBdICAgICAgICAgICAgICAgICBAIEFxWzEwXSAtLSBBcVs5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCxbcjQsICMtMjRdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xMl0NCisNCisJICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktOV0gKiBBcVs5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjQsICMtMjZdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xM10NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTEwXSAqIEFxWzEwXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yNF0gICAgICAgICAgICAgICAgIEAgQXFbMTJdIC0tIEFxWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjQsICMtMjhdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xNF0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI5LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTExXSAqIEFxWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjQsICMtMzBdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xNV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTEyXSAqIEFxWzEyXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yOF0gICAgICAgICAgICAgICAgIEAgQXFbMTRdIC0tIEFxWzEzXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I0LCAjLTMyXSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xNl0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTEzXSAqIEFxWzEzXQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTRdICogQXFbMTRdDQorIA0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0zMl0gICAgICAgICAgICAgICAgIEAgQXFbMTZdIC0tIEFxWzE1XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTVdICogQXFbMTVdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0xNl0gKiBBcVsxNl0gICAgICAgDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjYsIHIxMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQCByMTIgPDwgMQ0KKyAgICAgICAgICBTVUIgICAgICAgICAgIHIxNCwgcjE0LCByNiAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIxNCwgcjE0LCBMU0wgIzMgICAgICAgICAgICAgICAgIEAgTF90bXAgPDw9Mw0KKyAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjcsIHIxNCwgQVNSICMxNiAgICAgICAgICAgICAgICAgQCBMX3RtcCA+PiAxNg0KKw0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIxNCwgcjE0LCBBU1IgIzQgICAgICAgICAgICAgICAgIEAgTF90bXAgPj49NA0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI3LCBbcjRdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICBAIHNpZ19oaVtpXSA9IExfdG1wID4+IDE2DQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjksIHIxNCwgcjcsIExTTCAjMTIgICAgICAgICAgICAgQCBzaWdfbG9baV0gPSBMX3RtcCAtIChzaWdfaGlbaV0gPDwgMTIpDQorDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjgsIHI4LCAjMQ0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI5LCBbcjVdLCAjMiAgIA0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHI4LCAjNjQNCisgICAgICAgICAgQkxUICAgICAgICAgICBMT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KK1N5bl9maWx0XzMyX2VuZDoNCisJCSAgICAgDQorICAgICAgICAgIExETUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0gDQorICAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgIC5FTkQNCisgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjhiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKQEAgLTAsMCArMSwxODYgQEAKK0AvKgorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorQCAqKgorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AgKioKK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQCAqKgorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQCAqLworCisKK0Aqdm9pZCBDb252b2x2ZSAoCitAKiAgICBXb3JkMTYgeFtdLCAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitAKiAgICBXb3JkMTYgaFtdLCAgICAgICAgLyogKGkpICAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovCitAKiAgICBXb3JkMTYgeVtdLCAgICAgICAgLyogKG8pICAgICA6IG91dHB1dCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCitAKiAgICBXb3JkMTYgTCAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitAKikKK0AgIHIwIC0tLSB4W10KK0AgIHIxIC0tLSBoW10KK0AgIHIyIC0tLSB5W10KK0AgIHIzIC0tLSBMCisKKwkuc2VjdGlvbiAgLnRleHQKKyAgICAgICAgLmdsb2JhbCAgIENvbnZvbHZlX2FzbSAKKworQ29udm9sdmVfYXNtOgorCisgICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCisgICAgICAgIE1PViAgICAgICAgICAgIHIzLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG4KKwlNT1YgICAgICAgICAgICByMTEsICMweDgwMDAKKyAgICAgICAgCitMT09QOiAKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxICAgICAgICAgICAgICAgIEAgdG1wSCBhZGRyZXNzCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSBuICsgMQorICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0bXBYID0geAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKyAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMQorICAgICAgICBNVUwgICAgICAgICAgICByOCwgIHI5LCByMTAgCisKK0xPT1AxOiAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgIHI1LCAjMAorICAgICAgICBCTEUgICAgICAgICAgICBMMQorCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4CisJTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0IAorCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKKyAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDEgIAorCitMMTogICAgICAgICAgICAgICAgICAKKworICAgICAgICBBREQgICAgICAgICAgICByNSwgcjExLCByOCwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI1LCByNSwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjUsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisKKworICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEgICAgICAgICAgICAgICAgQHRtcEggYWRkcmVzcworICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIKKworICAgICAgICBNVUwgICAgICAgICAgICByOCwgcjksIHIxMAorICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMyCisgICAgICAgIE1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKKyAgICAgICAgCitMT09QMjoKKyAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCisgICAgICAgIEJMRSAgICAgICAgICAgIEwyCisJTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKKwlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQgCisJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMgorCitMMjoKKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxICAKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjgsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMgorICAgICAgICBNVUwgICAgICAgICAgICByOCwgcjksIHIxMAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yCisgICAgICAgIE1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjggCisgICAgICAgIFNVQiAgICAgICAgICAgIHI1LCByNSwgIzMKKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisKK0xPT1AzOgorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDMKKwlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4IAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMyAgIAorCitMMzoKKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIFNUUkggICAgICAgICAgIHI4LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQorCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSBuICsgMQorICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEgICAgICAgICAgICAgICAgQCB0bXBIIGFkZHJlc3MKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIE1PViAgICAgICAgICAgIHI4LCAjMAorCitMT09QNDogICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDQKKwlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDQgICAgCitMNDogICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIxMSwgcjgsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByNSwgcjUsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIFNUUkggICAgICAgICAgIHI1LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgcjMsICM2NAorICAgICAgICBCTFQgICAgICAgICAgICBMT09QCisgICAgICAgICAgICAgICAgCitDb252b2x2ZV9hc21fZW5kOiAKKyAKKyAgICAgICAgTERNRkQgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KKyAgICAKKyAgICAgICAgQEVOREZVTkMKKyAgICAgICAgLkVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWI5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zCkBAIC0wLDAgKzEsMTUxIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0BzdGF0aWMgdm9pZCBjb3JfaF92ZWNfMDEyKA0KK0AJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KK0AJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCitACQlXb3JkMTYgdHJhY2ssICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitACQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitACQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorQAkJV29yZDE2IGNvcl8xW10sICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorQAkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorQCkNCitAcjAgLS0tLSBoW10NCitAcjEgLS0tLSB2ZWNbXQ0KK0ByMiAtLS0tIHRyYWNrDQorQHIzIC0tLS0gc2lnbltdDQorQHI0IC0tLS0gcnJpeGl4W11bTkJfUE9TXQ0KK0ByNSAtLS0tIGNvcl8xW10NCitAcjYgLS0tLSBjb3JfMltdDQorDQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dA0KKwkgIC5nbG9iYWwgIGNvcl9oX3ZlY18wMTJfYXNtDQorDQorY29yX2hfdmVjXzAxMl9hc206DQorDQorICAgICAgICAgU1RNRkQgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0NCisJIExEUiAgICAgICAgICAgcjQsIFtyMTMsICM0MF0gICAgICAgICAgICAgICAgICAgIEBsb2FkIHJyaXhpeFtdW05CX1BPU10NCisJIEFERCAgICAgICAgICAgcjcsIHI0LCByMiwgTFNMICM1ICAgICAgICAgICAgICAgIEByNyAtLS0gcDAgPSBycml4aXhbdHJhY2tdDQorICAgICAgICAgTU9WICAgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGk9MA0KKw0KKwkgQHIwIC0tLSBoW10sIHIxIC0tLSB2ZWNbXSwgIHIyIC0tLSBwb3MNCisJIEByMyAtLS0gc2lnbltdLCByNCAtLS0gaSwgcjcgLS0tIHAwDQorTE9PUGk6DQorICAgICAgICAgTU9WICAgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IDANCisgICAgICAgICBNT1YgICAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gMA0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHIxLCByMiwgTFNMICMxICAgICAgICAgICAgICAgIEBwMiA9ICZ2ZWNbcG9zXQ0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjEwLCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwMSA9IGgNCisgICAgICAgICBSU0IgICAgICAgICAgIHIxMSwgcjIsICM2MiAgICAgICAgICAgICAgICAgICAgICBAaj02Mi1wb3MNCisNCitMT09QajE6DQorCSBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICANCisJIExEUlNIICAgICAgICAgcjgsICBbcjldLCAjMg0KKwkgTERSU0ggICAgICAgICByMTQsIFtyOV0NCisJIFNVQlMgICAgICAgICAgcjExLCByMTEsICMxDQorICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByOCwgcjUNCisgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIA0KKwkgQkdFICAgICAgICAgICBMT09QajENCisNCisJIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAKnAxKysNCisJIE1PViAgICAgICAgICAgcjYsIHI2LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gKExfc3VtMiA8PCAyKQ0KKyAgICAgICAgIE1MQSAgICAgICAgICAgcjUsIHIxMiwgcjE0LCByNQ0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCAjMHg4MDAwDQorICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjUsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAoTF9zdW0xIDw8IDIpDQorICAgICAgICAgQUREICAgICAgICAgICByMTAsIHI2LCByMTQgICAgICAgICANCisgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0DQorICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjksIEFTUiAjMTYNCisgICAgICAgICBNT1YgICAgICAgICAgIHI2LCByMTAsIEFTUiAjMTYNCisgICAgICAgICBBREQgICAgICAgICAgIHI5LCByMywgcjIsIExTTCAjMSAgICAgICAgICAgICAgICAgQGFkZHJlc3Mgb2Ygc2lnbltwb3NdDQorICAgICAgICAgQUREICAgICAgICAgICByOCwgcjcsICMzMg0KKyAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjldLCAjMiAgICAgICAgICAgICAgICAgCSAgQHNpZ25bcG9zXQ0KKwkgTERSU0ggICAgICAgICByMTEsIFtyOV0gICAgICAgICAgICAgICAgICAgICAgICAgIEBzaWduW3BvcyArIDFdDQorCSBNVUwgICAgICAgICAgIHIxMiwgcjUsIHIxMA0KKwkgTVVMICAgICAgICAgICByMTQsIHI2LCByMTENCisJIE1PViAgICAgICAgICAgcjUsIHIxMiwgQVNSICMxNQ0KKwkgTU9WICAgICAgICAgICByNiwgcjE0LCBBU1IgIzE1DQorCSBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICANCisJIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdDQorICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKw0KKwkgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKw0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI5LCByNCwgTFNMICMxDQorCSBBREQgICAgICAgICAgIHIxMiwgcjEyLCByNCwgTFNMICMxDQorCSBBREQgICAgICAgICAgIHI1LCByNSwgcjEwDQorCSBBREQgICAgICAgICAgIHI2LCByNiwgcjExDQorCSBTVFJIICAgICAgICAgIHI1LCBbcjldDQorCSBTVFJIICAgICAgICAgIHI2LCBbcjEyXQ0KKw0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjIsIHIyLCAjNA0KKyANCisgICAgICAgICBNT1YgICAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gMA0KKwkgTU9WICAgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMiA9IDANCisJIEFERCAgICAgICAgICAgcjksIHIxLCByMiwgTFNMICMxICAgICAgICAgICAgICAgIEBwMiA9ICZ2ZWNbcG9zXQ0KKwkgTU9WICAgICAgICAgICByMTAsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgQHAxID0gaA0KKwkgUlNCICAgICAgICAgICByMTEsIHIyLCAjNjIgICAgICAgICAgICAgICAgICAgICAgQGo9NjItcG9zDQorCSBBREQgICAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgICAgICBAaSsrDQorDQorTE9PUGoyOg0KKwkgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgDQorCSBMRFJTSCAgICAgICAgIHI4LCAgW3I5XSwgIzINCisJIExEUlNIICAgICAgICAgcjE0LCBbcjldDQorCSBTVUJTICAgICAgICAgIHIxMSwgcjExLCAjMQ0KKyAgICAgICAgIE1MQSAgICAgICAgICAgcjUsIHIxMiwgcjgsIHI1DQorICAgICAgICAgTUxBICAgICAgICAgICByNiwgcjEyLCByMTQsIHI2CSANCisJIEJHRSAgICAgICAgICAgTE9PUGoyDQorDQorCSBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICAgICAgICAgICAgICAgICAgICAgQCpwMSsrDQorCSBNT1YgICAgICAgICAgIHI2LCByNiwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMiA9IChMX3N1bTIgPDwgMikNCisgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHIxNCwgcjUNCisgICAgICAgICBNT1YgICAgICAgICAgIHIxNCwgIzB4ODAwMA0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gKExfc3VtMSA8PCAyKQ0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICANCisgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0DQorDQorICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjksIEFTUiAjMTYNCisgICAgICAgICBNT1YgICAgICAgICAgIHI2LCByMTAsIEFTUiAjMTYNCisgICAgICAgICBBREQgICAgICAgICAgIHI5LCByMywgcjIsIExTTCAjMSAgICAgICAgICAgICAgICAgQGFkZHJlc3Mgb2Ygc2lnbltwb3NdDQorICAgICAgICAgQUREICAgICAgICAgICByOCwgcjcsICMzMg0KKyAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjldLCAjMiAgICAgICAgICAgICAgICAgCSAgQHNpZ25bcG9zXQ0KKwkgTERSU0ggICAgICAgICByMTEsIFtyOV0gICAgICAgICAgICAgICAgICAgICAgICAgIEBzaWduW3BvcyArIDFdDQorCSBNVUwgICAgICAgICAgIHIxMiwgcjUsIHIxMA0KKwkgTVVMICAgICAgICAgICByMTQsIHI2LCByMTENCisJIE1PViAgICAgICAgICAgcjUsIHIxMiwgQVNSICMxNQ0KKwkgTU9WICAgICAgICAgICByNiwgcjE0LCBBU1IgIzE1DQorCSBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICANCisJIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdDQorICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKw0KKwkgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKw0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI5LCByNCwgTFNMICMxDQorCSBBREQgICAgICAgICAgIHIxMiwgcjEyLCByNCwgTFNMICMxDQorCSBBREQgICAgICAgICAgIHI1LCByNSwgcjEwDQorCSBBREQgICAgICAgICAgIHI2LCByNiwgcjExDQorCSBTVFJIICAgICAgICAgIHI1LCBbcjldDQorCSBTVFJIICAgICAgICAgIHI2LCBbcjEyXQ0KKwkgQUREICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgICAgICAgIEBpKzENCisJIEFERCAgICAgICAgICAgcjIsIHIyLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICBAcG9zICs9IFNURVANCisJIENNUCAgICAgICAgICAgcjQsICMxNg0KKwkgDQorCSBCTFQgICAgICAgICAgIExPT1BpDQorICAgICAgICAgDQordGhlX2VuZDoNCisgICAgICAgICBMRE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQ0KKyAgICAgIA0KKyAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgLkVORAkgDQorICAgICAgICANCisJDQorCSAgDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWRkOGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKQEAgLTAsMCArMSw0NjAgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0B2b2lkIFByZWRfbHQ0KA0KK0AJCSAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovDQorQAkJICBXb3JkMTYgVDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaW50ZWdlciBwaXRjaCBsYWcgKi8NCitACQkgIFdvcmQxNiBmcmFjLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBvZiBsYWcgICAqLw0KK0AJCSAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHN1YmZyYW1lIHNpemUgICAgICovDQorQAkgICAgICApDQorDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgICAgICAgQVJNIFJlZ2lzdGVyDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgcjAgIC0tLSAgZXhjW10NCitAIHIxICAtLS0gIFQwDQorQCByMiAgLS0tICBmcmFjDQorQCByMyAgLS0tICBMX3N1YmZyDQorDQorICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorCSAuZ2xvYmFsICAgcHJlZF9sdDRfYXNtDQorCSAuZXh0ZXJuICAgaW50ZXI0XzINCisNCitwcmVkX2x0NF9hc206DQorDQorICAgICAgICAgU1RNRkQgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisgICAgICAgICBSU0IgICAgICAgcjQsIHIxLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICBALVQwDQorICAgICAgICAgUlNCICAgICAgIHIyLCByMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgQGZyYWMgPSAtZnJhYw0KKyAgICAgICAgIEFERCAgICAgICByNSwgcjAsIHI0LCBMU0wgIzEgICAgICAgICAgICAgICAgIEB4ID0gZXhjIC0gVDANCisgICAgICAgICBDTVAgICAgICAgcjIsICMwDQorICAgICAgICAgQURETFQgICAgIHIyLCByMiwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgQGZyYWMgKz0gVVBfU0FNUA0KKyAgICAgICAgIFNVQkxUICAgICByNSwgcjUsICMyICAgICAgICAgICAgICAgICAgICAgICAgIEB4LS0NCisgICAgICAgICBTVUIgICAgICAgcjUsIHI1LCAjMzAgICAgICAgICAgICAgICAgICAgICAgICBAeCAtPSAxNQ0KKyAgICAgICAgIFJTQiAgICAgICByNCwgcjIsICMzICAgICAgICAgICAgICAgICAgICAgICAgIEBrID0gMyAtIGZyYWMNCisgICAgICAgICBMRFIgICAgICAgcjYsIFRhYmxlDQorCSBNT1YgICAgICAgcjgsIHI0LCBMU0wgIzYgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIEBNT1YgICAgICAgcjcsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaiA9IDANCisgICAgICAgICBBREQgICAgICAgcjgsIHI2LCByOCAgICAgICAgICAgICAgICAgICAgICAgICBAcHRyMiA9ICYoaW50ZXI0XzJba11bMF0pDQorDQorCSBNT1YgICAgICAgcjEsIHI1DQorCSBNT1YgICAgICAgcjUsICMweDgwMDANCisJIE1PViAgICAgICByMTQsICMyMQ0KK0AgdXNlZCByZWdpc3Rlcg0KKyAgICAgICAgIEByMCAtLS0gZXhjW10gIHIxIC0tLSB4ICByNyAtLS0gaiAgcjggLS0tIHB0cjIgIHI1IC0tLSAweDgwMDANCitUSFJFRV9MT09QOg0KKw0KKyAgICAgICAgIEBNT1YgICAgICAgcjEsIHI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcHRyMSA9IHgNCisJIE1PViAgICAgICByMiwgcjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwdHIgPSBwdHIyDQorICAgICAgICAgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMF0sIGhbMV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzBdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMl0NCisNCisJIFNNVUxCQiAgICByMTAsIHI0LCByMyAgICAgICAgICAgICAgICAgICAgICAgIEB4WzBdICogaFswXSAgICAgICAgICAgICAgICAgIA0KKwkgU01VTEJCICAgIHIxMSwgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMV0gKiBoWzBdDQorCSBTTVVMQkIgICAgcjEyLCByOSwgcjMgICAgICAgICAgICAgICAgICAgICAgICBAeFsyXSAqIGhbMF0NCisNCisgICAgICAgICBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFszXQ0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMV0gKiBoWzFdDQorICAgICAgICAgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMl0gKiBoWzFdDQorCSBTTUxBQlQgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFszXSAqIGhbMV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzJdLCBoWzNdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs0XQ0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMl0gKiBoWzJdDQorICAgICAgICAgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbM10gKiBoWzJdDQorICAgICAgICAgU01MQUJCICAgIHIxMiwgcjYsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbNF0gKiBoWzJdDQorDQorICAgICAgICAgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbNV0NCisgICAgICAgICBTTUxBQlQgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszXSAqIGhbM10NCisgICAgICAgICBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs0XSAqIGhbM10NCisgICAgICAgICBTTUxBQlQgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFs1XSAqIGhbM10NCisNCisgICAgICAgICBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFs0XSwgaFs1XQ0KKyAgICAgICAgIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzZdDQorICAgICAgICAgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbNF0gKiBoWzRdDQorICAgICAgICAgU01MQUJCICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbNV0gKiBoWzRdDQorICAgICAgICAgU01MQUJCICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbNl0gKiBoWzRdDQorDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs3XQ0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbNV0gKiBoWzVdDQorCSBTTUxBQlQgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs2XSAqIGhbNV0NCisJIFNNTEFCVCAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzddICogaFs1XQ0KKw0KKyAgICAgICAgIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzZdLCBoWzddDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs4XQ0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbNl0gKiBoWzZdDQorCSBTTUxBQkIgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs3XSAqIGhbNl0NCisJIFNNTEFCQiAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzhdICogaFs2XQ0KKw0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbOV0NCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzddICogaFs3XQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbOF0gKiBoWzddDQorCSBTTUxBQlQgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFs5XSAqIGhbN10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzhdLCBoWzldDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxMF0NCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzhdICogaFs4XQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbOV0gKiBoWzhdDQorCSBTTUxBQkIgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxMF0gKiBoWzhdDQorDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxMV0NCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzldICogaFs5XQ0KKwkgU01MQUJUICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTBdICogaFs5XQ0KKwkgU01MQUJUICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMTFdICogaFs5XQ0KKw0KKyAgICAgICAgIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzEwXSwgaFsxMV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEyXQ0KKyAgICAgICAgIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzEwXSAqIGhbMTBdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxMV0gKiBoWzEwXQ0KKwkgU01MQUJCICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMTJdICogaFsxMF0NCisNCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEzXQ0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTFdICogaFsxMV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzEyXSAqIGhbMTFdDQorCSBTTUxBQlQgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxM10gKiBoWzExXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTJdLCBoWzEzXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTRdDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxMl0gKiBoWzEyXQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTNdICogaFsxMl0NCisJIFNNTEFCQiAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzE0XSAqIGhbMTJdDQorDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxNV0NCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzEzXSAqIGhbMTNdDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxNF0gKiBoWzEzXQ0KKwkgU01MQUJUICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMTVdICogaFsxM10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzE0XSwgaFsxNV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE2XQ0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTRdICogaFsxNF0NCisJIFNNTEFCQiAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE1XSAqIGhbMTRdDQorCSBTTUxBQkIgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxNl0gKiBoWzE0XQ0KKw0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTddDQorICAgICAgICAgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTVdICogaFsxNV0NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE2XSAqIGhbMTVdDQorCSBTTUxBQlQgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxN10gKiBoWzE1XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTZdLCBoWzE3XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMThdDQorCSBTTUxBQkIgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxNl0gKiBoWzE2XQ0KKwkgU01MQUJCICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTddICogaFsxNl0NCisJIFNNTEFCQiAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzE4XSAqIGhbMTZdDQorDQorICAgICAgICAgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTldDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxN10gKiBoWzE3XQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMThdICogaFsxN10NCisJIFNNTEFCVCAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzE5XSAqIGhbMTddDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxOF0sIGhbMTldDQorICAgICAgICAgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjBdDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxOF0gKiBoWzE4XQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTldICogaFsxOF0NCisJIFNNTEFCQiAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzIwXSAqIGhbMThdDQorDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyMV0NCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE5XSAqIGhbMTldDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyMF0gKiBoWzE5XQ0KKwkgU01MQUJUICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjFdICogaFsxOV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzIwXSwgaFsyMV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzIyXQ0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjBdICogaFsyMF0NCisJIFNNTEFCQiAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzIxXSAqIGhbMjBdDQorCSBTTUxBQkIgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyMl0gKiBoWzIwXQ0KKw0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjNdDQorCSBTTUxBQlQgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyMV0gKiBoWzIxXQ0KKwkgU01MQUJUICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjJdICogaFsyMV0NCisJIFNNTEFCVCAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzIzXSAqIGhbMjFdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyMl0sIGhbMjNdDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyNF0NCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIyXSAqIGhbMjJdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyM10gKiBoWzIyXQ0KKwkgU01MQUJCICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjRdICogaFsyMl0NCisNCisgICAgICAgICBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyNV0NCisJIFNNTEFCVCAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIzXSAqIGhbMjNdDQorCSBTTUxBQlQgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyNF0gKiBoWzIzXQ0KKwkgU01MQUJUICAgIHIxMiwgcjYsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjVdICogaFsyM10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzI0XSwgaFsyNV0NCisgICAgICAgICBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyNl0NCisJIFNNTEFCQiAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI0XSAqIGhbMjRdDQorCSBTTUxBQkIgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyNV0gKiBoWzI0XQ0KKwkgU01MQUJCICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjZdICogaFsyNF0NCisNCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI3XQ0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjVdICogaFsyNV0NCisJIFNNTEFCVCAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI2XSAqIGhbMjVdDQorCSBTTUxBQlQgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyN10gKiBoWzI1XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjZdLCBoWzI3XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjhdDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyNl0gKiBoWzI2XQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjddICogaFsyNl0NCisJIFNNTEFCQiAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzI4XSAqIGhbMjZdDQorDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyOV0NCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI3XSAqIGhbMjddDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyOF0gKiBoWzI3XQ0KKwkgU01MQUJUICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjldICogaFsyN10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzI4XSwgaFsyOV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMwXQ0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjhdICogaFsyOF0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI5XSAqIGhbMjhdDQorCSBTTUxBQkIgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFszMF0gKiBoWzI4XQ0KKw0KKyAgICAgICAgIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMxXQ0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjldICogaFsyOV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzMwXSAqIGhbMjldDQorCSBTTUxBQlQgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFszMV0gKiBoWzI5XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMzBdLCBoWzMxXQ0KKyAgICAgICAgIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMyXQ0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMzBdICogaFszMF0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzMxXSAqIGhbMzBdDQorCSBTTUxBQkIgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFszMl0gKiBoWzMwXQ0KKw0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjLTYwICAgICAgICAgICAgICAgICAgICAgQHhbMzNdDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszMV0gKiBoWzMxXQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzJdICogaFszMV0NCisJIFNNTEFCVCAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzMzXSAqIGhbMzFdDQorDQorCSBAU1NBVCAgICAgIHIxMCwgIzMyLCByMTAsIExTTCAjMg0KKwkgQFNTQVQgICAgICByMTEsICMzMiwgcjExLCBMU0wgIzINCisJIEBTU0FUICAgICAgcjEyLCAjMzIsIHIxMiwgTFNMICMyDQorDQorCSBNT1YgICAgICAgcjEwLCByMTAsIExTTCAjMQ0KKwkgTU9WICAgICAgIHIxMSwgcjExLCBMU0wgIzENCisJIE1PViAgICAgICByMTIsIHIxMiwgTFNMICMxDQorDQorCSBRQUREICAgICAgcjEwLCByMTAsIHIxMA0KKwkgUUFERCAgICAgIHIxMSwgcjExLCByMTENCisJIFFBREQgICAgICByMTIsIHIxMiwgcjEyDQorDQorCSBRQUREICAgICAgcjEwLCByMTAsIHI1DQorCSBRQUREICAgICAgcjExLCByMTEsIHI1DQorCSBRQUREICAgICAgcjEyLCByMTIsIHI1DQorDQorCSBTVUJTICAgICAgcjE0LCByMTQsICMxDQorDQorCSBNT1YgICAgICAgcjEwLCByMTAsIEFTUiAjMTYNCisJIE1PViAgICAgICByMTEsIHIxMSwgQVNSICMxNg0KKwkgTU9WICAgICAgIHIxMiwgcjEyLCBBU1IgIzE2DQorDQorCSBTVFJIICAgICAgcjEwLCBbcjBdLCAjMg0KKwkgU1RSSCAgICAgIHIxMSwgW3IwXSwgIzINCisJIFNUUkggICAgICByMTIsIFtyMF0sICMyDQorCSBCTkUgICAgICAgVEhSRUVfTE9PUA0KKw0KKwkgTU9WICAgICAgIHIyLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHB0ciA9IHB0cjINCisNCitMYXN0MkxPT1A6DQorDQorICAgICAgICAgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMF0sIGhbMV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzBdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMl0NCisNCisJIFNNVUxCQiAgICByMTAsIHI0LCByMyAgICAgICAgICAgICAgICAgICAgICAgIEB4WzBdICogaFswXQ0KKwkgU01VTEJCICAgIHIxMSwgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMV0gKiBoWzBdDQorDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxXSAqIGhbMV0NCisJIFNNTEFCVCAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzJdICogaFsxXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMl0sIGhbM10NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzNdDQorICAgICAgICAgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbNF0NCisNCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzJdICogaFsyXQ0KKyAgICAgICAgIFNNTEFCQiAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzNdICogaFsyXQ0KKyAgICAgIA0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbM10gKiBoWzNdDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs0XSAqIGhbM10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzRdLCBoWzVdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs1XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbNl0NCisNCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzRdICogaFs0XQ0KKwkgU01MQUJCICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbNV0gKiBoWzRdDQorDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs1XSAqIGhbNV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzZdICogaFs1XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbNl0sIGhbN10NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzddDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs4XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbNl0gKiBoWzZdDQorCSBTTUxBQkIgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs3XSAqIGhbNl0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzddICogaFs3XQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbOF0gKiBoWzddDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFs4XSwgaFs5XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbOV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEwXQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbOF0gKiBoWzhdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs5XSAqIGhbOF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzldICogaFs5XQ0KKwkgU01MQUJUICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTBdICogaFs5XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTBdLCBoWzExXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTFdDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxMl0NCisNCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzEwXSAqIGhbMTBdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxMV0gKiBoWzEwXQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTFdICogaFsxMV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzEyXSAqIGhbMTFdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxMl0sIGhbMTNdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxM10NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE0XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTJdICogaFsxMl0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzEzXSAqIGhbMTJdDQorDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxM10gKiBoWzEzXQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTRdICogaFsxM10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzE0XSwgaFsxNV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE1XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTZdDQorDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxNF0gKiBoWzE0XQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTVdICogaFsxNF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE1XSAqIGhbMTVdDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxNl0gKiBoWzE1XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTZdLCBoWzE3XQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTddDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxOF0NCisNCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE2XSAqIGhbMTZdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxN10gKiBoWzE2XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTddICogaFsxN10NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE4XSAqIGhbMTddDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxOF0sIGhbMTldDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxOV0NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzIwXQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMThdICogaFsxOF0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE5XSAqIGhbMThdDQorDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxOV0gKiBoWzE5XQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjBdICogaFsxOV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzIwXSwgaFsyMV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzIxXQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjJdDQorDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyMF0gKiBoWzIwXQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjFdICogaFsyMF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIxXSAqIGhbMjFdDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyMl0gKiBoWzIxXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjJdLCBoWzIzXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjNdDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyNF0NCisNCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIyXSAqIGhbMjJdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyM10gKiBoWzIyXQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjNdICogaFsyM10NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI0XSAqIGhbMjNdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyNF0sIGhbMjVdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyNV0NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI2XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjRdICogaFsyNF0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI1XSAqIGhbMjRdDQorDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyNV0gKiBoWzI1XQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjZdICogaFsyNV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzI2XSwgaFsyN10NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI3XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjhdDQorDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyNl0gKiBoWzI2XQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjddICogaFsyNl0NCisNCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI3XSAqIGhbMjddDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyOF0gKiBoWzI3XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjhdLCBoWzI5XQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjldDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFszMF0NCisNCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI4XSAqIGhbMjhdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyOV0gKiBoWzI4XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjldICogaFsyOV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzMwXSAqIGhbMjldDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFszMF0sIGhbMzFdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFszMV0NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMyXQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMzBdICogaFszMF0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzMxXSAqIGhbMzBdDQorDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszMV0gKiBoWzMxXQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzJdICogaFszMV0NCisNCisJIEBTU0FUICAgICAgcjEwLCAjMzIsIHIxMCwgTFNMICMyDQorCSBAU1NBVCAgICAgIHIxMSwgIzMyLCByMTEsIExTTCAjMg0KKwkgTU9WICAgICAgIHIxMCwgcjEwLCBMU0wgIzENCisJIE1PViAgICAgICByMTEsIHIxMSwgTFNMICMxDQorDQorCSBRQUREICAgICAgcjEwLCByMTAsIHIxMA0KKwkgUUFERCAgICAgIHIxMSwgcjExLCByMTEgDQorDQorCSBRQUREICAgICAgcjEwLCByMTAsIHI1DQorCSBRQUREICAgICAgcjExLCByMTEsIHI1DQorDQorCSBNT1YgICAgICAgcjEwLCByMTAsIEFTUiAjMTYNCisJIE1PViAgICAgICByMTEsIHIxMSwgQVNSICMxNg0KKw0KKwkgU1RSSCAgICAgIHIxMCwgW3IwXSwgIzINCisJIFNUUkggICAgICByMTEsIFtyMF0sICMyDQorDQorDQorcHJlZF9sdDRfZW5kOg0KKyAgICAgICAgIExETUZEICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0NCisNCitUYWJsZToNCisgICAgICAgICAud29yZCAgICAgICBpbnRlcjRfMg0KKwkgQEVOREZVTkMNCisJIC5FTkQNCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGQ5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpAQCAtMCwwICsxLDIyOCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgUmVzaWR1KA0KK0AJICAgIFdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovDQorQAkgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3BlZWNoICh2YWx1ZXMgeFstbS4uLTFdIGFyZSBuZWVkZWQgKi8NCitACSAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSB4MiAgOiByZXNpZHVhbCBzaWduYWwgICAgICAgKi8NCitACSAgICBXb3JkMTYgbGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgKi8NCitACSAgICkNCitAYVtdIC0tLSByMA0KK0B4W10gLS0tIHIxDQorQHlbXSAtLS0gcjINCitAbGcgIC0tLSByMw0KKw0KKyAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorCS5nbG9iYWwgICBSZXNpZHVfb3B0DQorDQorUmVzaWR1X29wdDoNCisNCisgICAgICAgIFNUTUZEICAgcjEzISwge3I0IC0gcjEyLCByMTR9DQorDQorICAgICAgICBMRFJIICAgIHI1LCBbcjBdLCAjMg0KKyAgICAgICAgTERSSCAgICByNiwgW3IwXSwgIzINCisgICAgICAgIE9SUiAgICAgcjUsIHI2LCByNSwgTFNMICMxNiAgICAgICAgICAgICAgICAgIEByNSAtLS0gYTAsIGExCQ0KKw0KKyAgICAgICAgTERSSCAgICByNiwgW3IwXSwgIzINCisJTERSSCAgICByNywgW3IwXSwgIzINCisJT1JSICAgICByNiwgcjcsIHI2LCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgQHI2IC0tLSBhMiwgYTMNCisJDQorICAgICAgICBMRFJIICAgIHI3LCBbcjBdLCAjMg0KKwlMRFJIICAgIHI4LCBbcjBdLCAjMg0KKwlPUlIgICAgIHI3LCByOCwgcjcsIExTTCAjMTYgICAgICAgICAgICAgICAgICBAcjcgLS0tIGE0LCBhNQ0KKw0KKwlMRFJIICAgIHI4LCBbcjBdLCAjMg0KKwlMRFJIICAgIHI5LCBbcjBdLCAjMg0KKwlPUlIgICAgIHI4LCByOSwgcjgsIExTTCAjMTYgICAgICAgICAgICAgICAgICBAcjggLS0tIGE2LCBhNw0KKw0KKwlMRFJIICAgIHI5LCBbcjBdLCAjMg0KKwlMRFJIICAgIHIxMCwgW3IwXSwgIzINCisJT1JSICAgICByOSwgcjEwLCByOSwgTFNMICMxNiAgICAgICAgICAgICAgICAgQHI5IC0tLSBhOCwgYTkNCisNCisJTERSSCAgICByMTAsIFtyMF0sICMyDQorCUxEUkggICAgcjExLCBbcjBdLCAjMg0KKwlPUlIgICAgIHIxMCwgcjExLCByMTAsIExTTCAjMTYgICAgICAgICAgICAgICBAcjEwIC0tLSBhMTAsIGExMQ0KKw0KKyAgICAgICAgTERSSCAgICByMTEsIFtyMF0sICMyDQorCUxEUkggICAgcjEyLCBbcjBdLCAjMg0KKwlPUlIgICAgIHIxMSwgcjEyLCByMTEsIExTTCAjMTYgICAgICAgICAgICAgICBAcjExIC0tLSBhMTIsIGExMw0KKwkNCisJTERSSCAgICByMTIsIFtyMF0sICMyDQorCUxEUkggICAgcjQsIFtyMF0sICMyDQorCU9SUiAgICAgcjEyLCByNCwgcjEyLCBMU0wgIzE2ICAgICAgICAgICAgICAgIEByMTIgLS0tIGExNCwgYTE1DQorCQ0KKw0KKwlTVE1GRCAgIHIxMyEsIHtyOCAtIHIxMn0gICAgICAgICAgICAgICAgICAgICBAc3RvcmUgcjgtcjEyIA0KKwlMRFJIICAgIHI0LCBbcjBdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICBAbG9hZCBhMTYNCisgICAgICAgIE1PViAgICAgcjE0LCByMywgQVNSICMyICAgICAgICAgICAgICAgICAgICAgIEBvbmUgbG9vcCBnZXQgNCBvdXRwdXRzDQorCUFERCAgICAgcjEsIHIxLCAjNA0KKwlNT1YgICAgIHIwLCByMg0KKwlPUlIgICAgIHIxNCwgcjQsIHIxNCwgTFNMICMxNiAgICAgICAgICAgICAgICBAcjE0IC0tLSBsb29wbnVtLCBhMTYNCisNCityZXNpZHVfbG9vcDoNCisNCisgICAgICAgIExEUiAgICAgcjEwLCBbcjFdLCAjLTQgICAgICAgICAgICAgICAgICAgICAgIEByMTAgIC0tLSB4WzNdLCB4WzJdDQorCUxEUiAgICAgcjIsICBbcjFdLCAjLTQgICAgICAgICAgICAgICAgICAgICAgIEByMiAgIC0tLSB4WzFdLCB4WzBdDQorDQorCVNNVUxUQiAgcjMsIHI1LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpMSgwKSAgLS0tIHIzID0geFswXSAqIGEwDQorICAgICAgICBTTVVMVFQgIHI0LCByNSwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICBAaTIoMCkgIC0tLSByNCA9IHhbMV0gKiBhMAkNCisJU01VTFRCICByMTEsIHI1LCByMTAgICAgICAgICAgICAgICAgICAgICAgICAgQGkzKDApICAtLS0gcjExID0geFsyXSAqIGEwDQorCVNNVUxUVCAgcjEyLCByNSwgcjEwICAgICAgICAgICAgICAgICAgICAgICAgIEBpNCgwKSAgLS0tIHIxMiA9IHhbM10gKiBhMA0KKw0KKyAgICAgICAgU01MQUJCICByNCwgcjUsIHIyLCByNCAgICAgICAgICAgICAgICAgICAgICAgQGkyKDEpICAtLS0gcjQgKz0geFswXSAqIGExDQorICAgICAgICBTTUxBQlQgIHIxMSwgcjUsIHIyLCByMTEgICAgICAgICAgICAgICAgICAgICBAaTMoMSkgIC0tLSByMTEgKz0geFsxXSAqIGEwDQorICAgICAgICBTTUxBQkIgIHIxMiwgcjUsIHIxMCwgcjEyICAgICAgICAgICAgICAgICAgICBAaTQoMSkgIC0tLSByMTIgKz0geFsyXSAqIGExDQorDQorCVNNTEFUQiAgcjExLCByNiwgcjIsIHIxMSAgICAgICAgICAgICAgICAgICAgIEBpMygyKSAgLS0tIHIxMSArPSB4WzBdICogYTINCisJU01MQVRUICByMTIsIHI2LCByMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQGk0KDIpICAtLS0gcjEyICs9IHhbMV0gKiBhMg0KKwlTTUxBQkIgIHIxMiwgcjYsIHIyLCByMTIgICAgICAgICAgICAgICAgICAgICBAaTQoMykgIC0tLSByMTIgKz0geFswXSAqIGEzICAgICAgICAgICAgICAgICANCisJDQorCUxEUiAgICAgcjIsIFtyMV0sICMtNCAgICAgICAgICAgICAgICAgICAgICAgIEByMiAtLS0tIHhbLTFdLCB4Wy0yXQ0KKw0KKwlTTUxBQlQgIHIzLCByNSwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICBAaTEoMSkgLS0tIHIzICs9IHhbLTFdICogYTENCisJU01MQVRUICByNCwgcjYsIHIyLCByNCAgICAgICAgICAgICAgICAgICAgICAgQGkyKDIpIC0tLSByNCArPSB4Wy0xXSAqIGEyDQorCVNNTEFCVCAgcjExLCByNiwgcjIsIHIxMSAgICAgICAgICAgICAgICAgICAgIEBpMygzKSAtLS0gcjExICs9IHhbLTFdICogYTMNCisJU01MQVRUICByMTIsIHI3LCByMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQGk0KDQpIC0tLSByMTIgKz0geFstMV0gKiBhNA0KKyAgICAgICAgU01MQVRCICByMywgcjYsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgQGkxKDIpIC0tLSByMyArPSB4Wy0yXSAqIGEyCQ0KKw0KKwlTTUxBQkIJcjQsIHI2LCByMiwgcjQJCQkJQCBpMgkoMykNCisJU01MQVRCICByMTEscjcsIHIyLCByMTEJCQkJQCBpMwkoNCkNCisJU01MQUJCCXIxMixyNywgcjIsIHIxMgkJCQlAIGk0CSg1KQ0KKwkNCisJTERSCXIyLFtyMV0sIy00DQorCVNNTEFCVAlyMywgcjYsIHIyLCByMwkJCQlAIGkxCSgzKQ0KKwlTTUxBVFQJcjQsIHI3LCByMiwgcjQJCQkJQCBpMgkoNCkNCisJU01MQUJUCXIxMSxyNywgcjIsIHIxMQkJCQlAIGkzCSg1KQ0KKwlTTUxBVFQJcjEyLHI4LCByMiwgcjEyCQkJCUAgaTQJKDYpDQorCVNNTEFUQglyMywgcjcsIHIyLCByMwkJCQlAIGkxCSg0KQ0KKwlTTUxBQkIJcjQsIHI3LCByMiwgcjQJCQkJQCBpMgkoNSkNCisJU01MQVRCCXIxMSxyOCwgcjIsIHIxMQkJCQlAIGkzCSg2KQ0KKwlTTUxBQkIJcjEyLHI4LCByMiwgcjEyCQkJCUAgaTQJKDcpDQorCQkNCisJTERSCXIyLFtyMV0sIy00DQorCVNNTEFCVAlyMywgcjcsIHIyLCByMwkJCQlAIGkxCSg1KQ0KKwlTTUxBVFQJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoNikNCisJU01MQUJUCXIxMSxyOCwgcjIsIHIxMQkJCQlAIGkzCSg3KQ0KKwlTTUxBVFQJcjEyLHI5LCByMiwgcjEyCQkJCUAgaTQJKDgpDQorCVNNTEFUQglyMywgcjgsIHIyLCByMwkJCQlAIGkxCSg2KQ0KKwlTTUxBQkIJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoNykNCisJU01MQVRCCXIxMSxyOSwgcjIsIHIxMQkJCQlAIGkzCSg4KQ0KKwlTTUxBQkIJcjEyLHI5LCByMiwgcjEyCQkJCUAgaTQJKDkpDQorCUxEUglyMTAsIFtyMTMsICM4XQkJCQlAIFsgYTEwIHwgYTExXQ0KKwkNCisJTERSCXIyLFtyMV0sIy00DQorCVNNTEFCVAlyMywgcjgsIHIyLCByMwkJCQlAIGkxCSg3KQ0KKwlTTUxBVFQJcjQsIHI5LCByMiwgcjQJCQkJQCBpMgkoOCkNCisJU01MQUJUCXIxMSxyOSwgcjIsIHIxMQkJCQlAIGkzCSg5KQ0KKwlTTUxBVFQJcjEyLHIxMCwgcjIsIHIxMgkJCUAgaTQJKDEwKQ0KKwlTTUxBVEIJcjMsIHI5LCByMiwgcjMJCQkJQCBpMQkoOCkNCisJU01MQUJCCXI0LCByOSwgcjIsIHI0CQkJCUAgaTIJKDkpDQorCVNNTEFUQglyMTEscjEwLCByMiwgcjExCQkJQCBpMwkoMTApDQorCVNNTEFCQglyMTIscjEwLCByMiwgcjEyCQkJQCBpNAkoMTEpDQorCUxEUglyOCwgW3IxMywgIzEyXQkJCQlAIFsgYTEyIHwgYTEzIF0NCisJCQ0KKwlMRFIJcjIsW3IxXSwjLTQNCisJU01MQUJUCXIzLCByOSwgcjIsIHIzCQkJCUAgaTEJKDkpDQorCVNNTEFUVAlyNCwgcjEwLCByMiwgcjQJCQkJQCBpMgkoMTApDQorCVNNTEFCVAlyMTEscjEwLCByMiwgcjExCQkJQCBpMwkoMTEpDQorCVNNTEFUVAlyMTIscjgsIHIyLCByMTIJCQkJQCBpNAkoMTIpDQorCVNNTEFUQglyMywgcjEwLCByMiwgcjMJCQkJQCBpMQkoMTApDQorCVNNTEFCQglyNCwgcjEwLCByMiwgcjQJCQkJQCBpMgkoMTEpDQorCVNNTEFUQglyMTEscjgsIHIyLCByMTEJCQkJQCBpMwkoMTIpDQorCVNNTEFCQglyMTIscjgsIHIyLCByMTIJCQkJQCBpNAkoMTMpDQorCUxEUglyOSwgW3IxMywgIzE2XQkJCQlAIFsgYTE0IHwgYTE1IF0NCisJDQorCUxEUglyMixbcjFdLCMtNA0KKwlTTUxBQlQJcjMsIHIxMCwgcjIsIHIzCQkJCUAgaTEJKDExKQ0KKwlTTUxBVFQJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoMTIpDQorCVNNTEFCVAlyMTEscjgsIHIyLCByMTEJCQkJQCBpMwkoMTMpDQorCVNNTEFUVAlyMTIscjksIHIyLCByMTIJCQkJQCBpNAkoMTQpDQorCVNNTEFUQglyMywgcjgsIHIyLCByMwkJCQlAIGkxCSgxMikNCisJU01MQUJCCXI0LCByOCwgcjIsIHI0CQkJCUAgaTIJKDEzKQ0KKwlTTUxBVEIJcjExLHI5LCByMiwgcjExCQkJCUAgaTMJKDE0KQ0KKwlTTUxBQkIJcjEyLHI5LCByMiwgcjEyCQkJCUAgaTQJKDE1KQ0KKwkNCisNCisJTERSCXIyLFtyMV0sIy00DQorCVNNTEFCVAlyMywgcjgsIHIyLCByMwkJCQlAIGkxCSgxMykNCisJU01MQVRUCXI0LCByOSwgcjIsIHI0CQkJCUAgaTIJKDE0KQ0KKwlTTUxBQlQJcjExLHI5LCByMiwgcjExCQkJCUAgaTMJKDE1KQ0KKwlTTUxBQlQJcjEyLHIxNCwgcjIsIHIxMgkJCUAgaTQJKDE2KQ0KKwlTTUxBVEIJcjMsIHI5LCByMiwgcjMJCQkJQCBpMQkoMTQpDQorCVNNTEFCQglyNCwgcjksIHIyLCByNAkJCQlAIGkyCSgxNSkNCisJU01MQUJCCXIxMSxyMTQsIHIyLCByMTEJCQlAIGkzCSgxNikNCisJTERSCQlyOCwgW3IxM10JCQkJCUAgWyBhNiB8IGE3IF0NCisJCQkNCisgICAgICAgIExEUiAgICAgcjIsW3IxXSwjNDQgICAgICAgICAJCUAgQ2hhbmdlDQorCVNNTEFCVAlyMywgcjksIHIyLCByMw0KKwlTTUxBQkIJcjMsIHIxNCwgcjIsIHIzDQorCVNNTEFCVAlyNCwgcjE0LCByMiwgcjQNCisJTERSCQlyOSwgW3IxMywgIzRdCQkJCUAgWyBhOCB8IGE5IF0NCisJDQorDQorCVFBREQJcjMscjMscjMJCQkJCQ0KKwlRQURECXI0LHI0LHI0CQkJCQkNCisJUUFERAlyMTEscjExLHIxMQkJCQkJDQorCVFBREQJcjEyLHIxMixyMTIJCQkJCQ0KKwkJDQorCVFBREQJcjMscjMscjMJCQkJCQ0KKwlRQURECXI0LHI0LHI0CQkJCQkNCisJUUFERAlyMTEscjExLHIxMQkJCQkJDQorCVFBREQJcjEyLHIxMixyMTIJCQkJCQ0KKwkNCisJUUFERAlyMyxyMyxyMwkJCQkJDQorCVFBREQJcjQscjQscjQJCQkJCQ0KKwlRQURECXIxMSxyMTEscjExCQkJCQkNCisJUUFERAlyMTIscjEyLHIxMgkJCQkJDQorCQ0KKwlRQURECXIzLHIzLHIzCQkJCQkNCisJUUFERAlyNCxyNCxyNAkJCQkJDQorCVFBREQJcjExLHIxMSxyMTEJCQkJCQ0KKwlRQURECXIxMixyMTIscjEyCQkJCQkNCisJDQorCU1PVglyMiwjMzI3NjgJDQorCQ0KKwlRREFERAlyMyxyMixyMwkJCQkJDQorCVFEQURECXI0LHIyLHI0CQkJCQkNCisJUURBREQJcjExLHIyLHIxMQkJCQkJDQorCVFEQURECXIxMixyMixyMTIJCQkJCQ0KKwkJDQorCQ0KKwlNT1YJcjMscjMsYXNyICMxNg0KKwlNT1YJcjQscjQsYXNyICMxNg0KKwlNT1YJcjExLHIxMSxhc3IgIzE2DQorCU1PVglyMTIscjEyLGFzciAjMTYNCisJDQorCVNUUkgJcjMsW3IwXSwjMg0KKwlTVFJICXI0LFtyMF0sIzINCisJU1RSSAlyMTEsW3IwXSwjMg0KKwlTVFJICXIxMixbcjBdLCMyDQorCQ0KKwlNT1YJcjIscjE0LGFzciAjMTYNCisJU1VCCXIxNCwgcjE0LCAjMHgxMDAwMA0KKwlTVUJTCXIyLHIyLCMxDQorCUJORQlyZXNpZHVfbG9vcAkNCitlbmQ6DQorCUxETUZECXIxMyEsIHtyOCAtcjEyfQkNCisJTERNRkQJcjEzISwge3I0IC1yMTIscGN9DQorDQorICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgLkVORAkgDQorICAgICAgICANCisJDQorCSAgDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5ZjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMKQEAgLTAsMCArMSw3NSBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgU2NhbGVfc2lnKA0KK0AJICAgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBzaWduYWwgdG8gc2NhbGUgICAgICAgICAgICAgICAqLw0KK0AJICAgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzaXplIG9mIHhbXSAgICAgICAgICAgICAgICAgICAqLw0KK0AJICAgICAgIFdvcmQxNiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBleHBvbmVudDogeCA9IHJvdW5kKHggPDwgZXhwKSAqLw0KK0AJICAgICAgICkNCitADQorQHIwIC0tLSB4W10NCitAcjEgLS0tIGxnDQorQHIyIC0tLSBleHANCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorCSAgLmdsb2JhbCAgIFNjYWxlX3NpZ19vcHQNCisNCitTY2FsZV9zaWdfb3B0Og0KKw0KKyAgICAgICAgIFNUTUZEICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9DQorCSBTVUIgICAgICAgICAgIHIzLCByMSwgIzEgICAgICAgICAgICAgICAgICBAaSA9IGxnIC0gMQ0KKyAgICAgICAgIENNUCAgICAgICAgICAgcjIsICMwICAgICAgICAgICAgICAgICAgICAgIEBDb21wYXJlIGV4cCBhbmQgMA0KKwkgUlNCICAgICAgICAgICByNywgcjIsICMwICAgICAgICAgICAgICAgICAgQGV4cCA9IC1leHANCisJIEFERCAgICAgICAgICAgcjEwLCByMiwgIzE2ICAgICAgICAgICAgICAgIEAxNiArIGV4cA0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjQsIHIwLCByMywgTFNMICMxICAgICAgICAgIEB4W2ldIGFkZHJlc3MNCisJIE1PViAgICAgICAgICAgcjgsICMweDdmZmZmZmZmDQorCSBNT1YgICAgICAgICAgIHI5LCAjMHg4MDAwDQorCSBCTEUgICAgICAgICAgIExPT1AyDQorCSANCitMT09QMToNCisNCisgICAgICAgICBMRFJTSCAgICAgICAgICByNSwgW3I0XSAgICAgICAgICAgICAgICAgICAgQGxvYWQgeFtpXQ0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjEyLCByNSwgTFNMIHIxMA0KKwkgVEVRICAgICAgICAgICByNSwgcjEyLCBBU1IgcjEwDQorCSBFT1JORSAgICAgICAgIHIxMiwgcjgsIHI1LCBBU1IgIzMxDQorCSBTVUJTICAgICAgICAgIHIzLCByMywgIzENCisJIFFBREQgICAgICAgICAgcjExLCByMTIsIHI5DQorCSBNT1YgICAgICAgICAgIHIxMiwgcjExLCBBU1IgIzE2DQorCSBTVFJIICAgICAgICAgIHIxMiwgW3I0XSwgIy0yDQorCSBCR0UgICAgICAgICAgIExPT1AxDQorICAgICAgICAgQkwgICAgICAgICAgICBUaGVfZW5kDQorDQorTE9PUDI6DQorDQorICAgICAgICAgTERSU0ggICAgICAgICAgcjUsIFtyNF0gICAgICAgICAgICAgICAgICAgQGxvYWQgeFtpXQ0KKwkgTU9WICAgICAgICAgICByNiwgcjUsIExTTCAjMTYgICAgICAgICAgICBATF90bXAgPSB4W2ldIDw8IDE2DQorCSBNT1YgICAgICAgICAgIHI1LCByNiwgQVNSIHI3ICAgICAgICAgICAgIEBMX3RtcCA+Pj0gZXhwDQorCSBRQUREICAgICAgICAgIHIxMSwgcjUsIHI5DQorCSBNT1YgICAgICAgICAgIHIxMiwgcjExLCBBU1IgIzE2DQorCSBTVUJTICAgICAgICAgIHIzLCByMywgIzENCisJIFNUUkggICAgICAgICAgcjEyLCBbcjRdLCAjLTINCisJIEJHRSAgICAgICAgICAgTE9PUDINCisNCitUaGVfZW5kOg0KKyAgICAgICAgIExETUZEICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9DQorICAgICANCisgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgIC5FTkQJIA0KKyAgICAgICAgDQorCQ0KKwkgIA0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVlOWUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCkBAIC0wLDAgKzEsMjM4IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0B2b2lkIFN5bl9maWx0KA0KK0AgICAgIFdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBtZW1bXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXJpbmcuICAgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgYVtdICAgIC0tLSAgIHIwDQorQCB4W10gICAgLS0tICAgcjENCitAIHlbXSAgICAtLS0gICByMg0KK0AgbWVtW10gIC0tLSAgIHIzDQorQCBtIC0tLSAgMTYgIGxnIC0tLSA4MCAgdXBkYXRlIC0tLSAxDQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dA0KKwkgIC5nbG9iYWwgICBTeW5fZmlsdF9hc20NCisgICAgICAgICAgLmV4dGVybiAgIHZvQVdCX0NvcHkNCisNCitTeW5fZmlsdF9hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisgICAgICAgICAgU1VCICAgICAgICAgICByMTMsIHIxMywgIzcwMCAgICAgICAgICAgICAgICAgICBAIHlfYnVmW0xfRlJBTUUxNmsgKyBNMTZrXQ0KKyAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI0LCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBtZW1bXSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHIxMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IHl5ID0geV9idWYgYWRkcmVzcw0KKw0KKyAgICAgICAgICBAIGZvcihpID0gMEAgaSA8IG1AIGkrKykNCisgICAgICAgICAgQHsNCisgICAgICAgICAgQCAgICAqeXkrKyA9IG1lbVtpXUANCisgICAgICAgICAgQH0gDQorDQorICAgICAgICAgIExEUkggICAgICAgICAgcjYsICBbcjRdLCAjMiAgICAgICAgICANCisgICAgICAgICAgTERSSCAgICAgICAgICByNywgIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjgsICBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHI5LCAgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByMTAsIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjExLCBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxMiwgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByMTQsIFtyNF0sICMyDQorDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjYsICBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI3LCAgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByOCwgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjksICBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMCwgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByMTEsIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjEyLCBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxNCwgW3I1XSwgIzINCisNCisgICAgICAgICAgTERSSCAgICAgICAgICByNiwgIFtyNF0sICMyICAgICAgICAgIA0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHI3LCAgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByOCwgIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjksICBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxMCwgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByMTEsIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjEyLCBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxNCwgW3I0XSwgIzINCisNCisgICAgICAgICAgU1RSSCAgICAgICAgICByNiwgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjcsICBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI4LCAgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByOSwgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjEwLCBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMSwgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByMTIsIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjE0LCBbcjVdLCAjMg0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI1LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzBdDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByNSwgQVNSICMxICAgICAgICAgICAgICAgICAgIEAgYTAgPSBhWzBdID4+IDENCisgICAgICAgICAgQE1PViAgICAgICAgICAgcjQsIHIxMw0KKyAgICAgICAgICBAIGxvYWQgYWxsIGFbXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxNCwgPTB4ZmZmZg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMyXSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzRdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMl0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3IwLCAjNl0gICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSxbcjAsICM4XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzRdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOSwgcjksIHIxNCAgICAgICAgICANCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIC1hWzJdIC0tIC1hWzFdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEyLCByOSwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgQCAtYVs0XSAtLSAtYVszXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy00XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMiwgW3IxMywgIy04XQ0KKyAgICAgICAgICANCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IwLCAjMTBdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjAsICMxMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzZdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzE0XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbN10NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTEsW3IwLCAjMTZdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVs4XQ0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI2LCByNiwgcjE0DQorICAgICAgICAgIEFORCAgICAgICAgICAgcjksIHI5LCByMTQgICAgICAgICAgDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCAtYVs2XSAtLSAtYVs1XQ0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMiwgcjksIHIxMSwgTFNMICMxNiAgICAgICAgICAgIEAgLWFbOF0gLS0gLWFbN10NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTAsIFtyMTMsICMtMTJdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTE2XSAgICAgICAgICANCisgICAgICAgICAgIA0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMxOF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzIwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTBdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzIyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLFtyMCwgIzI0XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTJdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOSwgcjksIHIxNCAgICAgICAgICANCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIC1hWzEwXSAtLSAtYVs5XQ0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMiwgcjksIHIxMSwgTFNMICMxNiAgICAgICAgICAgIEAgLWFbMTJdIC0tIC1hWzExXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0yMF0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTIsIFtyMTMsICMtMjRdICAgIA0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMyNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzEzXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjAsICMyOF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzE0XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMzMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzE1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSxbcjAsICMzMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzE2XQ0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI2LCByNiwgcjE0DQorICAgICAgICAgIEFORCAgICAgICAgICAgcjksIHI5LCByMTQgICAgICAgICAgDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCAtYVsxNF0gLS0gLWFbMTNdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEyLCByOSwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgQCAtYVsxNl0gLS0gLWFbMTVdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTI4XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMiwgW3IxMywgIy0zMl0gICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjQsIHIxMywgIzMyDQorTE9PUDoNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICBAIGxvYWQgeFtpXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjQsIHI4LCBMU0wgIzEgICAgICAgICAgICAgIEAgdGVtcF9wID0geXkgKyBpDQorDQorICAgICAgICAgIE1VTCAgICAgICAgICAgcjAsIHI1LCByNiAgICAgICAgICAgICAgICAgICAgICBAIExfdG1wID0geFtpXSAqIGEwDQorICAgICAgICAgIEAgZm9yKGogPSAxQCBqIDw9IG0sIGorPTgpDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTRdICAgICAgICAgICAgICAgICAgQCAtYVsyXSAgLWFbMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgIFtyMTAsICMtMl0gICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMSkNCisgICAgICAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTAsICMtNF0gICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMikNCisNCisNCisgICAgICAgICAgU01VTEJCICAgICAgICByMTQsIHI5LCByNyAgICAgICAgICAgICAgICAgICAgICBAIC1hWzFdICogKCoodGVtcF9wIC0xKSkNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMTAsICMtNl0gICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMykNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMiwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzJdICogKCoodGVtcF9wIC0gMikpDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLThdICAgICAgICAgICAgICAgICAgQCAtYVs0XSAtYVszXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3IxMCwgIy04XSAgICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA0KQ0KKw0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjYsIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbM10gKiAoKih0ZW1wX3AgLTMpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0xMF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA1KQ0KKyAgIA0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjExLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbNF0gKiAoKih0ZW1wX3AgLTQpKSAgICAgICAgDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTEyXSAgICAgICAgICAgICAgICAgQCAtYVs2XSAgLWFbNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTAsICMtMTJdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gNikNCisNCisgICAgICAgICAgU01MQUJCICAgICAgICByMTQsIHI5LCByNywgcjE0ICAgICAgICAgICAgICAgICBAIC1hWzVdICogKCoodGVtcF9wIC01KSkNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMTAsICMtMTRdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gNykNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMiwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzZdICogKCoodGVtcF9wIC0gNikpDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTE2XSAgICAgICAgICAgICAgICAgQCAtYVs4XSAtYVs3XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3IxMCwgIy0xNl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA4KQ0KKyAgICAgICAgIA0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjYsIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbN10gKiAoKih0ZW1wX3AgLTcpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0xOF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA5KQ0KKw0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjExLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbOF0gKiAoKih0ZW1wX3AgLTgpKSAgICAgICAgICANCisgDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTIwXSAgICAgICAgICAgICAgICAgQCAtYVsxMF0gIC1hWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwLCAjLTIwXSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDEwKQ0KKw0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjksIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbOV0gKiAoKih0ZW1wX3AgLTkpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxMCwgIy0yMl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxMSkNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMiwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzEwXSAqICgqKHRlbXBfcCAtIDEwKSkNCisNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtMjRdICAgICAgICAgICAgICAgICBAIC1hWzEyXSAtYVsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTEsIFtyMTAsICMtMjRdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTIpDQorDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVsxMV0gKiAoKih0ZW1wX3AgLTExKSkNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgIFtyMTAsICMtMjZdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTMpDQorDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVsxMl0gKiAoKih0ZW1wX3AgLTEyKSkgICAgICAgICAgIA0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI3LCAgW3IxMywgIy0yOF0gICAgICAgICAgICAgICAgIEAgLWFbMTRdIC1hWzEzXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMCwgIy0yOF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxNCkNCisgDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByOSwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVsxM10gKiAoKih0ZW1wX3AgLTEzKSkNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMTAsICMtMzBdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTUpDQorDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTIsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVsxNF0gKiAoKih0ZW1wX3AgLSAxNCkpDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTMyXSAgICAgICAgICAgICAgICAgQCAtYVsxNl0gLWFbMTVdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLCBbcjEwLCAjLTMyXSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDE2KQ0KKw0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjYsIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbMTVdICogKCoodGVtcF9wIC0xNSkpDQorDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVsxNl0gKiAoKih0ZW1wX3AgLTE2KSkNCisNCisgICAgICAgICAgUlNCICAgICAgICAgICByMTQsIHIxNCwgcjANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjcsIHIxNCwgTFNMICM0ICAgICAgICAgICAgICAgICAgQCBMX3RtcCA8PD00DQorICAgICAgICAgIEFERCAgICAgICAgICAgcjgsIHI4LCAjMQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHIxNCwgcjcsICMweDgwMDAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI3LCByMTQsIEFTUiAjMTYgICAgICAgICAgICAgICAgIEAgKExfdG1wICsgMHg4MDAwKSA+PiAxNg0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHI4LCAjODANCisgICAgICAgICAgU1RSSCAgICAgICAgICByNywgW3IxMF0gICAgICAgICAgICAgICAgICAgICAgICBAIHl5W2ldDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjcsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgQCB5W2ldDQorICAgICAgICAgIEJMVCAgICAgICAgICAgTE9PUA0KKyANCisgICAgICAgICAgQCB1cGRhdGUgbWVtW10NCisgICAgICAgICAgQUREICAgICAgICAgICByNSwgcjEzLCAjMTYwICAgICAgICAgICAgICAgICAgICBAIHl5WzY0XSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjEsIHIzDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjAsIHI1DQorICAgICAgICAgIE1PViAgICAgICAgICAgcjIsICMxNg0KKyAgICAgICAgICBCTCAgICAgICAgICAgIHZvQVdCX0NvcHkgICAgICAgICAgDQorDQorU3luX2ZpbHRfYXNtX2VuZDoNCisgDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjEzLCByMTMsICM3MDAJCSAgICAgDQorICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I2MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucwpAQCAtMCwwICsxLDEwMiBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgRGVlbXBoXzMyKA0KK0AgICAgIFdvcmQxNiB4X2hpW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MzEuLjE2KSAqLw0KK0AgICAgIFdvcmQxNiB4X2xvW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MTUuLjQpICAqLw0KK0AgICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgKHgxNikgICAgICAqLw0KK0AgICAgIFdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeVstMV0pICAgICAgICAgICAqLw0KK0AgICAgICkNCisNCitAeF9oaSAgICAgUk4gICAgICBSMA0KK0B4X2xvICAgICBSTiAgICAgIFIxDQorQHlbXSAgICAgIFJOICAgICAgUjINCitAKm1lbSAgICAgUk4gICAgICBSMw0KKw0KKyAgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorICAgICAgICAgICAuZ2xvYmFsICAgRGVlbXBoXzMyX2FzbQ0KKwkgICANCitEZWVtcGhfMzJfYXNtOg0KKw0KKyAgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKwkgICBNT1YgICAgICAgICAgcjQsICMyICAgICAgICAgICAgICAgICAgIEBpPTANCisJICAgTERSU0ggICAgICAgIHI2LCBbcjBdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2hpWzBdDQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9sb1swXQ0KKwkgICBMRFIgICAgICAgICAgcjUsID0yMjI4MiAgICAgICAgICAgICAgIEByNS0tLW11DQorCSAgIE1PViAgICAgICAgICByMTEsICMweDgwMDANCisNCisgICAgICAgICAgIEB5WzBdDQorCSAgIE1PViAgICAgICAgICByMTAsIHI2LCBMU0wgIzE2ICAgICAgICAgQExfdG1wID0geF9oaVswXTw8MTYNCisJICAgTU9WICAgICAgICAgIHI4LCAgcjUsIEFTUiAjMSAgICAgICAgICBAZmFjID0gbXUgPj4gMQ0KKwkgICBMRFIgICAgICAgICAgcjUsICBbcjNdDQorCSAgIEFERCAgICAgICAgICByMTIsIHIxMCwgcjcsIExTTCAjNCAgICAgQExfdG1wICs9IHhfbG9bMF0gPDwgNA0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMyAgICAgICAgIEBMX3RtcCA8PD0gMw0KKwkgICBNVUwgICAgICAgICAgcjksIHI1LCByOA0KKwkgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbMV0gDQorCSAgIFFEQUREICAgICAgICByMTAsIHIxMCwgcjkNCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzFdICANCisJICAgTU9WICAgICAgICAgIHIxMiwgcjEwLCBMU0wgIzEgICAgICAgICBATF90bXAgPSBMX21hYyhMX3RtcCwgKm1lbSwgZmFjKQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYgICAgICAgIEB5WzBdID0gcm91bmQoTF90bXApDQorDQorDQorCSAgIE1PViAgICAgICAgICByMTAsIHI2LCBMU0wgIzE2DQorCSAgIEFERCAgICAgICAgICByMTIsIHIxMCwgcjcsIExTTCAjNA0KKyAgICAgICAgICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXSwgIzIgICAgICAgICAgICBAdXBkYXRlIHlbMF0NCisJICAgTU9WICAgICAgICAgIHIxMCwgcjEyLCBMU0wgIzMNCisJICAgTVVMICAgICAgICAgIHI5LCByMTQsIHI4DQorCSAgIFFEQUREICAgICAgICByMTAsIHIxMCwgcjkNCisJICAgTU9WICAgICAgICAgIHIxMiwgcjEwLCBMU0wgIzENCisJICAgUUFERCAgICAgICAgIHIxMCwgcjEyLCByMTENCisJICAgTU9WICAgICAgICAgIHIxNCwgcjEwLCBBU1IgIzE2ICAgICAgICBAeVsxXSA9IHJvdW5kKExfdG1wKQ0KKw0KK0xPT1A6DQorICAgICAgICAgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbXQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyDQorCSAgIFNUUkggICAgICAgICByMTQsIFtyMl0sICMyDQorCSAgIE1PViAgICAgICAgICByMTAsIHI2LCBMU0wgIzE2DQorCSAgIEFERCAgICAgICAgICByMTIsIHIxMCwgcjcsIExTTCAjNA0KKwkgICBNVUwgICAgICAgICAgcjksIHIxNCwgcjgNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjEyLCBMU0wgIzMNCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKyAgICAgICAgICAgTERSU0ggICAgICAgIHI2LCBbcjBdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2hpW10NCisJICAgTU9WICAgICAgICAgIHIxMiwgcjEwLCBMU0wgIzENCisJICAgUUFERCAgICAgICAgIHIxMCwgcjEyLCByMTENCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMg0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYNCisNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYNCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0DQorCSAgIFNUUkggICAgICAgICByMTQsIFtyMl0sICMyDQorCSAgIE1VTCAgICAgICAgICByOSwgcjE0LCByOA0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMw0KKwkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5DQorICAgICAgICAgICBBREQgICAgICAgICAgcjQsIHI0LCAjMg0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKyAgICAgICAgICAgQ01QICAgICAgICAgIHI0LCAjNjQNCisJICAgTU9WICAgICAgICAgIHIxNCwgcjEwLCBBU1IgIzE2DQorDQorICAgICAgICAgICBCTFQgICAgICAgICAgTE9PUA0KKyAgICAgICAgICAgU1RSICAgICAgICAgIHIxNCwgW3IzXQ0KKyAgICAgICAgICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXQkgICANCisNCisgICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisNCisJICAgLkVORA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NhMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zCkBAIC0wLDAgKzEsMTI3IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitAV29yZDMyIERvdF9wcm9kdWN0MTIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMzE6IG5vcm1hbGl6ZWQgcmVzdWx0ICgxIDwgdmFsIDw9IC0xKSAqLw0KK0AgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB4IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IHZlY3RvciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgICAgV29yZDE2ICogZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiBleHBvbmVudCBvZiByZXN1bHQgKDAuLiszMCkgICAgICAgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitAICB4W10gICAtLS0gIHIwDQorQCAgeVtdICAgLS0tICByMQ0KK0AgIGxnICAgIC0tLSAgcjINCitAICAqZXhwICAtLS0gIHIzDQorDQorICAgICAgICAgIC5zZWN0aW9uICAgLnRleHQNCisgICAgICAgICAgLmdsb2JhbCAgICBEb3RfcHJvZHVjdDEyX2FzbQ0KKw0KK0RvdF9wcm9kdWN0MTJfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTR9DQorCSAgQ01QICAgICAgICAgICAgICAgcjAsIHIxDQorCSAgQkVRICAgICAgICAgICAgICAgTE9PUF9FUQ0KKw0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTAsIFExfSwgW3IwXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgIHtRMiwgUTN9LCBbcjBdISAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICAgICAge1E0LCBRNX0sIFtyMF0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTYsIFE3fSwgW3IwXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorCSAgVkxEMS5TMTYgICAgICAgICAge1E4LCBROX0sIFtyMV0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHlbXQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMTAsIFExMX0sIFtyMV0hICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB5W10NCisJICBWTEQxLlMxNiAgICAgICAgICB7UTEyLCBRMTN9LCBbcjFdISAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeVtdDQorDQorICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgIFExNSwgRDE2LCBEMA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxNywgRDEgICAgICAgICAgICAgICANCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTgsIEQyDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE5LCBEMw0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMCwgUTF9LCBbcjFdISAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB5W10gICANCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjAsIEQ0ICAgICAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMSwgRDUNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjIsIEQ2DQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDIzLCBENyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNCwgRDgNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjUsIEQ5DQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDI2LCBEMTANCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjcsIEQxMQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQwLCBEMTINCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMSwgRDEzDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDIsIEQxNA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQzLCBEMTUNCisNCisgICAgICAgICAgQ01QICAgICAgICAgICAgICAgcjIsICM2NA0KKyAgICAgICAgICBCRVEgICAgICAgICAgICAgICBMYWJsZTENCisgICAgICAgICAgVkxEMS5TMTYgICAgICAgICAge1EwLCBRMX0sIFtyMF0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXSAgDQorCSAgVkxEMS5TMTYgICAgICAgICAge1EyLCBRM30sIFtyMV0hIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ0LCBEMCAgICAgICAgICAgICANCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENSwgRDENCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENiwgRDINCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENywgRDMNCisJICBCTCAgICAgICAgICAgICAgICBMYWJsZTENCisNCitMT09QX0VROg0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTAsIFExfSwgW3IwXSENCisJICBWTEQxLlMxNiAgICAgICAgICB7UTIsIFEzfSwgW3IwXSENCisJICBWTEQxLlMxNiAgICAgICAgICB7UTQsIFE1fSwgW3IwXSENCisJICBWTEQxLlMxNiAgICAgICAgICB7UTYsIFE3fSwgW3IwXSENCisJICBWTVVMTC5TMTYgICAgICAgICBRMTUsIEQwLCBEMA0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDEsIEQxDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMiwgRDINCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQzLCBEMw0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDQsIEQ0DQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENSwgRDUNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ2LCBENg0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDcsIEQ3DQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEOCwgRDgNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ5LCBEOQ0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDEwLCBEMTANCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxMSwgRDExDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTIsIEQxMg0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDEzLCBEMTMNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxNCwgRDE0DQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTUsIEQxNQ0KKw0KKwkgIENNUCAgICAgICAgICAgICAgIHIyLCAjNjQNCisJICBCRVEgICAgICAgICAgICAgICBMYWJsZTENCisJICBWTEQxLlMxNiAgICAgICAgICB7UTAsIFExfSwgW3IwXSENCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQwLCBEMA0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDEsIEQxDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMiwgRDINCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQzLCBEMw0KKw0KK0xhYmxlMTogDQorDQorICAgICAgICAgIFZRQURELlMzMiAgICAgICAgIEQzMCwgRDMwLCBEMzENCisgICAgICAgICAgVlBBREQuUzMyICAgICAgICAgRDMwLCBEMzAsIEQzMA0KKyAgICAgICAgICBWTU9WLlMzMiAgICAgICAgICByMTIsIEQzMFswXSAgICAgICAgDQorDQorCSAgQUREICAgICAgICAgICAgICAgcjEyLCByMTIsIHIxMg0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IChMX3N1bSA8PCAxKSAgKyAxDQorCSAgTU9WICAgICAgICAgICAgICAgcjQsIHIxMg0KKwkgIENNUCAgICAgICAgICAgICAgIHIxMiwgIzANCisJICBSU0JMVCAgICAgICAgICAgICByNCwgcjEyLCAjMA0KKyAgICAgICAgICBDTFogICAgICAgICAgICAgICByMTAsIHI0DQorICAgICAgICAgIFNVQiAgICAgICAgICAgICAgIHIxMCwgcjEwLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIHNmdCA9IG5vcm1fbChMX3N1bSkNCisgICAgICAgICAgTU9WICAgICAgICAgICAgICAgcjAsIHIxMiwgTFNMIHIxMCAgICAgICAgICAgICAgICAgICAgIEAgTF9zdW0gPSBMX3N1bSA8PCBzZnQNCisgICAgICAgICAgUlNCICAgICAgICAgICAgICAgcjExLCByMTAsICMzMCAgICAgICAgICAgICAgICAgICAgICAgIEAgKmV4cCA9IDMwIC0gc2Z0DQorICAgICAgICAgIFNUUkggICAgICAgICAgICAgIHIxMSwgW3IzXSAgICAgICAgICAgICAgICAgICAgIA0KKw0KK0RvdF9wcm9kdWN0MTJfZW5kOg0KKwkJICAgICANCisgICAgICAgICAgTERNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisNCisgICAgICAgICAgLkVORA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MDAyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCkBAIC0wLDAgKzEsMjI4IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0B2b2lkIEZpbHRfNmtfN2soDQorQCAgICAgV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorQCAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IG1lbW9yeSAoc2l6ZT0zMCkgICAgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitAIHIwICAgIC0tLSAgc2lnbmFsW10NCitAIHIxICAgIC0tLSAgbGcNCitAIHIyICAgIC0tLSAgbWVtW10gDQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dA0KKyAgICAgICAgICAuZ2xvYmFsICAgRmlsdF82a183a19hc20NCisgICAgICAgICAgLmV4dGVybiAgIGZpcl82a183aw0KKw0KK0ZpbHRfNmtfN2tfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAkJcjEzISwge3IwIC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBTVUIgICAgCQlyMTMsIHIxMywgIzI0MCAgICAgICAgICAgICAgQCB4W0xfU1VCRlIxNmsgKyAoTF9GSVIgLSAxKV0NCisgICAgICAgICAgTU9WICAgICAJCXI4LCByMCAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgc2lnbmFsW10gYWRkcmVzcw0KKyAgICAgICAgICBNT1YgICAgIAkJcjUsIHIyICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBtZW1bXSBhZGRyZXNzDQorDQorICAgICAgICAgIE1PViAgICAgCQlyMCwgcjINCisgICAgICAgICAgTU9WICAgICAJCXIxLCByMTMNCisNCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IwXSENCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge0Q0LCBENSwgRDYsIEQ3fSwgW3IwXSENCisNCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IxXSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge0Q0LCBENSwgRDZ9LCBbcjFdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICBEN1swXSwgW3IxXSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAgRDdbMV0sIFtyMV0hDQorDQorDQorDQorICAgICAgICAgIExEUiAgICAgCQlyMTAsIExhYmxlMSAgICAgICAgICAgICAgICAgQCBnZXQgZmlyXzdrIGFkZHJlc3MgICAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgICAgICAgICAgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgIEAgY2hhbmdlIG15TWVtQ29weSB0byBDb3B5LCBkdWUgdG8gQ29weSB3aWxsIGNoYW5nZSByMyBjb250ZW50DQorICAgICAgICAgIEFERCAgICAgCSAgICAJcjYsIHIxMywgIzYwICAgICAgICAgICAgICAgIEAgZ2V0IHhbTF9GSVIgLSAxXSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXI3LCByMyAgICAgICAgICAgICAgICAgICAgICBAIGdldCBzaWduYWxbaV0NCisgICAgICAgICAgQGZvciAoaSA9IGxnIC0gMUAgaSA+PSAwQCBpLS0pDQorICAgICAgICAgIEB7DQorICAgICAgICAgIEAgICAgIHhbaSArIExfRklSIC0gMV0gPSBzaWduYWxbaV0gPj4gMkANCisgICAgICAgICAgQH0NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1EwLCBRMX0sIFtyN10hCQkgICAgQCBzaWduYWxbMF0gIH4gc2lnbmFsWzE1XQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTIsIFEzfSwgW3I3XSEgICAgICAgICAgICAgQCBzaWduYWxbMTZdIH4gc2lnbmFsWzMxXQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICAgICAge1E0LCBRNX0sIFtyN10hICAgICAgICAgICAgIEAgc2lnbmFsWzMyXSB+IHNpZ25hbFs0N10NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E2LCBRN30sIFtyN10hICAgICAgICAgICAgIEAgc2lnbmFsWzQ4XSB+IHNpZ25hbFs2M10NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E4LCBROX0sIFtyN10hICAgICAgICAgICAgIEAgc2lnbmFsWzY0XSB+IHNpZ25hbFs3OV0NCisJICBWU0hSLlMxNiAgICAgICAgICAgICAgUTEwLCBRMCwgIzINCisgICAgICAgICAgVlNIUi5TMTYgICAgICAgICAgICAgIFExMSwgUTEsICMyDQorICAgICAgICAgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMTIsIFEyLCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMTMsIFEzLCAjMg0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7UTEwLCBRMTF9LCBbcjZdIQ0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMCwgIFE0LCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMSwgIFE1LCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMTAsIFE2LCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMTEsIFE3LCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMiwgIFE4LCAjMg0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMywgIFE5LCAjMg0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7UTEyLCBRMTN9LCBbcjZdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7UTAsIFExfSwgW3I2XSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge1ExMCwgUTExfSwgW3I2XSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge1EyLCBRM30sIFtyNl0hDQorDQorCSAgTU9WICAgICAgICAgICAgICAgICAgIHIxMiwgcjUNCisgICAgICAgICAgQFNUUiAgICAgCQlyNSwgW3NwLCAjLTRdICAgICAgICAgICAgICAgQCBQVVNIICByNSB0byBzdGFjaw0KKyAgICAgICAgICBAIG5vdCB1c2UgcmVnaXN0ZXJzOiByNCwgcjEwLCByMTIsIHIxNCwgcjUNCisgICAgICAgICAgTU9WICAgICAJCXI0LCByMTMgDQorICAgICAgICAgIE1PViAgICAgCQlyNSwgIzAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMCAgICANCisgICAgICAgICANCisgICAgICAgICAgQCByNCAtLS0geFtpXSwgcjEwIC0tLS0gZmlyXzZrXzdrDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTAsIFExfSwgW3IxMF0hICAgICAgICAgICBAZmlyXzZrXzdrWzBdICB+IGZpcl82a183a1sxNV0NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1EyLCBRM30sIFtyMTBdISAgICAgICAgICAgQGZpcl82a183a1sxNl0gfiBmaXJfNmtfN2tbMzFdDQorICAgICAgICAgIFZNT1YuUzE2ICAgICAgICAgICAgICBEN1szXSwgcjUgICAgICAgICAgICAgICAgICAgICAgICBAc2V0IGZpcl82a183SyA9IDANCisNCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E0LCBRNX0sIFtyNF0hICAgICAgICAgICAgQHhbMF0gIH4geFsxNV0NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E2LCBRN30sIFtyNF0hICAgICAgICAgICAgQHhbMTZdIH4gWFszMV0NCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E4fSwgW3I0XSEgDQorICAgICAgICAgIFZNT1YuUzE2ICAgICAgICAgICAgICBRMTUsICMwCSAgDQorICAgICAgICAgIA0KK0xPT1BfNks3SzoNCisNCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgICAgIFE5LEQ4LEQwWzBdICAgICAgICAgICAgICAgICANCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgICAgIFExMCxEOSxEMVswXSANCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgICAgIFExMSxEOSxEMFswXSAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgICAgICBRMTIsRDEwLEQxWzBdDQorICAgICAgICAgIFZFWFQuOCAgICAgICAgICAgICAgICBRNCxRNCxRNSwjMg0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTksRDEwLEQyWzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTAsRDExLEQzWzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTEsRDExLEQyWzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTIsRDEyLEQzWzBdICAgIA0KKyAgICAgICAgICBWRVhULjggICAgICAgICAgICAgICAgUTUsUTUsUTYsIzINCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFE5LEQxMixENFswXQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEwLEQxMyxENVswXQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTExLEQxMyxENFswXQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEyLEQxNCxENVswXQ0KKyAgICAgICAgICBWRVhULjggICAgICAgICAgICAgICAgUTYsUTYsUTcsIzINCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFE5LEQxNCxENlswXQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEwLEQxNSxEN1swXQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTExLEQxNSxENlswXQ0KKwkgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTIsRDE2LEQ3WzBdDQorCSAgVkVYVC44ICAJCVE3LFE3LFE4LCMyIA0KKw0KKwkgIFZNTEFMLlMxNiAJCVE5LEQ4LEQwWzFdICAgICAgICAgICAgICAgIA0KKwkgIFZNTEFMLlMxNiAgICAgCVExMCxEOSxEMVsxXQ0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiANCisJICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbMV0gICAgICAgICAgICAgICAgDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxMCxEMVsxXQ0KKwkgIFZFWFQuOCAgCQlRNCxRNCxRNSwjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxMCxEMlsxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTEsRDNbMV0NCisJICBWTUxBTC5TMTYgCQlRMTEsRDExLEQyWzFdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxMixEM1sxXSAgICANCisJICBWRVhULjggIAkJUTUsUTUsUTYsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTIsRDRbMV0NCisJICBWTUxBTC5TMTYgCQlRMTAsRDEzLEQ1WzFdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxMyxENFsxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTQsRDVbMV0NCisJICBWRVhULjggIAkJUTYsUTYsUTcsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTQsRDZbMV0NCisJICBWTUxBTC5TMTYgCQlRMTAsRDE1LEQ3WzFdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxNSxENlsxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTYsRDdbMV0NCisJICBWRVhULjggIAkJUTcsUTcsUTgsIzIgDQorDQorCSAgVk1MQUwuUzE2IAkJUTksRDgsRDBbMl0gICAgICAgICAgIA0KKwkgIFZNTEFMLlMxNiAJCVExMCxEOSxEMVsyXQ0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiANCisJICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbMl0gICAgICAgICAgIA0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTAsRDFbMl0NCisJICBWRVhULjggIAkJUTQsUTQsUTUsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTAsRDJbMl0NCisJICBWTUxBTC5TMTYgCQlRMTAsRDExLEQzWzJdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxMSxEMlsyXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTIsRDNbMl0gICAgDQorCSAgVkVYVC44ICAJCVE1LFE1LFE2LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDEyLEQ0WzJdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxMyxENVsyXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTMsRDRbMl0NCisJICBWTUxBTC5TMTYgCQlRMTIsRDE0LEQ1WzJdDQorCSAgVkVYVC44ICAJCVE2LFE2LFE3LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDE0LEQ2WzJdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxNSxEN1syXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTUsRDZbMl0NCisJICBWTUxBTC5TMTYgCQlRMTIsRDE2LEQ3WzJdDQorCSAgVkVYVC44ICAJCVE3LFE3LFE4LCMyIA0KKw0KKwkgIFZNTEFMLlMxNiAJCVE5LEQ4LEQwWzNdICAgICAgICAgICAgICANCisJICBWTUxBTC5TMTYgCQlRMTAsRDksRDFbM10NCisJICBWRVhULjggCQlROCxROCxRMTUsIzIgDQorCSAgVk1MQUwuUzE2IAkJUTExLEQ5LEQwWzNdICAgICAgICAgICAgICANCisJICBWTUxBTC5TMTYgCQlRMTIsRDEwLEQxWzNdDQorCSAgVkVYVC44ICAJCVE0LFE0LFE1LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDEwLEQyWzNdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxMSxEM1szXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTEsRDJbM10NCisJICBWTUxBTC5TMTYgCQlRMTIsRDEyLEQzWzNdICAgIA0KKwkgIFZFWFQuOCAgCQlRNSxRNSxRNiwjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxMixENFszXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTMsRDVbM10NCisJICBWTUxBTC5TMTYgCQlRMTEsRDEzLEQ0WzNdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxNCxENVszXQ0KKwkgIFZFWFQuOCAgCQlRNixRNixRNywjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxNCxENlszXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTUsRDdbM10NCisJICBWTUxBTC5TMTYgCQlRMTEsRDE1LEQ2WzNdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxNixEN1szXQ0KKwkgIFZFWFQuOCAJCVE3LFE3LFE4LCMyICAgICANCisNCisJICBWTU9WLlMxNiAgCQlEOCxEOQ0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiANCisJICBWTU9WLlMxNiAgCQlEOSxEMTANCisJICBWQURELlMzMiAgCQlROSxROSxRMTANCisJICBWTU9WLlMxNiAgCQlEMTAsRDExDQorCSAgVk1PVi5TMTYgIAkJRDExLEQxMg0KKwkgIFZBREQuUzMyICAJCVExMSxRMTEsUTEyDQorCSAgVk1PVi5TMTYgIAkJRDEyLEQxMw0KKwkgIFZRUlNIUk4uUzMyIAkJRDI4LFE5LCMxNQ0KKwkgIFZNT1YuUzE2ICAJCUQxMyxEMTQNCisJICBWTU9WLlMxNiAgCQlEMTQsRDE1DQorCSAgVlFSU0hSTi5TMzIgCQlEMjksUTExLCMxNQ0KKwkgIFZNT1YuUzE2ICAJCUQxNSxEMTYNCisNCisJICBWTEQxLlMxNiAgCQl7UTh9LFtyNF0hDQorCSAgQUREICAgICAgICAgICAgICAgICAgIHI1LCByNSwgIzgNCisJICBDTVAgICAJCXI1LCAjODANCisJICBWU1QxLlMxNiAgCQl7RDI4LEQyOX0sW3IzXSENCisJICBCTFQgICAgIAkJTE9PUF82SzdLDQorDQorICAgICAgICAgIEFERCAgICAgCQlyMCwgcjEzLCAjMTYwICAgICAgICAgICAgICAgQHggKyBsZw0KKwkgIE1PViAgICAgICAgICAgICAgICAgICByMSwgcjEyDQorCSAgQExEUiAgICAgCQlyMSwgW3NwLCAjLTRdICAgICAgICAgICAgICAgQG1lbSBhZGRyZXNzDQorDQorCSAgVkxEMS5TMTYgICAgICAgICAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hDQorCSAgVkxEMS5TMTYgICAgICAgICAgICAgIHtENCwgRDUsIEQ2LCBEN30sIFtyMF0hDQorDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMV0hDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtENCwgRDUsIEQ2fSwgW3IxXSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAgRDdbMF0sIFtyMV0hDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIEQ3WzFdLCBbcjFdIQ0KKyAgICAgICAgICAgICAgICAgICAgDQorRmlsdF82a183a19lbmQ6DQorDQorICAgICAgICAgIEFERCAgICAgCQlyMTMsIHIxMywgIzI0MCAgDQorICAgICAgICAgIExETUZEICAgCQlyMTMhLCB7cjAgLSByMTIsIHIxNX0gDQorIA0KK0xhYmxlMToNCisgICAgICAgICAgLndvcmQgICAJCWZpcl82a183aw0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlOWFkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKQEAgLTAsMCArMSwyNzAgQEAKK0AvKgorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorQCAqKgorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AgKioKK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQCAqKgorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQCAqLworQAorQHN0YXRpYyB2b2lkIE5vcm1fQ29yciAoV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4Y2l0YXRpb24gYnVmZmVyICAgICAgICAgICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHN5bnRoL3dndCBmaWx0ZXJzICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgTF9zdWJmciwgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3ViLWZyYW1lIGxlbmd0aCAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRfbWluLCAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdF9tYXgsICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWF4aW11bSB2YWx1ZSBvZiBwaXRjaCBsYWcuICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjb3JyX25vcm1bXSkgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAgICovCitACisKK0AgcjAgLS0tIGV4Y1tdCitAIHIxIC0tLSB4bltdCitAIHIyIC0tLSBoW10KK0AgcjMgLS0tIExfc3ViZnIKK0AgcjQgLS0tIHRfbWluCitAIHI1IC0tLSB0X21heAorQCByNiAtLS0gY29ycl9ub3JtW10KKworCisJLnNlY3Rpb24gIC50ZXh0CisgICAgICAgIC5nbG9iYWwgICAgTm9ybV9jb3JyX2FzbSAKKyAgICAgICAgLmV4dGVybiAgICBDb252b2x2ZV9hc20KKyAgICAgICAgLmV4dGVybiAgICBJc3FydF9uCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAIGNvbnN0YW50CitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisuZXF1ICAgIEVYQyAgICAgICAgICAgICAgICwgMAorLmVxdSAgICBYTiAgICAgICAgICAgICAgICAsIDQKKy5lcXUgICAgSCAgICAgICAgICAgICAgICAgLCA4CisuZXF1ICAgIExfU1VCRlIgICAgICAgICAgICwgMTIKKy5lcXUgICAgdm9TVEFDSyAgICAgICAgICAgLCAxNzIKKy5lcXUgICAgVF9NSU4gICAgICAgICAgICAgLCAyMTIKKy5lcXUgICAgVF9NQVggICAgICAgICAgICAgLCAyMTYKKy5lcXUgICAgQ09SUl9OT1JNICAgICAgICAgLCAyMjAKKyAgICAgICAgICAgICAgICAgIAorTm9ybV9jb3JyX2FzbToKKworICAgICAgICBTVE1GRCAgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0gIAorICAgICAgICBTVUIgICAgICAgICAgICByMTMsIHIxMywgI3ZvU1RBQ0sKKyAgCisgICAgICAgIEFERCAgICAgICAgICAgIHI4LCByMTMsICMyMCAgICAgICAgICAgICAgICAgQGdldCB0aGUgZXhjZltMX1NVQkZSXQorICAgICAgICBMRFIgICAgICAgICAgICByNCwgW3IxMywgI1RfTUlOXSAgICAgICAgICAgIEBnZXQgdF9taW4KKyAgICAgICAgUlNCICAgICAgICAgICAgcjExLCByNCwgIzAgICAgICAgICAgICAgICAgICBAayA9IC10X21pbgorICAgICAgICBBREQgICAgICAgICAgICByNSwgcjAsIHIxMSwgTFNMICMxICAgICAgICAgIEBnZXQgdGhlICZleGNba10gICAKKyAgICAgICAgCisgICAgICAgIEB0cmFuc2ZlciBDb252b2x2ZSBmdW5jdGlvbgorICAgICAgICBTVE1GRCAgICAgICAgICBzcCEsIHtyMCAtIHIzfQorICAgICAgICBNT1YgICAgICAgICAgICByMCwgcjUKKyAgICAgICAgTU9WICAgICAgICAgICAgcjEsIHIyCisgICAgICAgIE1PViAgICAgICAgICAgIHIyLCByOCAgICAgICAgICAgICAgICAgICAgICAgQHIyIC0tLSBleGNmW10KKyAgICAgICAgQkwgICAgICAgICAgICAgQ29udm9sdmVfYXNtCisgICAgICAgIExETUZEICAgICAgICAgIHNwISwge3IwIC0gcjN9CisKKyAgICAgICAgQCByOCAtLS0gZXhjZltdCisKKwlNT1YgICAgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgICAgIHI3LCAjMQorCVZMRDEuUzE2ICAgICAgIHtRMCwgUTF9LCBbcjE0XSEKKwlWTEQxLlMxNiAgICAgICB7UTIsIFEzfSwgW3IxNF0hCisJVkxEMS5TMTYgICAgICAge1E0LCBRNX0sIFtyMTRdIQorCVZMRDEuUzE2ICAgICAgIHtRNiwgUTd9LCBbcjE0XSEKKworICAgICAgICBWTVVMTC5TMTYgICAgICBRMTAsIEQwLCBEMAorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQxLCBEMQorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQyLCBEMgorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQzLCBEMworICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ0LCBENAorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ1LCBENQorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ2LCBENgorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ3LCBENworICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ4LCBEOAorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQ5LCBEOQorCVZNTEFMLlMxNiAgICAgIFExMCwgRDEwLCBEMTAKKwlWTUxBTC5TMTYgICAgICBRMTAsIEQxMSwgRDExCisJVk1MQUwuUzE2ICAgICAgUTEwLCBEMTIsIEQxMgorCVZNTEFMLlMxNiAgICAgIFExMCwgRDEzLCBEMTMKKwlWTUxBTC5TMTYgICAgICBRMTAsIEQxNCwgRDE0CisJVk1MQUwuUzE2ICAgICAgUTEwLCBEMTUsIEQxNQorCisgICAgICAgIFZRQURELlMzMiAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVk1PVi5TMzIgICAgICAgcjksICBEMjBbMF0KKyAgICAgICAgVk1PVi5TMzIgICAgICAgcjEwLCBEMjBbMV0KKyAgICAgICAgUUFERCAgICAgICAgICAgcjYsIHI5LCByMTAgCisJUUFERCAgICAgICAgICAgcjYsIHI2LCByNgorICAgICAgICBRQUREICAgICAgICAgICByOSwgcjYsIHI3ICAgICAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCAxKSArIDE7CisJQ0xaICAgICAgICAgICAgcjcsIHI5CisJU1VCICAgICAgICAgICAgcjYsIHI3LCAjMSAgICAgICAgICAgICAgICAgICBAZXhwID0gbm9ybV9sKExfdG1wKQorICAgICAgICBSU0IgICAgICAgICAgICByNywgcjYsICMzMiAgICAgICAgICAgICAgICAgIEBleHAgPSAzMiAtIGV4cAorCU1PViAgICAgICAgICAgIHI2LCByNywgQVNSICMxICAgICAgICAgCisJUlNCICAgICAgICAgICAgcjcsIHI2LCAjMCAgICAgICAgICAgICAgICAgICBAc2NhbGUgPSAtKGV4cCA+PiAxKQorCQorICAgICAgICBAbG9vcCBmb3IgZXZlcnkgcG9zc2libGUgcGVyaW9kCisJQGZvcih0ID0gdF9taW5AIHQgPD0gdF9tYXhAIHQrKykKKwlAcjcgLS0tIHNjYWxlIHI0IC0tLSB0X21pbiByOCAtLS0gZXhjZltdCisKK0xPT1BGT1I6CQorCUFERCAgICAgICAgICAgIHIxNCwgcjEzLCAjMjAgICAgICAgICAgICAgICAgQGNvcHkgb2YgZXhjZltdCisJTU9WICAgICAgICAgICAgcjEyLCByMSAgICAgICAgICAgICAgICAgICAgICBAY29weSBvZiB4bltdCisJTU9WICAgICAgICAgICAgcjgsICMweDgwMDAKKworICAgICAgICBWTEQxLlMxNiAgICAgICB7UTAsIFExfSwgW3IxNF0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgZXhjZltdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRMiwgUTN9LCBbcjE0XSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiBleGNmW10gICAgICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRNCwgUTV9LCBbcjEyXSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiB4W10KKwlWTEQxLlMxNiAgICAgICB7UTYsIFE3fSwgW3IxMl0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgeFtdCisgICAgICAgIFZNVUxMLlMxNiAgICBRMTAsIEQwLCBEMCAgICAgICAgICAgICAgICAgICAgICBATF90bXAxICs9IGV4Y2ZbXSAqIGV4Y2ZbXQorICAgICAgICBWTVVMTC5TMTYgICAgUTExLCBEMCwgRDggICAgICAgICAgICAgICAgICAgICAgQExfdG1wICArPSB4W10gKiBleGNmW10gICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQxLCBEMQorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMSwgRDkKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMCwgRDIsIEQyCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQyLCBEMTAgICAgICAgIAorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMywgRDMKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDMsIEQxMQorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENCwgRDQKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDQsIEQxMgorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENSwgRDUKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDUsIEQxMworICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENiwgRDYKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDYsIEQxNAorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENywgRDcKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDcsIEQxNQorCisJVkxEMS5TMTYgICAgICAge1EwLCBRMX0sIFtyMTRdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IGV4Y2ZbXQorICAgICAgICBWTEQxLlMxNiAgICAgICB7UTIsIFEzfSwgW3IxNF0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgZXhjZltdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRNCwgUTV9LCBbcjEyXSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiB4W10KKyAgICAgICAgVkxEMS5TMTYgICAgICAge1E2LCBRN30sIFtyMTJdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IHhbXQorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMCwgRDAKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDAsIEQ4CisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQxLCBEMQorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMSwgRDkKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMCwgRDIsIEQyCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQyLCBEMTAgICAgICAgIAorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMywgRDMKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDMsIEQxMQorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENCwgRDQKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDQsIEQxMgorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENSwgRDUKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDUsIEQxMworICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENiwgRDYKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDYsIEQxNAorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENywgRDcKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDcsIEQxNQorCisgICAgICAgIFZRQURELlMzMiAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVlFBREQuUzMyICAgICAgRDIyLCBEMjIsIEQyMworCisJVlBBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMCAgICAgICAgICAgICAgICAgICBARDIwWzBdIC0tLSBMX3RtcDEgPDwgMQorCVZQQURELlMzMiAgICAgIEQyMiwgRDIyLCBEMjIgICAgICAgICAgICAgICAgICAgQEQyMlswXSAtLS0gTF90bXAgPDwgMQorCisJVk1PVi5TMzIgICAgICAgcjYsIEQyMFswXQorICAgICAgICBWTU9WLlMzMiAgICAgICByNSwgRDIyWzBdCQorCisJQHI1IC0tLSBMX3RtcCwgcjYgLS0tIExfdG1wMQorCU1PViAgICAgICAgICAgIHIxMCwgIzEKKwlBREQgICAgICAgICAgICByNSwgcjEwLCByNSwgTFNMICMxICAgICAgICAgICAgICAgICAgICAgQExfdG1wID0gKExfdG1wIDw8IDEpICsgMQorCUFERCAgICAgICAgICAgIHI2LCByMTAsIHI2LCBMU0wgIzEgICAgICAgICAgICAgICAgICAgICBATF90bXAxID0gKExfdG1wMSA8PCAxKSArIDEKKyAKKwlDTFogICAgICAgICAgICByMTAsIHI1ICAgICAgICAKKwlDTVAgICAgICAgICAgICByNSwgIzAKKwlSU0JMVCAgICAgICAgICByMTEsIHI1LCAjMAorCUNMWkxUICAgICAgICAgIHIxMCwgcjExCisJU1VCICAgICAgICAgICAgcjEwLCByMTAsICMxICAgICAgICAgICAgICAgICBAZXhwID0gbm9ybV9sKExfdG1wKQorICAgICAKKwlNT1YgICAgICAgICAgICByNSwgcjUsIExTTCByMTAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCBleHApCisJUlNCICAgICAgICAgICAgcjEwLCByMTAsICMzMCAgICAgICAgICAgICAgICBAZXhwX2NvcnIgPSAzMCAtIGV4cAorCU1PViAgICAgICAgICAgIHIxMSwgcjUsIEFTUiAjMTYgICAgICAgICAgICAgQGNvcnIgPSBleHRyYWN0X2goTF90bXApCisKKwlDTFogICAgICAgICAgICByNSwgcjYKKwlTVUIgICAgICAgICAgICByNSwgcjUsICMxCisJTU9WICAgICAgICAgICAgcjYsIHI2LCBMU0wgcjUgICAgICAgICAgICAgICBATF90bXAgPSAoTF90bXAxIDw8IGV4cCkKKwlSU0IgICAgICAgICAgICByNSwgcjUsICMzMCAgICAgICAgICAgICAgICAgIEBleHBfbm9ybSA9IDMwIC0gZXhwCisKKwlAcjEwIC0tLSBleHBfY29yciwgcjExIC0tLSBjb3JyCisJQHI2ICAtLS0gTF90bXAsIHI1IC0tLSBleHBfbm9ybQorCisJQElzcXJ0X24oJkxfdG1wLCAmZXhwX25vcm0pCisKKwlNT1YgICAgICAgICAgICByMTQsIHIwCisJTU9WICAgICAgICAgICAgcjEyLCByMSAKKworICAgICAgICBTVE1GRCAgICAgICAgICBzcCEsIHtyMCAtIHI0LCByNyAtIHIxMiwgcjE0fQorCUFERCAgICAgICAgICAgIHIxLCBzcCwgIzQKKwlBREQgICAgICAgICAgICByMCwgc3AsICMwCisJU1RSICAgICAgICAgICAgcjYsIFtzcF0KKwlTVFJIICAgICAgICAgICByNSwgW3NwLCAjNF0KKwlCTCAgICAgICAgICAgICBJc3FydF9uCisJTERSICAgICAgICAgICAgcjYsIFtzcF0KKwlMRFJTSCAgICAgICAgICByNSwgW3NwLCAjNF0KKyAgICAgICAgTERNRkQgICAgICAgICAgc3AhLCB7cjAgLSByNCwgcjcgLSByMTIsIHIxNH0KKwlNT1YgICAgICAgICAgICByMCwgcjE0CisJTU9WICAgICAgICAgICAgcjEsIHIxMgorCisKKwlNT1YgICAgICAgICAgICByNiwgcjYsIEFTUiAjMTYgICAgICAgICAgICAgIEBub3JtID0gZXh0cmFjdF9oKExfdG1wKQorCU1VTCAgICAgICAgICAgIHIxMiwgcjYsIHIxMQorCUFERCAgICAgICAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgICAgICAgQExfdG1wID0gdm9fTF9tdWx0KGNvcnIsIG5vcm0pCisgIAorCUFERCAgICAgICAgICAgIHI2LCByMTAsIHI1CisJQUREICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgICBAZXhwX2NvcnIgKyBleHBfbm9ybSArIHNjYWxlCisKKyAgICAgICAgQ01QICAgICAgICAgICAgcjYsICMwCisgICAgICAgIFJTQkxUICAgICAgICAgIHI2LCByNiwgIzAKKwlNT1ZMVCAgICAgICAgICByMTIsIHIxMiwgQVNSIHI2CisgICAgICAgIE1PVkdUICAgICAgICAgIHIxMiwgcjEyLCBMU0wgcjYgICAgICAgICAgICAgQExfdG1wID0gTF9zaGwoTF90bXAsIGV4cF9jb3JyICsgZXhwX25vcm0gKyBzY2FsZSkKKworICAgICAgICBBREQgICAgICAgICAgICByMTIsIHIxMiwgcjgKKyAgICAgICAgTU9WICAgICAgICAgICAgcjEyLCByMTIsIEFTUiAjMTYgICAgICAgICAgICBAdm9fcm91bmQoTF90bXApCisKKyAgICAgICAgTERSICAgICAgICAgICAgcjUsIFtyMTMsICNDT1JSX05PUk1dICAgICAgICBAIGdldCBjb3JyX25vcm0gYWRkcmVzcworCUxEUiAgICAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKKwlBREQgICAgICAgICAgICByMTAsIHI1LCByNCwgTFNMICMxICAgICAgICAgIEAgZ2V0IGNvcnJfbm9ybVt0XSBhZGRyZXNzCisJU1RSSCAgICAgICAgICAgcjEyLCBbcjEwXSAgICAgICAgICAgICAgICAgICBAIGNvcnJfbm9ybVt0XSA9IHZvX3JvdW5kKExfdG1wKQorCisJQ01QICAgICAgICAgICAgcjQsIHI2CisJQkVRICAgICAgICAgICAgTm9ybV9jb3JyX2FzbV9lbmQKKyAKKwlBREQgICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgIEAgdF9taW4gKysgCisJUlNCICAgICAgICAgICAgcjUsIHI0LCAjMCAgICAgICAgICAgICAgICAgICBAIGsKKworCU1PViAgICAgICAgICAgIHI2LCAjNjMgICAgICAgICAgICAgICAgICAgICAgQCBpID0gNjMKKwlNT1YgICAgICAgICAgICByOCwgcjAgICAgICAgICAgICAgICAgICAgICAgIEAgZXhjW10KKwlNT1YgICAgICAgICAgICByOSwgcjIgICAgICAgICAgICAgICAgICAgICAgIEAgaFtdCisJQUREICAgICAgICAgICAgcjEwLCByMTMsICMyMCAgICAgICAgICAgICAgICBAIGV4Y2ZbXQorCisJQUREICAgICAgICAgICAgcjgsIHI4LCByNSwgTFNMICMxICAgICAgICAgICBAIGV4Y1trXSBhZGRyZXNzCisJQUREICAgICAgICAgICAgcjksIHI5LCByNiwgTFNMICMxICAgICAgICAgICBAIGhbaV0gYWRkcmVzcworCUFERCAgICAgICAgICAgIHIxMCwgcjEwLCByNiwgTFNMICMxICAgICAgICAgQCBleGNmW2ldIGFkZHJlc3MKKwlMRFJTSCAgICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgIEAgdG1wID0gZXhjW2tdCisKK0xPT1BLOgorICAgICAgICBMRFJTSCAgICAgICAgICByOCwgW3I5XSwgIy0yICAgICAgICAgICAgICAgIEAgbG9hZCBoW2ldCisJTERSU0ggICAgICAgICAgcjEyLCBbcjEwLCAjLTJdICAgICAgICAgICAgICBAIGxvYWQgZXhjZltpIC0gMV0KKwlNVUwgICAgICAgICAgICByMTQsIHIxMSwgcjgKKwlNT1YgICAgICAgICAgICByOCwgcjE0LCBBU1IgIzE1CisJQUREICAgICAgICAgICAgcjE0LCByOCwgcjEyCisJU1RSSCAgICAgICAgICAgcjE0LCBbcjEwXSwgIy0yCisJU1VCUyAgICAgICAgICAgcjYsIHI2LCAjMQorCUJHVCAgICAgICAgICAgIExPT1BLCisKKwlMRFJTSCAgICAgICAgICByOCwgW3I5XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBoWzBdCisJTVVMICAgICAgICAgICAgcjE0LCByMTEsIHI4CisgICAgICAgIExEUiAgICAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKKwlNT1YgICAgICAgICAgICByOCwgcjE0LCBBU1IgIzE1CisJU1RSSCAgICAgICAgICAgcjgsIFtyMTBdICAgICAgICAgICAgICAgICAgICAKKworCUNNUCAgICAgICAgICAgIHI0LCByNgorCUJMRSAgICAgICAgICAgIExPT1BGT1IKKworTm9ybV9jb3JyX2FzbV9lbmQ6IAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLICAgICAgCisgICAgICAgIExETUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQorICAgIAorICAgICAgICAuRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTc2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKQEAgLTAsMCArMSwxMzMgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0B2b2lkIFN5bl9maWx0XzMyKA0KK0AgICAgIFdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAqLw0KK0AgICAgIFdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KSAgICAqLw0KK0AgICAgIFdvcmQxNiBRbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4YyBzY2FsaW5nID0gMChtaW4pIHRvIDgobWF4KSAqLw0KK0AgICAgIFdvcmQxNiBzaWdfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBzaWdfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCBhW10gICAgICAtLS0gcjANCitAIG0gICAgICAgIC0tLSByMQ0KK0AgZXhjW10gICAgLS0tIHIyDQorQCBRbmV3ICAgICAtLS0gcjMNCitAIHNpZ19oaVtdIC0tLSByNA0KK0Agc2lnX2xvW10gLS0tIHI1DQorQCBsZyAgICAgICAtLS0gcjYNCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0IA0KKyAgICAgICAgICAuZ2xvYmFsICAgU3luX2ZpbHRfMzJfYXNtDQorDQorU3luX2ZpbHRfMzJfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjQsICBbcjEzLCAjNDBdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2hpW10gYWRkcmVzcw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI1LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ19sb1tdIGFkZHJlc3MNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgIFtyMF0sICMyICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMF0NCisgICAgICAgICAgQUREICAgICAgICAgICByNywgIHIzLCAjNCAgICAgICAgICAgICAgICAgICAgICBAIDQgKyBRX25ldw0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIzLCByNiwgQVNSIHI3ICAgICAgICAgICAgICAgICAgIEAgYTAgPSBBcVswXSA+PiAoNCArIFFfbmV3KQ0KKw0KKwkgIFNVQiAgICAgICAgICAgcjEwLCByNCwgIzMyICAgICAgICAgICAgICAgICAgICAgQCBzaWdfaGlbLTE2XSBhZGRyZXNzDQorCSAgU1VCICAgICAgICAgICByMTEsIHI1LCAjMzIgICAgICAgICAgICAgICAgICAgICBAIHNpZ19sb1stMTZdIGFkZHJlc3MNCisNCisJICBWTEQxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hICAgICAgICAgIEBhWzFdIH4gYVsxNl0gDQorICANCisgICAgICAgICAgTU9WICAgICAgICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwDQorDQorCSAgVkxEMS5TMTYgICAgICB7RDQsIEQ1LCBENiwgRDd9LCBbcjEwXSEgICAgICAgICBAIHNpZ19oaVstMTZdIH4gc2lnX2hpWy0xXQ0KKyAgICAgICAgICBWUkVWNjQuMTYgICAgIEQwLCBEMA0KKyAgICAgICAgICBWUkVWNjQuMTYgICAgIEQxLCBEMQ0KKwkgIFZMRDEuUzE2ICAgICAge0Q4LCBEOSwgRDEwLCBEMTF9LCBbcjExXSEgICAgICAgQCBzaWdfbG9bLTE2XSB+IHNpZ19sb1stMV0NCisgICAgICAgICAgVlJFVjY0LjE2ICAgICBEMiwgRDINCisgICAgICAgICAgVlJFVjY0LjE2ICAgICBEMywgRDMJDQorICAgICAgICAgIFZEVVAuUzMyICAgICAgUTE1LCByOA0KKyAgICAgICAgICAgICAgDQorU1lOX0xPT1A6DQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgQGV4Y1tpXQ0KKwkgIEBMX3RtcCA9IExfbXN1KExfdG1wLCBzaWdfbG9baSAtIGpdLCBhW2pdKUANCisJICBWTVVMTC5TMTYgICAgIFExMCwgRDgsIEQzDQorCSAgVkVYVC44ICAgICAgICBEOCwgRDgsIEQ5LCAjMg0KKwkgIFZNTEFMLlMxNiAgICAgUTEwLCBEOSwgRDINCisJICBWTUxBTC5TMTYgICAgIFExMCwgRDEwLCBEMQ0KKwkgIFZNTEFMLlMxNiAgICAgUTEwLCBEMTEsIEQwDQorDQorCSAgVkVYVC44ICAgICAgICBEOSwgRDksIEQxMCwgIzINCisJICBWRVhULjggICAgICAgIEQxMCwgRDEwLCBEMTEsICMyDQorCSAgDQorCSAgVlBBREQuUzMyICAgICBEMjgsIEQyMCwgRDIxDQorICAgICAgICAgIE1VTCAgICAgICAgICAgcjEyLCByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgQGV4Y1tpXSAqIGEwDQorCSAgVlBBREQuUzMyICAgICBEMjksIEQyOCwgRDI4DQorCSAgVkRVUC5TMzIgICAgICBRMTAsIEQyOVswXSAgICAgICAgICAgICAgICAgICAgICBAcmVzdWx0MQ0KKyAgICAgICAgICANCisJICBWTVVMTC5TMTYgICAgIFExMSwgRDQsIEQzDQorCSAgVk1MQUwuUzE2ICAgICBRMTEsIEQ1LCBEMg0KKyAgICAgICAgICBWU1VCLlMzMiAgICAgIFExMCwgUTE1LCBRMTANCisJICBATF90bXAgPSBMX21zdShMX3RtcCwgc2lnX2hpW2kgLSBqXSwgYVtqXSlADQorDQorCSAgVk1MQUwuUzE2ICAgICBRMTEsIEQ2LCBEMQ0KKwkgIFZFWFQuOCAgICAgICAgRDQsIEQ0LCBENSwgIzINCisJICBWTUxBTC5TMTYgICAgIFExMSwgRDcsIEQwDQorDQorDQorCSAgVkVYVC44ICAgICAgICBENSwgRDUsIEQ2LCAjMg0KKwkgIFZFWFQuOCAgICAgICAgRDYsIEQ2LCBENywgIzINCisNCisJICBWUEFERC5TMzIgICAgIEQyOCwgRDIyLCBEMjMNCisgICAgICAgICAgVlBBREQuUzMyICAgICBEMjksIEQyOCwgRDI4DQorICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCByMTIsIExTTCAjMSAgICAgICAgICAgICAgICAgQGV4Y1tpXSAqIGEwIDw8IDENCisgICAgICAgICAgVkRVUC5TMzIgICAgICBRMTEsIEQyOVswXSAgICAgICAgICAgICAgICAgICAgICBAcmVzdWx0Mg0KKw0KKw0KKw0KKwkgIFZTSFIuUzMyICAgICAgUTEwLCBRMTAsICMxMSAgICAgICAgICAgICAgICAgICAgQHJlc3VsdDEgPj49IDExDQorCSAgVlNITC5TMzIgICAgICBRMTEsIFExMSwgIzEgICAgICAgICAgICAgICAgICAgICBAcmVzdWx0MiA8PD0gMQ0KKwkgIFZEVVAuUzMyICAgICAgUTEyLCByMTQgICAgICAgICAgICAgICAgICAgICAgICAgDQorCSAgVkFERC5TMzIgICAgICBRMTIsIFExMiwgUTEwICAgICAgICAgICAgICAgICAgICBATF90bXAgPSBMX3RtcCAtIChyZXN1bHQxID4+PSAxMSkgLSAocmVzdWx0MiA8PD0gMSkNCisJICBWU1VCLlMzMiAgICAgIFExMiwgUTEyLCBRMTENCisNCisJICBWU0hMLlMzMiAgICAgIFExMiwgUTEyLCAjMyAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCA8PD0gMw0KKw0KKw0KKwkgIFZTSFJOLlMzMiAgICAgRDIwLCBRMTIsICMxNiAgICAgICAgICAgICAgICAgICAgQHNpZ19oaVtpXSA9IExfdG1wID4+IDE2QA0KKwkgIFZNT1YuUzE2ICAgICAgcjEwLCBEMjBbMF0NCisJICBWU0hSLlMzMiAgICAgIFExMiwgUTEyLCAjNCAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCA+Pj0gNA0KKwkgIFZFWFQuOCAgICAgICAgRDcsIEQ3LCBEMjAsICMyDQorCSAgU1RSSCAgICAgICAgICByMTAsIFtyNF0sICMyICAgICAgICAgICAgICAgICAgICBAc3RvcmUgc2lnX2hpW2ldDQorICAgICAgICAgIFZNT1YuUzMyICAgICAgcjExLCBEMjRbMF0gICAgICAgICAgICAgICAgICAgICAgQHIxMSAtLS0gTF90bXAgPj49IDQNCisJICBBREQgICAgICAgICAgIHI4LCByOCwgIzENCisJICBTVUIgICAgICAgICAgIHIxMiwgcjExLCByMTAsIExTTCAjMTINCisJICBATU9WICAgICAgICAgICByMTEsIHIxMiwgQVNSICMxNiAgICAgICAgICAgICAgICBAc2lnX2xvW2ldDQorCSAgVkRVUC5TMTYgICAgICBEMjEsIHIxMg0KKwkgIFZFWFQuOCAgICAgICAgRDExLCBEMTEsIEQyMSwgIzINCisJICBTVFJIICAgICAgICAgIHIxMiwgW3I1XSwgIzIgICAgICAgICAgICAgICAgICAgIEBzdHJvZSBzaWdfbG9baV0NCisNCisgICAgICAgICAgQ01QICAgICAgICAgICByOCwgIzY0DQorICAgICAgICAgIEJMVCAgICAgICAgICAgU1lOX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KK1N5bl9maWx0XzMyX2VuZDoNCisJCSAgICAgDQorICAgICAgICAgIExETUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0gDQorICAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgIC5FTkQNCisgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWUzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMKQEAgLTAsMCArMSwxNzggQEAKK0AvKgorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorQCAqKgorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AgKioKK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQCAqKgorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQCAqLworQAorQCp2b2lkIENvbnZvbHZlICgKK0AqICAgIFdvcmQxNiB4W10sICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiBoW10sICAgICAgICAvKiAoaSkgICAgIDogaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiB5W10sICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiBMICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqKQorQCAKK0AgcjAgLS0tIHhbXQorQCByMSAtLS0gaFtdCitAIHIyIC0tLSB5W10KK0AgcjMgLS0tIEwKKworCS5zZWN0aW9uICAudGV4dCAKKyAgICAgICAgLmdsb2JhbCAgIENvbnZvbHZlX2FzbSAKKworQ29udm9sdmVfYXNtOgorCisgICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCisgICAgICAgIE1PViAgICAgICAgICAgIHIzLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAKKwlNT1YgICAgICAgICAgICByMTEsICMweDgwMDAKKyAgICAgICAgCitMT09QOiAKKyAgICAgICAgQE1PViAgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHMgPSAwCisgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjMsIExTTCAjMSAgICAgICAgICAgICAgICBAIHRtcEggYWRkcmVzcworICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gbiArIDEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdICAgICAgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMxCisgICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAgCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCAgcjksIHIxMCAKKworTE9PUDE6ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCisgICAgICAgIEJMRSAgICAgICAgICAgIEwxCisgICAgICAgIFNVQiAgICAgICAgICAgIHI0LCByNCwgIzgKKyAgICAgICAgTU9WICAgICAgICAgICAgcjksIHI0CisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAorICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKKyAgICAgICAgVlJFVjY0LjE2ICAgICAgRDEsIEQxCisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQgIAorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQwLCBEMSAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMSAgICAKK0wxOiAgICAgICAgICAgICAgICAgIAorICAgICAgICBWQURELlMzMiAgICAgICBEMjAsIEQyMCwgRDIxCisgICAgICAgIFZQQURELlMzMiAgICAgIEQyMCwgRDIwLCBEMjAKKyAgICAgICAgVk1PVi5TMzIgICAgICAgcjUsIEQyMFswXQorICAgICAgICBBREQgICAgICAgICAgICByNSwgcjUsIHI4CisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMTEsIHI1LCBMU0wgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjUsIHI1LCBMU1IgIzE2ICAgICAgICAgICAgICAgICAgIEBleHRyYWN0X2gocykKKyAgICAgICAgQUREICAgICAgICAgICAgcjMsIHIzLCAjMQorICAgICAgICBTVFJIICAgICAgICAgICByNSwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKworCisgICAgICAgIEBNT1YgICAgICAgICAgICByOCwgIzAKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxICAgICAgICAgICAgICAgIEB0bXBIIGFkZHJlc3MKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIzLCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKKyAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyCisgICAgICAgIExEUlNIICAgICAgICAgIHIxNCwgW3I0XQorCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCByOSwgcjEwCisgICAgICAgIFNVQiAgICAgICAgICAgIHI1LCByNSwgIzIKKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgICAgICAKKyAgICAgICAgVk1PVi5TMzIgICAgICAgUTEwLCAjMAorTE9PUDI6CisgICAgICAgIENNUCAgICAgICAgICAgIHI1LCAjMAorICAgICAgICBCTEUgICAgICAgICAgICBMMgorICAgICAgICBTVUIgICAgICAgICAgICByNCwgcjQsICM4CisgICAgICAgIE1PViAgICAgICAgICAgIHI5LCByNAorICAgICAgICBWTEQxLlMxNiAgICAgICBEMCwgW3I2XSEgICAKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDEsIFtyOV0hCisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQKKyAgICAgICAgVlJFVjY0LjE2ICAgICAgRDEsIEQxCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDAsIEQxIAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMgorTDI6CisgICAgICAgIFZBREQuUzMyICAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVlBBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMAorICAgICAgICBWTU9WLlMzMiAgICAgICByNSwgRDIwWzBdCisgICAgICAgIEFERCAgICAgICAgICAgIHI4LCByOCwgcjUKKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxICAKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjgsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisKKworICAgICAgICBATU9WICAgICAgICAgICAgcjgsICMwCisgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjMsIExTTCAjMQorICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIKKyAgICAgICAgTVVMICAgICAgICAgICAgcjgsIHI5LCByMTAKKyAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0KKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOCAKKyAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMworICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKworICAgICAgICBWTU9WLlMzMiAgICAgICBRMTAsICMwCitMT09QMzoKKyAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCisgICAgICAgIEJMRSAgICAgICAgICAgIEwzCisgICAgICAgIFNVQiAgICAgICAgICAgIHI0LCByNCwgIzgKKyAgICAgICAgTU9WICAgICAgICAgICAgcjksIHI0CisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAorICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKKyAgICAgICAgVlJFVjY0LjE2ICAgICAgRDEsIEQxCisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgCisgICAgICAgIEIgICAgICAgICAgICAgIExPT1AzICAgCisKK0wzOgorICAgICAgICBWQURELlMzMiAgICAgICBEMjAsIEQyMCwgRDIxCisgICAgICAgIFZQQURELlMzMiAgICAgIEQyMCwgRDIwLCBEMjAKKyAgICAgICAgVk1PVi5TMzIgICAgICAgcjUsIEQyMFswXQorICAgICAgICBBREQgICAgICAgICAgICByOCwgcjgsIHI1CisgICAgICAgIEFERCAgICAgICAgICAgIHI4LCByMTEsIHI4LCBMU0wgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjgsIHI4LCBMU1IgIzE2ICAgICAgICAgICAgICAgICAgIEBleHRyYWN0X2gocykKKyAgICAgICAgQUREICAgICAgICAgICAgcjMsIHIzLCAjMQorICAgICAgICBTVFJIICAgICAgICAgICByOCwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKworICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gbiArIDEKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByNSwgTFNMICMxICAgICAgICAgICAgICAgIEAgdG1wSCBhZGRyZXNzCisgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAorICAgICAgICBWTU9WLlMzMiAgICAgICBRMTAsICMwCitMT09QNDogICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDQKKyAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAorICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQxLCBbcjldIQorICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAgCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDAsIEQxICAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgIExPT1A0ICAgIAorTDQ6ICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZBREQuUzMyICAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVlBBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMAorICAgICAgICBWTU9WLlMzMiAgICAgICByNSwgIEQyMFswXQorICAgICAgICBBREQgICAgICAgICAgICByNSwgcjExLCByNSwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI1LCByNSwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjUsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICByMywgIzY0CisgICAgICAgIEJMVCAgICAgICAgICAgIExPT1AKKyAgICAgICAgICAgICAgICAKK0NvbnZvbHZlX2FzbV9lbmQ6IAorIAorICAgICAgICBMRE1GRCAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQorICAgIAorICAgICAgICBARU5ERlVOQworICAgICAgICAuRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzM5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCkBAIC0wLDAgKzEsMTUxIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAc3RhdGljIHZvaWQgY29yX2hfdmVjXzAxMigNCitACQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgKi8NCitACQlXb3JkMTYgdmVjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgdmVjdG9yICgvOCkgdG8gY29ycmVsYXRlIHdpdGggaFtdICovDQorQAkJV29yZDE2IHRyYWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQAkJV29yZDE2IHNpZ25bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2lnbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQAkJV29yZDE2IHJyaXhpeFtdW05CX1BPU10sICAgICAgICAgICAgICAvKiAoaSkgY29ycmVsYXRpb24gb2YgaFt4XSB3aXRoIGhbeF0gICAgICAqLw0KK0AJCVdvcmQxNiBjb3JfMVtdLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KK0AJCVdvcmQxNiBjb3JfMltdICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KK0ApDQorQHIwIC0tLS0gaFtdDQorQHIxIC0tLS0gdmVjW10NCitAcjIgLS0tLSB0cmFjaw0KK0ByMyAtLS0tIHNpZ25bXQ0KK0ByNCAtLS0tIHJyaXhpeFtdW05CX1BPU10NCitAcjUgLS0tLSBjb3JfMVtdDQorQHI2IC0tLS0gY29yXzJbXQ0KKw0KKyAgICAgICAgICAgICAgLnNlY3Rpb24gLnRleHQgDQorCSAgICAgIC5nbG9iYWwgIGNvcl9oX3ZlY18wMTJfYXNtDQorDQorY29yX2hfdmVjXzAxMl9hc206DQorDQorICAgICAgICAgICAgIFNUTUZEICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9DQorCSAgICAgTERSICAgICAgICAgICByNCwgW3IxMywgIzQwXSAgICAgICAgICAgICAgICAgICAgQGxvYWQgcnJpeGl4W11bTkJfUE9TXQ0KKwkgICAgIEFERCAgICAgICAgICAgcjcsIHI0LCByMiwgTFNMICM1ICAgICAgICAgICAgICAgIEByNyAtLS0gcDAgPSBycml4aXhbdHJhY2tdDQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpPTANCisNCisJICAgICBAcjAgLS0tIGhbXSwgcjEgLS0tIHZlY1tdLCAgcjIgLS0tIHBvcw0KKwkgICAgIEByMyAtLS0gc2lnbltdLCByNCAtLS0gaSwgcjcgLS0tIHAwDQorDQorTE9PUGk6DQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAwDQorCSAgICAgTU9WICAgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMiA9IDANCisJICAgICBBREQgICAgICAgICAgIHI5LCByMSwgcjIsIExTTCAjMSAgICAgICAgICAgICAgICBAcDIgPSAmdmVjW3Bvc10NCisJICAgICBNT1YgICAgICAgICAgIHIxMCwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcDEgPSBoDQorCSAgICAgUlNCICAgICAgICAgICByMTEsIHIyLCAjNjIgICAgICAgICAgICAgICAgICAgICAgQGo9NjItcG9zDQorDQorTE9PUGoxOg0KKwkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgIA0KKwkgICAgIExEUlNIICAgICAgICAgcjgsICBbcjldLCAjMg0KKwkgICAgIExEUlNIICAgICAgICAgcjE0LCBbcjldDQorCSAgICAgU1VCUyAgICAgICAgICByMTEsIHIxMSwgIzENCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByOCwgcjUNCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNiwgcjEyLCByMTQsIHI2CSANCisJICAgICBCR0UgICAgICAgICAgIExPT1BqMQ0KKw0KKwkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAKnAxKysNCisJICAgICBNT1YgICAgICAgICAgIHI2LCByNiwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMiA9IChMX3N1bTIgPDwgMikNCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByMTQsIHI1DQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCAjMHg4MDAwDQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gKExfc3VtMSA8PCAyKQ0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNCAgICAgICAgIA0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0DQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI5LCBBU1IgIzE2DQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjYsIHIxMCwgQVNSICMxNg0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByMywgcjIsIExTTCAjMSAgICAgICAgICAgICAgICAgQGFkZHJlc3Mgb2Ygc2lnbltwb3NdDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjgsIHI3LCAjMzINCisgICAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyOV0sICMyICAgICAgICAgICAgICAgICAJICBAc2lnbltwb3NdDQorCSAgICAgTERSU0ggICAgICAgICByMTEsIFtyOV0gICAgICAgICAgICAgICAgICAgICAgICAgIEBzaWduW3BvcyArIDFdDQorCSAgICAgTVVMICAgICAgICAgICByMTIsIHI1LCByMTANCisJICAgICBNVUwgICAgICAgICAgIHIxNCwgcjYsIHIxMQ0KKwkgICAgIE1PViAgICAgICAgICAgcjUsIHIxMiwgQVNSICMxNQ0KKwkgICAgIE1PViAgICAgICAgICAgcjYsIHIxNCwgQVNSICMxNQ0KKwkgICAgIExEUiAgICAgICAgICAgcjksICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgIA0KKwkgICAgIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdDQorICAgICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjddLCAjMiAgICAgICAgICAgICAgICAgICAgICBAKnAwKysNCisJICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3I4XSAgICAgICAgICAgICAgICAgICAgICAgICAgQCpwMysrDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI5LCByNCwgTFNMICMxDQorCSAgICAgQUREICAgICAgICAgICByMTIsIHIxMiwgcjQsIExTTCAjMQ0KKwkgICAgIEFERCAgICAgICAgICAgcjUsIHI1LCByMTANCisJICAgICBBREQgICAgICAgICAgIHI2LCByNiwgcjExDQorCSAgICAgU1RSSCAgICAgICAgICByNSwgW3I5XQ0KKwkgICAgIFNUUkggICAgICAgICAgcjYsIFtyMTJdDQorDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjIsIHIyLCAjNA0KKyANCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IDANCisJICAgICBNT1YgICAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gMA0KKwkgICAgIEFERCAgICAgICAgICAgcjksIHIxLCByMiwgTFNMICMxICAgICAgICAgICAgICAgIEBwMiA9ICZ2ZWNbcG9zXQ0KKwkgICAgIE1PViAgICAgICAgICAgcjEwLCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwMSA9IGgNCisJICAgICBSU0IgICAgICAgICAgIHIxMSwgcjIsICM2MiAgICAgICAgICAgICAgICAgICAgICBAaj02Mi1wb3MNCisJICAgICBBREQgICAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgICAgICBAaSsrDQorDQorTE9PUGoyOg0KKwkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgIA0KKwkgICAgIExEUlNIICAgICAgICAgcjgsICBbcjldLCAjMg0KKwkgICAgIExEUlNIICAgICAgICAgcjE0LCBbcjldDQorCSAgICAgU1VCUyAgICAgICAgICByMTEsIHIxMSwgIzENCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByOCwgcjUNCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNiwgcjEyLCByMTQsIHI2CSANCisJICAgICBCR0UgICAgICAgICAgIExPT1BqMg0KKw0KKwkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAKnAxKysNCisJICAgICBNT1YgICAgICAgICAgIHI2LCByNiwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMiA9IChMX3N1bTIgPDwgMikNCisgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByMTQsIHI1DQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCAjMHg4MDAwDQorICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gKExfc3VtMSA8PCAyKQ0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNCAgICAgICAgDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI1LCByMTQNCisNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjksIEFTUiAjMTYNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNiwgcjEwLCBBU1IgIzE2DQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjksIHIzLCByMiwgTFNMICMxICAgICAgICAgICAgICAgICBAYWRkcmVzcyBvZiBzaWduW3Bvc10NCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjcsICMzMg0KKyAgICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I5XSwgIzIgICAgICAgICAgICAgICAgIAkgIEBzaWduW3Bvc10NCisJICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3I5XSAgICAgICAgICAgICAgICAgICAgICAgICAgQHNpZ25bcG9zICsgMV0NCisJICAgICBNVUwgICAgICAgICAgIHIxMiwgcjUsIHIxMA0KKwkgICAgIE1VTCAgICAgICAgICAgcjE0LCByNiwgcjExDQorCSAgICAgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1DQorCSAgICAgTU9WICAgICAgICAgICByNiwgcjE0LCBBU1IgIzE1DQorCSAgICAgTERSICAgICAgICAgICByOSwgIFtyMTMsICM0NF0gICAgICAgICAgICAgICAgICAgDQorCSAgICAgTERSICAgICAgICAgICByMTIsIFtyMTMsICM0OF0NCisgICAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKw0KKwkgICAgIExEUlNIICAgICAgICAgcjExLCBbcjhdICAgICAgICAgICAgICAgICAgICAgICAgICBAKnAzKysNCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOSwgcjksIHI0LCBMU0wgIzENCisJICAgICBBREQgICAgICAgICAgIHIxMiwgcjEyLCByNCwgTFNMICMxDQorCSAgICAgQUREICAgICAgICAgICByNSwgcjUsIHIxMA0KKwkgICAgIEFERCAgICAgICAgICAgcjYsIHI2LCByMTENCisJICAgICBTVFJIICAgICAgICAgIHI1LCBbcjldDQorCSAgICAgU1RSSCAgICAgICAgICByNiwgW3IxMl0NCisJICAgICBBREQgICAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQGkrMQ0KKwkgICAgIEFERCAgICAgICAgICAgcjIsIHIyLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICBAcG9zICs9IFNURVANCisJICAgICBDTVAgICAgICAgICAgIHI0LCAjMTYNCisJICAgICANCisJICAgICBCTFQgICAgICAgICAgIExPT1BpDQorICAgICAgICAgDQordGhlX2VuZDoNCisgICAgICAgICAgICAgTERNRkQgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0NCisgICAgICAgICAgICAgDQorCSAgICAgLkVORAkgDQorICAgICAgICANCisJDQorCSAgDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4NTNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKQEAgLTAsMCArMSwxMDAgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0B2b2lkIFByZWRfbHQ0KA0KK0AgICAgIFdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAqLw0KK0AgICAgIFdvcmQxNiBUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLw0KK0AgICAgIFdvcmQxNiBmcmFjLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBvZiBsYWcgICAqLw0KK0AgICAgIFdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzdWJmcmFtZSBzaXplICAgICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCByMCAgICAtLS0gIGV4Y1tdDQorQCByMSAgICAtLS0gIFQwDQorQCByMiAgICAtLS0gIGZyYWMNCitAIHIzICAgIC0tLSAgTF9zdWJmcg0KKyANCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0IA0KKyAgICAgICAgICAuZ2xvYmFsICAgcHJlZF9sdDRfYXNtDQorICAgICAgICAgIC5leHRlcm4gICBpbnRlcjRfMg0KKw0KK3ByZWRfbHQ0X2FzbToNCisNCisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBTVUIgICAgICAgICAgIHI0LCByMCwgcjEsIExTTCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEAgeCA9IGV4YyAtIFQwDQorICAgICAgICAgIFJTQiAgICAgICAgICAgcjIsIHIyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmcmFjID0gLSBmcmFjDQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjQsIHI0LCAjMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB4IC09IExfSU5URVJQT0wyIC0gMQ0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHIyLCAjMA0KKyAgICAgICAgICBBRERMVCAgICAgICAgIHIyLCByMiwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZnJhYyArPSBVUF9TQU1QDQorICAgICAgICAgIFNVQkxUICAgICAgICAgcjQsIHI0LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB4LS0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIExhYmxlMQ0KKyAgICAgICAgICBSU0IgICAgICAgICAgIHIyLCByMiwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgayA9IFVQX1NBTVAgLSAxIC0gZnJhYw0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaiA9IDANCisJICBBREQgICAgICAgICAgIHIxMSwgcjExLCByMiwgTFNMICM2ICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGludGVyNF8yW2tdW10NCisNCisJICBWTEQxLlMxNiAgICAgIHtRMCwgUTF9LCBbcjExXSENCisJICBWTEQxLlMxNiAgICAgIHtRMiwgUTN9LCBbcjExXSENCisgICAgICAgICAgDQorCSAgTU9WICAgICAgICAgICByNiwgIzB4ODAwMCANCisNCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTQsIFE1fSwgW3I0XSEgICAgICAgICAgICAgICAgICAgICAgICAgICBAbG9hZCAxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTYsIFE3fSwgW3I0XSEgICAgICAgICAgICAgICAgICAgICAgICAgICBAbG9hZCAxNiB4W10NCisNCitMT09QOg0KKyAgICAgICAgICBWUURNVUxMLlMxNiAgIFExNSwgRDgsIEQwDQorICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEOSwgRDENCisgICAgICAgICAgVlFETUxBTC5TMTYgICBRMTUsIEQxMCwgRDINCisgICAgICAgICAgVlFETUxBTC5TMTYgICBRMTUsIEQxMSwgRDMNCisgICAgICAgIA0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDEyLCBENA0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDEzLCBENQ0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDE0LCBENg0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDE1LCBENw0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3I0XSwgIzIgICAgICAgICAgICAgICAgDQorICAgICAgICAgIA0KKyAgICAgICAgICBWRVhULlMxNiAgICAgIEQ4LCBEOCwgRDksICMxDQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDksIEQ5LCBEMTAsICMxDQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDEwLCBEMTAsIEQxMSwgIzENCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTEsIEQxMSwgRDEyLCAjMQ0KKyAgICAgICAgICBWRFVQLlMxNiAgICAgIEQyNCwgcjEyDQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDEyLCBEMTIsIEQxMywgIzENCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTMsIEQxMywgRDE0LCAjMQ0KKyAgICAgDQorICAgICAgICAgIFZRQURELlMzMiAgICAgRDMwLCBEMzAsIEQzMQ0KKwkgIE1PViAgICAgICAgICAgcjExLCAjMHg4MDAwICAgICAgICAgIA0KKyAgICAgICAgICBWUEFERC5TMzIgICAgIEQzMCwgRDMwLCBEMzANCisgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxDQorICAgICAgICAgIFZNT1YuUzMyICAgICAgcjEyLCBEMzBbMF0NCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTQsIEQxNCwgRDE1LCAjMSAgICAgICAgICANCisNCisgICAgICAgICAgUUFERCAgICAgICAgICByMSwgcjEyLCByMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gKExfc3VtIDw8IDIpDQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDE1LCBEMTUsIEQyNCwgIzENCisgICAgICAgICAgUUFERCAgICAgICAgICByNSwgcjEsIHI2ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIxLCByNSwgQVNSICMxNg0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHI4LCByMw0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxLCBbcjBdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZXhjW2pdID0gKExfc3VtICsgMHg4MDAwKSA+PiAxNg0KKyAgICAgICAgICBCTFQgICAgICAgICAgIExPT1ANCisgICAgICAgICAgICAgICAgICAgIA0KK3ByZWRfbHQ0X2VuZDoNCisJCSAgICAgDQorICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgDQorTGFibGUxOg0KKyAgICAgICAgICAud29yZCAgIAlpbnRlcjRfMg0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWU2YjIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMKQEAgLTAsMCArMSwxMjcgQEAKK0AvKgorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorQCAqKgorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AgKioKK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQCAqKgorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQCAqLworQAorQHZvaWQgUmVzaWR1ICgKK0AgICAgV29yZDE2IGFbXSwgLyogKGkpICAgICA6IHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICovCitAICAgIFdvcmQxNiB4W10sIC8qIChpKSAgICAgOiBzcGVlY2ggc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQCAgICBXb3JkMTYgeVtdLCAvKiAobykgICAgIDogcmVzaWR1YWwgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AgICAgV29yZDE2IGxnICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitAKQorQGFbXSAgICAgICAgUk4gICAgIHIwCitAeFtdICAgICAgICBSTiAgICAgcjEKK0B5W10gICAgICAgIFJOICAgICByMgorQGxnICAgICAgICAgUk4gICAgIHIzCisKKwkuc2VjdGlvbiAgIC50ZXh0CisgICAgICAgIC5nbG9iYWwgICAgUmVzaWR1X29wdCAKKworUmVzaWR1X29wdDoKKworICAgICAgICBTVE1GRCAgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0gCisgICAgICAgIFNVQiAgICAgICAgICAgIHI3LCByMywgIzQgICAgICAgICAgICAgICAgICAgICAgIEBpID0gbGcgLSA0CisgICAgICAgIAorICAgICAgICBWTEQxLlMxNiAgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjBdISAgICAgICAgICAgICAgQGdldCBhbGwgYVtdICAKKwlWTEQxLlMxNiAgICAgICB7RDR9LCBbcjBdIQorICAgICAgICBWTU9WLlMzMiAgICAgICBROCwgICMweDgwMDAKKyAgICAgICAgCitMT09QMToKKyAgICAgICAgQUREICAgICAgICAgICAgcjksIHIxLCByNywgTFNMICMxICAgICAgICAgICAgICAgQGNvcHkgdGhlIGFkZHJlc3MKKyAgICAgICAgQUREICAgICAgICAgICAgcjEwLCByMiwgcjcsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjkKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAgICAgICAgICAgICAgICAgICBAZ2V0IHhbaV0sIHhbaSsxXSwgeFtpKzJdLCB4W2krM10KKyAgICAgICAgVlFETVVMTC5TMTYgICAgUTEwLCBENSwgRDBbMF0gICAgICAgICAgICAgICAgICBAZmluaXNoIHRoZSBmaXJzdCBMX211bHQKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMyICAgICAgICAgICAgICAgICAgICAgICBAZ2V0IHRoZSB4W2ktMV0gYWRkcmVzcworICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQwWzFdCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0yXSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMFsyXQorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzYgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktM10gYWRkcmVzcworICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMFszXSAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjOCAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS00XSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzBdICAKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxMCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTVdIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDFbMV0gCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjMTIgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS02XSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzJdICAKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxNCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTddIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDFbM10gIAorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzE2ICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktOF0gYWRkcmVzcworICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMlswXSAgCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjMTggICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS05XSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzFdICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMyMCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTEwXSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzJdICAKKworCVNVQiAgICAgICAgICAgIHI4LCByOSwgIzIyICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTFdIGFkZHJlc3MKKwlWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKKwlWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMlszXQorCisJU1VCICAgICAgICAgICAgcjgsIHI5LCAjMjQgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0xMl0gYWRkcmVzcworCVZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQorCVZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQzWzBdCisKKwlTVUIgICAgICAgICAgICByOCwgcjksICMyNiAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTEzXSBhZGRyZXNzCisJVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCisJVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDNbMV0KKworCVNVQiAgICAgICAgICAgIHI4LCByOSwgIzI4ICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTRdIGFkZHJlc3MKKwlWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKKwlWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEM1syXQorCisJU1VCICAgICAgICAgICAgcjgsIHI5LCAjMzAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0xNV0gYWRkcmVzcworCVZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQorCVZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQzWzNdCisKKwlTVUIgICAgICAgICAgICByOCwgcjksICMzMiAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTE2XSBhZGRyZXNzCisJVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCisJVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDRbMF0KKworICAgICAgICBTVUIgICAgICAgICAgICByNywgcjcsICM0ICAgICAgICAgICAgICAgICAgICAgICBAaS09NAorICAgICAgICBWUVNITC5TMzIgICAgICBRMTAsIFExMCwgIzQKKyAgICAgICAgVlFBREQuUzMyICAgICAgUTEwLCBRMTAsIFE4CisgICAgICAgIFZTSFJOLlMzMiAgICAgIEQ1LCBRMTAsICMxNgorICAgICAgICBWU1QxLlMxNiAgICAgICBENSwgW3IxMF0hCisgICAgICAgIENNUCAgICAgICAgICAgIHI3LCAgIzAKKworICAgICAgICBCR0UgICAgICAgICAgICBMT09QMQorCitSZXNpZHVfYXNtX2VuZDogCisgCisgICAgICAgIExETUZEICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9CisgICAgCisgICAgICAgIEBFTkRGVU5DCisgICAgICAgIC5FTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk1N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucwpAQCAtMCwwICsxLDEzOCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitAICAgICAgICAgICAgICAgICAgIA0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0B2b2lkIFNjYWxlX3NpZygNCitAICAgICAgICAgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IHNpZ25hbCB0byBzY2FsZSAgICAgICAgICAgICAgICovDQorQCAgICAgICAgICAgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzaXplIG9mIHhbXSAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgICAgICAgICAgICBXb3JkMTYgZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhwb25lbnQ6IHggPSByb3VuZCh4IDw8IGV4cCkgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgIHhbXSAgIC0tLSAgcjANCitAICBsZyAgICAtLS0gIHIxDQorQCAgZXhwICAgLS0tICByMg0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQgDQorICAgICAgICAgIC5nbG9iYWwgICBTY2FsZV9zaWdfb3B0DQorDQorU2NhbGVfc2lnX29wdDoNCisNCisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI0LCAjNA0KKyAgICAgICAgICBWTU9WLlMzMiAgICAgIFExNSwgIzB4ODAwMCAgICAgICANCisgICAgICAgICAgVkRVUC5TMzIgICAgICBRMTQsIHIyICANCisgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSB4W10gYWRkcmVzcyAgICANCisgICAgICAgICAgQ01QICAgICAgICAgICByMSwgIzY0DQorICAgICAgICAgIE1PVkVRICAgICAgICAgcjQsICMxDQorICAgICAgICAgIEJFUSAgICAgICAgICAgTE9PUA0KKwkgIENNUCAgICAgICAgICAgcjEsICMxMjgNCisJICBNT1ZFUSAgICAgICAgIHI0LCAjMg0KKwkgIEJFUSAgICAgICAgICAgTE9PUA0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHIxLCAjMjU2DQorICAgICAgICAgIEJFUSAgICAgICAgICAgTE9PUA0KKwkgIENNUCAgICAgICAgICAgcjEsICM4MA0KKwkgIE1PVkVRICAgICAgICAgcjQsICMxDQorCSAgQkVRICAgICAgICAgICBMT09QMQ0KKw0KK0xPT1AxOg0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRMCwgUTF9LCBbcjVdISAgICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXSAgICAgDQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEwLCBEMCwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEMSwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEyLCBEMiwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEzLCBEMywgIzE2DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEwLCBRMTAsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMSwgUTExLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTIsIFExMiwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEzLCBRMTMsIFExNA0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNiwgUTEwLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTcsIFExMSwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE4LCBRMTIsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxOSwgUTEzLCBRMTUNCisgICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdDQorDQorTE9PUDogICAgICAgICAgICAgICAgDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1EyLCBRM30sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1E0LCBRNX0sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1E2LCBRN30sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorDQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTgsIEQwLCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBROSwgRDEsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDIsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMSwgRDMsICMxNiAgICAgDQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTgsIFE4LCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBROSwgUTksIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMCwgUTEwLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTEsIFExMSwgUTE0DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE2LCBROCwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE3LCBROSwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE4LCBRMTAsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxOSwgUTExLCBRMTUNCisgICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdDQorDQorICAgDQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEyLCBENCwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEzLCBENSwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEwLCBENiwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBENywgIzE2DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEyLCBRMTIsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMywgUTEzLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTAsIFExMCwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTExLCBRMTEsIFExNA0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNiwgUTEyLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTcsIFExMywgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE4LCBRMTAsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxOSwgUTExLCBRMTUNCisgICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdDQorDQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEwLCBEOCwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEOSwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEyLCBEMTAsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMywgRDExLCAjMTYNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTAsIFExMCwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTExLCBRMTEsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMiwgUTEyLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTMsIFExMywgUTE0DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE2LCBRMTAsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNywgUTExLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMiwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTMsIFExNQ0KKyAgICAgICAgICBWU1QxLlMxNiAgICAgIHtROCwgUTl9LCBbcjBdISAgICAgICAgICAgICAgICAgQHN0b3JlIDE2IFdvcmQxNiB4W10NCisNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTAsIEQxMiwgIzE2ICAgDQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEMTMsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMiwgRDE0LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTMsIEQxNSwgIzE2DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEwLCBRMTAsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMSwgUTExLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTIsIFExMiwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEzLCBRMTMsIFExNA0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNiwgUTEwLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTcsIFExMSwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE4LCBRMTIsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxOSwgUTEzLCBRMTUgDQorICAgICAgICAgIFZTVDEuUzE2ICAgICAge1E4LCBROX0sIFtyMF0hICAgICAgICAgICAgICAgICBAc3RvcmUgMTYgV29yZDE2IHhbXSAgDQorICAgICAgICAgIFNVQlMgICAgICAgICAgcjQsIHI0LCAjMQ0KKyAgICAgICAgICBCR1QgICAgICAgICAgIExPT1AgICAgIA0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgIA0KK1NjYWxlX3NpZ19hc21fZW5kOg0KKw0KKyAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gDQorICAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgIC5FTkQNCisgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2Q0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKQEAgLTAsMCArMSwxMDYgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0B2b2lkIFN5bl9maWx0KA0KK0AgICAgIFdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiBtZW1bXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXJpbmcuICAgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgYVtdICAgIC0tLSAgIHIwDQorQCB4W10gICAgLS0tICAgcjENCitAIHlbXSAgICAtLS0gICByMg0KK0AgbWVtW10gIC0tLSAgIHIzDQorQCBtIC0tLSAgMTYgIGxnIC0tLSA4MCAgdXBkYXRlIC0tLSAxDQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dCANCisgICAgICAgICAgLmdsb2JhbCAgIFN5bl9maWx0X2FzbQ0KKw0KK1N5bl9maWx0X2FzbToNCisNCisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBTVUIgICAgICAgICAgIHIxMywgcjEzLCAjNzAwICAgICAgICAgICAgICAgICAgIEAgeV9idWZbTF9GUkFNRTE2ayArIE0xNmtdDQorICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjQsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IG1lbVtdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjEzICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgeXkgPSB5X2J1ZiBhZGRyZXNzDQorDQorICAgICAgICAgIEAgZm9yKGkgPSAwQCBpIDwgbUAgaSsrKQ0KKyAgICAgICAgICBAew0KKyAgICAgICAgICBAICAgICp5eSsrID0gbWVtW2ldQA0KKyAgICAgICAgICBAfSANCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjRdISAgICAgICAgICBAbG9hZCAxNiBtZW1zDQorCSAgVlNUMS5TMTYgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjVdISAgICAgICAgICBAc3RvcmUgMTYgbWVtW10gdG8gKnl5DQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjUsIFtyMF0sICMyICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMF0NCisgICAgICAgICAgTU9WICAgICAgICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBBU1IgIzEgICAgICAgICAgICAgICAgICAgQCBhMCA9IGFbMF0gPj4gMQ0KKyAgICAgICAgICBWTU9WLlMxNiAgICAgIEQ4WzBdLCByNQ0KKyAgICAgICAgICBAIGxvYWQgYWxsIGFbXQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hICAgICAgICAgIEAgbG9hZCBhWzFdIH4gYVsxNl0NCisJICBWUkVWNjQuMTYgICAgIEQwLCBEMA0KKwkgIFZSRVY2NC4xNiAgICAgRDEsIEQxDQorCSAgVlJFVjY0LjE2ICAgICBEMiwgRDINCisJICBWUkVWNjQuMTYgICAgIEQzLCBEMyANCisJICBNT1YgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCB0aW1lcw0KKwkgIE1PViAgICAgICAgICAgcjEwLCByMTMgICAgICAgICAgICAgICAgICAgICAgICAgQCB0ZW1wID0geV9idWYNCisJICBBREQgICAgICAgICAgIHI0LCByMTMsICMzMiAgICAgICAgICAgICAgICAgICAgIEAgeXlbaV0gYWRkcmVzcw0KKw0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtENCwgRDUsIEQ2LCBEN30sIFtyMTBdISAgICAgICAgIEAgZmlyc3QgMTYgdGVtcF9wDQorDQorU1lOX0xPT1A6DQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHhbaV0NCisJICBNVUwgICAgICAgICAgIHIxMiwgcjYsIHI1ICAgICAgICAgICAgICAgICAgICAgIEAgTF90bXAgPSB4W2ldICogYTANCisJICBBREQgICAgICAgICAgIHIxMCwgcjQsIHI4LCBMU0wgIzEgICAgICAgICAgICAgIEAgeVtpXSwgeXlbaV0gYWRkcmVzcw0KKw0KKwkgIFZEVVAuUzMyICAgICAgUTEwLCByMTINCisJICBWTVVMTC5TMTYgICAgIFE1LCBEMywgRDQgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgIFE1LCBEMiwgRDUNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICBRNSwgRDEsIEQ2DQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgUTUsIEQwLCBENw0KKyAgICAgICAgICBWRVhULjggICAgICAgIEQ0LCBENCwgRDUsICMyDQorICAgICAgICAgIFZFWFQuOCAgICAgICAgRDUsIEQ1LCBENiwgIzINCisgICAgICAgICAgVkVYVC44ICAgICAgICBENiwgRDYsIEQ3LCAjMg0KKyAgICAgICAgICBWUEFERC5TMzIgICAgIEQxMiwgRDEwLCBEMTENCisgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxDQorICAgICAgICAgIFZQQURELlMzMiAgICAgRDEwLCBEMTIsIEQxMg0KKw0KKwkgIFZEVVAuUzMyICAgICAgUTcsIEQxMFswXQ0KKw0KKwkgIFZTVUIuUzMyICAgICAgUTksIFExMCwgUTcNCisgICAgICAgICAgVlFSU0hSTi5TMzIgICBEMjAsIFE5LCAjMTIgICANCisgICAgICAgICAgVk1PVi5TMTYgICAgICByOSwgRDIwWzBdDQorICAgICAgICAgIFZFWFQuOCAgICAgICAgRDcsIEQ3LCBEMjAsICMyDQorICAgICAgICAgIENNUCAgICAgICAgICAgcjgsICM4MA0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI5LCBbcjEwXSAgICAgICAgICAgICAgICAgICAgICAgIEAgeXlbaV0NCisgICAgICAgICAgU1RSSCAgICAgICAgICByOSwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICBAIHlbaV0gICAgICAgICAgCSAgICAgICAgIA0KKwkgIA0KKyAgICAgICAgICBCTFQgICAgICAgICAgIFNZTl9MT09QDQorIA0KKyAgICAgICAgICBAIHVwZGF0ZSBtZW1bXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI1LCByMTMsICMxNjAgICAgICAgICAgICAgICAgICAgIEAgeXlbNjRdIGFkZHJlc3MNCisJICBWTEQxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyNV0hDQorCSAgVlNUMS5TMTYgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjNdISAgICAgICAgICAgICAgDQorDQorU3luX2ZpbHRfYXNtX2VuZDoNCisgDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjEzLCByMTMsICM3MDAJCSAgICAgDQorICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlZDY3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGF1dG9jb3JyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOkNvbXB1dGUgYXV0b2NvcnJlbGF0aW9ucyBvZiBzaWduYWwgd2l0aCB3aW5kb3dpbmcgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiaGFtX3dpbmQudGFiIg0KKw0KK3ZvaWQgQXV0b2NvcnIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IElucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiByX2hbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNTogQXV0b2NvcnJlbGF0aW9ucyAgKG1zYikgICAgICAgICAgICovDQorCQlXb3JkMTYgcl9sW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IEF1dG9jb3JyZWxhdGlvbnMgIChsc2IpICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBpLCBub3JtLCBzaGlmdDsNCisJV29yZDE2IHlbTF9XSU5ET1ddOw0KKwlXb3JkMzIgTF9zdW0sIExfc3VtMSwgTF90bXAsIEZfTEVOOw0KKwlXb3JkMTYgKnAxLCpwMiwqcDM7DQorCWNvbnN0IFdvcmQxNiAqcDQ7DQorCS8qIFdpbmRvd2luZyBvZiBzaWduYWwgKi8NCisJcDEgPSB4Ow0KKwlwNCA9IHZvX3dpbmRvdzsNCisJcDMgPSB5Ow0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9XSU5ET1c7IGkrPTQpDQorCXsNCisJCSpwMysrID0gdm9fbXVsdF9yKCgqcDErKyksICgqcDQrKykpOw0KKwkJKnAzKysgPSB2b19tdWx0X3IoKCpwMSsrKSwgKCpwNCsrKSk7DQorCQkqcDMrKyA9IHZvX211bHRfcigoKnAxKyspLCAoKnA0KyspKTsNCisJCSpwMysrID0gdm9fbXVsdF9yKCgqcDErKyksICgqcDQrKykpOw0KKwl9DQorDQorCS8qIGNhbGN1bGF0ZSBlbmVyZ3kgb2Ygc2lnbmFsICovDQorCUxfc3VtID0gdm9fTF9kZXBvc2l0X2goMTYpOyAgICAgICAgICAgICAgIC8qIHNxcnQoMjU2KSwgYXZvaWQgb3ZlcmZsb3cgYWZ0ZXIgcm91bmRpbmcgKi8NCisJZm9yIChpID0gMDsgaSA8IExfV0lORE9XOyBpKyspDQorCXsNCisJCUxfdG1wID0gdm9fTF9tdWx0KHlbaV0sIHlbaV0pOw0KKwkJTF90bXAgPSAoTF90bXAgPj4gOCk7DQorCQlMX3N1bSArPSBMX3RtcDsNCisJfQ0KKw0KKwkvKiBzY2FsZSBzaWduYWwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gYXV0b2NvcnJlbGF0aW9uICovDQorCW5vcm0gPSBub3JtX2woTF9zdW0pOw0KKwlzaGlmdCA9IDQgLSAobm9ybSA+PiAxKTsNCisJaWYoc2hpZnQgPiAwKQ0KKwl7DQorCQlwMSA9IHk7DQorCQlmb3IgKGkgPSAwOyBpIDwgTF9XSU5ET1c7IGkrPTQpDQorCQl7DQorCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7IA0KKwkJCXAxKys7DQorCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7IA0KKwkJCXAxKys7DQorCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7DQorCQkJcDErKzsNCisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsgDQorCQkJcDErKzsNCisJCX0NCisJfQ0KKw0KKwkvKiBDb21wdXRlIGFuZCBub3JtYWxpemUgclswXSAqLw0KKwlMX3N1bSA9IDE7IA0KKwlmb3IgKGkgPSAwOyBpIDwgTF9XSU5ET1c7IGkrPTQpDQorCXsNCisJCUxfc3VtICs9IHZvX0xfbXVsdCh5W2ldLCB5W2ldKTsNCisJCUxfc3VtICs9IHZvX0xfbXVsdCh5W2krMV0sIHlbaSsxXSk7DQorCQlMX3N1bSArPSB2b19MX211bHQoeVtpKzJdLCB5W2krMl0pOw0KKwkJTF9zdW0gKz0gdm9fTF9tdWx0KHlbaSszXSwgeVtpKzNdKTsNCisJfQ0KKw0KKwlub3JtID0gbm9ybV9sKExfc3VtKTsNCisJTF9zdW0gPSAoTF9zdW0gPDwgbm9ybSk7DQorDQorCXJfaFswXSA9IExfc3VtID4+IDE2Ow0KKwlyX2xbMF0gPSAoTF9zdW0gJiAweGZmZmYpPj4xOw0KKw0KKwkvKiBDb21wdXRlIHJbMV0gdG8gclttXSAqLw0KKwlmb3IgKGkgPSAxOyBpIDw9IDg7IGkrKykNCisJew0KKwkJTF9zdW0xID0gMDsNCisJCUxfc3VtID0gMDsNCisJCUZfTEVOID0gKFdvcmQzMikoTF9XSU5ET1cgLSAyKmkpOw0KKwkJcDEgPSB5Ow0KKwkJcDIgPSB5ICsgKDIqaSktMTsNCisJCWRvew0KKwkJCUxfc3VtMSArPSAqcDEgKiAqcDIrKzsNCisJCQlMX3N1bSArPSAqcDErKyAqICpwMjsNCisJCX13aGlsZSgtLUZfTEVOIT0wKTsNCisNCisJCUxfc3VtMSArPSAqcDEgKiAqcDIrKzsNCisNCisJCUxfc3VtMSA9IExfc3VtMTw8bm9ybTsNCisJCUxfc3VtID0gTF9zdW08PG5vcm07DQorDQorCQlyX2hbKDIqaSktMV0gPSBMX3N1bTEgPj4gMTU7DQorCQlyX2xbKDIqaSktMV0gPSBMX3N1bTEgJiAweDAwMDA3ZmZmOw0KKwkJcl9oWygyKmkpXSA9IExfc3VtID4+IDE1Ow0KKwkJcl9sWygyKmkpXSA9IExfc3VtICYgMHgwMDAwN2ZmZjsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXpfaXNwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTlmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIEZpbGU6IGF6X2lzcC5jDQorKg0KKyogIERlc2NyaXB0aW9uOg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqIENvbXB1dGUgdGhlIElTUHMgZnJvbSAgdGhlIExQQyBjb2VmZmljaWVudHMgIChvcmRlcj1NKSAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFRoZSBJU1BzIGFyZSB0aGUgcm9vdHMgb2YgdGhlIHR3byBwb2x5bm9taWFscyBGMSh6KSBhbmQgRjIoeikgICAgICAgICAqDQorKiBkZWZpbmVkIGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICBGMSh6KSA9IEEoeikgKyB6Xi1tIEEoel4tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBhbmQgICAgICAgICAgRjIoeikgPSBBKHopIC0gel4tbSBBKHpeLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRm9yIGEgZXZlbiBvcmRlciBtPTJuLCBGMSh6KSBoYXMgTS8yIGNvbmp1Z2F0ZSByb290cyBvbiB0aGUgdW5pdCAgICAgICoNCisqIGNpcmNsZSBhbmQgRjIoeikgaGFzIE0vMi0xIGNvbmp1Z2F0ZSByb290cyBvbiB0aGUgdW5pdCBjaXJjbGUgaW4gICAgICAqDQorKiBhZGRpdGlvbiB0byB0d28gcm9vdHMgYXQgMCBhbmQgcGkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIEZvciBhIDE2dGggb3JkZXIgTFAgYW5hbHlzaXMsIEYxKHopIGFuZCBGMih6KSBjYW4gYmUgd3JpdHRlbiBhcyAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICBGMSh6KSA9ICgxICsgYVtNXSkgICBQUk9EVUNUICAoMSAtIDIgY29zKHdfaSkgel4tMSArIHpeLTIgKSAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgaT0wLDIsNCw2LDgsMTAsMTIsMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICBGMih6KSA9ICgxIC0gYVtNXSkgKDEgLSB6Xi0yKSBQUk9EVUNUICgxIC0gMiBjb3Mod19pKSB6Xi0xICsgel4tMiApICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0xLDMsNSw3LDksMTEsMTMgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogVGhlIElTUHMgYXJlIHRoZSBNLTEgZnJlcXVlbmNpZXMgd19pLCBpPTAuLi5NLTIgcGx1cyB0aGUgbGFzdCAgICAgICAgICoNCisqIHByZWRpY3RvciBjb2VmZmljaWVudCBhW01dLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJzdGRpby5oIg0KKyNpbmNsdWRlICJncmlkMTAwLnRhYiINCisNCisjZGVmaW5lIE0gICAxNg0KKyNkZWZpbmUgTkMgIChNLzIpDQorDQorLyogbG9jYWwgZnVuY3Rpb24gKi8NCitzdGF0aWMgX19pbmxpbmUgV29yZDE2IENoZWJwczIoV29yZDE2IHgsIFdvcmQxNiBmW10sIFdvcmQzMiBuKTsNCisNCit2b2lkIEF6X2lzcCgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IHByZWRpY3RvciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBJbW1pdHRhbmNlIHNwZWN0cmFsIHBhaXJzICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG9sZF9pc3BbXSAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb2xkIGlzcFtdIChpbiBjYXNlIG5vdCBmb3VuZCBNIHJvb3RzKSAgKi8NCisJICAgKQ0KK3sNCisJV29yZDMyIGksIGosIG5mLCBpcCwgb3JkZXI7DQorCVdvcmQxNiB4bG93LCB5bG93LCB4aGlnaCwgeWhpZ2gsIHhtaWQsIHltaWQsIHhpbnQ7DQorCVdvcmQxNiB4LCB5LCBzaWduLCBleHA7DQorCVdvcmQxNiAqY29lZjsNCisJV29yZDE2IGYxW05DICsgMV0sIGYyW05DXTsNCisJV29yZDMyIHQwOw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIGZpbmQgdGhlIHN1bSBhbmQgZGlmZiBwb2x5bm9taWFscyBGMSh6KSBhbmQgRjIoeikgICAgICAgICAgICoNCisJICogICAgICBGMSh6KSA9IFtBKHopICsgel5NIEEoel4tMSldICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgIEYyKHopID0gW0EoeikgLSB6Xk0gQSh6Xi0xKV0vKDEtel4tMikgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogZm9yIChpPTA7IGk8TkM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZjFbaV0gPSBhW2ldICsgYVtNLWldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBmMltpXSA9IGFbaV0gLSBhW00taV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIGYxW05DXSA9IDIuMCphW05DXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBmb3IgKGk9MjsgaTxOQzsgaSsrKSAgICAgICAgICAgIERpdmlkZSBieSAoMS16Xi0yKSAgICAgICAgICAqDQorCSAqICAgZjJbaV0gKz0gZjJbaS0yXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJZm9yIChpID0gMDsgaSA8IE5DOyBpKyspDQorCXsNCisJCXQwID0gYVtpXSA8PCAxNTsNCisJCWYxW2ldID0gdm9fcm91bmQodDAgKyAoYVtNIC0gaV0gPDwgMTUpKTsgICAgICAgIC8qID0oYVtpXSthW00taV0pLzIgKi8NCisJCWYyW2ldID0gdm9fcm91bmQodDAgLSAoYVtNIC0gaV0gPDwgMTUpKTsgICAgICAgIC8qID0oYVtpXS1hW00taV0pLzIgKi8NCisJfQ0KKwlmMVtOQ10gPSBhW05DXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMjsgaSA8IE5DOyBpKyspICAgICAgICAgICAgICAgLyogRGl2aWRlIGJ5ICgxLXpeLTIpICovDQorCQlmMltpXSA9IGFkZDEoZjJbaV0sIGYyW2kgLSAyXSk7ICAgICANCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIEZpbmQgdGhlIElTUHMgKHJvb3RzIG9mIEYxKHopIGFuZCBGMih6KSApIHVzaW5nIHRoZSAgICAgICAgICAgICAgICAgKg0KKwkgKiBDaGVieXNoZXYgcG9seW5vbWlhbCBldmFsdWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogVGhlIHJvb3RzIG9mIEYxKHopIGFuZCBGMih6KSBhcmUgYWx0ZXJuYXRpdmVseSBzZWFyY2hlZC4gICAgICAgICAgICAqDQorCSAqIFdlIHN0YXJ0IGJ5IGZpbmRpbmcgdGhlIGZpcnN0IHJvb3Qgb2YgRjEoeikgdGhlbiB3ZSBzd2l0Y2ggICAgICAgICAgKg0KKwkgKiB0byBGMih6KSB0aGVuIGJhY2sgdG8gRjEoeikgYW5kIHNvIG9uIHVudGlsIGFsbCByb290cyBhcmUgZm91bmQuICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAtIEV2YWx1YXRlIENoZWJ5c2hldiBwb2wuIGF0IGdyaWQgcG9pbnRzIGFuZCBjaGVjayBmb3Igc2lnbiBjaGFuZ2UuKg0KKwkgKiAgLSBJZiBzaWduIGNoYW5nZSB0cmFjayB0aGUgcm9vdCBieSBzdWJkaXZpZGluZyB0aGUgaW50ZXJ2YWwgICAgICAgICoNCisJICogICAgMiB0aW1lcyBhbmQgY2tlY2tpbmcgc2lnbiBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJbmYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZm91bmQgZnJlcXVlbmNpZXMgKi8NCisJaXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0b3IgZm9yIGYxIG9yIGYyICAgICAgKi8NCisJY29lZiA9IGYxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCW9yZGVyID0gTkM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl4bG93ID0gdm9ncmlkWzBdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl5bG93ID0gQ2hlYnBzMih4bG93LCBjb2VmLCBvcmRlcik7DQorCWogPSAwOw0KKwl3aGlsZSAoKG5mIDwgTSAtIDEpICYmIChqIDwgR1JJRF9QT0lOVFMpKQ0KKwl7DQorCQlqICsrOw0KKwkJeGhpZ2ggPSB4bG93OyAgICAgICAgICAgICAgICAgICAgIA0KKwkJeWhpZ2ggPSB5bG93OyAgICAgICAgICAgICAgICAgICAgICANCisJCXhsb3cgPSB2b2dyaWRbal07ICAgICAgICAgICAgICAgICAgICANCisJCXlsb3cgPSBDaGVicHMyKHhsb3csIGNvZWYsIG9yZGVyKTsNCisJCWlmICgoeWxvdyAqIHloaWdoKSA8PSAoV29yZDMyKSAwKQ0KKwkJew0KKwkJCS8qIGRpdmlkZSAyIHRpbWVzIHRoZSBpbnRlcnZhbCAqLw0KKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspDQorCQkJew0KKwkJCQl4bWlkID0gKHhsb3cgPj4gMSkgKyAoeGhpZ2ggPj4gMSk7ICAgICAgICAvKiB4bWlkID0gKHhsb3cgKyB4aGlnaCkvMiAqLw0KKwkJCQl5bWlkID0gQ2hlYnBzMih4bWlkLCBjb2VmLCBvcmRlcik7DQorCQkJCWlmICgoeWxvdyAqIHltaWQpIDw9IChXb3JkMzIpIDApDQorCQkJCXsNCisJCQkJCXloaWdoID0geW1pZDsgICAgICAgICANCisJCQkJCXhoaWdoID0geG1pZDsgICAgICAgICAgDQorCQkJCX0gZWxzZQ0KKwkJCQl7DQorCQkJCQl5bG93ID0geW1pZDsgICAgICAgICAgIA0KKwkJCQkJeGxvdyA9IHhtaWQ7ICAgICAgICAgIA0KKwkJCQl9DQorCQkJfQ0KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkJICogICAgeGludCA9IHhsb3cgLSB5bG93Kih4aGlnaC14bG93KS8oeWhpZ2gteWxvdyk7ICAgICAgICAgICAgKg0KKwkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJeCA9IHhoaWdoIC0geGxvdzsNCisJCQl5ID0geWhpZ2ggLSB5bG93Ow0KKwkJCWlmICh5ID09IDApDQorCQkJew0KKwkJCQl4aW50ID0geGxvdzsgICAgICAgICAgICAgICANCisJCQl9IGVsc2UNCisJCQl7DQorCQkJCXNpZ24gPSB5OyAgICAgICAgICAgICAgICAgDQorCQkJCXkgPSBhYnNfcyh5KTsNCisJCQkJZXhwID0gbm9ybV9zKHkpOw0KKwkJCQl5ID0geSA8PCBleHA7DQorCQkJCXkgPSBkaXZfcygoV29yZDE2KSAxNjM4MywgeSk7DQorCQkJCXQwID0geCAqIHk7DQorCQkJCXQwID0gKHQwID4+ICgxOSAtIGV4cCkpOw0KKwkJCQl5ID0gdm9fZXh0cmFjdF9sKHQwKTsgICAgICAgICAvKiB5PSAoeGhpZ2gteGxvdykvKHloaWdoLXlsb3cpIGluIFExMSAqLw0KKwkJCQlpZiAoc2lnbiA8IDApDQorCQkJCQl5ID0gLXk7DQorCQkJCXQwID0geWxvdyAqIHk7ICAgICAgLyogcmVzdWx0IGluIFEyNiAqLw0KKwkJCQl0MCA9ICh0MCA+PiAxMCk7ICAgICAgICAvKiByZXN1bHQgaW4gUTE1ICovDQorCQkJCXhpbnQgPSB2b19zdWIoeGxvdywgdm9fZXh0cmFjdF9sKHQwKSk7ICAgICAgICAvKiB4aW50ID0geGxvdyAtIHlsb3cqeSAqLw0KKwkJCX0NCisJCQlpc3BbbmZdID0geGludDsgICAgICAgICAgICAgICAgDQorCQkJeGxvdyA9IHhpbnQ7ICAgICAgICAgICAgICAgICAgIA0KKwkJCW5mKys7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlpZiAoaXAgPT0gMCkNCisJCQl7DQorCQkJCWlwID0gMTsgICAgICAgICAgICAgICAgICAgIA0KKwkJCQljb2VmID0gZjI7ICAgICAgICAgICAgICAgIA0KKwkJCQlvcmRlciA9IE5DIC0gMTsgICAgICAgICAgIA0KKwkJCX0gZWxzZQ0KKwkJCXsNCisJCQkJaXAgPSAwOyAgICAgICAgICAgICAgICAgICANCisJCQkJY29lZiA9IGYxOyAgICAgICAgICAgICAgICAgDQorCQkJCW9yZGVyID0gTkM7ICAgICAgICAgICAgICANCisJCQl9DQorCQkJeWxvdyA9IENoZWJwczIoeGxvdywgY29lZiwgb3JkZXIpOw0KKwkJfQ0KKwl9DQorCS8qIENoZWNrIGlmIE0tMSByb290cyBmb3VuZCAqLw0KKwlpZihuZiA8IE0gLSAxKQ0KKwl7DQorCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJew0KKwkJCWlzcFtpXSA9IG9sZF9pc3BbaV07ICAgICAgICAgIA0KKwkJfQ0KKwl9IGVsc2UNCisJew0KKwkJaXNwW00gLSAxXSA9IGFbTV0gPDwgMzsgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMTIgdG8gUTE1IHdpdGggc2F0dXJhdGlvbiAqLw0KKwl9DQorCXJldHVybjsNCit9DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqIGZ1bmN0aW9uICBDaGVicHMyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgfn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgRXZhbHVhdGVzIHRoZSBDaGViaXNoZXYgcG9seW5vbWlhbCBzZXJpZXMgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIFRoZSBwb2x5bm9taWFsIG9yZGVyIGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICBuID0gTS8yICAgKE0gaXMgdGhlIHByZWRpY3Rpb24gb3JkZXIpICAgICAgICAgICAgICAgICAgICAqDQorKiAgVGhlIHBvbHlub21pYWwgaXMgZ2l2ZW4gYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgQyh4KSA9IGYoMClUX24oeCkgKyBmKDEpVF9uLTEoeCkgKyAuLi4gK2Yobi0xKVRfMSh4KSArIGYobikvMiAqDQorKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIHg6ICAgICBpbnB1dCB2YWx1ZSBvZiBldmFsdWF0aW9uOyB4ID0gY29zKGZyZXF1ZW5jeSkgaW4gUTE1ICoNCisqICBmW106ICAgY29lZmZpY2llbnRzIG9mIHRoZSBwb2wuICAgICAgICAgICAgICAgICAgICAgIGluIFExMSAqDQorKiAgbjogICAgIG9yZGVyIG9mIHRoZSBwb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFRoZSB2YWx1ZSBvZiBDKHgpIGlzIHJldHVybmVkLiAoU2F0dXJlZCB0byArLTEuOTkgaW4gUTE0KSAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIF9faW5saW5lIFdvcmQxNiBDaGVicHMyKFdvcmQxNiB4LCBXb3JkMTYgZltdLCBXb3JkMzIgbikNCit7DQorCVdvcmQzMiBpLCBjaGViOw0KKwlXb3JkMTYgYjBfaCwgYjBfbCwgYjFfaCwgYjFfbCwgYjJfaCwgYjJfbDsNCisJV29yZDMyIHQwOw0KKw0KKwkvKiBOb3RlOiBBbGwgY29tcHV0YXRpb24gYXJlIGRvbmUgaW4gUTI0LiAqLw0KKw0KKwl0MCA9IGZbMF0gPDwgMTM7DQorCWIyX2ggPSB0MCA+PiAxNjsNCisJYjJfbCA9ICh0MCAmIDB4ZmZmZik+PjE7DQorDQorCXQwID0gKChiMl9oICogeCk8PDEpICsgKCgoYjJfbCAqIHgpPj4xNSk8PDEpOw0KKwl0MCA8PD0gMTsNCisJdDAgKz0gKGZbMV0gPDwgMTMpOwkJCQkJCS8qICsgZlsxXSBpbiBRMjQgICAgICAgICovDQorDQorCWIxX2ggPSB0MCA+PiAxNjsNCisJYjFfbCA9ICh0MCAmIDB4ZmZmZikgPj4gMTsNCisNCisJZm9yIChpID0gMjsgaSA8IG47IGkrKykNCisJew0KKwkJdDAgPSAoKGIxX2ggKiB4KTw8MSkgKyAoKChiMV9sICogeCk+PjE1KTw8MSk7DQorDQorCQl0MCArPSAoYjJfaCAqICgtMTYzODQpKTw8MTsNCisJCXQwICs9IChmW2ldIDw8IDEyKTsNCisJCXQwIDw8PSAxOw0KKwkJdDAgLT0gKGIyX2wgPDwgMSk7CQkJCQkvKiB0MCA9IDIuMCp4KmIxIC0gYjIgKyBmW2ldOyAqLw0KKw0KKwkJYjBfaCA9IHQwID4+IDE2Ow0KKwkJYjBfbCA9ICh0MCAmIDB4ZmZmZikgPj4gMTsNCisNCisJCWIyX2wgPSBiMV9sOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiMiA9IGIxOyAqLw0KKwkJYjJfaCA9IGIxX2g7ICAgICAgICAgICAgICAgICAgICAgICANCisJCWIxX2wgPSBiMF9sOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiMSA9IGIwOyAqLw0KKwkJYjFfaCA9IGIwX2g7ICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwl0MCA9ICgoYjFfaCAqIHgpPDwxKSArICgoKGIxX2wgKiB4KT4+MTUpPDwxKTsNCisJdDAgKz0gKGIyX2ggKiAoLTMyNzY4KSk8PDE7CQkJCS8qIHQwID0geCpiMSAtIGIyICAgICAgICAgICovDQorCXQwIC09IChiMl9sIDw8IDEpOw0KKwl0MCArPSAoZltuXSA8PCAxMik7CQkJCQkJLyogdDAgPSB4KmIxIC0gYjIgKyBmW2ldLzIgKi8NCisNCisJdDAgPSBMX3NobDIodDAsIDYpOyAgICAgICAgICAgICAgICAgICAgIC8qIFEyNCB0byBRMzAgd2l0aCBzYXR1cmF0aW9uICovDQorDQorCWNoZWIgPSBleHRyYWN0X2godDApOyAgICAgICAgICAgICAgICAgIC8qIFJlc3VsdCBpbiBRMTQgICAgICAgICAgICAgICovDQorDQorCWlmIChjaGViID09IC0zMjc2OCkNCisJew0KKwkJY2hlYiA9IC0zMjc2NzsgICAgICAgICAgICAgICAgICAgICAvKiB0byBhdm9pZCBzYXR1cmF0aW9uIGluIEF6X2lzcCAqLw0KKwl9DQorCXJldHVybiAoY2hlYik7DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkMWEwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCkBAIC0wLDAgKzEsMjEwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAgICBGaWxlOiBiaXRzLmMNCisNCisJICAgRGVzY3JpcHRpb246IFBlcmZvcm1zIGJpdCBzdHJlYW0gbWFuaXB1bGF0aW9uDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImJpdHMuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiZHR4LmgiDQorI2luY2x1ZGUgIm1pbWVfaW8udGFiIg0KKw0KKw0KK2ludCBQYWNrQml0cyhXb3JkMTYgcHJtc1tdLCAgICAgICAgICAgICAvKiAgaTogYW5hbHlzaXMgcGFyYW1ldGVycyAqLw0KKwkJCSBXb3JkMTYgY29kaW5nX21vZGUsICAgICAgICAvKiAgaTogY29kaW5nIGJpdC1zdHJlYW0gcmF0aW8gbW9kZSAqLw0KKwkJCSBXb3JkMTYgbW9kZSwgICAgICAgICAgICAgICAvKiAgaTogY29kaW5nIGJpdC1zdHJlYW0gcmF0aW8gbW9kZSovIA0KKwkJCSBDb2Rlcl9TdGF0ZSAqc3QgICAgICAgICAgICAvKmkvbzogY29kZXIgZ2xvYmFsIHBhcmFtZXRlcnMgc3RydWN0ICovICAgICAgICAgICANCisJCQkgKQ0KK3sNCisJV29yZDE2IGksIGZyYW1lX3R5cGU7DQorCVVXb3JkOCB0ZW1wOw0KKwlVV29yZDggKnN0cmVhbV9wdHI7DQorCVdvcmQxNiBiaXRzdHJlYW1mb3JtYXQgPSBzdC0+ZnJhbWVUeXBlOw0KKw0KKwl1bnNpZ25lZCBzaG9ydCogZGF0YU91dCA9IHN0LT5vdXRwdXRTdHJlYW07DQorDQorCWlmIChjb2RpbmdfbW9kZSA9PSBNUkRUWCkNCisJewkgICANCisJCXN0LT5zaWRfdXBkYXRlX2NvdW50ZXItLTsNCisNCisJCWlmIChzdC0+cHJldl9mdCA9PSBUWF9TUEVFQ0gpDQorCQl7DQorCQkJZnJhbWVfdHlwZSA9IFRYX1NJRF9GSVJTVDsNCisJCQlzdC0+c2lkX3VwZGF0ZV9jb3VudGVyID0gMzsNCisJCX0gZWxzZQ0KKwkJew0KKwkJCWlmICgoc3QtPnNpZF9oYW5kb3Zlcl9kZWJ0ID4gMCkgJiYgKHN0LT5zaWRfdXBkYXRlX2NvdW50ZXIgPiAyKSkNCisJCQl7DQorCQkJCS8qIGVuc3VyZSBleHRyYSB1cGRhdGVzIGFyZSAgcHJvcGVybHkgZGVsYXllZCBhZnRlciBhIHBvc3NpYmxlIFNJRF9GSVJTVCAqLw0KKwkJCQlmcmFtZV90eXBlID0gVFhfU0lEX1VQREFURTsNCisJCQkJc3QtPnNpZF9oYW5kb3Zlcl9kZWJ0LS07DQorCQkJfSBlbHNlDQorCQkJew0KKwkJCQlpZiAoc3QtPnNpZF91cGRhdGVfY291bnRlciA9PSAwKQ0KKwkJCQl7DQorCQkJCQlmcmFtZV90eXBlID0gVFhfU0lEX1VQREFURTsNCisJCQkJCXN0LT5zaWRfdXBkYXRlX2NvdW50ZXIgPSA4Ow0KKwkJCQl9IGVsc2UNCisJCQkJew0KKwkJCQkJZnJhbWVfdHlwZSA9IFRYX05PX0RBVEE7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0gZWxzZQ0KKwl7DQorCQlzdC0+c2lkX3VwZGF0ZV9jb3VudGVyID0gODsNCisJCWZyYW1lX3R5cGUgPSBUWF9TUEVFQ0g7DQorCX0NCisJc3QtPnByZXZfZnQgPSBmcmFtZV90eXBlOw0KKw0KKwlpZihiaXRzdHJlYW1mb3JtYXQgPT0gMCkJCQkJLyogZGVmYXVsdCBmaWxlIGZvcm1hdCAqLw0KKwl7DQorCQkqKGRhdGFPdXQpID0gVFhfRlJBTUVfVFlQRTsNCisJCSooZGF0YU91dCArIDEpID0gZnJhbWVfdHlwZTsNCisJCSooZGF0YU91dCArIDIpID0gbW9kZTsNCisJCWZvciAoaSA9IDA7IGkgPCBuYl9vZl9iaXRzW2NvZGluZ19tb2RlXTsgaSsrKQ0KKwkJew0KKwkJCSooZGF0YU91dCArIDMgKyBpKSA9IHBybXNbaV07DQorCQl9DQorCQlyZXR1cm4gICgzICsgbmJfb2ZfYml0c1tjb2RpbmdfbW9kZV0pPDwxOw0KKwl9IGVsc2UNCisJew0KKwkJaWYgKGJpdHN0cmVhbWZvcm1hdCA9PSAxKQkJLyogSVRVIGZpbGUgZm9ybWF0ICovDQorCQl7ICAJCQkJCQkNCisJCQkqKGRhdGFPdXQpID0gMHg2YjIxOw0KKwkJCWlmKGZyYW1lX3R5cGUgIT0gVFhfTk9fREFUQSAmJiBmcmFtZV90eXBlICE9IFRYX1NJRF9GSVJTVCkNCisJCQl7DQorCQkJCSooZGF0YU91dCArIDEpID0gbmJfb2ZfYml0c1tjb2RpbmdfbW9kZV07DQorCQkJCWZvciAoaSA9IDA7IGkgPCBuYl9vZl9iaXRzW2NvZGluZ19tb2RlXTsgaSsrKQ0KKwkJCQl7DQorCQkJCQlpZihwcm1zW2ldID09IEJJVF8wKXsNCisJCQkJCQkqKGRhdGFPdXQgKyAyICsgaSkgPSBCSVRfMF9JVFU7CSAJCQkNCisJCQkJCX0NCisJCQkJCWVsc2V7DQorCQkJCQkJKihkYXRhT3V0ICsgMiArIGkpID0gQklUXzFfSVRVOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCXJldHVybiAoMiArIG5iX29mX2JpdHNbY29kaW5nX21vZGVdKTw8MTsgICANCisJCQl9IGVsc2UNCisJCQl7DQorCQkJCSooZGF0YU91dCArIDEpID0gMDsNCisJCQkJcmV0dXJuIDI8PDE7CSAgIA0KKwkJCX0NCisJCX0gZWxzZQkJCQkJCQkvKiBNSU1FL3N0b3JhZ2UgZmlsZSBmb3JtYXQgKi8NCisJCXsNCisjZGVmaW5lIE1SU0lEIDkNCisJCQkvKiBjaGFuZ2UgbW9kZSBpbmRleCBpbiBjYXNlIG9mIFNJRCBmcmFtZSAqLw0KKwkJCWlmIChjb2RpbmdfbW9kZSA9PSBNUkRUWCkNCisJCQl7DQorCQkJCWNvZGluZ19tb2RlID0gTVJTSUQ7DQorCQkJCWlmIChmcmFtZV90eXBlID09IFRYX1NJRF9GSVJTVCkNCisJCQkJew0KKwkJCQkJZm9yIChpID0gMDsgaSA8IE5CQklUU19TSUQ7IGkrKykJcHJtc1tpXSA9IEJJVF8wOw0KKwkJCQl9DQorCQkJfQ0KKwkJCS8qIC0+IGZvcmNlIE5PX0RBVEEgZnJhbWUgKi8NCisJCQlpZiAoY29kaW5nX21vZGUgPCAwIHx8IGNvZGluZ19tb2RlID4gMTUgfHwgKGNvZGluZ19tb2RlID4gTVJTSUQgJiYgY29kaW5nX21vZGUgPCAxNCkpDQorCQkJew0KKwkJCQljb2RpbmdfbW9kZSA9IDE1Ow0KKwkJCX0NCisJCQkvKiBtYXJrIGVtcHR5IGZyYW1lcyBiZXR3ZWVuIFNJRCB1cGRhdGVzIGFzIE5PX0RBVEEgZnJhbWVzICovDQorCQkJaWYgKGNvZGluZ19tb2RlID09IE1SU0lEICYmIGZyYW1lX3R5cGUgPT0gVFhfTk9fREFUQSkNCisJCQl7DQorCQkJCWNvZGluZ19tb2RlID0gMTU7DQorCQkJfQ0KKwkJCS8qIHNldCBwb2ludGVyIGZvciBwYWNrZWQgZnJhbWUsIG5vdGUgdGhhdCB3ZSBoYW5kbGUgZGF0YSBhcyBieXRlcyAqLw0KKwkJCXN0cmVhbV9wdHIgPSAoVVdvcmQ4KilkYXRhT3V0Ow0KKwkJCS8qIGluc2VydCB0YWJsZSBvZiBjb250ZW50cyAoVG9DKSBieXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLw0KKwkJCSpzdHJlYW1fcHRyID0gdG9jX2J5dGVbY29kaW5nX21vZGVdOw0KKwkJCXN0cmVhbV9wdHIrKzsNCisJCQl0ZW1wID0gMDsNCisJCQkvKiBzb3J0IGFuZCBwYWNrIEFNUi1XQiBzcGVlY2ggb3IgU0lEIGJpdHMgKi8NCisJCQlmb3IgKGkgPSAxOyBpIDwgdW5wYWNrZWRfc2l6ZVtjb2RpbmdfbW9kZV0gKyAxOyBpKyspDQorCQkJew0KKwkJCQlpZiAocHJtc1tzb3J0X3B0cltjb2RpbmdfbW9kZV1baS0xXV0gPT0gQklUXzEpDQorCQkJCXsNCisJCQkJCXRlbXArKzsNCisJCQkJfQ0KKwkJCQlpZiAoaSYweDcpDQorCQkJCXsNCisJCQkJCXRlbXAgPDw9IDE7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQkqc3RyZWFtX3B0ciA9IHRlbXA7DQorCQkJCQlzdHJlYW1fcHRyKys7DQorCQkJCQl0ZW1wID0gMDsNCisJCQkJfQ0KKwkJCX0NCisJCQkvKiBpbnNlcnQgU0lEIHR5cGUgaW5kaWNhdGlvbiBhbmQgc3BlZWNoIG1vZGUgaW4gY2FzZSBvZiBTSUQgZnJhbWUgKi8NCisJCQlpZiAoY29kaW5nX21vZGUgPT0gTVJTSUQpDQorCQkJew0KKwkJCQlpZiAoZnJhbWVfdHlwZSA9PSBUWF9TSURfVVBEQVRFKQ0KKwkJCQl7DQorCQkJCQl0ZW1wKys7DQorCQkJCX0NCisJCQkJdGVtcCA8PD0gNDsNCisJCQkJdGVtcCArPSBtb2RlICYgMHgwMDBGOw0KKwkJCX0NCisJCQkvKiBpbnNlcnQgdW51c2VkIGJpdHMgKHplcm9zKSBhdCB0aGUgdGFpbCBvZiB0aGUgbGFzdCBieXRlICovDQorCQkJaWYgKHVudXNlZF9zaXplW2NvZGluZ19tb2RlXSkNCisJCQl7DQorCQkJCXRlbXAgPDw9ICh1bnVzZWRfc2l6ZVtjb2RpbmdfbW9kZV0gLSAxKTsNCisJCQl9DQorCQkJKnN0cmVhbV9wdHIgPSB0ZW1wOw0KKwkJCS8qIHdyaXRlIHBhY2tlZCBmcmFtZSBpbnRvIGZpbGUgKDEgYnl0ZSBhZGRlZCB0byBjb3ZlciBUb0MgZW50cnkpICovDQorCQkJcmV0dXJuICgxICsgcGFja2VkX3NpemVbY29kaW5nX21vZGVdKTsNCisJCX0NCisJfQ0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogUGFybV9zZXJpYWwgLT4gY29udmVydCBwYXJhbWV0ZXJzIHRvIHNlcmlhbCBzdHJlYW0gICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgUGFybV9zZXJpYWwoDQorCQlXb3JkMTYgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGFyYW1ldGVyIHZhbHVlICovDQorCQlXb3JkMTYgbm9fb2ZfYml0cywgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbnVtYmVyIG9mIGJpdHMgICovDQorCQlXb3JkMTYgKiogcHJtcw0KKwkJKQ0KK3sNCisJV29yZDE2IGksIGJpdDsNCisJKnBybXMgKz0gbm9fb2ZfYml0czsgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IG5vX29mX2JpdHM7IGkrKykNCisJew0KKwkJYml0ID0gKFdvcmQxNikgKHZhbHVlICYgMHgwMDAxKTsgICAgLyogZ2V0IGxzYiAqLw0KKwkJaWYgKGJpdCA9PSAwKQ0KKwkJCSotLSgqcHJtcykgPSBCSVRfMDsNCisJCWVsc2UNCisJCQkqLS0oKnBybXMpID0gQklUXzE7DQorCQl2YWx1ZSA+Pj0gMTsgICAgICAgICAgDQorCX0NCisJKnBybXMgKz0gbm9fb2ZfYml0czsgICAgICAgICAgICAgICAgICANCisJcmV0dXJuOw0KK30NCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2MydDY0ZnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmM0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2MydDY0ZnguYwpAQCAtMCwwICsxLDI5NyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGMydDY0ZnguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOlBlcmZvcm1zIGFsZ2VicmFpYyBjb2RlYm9vayBzZWFyY2ggZm9yIDYuNjBrYml0cyBtb2RlKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNkZWZpbmUgTkJfVFJBQ0sgIDINCisjZGVmaW5lIFNURVAgICAgICAyDQorI2RlZmluZSBOQl9QT1MgICAgMzINCisjZGVmaW5lIE1TSVpFICAgICAxMDI0DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiAgQUNFTFBfMnQ2NF9meCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAxMiBiaXRzIGFsZ2VicmFpYyBjb2RlYm9vay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDIgdHJhY2tzIHggMzIgcG9zaXRpb25zIHBlciB0cmFjayA9IDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAxMiBiaXRzIC0tPiAyIHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogQWxsIHB1bHNlcyBjYW4gaGF2ZSB0d28gKDIpIHBvc3NpYmxlIGFtcGxpdHVkZXM6ICsxIG9yIC0xLiAgICAgICAgICAgICAqDQorKiBFYWNoIHB1bHNlIGNhbiBoYXZlIDMyIHBvc3NpYmxlIHBvc2l0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIEFDRUxQXzJ0NjRfZngoDQorCQlXb3JkMTYgZG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgeFtdIGFuZCBIW10gICAgICAqLw0KKwkJV29yZDE2IGNuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgPDEyYiA6IHJlc2lkdWFsIGFmdGVyIGxvbmcgdGVybSBwcmVkaWN0aW9uICAgICAgICAgKi8NCisJCVdvcmQxNiBIW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMjogaW1wdWxzZSByZXNwb25zZSBvZiB3ZWlnaHRlZCBzeW50aGVzaXMgZmlsdGVyICovDQorCQlXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGFsZ2VicmFpYyAoZml4ZWQpIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTkgOiBmaWx0ZXJlZCBmaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIDogaW5kZXggKDEyKTogNSsxKzUrMSA9IDExIGJpdHMuICAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgaiwgaywgaTAsIGkxLCBpeCwgaXksIHBvcywgcG9zMjsNCisJV29yZDE2IHBzLCBwc2ssIHBzMSwgcHMyLCBhbHBrLCBhbHAxLCBhbHAyLCBzcTsNCisJV29yZDE2IGFscCwgdmFsLCBleHAsIGtfY24sIGtfZG47DQorCVdvcmQxNiAqcDAsICpwMSwgKnAyLCAqcHNpZ247DQorCVdvcmQxNiAqaCwgKmhfaW52LCAqcHRyX2gxLCAqcHRyX2gyLCAqcHRyX2hmOw0KKw0KKwlXb3JkMTYgc2lnbltMX1NVQkZSXSwgdmVjW0xfU1VCRlJdLCBkbjJbTF9TVUJGUl07DQorCVdvcmQxNiBoX2J1Zls0ICogTF9TVUJGUl0gPSB7MH07DQorCVdvcmQxNiBycml4aXhbTkJfVFJBQ0tdW05CX1BPU107DQorCVdvcmQxNiBycml4aXlbTVNJWkVdOw0KKwlXb3JkMzIgcywgY29yOw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIEZpbmQgc2lnbiBmb3IgZWFjaCBwdWxzZSBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJYWxwID0gODE5MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAyLjAgKFExMikgKi8NCisNCisJLyogY2FsY3VsYXRlIGVuZXJneSBmb3Igbm9ybWFsaXphdGlvbiBvZiBjbltdIGFuZCBkbltdICovDQorCS8qIHNldCBrX2NuID0gMzIuLjMyNzY3IChlbmVyX2NuID0gMl4zMC4uMjU2LTApICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJcyA9IERvdF9wcm9kdWN0MTJfYXNtKGNuLCBjbiwgTF9TVUJGUiwgJmV4cCk7DQorI2Vsc2UNCisJcyA9IERvdF9wcm9kdWN0MTIoY24sIGNuLCBMX1NVQkZSLCAmZXhwKTsNCisjZW5kaWYNCisNCisJSXNxcnRfbigmcywgJmV4cCk7DQorCXMgPSBMX3NobChzLCBhZGQxKGV4cCwgNSkpOyAgICAgICAgICAgICANCisJa19jbiA9IHZvX3JvdW5kKHMpOw0KKw0KKwkvKiBzZXQga19kbiA9IDMyLi41MTIgKGVuZXJfZG4gPSAyXjMwLi4yXjIyKSAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJcyA9IERvdF9wcm9kdWN0MTJfYXNtKGRuLCBkbiwgTF9TVUJGUiwgJmV4cCk7DQorI2Vsc2UNCisJcyA9IERvdF9wcm9kdWN0MTIoZG4sIGRuLCBMX1NVQkZSLCAmZXhwKTsNCisjZW5kaWYNCisNCisJSXNxcnRfbigmcywgJmV4cCk7DQorCWtfZG4gPSB2b19yb3VuZChMX3NobChzLCAoZXhwICsgOCkpKTsgICAgLyoga19kbiA9IDI1Ni4uNDA5NiAqLw0KKwlrX2RuID0gdm9fbXVsdF9yKGFscCwga19kbik7ICAgICAgICAgICAgICAvKiBhbHAgaW4gUTEyICovDQorDQorCS8qIG1peCBub3JtYWxpemVkIGNuW10gYW5kIGRuW10gKi8NCisJcDAgPSBjbjsNCisJcDEgPSBkbjsNCisJcDIgPSBkbjI7DQorDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSLzQ7IGkrKykNCisJew0KKwkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOw0KKwkJKnAyKysgPSBzID4+IDc7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsNCisJCXMgPSAoa19jbiogKCpwMCsrKSkrKGtfZG4gKiAoKnAxKyspKTsNCisJCSpwMisrID0gcyA+PiA3Ow0KKwkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOw0KKwkJKnAyKysgPSBzID4+IDc7IA0KKwl9DQorDQorCS8qIHNldCBzaWduIGFjY29yZGluZyB0byBkbjJbXSA9IGtfY24qY25bXSArIGtfZG4qZG5bXSAgICAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSArKykNCisJew0KKwkJdmFsID0gZG5baV07ICAgICAgICAgICAgICAgICAgIA0KKwkJcHMgPSBkbjJbaV07ICAgICAgICAgICAgICAgICAgIA0KKwkJaWYgKHBzID49IDApDQorCQl7DQorCQkJc2lnbltpXSA9IDMyNzY3OyAgICAgICAgICAgICAvKiBzaWduID0gKzEgKFExMikgKi8NCisJCQl2ZWNbaV0gPSAtMzI3Njg7ICAgICAgICAgICANCisJCX0gZWxzZQ0KKwkJew0KKwkJCXNpZ25baV0gPSAtMzI3Njg7ICAgICAgICAgICAgLyogc2lnbiA9IC0xIChRMTIpICovDQorCQkJdmVjW2ldID0gMzI3Njc7ICAgICAgICAgICAgDQorCQkJZG5baV0gPSAtdmFsOw0KKwkJfQ0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBDb21wdXRlIGhfaW52W2ldLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKiBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciBmb3IgZmFzdCBjb21wdXRhdGlvbiAqLw0KKwloID0gaF9idWYgKyBMX1NVQkZSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWhfaW52ID0gaCArIChMX1NVQkZSPDwxKTsgICAgICAgICANCisNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJew0KKwkJaFtpXSA9IEhbaV07ICAgICAgICAgICAgICAgICAgICAgICANCisJCWhfaW52W2ldID0gdm9fbmVnYXRlKGhbaV0pOyAgICAgICAgICAgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIENvbXB1dGUgcnJpeGl4W11bXSBuZWVkZWQgZm9yIHRoZSBjb2RlYm9vayBzZWFyY2guICAgICAgICAgKg0KKwkgKiBSZXN1bHQgaXMgbXVsdGlwbGllZCBieSAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKiBJbml0IHBvaW50ZXJzIHRvIGxhc3QgcG9zaXRpb24gb2YgcnJpeGl4W10gKi8NCisJcDAgPSAmcnJpeGl4WzBdW05CX1BPUyAtIDFdOyAgICAgICAgICAgDQorCXAxID0gJnJyaXhpeFsxXVtOQl9QT1MgLSAxXTsgICAgICAgICAgIA0KKw0KKwlwdHJfaDEgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY29yID0gMHgwMDAxMDAwMEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgKi8NCisJZm9yIChpID0gMDsgaSA8IE5CX1BPUzsgaSsrKQ0KKwl7DQorCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gxKSA8PCAxKTsNCisJCXB0cl9oMSsrOw0KKwkJKnAxLS0gPSAoZXh0cmFjdF9oKGNvcikgPj4gMSk7ICAgICAgICAgICAgDQorCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gxKSA8PCAxKTsNCisJCXB0cl9oMSsrOw0KKwkJKnAwLS0gPSAoZXh0cmFjdF9oKGNvcikgPj4gMSk7ICAgICAgICAgICAgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIENvbXB1dGUgcnJpeGl5W11bXSBuZWVkZWQgZm9yIHRoZSBjb2RlYm9vayBzZWFyY2guICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCXBvcyA9IE1TSVpFIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwb3MyID0gTVNJWkUgLSAyOyAgICAgICAgICAgICAgICAgICAgICANCisJcHRyX2hmID0gaCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBOQl9QT1M7IGsrKykNCisJew0KKwkJcDEgPSAmcnJpeGl5W3Bvc107ICAgICAgICAgICAgICAgICANCisJCXAwID0gJnJyaXhpeVtwb3MyXTsgICAgICAgICAgICAgICAgDQorCQljb3IgPSAweDAwMDA4MDAwTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgKi8NCisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlwdHJfaDIgPSBwdHJfaGY7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkJZm9yIChpID0gKGsgKyAxKTsgaSA8IE5CX1BPUzsgaSsrKQ0KKwkJew0KKwkJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDIpKTw8MTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDEgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorCQkJY29yICs9ICgoKnB0cl9oMSkgKiAoKnB0cl9oMikpPDwxOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMCA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgIA0KKw0KKwkJCXAxIC09IChOQl9QT1MgKyAxKTsNCisJCQlwMCAtPSAoTkJfUE9TICsgMSk7DQorCQl9DQorCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gyKSk8PDE7DQorCQlwdHJfaDErKzsNCisJCXB0cl9oMisrOw0KKwkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICANCisNCisJCXBvcyAtPSBOQl9QT1M7DQorCQlwb3MyLS07DQorCQlwdHJfaGYgKz0gU1RFUDsNCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogTW9kaWZpY2F0aW9uIG9mIHJyaXhpeVtdW10gdG8gdGFrZSBzaWducyBpbnRvIGFjY291bnQuICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcDAgPSBycml4aXk7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkgKz0gU1RFUCkNCisJew0KKwkJcHNpZ24gPSBzaWduOyAgICAgICAgICAgICAgICAgICAgICANCisJCWlmIChwc2lnbltpXSA8IDApDQorCQl7DQorCQkJcHNpZ24gPSB2ZWM7ICAgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwkJZm9yIChqID0gMTsgaiA8IExfU1VCRlI7IGogKz0gU1RFUCkNCisJCXsNCisJCQkqcDAgPSB2b19tdWx0KCpwMCwgcHNpZ25bal0pOyAgICAgDQorCQkJcDArKzsNCisJCX0NCisJfQ0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIHNlYXJjaCAyIHB1bHNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogfkB+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAzMiBwb3MgeCAzMiBwb3MgPSAxMDI0IHRlc3RzIChhbGwgY29tYmluYWlzb25zIGlzIHRlc3RlZCkgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCXAwID0gcnJpeGl4WzBdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwMSA9IHJyaXhpeFsxXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJcDIgPSBycml4aXk7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJcHNrID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWFscGsgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaXkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoaTAgPSAwOyBpMCA8IExfU1VCRlI7IGkwICs9IFNURVApDQorCXsNCisJCXBzMSA9IGRuW2kwXTsgICAgICAgICAgICAgICAgICAgICAgDQorCQlhbHAxID0gKCpwMCsrKTsgICAgICAgICAgICAgICAgICAgIA0KKwkJcG9zID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWZvciAoaTEgPSAxOyBpMSA8IExfU1VCRlI7IGkxICs9IFNURVApDQorCQl7DQorCQkJcHMyID0gYWRkMShwczEsIGRuW2kxXSk7DQorCQkJYWxwMiA9IGFkZDEoYWxwMSwgYWRkMSgqcDErKywgKnAyKyspKTsNCisJCQlzcSA9IHZvX211bHQocHMyLCBwczIpOw0KKwkJCXMgPSB2b19MX211bHQoYWxwaywgc3EpIC0gKChwc2sgKiBhbHAyKTw8MSk7DQorCQkJaWYgKHMgPiAwKQ0KKwkJCXsNCisJCQkJcHNrID0gc3E7ICAgICAgICAgICAgICAgICAgDQorCQkJCWFscGsgPSBhbHAyOyAgICAgICAgICAgICAgIA0KKwkJCQlwb3MgPSBpMTsgICAgICAgICAgICAgICAgICANCisJCQl9DQorCQl9DQorCQlwMSAtPSBOQl9QT1M7DQorCQlpZiAocG9zID49IDApDQorCQl7DQorCQkJaXggPSBpMDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJaXkgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQnVpbGQgdGhlIGNvZGV3b3JkLCB0aGUgZmlsdGVyZWQgY29kZXdvcmQgYW5kIGluZGV4IG9mIGNvZGV2ZWN0b3IuKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwl7DQorCQljb2RlW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCWkwID0gKGl4ID4+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIG9mIHB1bHNlIDEgKDAuLjMxKSAqLw0KKwlpMSA9IChpeSA+PiAxKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvcyBvZiBwdWxzZSAyICgwLi4zMSkgKi8NCisJaWYgKHNpZ25baXhdID4gMCkNCisJew0KKwkJY29kZVtpeF0gPSA1MTI7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZXdvcmQgaW4gUTkgZm9ybWF0ICovDQorCQlwMCA9IGggLSBpeDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9IGVsc2UNCisJew0KKwkJY29kZVtpeF0gPSAtNTEyOyAgICAgICAgICAgICAgICAgICANCisJCWkwICs9IE5CX1BPUzsgICAgICAgICAgICAgICAgICAgICAgDQorCQlwMCA9IGhfaW52IC0gaXg7ICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmIChzaWduW2l5XSA+IDApDQorCXsNCisJCWNvZGVbaXldID0gNTEyOyAgICAgICAgICAgICAgICAgICAgDQorCQlwMSA9IGggLSBpeTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9IGVsc2UNCisJew0KKwkJY29kZVtpeV0gPSAtNTEyOyAgICAgICAgICAgICAgICAgICANCisJCWkxICs9IE5CX1BPUzsgICAgICAgICAgICAgICAgICAgICAgDQorCQlwMSA9IGhfaW52IC0gaXk7ICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCSppbmRleCA9IGFkZDEoKGkwIDw8IDYpLCBpMSk7ICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwl7DQorCQl5W2ldID0gdm9fc2hyX3IoYWRkMSgoKnAwKyspLCAoKnAxKyspKSwgMyk7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmE5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGM0dDY0ZnguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKgkgICBEZXNjcmlwdGlvbjpQZXJmb3JtcyBhbGdlYnJhaWMgY29kZWJvb2sgc2VhcmNoIGZvciBoaWdoZXIgbW9kZXMgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogQUNFTFBfNHQ2NF9meCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDIwLCAzNiwgNDQsIDUyLCA2NCwgNzIsIDg4IGJpdHMgYWxnZWJyYWljIGNvZGVib29rLiAgICAgICAgICAgICAgICAgICAqDQorKiA0IHRyYWNrcyB4IDE2IHBvc2l0aW9ucyBwZXIgdHJhY2sgPSA2NCBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDIwIGJpdHMgLS0+IDQgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAzNiBiaXRzIC0tPiA4IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogNDQgYml0cyAtLT4gMTAgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICoNCisqIDUyIGJpdHMgLS0+IDEyIHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAqDQorKiA2NCBiaXRzIC0tPiAxNiBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogNzIgYml0cyAtLT4gMTggcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICoNCisqIDg4IGJpdHMgLS0+IDI0IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogQWxsIHB1bHNlcyBjYW4gaGF2ZSB0d28gKDIpIHBvc3NpYmxlIGFtcGxpdHVkZXM6ICsxIG9yIC0xLiAgICAgICAgICAgICoNCisqIEVhY2ggcHVsc2UgY2FuIGhhdmUgc2l4dGVlbiAoMTYpIHBvc3NpYmxlIHBvc2l0aW9ucy4gICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCisjaW5jbHVkZSAicV9wdWxzZS5oIg0KKw0KK3N0YXRpYyBXb3JkMTYgdGlwb3NbMzZdID0gew0KKwkwLCAxLCAyLCAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBwb2ludCAmaXBvc1swXSwgMXN0IGl0ZXIgKi8NCisJMSwgMiwgMywgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgcG9pbnQgJmlwb3NbNF0sIDJuZCBpdGVyICovDQorCTIsIDMsIDAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvaW50ICZpcG9zWzhdLCAzcmQgaXRlciAqLw0KKwkzLCAwLCAxLCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBwb2ludCAmaXBvc1sxMl0sIDR0aCBpdGVyICovDQorCTAsIDEsIDIsIDMsDQorCTEsIDIsIDMsIDAsDQorCTIsIDMsIDAsIDEsDQorCTMsIDAsIDEsIDIsDQorCTAsIDEsIDIsIDN9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBwb2ludCBmb3IgMjQgcHVsc2VzICZpcG9zWzM1XSwgNHRoIGl0ZXIgKi8NCisNCisjZGVmaW5lIE5CX1BVTFNFX01BWCAgMjQNCisNCisjZGVmaW5lIExfU1VCRlIgICA2NA0KKyNkZWZpbmUgTkJfVFJBQ0sgIDQNCisjZGVmaW5lIFNURVAgICAgICA0DQorI2RlZmluZSBOQl9QT1MgICAgMTYNCisjZGVmaW5lIE1TSVpFICAgICAyNTYNCisjZGVmaW5lIE5CX01BWCAgICA4DQorI2RlZmluZSBOUE1BWFBUICAgKChOQl9QVUxTRV9NQVgrTkJfVFJBQ0stMSkvTkJfVFJBQ0spDQorDQorLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8NCit2b2lkIGNvcl9oX3ZlY18wMTIoDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCisJCVdvcmQxNiB0cmFjaywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHRyYWNrIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZ25bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2lnbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorCQlXb3JkMTYgY29yXzFbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCVdvcmQxNiBjb3JfMltdICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJKTsNCisNCit2b2lkIGNvcl9oX3ZlY18wMTJfYXNtKA0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgdmVjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgdmVjdG9yICgvOCkgdG8gY29ycmVsYXRlIHdpdGggaFtdICovDQorCQlXb3JkMTYgdHJhY2ssICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBzaWduW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNpZ24gdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHJyaXhpeFtdW05CX1BPU10sICAgICAgICAgICAgICAvKiAoaSkgY29ycmVsYXRpb24gb2YgaFt4XSB3aXRoIGhbeF0gICAgICAqLw0KKwkJV29yZDE2IGNvcl8xW10sICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQlXb3JkMTYgY29yXzJbXSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCSk7DQorDQordm9pZCBjb3JfaF92ZWNfMzAoDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCisJCVdvcmQxNiB0cmFjaywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHRyYWNrIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZ25bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2lnbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorCQlXb3JkMTYgY29yXzFbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCVdvcmQxNiBjb3JfMltdICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJKTsNCisNCit2b2lkIHNlYXJjaF9peGl5KA0KKwkJV29yZDE2IG5iX3Bvc19peCwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbmIgb2YgcG9zIGZvciBwdWxzZSAxICgxLi44KSAgICAgICAqLw0KKwkJV29yZDE2IHRyYWNrX3gsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgb2YgcHVsc2UgMSAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHRyYWNrX3ksICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgb2YgcHVsc2UgMiAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBjb3JyZWxhdGlvbiBvZiBhbGwgZml4ZWQgcHVsc2VzICAqLw0KKwkJV29yZDE2ICogYWxwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBlbmVyZ3kgb2YgYWxsIGZpeGVkIHB1bHNlcyAgICAgICAqLw0KKwkJV29yZDE2ICogaXgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcG9zaXRpb24gb2YgcHVsc2UgMSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcG9zaXRpb24gb2YgcHVsc2UgMiAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGRuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAqLw0KKwkJV29yZDE2IGRuMltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdmVjdG9yIG9mIHNlbGVjdGVkIHBvc2l0aW9ucyAgICAgICAqLw0KKwkJV29yZDE2IGNvcl94W10sICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMSB3aXRoIGZpeGVkIHB1bHNlcyAqLw0KKwkJV29yZDE2IGNvcl95W10sICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMiB3aXRoIGZpeGVkIHB1bHNlcyAqLw0KKwkJV29yZDE2IHJyaXhpeVtdW01TSVpFXSAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMSB3aXRoIHB1bHNlIDIgICAqLw0KKwkJKTsNCisNCisNCit2b2lkIEFDRUxQXzR0NjRfZngoDQorCQlXb3JkMTYgZG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgeFtdIGFuZCBIW10gICAgICAqLw0KKwkJV29yZDE2IGNuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgPDEyYiA6IHJlc2lkdWFsIGFmdGVyIGxvbmcgdGVybSBwcmVkaWN0aW9uICAgICAgICAgKi8NCisJCVdvcmQxNiBIW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMjogaW1wdWxzZSByZXNwb25zZSBvZiB3ZWlnaHRlZCBzeW50aGVzaXMgZmlsdGVyICovDQorCQlXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGFsZ2VicmFpYyAoZml4ZWQpIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTkgOiBmaWx0ZXJlZCBmaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuYmJpdHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDogMjAsIDM2LCA0NCwgNTIsIDY0LCA3MiBvciA4OCBiaXRzICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2VyX3NpemUsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA6IGJpdCByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IF9pbmRleFtdICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgOiBpbmRleCAoMjApOiA1KzUrNSs1ID0gMjAgYml0cy4gICAgICAgICAgICAgICAgICAgKi8NCisJCS8qIChvKSA6IGluZGV4ICgzNik6IDkrOSs5KzkgPSAzNiBiaXRzLiAgICAgICAgICAgICAgICAgICAqLw0KKwkJLyogKG8pIDogaW5kZXggKDQ0KTogMTMrOSsxMys5ID0gNDQgYml0cy4gICAgICAgICAgICAgICAgICovDQorCQkvKiAobykgOiBpbmRleCAoNTIpOiAxMysxMysxMysxMyA9IDUyIGJpdHMuICAgICAgICAgICAgICAgKi8NCisJCS8qIChvKSA6IGluZGV4ICg2NCk6IDIrMisyKzIrMTQrMTQrMTQrMTQgPSA2NCBiaXRzLiAgICAgICAqLw0KKwkJLyogKG8pIDogaW5kZXggKDcyKTogMTArMisxMCsyKzEwKzE0KzEwKzE0ID0gNzIgYml0cy4gICAgICovDQorCQkvKiAobykgOiBpbmRleCAoODgpOiAxMSsxMSsxMSsxMSsxMSsxMSsxMSsxMSA9IDg4IGJpdHMuICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqLCBrOw0KKwlXb3JkMTYgc3QsIGl4LCBpeSwgcG9zLCBpbmRleCwgdHJhY2ssIG5iX3B1bHNlLCBuYml0ZXIsIGpfdGVtcDsNCisJV29yZDE2IHBzaywgcHMsIGFscGssIGFscCwgdmFsLCBrX2NuLCBrX2RuLCBleHA7DQorCVdvcmQxNiAqcDAsICpwMSwgKnAyLCAqcDMsICpwc2lnbjsNCisJV29yZDE2ICpoLCAqaF9pbnYsICpwdHJfaDEsICpwdHJfaDIsICpwdHJfaGYsIGhfc2hpZnQ7DQorCVdvcmQzMiBzLCBjb3IsIExfdG1wLCBMX2luZGV4Ow0KKwlXb3JkMTYgZG4yW0xfU1VCRlJdLCBzaWduW0xfU1VCRlJdLCB2ZWNbTF9TVUJGUl07DQorCVdvcmQxNiBpbmRbTlBNQVhQVCAqIE5CX1RSQUNLXTsNCisJV29yZDE2IGNvZHZlY1tOQl9QVUxTRV9NQVhdLCBuYnBvc1sxMF07DQorCVdvcmQxNiBjb3JfeFtOQl9QT1NdLCBjb3JfeVtOQl9QT1NdLCBwb3NfbWF4W05CX1RSQUNLXTsNCisJV29yZDE2IGhfYnVmWzQgKiBMX1NVQkZSXTsNCisJV29yZDE2IHJyaXhpeFtOQl9UUkFDS11bTkJfUE9TXSwgcnJpeGl5W05CX1RSQUNLXVtNU0laRV07DQorCVdvcmQxNiBpcG9zW05CX1BVTFNFX01BWF07DQorDQorCXN3aXRjaCAobmJiaXRzKQ0KKwl7DQorCQljYXNlIDIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBiaXRzLCA0IHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQluYml0ZXIgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNHgxNngxNj0xMDI0IGxvb3AgKi8NCisJCQlhbHAgPSA4MTkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMi4wIChRMTIpICovDQorCQkJbmJfcHVsc2UgPSA0OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1swXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzFdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQljYXNlIDM2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNiBiaXRzLCA4IHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQluYml0ZXIgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNHgyMHgxNj0xMjgwIGxvb3AgKi8NCisJCQlhbHAgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMS4wIChRMTIpICovDQorCQkJbmJfcHVsc2UgPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1swXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzFdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMl0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQlicmVhazsNCisJCWNhc2UgNDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IGJpdHMsIDEwIHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQluYml0ZXIgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNHgyNngxNj0xNjY0IGxvb3AgKi8NCisJCQlhbHAgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMS4wIChRMTIpICovDQorCQkJbmJfcHVsc2UgPSAxMDsgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1swXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzFdID0gNjsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMl0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1szXSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWJyZWFrOw0KKwkJY2FzZSA1MjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgYml0cywgMTIgcHVsc2VzLCA0IHRyYWNrcyAqLw0KKwkJCW5iaXRlciA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0eDI2eDE2PTE2NjQgbG9vcCAqLw0KKwkJCWFscCA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAxLjAgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDEyOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1syXSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzNdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQljYXNlIDY0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NCBiaXRzLCAxNiBwdWxzZXMsIDQgdHJhY2tzICovDQorCQkJbmJpdGVyID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDN4MzZ4MTY9MTcyOCBsb29wICovDQorCQkJYWxwID0gMzI3NzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscCA9IDAuOCAoUTEyKSAqLw0KKwkJCW5iX3B1bHNlID0gMTY7ICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMF0gPSA0OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1sxXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzJdID0gNjsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbM10gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s0XSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzVdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQljYXNlIDcyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3MiBiaXRzLCAxOCBwdWxzZXMsIDQgdHJhY2tzICovDQorCQkJbmJpdGVyID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDN4MzV4MTY9MTY4MCBsb29wICovDQorCQkJYWxwID0gMzA3MjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscCA9IDAuNzUgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDE4OyAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gMjsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSAzOyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1syXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzNdID0gNTsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbNF0gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s1XSA9IDc7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzZdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQljYXNlIDg4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4OCBiaXRzLCAyNCBwdWxzZXMsIDQgdHJhY2tzICovDQorCQkJaWYoc2VyX3NpemUgPiA0NjIpDQorCQkJCW5iaXRlciA9IDE7DQorCQkJZWxzZQ0KKwkJCQluYml0ZXIgPSAyOyAgICAgICAgICAgICAgICAgICAgLyogMng1M3gxNj0xNjk2IGxvb3AgKi8NCisNCisJCQlhbHAgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMC41IChRMTIpICovDQorCQkJbmJfcHVsc2UgPSAyNDsgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1swXSA9IDI7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzFdID0gMjsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMl0gPSAzOyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1szXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzRdID0gNTsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbNV0gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s2XSA9IDc7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzddID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbOF0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s5XSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQluYml0ZXIgPSAwOw0KKwkJCWFscCA9IDA7DQorCQkJbmJfcHVsc2UgPSAwOw0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBuYl9wdWxzZTsgaSsrKQ0KKwl7DQorCQljb2R2ZWNbaV0gPSBpOyAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogRmluZCBzaWduIGZvciBlYWNoIHB1bHNlIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKiBjYWxjdWxhdGUgZW5lcmd5IGZvciBub3JtYWxpemF0aW9uIG9mIGNuW10gYW5kIGRuW10gKi8NCisJLyogc2V0IGtfY24gPSAzMi4uMzI3NjcgKGVuZXJfY24gPSAyXjMwLi4yNTYtMCkgKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCXMgPSBEb3RfcHJvZHVjdDEyX2FzbShjbiwgY24sIExfU1VCRlIsICZleHApOw0KKyNlbHNlDQorCXMgPSBEb3RfcHJvZHVjdDEyKGNuLCBjbiwgTF9TVUJGUiwgJmV4cCk7DQorI2VuZGlmDQorDQorCUlzcXJ0X24oJnMsICZleHApOw0KKwlzID0gTF9zaGwocywgKGV4cCArIDUpKTsgDQorCWtfY24gPSBleHRyYWN0X2goTF9hZGQocywgMHg4MDAwKSk7DQorDQorCS8qIHNldCBrX2RuID0gMzIuLjUxMiAoZW5lcl9kbiA9IDJeMzAuLjJeMjIpICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJcyA9IERvdF9wcm9kdWN0MTJfYXNtKGRuLCBkbiwgTF9TVUJGUiwgJmV4cCk7DQorI2Vsc2UNCisJcyA9IERvdF9wcm9kdWN0MTIoZG4sIGRuLCBMX1NVQkZSLCAmZXhwKTsNCisjZW5kaWYNCisNCisJSXNxcnRfbigmcywgJmV4cCk7DQorCWtfZG4gPSAoTF9zaGwocywgKGV4cCArIDUgKyAzKSkgKyAweDgwMDApID4+IDE2OyAgICAvKiBrX2RuID0gMjU2Li40MDk2ICovDQorCWtfZG4gPSB2b19tdWx0X3IoYWxwLCBrX2RuKTsgICAgICAgICAgICAgIC8qIGFscCBpbiBRMTIgKi8NCisNCisJLyogbWl4IG5vcm1hbGl6ZWQgY25bXSBhbmQgZG5bXSAqLw0KKwlwMCA9IGNuOw0KKwlwMSA9IGRuOw0KKwlwMiA9IGRuMjsNCisNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIvNDsgaSsrKQ0KKwl7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsNCisJCXMgPSAoa19jbiogKCpwMCsrKSkrKGtfZG4gKiAoKnAxKyspKTsNCisJCSpwMisrID0gcyA+PiA3Ow0KKwkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOw0KKwkJKnAyKysgPSBzID4+IDc7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsgDQorCX0NCisNCisJLyogc2V0IHNpZ24gYWNjb3JkaW5nIHRvIGRuMltdID0ga19jbipjbltdICsga19kbipkbltdICAgICovDQorCWZvcihpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJew0KKwkJdmFsID0gZG5baV07ICAgICAgICAgICAgICAgICAgIA0KKwkJcHMgPSBkbjJbaV07ICAgICAgICAgICAgICAgICAgIA0KKwkJaWYgKHBzID49IDApDQorCQl7DQorCQkJc2lnbltpXSA9IDMyNzY3OyAgICAgICAgICAgICAvKiBzaWduID0gKzEgKFExMikgKi8NCisJCQl2ZWNbaV0gPSAtMzI3Njg7ICAgICAgICAgICANCisJCX0gZWxzZQ0KKwkJew0KKwkJCXNpZ25baV0gPSAtMzI3Njg7ICAgICAgICAgICAgLyogc2lnbiA9IC0xIChRMTIpICovDQorCQkJdmVjW2ldID0gMzI3Njc7ICAgICAgICAgICAgDQorCQkJZG5baV0gPSAtdmFsOw0KKwkJCWRuMltpXSA9IC1wczsNCisJCX0NCisJfQ0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFNlbGVjdCBOQl9NQVggcG9zaXRpb24gcGVyIHRyYWNrIGFjY29yZGluZyB0byBtYXggb2YgZG4yW10uICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcG9zID0gMDsNCisJZm9yIChpID0gMDsgaSA8IE5CX1RSQUNLOyBpKyspDQorCXsNCisJCWZvciAoayA9IDA7IGsgPCBOQl9NQVg7IGsrKykNCisJCXsNCisJCQlwcyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJZm9yIChqID0gaTsgaiA8IExfU1VCRlI7IGogKz0gU1RFUCkNCisJCQl7DQorCQkJCWlmKGRuMltqXSA+IHBzKQ0KKwkJCQl7DQorCQkJCQlwcyA9IGRuMltqXTsgICAgICAgICAgDQorCQkJCQlwb3MgPSBqOyAgICAgICAgICAgICAgIA0KKwkJCQl9DQorCQkJfQ0KKwkJCWRuMltwb3NdID0gKGsgLSBOQl9NQVgpOyAgICAgLyogZG4yIDwgMCB3aGVuIHBvc2l0aW9uIGlzIHNlbGVjdGVkICovDQorCQkJaWYgKGsgPT0gMCkNCisJCQl7DQorCQkJCXBvc19tYXhbaV0gPSBwb3M7ICAgICAgICAgIA0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBTY2FsZSBoW10gdG8gYXZvaWQgb3ZlcmZsb3cgYW5kIHRvIGdldCBtYXhpbXVtIG9mIHByZWNpc2lvbiAgKg0KKwkgKiBvbiBjb3JyZWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBNYXhpbXVtIG9mIGhbXSAoaFswXSkgaXMgZml4ZWQgdG8gMjA0OCAoTUFYMTYgLyAxNikuICAgICAgICAgKg0KKwkgKiAgPT0+IFRoaXMgYWxsb3cgYWRkaXRpb24gb2YgMTYgcHVsc2VzIHdpdGhvdXQgc2F0dXJhdGlvbi4gICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBFbmVyZ3kgd29yc3QgY2FzZSAob24gcmVzb25hbnQgaW1wdWxzZSByZXNwb25zZSksICAgICAgICAgICAgKg0KKwkgKiAtIGVuZXJneSBvZiBoW10gaXMgYXBwcm94aW1hdGVseSBNQVgvMTYuICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAtIER1cmluZyBzZWFyY2gsIHRoZSBlbmVyZ3kgaXMgZGl2aWRlZCBieSA4IHRvIGF2b2lkICAgICAgICAgKg0KKwkgKiAgIG92ZXJmbG93IG9uICJhbHAiLiAoZW5lcmd5IG9mIGhbXSA9IE1BWC8xMjgpLiAgICAgICAgICAgICAgKg0KKwkgKiAgPT0+ICJhbHAiIHdvcnN0IGNhc2UgZGV0ZWN0ZWQgaXMgMjI4NTQgb24gc2ludXNvaWRhbCB3YXZlLiAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJLyogaW1wdWxzZSByZXNwb25zZSBidWZmZXIgZm9yIGZhc3QgY29tcHV0YXRpb24gKi8NCisNCisJaCA9IGhfYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWhfaW52ID0gaF9idWYgKyAoMiAqIExfU1VCRlIpOyAgIA0KKwlMX3RtcCA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCXsNCisJCSpoKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkqaF9pbnYrKyA9IDA7ICAgDQorCQlMX3RtcCArPSAoSFtpXSAqIEhbaV0pIDw8IDE7DQorCX0NCisJLyogc2NhbGUgaFtdIGRvd24gKC8yKSB3aGVuIGVuZXJneSBvZiBoW10gaXMgaGlnaCB3aXRoIG1hbnkgcHVsc2VzIHVzZWQgKi8NCisJdmFsID0gZXh0cmFjdF9oKExfdG1wKTsNCisJaF9zaGlmdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWlmICgobmJfcHVsc2UgPj0gMTIpICYmICh2YWwgPiAxMDI0KSkNCisJew0KKwkJaF9zaGlmdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlwMCA9IEg7DQorCXAxID0gaDsNCisJcDIgPSBoX2ludjsNCisNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIvNDsgaSsrKQ0KKwl7DQorCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIA0KKwkJKnAyKysgPSAtKCpwMSsrKTsgIA0KKwkJKnAxID0gKnAwKysgPj4gaF9zaGlmdDsgICAgICAgICANCisJCSpwMisrID0gLSgqcDErKyk7IA0KKwkJKnAxID0gKnAwKysgPj4gaF9zaGlmdDsgICAgICAgICANCisJCSpwMisrID0gLSgqcDErKyk7IA0KKwkJKnAxID0gKnAwKysgPj4gaF9zaGlmdDsgICAgICAgICANCisJCSpwMisrID0gLSgqcDErKyk7IA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBDb21wdXRlIHJyaXhpeFtdW10gbmVlZGVkIGZvciB0aGUgY29kZWJvb2sgc2VhcmNoLiAgICAgICAgICoNCisJICogVGhpcyBhbGdvcml0aG0gY29tcHV0ZSBpbXB1bHNlIHJlc3BvbnNlIGVuZXJneSBvZiBhbGwgICAgICAqDQorCSAqIHBvc2l0aW9ucyAoMTYpIGluIGVhY2ggdHJhY2sgKDQpLiAgICAgICBUb3RhbCA9IDR4MTYgPSA2NC4gKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCS8qIHN0b3JhZ2Ugb3JkZXIgLS0+IGkzaTMsIGkyaTIsIGkxaTEsIGkwaTAgKi8NCisNCisJLyogSW5pdCBwb2ludGVycyB0byBsYXN0IHBvc2l0aW9uIG9mIHJyaXhpeFtdICovDQorCXAwID0gJnJyaXhpeFswXVtOQl9QT1MgLSAxXTsgICAgICAgICAgIA0KKwlwMSA9ICZycml4aXhbMV1bTkJfUE9TIC0gMV07ICAgICAgICAgICANCisJcDIgPSAmcnJpeGl4WzJdW05CX1BPUyAtIDFdOyAgICAgICAgICAgDQorCXAzID0gJnJyaXhpeFszXVtOQl9QT1MgLSAxXTsgICAgICAgICAgIA0KKw0KKwlwdHJfaDEgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJY29yID0gMHgwMDAwODAwMEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgKi8NCisJZm9yIChpID0gMDsgaSA8IE5CX1BPUzsgaSsrKQ0KKwl7DQorCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDEpKTsNCisJCXB0cl9oMSsrOw0KKwkJKnAzLS0gPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICANCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMSkpOw0KKwkJcHRyX2gxKys7DQorCQkqcDItLSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgIA0KKwkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gxKSk7DQorCQlwdHJfaDErKzsNCisJCSpwMS0tID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgDQorCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDEpKTsNCisJCXB0cl9oMSsrOw0KKwkJKnAwLS0gPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICANCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQ29tcHV0ZSBycml4aXlbXVtdIG5lZWRlZCBmb3IgdGhlIGNvZGVib29rIHNlYXJjaC4gICAgICAgICAqDQorCSAqIFRoaXMgYWxnb3JpdGhtIGNvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiAyIHB1bHNlcyAgICAgICAgKg0KKwkgKiAoMiBpbXB1bHNlcyByZXNwb25zZXMpIGluIDQgcG9zc2libGUgYWRqYWNlbnRzIHRyYWNrcy4gICAgICoNCisJICogKHRyYWNrIDAtMSwgMS0yLCAyLTMgYW5kIDMtMCkuICAgICBUb3RhbCA9IDR4MTZ4MTYgPSAxMDI0LiAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJLyogc3RvcmFnZSBvcmRlciAtLT4gaTJpMywgaTFpMiwgaTBpMSwgaTNpMCAqLw0KKw0KKwlwb3MgPSBNU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICANCisJcHRyX2hmID0gaCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBOQl9QT1M7IGsrKykNCisJew0KKwkJcDMgPSAmcnJpeGl5WzJdW3Bvc107ICAgICAgICAgICAgICANCisJCXAyID0gJnJyaXhpeVsxXVtwb3NdOyAgICAgICAgICAgICAgDQorCQlwMSA9ICZycml4aXlbMF1bcG9zXTsgICAgICAgICAgICAgIA0KKwkJcDAgPSAmcnJpeGl5WzNdW3BvcyAtIE5CX1BPU107ICAgICANCisNCisJCWNvciA9IDB4MDAwMDgwMDBMOyAgICAgICAgICAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgKi8NCisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlwdHJfaDIgPSBwdHJfaGY7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkJZm9yIChpID0gayArIDE7IGkgPCBOQl9QT1M7IGkrKykNCisJCXsNCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDMgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAyID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIA0KKwkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICANCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDAgPSBleHRyYWN0X2goY29yKTsgICAgICAgICANCisNCisJCQlwMyAtPSAoTkJfUE9TICsgMSk7DQorCQkJcDIgLT0gKE5CX1BPUyArIDEpOw0KKwkJCXAxIC09IChOQl9QT1MgKyAxKTsNCisJCQlwMCAtPSAoTkJfUE9TICsgMSk7DQorCQl9DQorCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCXB0cl9oMSsrOw0KKwkJcHRyX2gyKys7DQorCQkqcDMgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICAgIA0KKwkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQlwdHJfaDErKzsNCisJCXB0cl9oMisrOw0KKwkJKnAyID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICANCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJcHRyX2gxKys7DQorCQlwdHJfaDIrKzsNCisJCSpwMSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgICAgDQorDQorCQlwb3MgLT0gTkJfUE9TOw0KKwkJcHRyX2hmICs9IFNURVA7DQorCX0NCisNCisJLyogc3RvcmFnZSBvcmRlciAtLT4gaTNpMCwgaTJpMywgaTFpMiwgaTBpMSAqLw0KKw0KKwlwb3MgPSBNU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICANCisJcHRyX2hmID0gaCArIDM7ICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBOQl9QT1M7IGsrKykNCisJew0KKwkJcDMgPSAmcnJpeGl5WzNdW3Bvc107ICAgICAgICAgICAgICANCisJCXAyID0gJnJyaXhpeVsyXVtwb3MgLSAxXTsgICAgICAgICAgDQorCQlwMSA9ICZycml4aXlbMV1bcG9zIC0gMV07ICAgICAgICAgIA0KKwkJcDAgPSAmcnJpeGl5WzBdW3BvcyAtIDFdOyAgICAgICAgICANCisNCisJCWNvciA9IDB4MDAwMDgwMDBMOwkJCQkJCQkJLyogZm9yIHJvdW5kaW5nICovDQorCQlwdHJfaDEgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJcHRyX2gyID0gcHRyX2hmOyAgICAgICAgICAgICAgICAgICANCisNCisJCWZvciAoaSA9IGsgKyAxOyBpIDwgTkJfUE9TOyBpKyspDQorCQl7DQorCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAzID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIA0KKwkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMiA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICANCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDEgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAwID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIA0KKw0KKwkJCXAzIC09IChOQl9QT1MgKyAxKTsNCisJCQlwMiAtPSAoTkJfUE9TICsgMSk7DQorCQkJcDEgLT0gKE5CX1BPUyArIDEpOw0KKwkJCXAwIC09IChOQl9QT1MgKyAxKTsNCisJCX0NCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJcHRyX2gxKys7DQorCQlwdHJfaDIrKzsNCisJCSpwMyA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgICAgDQorDQorCQlwb3MtLTsNCisJCXB0cl9oZiArPSBTVEVQOw0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBNb2RpZmljYXRpb24gb2YgcnJpeGl5W11bXSB0byB0YWtlIHNpZ25zIGludG8gYWNjb3VudC4gICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlwMCA9ICZycml4aXlbMF1bMF07ICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IE5CX1RSQUNLOyBrKyspDQorCXsNCisJCWpfdGVtcCA9IChrICsgMSkmMHgwMzsNCisJCWZvciAoaSA9IGs7IGkgPCBMX1NVQkZSOyBpICs9IFNURVApDQorCQl7DQorCQkJcHNpZ24gPSBzaWduOyAgICAgICAgICAgICAgICAgIA0KKwkJCWlmIChwc2lnbltpXSA8IDApDQorCQkJew0KKwkJCQlwc2lnbiA9IHZlYzsgICAgICAgICAgICAgICANCisJCQl9DQorCQkJaiA9IGpfdGVtcDsNCisJCQlmb3IgKDsgaiA8IExfU1VCRlI7IGogKz0gU1RFUCkNCisJCQl7DQorCQkJCSpwMCA9IHZvX211bHQoKnAwLCBwc2lnbltqXSk7ICAgIA0KKwkJCQlwMCsrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICAgICAgICAgICAgICAgICAgICAgICBEZWVwIGZpcnN0IHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJcHNrID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWFscGsgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlmb3IgKGsgPSAwOyBrIDwgbmJpdGVyOyBrKyspDQorCXsNCisJCWpfdGVtcCA9IGs8PDI7DQorCQlmb3IgKGkgPSAwOyBpIDwgbmJfcHVsc2U7IGkrKykNCisJCQlpcG9zW2ldID0gdGlwb3Nbal90ZW1wICsgaV07DQorDQorCQlpZihuYmJpdHMgPT0gMjApDQorCQl7DQorCQkJcG9zID0gMDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCXBzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlhbHAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCQl7DQorCQkJCXZlY1tpXSA9IDA7ICAgICAgICAgICAgICAgIA0KKwkJCX0NCisJCX0gZWxzZSBpZiAoKG5iYml0cyA9PSAzNikgfHwgKG5iYml0cyA9PSA0NCkpDQorCQl7DQorCQkJLyogZmlyc3Qgc3RhZ2U6IGZpeCAyIHB1bHNlcyAqLw0KKwkJCXBvcyA9IDI7DQorDQorCQkJaXggPSBpbmRbMF0gPSBwb3NfbWF4W2lwb3NbMF1dOw0KKwkJCWl5ID0gaW5kWzFdID0gcG9zX21heFtpcG9zWzFdXTsNCisJCQlwcyA9IGRuW2l4XSArIGRuW2l5XTsNCisJCQlpID0gaXggPj4gMjsgICAgICAgICAgICAgICAgLyogaXggLyBTVEVQICovDQorCQkJaiA9IGl5ID4+IDI7ICAgICAgICAgICAgICAgIC8qIGl5IC8gU1RFUCAqLw0KKwkJCXMgPSBycml4aXhbaXBvc1swXV1baV0gPDwgMTM7DQorCQkJcyArPSBycml4aXhbaXBvc1sxXV1bal0gPDwgMTM7DQorCQkJaSA9IChpIDw8IDQpICsgajsgICAgICAgICAvKiAoaXgvU1RFUCkqTkJfUE9TICsgKGl5L1NURVApICovDQorCQkJcyArPSBycml4aXlbaXBvc1swXV1baV0gPDwgMTQ7DQorCQkJYWxwID0gKHMgKyAweDgwMDApID4+IDE2Ow0KKwkJCWlmIChzaWduW2l4XSA8IDApDQorCQkJCXAwID0gaF9pbnYgLSBpeDsNCisJCQllbHNlDQorCQkJCXAwID0gaCAtIGl4Ow0KKwkJCWlmIChzaWduW2l5XSA8IDApDQorCQkJCXAxID0gaF9pbnYgLSBpeTsNCisJCQllbHNlDQorCQkJCXAxID0gaCAtIGl5Ow0KKw0KKwkJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCQkJew0KKwkJCQl2ZWNbaV0gPSAoKnAwKyspICsgKCpwMSsrKTsNCisJCQl9DQorDQorCQkJaWYobmJiaXRzID09IDQ0KQ0KKwkJCXsNCisJCQkJaXBvc1s4XSA9IDA7ICAgICAgICAgICAgICAgDQorCQkJCWlwb3NbOV0gPSAxOyAgICAgICAgICAgICAgIA0KKwkJCX0NCisJCX0gZWxzZQ0KKwkJew0KKwkJCS8qIGZpcnN0IHN0YWdlOiBmaXggNCBwdWxzZXMgKi8NCisJCQlwb3MgPSA0Ow0KKw0KKwkJCWl4ID0gaW5kWzBdID0gcG9zX21heFtpcG9zWzBdXTsgIA0KKwkJCWl5ID0gaW5kWzFdID0gcG9zX21heFtpcG9zWzFdXTsgIA0KKwkJCWkgPSBpbmRbMl0gPSBwb3NfbWF4W2lwb3NbMl1dOyAgIA0KKwkJCWogPSBpbmRbM10gPSBwb3NfbWF4W2lwb3NbM11dOyAgIA0KKwkJCXBzID0gYWRkMShhZGQxKGFkZDEoZG5baXhdLCBkbltpeV0pLCBkbltpXSksIGRuW2pdKTsNCisNCisJCQlpZiAoc2lnbltpeF0gPCAwKQ0KKwkJCQlwMCA9IGhfaW52IC0gaXg7DQorCQkJZWxzZQ0KKwkJCQlwMCA9IGggLSBpeDsNCisNCisJCQlpZiAoc2lnbltpeV0gPCAwKQ0KKwkJCQlwMSA9IGhfaW52IC0gaXk7DQorCQkJZWxzZQ0KKwkJCQlwMSA9IGggLSBpeTsNCisNCisJCQlpZiAoc2lnbltpXSA8IDApDQorCQkJCXAyID0gaF9pbnYgLSBpOw0KKwkJCWVsc2UNCisJCQkJcDIgPSBoIC0gaTsNCisNCisJCQlpZiAoc2lnbltqXSA8IDApDQorCQkJCXAzID0gaF9pbnYgLSBqOw0KKwkJCWVsc2UNCisJCQkJcDMgPSBoIC0gajsNCisNCisJCQlMX3RtcCA9IDBMOw0KKwkJCWZvcihpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCQl7DQorCQkJCXZlY1tpXSAgPSBhZGQxKGFkZDEoYWRkMSgqcDArKywgKnAxKyspLCAqcDIrKyksICpwMysrKTsNCisJCQkJTF90bXAgICs9ICh2ZWNbaV0gKiB2ZWNbaV0pIDw8IDE7DQorCQkJfQ0KKw0KKwkJCWFscCA9ICgoTF90bXAgPj4gMykgKyAweDgwMDApID4+IDE2Ow0KKw0KKwkJCWlmKG5iYml0cyA9PSA3MikNCisJCQl7DQorCQkJCWlwb3NbMTZdID0gMDsgICAgICAgICAgICAgIA0KKwkJCQlpcG9zWzE3XSA9IDE7ICAgICAgICAgICAgICANCisJCQl9DQorCQl9DQorDQorCQkvKiBvdGhlciBzdGFnZXMgb2YgMiBwdWxzZXMgKi8NCisNCisJCWZvciAoaiA9IHBvcywgc3QgPSAwOyBqIDwgbmJfcHVsc2U7IGogKz0gMiwgc3QrKykNCisJCXsNCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCSAqIENhbGN1bGF0ZSBjb3JyZWxhdGlvbiBvZiBhbGwgcG9zc2libGUgcG9zaXRpb25zICAqDQorCQkJICogb2YgdGhlIG5leHQgMiBwdWxzZXMgd2l0aCBwcmV2aW91cyBmaXhlZCBwdWxzZXMuICoNCisJCQkgKiBFYWNoIHB1bHNlIGNhbiBoYXZlIDE2IHBvc3NpYmxlIHBvc2l0aW9ucy4gICAgICAgKg0KKwkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJCWlmKGlwb3Nbal0gPT0gMykNCisJCQl7DQorCQkJCWNvcl9oX3ZlY18zMChoLCB2ZWMsIGlwb3Nbal0sIHNpZ24sIHJyaXhpeCwgY29yX3gsIGNvcl95KTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCQkJY29yX2hfdmVjXzAxMl9hc20oaCwgdmVjLCBpcG9zW2pdLCBzaWduLCBycml4aXgsIGNvcl94LCBjb3JfeSk7DQorI2Vsc2UNCisJCQkJY29yX2hfdmVjXzAxMihoLCB2ZWMsIGlwb3Nbal0sIHNpZ24sIHJyaXhpeCwgY29yX3gsIGNvcl95KTsNCisjZW5kaWYNCisJCQl9DQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkgKiBGaW5kIGJlc3QgcG9zaXRpb25zIG9mIDIgcHVsc2VzLiAgICAgICAgICAgICAgICAgKg0KKwkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJCXNlYXJjaF9peGl5KG5icG9zW3N0XSwgaXBvc1tqXSwgaXBvc1tqICsgMV0sICZwcywgJmFscCwNCisJCQkJCSZpeCwgJml5LCBkbiwgZG4yLCBjb3JfeCwgY29yX3ksIHJyaXhpeSk7DQorDQorCQkJaW5kW2pdID0gaXg7ICAgICAgICAgICAgICAgICAgIA0KKwkJCWluZFtqICsgMV0gPSBpeTsgICAgICAgICAgICAgICANCisNCisJCQlpZiAoc2lnbltpeF0gPCAwKQ0KKwkJCQlwMCA9IGhfaW52IC0gaXg7DQorCQkJZWxzZQ0KKwkJCQlwMCA9IGggLSBpeDsNCisJCQlpZiAoc2lnbltpeV0gPCAwKQ0KKwkJCQlwMSA9IGhfaW52IC0gaXk7DQorCQkJZWxzZQ0KKwkJCQlwMSA9IGggLSBpeTsNCisNCisJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSs9NCkNCisJCQl7DQorCQkJCXZlY1tpXSAgICs9IGFkZDEoKCpwMCsrKSwgKCpwMSsrKSk7ICAgICAgIA0KKwkJCQl2ZWNbaSsxXSArPSBhZGQxKCgqcDArKyksICgqcDErKykpOyAgICAgICAgDQorCQkJCXZlY1tpKzJdICs9IGFkZDEoKCpwMCsrKSwgKCpwMSsrKSk7ICAgICAgICANCisJCQkJdmVjW2krM10gKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsgICAgICANCisJCQl9DQorCQl9DQorCQkvKiBtZW1vcmlzZSB0aGUgYmVzdCBjb2RldmVjdG9yICovDQorCQlwcyA9IHZvX211bHQocHMsIHBzKTsNCisJCXMgPSB2b19MX21zdSh2b19MX211bHQoYWxwaywgcHMpLCBwc2ssIGFscCk7DQorCQlpZiAocyA+IDApDQorCQl7DQorCQkJcHNrID0gcHM7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWFscGsgPSBhbHA7ICAgICAgICAgICAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgbmJfcHVsc2U7IGkrKykNCisJCQl7DQorCQkJCWNvZHZlY1tpXSA9IGluZFtpXTsgICAgICAgIA0KKwkJCX0NCisJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwkJCXsNCisJCQkJeVtpXSA9IHZlY1tpXTsgICAgICAgICAgICAgDQorCQkJfQ0KKwkJfQ0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQnVpbGQgdGhlIGNvZGV3b3JkLCB0aGUgZmlsdGVyZWQgY29kZXdvcmQgYW5kIGluZGV4IG9mIGNvZGV2ZWN0b3IuKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlmb3IgKGkgPSAwOyBpIDwgTlBNQVhQVCAqIE5CX1RSQUNLOyBpKyspDQorCXsNCisJCWluZFtpXSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJew0KKwkJY29kZVtpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICANCisJCXlbaV0gPSB2b19zaHJfcih5W2ldLCAzKTsgICAgICAgICAgICAgICAvKiBRMTIgdG8gUTkgKi8NCisJfQ0KKwl2YWwgPSAoNTEyID4+IGhfc2hpZnQpOyAgICAgICAgICAgICAgIC8qIGNvZGV3b3JkIGluIFE5IGZvcm1hdCAqLw0KKwlmb3IgKGsgPSAwOyBrIDwgbmJfcHVsc2U7IGsrKykNCisJew0KKwkJaSA9IGNvZHZlY1trXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgcHVsc2UgcG9zaXRpb24gKi8NCisJCWogPSBzaWduW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIHNpZ24gICAgICAgICAgICovDQorCQlpbmRleCA9IGkgPj4gMjsgICAgICAgICAgICAgICAgIC8qIGluZGV4ID0gcG9zIG9mIHB1bHNlICgwLi4xNSkgKi8NCisJCXRyYWNrID0gKFdvcmQxNikgKGkgJiAweDAzKTsgICAgICAgICAvKiB0cmFjayA9IGkgJSBOQl9UUkFDSyAoMC4uMykgICovDQorDQorCQlpZiAoaiA+IDApDQorCQl7DQorCQkJY29kZVtpXSArPSB2YWw7ICAgDQorCQkJY29kdmVjW2tdICs9IDEyODsgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJY29kZVtpXSAtPSB2YWw7ICAgDQorCQkJaW5kZXggKz0gTkJfUE9TOyAgICANCisJCX0NCisNCisJCWkgPSAoV29yZDE2KSgodm9fTF9tdWx0KHRyYWNrLCBOUE1BWFBUKSA+PiAxKSk7DQorDQorCQl3aGlsZSAoaW5kW2ldID49IDApDQorCQl7DQorCQkJaSArPSAxOw0KKwkJfQ0KKwkJaW5kW2ldID0gaW5kZXg7ICAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJLyogQnVpbGQgaW5kZXggb2YgY29kZXZlY3RvciAqLw0KKwlpZihuYmJpdHMgPT0gMjApDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KShxdWFudF8xcF9OMShpbmRba10sIDQpKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0gZWxzZSBpZihuYmJpdHMgPT0gMzYpDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KShxdWFudF8ycF8yTjEoaW5kW2tdLCBpbmRbayArIDFdLCA0KSk7DQorCQkJayArPSBOUE1BWFBUOw0KKwkJfQ0KKwl9IGVsc2UgaWYobmJiaXRzID09IDQ0KQ0KKwl7DQorCQlmb3IgKHRyYWNrID0gMDsgdHJhY2sgPCBOQl9UUkFDSyAtIDI7IHRyYWNrKyspDQorCQl7DQorCQkJX2luZGV4W3RyYWNrXSA9IChXb3JkMTYpKHF1YW50XzNwXzNOMShpbmRba10sIGluZFtrICsgMV0sIGluZFtrICsgMl0sIDQpKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCQlmb3IgKHRyYWNrID0gMjsgdHJhY2sgPCBOQl9UUkFDSzsgdHJhY2srKykNCisJCXsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikocXVhbnRfMnBfMk4xKGluZFtrXSwgaW5kW2sgKyAxXSwgNCkpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJfSBlbHNlIGlmKG5iYml0cyA9PSA1MikNCisJew0KKwkJZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgTkJfVFJBQ0s7IHRyYWNrKyspDQorCQl7DQorCQkJX2luZGV4W3RyYWNrXSA9IChXb3JkMTYpKHF1YW50XzNwXzNOMShpbmRba10sIGluZFtrICsgMV0sIGluZFtrICsgMl0sIDQpKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0gZWxzZSBpZihuYmJpdHMgPT0gNjQpDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCUxfaW5kZXggPSBxdWFudF80cF80TigmaW5kW2tdLCA0KTsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikoKExfaW5kZXggPj4gMTQpICYgMyk7DQorCQkJX2luZGV4W3RyYWNrICsgTkJfVFJBQ0tdID0gKFdvcmQxNikoTF9pbmRleCAmIDB4M0ZGRik7DQorCQkJayArPSBOUE1BWFBUOw0KKwkJfQ0KKwl9IGVsc2UgaWYobmJiaXRzID09IDcyKQ0KKwl7DQorCQlmb3IgKHRyYWNrID0gMDsgdHJhY2sgPCBOQl9UUkFDSyAtIDI7IHRyYWNrKyspDQorCQl7DQorCQkJTF9pbmRleCA9IHF1YW50XzVwXzVOKCZpbmRba10sIDQpOw0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KSgoTF9pbmRleCA+PiAxMCkgJiAweDAzRkYpOw0KKwkJCV9pbmRleFt0cmFjayArIE5CX1RSQUNLXSA9IChXb3JkMTYpKExfaW5kZXggJiAweDAzRkYpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJCWZvciAodHJhY2sgPSAyOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCUxfaW5kZXggPSBxdWFudF80cF80TigmaW5kW2tdLCA0KTsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikoKExfaW5kZXggPj4gMTQpICYgMyk7DQorCQkJX2luZGV4W3RyYWNrICsgTkJfVFJBQ0tdID0gKFdvcmQxNikoTF9pbmRleCAmIDB4M0ZGRik7DQorCQkJayArPSBOUE1BWFBUOw0KKwkJfQ0KKwl9IGVsc2UgaWYobmJiaXRzID09IDg4KQ0KKwl7DQorCQlmb3IgKHRyYWNrID0gMDsgdHJhY2sgPCBOQl9UUkFDSzsgdHJhY2srKykNCisJCXsNCisJCQlMX2luZGV4ID0gcXVhbnRfNnBfNk5fMigmaW5kW2tdLCA0KTsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikoKExfaW5kZXggPj4gMTEpICYgMHgwN0ZGKTsNCisJCQlfaW5kZXhbdHJhY2sgKyBOQl9UUkFDS10gPSAoV29yZDE2KShMX2luZGV4ICYgMHgwN0ZGKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogRnVuY3Rpb24gIGNvcl9oX3ZlYygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBDb21wdXRlIGNvcnJlbGF0aW9ucyBvZiBoW10gd2l0aCB2ZWNbXSBmb3IgdGhlIHNwZWNpZmllZCB0cmFjay4gICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCit2b2lkIGNvcl9oX3ZlY18zMCgNCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHZlY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIHZlY3RvciAoLzgpIHRvIGNvcnJlbGF0ZSB3aXRoIGhbXSAqLw0KKwkJV29yZDE2IHRyYWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBycml4aXhbXVtOQl9QT1NdLCAgICAgICAgICAgICAgLyogKGkpIGNvcnJlbGF0aW9uIG9mIGhbeF0gd2l0aCBoW3hdICAgICAgKi8NCisJCVdvcmQxNiBjb3JfMVtdLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgaiwgcG9zLCBjb3JyOw0KKwlXb3JkMTYgKnAwLCAqcDEsICpwMiwqcDMsKmNvcl94LCpjb3JfeTsNCisJV29yZDMyIExfc3VtMSxMX3N1bTI7DQorCWNvcl94ID0gY29yXzE7DQorCWNvcl95ID0gY29yXzI7DQorCXAwID0gcnJpeGl4W3RyYWNrXTsNCisJcDMgPSBycml4aXhbMF07DQorCXBvcyA9IHRyYWNrOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTkJfUE9TOyBpKz0yKQ0KKwl7DQorCQlMX3N1bTEgPSBMX3N1bTIgPSAwTDsNCisJCXAxID0gaDsNCisJCXAyID0gJnZlY1twb3NdOw0KKwkJZm9yIChqPXBvcztqIDwgTF9TVUJGUjsgaisrKQ0KKwkJew0KKwkJCUxfc3VtMSArPSAqcDEgKiAqcDI7CQkNCisJCQlwMi09MzsNCisJCQlMX3N1bTIgKz0gKnAxKysgKiAqcDI7CQkNCisJCQlwMis9NDsNCisJCX0NCisJCXAyLT0zOw0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKw0KKwkJTF9zdW0xID0gKExfc3VtMSA8PCAyKTsNCisJCUxfc3VtMiA9IChMX3N1bTIgPDwgMik7DQorDQorCQljb3JyID0gdm9fcm91bmQoTF9zdW0xKTsJDQorCQkqY29yX3grKyA9IHZvX211bHQoY29yciwgc2lnbltwb3NdKSArICgqcDArKyk7DQorCQljb3JyID0gdm9fcm91bmQoTF9zdW0yKTsNCisJCSpjb3JfeSsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvcy0zXSkgKyAoKnAzKyspOw0KKwkJcG9zICs9IFNURVA7DQorDQorCQlMX3N1bTEgPSBMX3N1bTIgPSAwTDsNCisJCXAxID0gaDsNCisJCXAyID0gJnZlY1twb3NdOw0KKwkJZm9yIChqPXBvcztqIDwgTF9TVUJGUjsgaisrKQ0KKwkJew0KKwkJCUxfc3VtMSArPSAqcDEgKiAqcDI7CQkNCisJCQlwMi09MzsNCisJCQlMX3N1bTIgKz0gKnAxKysgKiAqcDI7CQkNCisJCQlwMis9NDsNCisJCX0NCisJCXAyLT0zOw0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQ0KKw0KKwkJTF9zdW0xID0gKExfc3VtMSA8PCAyKTsNCisJCUxfc3VtMiA9IChMX3N1bTIgPDwgMik7DQorDQorCQljb3JyID0gdm9fcm91bmQoTF9zdW0xKTsJDQorCQkqY29yX3grKyA9IHZvX211bHQoY29yciwgc2lnbltwb3NdKSArICgqcDArKyk7DQorCQljb3JyID0gdm9fcm91bmQoTF9zdW0yKTsNCisJCSpjb3JfeSsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvcy0zXSkgKyAoKnAzKyspOw0KKwkJcG9zICs9IFNURVA7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCit2b2lkIGNvcl9oX3ZlY18wMTIoDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCisJCVdvcmQxNiB0cmFjaywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHRyYWNrIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZ25bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2lnbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorCQlXb3JkMTYgY29yXzFbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCVdvcmQxNiBjb3JfMltdICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGksIGosIHBvcywgY29ycjsNCisJV29yZDE2ICpwMCwgKnAxLCAqcDIsKnAzLCpjb3JfeCwqY29yX3k7DQorCVdvcmQzMiBMX3N1bTEsTF9zdW0yOw0KKwljb3JfeCA9IGNvcl8xOw0KKwljb3JfeSA9IGNvcl8yOw0KKwlwMCA9IHJyaXhpeFt0cmFja107DQorCXAzID0gcnJpeGl4W3RyYWNrKzFdOw0KKwlwb3MgPSB0cmFjazsNCisNCisJZm9yIChpID0gMDsgaSA8IE5CX1BPUzsgaSs9MikNCisJew0KKwkJTF9zdW0xID0gTF9zdW0yID0gMEw7DQorCQlwMSA9IGg7DQorCQlwMiA9ICZ2ZWNbcG9zXTsNCisJCWZvciAoaj02Mi1wb3MgO2ogPj0gMDsgai0tKQ0KKwkJew0KKwkJCUxfc3VtMSArPSAqcDEgKiAqcDIrKzsNCisJCQlMX3N1bTIgKz0gKnAxKysgKiAqcDI7DQorCQl9DQorCQlMX3N1bTEgKz0gKnAxICogKnAyOw0KKwkJTF9zdW0xID0gKExfc3VtMSA8PCAyKTsNCisJCUxfc3VtMiA9IChMX3N1bTIgPDwgMik7DQorDQorCQljb3JyID0gKExfc3VtMSArIDB4ODAwMCkgPj4gMTY7DQorCQljb3JfeFtpXSA9IHZvX211bHQoY29yciwgc2lnbltwb3NdKSArICgqcDArKyk7DQorCQljb3JyID0gKExfc3VtMiArIDB4ODAwMCkgPj4gMTY7DQorCQljb3JfeVtpXSA9IHZvX211bHQoY29yciwgc2lnbltwb3MgKyAxXSkgKyAoKnAzKyspOw0KKwkJcG9zICs9IFNURVA7DQorDQorCQlMX3N1bTEgPSBMX3N1bTIgPSAwTDsNCisJCXAxID0gaDsNCisJCXAyID0gJnZlY1twb3NdOw0KKwkJZm9yIChqPSA2Mi1wb3M7aiA+PSAwOyBqLS0pDQorCQl7DQorCQkJTF9zdW0xICs9ICpwMSAqICpwMisrOw0KKwkJCUxfc3VtMiArPSAqcDErKyAqICpwMjsNCisJCX0NCisJCUxfc3VtMSArPSAqcDEgKiAqcDI7DQorCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOw0KKwkJTF9zdW0yID0gKExfc3VtMiA8PCAyKTsNCisNCisJCWNvcnIgPSAoTF9zdW0xICsgMHg4MDAwKSA+PiAxNjsNCisJCWNvcl94W2krMV0gPSB2b19tdWx0KGNvcnIsIHNpZ25bcG9zXSkgKyAoKnAwKyspOw0KKwkJY29yciA9IChMX3N1bTIgKyAweDgwMDApID4+IDE2Ow0KKwkJY29yX3lbaSsxXSA9IHZvX211bHQoY29yciwgc2lnbltwb3MgKyAxXSkgKyAoKnAzKyspOw0KKwkJcG9zICs9IFNURVA7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogRnVuY3Rpb24gIHNlYXJjaF9peGl5KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBGaW5kIHRoZSBiZXN0IHBvc2l0aW9ucyBvZiAyIHB1bHNlcyBpbiBhIHN1YmZyYW1lLiAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCit2b2lkIHNlYXJjaF9peGl5KA0KKwkJV29yZDE2IG5iX3Bvc19peCwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbmIgb2YgcG9zIGZvciBwdWxzZSAxICgxLi44KSAgICAgICAqLw0KKwkJV29yZDE2IHRyYWNrX3gsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgb2YgcHVsc2UgMSAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHRyYWNrX3ksICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgb2YgcHVsc2UgMiAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBjb3JyZWxhdGlvbiBvZiBhbGwgZml4ZWQgcHVsc2VzICAqLw0KKwkJV29yZDE2ICogYWxwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBlbmVyZ3kgb2YgYWxsIGZpeGVkIHB1bHNlcyAgICAgICAqLw0KKwkJV29yZDE2ICogaXgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcG9zaXRpb24gb2YgcHVsc2UgMSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcG9zaXRpb24gb2YgcHVsc2UgMiAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGRuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAqLw0KKwkJV29yZDE2IGRuMltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdmVjdG9yIG9mIHNlbGVjdGVkIHBvc2l0aW9ucyAgICAgICAqLw0KKwkJV29yZDE2IGNvcl94W10sICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMSB3aXRoIGZpeGVkIHB1bHNlcyAqLw0KKwkJV29yZDE2IGNvcl95W10sICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMiB3aXRoIGZpeGVkIHB1bHNlcyAqLw0KKwkJV29yZDE2IHJyaXhpeVtdW01TSVpFXSAgICAgICAgICAgICAgICAvKiAoaSkgY29yci4gb2YgcHVsc2UgMSB3aXRoIHB1bHNlIDIgICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIHgsIHksIHBvcywgdGhyZXNfaXg7DQorCVdvcmQxNiBwczEsIHBzMiwgc3EsIHNxazsNCisJV29yZDE2IGFscF8xNiwgYWxwazsNCisJV29yZDE2ICpwMCwgKnAxLCAqcDI7DQorCVdvcmQzMiBzLCBhbHAwLCBhbHAxLCBhbHAyOw0KKw0KKwlwMCA9IGNvcl94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJcDEgPSBjb3JfeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXAyID0gcnJpeGl5W3RyYWNrX3hdOyAgICAgICAgICAgICAgICAgIA0KKw0KKwl0aHJlc19peCA9IG5iX3Bvc19peCAtIE5CX01BWDsNCisNCisJYWxwMCA9IExfZGVwb3NpdF9oKCphbHApOw0KKwlhbHAwID0gKGFscDAgKyAweDAwMDA4MDAwTCk7ICAgICAgIC8qIGZvciByb3VuZGluZyAqLw0KKw0KKwlzcWsgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJYWxwayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoeCA9IHRyYWNrX3g7IHggPCBMX1NVQkZSOyB4ICs9IFNURVApDQorCXsNCisJCXBzMSA9ICpwcyArIGRuW3hdOw0KKwkJYWxwMSA9IGFscDAgKyAoKCpwMCsrKTw8MTMpOw0KKw0KKwkJaWYgKGRuMlt4XSA8IHRocmVzX2l4KQ0KKwkJew0KKwkJCXBvcyA9IC0xOw0KKwkJCWZvciAoeSA9IHRyYWNrX3k7IHkgPCBMX1NVQkZSOyB5ICs9IFNURVApDQorCQkJew0KKwkJCQlwczIgPSBhZGQxKHBzMSwgZG5beV0pOw0KKw0KKwkJCQlhbHAyID0gYWxwMSArICgoKnAxKyspPDwxMyk7DQorCQkJCWFscDIgPSBhbHAyICsgKCgqcDIrKyk8PDE0KTsNCisJCQkJYWxwXzE2ID0gZXh0cmFjdF9oKGFscDIpOw0KKwkJCQlzcSA9IHZvX211bHQocHMyLCBwczIpOw0KKwkJCQlzID0gdm9fTF9tdWx0KGFscGssIHNxKSAtICgoc3FrICogYWxwXzE2KTw8MSk7DQorDQorCQkJCWlmIChzID4gMCkNCisJCQkJew0KKwkJCQkJc3FrID0gc3E7ICAgICAgICAgICAgICANCisJCQkJCWFscGsgPSBhbHBfMTY7ICAgICAgICAgDQorCQkJCQlwb3MgPSB5OyAgICAgICAgICAgICAgIA0KKwkJCQl9DQorCQkJfQ0KKwkJCXAxIC09IE5CX1BPUzsNCisNCisJCQlpZiAocG9zID49IDApDQorCQkJew0KKwkJCQkqaXggPSB4OyAgICAgICAgICAgICAgICAgICANCisJCQkJKml5ID0gcG9zOyAgICAgICAgICAgICAgICAgDQorCQkJfQ0KKwkJfSBlbHNlDQorCQl7DQorCQkJcDIgKz0gTkJfUE9TOw0KKwkJfQ0KKwl9DQorDQorCSpwcyA9IGFkZDEoKnBzLCBhZGQxKGRuWyppeF0sIGRuWyppeV0pKTsgDQorCSphbHAgPSBhbHBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY21uTWVtb3J5LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Ntbk1lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzI2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Ntbk1lbW9yeS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWNtbk1lbW9yeS5jDQorDQorCUNvbnRlbnQ6CXNhbXBsZSBjb2RlIGZvciBtZW1vcnkgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJjbW5NZW1vcnkuaCINCisNCisjaW5jbHVkZSA8bWFsbG9jLmg+DQorI2lmIGRlZmluZWQgTElOVVgNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2VuZGlmDQorDQorLy9WT19NRU1fT1BFUkFUT1IJCWdfbWVtT1A7DQorDQorVk9fVTMyIGNtbk1lbUFsbG9jIChWT19TMzIgdUlELCAgVk9fTUVNX0lORk8gKiBwTWVtSW5mbykNCit7DQorCWlmICghcE1lbUluZm8pDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKw0KKwlwTWVtSW5mby0+VkJ1ZmZlciA9IG1hbGxvYyAocE1lbUluZm8tPlNpemUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fVTMyIGNtbk1lbUZyZWUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwTWVtKQ0KK3sNCisJZnJlZSAocE1lbSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtU2V0IChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYsIFZPX1U4IHVWYWx1ZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtc2V0IChwQnVmZiwgdVZhbHVlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtQ29weSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtY3B5IChwRGVzdCwgcFNvdXJjZSwgdVNpemUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fVTMyCWNtbk1lbUNoZWNrIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlciwgVk9fVTMyIHVTaXplKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1MzMiBjbW5NZW1Db21wYXJlIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlcjEsIFZPX1BUUiBwQnVmZmVyMiwgVk9fVTMyIHVTaXplKQ0KK3sNCisJcmV0dXJuIG1lbWNtcChwQnVmZmVyMSwgcEJ1ZmZlcjIsIHVTaXplKTsNCit9DQorDQorVk9fVTMyCWNtbk1lbU1vdmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwRGVzdCwgVk9fUFRSIHBTb3VyY2UsIFZPX1UzMiB1U2l6ZSkNCit7DQorCW1lbW1vdmUgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjNzRkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgICAgICAgRmlsZTogY29udm9sdmUuYw0KKw0KKwkgICBEZXNjcmlwdGlvbjpQZXJmb3JtIHRoZSBjb252b2x1dGlvbiBiZXR3ZWVuIHR3byB2ZWN0b3JzIHhbXSBhbmQgaFtdDQorCSAgICAgICAgICAgICAgIGFuZCB3cml0ZSB0aGUgcmVzdWx0IGluIHRoZSB2ZWN0b3IgeVtdDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQordm9pZCBDb252b2x2ZSAoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgLyogKGkpICAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgLyogKG8pICAgICA6IG91dHB1dCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTCAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgICkNCit7DQorCVdvcmQzMiAgaSwgbjsNCisJV29yZDE2ICp0bXBILCp0bXBYOw0KKwlXb3JkMzIgczsNCisJZm9yIChuID0gMDsgbiA8IDY0OykNCisJew0KKwkJdG1wSCA9IGgrbjsNCisJCXRtcFggPSB4Ow0KKwkJaT1uKzE7DQorCQlzID0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTtpLS07DQorCQl3aGlsZShpPjApDQorCQl7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCWkgLT0gNDsNCisJCX0NCisJCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7ICAgDQorCQluKys7DQorDQorCQl0bXBIID0gaCtuOw0KKwkJdG1wWCA9IHg7DQorCQlpPW4rMTsNCisJCXMgPSAgdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTtpLS07DQorCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7aS0tOw0KKw0KKwkJd2hpbGUoaT4wKQ0KKwkJew0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlpIC09IDQ7DQorCQl9DQorCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OyAgICANCisJCW4rKzsNCisNCisJCXRtcEggPSBoK247DQorCQl0bXBYID0geDsNCisJCWk9bisxOw0KKwkJcyA9ICB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpO2ktLTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTtpLS07DQorCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7aS0tOw0KKw0KKwkJd2hpbGUoaT4wKQ0KKwkJew0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlpIC09IDQ7DQorCQl9DQorCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OyAgIA0KKwkJbisrOw0KKw0KKwkJcyA9IDA7DQorCQl0bXBIID0gaCtuOw0KKwkJdG1wWCA9IHg7DQorCQlpPW4rMTsNCisJCXdoaWxlKGk+MCkNCisJCXsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJaSAtPSA0Ow0KKwkJfQ0KKwkJeVtuXSA9ICgoczw8MSkgKyAweDgwMDApPj4xNjsgICANCisJCW4rKzsgICAgICAgIA0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb3JfaF94LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJlOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb3JfaF94LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBjb3JfaF94LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKgkgICBEZXNjcmlwdGlvbjpDb21wdXRlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGFyZ2V0ICJ4W10iIGFuZCAiaFtdIiAgKg0KKyoJICAgICAgICAgICAgICAgRGVzaWduZWQgZm9yIGNvZGVib29rIHNlYXJjaCAoMjQgcHVsc2VzLCA0IHRyYWNrcywgICogDQorKgkJCQkgICA0IHB1bHNlcyBwZXIgdHJhY2ssIDE2IHBvc2l0aW9ucyBpbiBlYWNoIHRyYWNrKSB0byAgKg0KKyoJCQkJICAgYXZvaWQgc2F0dXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKw0KKyNkZWZpbmUgTF9TVUJGUiAgIDY0DQorI2RlZmluZSBOQl9UUkFDSyAgNA0KKyNkZWZpbmUgU1RFUCAgICAgIDQNCisNCit2b2lkIGNvcl9oX3goDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IHRhcmdldCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGRuW10gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgPDEyYml0IDogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAgICovDQorCSAgICApDQorew0KKwlXb3JkMzIgaSwgajsNCisJV29yZDMyIExfdG1wLCB5MzJbTF9TVUJGUl0sIExfdG90Ow0KKwlXb3JkMTYgKnAxLCAqcDI7DQorCVdvcmQzMiAqcDM7DQorCVdvcmQzMiBMX21heCwgTF9tYXgxLCBMX21heDIsIExfbWF4MzsNCisJLyogZmlyc3Qga2VlcCB0aGUgcmVzdWx0IG9uIDMyIGJpdHMgYW5kIGZpbmQgYWJzb2x1dGUgbWF4aW11bSAqLw0KKwlMX3RvdCAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJTF9tYXggID0gMDsgDQorCUxfbWF4MSA9IDA7DQorCUxfbWF4MiA9IDA7DQorCUxfbWF4MyA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpICs9IFNURVApDQorCXsNCisJCUxfdG1wID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIC0+IHRvIGF2b2lkIG51bGwgZG5bXSAqLw0KKwkJcDEgPSAmeFtpXTsNCisJCXAyID0gJmhbMF07DQorCQlmb3IgKGogPSBpOyBqIDwgTF9TVUJGUjsgaisrKQ0KKwkJCUxfdG1wICs9IHZvX0xfbXVsdCgqcDErKywgKnAyKyspOw0KKw0KKwkJeTMyW2ldID0gTF90bXA7ICAgICAgICAgICAgICAgDQorCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7DQorCQlpZihMX3RtcCA+IExfbWF4KQ0KKwkJew0KKwkJCUxfbWF4ID0gTF90bXA7ICAgICAgICAgICAgIA0KKwkJfQ0KKw0KKwkJTF90bXAgPSAxTDsNCisJCXAxID0gJnhbaSsxXTsNCisJCXAyID0gJmhbMF07DQorCQlmb3IgKGogPSBpKzE7IGogPCBMX1NVQkZSOyBqKyspDQorCQkJTF90bXAgKz0gdm9fTF9tdWx0KCpwMSsrLCAqcDIrKyk7DQorDQorCQl5MzJbaSsxXSA9IExfdG1wOyAgICAgICAgICAgICAgIA0KKwkJTF90bXAgPSAoTF90bXAgPiAwKT8gTF90bXA6LUxfdG1wOw0KKwkJaWYoTF90bXAgPiBMX21heDEpDQorCQl7DQorCQkJTF9tYXgxID0gTF90bXA7ICAgICAgICAgICAgIA0KKwkJfQ0KKw0KKwkJTF90bXAgPSAxOw0KKwkJcDEgPSAmeFtpKzJdOw0KKwkJcDIgPSAmaFswXTsNCisJCWZvciAoaiA9IGkrMjsgaiA8IExfU1VCRlI7IGorKykNCisJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsNCisNCisJCXkzMltpKzJdID0gTF90bXA7ICAgICAgICAgICAgICAgDQorCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7DQorCQlpZihMX3RtcCA+IExfbWF4MikNCisJCXsNCisJCQlMX21heDIgPSBMX3RtcDsgICAgICAgICAgICAgDQorCQl9DQorDQorCQlMX3RtcCA9IDE7DQorCQlwMSA9ICZ4W2krM107DQorCQlwMiA9ICZoWzBdOw0KKwkJZm9yIChqID0gaSszOyBqIDwgTF9TVUJGUjsgaisrKQ0KKwkJCUxfdG1wICs9IHZvX0xfbXVsdCgqcDErKywgKnAyKyspOw0KKw0KKwkJeTMyW2krM10gPSBMX3RtcDsgICAgICAgICAgICAgICANCisJCUxfdG1wID0gKExfdG1wID4gMCk/IExfdG1wOi1MX3RtcDsNCisJCWlmKExfdG1wID4gTF9tYXgzKQ0KKwkJew0KKwkJCUxfbWF4MyA9IExfdG1wOyAgICAgICAgICAgICANCisJCX0NCisJfQ0KKwkvKiB0b3QgKz0gMyptYXggLyA4ICovDQorCUxfbWF4ID0gKChMX21heCArIExfbWF4MSArIExfbWF4MiArIExfbWF4MykgPj4gMik7DQorCUxfdG90ID0gdm9fTF9hZGQoTF90b3QsIExfbWF4KTsgICAgICAgLyogK21heC80ICovDQorCUxfdG90ID0gdm9fTF9hZGQoTF90b3QsIChMX21heCA+PiAxKSk7ICAvKiArbWF4LzggKi8NCisNCisJLyogRmluZCB0aGUgbnVtYmVyIG9mIHJpZ2h0IHNoaWZ0cyB0byBkbyBvbiB5MzJbXSBzbyB0aGF0ICAgICovDQorCS8qIDYuMCB4IHN1bWF0aW9uIG9mIG1heCBvZiBkbltdIGluIGVhY2ggdHJhY2sgbm90IHNhdHVyYXRlLiAqLw0KKwlqID0gbm9ybV9sKExfdG90KSAtIDQ7ICAgICAgICAgICAgIC8qIDQgLT4gMTYgeCB0b3QgKi8NCisJcDEgPSBkbjsNCisJcDMgPSB5MzI7DQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKz00KQ0KKwl7DQorCQkqcDErKyA9IHZvX3JvdW5kKExfc2hsKCpwMysrLCBqKSk7DQorCQkqcDErKyA9IHZvX3JvdW5kKExfc2hsKCpwMysrLCBqKSk7DQorCQkqcDErKyA9IHZvX3JvdW5kKExfc2hsKCpwMysrLCBqKSk7DQorCQkqcDErKyA9IHZvX3JvdW5kKExfc2hsKCpwMysrLCBqKSk7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlY2ltNTQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWE3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlY2ltNTQuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogZGVjaW01NC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOkRlY2ltYXRpb24gb2YgMTZrSHogc2lnbmFsIHRvIDEyLjhrSHogICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNkZWZpbmUgRkFDNSAgIDUNCisjZGVmaW5lIERPV05fRkFDICAyNjIxNSAgICAgICAgICAgICAgICAgICAgLyogNC81IGluIFExNSAqLw0KKw0KKyNkZWZpbmUgTkJfQ09FRl9ET1dOICAxNQ0KKw0KKy8qIExvY2FsIGZ1bmN0aW9ucyAqLw0KK3N0YXRpYyB2b2lkIERvd25fc2FtcCgNCisJCVdvcmQxNiAqIHNpZywgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgdG8gZG93bnNhbXBsaW5nICAqLw0KKwkJV29yZDE2ICogc2lnX2QsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGRvd25zYW1wbGVkIHNpZ25hbCAgICAgICovDQorCQlXb3JkMTYgTF9mcmFtZV9kICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIG91dHB1dCAgICAgICAgKi8NCisJCSk7DQorDQorLyogMS81IHJlc29sdXRpb24gaW50ZXJwb2xhdGlvbiBmaWx0ZXIgIChpbiBRMTQpICAqLw0KKy8qIC0xLjVkQiBAIDZrSHosIC02ZEIgQCA2LjRrSHosIC0xMGRCIEAgNi42a0h6LCAtMjBkQiBAIDYuOWtIeiwgLTI1ZEIgQCA3a0h6LCAtNTVkQiBAIDhrSHogKi8NCisNCitzdGF0aWMgV29yZDE2IGZpcl9kb3duMVs0XVszMF0gPQ0KK3sNCisJey01LCAyNCwgLTUwLCA1NCwgMCwgLTEyOCwgMjk0LCAtNDA4LCAzNDQsIDAsIC02NDcsIDE1MDUsIC0yMzc5LCAzMDM0LCAxMzEwNywgMzAzNCwgLTIzNzksIDE1MDUsIC02NDcsIDAsIDM0NCwgLTQwOCwNCisJMjk0LCAtMTI4LCAwLCA1NCwgLTUwLCAyNCwgLTUsIDB9LA0KKw0KKwl7LTYsIDE5LCAtMjYsIDAsIDc3LCAtMTg4LCAyNzAsIC0yMzMsIDAsIDQzNCwgLTk2NCwgMTM2NiwgLTEyOTMsIDAsIDEyMjU0LCA2NTc1LCAtMjc0NiwgMTAzMCwgMCwgLTUwNywgNjAxLCAtNDQxLA0KKwkxOTgsIDAsIC05NSwgOTksIC01OCwgMTgsIDAsIC0xfSwNCisNCisJey0zLCA5LCAwLCAtNDEsIDExMSwgLTE3MCwgMTUzLCAwLCAtMjk1LCA2NDksIC04ODgsIDc3MCwgMCwgLTE5OTcsIDk4OTQsIDk4OTQsIC0xOTk3LCAwLCA3NzAsIC04ODgsIDY0OSwgLTI5NSwgMCwNCisJMTUzLCAtMTcwLCAxMTEsIC00MSwgMCwgOSwgLTN9LA0KKw0KKwl7LTEsIDAsIDE4LCAtNTgsIDk5LCAtOTUsIDAsIDE5OCwgLTQ0MSwgNjAxLCAtNTA3LCAwLCAxMDMwLCAtMjc0NiwgNjU3NSwgMTIyNTQsIDAsIC0xMjkzLCAxMzY2LCAtOTY0LCA0MzQsIDAsDQorCS0yMzMsIDI3MCwgLTE4OCwgNzcsIDAsIC0yNiwgMTksIC02fQ0KK307DQorDQordm9pZCBJbml0X0RlY2ltXzEyazgoDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogbWVtb3J5ICgyKk5CX0NPRUZfRE9XTikgc2V0IHRvIHplcm9zICovDQorCQkpDQorew0KKwlTZXRfemVybyhtZW0sIDIgKiBOQl9DT0VGX0RPV04pOw0KKwlyZXR1cm47DQorfQ0KKw0KK3ZvaWQgRGVjaW1fMTJrOCgNCisJCVdvcmQxNiBzaWcxNmtbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgdG8gZG93bnNhbXBsaW5nICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorCQlXb3JkMTYgc2lnMTJrOFtdLCAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogZGVjaW1hdGVkIHNpZ25hbCAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKDIqTkJfQ09FRl9ET1dOKSAqLw0KKwkgICAgICAgKQ0KK3sNCisJV29yZDE2IGxnX2Rvd247DQorCVdvcmQxNiBzaWduYWxbTF9GUkFNRTE2ayArICgyICogTkJfQ09FRl9ET1dOKV07DQorDQorCUNvcHkobWVtLCBzaWduYWwsIDIgKiBOQl9DT0VGX0RPV04pOw0KKw0KKwlDb3B5KHNpZzE2aywgc2lnbmFsICsgKDIgKiBOQl9DT0VGX0RPV04pLCBsZyk7DQorDQorCWxnX2Rvd24gPSAobGcgKiBET1dOX0ZBQyk+PjE1Ow0KKw0KKwlEb3duX3NhbXAoc2lnbmFsICsgTkJfQ09FRl9ET1dOLCBzaWcxMms4LCBsZ19kb3duKTsNCisNCisJQ29weShzaWduYWwgKyBsZywgbWVtLCAyICogTkJfQ09FRl9ET1dOKTsNCisNCisJcmV0dXJuOw0KK30NCisNCitzdGF0aWMgdm9pZCBEb3duX3NhbXAoDQorCQlXb3JkMTYgKiBzaWcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgc2lnbmFsIHRvIGRvd25zYW1wbGluZyAgKi8NCisJCVdvcmQxNiAqIHNpZ19kLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBkb3duc2FtcGxlZCBzaWduYWwgICAgICAqLw0KKwkJV29yZDE2IExfZnJhbWVfZCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBvdXRwdXQgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgaiwgZnJhYywgcG9zOw0KKwlXb3JkMTYgKngsICp5Ow0KKwlXb3JkMzIgTF9zdW07DQorDQorCXBvcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zaXRpb24gaXMgaW4gUTIgLT4gMS80IHJlc29sdXRpb24gICovDQorCWZvciAoaiA9IDA7IGogPCBMX2ZyYW1lX2Q7IGorKykNCisJew0KKwkJaSA9IChwb3MgPj4gMik7ICAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgcGFydCAgICAgKi8NCisJCWZyYWMgPSBwb3MgJiAzOyAgICAgICAgICAgICAgICAgICAvKiBmcmFjdGlvbmFsIHBhcnQgKi8NCisJCXggPSBzaWcgKyBpIC0gTkJfQ09FRl9ET1dOICsgMTsNCisJCXkgPSAoV29yZDE2ICopKGZpcl9kb3duMSArIGZyYWMpOw0KKw0KKwkJTF9zdW0gPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KyspLCgqeSsrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KSwoKnkpKTsNCisNCisJCUxfc3VtID0gTF9zaGwyKExfc3VtLCAyKTsgICAgICAgICAgICAgIA0KKwkJc2lnX2Rbal0gPSBleHRyYWN0X2goTF9hZGQoTF9zdW0sIDB4ODAwMCkpOyANCisJCXBvcyArPSBGQUM1OyAgICAgICAgICAgICAgLyogcG9zICsgNS80ICovDQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlZW1waC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQ1MjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYwpAQCAtMCwwICsxLDExNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGRlZW1waC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOmZpbHRlcmluZyB0aHJvdWdoIDEvKDEtbXUgel4gLTEpICAgICAgICAgICAgICAgICAgICAqDQorKgkgICAgICAgICAgICAgICBEZWVtcGgyIC0tPiBzaWduYWwgaXMgZGl2aWRlZCBieSAyICAgICAgICAgICAgICAgICAgKg0KKyoJCQkJICAgRGVlbXBoXzMyIC0tPiBmb3IgMzIgYml0cyBzaWduYWwuICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKw0KK3ZvaWQgRGVlbXBoKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisNCisJTF90bXAgPSBMX2RlcG9zaXRfaCh4WzBdKTsNCisJTF90bXAgPSBMX21hYyhMX3RtcCwgKm1lbSwgbXUpOw0KKwl4WzBdID0gdm9fcm91bmQoTF90bXApOyAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpID0gMTsgaSA8IEw7IGkrKykNCisJew0KKwkJTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsNCisJCUxfdG1wID0gTF9tYWMoTF90bXAsIHhbaSAtIDFdLCBtdSk7DQorCQl4W2ldID0gdm9yb3VuZChMX3RtcCk7ICAgICAgICAgICAgICAgDQorCX0NCisNCisJKm1lbSA9IHhbTCAtIDFdOyAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBEZWVtcGgyKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgTF90bXA7DQorCUxfdG1wID0geFswXSA8PCAxNTsNCisJTF90bXAgKz0gKCgqbWVtKSAqIG11KTw8MTsNCisJeFswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMTsgaSA8IEw7IGkrKykNCisJew0KKwkJTF90bXAgPSB4W2ldIDw8IDE1Ow0KKwkJTF90bXAgKz0gKHhbaSAtIDFdICogbXUpPDwxOw0KKwkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIA0KKwl9DQorCSptZW0gPSB4W0wgLSAxXTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgRGVlbXBoXzMyKA0KKwkJV29yZDE2IHhfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQzMS4uMTYpICovDQorCQlXb3JkMTYgeF9sb1tdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDE1Li40KSAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgKHgxNikgICAgICAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICovDQorCQlXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSAoeVstMV0pICAgICAgICAgICAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMTYgZmFjOw0KKwlXb3JkMzIgaSwgTF90bXA7DQorDQorCWZhYyA9IG11ID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMTUgLS0+IFExNCAqLw0KKw0KKwlMX3RtcCA9IExfZGVwb3NpdF9oKHhfaGlbMF0pOw0KKwlMX3RtcCArPSAoeF9sb1swXSAqIDgpPDwxOw0KKwlMX3RtcCA9IChMX3RtcCA8PCAzKTsNCisJTF90bXAgKz0gKCgqbWVtKSAqIGZhYyk8PDE7DQorCUxfdG1wID0gKExfdG1wIDw8IDEpOyAgICAgICAgICAgICAgIA0KKwl5WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoaSA9IDE7IGkgPCBMOyBpKyspDQorCXsNCisJCUxfdG1wID0gTF9kZXBvc2l0X2goeF9oaVtpXSk7DQorCQlMX3RtcCArPSAoeF9sb1tpXSAqIDgpPDwxOw0KKwkJTF90bXAgPSAoTF90bXAgPDwgMyk7DQorCQlMX3RtcCArPSAoeVtpIC0gMV0gKiBmYWMpPDwxOw0KKwkJTF90bXAgPSAoTF90bXAgPDwgMSk7ICAgICAgICAgICANCisJCXlbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICANCisJfQ0KKw0KKwkqbWVtID0geVtMIC0gMV07ICAgICAgICAgICAgICAgICAgICAgICANCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2R0eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkyMWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYwpAQCAtMCwwICsxLDYwNSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGR0eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgICBEZXNjcmlwdGlvbjpEVFggZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90b3R5cGUgb2YgZnVuY3Rpb25zICAgICovDQorI2luY2x1ZGUgImJpdHMuaCINCisjaW5jbHVkZSAiZHR4LmgiDQorI2luY2x1ZGUgImxvZzIuaCINCisjaW5jbHVkZSAibWVtX2FsaWduLmgiDQorDQorc3RhdGljIHZvaWQgYXZlcl9pc2ZfaGlzdG9yeSgNCisJCVdvcmQxNiBpc2Zfb2xkW10sDQorCQlXb3JkMTYgaW5kaWNlc1tdLA0KKwkJV29yZDMyIGlzZl9hdmVyW10NCisJCSk7DQorDQorc3RhdGljIHZvaWQgZmluZF9mcmFtZV9pbmRpY2VzKA0KKwkJV29yZDE2IGlzZl9vbGRfdHhbXSwNCisJCVdvcmQxNiBpbmRpY2VzW10sDQorCQlkdHhfZW5jU3RhdGUgKiBzdA0KKwkJKTsNCisNCitzdGF0aWMgV29yZDE2IGRpdGhlcmluZ19jb250cm9sKA0KKwkJZHR4X2VuY1N0YXRlICogc3QNCisJCSk7DQorDQorLyogZXhjaXRhdGlvbiBlbmVyZ3kgYWRqdXN0bWVudCBkZXBlbmRpbmcgb24gc3BlZWNoIGNvZGVyIG1vZGUgdXNlZCwgUTcgKi8NCitzdGF0aWMgV29yZDE2IGVuX2FkanVzdFs5XSA9DQorew0KKwkyMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlMCA9IDdrICA6ICAtNS40ZEIgICovDQorCTE3OSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGUxID0gOWsgIDogIC00LjJkQiAgKi8NCisJMTQxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTIgPSAxMmsgOiAgLTMuM2RCICAqLw0KKwkxMjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlMyA9IDE0ayA6ICAtMy4wZEIgICovDQorCTEyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGU0ID0gMTZrIDogIC0yLjg1ZEIgKi8NCisJMTE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTUgPSAxOGsgOiAgLTIuN2RCICAqLw0KKwkxMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlNiA9IDIwayA6ICAtMi43ZEIgICovDQorCTExNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGU3ID0gMjNrIDogIC0yLjdkQiAgKi8NCisJMTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTggPSAyNGsgOiAgLTIuN2RCICAqLw0KK307DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogRnVuY3Rpb24gICAgOiBkdHhfZW5jX2luaXQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorV29yZDE2IGR0eF9lbmNfaW5pdChkdHhfZW5jU3RhdGUgKiogc3QsIFdvcmQxNiBpc2ZfaW5pdFtdLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkNCit7DQorCWR0eF9lbmNTdGF0ZSAqczsNCisNCisJaWYgKHN0ID09IChkdHhfZW5jU3RhdGUgKiopIE5VTEwpDQorCXsNCisJCWZwcmludGYoc3RkZXJyLCAiZHR4X2VuY19pbml0OiBpbnZhbGlkIHBhcmFtZXRlclxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJKnN0ID0gTlVMTDsNCisNCisJLyogYWxsb2NhdGUgbWVtb3J5ICovDQorCWlmICgocyA9IChkdHhfZW5jU3RhdGUgKiltZW1fbWFsbG9jKHBNZW1PUCwgc2l6ZW9mKGR0eF9lbmNTdGF0ZSksIDMyLCBWT19JTkRFWF9FTkNfQU1SV0IpKSA9PSBOVUxMKQ0KKwl7DQorCQlmcHJpbnRmKHN0ZGVyciwgImR0eF9lbmNfaW5pdDogY2FuIG5vdCBtYWxsb2Mgc3RhdGUgc3RydWN0dXJlXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlkdHhfZW5jX3Jlc2V0KHMsIGlzZl9pbml0KTsNCisJKnN0ID0gczsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEZ1bmN0aW9uICAgIDogZHR4X2VuY19yZXNldA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitXb3JkMTYgZHR4X2VuY19yZXNldChkdHhfZW5jU3RhdGUgKiBzdCwgV29yZDE2IGlzZl9pbml0W10pDQorew0KKwlXb3JkMzIgaTsNCisNCisJaWYgKHN0ID09IChkdHhfZW5jU3RhdGUgKikgTlVMTCkNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJkdHhfZW5jX3Jlc2V0OiBpbnZhbGlkIHBhcmFtZXRlclxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJc3QtPmhpc3RfcHRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgDQorCXN0LT5sb2dfZW5faW5kZXggPSAwOyAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBJbml0IGlzZl9oaXN0W10gKi8NCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJQ29weShpc2ZfaW5pdCwgJnN0LT5pc2ZfaGlzdFtpICogTV0sIE0pOw0KKwl9DQorCXN0LT5jbmdfc2VlZCA9IFJBTkRPTV9JTklUU0VFRDsgICAgICAgDQorDQorCS8qIFJlc2V0IGVuZXJneSBoaXN0b3J5ICovDQorCVNldF96ZXJvKHN0LT5sb2dfZW5faGlzdCwgRFRYX0hJU1RfU0laRSk7DQorDQorCXN0LT5kdHhIYW5nb3ZlckNvdW50ID0gRFRYX0hBTkdfQ09OU1Q7IA0KKwlzdC0+ZGVjQW5hRWxhcHNlZENvdW50ID0gMzI3Njc7ICAgICAgICANCisNCisJZm9yIChpID0gMDsgaSA8IDI4OyBpKyspDQorCXsNCisJCXN0LT5EW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkUgLSAxOyBpKyspDQorCXsNCisJCXN0LT5zdW1EW2ldID0gMDsgICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEZ1bmN0aW9uICAgIDogZHR4X2VuY19leGl0DQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgZHR4X2VuY19leGl0KGR0eF9lbmNTdGF0ZSAqKiBzdCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApDQorew0KKwlpZiAoc3QgPT0gTlVMTCB8fCAqc3QgPT0gTlVMTCkNCisJCXJldHVybjsNCisJLyogZGVhbGxvY2F0ZSBtZW1vcnkgKi8NCisJbWVtX2ZyZWUocE1lbU9QLCAqc3QsIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCSpzdCA9IE5VTEw7DQorCXJldHVybjsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogRnVuY3Rpb24gICAgOiBkdHhfZW5jDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK1dvcmQxNiBkdHhfZW5jKA0KKwkJZHR4X2VuY1N0YXRlICogc3QsICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaXNmW01dLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG8gICA6IENOIElTRiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGV4YzIsICAgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogQ04gZXhjaXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICoqIHBybXMNCisJICAgICAgKQ0KK3sNCisJV29yZDMyIGksIGo7DQorCVdvcmQxNiBpbmRpY2VbN107DQorCVdvcmQxNiBsb2dfZW4sIGdhaW4sIGxldmVsLCBleHAsIGV4cDAsIHRtcDsNCisJV29yZDE2IGxvZ19lbl9pbnRfZSwgbG9nX2VuX2ludF9tOw0KKwlXb3JkMzIgTF9pc2ZbTV0sIGVuZXIzMiwgbGV2ZWwzMjsNCisJV29yZDE2IGlzZl9vcmRlclszXTsNCisJV29yZDE2IENOX2RpdGg7DQorDQorCS8qIFZPWCBtb2RlIGNvbXB1dGF0aW9uIG9mIFNJRCBwYXJhbWV0ZXJzICovDQorCWxvZ19lbiA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCXsNCisJCUxfaXNmW2ldID0gMDsNCisJfQ0KKwkvKiBhdmVyYWdlIGVuZXJneSBhbmQgaXNmICovDQorCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspDQorCXsNCisJCS8qIERpdmlzaW9uIGJ5IERUWF9ISVNUX1NJWkUgPSA4IGhhcyBiZWVuIGRvbmUgaW4gZHR4X2J1ZmZlci4gbG9nX2VuIGlzIGluIFExMCAqLw0KKwkJbG9nX2VuID0gYWRkKGxvZ19lbiwgc3QtPmxvZ19lbl9oaXN0W2ldKTsNCisNCisJfQ0KKwlmaW5kX2ZyYW1lX2luZGljZXMoc3QtPmlzZl9oaXN0LCBpc2Zfb3JkZXIsIHN0KTsNCisJYXZlcl9pc2ZfaGlzdG9yeShzdC0+aXNmX2hpc3QsIGlzZl9vcmRlciwgTF9pc2YpOw0KKw0KKwlmb3IgKGogPSAwOyBqIDwgTTsgaisrKQ0KKwl7DQorCQlpc2Zbal0gPSAoV29yZDE2KShMX2lzZltqXSA+PiAzKTsgIC8qIGRpdmlkZSBieSA4ICovDQorCX0NCisNCisJLyogcXVhbnRpemUgbG9nYXJpdGhtaWMgZW5lcmd5IHRvIDYgYml0cyAoLTYgOiA2NiBkQikgd2hpY2ggY29ycmVzcG9uZHMgdG8gLTI6MjIgaW4gbG9nMihFKS4gICovDQorCS8qIHN0LT5sb2dfZW5faW5kZXggPSAoc2hvcnQpKCAobG9nX2VuICsgMi4wKSAqIDIuNjI1ICk7ICovDQorDQorCS8qIGluY3JlYXNlIGR5bmFtaWNzIHRvIDcgYml0cyAoUTgpICovDQorCWxvZ19lbiA9IChsb2dfZW4gPj4gMik7DQorDQorCS8qIEFkZCAyIGluIFE4ID0gNTEyIHRvIGdldCBsb2cyKEUpIGJldHdlZW4gMDoyNCAqLw0KKwlsb2dfZW4gPSBhZGQobG9nX2VuLCA1MTIpOw0KKw0KKwkvKiBNdWx0aXBseSBieSAyLjYyNSB0byBnZXQgZnVsbCA2IGJpdCByYW5nZS4gMi42MjUgPSAyMTUwNCBpbiBRMTMuIFRoZSByZXN1bHQgaXMgaW4gUTYgKi8NCisJbG9nX2VuID0gbXVsdChsb2dfZW4sIDIxNTA0KTsNCisNCisJLyogUXVhbnRpemUgRW5lcmd5ICovDQorCXN0LT5sb2dfZW5faW5kZXggPSBzaHIobG9nX2VuLCA2KTsNCisNCisJaWYoc3QtPmxvZ19lbl9pbmRleCA+IDYzKQ0KKwl7DQorCQlzdC0+bG9nX2VuX2luZGV4ID0gNjM7DQorCX0NCisJaWYgKHN0LT5sb2dfZW5faW5kZXggPCAwKQ0KKwl7DQorCQlzdC0+bG9nX2VuX2luZGV4ID0gMDsNCisJfQ0KKwkvKiBRdWFudGl6ZSBJU0ZzICovDQorCVFpc2ZfbnMoaXNmLCBpc2YsIGluZGljZSk7DQorDQorDQorCVBhcm1fc2VyaWFsKGluZGljZVswXSwgNiwgcHJtcyk7DQorCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgNiwgcHJtcyk7DQorCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgNiwgcHJtcyk7DQorCVBhcm1fc2VyaWFsKGluZGljZVszXSwgNSwgcHJtcyk7DQorCVBhcm1fc2VyaWFsKGluZGljZVs0XSwgNSwgcHJtcyk7DQorDQorCVBhcm1fc2VyaWFsKChzdC0+bG9nX2VuX2luZGV4KSwgNiwgcHJtcyk7DQorDQorCUNOX2RpdGggPSBkaXRoZXJpbmdfY29udHJvbChzdCk7DQorCVBhcm1fc2VyaWFsKENOX2RpdGgsIDEsIHBybXMpOw0KKw0KKwkvKiBsZXZlbCA9IChmbG9hdCkoIHBvdyggMi4wZiwgKGZsb2F0KXN0LT5sb2dfZW5faW5kZXggLyAyLjYyNSAtIDIuMCApICk7ICAgICovDQorCS8qIGxvZzIoRSkgaW4gUTkgKGxvZzIoRSkgbGllcyBpbiBiZXR3ZWVuIC0yOjIyKSAqLw0KKwlsb2dfZW4gPSBzaGwoc3QtPmxvZ19lbl9pbmRleCwgMTUgLSA2KTsNCisNCisJLyogRGl2aWRlIGJ5IDIuNjI1OyBsb2dfZW4gd2lsbCBiZSBiZXR3ZWVuIDA6MjQgICovDQorCWxvZ19lbiA9IG11bHQobG9nX2VuLCAxMjQ4Myk7DQorCS8qIHRoZSByZXN1bHQgY29ycmVzcG9uZHMgdG8gbG9nMihnYWluKSBpbiBRMTAgKi8NCisNCisJLyogRmluZCBpbnRlZ2VyIHBhcnQgICovDQorCWxvZ19lbl9pbnRfZSA9IChsb2dfZW4gPj4gMTApOw0KKw0KKwkvKiBGaW5kIGZyYWN0aW9uYWwgcGFydCAqLw0KKwlsb2dfZW5faW50X20gPSAoV29yZDE2KSAobG9nX2VuICYgMHgzZmYpOw0KKwlsb2dfZW5faW50X20gPSBzaGwobG9nX2VuX2ludF9tLCA1KTsNCisNCisJLyogU3VidHJhY3QgMiBmcm9tIGxvZ19lbiBpbiBROSwgaS5lIGRpdmlkZSB0aGUgZ2FpbiBieSAyIChlbmVyZ3kgYnkgNCkgKi8NCisJLyogQWRkIDE2IGluIG9yZGVyIHRvIGhhdmUgdGhlIHJlc3VsdCBvZiBwb3cyIGluIFExNiAqLw0KKwlsb2dfZW5faW50X2UgPSBhZGQobG9nX2VuX2ludF9lLCAxNiAtIDEpOw0KKw0KKwlsZXZlbDMyID0gUG93Mihsb2dfZW5faW50X2UsIGxvZ19lbl9pbnRfbSk7IC8qIFExNiAqLw0KKwlleHAwID0gbm9ybV9sKGxldmVsMzIpOw0KKwlsZXZlbDMyID0gKGxldmVsMzIgPDwgZXhwMCk7ICAgICAgICAvKiBsZXZlbCBpbiBRMzEgKi8NCisJZXhwMCA9ICgxNSAtIGV4cDApOw0KKwlsZXZlbCA9IGV4dHJhY3RfaChsZXZlbDMyKTsgICAgICAgICAgICAvKiBsZXZlbCBpbiBRMTUgKi8NCisNCisJLyogZ2VuZXJhdGUgd2hpdGUgbm9pc2UgdmVjdG9yICovDQorCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspDQorCXsNCisJCWV4YzJbaV0gPSAoUmFuZG9tKCYoc3QtPmNuZ19zZWVkKSkgPj4gNCk7DQorCX0NCisNCisJLyogZ2FpbiA9IGxldmVsIC8gc3FydChlbmVyKSAqIHNxcnQoTF9GUkFNRSkgKi8NCisNCisJLyogZW5lcmd5IG9mIGdlbmVyYXRlZCBleGNpdGF0aW9uICovDQorCWVuZXIzMiA9IERvdF9wcm9kdWN0MTIoZXhjMiwgZXhjMiwgTF9GUkFNRSwgJmV4cCk7DQorDQorCUlzcXJ0X24oJmVuZXIzMiwgJmV4cCk7DQorDQorCWdhaW4gPSBleHRyYWN0X2goZW5lcjMyKTsNCisNCisJZ2FpbiA9IG11bHQobGV2ZWwsIGdhaW4pOyAgICAgICAgICAgICAgLyogZ2FpbiBpbiBRMTUgKi8NCisNCisJZXhwID0gYWRkKGV4cDAsIGV4cCk7DQorDQorCS8qIE11bHRpcGx5IGJ5IHNxcnQoTF9GUkFNRSk9MTYsIGkuZS4gc2hpZnQgbGVmdCBieSA0ICovDQorCWV4cCArPSA0Ow0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQ0KKwl7DQorCQl0bXAgPSBtdWx0KGV4YzJbaV0sIGdhaW4pOyAgICAgICAgIC8qIFEwICogUTE1ICovDQorCQlleGMyW2ldID0gc2hsKHRtcCwgZXhwKTsgDQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEZ1bmN0aW9uICAgIDogZHR4X2J1ZmZlciBQdXJwb3NlICAgICA6IGhhbmRsZXMgdGhlIERUWCBidWZmZXINCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorV29yZDE2IGR0eF9idWZmZXIoDQorCQlkdHhfZW5jU3RhdGUgKiBzdCwgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc2ZfbmV3W10sICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogaXNmIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDMyIGVuciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiByZXNpZHVhbCBlbmVyZ3kgKGluIExfRlJBTUUpICAgICovDQorCQlXb3JkMTYgY29kZWNfbW9kZQ0KKwkJKQ0KK3sNCisJV29yZDE2IGxvZ19lbjsNCisNCisJV29yZDE2IGxvZ19lbl9lOw0KKwlXb3JkMTYgbG9nX2VuX207DQorCXN0LT5oaXN0X3B0ciA9IGFkZChzdC0+aGlzdF9wdHIsIDEpOyANCisJaWYoc3QtPmhpc3RfcHRyID09IERUWF9ISVNUX1NJWkUpDQorCXsNCisJCXN0LT5oaXN0X3B0ciA9IDA7DQorCX0NCisJLyogY29weSBsc3AgdmVjdG9yIGludG8gYnVmZmVyICovDQorCUNvcHkoaXNmX25ldywgJnN0LT5pc2ZfaGlzdFtzdC0+aGlzdF9wdHIgKiBNXSwgTSk7DQorDQorCS8qIGxvZ19lbiA9IChmbG9hdClsb2cxMChlbnIqMC4wMDU5MzIyKS8oZmxvYXQpbG9nMTAoMi4wZik7ICAqLw0KKwlMb2cyKGVuciwgJmxvZ19lbl9lLCAmbG9nX2VuX20pOw0KKw0KKwkvKiBjb252ZXJ0IGV4cG9uZW50IGFuZCBtYW50aXNzYSB0byBXb3JkMTYgUTcuIFE3IGlzIHVzZWQgdG8gc2ltcGxpZnkgYXZlcmFnaW5nIGluIGR0eF9lbmMgKi8NCisJbG9nX2VuID0gc2hsKGxvZ19lbl9lLCA3KTsgICAgICAgICAgICAgLyogUTcgKi8NCisJbG9nX2VuID0gYWRkKGxvZ19lbiwgc2hyKGxvZ19lbl9tLCAxNSAtIDcpKTsNCisNCisJLyogRmluZCBlbmVyZ3kgcGVyIHNhbXBsZSBieSBtdWx0aXBseWluZyB3aXRoIDAuMDA1OTMyMiwgaS5lIHN1YnRyYWN0IGxvZzIoMS8wLjAwNTkzMjIpID0gNy4zOTcyMiBUaGUNCisJICogY29uc3RhbnQgMC4wMDU5MzIyIHRha2VzIGludG8gYWNjb3VudCB3aW5kb3dpbmdzIGFuZCBhbmFseXNpcyBsZW5ndGggZnJvbSBhdXRvY29ycmVsYXRpb24NCisJICogY29tcHV0YXRpb25zOyA3LjM5NzIyIGluIFE3ID0gOTQ3ICAqLw0KKwkvKiBTdWJ0cmFjdCAzIGRCID0gMC45OTY1OCBpbiBsb2cyKEUpID0gMTI3IGluIFE3LiAqLw0KKwkvKiBsb2dfZW4gPSBzdWIoIGxvZ19lbiwgOTQ3ICsgZW5fYWRqdXN0W2NvZGVjX21vZGVdICk7ICovDQorDQorCS8qIEZpbmQgZW5lcmd5IHBlciBzYW1wbGUgKGRpdmlkZSBieSBMX0ZSQU1FPTI1NiksIGkuZSBzdWJ0cmFjdCBsb2cyKDI1NikgPSA4LjAgICgxMDI0IGluIFE3KSAqLw0KKwkvKiBTdWJ0cmFjdCAzIGRCID0gMC45OTY1OCBpbiBsb2cyKEUpID0gMTI3IGluIFE3LiAqLw0KKw0KKwlsb2dfZW4gPSBzdWIobG9nX2VuLCBhZGQoMTAyNCwgZW5fYWRqdXN0W2NvZGVjX21vZGVdKSk7DQorDQorCS8qIEluc2VydCBpbnRvIHRoZSBidWZmZXIgKi8NCisJc3QtPmxvZ19lbl9oaXN0W3N0LT5oaXN0X3B0cl0gPSBsb2dfZW47DQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBGdW5jdGlvbiAgICA6IHR4X2R0eF9oYW5kbGVyIFB1cnBvc2UgICAgIDogYWRkcyBleHRyYSBzcGVlY2ggaGFuZ292ZXINCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbmFseXplIHNwZWVjaCBvbg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWNvZGluZyBzaWRlLg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgdHhfZHR4X2hhbmRsZXIoZHR4X2VuY1N0YXRlICogc3QsICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICovDQorCQlXb3JkMTYgdmFkX2ZsYWcsICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHZhZCBkZWNpc2lvbiAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIHVzZWRNb2RlICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogbW9kZSBjaGFuZ2VkIG9yIG5vdCAgICAqLw0KKwkJKQ0KK3sNCisNCisJLyogdGhpcyBzdGF0ZSBtYWNoaW5lIGlzIGluIHN5bmNoIHdpdGggdGhlIEdTTUVGUiB0eER0eCBtYWNoaW5lICAgICAgKi8NCisJc3QtPmRlY0FuYUVsYXBzZWRDb3VudCA9IGFkZChzdC0+ZGVjQW5hRWxhcHNlZENvdW50LCAxKTsgDQorDQorCWlmICh2YWRfZmxhZyAhPSAwKQ0KKwl7DQorCQlzdC0+ZHR4SGFuZ292ZXJDb3VudCA9IERUWF9IQU5HX0NPTlNUOw0KKwl9IGVsc2UNCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uLXNwZWVjaCAqLw0KKwkJaWYgKHN0LT5kdHhIYW5nb3ZlckNvdW50ID09IDApDQorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCBvZiBkZWNvZGVyIGFuYWx5c2lzIGhhbmdvdmVyICAqLw0KKwkJCXN0LT5kZWNBbmFFbGFwc2VkQ291bnQgPSAwOyAgICANCisJCQkqdXNlZE1vZGUgPSBNUkRUWDsgICAgICAgICAgICANCisJCX0gZWxzZQ0KKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBwb3NzaWJsZSBhbmFseXNpcyBoYW5nb3ZlciAqLw0KKwkJCXN0LT5kdHhIYW5nb3ZlckNvdW50ID0gc3ViKHN0LT5kdHhIYW5nb3ZlckNvdW50LCAxKTsNCisNCisJCQkvKiBkZWNBbmFFbGFwc2VkQ291bnQgKyBkdHhIYW5nb3ZlckNvdW50IDwgRFRYX0VMQVBTRURfRlJBTUVTX1RIUkVTSCAqLw0KKwkJCWlmIChzdWIoYWRkKHN0LT5kZWNBbmFFbGFwc2VkQ291bnQsIHN0LT5kdHhIYW5nb3ZlckNvdW50KSwNCisJCQkJCQlEVFhfRUxBUFNFRF9GUkFNRVNfVEhSRVNIKSA8IDApDQorCQkJew0KKwkJCQkqdXNlZE1vZGUgPSBNUkRUWDsNCisJCQkJLyogaWYgc2hvcnQgdGltZSBzaW5jZSBkZWNvZGVyIHVwZGF0ZSwgZG8gbm90IGFkZCBleHRyYSBITyAqLw0KKwkJCX0NCisJCQkvKiBlbHNlIG92ZXJyaWRlIFZBRCBhbmQgc3RheSBpbiBzcGVlY2ggbW9kZSAqdXNlZE1vZGUgYW5kIGFkZCBleHRyYSBoYW5nb3ZlciAqLw0KKwkJfQ0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQorc3RhdGljIHZvaWQgYXZlcl9pc2ZfaGlzdG9yeSgNCisJCVdvcmQxNiBpc2Zfb2xkW10sDQorCQlXb3JkMTYgaW5kaWNlc1tdLA0KKwkJV29yZDMyIGlzZl9hdmVyW10NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqLCBrOw0KKwlXb3JkMTYgaXNmX3RtcFsyICogTV07DQorCVdvcmQzMiBMX3RtcDsNCisNCisJLyogTWVtb3JpemUgaW4gaXNmX3RtcFtdW10gdGhlIElTRiB2ZWN0b3JzIHRvIGJlIHJlcGxhY2VkIGJ5ICovDQorCS8qIHRoZSBtZWRpYW4gSVNGIHZlY3RvciBwcmlvciB0byB0aGUgYXZlcmFnaW5nICAgICAgICAgICAgICAgKi8NCisJZm9yIChrID0gMDsgayA8IDI7IGsrKykNCisJew0KKwkJaWYgKChpbmRpY2VzW2tdICsgMSkgIT0gMCkNCisJCXsNCisJCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJCXsNCisJCQkJaXNmX3RtcFtrICogTSArIGldID0gaXNmX29sZFtpbmRpY2VzW2tdICogTSArIGldOyAgICAgIA0KKwkJCQlpc2Zfb2xkW2luZGljZXNba10gKiBNICsgaV0gPSBpc2Zfb2xkW2luZGljZXNbMl0gKiBNICsgaV07ICAgIA0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKiBQZXJmb3JtIHRoZSBJU0YgYXZlcmFnaW5nICovDQorCWZvciAoaiA9IDA7IGogPCBNOyBqKyspDQorCXsNCisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgDQorDQorCQlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRTsgaSsrKQ0KKwkJew0KKwkJCUxfdG1wID0gTF9hZGQoTF90bXAsIExfZGVwb3NpdF9sKGlzZl9vbGRbaSAqIE0gKyBqXSkpOw0KKwkJfQ0KKwkJaXNmX2F2ZXJbal0gPSBMX3RtcDsgICAgICAgICAgICAgIA0KKwl9DQorDQorCS8qIFJldHJpZXZlIGZyb20gaXNmX3RtcFtdW10gdGhlIElTRiB2ZWN0b3JzIHNhdmVkIHByaW9yIHRvIGF2ZXJhZ2luZyAqLw0KKwlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQ0KKwl7DQorCQlpZiAoKGluZGljZXNba10gKyAxKSAhPSAwKQ0KKwkJew0KKwkJCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCQkJew0KKwkJCQlpc2Zfb2xkW2luZGljZXNba10gKiBNICsgaV0gPSBpc2ZfdG1wW2sgKiBNICsgaV07DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorc3RhdGljIHZvaWQgZmluZF9mcmFtZV9pbmRpY2VzKA0KKwkJV29yZDE2IGlzZl9vbGRfdHhbXSwNCisJCVdvcmQxNiBpbmRpY2VzW10sDQorCQlkdHhfZW5jU3RhdGUgKiBzdA0KKwkJKQ0KK3sNCisJV29yZDMyIExfdG1wLCBzdW1taW4sIHN1bW1heCwgc3VtbWF4Mm5kOw0KKwlXb3JkMTYgaSwgaiwgdG1wOw0KKwlXb3JkMTYgcHRyOw0KKw0KKwkvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiB0aGUgb2xkZXN0IGZyYW1lIGZyb20gdGhlIGNvbHVtbiAqLw0KKwkvKiBzdW0gc3VtRFswLi5EVFhfSElTVF9TSVpFLTFdLiBzdW1EW0RUWF9ISVNUX1NJWkVdIGlzICAgICovDQorCS8qIG5vdCB1cGRhdGVkIHNpbmNlIGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4gICAgICAgICAgICovDQorDQorCXRtcCA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgICAgICAgICAgIA0KKwlqID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgaSsrKQ0KKwl7DQorCQlqID0gYWRkKGosIHRtcCk7DQorCQlzdC0+c3VtRFtpXSA9IExfc3ViKHN0LT5zdW1EW2ldLCBzdC0+RFtqXSk7ICAgICANCisJCXRtcCA9IHN1Yih0bXAsIDEpOw0KKwl9DQorDQorCS8qIFNoaWZ0IHRoZSBjb2x1bW4gc3VtIHN1bUQuIFRoZSBlbGVtZW50IHN1bURbRFRYX0hJU1RfU0laRS0xXSAgICAqLw0KKwkvKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBvbGRlc3QgZnJhbWUgaXMgcmVtb3ZlZC4gVGhlIHN1bSBvZiAgICAgKi8NCisJLyogdGhlIGRpc3RhbmNlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgaXNmIGFuZCBvdGhlciBpc2ZzLCAqLw0KKwkvKiBpLmUuIHRoZSBlbGVtZW50IHN1bURbMF0sIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHRoaXMgY2FsbC4gKi8NCisJLyogSGVuY2UgdGhpcyBlbGVtZW50IGlzIGluaXRpYWxpemVkIHRvIHplcm8uICAgICAgICAgICAgICAgICAgICovDQorDQorCWZvciAoaSA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgaSA+IDA7IGktLSkNCisJew0KKwkJc3QtPnN1bURbaV0gPSBzdC0+c3VtRFtpIC0gMV07ICAgICANCisJfQ0KKwlzdC0+c3VtRFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICANCisNCisJLyogUmVtb3ZlIHRoZSBvbGRlc3QgZnJhbWUgZnJvbSB0aGUgZGlzdGFuY2UgbWF0cml4LiAgICAgICAgICAgKi8NCisJLyogTm90ZSB0aGF0IHRoZSBkaXN0YW5jZSBtYXRyaXggaXMgcmVwbGFjZWQgYnkgYSBvbmUtICAgICAgICAgKi8NCisJLyogZGltZW5zaW9uYWwgYXJyYXkgdG8gc2F2ZSBzdGF0aWMgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgKi8NCisNCisJdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDI3OyBpID49IDEyOyBpID0gKFdvcmQxNikgKGkgLSB0bXApKQ0KKwl7DQorCQl0bXAgPSBhZGQodG1wLCAxKTsNCisJCWZvciAoaiA9IHRtcDsgaiA+IDA7IGotLSkNCisJCXsNCisJCQlzdC0+RFtpIC0gaiArIDFdID0gc3QtPkRbaSAtIGogLSB0bXBdOyAgIA0KKwkJfQ0KKwl9DQorDQorCS8qIENvbXB1dGUgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgZGlzdGFuY2UgbWF0cml4IEQgICAgICAgICAgICAqLw0KKwkvKiAoc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2VzIGZyb20gaXNmMVtdIHRvIGlzZl9vbGRfdHhbXVtdKS4gKi8NCisNCisJcHRyID0gc3QtPmhpc3RfcHRyOyAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDE7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspDQorCXsNCisJCS8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGxhdGVzdCBpc2YgYW5kIHRoZSBvdGhlciBpc2ZzLiAqLw0KKwkJcHRyID0gc3ViKHB0ciwgMSk7DQorCQlpZiAocHRyIDwgMCkNCisJCXsNCisJCQlwdHIgPSBEVFhfSElTVF9TSVpFX01JTl9PTkU7ICAgDQorCQl9DQorCQlMX3RtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChqID0gMDsgaiA8IE07IGorKykNCisJCXsNCisJCQl0bXAgPSBzdWIoaXNmX29sZF90eFtzdC0+aGlzdF9wdHIgKiBNICsgal0sIGlzZl9vbGRfdHhbcHRyICogTSArIGpdKTsNCisJCQlMX3RtcCA9IExfbWFjKExfdG1wLCB0bXAsIHRtcCk7DQorCQl9DQorCQlzdC0+RFtpIC0gMV0gPSBMX3RtcDsgICAgICAgICAgIA0KKw0KKwkJLyogVXBkYXRlIGFsc28gdGhlIGNvbHVtbiBzdW1zLiAqLw0KKwkJc3QtPnN1bURbMF0gPSBMX2FkZChzdC0+c3VtRFswXSwgc3QtPkRbaSAtIDFdKTsgDQorCQlzdC0+c3VtRFtpXSA9IExfYWRkKHN0LT5zdW1EW2ldLCBzdC0+RFtpIC0gMV0pOyANCisJfQ0KKw0KKwkvKiBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRpc3RhbmNlcyAqLw0KKwlzdW1tYXggPSBzdC0+c3VtRFswXTsgICAgICAgICAgICAgICAgICANCisJc3VtbWluID0gc3QtPnN1bURbMF07ICAgICAgICAgICAgICAgICAgDQorCWluZGljZXNbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpbmRpY2VzWzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMTsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJaWYgKExfc3ViKHN0LT5zdW1EW2ldLCBzdW1tYXgpID4gMCkNCisJCXsNCisJCQlpbmRpY2VzWzBdID0gaTsgICAgICAgICAgICAgICAgDQorCQkJc3VtbWF4ID0gc3QtPnN1bURbaV07ICAgICAgICAgIA0KKwkJfQ0KKwkJaWYgKExfc3ViKHN0LT5zdW1EW2ldLCBzdW1taW4pIDwgMCkNCisJCXsNCisJCQlpbmRpY2VzWzJdID0gaTsgICAgICAgICAgICAgICAgDQorCQkJc3VtbWluID0gc3QtPnN1bURbaV07ICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCS8qIEZpbmQgdGhlIHNlY29uZCBsYXJnZXN0IGRpc3RhbmNlICovDQorCXN1bW1heDJuZCA9IC0yMTQ3NDgzNjQ3TDsgICAgICAgICAgICAgIA0KKwlpbmRpY2VzWzFdID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJaWYgKChMX3N1YihzdC0+c3VtRFtpXSwgc3VtbWF4Mm5kKSA+IDApICYmIChzdWIoaSwgaW5kaWNlc1swXSkgIT0gMCkpDQorCQl7DQorCQkJaW5kaWNlc1sxXSA9IGk7ICAgICAgICAgICAgICAgIA0KKwkJCXN1bW1heDJuZCA9IHN0LT5zdW1EW2ldOyAgICAgICANCisJCX0NCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KKwl7DQorCQlpbmRpY2VzW2ldID0gc3ViKHN0LT5oaXN0X3B0ciwgaW5kaWNlc1tpXSk7ICAgICANCisJCWlmIChpbmRpY2VzW2ldIDwgMCkNCisJCXsNCisJCQlpbmRpY2VzW2ldID0gYWRkKGluZGljZXNbaV0sIERUWF9ISVNUX1NJWkUpOyAgICAgICANCisJCX0NCisJfQ0KKw0KKwkvKiBJZiBtYXhpbXVtIGRpc3RhbmNlL01FRF9USFJFU0ggaXMgc21hbGxlciB0aGFuIG1pbmltdW0gZGlzdGFuY2UgKi8NCisJLyogdGhlbiB0aGUgbWVkaWFuIElTRiB2ZWN0b3IgcmVwbGFjZW1lbnQgaXMgbm90IHBlcmZvcm1lZCAgICAgICAgICovDQorCXRtcCA9IG5vcm1fbChzdW1tYXgpOw0KKwlzdW1tYXggPSAoc3VtbWF4IDw8IHRtcCk7DQorCXN1bW1pbiA9IChzdW1taW4gPDwgdG1wKTsNCisJTF90bXAgPSBMX211bHQodm9yb3VuZChzdW1tYXgpLCBJTlZfTUVEX1RIUkVTSCk7DQorCWlmKExfdG1wIDw9IHN1bW1pbikNCisJew0KKwkJaW5kaWNlc1swXSA9IC0xOyANCisJfQ0KKwkvKiBJZiBzZWNvbmQgbGFyZ2VzdCBkaXN0YW5jZS9NRURfVEhSRVNIIGlzIHNtYWxsZXIgdGhhbiAgICAgKi8NCisJLyogbWluaW11bSBkaXN0YW5jZSB0aGVuIHRoZSBtZWRpYW4gSVNGIHZlY3RvciByZXBsYWNlbWVudCBpcyAgICAqLw0KKwkvKiBub3QgcGVyZm9ybWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCXN1bW1heDJuZCA9IExfc2hsKHN1bW1heDJuZCwgdG1wKTsNCisJTF90bXAgPSBMX211bHQodm9yb3VuZChzdW1tYXgybmQpLCBJTlZfTUVEX1RIUkVTSCk7DQorCWlmKExfdG1wIDw9IHN1bW1pbikNCisJew0KKwkJaW5kaWNlc1sxXSA9IC0xOyAgICAgICAgICAgICAgICAgDQorCX0NCisJcmV0dXJuOw0KK30NCisNCitzdGF0aWMgV29yZDE2IGRpdGhlcmluZ19jb250cm9sKA0KKwkJZHR4X2VuY1N0YXRlICogc3QNCisJCSkNCit7DQorCVdvcmQxNiB0bXAsIG1lYW4sIENOX2RpdGgsIGdhaW5fZGlmZjsNCisJV29yZDMyIGksIElTRl9kaWZmOw0KKw0KKwkvKiBkZXRlcm1pbmUgaG93IHN0YXRpb25hcnkgdGhlIHNwZWN0cnVtIG9mIGJhY2tncm91bmQgbm9pc2UgaXMgKi8NCisJSVNGX2RpZmYgPSAwOw0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQ0KKwl7DQorCQlJU0ZfZGlmZiA9IExfYWRkKElTRl9kaWZmLCBzdC0+c3VtRFtpXSk7DQorCX0NCisJaWYgKChJU0ZfZGlmZiA+PiAyNikgPiAwKQ0KKwl7DQorCQlDTl9kaXRoID0gMTsNCisJfSBlbHNlDQorCXsNCisJCUNOX2RpdGggPSAwOw0KKwl9DQorDQorCS8qIGRldGVybWluZSBob3cgc3RhdGlvbmFyeSB0aGUgZW5lcmd5IG9mIGJhY2tncm91bmQgbm9pc2UgaXMgKi8NCisJbWVhbiA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspDQorCXsNCisJCW1lYW4gPSBhZGQobWVhbiwgc3QtPmxvZ19lbl9oaXN0W2ldKTsNCisJfQ0KKwltZWFuID0gKG1lYW4gPj4gMyk7DQorCWdhaW5fZGlmZiA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspDQorCXsNCisJCXRtcCA9IGFic19zKHN1YihzdC0+bG9nX2VuX2hpc3RbaV0sIG1lYW4pKTsNCisJCWdhaW5fZGlmZiA9IGFkZChnYWluX2RpZmYsIHRtcCk7DQorCX0NCisJaWYgKGdhaW5fZGlmZiA+IEdBSU5fVEhSKQ0KKwl7DQorCQlDTl9kaXRoID0gMTsNCisJfQ0KKwlyZXR1cm4gQ05fZGl0aDsNCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9nX3BpdGNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzAxMzhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9nX3BpdGNoLmMKQEAgLTAsMCArMSw3OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogZ19waXRjaC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOkNvbXB1dGUgdGhlIGdhaW4gb2YgcGl0Y2guIFJlc3VsdCBpbiBRMTIgICAgICAgICoNCisqCSAgICAgICAgICAgICAgIGlmKGdhaW4gPCAwKSBnYWluID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCQkJCSAgIGlmKGdhaW4gPiAxLjIpIGdhaW4gPSAxLjIgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKw0KK1dvcmQxNiBHX3BpdGNoKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE0IDogR2FpbiBvZiBwaXRjaCBsYWcgc2F0dXJhdGVkIHRvIDEuMiAgICovDQorCQlXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBQaXRjaCB0YXJnZXQuICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB5MVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGZpbHRlcmVkIGFkYXB0aXZlIGNvZGVib29rLiAgICAgICAgICAqLw0KKwkJV29yZDE2IGdfY29lZmZbXSwgICAgICAgICAgICAgICAgICAgICAvKiA6IENvcnJlbGF0aW9ucyBuZWVkIGZvciBnYWluIHF1YW50aXphdGlvbi4gICAgICovDQorCQlXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIDogTGVuZ3RoIG9mIHN1YmZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQxNiB4eSwgeXksIGV4cF94eSwgZXhwX3l5LCBnYWluOw0KKwkvKiBDb21wdXRlIHNjYWxhciBwcm9kdWN0IDx5MVtdLHkxW10+ICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkvKiBDb21wdXRlIHNjYWxhciBwcm9kdWN0IDx4bltdLHkxW10+ICovDQorCXh5ID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKHhuLCB5MSwgTF9zdWJmciwgJmV4cF94eSkpOw0KKwl5eSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbSh5MSwgeTEsIExfc3ViZnIsICZleHBfeXkpKTsNCisNCisjZWxzZQ0KKwkvKiBDb21wdXRlIHNjYWxhciBwcm9kdWN0IDx4bltdLHkxW10+ICovDQorCXh5ID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoeG4sIHkxLCBMX3N1YmZyLCAmZXhwX3h5KSk7DQorCXl5ID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoeTEsIHkxLCBMX3N1YmZyLCAmZXhwX3l5KSk7DQorDQorI2VuZGlmDQorDQorCWdfY29lZmZbMF0gPSB5eTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlnX2NvZWZmWzFdID0gZXhwX3l5OyAgICAgICAgICAgICAgICAgICANCisJZ19jb2VmZlsyXSA9IHh5OyAgICAgICAgICAgICAgICAgICAgICAgDQorCWdfY29lZmZbM10gPSBleHBfeHk7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBJZiAoeHkgPCAwKSBnYWluID0gMCAqLw0KKwlpZiAoeHkgPCAwKQ0KKwkJcmV0dXJuICgoV29yZDE2KSAwKTsNCisNCisJLyogY29tcHV0ZSBnYWluID0geHkveXkgKi8NCisNCisJeHkgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCZSBzdXJlIHh5IDwgeXkgKi8NCisJZ2FpbiA9IGRpdl9zKHh5LCB5eSk7DQorDQorCWkgPSBleHBfeHk7DQorCWkgLT0gZXhwX3l5Ow0KKw0KKwlnYWluID0gc2hsKGdhaW4sIGkpOyAgICAgICAgICAgICAgICAgICANCisNCisJLyogaWYgKGdhaW4gPiAxLjIpIGdhaW4gPSAxLjIgIGluIFExNCAqLw0KKwlpZihnYWluID4gMTk2NjEpDQorCXsNCisJCWdhaW4gPSAxOTY2MTsgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisJcmV0dXJuIChnYWluKTsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ncGNsaXAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzZjJmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGdwY2xpcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOlRvIGF2b2lkIHVuc3RhYmxlIHN5bnRoZXNpcyBvbiBmcmFtZSBlcmFzdXJlLCB0aGUgZ2FpbiAqDQorKiAgICAgIG5lZWQgdG8gYmUgbGltaXRlZChnYWluIHBpdGNoIDwgMS4wKSB3aGVuIHRoZSBmb2xsb3dpbmcgICAgICAgICAgICAqDQorKiAgICAgIGNhc2Ugb2NjdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIGEgcmVzb25hbmNlIG9uIExQQyBmaWx0ZXIobHBfZGlzcCA8IDYwSHopICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIGEgZ29vZCBwaXRjaCBwcmVkaWN0aW9uIChscF9ncCA+IDAuOTUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQorI2RlZmluZSBESVNUX0lTRl9NQVggICAgMzA3ICAgICAgICAgICAgICAgIC8qIDEyMCBIeiAoNjQwMEh6PTE2Mzg0KSAqLw0KKyNkZWZpbmUgRElTVF9JU0ZfVEhSRVMgIDE1NCAgICAgICAgICAgICAgICAvKiA2MCAgICAgKDY0MDBIej0xNjM4NCkgKi8NCisjZGVmaW5lIEdBSU5fUElUX1RIUkVTICAxNDc0NiAgICAgICAgICAgICAgLyogMC45IGluIFExNCAqLw0KKyNkZWZpbmUgR0FJTl9QSVRfTUlOICAgIDk4MzAgICAgICAgICAgICAgICAvKiAwLjYgaW4gUTE0ICovDQorI2RlZmluZSBNICAgICAgICAgICAgICAgMTYNCisNCisNCit2b2lkIEluaXRfZ3BfY2xpcCgNCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorCQkpDQorew0KKwltZW1bMF0gPSBESVNUX0lTRl9NQVg7ICAgICAgICAgICAgICAgICANCisJbWVtWzFdID0gR0FJTl9QSVRfTUlOOyAgICAgICAgICAgICAgICAgDQorfQ0KKw0KKw0KK1dvcmQxNiBHcF9jbGlwKA0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IG1lbW9yeSBvZiBnYWluIG9mIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMTYgY2xpcCA9IDA7DQorCWlmICgobWVtWzBdIDwgRElTVF9JU0ZfVEhSRVMpICYmIChtZW1bMV0gPiBHQUlOX1BJVF9USFJFUykpDQorCQljbGlwID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm4gKGNsaXApOw0KK30NCisNCisNCit2b2lkIEdwX2NsaXBfdGVzdF9pc2YoDQorCQlXb3JkMTYgaXNmW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogaXNmIHZhbHVlcyAoaW4gZnJlcXVlbmN5IGRvbWFpbikgICAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorCQkpDQorew0KKwlXb3JkMTYgZGlzdCwgZGlzdF9taW47DQorCVdvcmQzMiBpOw0KKw0KKwlkaXN0X21pbiA9IHZvX3N1Yihpc2ZbMV0sIGlzZlswXSk7DQorDQorCWZvciAoaSA9IDI7IGkgPCBNIC0gMTsgaSsrKQ0KKwl7DQorCQlkaXN0ID0gdm9fc3ViKGlzZltpXSwgaXNmW2kgLSAxXSk7DQorCQlpZihkaXN0IDwgZGlzdF9taW4pDQorCQl7DQorCQkJZGlzdF9taW4gPSBkaXN0OyAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCWRpc3QgPSBleHRyYWN0X2goTF9tYWModm9fTF9tdWx0KDI2MjE0LCBtZW1bMF0pLCA2NTU0LCBkaXN0X21pbikpOw0KKw0KKwlpZiAoZGlzdCA+IERJU1RfSVNGX01BWCkNCisJew0KKwkJZGlzdCA9IERJU1RfSVNGX01BWDsgICAgICAgICAgICAgICANCisJfQ0KKwltZW1bMF0gPSBkaXN0OyAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgR3BfY2xpcF90ZXN0X2dhaW5fcGl0KA0KKwkJV29yZDE2IGdhaW5fcGl0LCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE0IDogZ2FpbiBvZiBxdWFudGl6ZWQgcGl0Y2ggICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgb2YgZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCisJCSkNCit7DQorCVdvcmQxNiBnYWluOw0KKwlXb3JkMzIgTF90bXA7DQorCUxfdG1wID0gKDI5NDkxICogbWVtWzFdKTw8MTsNCisJTF90bXAgKz0gKDMyNzcgKiBnYWluX3BpdCk8PDE7DQorDQorCWdhaW4gPSBleHRyYWN0X2goTF90bXApOw0KKw0KKwlpZihnYWluIDwgR0FJTl9QSVRfTUlOKQ0KKwl7DQorCQlnYWluID0gR0FJTl9QSVRfTUlOOyAgICAgICAgICAgICAgDQorCX0NCisJbWVtWzFdID0gZ2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ob21pbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaG9taW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1NjMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaG9taW5nLmMKQEAgLTAsMCArMSw0NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGhvbWluZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOlBlcmZvcm1zIHRoZSBob21pbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJiaXRzLmgiDQorI2luY2x1ZGUgImhvbWluZy50YWIiDQorDQorV29yZDE2IGVuY29kZXJfaG9taW5nX2ZyYW1lX3Rlc3QoV29yZDE2IGlucHV0X2ZyYW1lW10pDQorew0KKwlXb3JkMzIgaTsNCisJV29yZDE2IGogPSAwOw0KKw0KKwkvKiBjaGVjayAzMjAgaW5wdXQgc2FtcGxlcyBmb3IgbWF0Y2hpbmcgRUhGX01BU0s6IGRlZmluZWQgaW4gZV9ob21pbmcuaCAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTE2azsgaSsrKQ0KKwl7DQorCQlqID0gKFdvcmQxNikgKGlucHV0X2ZyYW1lW2ldIF4gRUhGX01BU0spOw0KKw0KKwkJaWYgKGopDQorCQkJYnJlYWs7DQorCX0NCisNCisJcmV0dXJuIChXb3JkMTYpICghaik7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjNhNTNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDQwMC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBocDQwMC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogMm5kIG9yZGVyIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXQgb2ZmIGZyZXF1ZW5jeSBhdCA0MDAgSHouICAgICAgICAgICoNCisqIERlc2lnbmVkIHdpdGggY2hlYnkyIGZ1bmN0aW9uIGluIE1BVExBQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBPcHRpbWl6ZWQgZm9yIGZpeGVkLXBvaW50IHRvIGdldCB0aGUgZm9sbG93aW5nIGZyZXF1ZW5jeSByZXNwb25zZTogICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBmcmVxdWVuY3k6ICAgICAwSHogICAxMDBIeiAgMjAwSHogIDMwMEh6ICA0MDBIeiAgNjMwSHogIDEuNWtIeiAgM2tIeiAqDQorKiAgZEIgbG9zczogICAgIC1pbmZkQiAgLTMwZEIgIC0yMGRCICAtMTBkQiAgLTNkQiAgICs2ZEIgICAgKzFkQiAgICAwZEIgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIHlbaV0gPSBiWzBdKnhbaV0gKyBiWzFdKnhbaS0xXSArIGJbMl0qeFtpLTJdICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICsgYVsxXSp5W2ktMV0gKyBhWzJdKnlbaS0yXTsgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIFdvcmQxNiBiWzNdID0gezM2NjAsIC03MzIwLCAgMzY2MH07ICAgICAgIGluIFExMiAgICAgICAgICAgICAgICAgICAgICoNCisqICBXb3JkMTYgYVszXSA9IHs0MDk2LCAgNzMyMCwgLTM1NDB9OyAgICAgICBpbiBRMTIgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIGZsb2F0IC0tPiAgIGJbM10gPSB7MC44OTM1NTQ2ODcsIC0xLjc4NzEwOTM3NSwgIDAuODkzNTU0Njg3fTsgICAgICAgICoNCisqICAgICAgICAgICAgICBhWzNdID0gezEuMDAwMDAwMDAwLCAgMS43ODcxMDkzNzUsIC0wLjg2NDI1NzgxMn07ICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKw0KKy8qIGZpbHRlciBjb2VmZmljaWVudHMgICovDQorc3RhdGljIFdvcmQxNiBiWzNdID0gezkxNSwgLTE4MzAsIDkxNX07ICAgICAgICAgLyogUTEyICgvNCkgKi8NCitzdGF0aWMgV29yZDE2IGFbM10gPSB7MTYzODQsIDI5MjgwLCAtMTQxNjB9OyAgICAvKiBRMTIgKHg0KSAqLw0KKy8qIEluaXRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YWx1ZXMgKi8NCisNCit2b2lkIEluaXRfSFA0MDBfMTJrOChXb3JkMTYgbWVtW10pDQorew0KKwlTZXRfemVybyhtZW0sIDYpOw0KK30NCisNCisNCit2b2lkIEhQNDAwXzEyazgoDQorCQlXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHNpZ25hbCAvIG91dHB1dCBpcyBkaXZpZGVkIGJ5IDE2ICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmdodCBvZiBzaWduYWwgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsdGVyIG1lbW9yeSBbNl0gICAqLw0KKwkgICAgICAgKQ0KK3sNCisJV29yZDE2ICB4MjsNCisJV29yZDE2IHkyX2hpLCB5Ml9sbywgeTFfaGksIHkxX2xvLCB4MCwgeDE7DQorCVdvcmQzMiBMX3RtcDsNCisJV29yZDMyIG51bTsNCisJeTJfaGkgPSAqbWVtKys7DQorCXkyX2xvID0gKm1lbSsrOw0KKwl5MV9oaSA9ICptZW0rKzsNCisJeTFfbG8gPSAqbWVtKys7DQorCXgwID0gKm1lbSsrOyAgIA0KKwl4MSA9ICptZW07ICAgDQorCW51bSA9IChXb3JkMzIpbGc7DQorCWRvDQorCXsNCisJCXgyID0geDE7DQorCQl4MSA9IHgwOw0KKwkJeDAgPSAqc2lnbmFsOw0KKwkJLyogeVtpXSA9IGJbMF0qeFtpXSArIGJbMV0qeFtpLTFdICsgYjE0MFsyXSp4W2ktMl0gICovDQorCQkvKiArIGFbMV0qeVtpLTFdICsgYVsyXSAqIHlbaS0yXTsgICovDQorCQlMX3RtcCA9IDgxOTJMOyAgICAgICAgICAgICAgICAgICAgLyogcm91bmRpbmcgdG8gbWF4aW1pc2UgcHJlY2lzaW9uICovDQorCQlMX3RtcCArPSB5MV9sbyAqIGFbMV07DQorCQlMX3RtcCArPSB5Ml9sbyAqIGFbMl07DQorCQlMX3RtcCA9IExfdG1wID4+IDE0Ow0KKwkJTF90bXAgKz0gKHkxX2hpICogYVsxXSArIHkyX2hpICogYVsyXSArICh4MCArIHgyKSogYlswXSArIHgxICogYlsxXSkgPDwgMTsNCisJCUxfdG1wIDw8PSAxOyAgICAgICAgICAgLyogY29lZmYgUTEyIC0tPiBRMTMgKi8NCisJCXkyX2hpID0geTFfaGk7DQorCQl5Ml9sbyA9IHkxX2xvOw0KKwkJeTFfaGkgPSAoV29yZDE2KShMX3RtcD4+MTYpOw0KKwkJeTFfbG8gPSAoV29yZDE2KSgoTF90bXAgJiAweGZmZmYpPj4xKTsNCisNCisJCS8qIHNpZ25hbCBpcyBkaXZpZGVkIGJ5IDE2IHRvIGF2b2lkIG92ZXJmbG93IGluIGVuZXJneSBjb21wdXRhdGlvbiAqLw0KKwkJKnNpZ25hbCsrID0gKExfdG1wICsgMHg4MDAwKSA+PiAxNjsNCisJfXdoaWxlKC0tbnVtICE9MCk7DQorDQorCSptZW0tLSA9IHgxOw0KKwkqbWVtLS0gPSB4MDsNCisJKm1lbS0tID0geTFfbG87DQorCSptZW0tLSA9IHkxX2hpOw0KKwkqbWVtLS0gPSB5Ml9sbzsNCisJKm1lbSAgID0geTJfaGk7ICANCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNTAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTNkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNTAuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogaHA1MC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDJuZCBvcmRlciBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0IG9mZiBmcmVxdWVuY3kgYXQgMzEgSHouICAgICAgICAgICAqDQorKiBEZXNpZ25lZCB3aXRoIGNoZWJ5MiBmdW5jdGlvbiBpbiBNQVRMQUIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogT3B0aW1pemVkIGZvciBmaXhlZC1wb2ludCB0byBnZXQgdGhlIGZvbGxvd2luZyBmcmVxdWVuY3kgcmVzcG9uc2U6ICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgZnJlcXVlbmN5OiAgICAgMEh6ICAgIDE0SHogIDI0SHogICAzMUh6ICAgMzdIeiAgIDQxSHogICA0N0h6ICAgICAgICAgKg0KKyogIGRCIGxvc3M6ICAgICAtaW5mZEIgIC0xNWRCICAtNmRCICAgLTNkQiAgLTEuNWRCICAtMWRCICAtMC41ZEIgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiWzJdKnhbaS0yXSAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICArIGFbMV0qeVtpLTFdICsgYVsyXSp5W2ktMl07ICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBXb3JkMTYgYlszXSA9IHs0MDUzLCAtODEwNiwgNDA1M307ICAgICAgIGluIFExMiAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgV29yZDE2IGFbM10gPSB7ODE5MiwgMTYyMTEsIC04MDIxfTsgICAgICAgaW4gUTEyICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBmbG9hdCAtLT4gICBiWzNdID0gezAuOTg5NTAxOTUzLCAtMS45NzkwMDM5MDYsICAwLjk4OTUwMTk1M307ICAgICAgICAqDQorKiAgICAgICAgICAgICAgYVszXSA9IHsxLjAwMDAwMDAwMCwgIDEuOTc4ODgxODM2LCAtMC45NzkxMjU5Nzd9OyAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorDQorLyogZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8NCitzdGF0aWMgV29yZDE2IGJbM10gPSB7NDA1MywgLTgxMDYsIDQwNTN9OyAgLyogUTEyICovDQorc3RhdGljIFdvcmQxNiBhWzNdID0gezgxOTIsIDE2MjExLCAtODAyMX07IC8qIFExMiAoeDIpICovDQorDQorLyogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIHZhbHVlcyAqLw0KKw0KK3ZvaWQgSW5pdF9IUDUwXzEyazgoV29yZDE2IG1lbVtdKQ0KK3sNCisJU2V0X3plcm8obWVtLCA2KTsNCit9DQorDQorDQordm9pZCBIUDUwXzEyazgoDQorCQlXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBzaWduYWwgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWx0ZXIgbWVtb3J5IFs2XSAgICovDQorCSAgICAgICkNCit7DQorCVdvcmQxNiB4MjsNCisJV29yZDE2IHkyX2hpLCB5Ml9sbywgeTFfaGksIHkxX2xvLCB4MCwgeDE7DQorCVdvcmQzMiBMX3RtcDsNCisJV29yZDMyIG51bTsNCisNCisJeTJfaGkgPSAqbWVtKys7DQorCXkyX2xvID0gKm1lbSsrOw0KKwl5MV9oaSA9ICptZW0rKzsNCisJeTFfbG8gPSAqbWVtKys7DQorCXgwID0gKm1lbSsrOyAgIA0KKwl4MSA9ICptZW07DQorCW51bSA9IChXb3JkMzIpbGc7DQorCWRvDQorCXsNCisJCXgyID0geDE7DQorCQl4MSA9IHgwOw0KKwkJeDAgPSAqc2lnbmFsOw0KKwkJLyogeVtpXSA9IGJbMF0qeFtpXSArIGJbMV0qeFtpLTFdICsgYjE0MFsyXSp4W2ktMl0gICovDQorCQkvKiArIGFbMV0qeVtpLTFdICsgYVsyXSAqIHlbaS0yXTsgICovDQorCQlMX3RtcCA9IDgxOTIgOyAgICAgICAgICAgICAgICAgICAgLyogcm91bmRpbmcgdG8gbWF4aW1pc2UgcHJlY2lzaW9uICovDQorCQlMX3RtcCArPSB5MV9sbyAqIGFbMV07DQorCQlMX3RtcCArPSB5Ml9sbyAqIGFbMl07DQorCQlMX3RtcCA9IExfdG1wID4+IDE0Ow0KKwkJTF90bXAgKz0gKHkxX2hpICogYVsxXSArIHkyX2hpICogYVsyXSArICh4MCArIHgyKSAqIGJbMF0gKyB4MSAqIGJbMV0pIDw8IDE7DQorCQlMX3RtcCA8PD0gMjsgICAgICAgICAgIC8qIGNvZWZmIFExMiAtLT4gUTEzICovDQorCQl5Ml9oaSA9IHkxX2hpOw0KKwkJeTJfbG8gPSB5MV9sbzsNCisJCXkxX2hpID0gKFdvcmQxNikoTF90bXA+PjE2KTsNCisJCXkxX2xvID0gKFdvcmQxNikoKExfdG1wICYgMHhmZmZmKT4+MSk7DQorCQkqc2lnbmFsKysgPSBleHRyYWN0X2goKExfYWRkKChMX3RtcDw8MSksIDB4ODAwMCkpKTsNCisJfXdoaWxlKC0tbnVtICE9MCk7DQorDQorCSptZW0tLSA9IHgxOw0KKwkqbWVtLS0gPSB4MDsNCisJKm1lbS0tID0geTFfbG87DQorCSptZW0tLSA9IHkxX2hpOw0KKwkqbWVtLS0gPSB5Ml9sbzsNCisJKm1lbS0tID0geTJfaGk7ICANCisNCisJcmV0dXJuOw0KK30NCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA2ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTViMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYwpAQCAtMCwwICsxLDkzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogaHA2ay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKglEZXNjcmlwdGlvbjoxNXRoIG9yZGVyIGJhbmQgcGFzcyA2a0h6IHRvIDdrSHogRklSIGZpbHRlciAgICAgICAgKg0KKyogICAgICAgZnJlcXVlbmN5OiA0a0h6ICAgNWtIeiAgNS41a0h6ICA2a0h6ICA2LjVrSHogIDdrSHogNy41a0h6IDhrSHogICoNCisqCWRCIGxvc3M6ICAtNjBkQiAgLTQ1ZEIgIC0xM2RCICAgLTNkQiAgIDBkQiAgICAtM2RCIC0xM2RCICAtNDVkQiAqDQorKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCisjZGVmaW5lIExfRklSIDMxDQorDQorLyogZmlsdGVyIGNvZWZmaWNpZW50cyAoZ2Fpbj00LjApICovDQorDQorV29yZDE2IGZpcl82a183a1tMX0ZJUl0gPQ0KK3sNCisJLTMyLCA0NywgMzIsIC0yNywgLTM2OSwNCisJMTEyMiwgLTE0MjEsIDAsIDM3OTgsIC04ODgwLA0KKwkxMjM0OSwgLTEwOTg0LCAzNTQ4LCA3NzY2LCAtMTgwMDEsDQorCTIyMTE4LCAtMTgwMDEsIDc3NjYsIDM1NDgsIC0xMDk4NCwNCisJMTIzNDksIC04ODgwLCAzNzk4LCAwLCAtMTQyMSwNCisJMTEyMiwgLTM2OSwgLTI3LCAzMiwgNDcsDQorCS0zMg0KK307DQorDQorDQordm9pZCBJbml0X0ZpbHRfNmtfN2soV29yZDE2IG1lbVtdKSAgICAgICAgIC8qIG1lbVszMF0gKi8NCit7DQorCVNldF96ZXJvKG1lbSwgTF9GSVIgLSAxKTsNCisJcmV0dXJuOw0KK30NCisNCit2b2lkIEZpbHRfNmtfN2soDQorCQlXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgc2lnbmFsICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBsZW5ndGggb2YgaW5wdXQgICAgICAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IG1lbW9yeSAoc2l6ZT0zMCkgICAgICAgICovDQorCSAgICAgICApDQorew0KKwlXb3JkMTYgeFtMX1NVQkZSMTZrICsgKExfRklSIC0gMSldOw0KKwlXb3JkMzIgaSwgTF90bXA7DQorDQorCUNvcHkobWVtLCB4LCBMX0ZJUiAtIDEpOw0KKwlmb3IgKGkgPSBsZyAtIDE7IGkgPj0gMDsgaS0tKQ0KKwl7DQorCQl4W2kgKyBMX0ZJUiAtIDFdID0gc2lnbmFsW2ldID4+IDI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdhaW4gb2YgZmlsdGVyID0gNCAqLw0KKwl9CQ0KKwlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykNCisJew0KKwkJTF90bXAgPSAgKHhbaV0gKyB4W2krIDMwXSkgKiBmaXJfNmtfN2tbMF07DQorCQlMX3RtcCArPSAoeFtpKzFdICsgeFtpICsgMjldKSAqIGZpcl82a183a1sxXTsNCisJCUxfdG1wICs9ICh4W2krMl0gKyB4W2kgKyAyOF0pICogZmlyXzZrXzdrWzJdOw0KKwkJTF90bXAgKz0gKHhbaSszXSArIHhbaSArIDI3XSkgKiBmaXJfNmtfN2tbM107DQorCQlMX3RtcCArPSAoeFtpKzRdICsgeFtpICsgMjZdKSAqIGZpcl82a183a1s0XTsNCisJCUxfdG1wICs9ICh4W2krNV0gKyB4W2kgKyAyNV0pICogZmlyXzZrXzdrWzVdOw0KKwkJTF90bXAgKz0gKHhbaSs2XSArIHhbaSArIDI0XSkgKiBmaXJfNmtfN2tbNl07DQorCQlMX3RtcCArPSAoeFtpKzddICsgeFtpICsgMjNdKSAqIGZpcl82a183a1s3XTsNCisJCUxfdG1wICs9ICh4W2krOF0gKyB4W2kgKyAyMl0pICogZmlyXzZrXzdrWzhdOw0KKwkJTF90bXAgKz0gKHhbaSs5XSArIHhbaSArIDIxXSkgKiBmaXJfNmtfN2tbOV07DQorCQlMX3RtcCArPSAoeFtpKzEwXSArIHhbaSArIDIwXSkgKiBmaXJfNmtfN2tbMTBdOw0KKwkJTF90bXAgKz0gKHhbaSsxMV0gKyB4W2kgKyAxOV0pICogZmlyXzZrXzdrWzExXTsNCisJCUxfdG1wICs9ICh4W2krMTJdICsgeFtpICsgMThdKSAqIGZpcl82a183a1sxMl07DQorCQlMX3RtcCArPSAoeFtpKzEzXSArIHhbaSArIDE3XSkgKiBmaXJfNmtfN2tbMTNdOw0KKwkJTF90bXAgKz0gKHhbaSsxNF0gKyB4W2kgKyAxNl0pICogZmlyXzZrXzdrWzE0XTsNCisJCUxfdG1wICs9ICh4W2krMTVdKSAqIGZpcl82a183a1sxNV07DQorCQlzaWduYWxbaV0gPSAoTF90bXAgKyAweDQwMDApID4+IDE1Ow0KKwl9DQorDQorCUNvcHkoeCArIGxnLCBtZW0sIExfRklSIC0gMSk7DQorDQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjYyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogaHBfd3NwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAzbmQgb3JkZXIgaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dCBvZmYgZnJlcXVlbmN5IGF0IDE4MEh6ICAgICAgKg0KKyogQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgeVtpXSA9IGJbMF0qeFtpXSArIGJbMV0qeFtpLTFdICsgYlsyXSp4W2ktMl0gKyBiWzNdKnhbaS0zXSAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgKyBhWzFdKnlbaS0xXSArIGFbMl0qeVtpLTJdICsgYVszXSp5W2ktM107ICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBmbG9hdCBhX2NvZWZbSFBfT1JERVJdPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgLTIuNjQ0MzY3MTE2MDA2NjRmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgIDIuMzUwODczODY2MjUzNjBmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIC0wLjcwMDAxMTU2OTI3NDI0Zn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIGZsb2F0IGJfY29lZltIUF9PUkRFUisxXT0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgLTAuODM3ODcwNTc1MDU2NjVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgMi41MDk3NTU3MDA3MTA1OGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgLTIuNTA5NzU1NzAwNzEwNThmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAwLjgzNzg3MDU3NTA1NjY1Zn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorDQorLyogZmlsdGVyIGNvZWZmaWNpZW50cyBpbiBRMTIgKi8NCitzdGF0aWMgV29yZDE2IGFbNF0gPSB7ODE5MiwgMjE2NjMsIC0xOTI1OCwgNTczNH07DQorc3RhdGljIFdvcmQxNiBiWzRdID0gey0zNDMyLCArMTAyODAsIC0xMDI4MCwgKzM0MzJ9Ow0KKw0KKy8qIEluaXRpYWxpemF0aW9uIG9mIHN0YXRpYyB2YWx1ZXMgKi8NCit2b2lkIEluaXRfSHBfd3NwKFdvcmQxNiBtZW1bXSkNCit7DQorCVNldF96ZXJvKG1lbSwgOSk7DQorDQorCXJldHVybjsNCit9DQorDQordm9pZCBzY2FsZV9tZW1fSHBfd3NwKFdvcmQxNiBtZW1bXSwgV29yZDE2IGV4cCkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgTF90bXA7DQorDQorCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpDQorCXsNCisJCUxfdG1wID0gKChtZW1baV0gPDwgMTYpICsgKG1lbVtpICsgMV08PDEpKTsNCisJCUxfdG1wID0gTF9zaGwoTF90bXAsIGV4cCk7DQorCQltZW1baV0gPSBMX3RtcCA+PiAxNjsNCisJCW1lbVtpICsgMV0gPSAoTF90bXAgJiAweGZmZmYpPj4xOw0KKwl9DQorDQorCWZvciAoaSA9IDY7IGkgPCA5OyBpKyspDQorCXsNCisJCUxfdG1wID0gTF9kZXBvc2l0X2gobWVtW2ldKTsgICAgICAgLyogeFtpXSAqLw0KKwkJTF90bXAgPSBMX3NobChMX3RtcCwgZXhwKTsNCisJCW1lbVtpXSA9IHZvX3JvdW5kKExfdG1wKTsNCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgSHBfd3NwKA0KKwkJV29yZDE2IHdzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiB3c3BbXSAgc2lnbmFsICAgICAgICovDQorCQlXb3JkMTYgaHBfd3NwW10sICAgICAgICAgICAgICAgICAgICAgIC8qIG8gICA6IGh5cGFzcyB3c3BbXSAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBmaWx0ZXIgbWVtb3J5IFs5XSAgICovDQorCSAgICkNCit7DQorCVdvcmQxNiB4MCwgeDEsIHgyLCB4MzsNCisJV29yZDE2IHkzX2hpLCB5M19sbywgeTJfaGksIHkyX2xvLCB5MV9oaSwgeTFfbG87DQorCVdvcmQzMiBpLCBMX3RtcDsNCisNCisJeTNfaGkgPSBtZW1bMF07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXkzX2xvID0gbWVtWzFdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl5Ml9oaSA9IG1lbVsyXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJeTJfbG8gPSBtZW1bM107ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXkxX2hpID0gbWVtWzRdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl5MV9sbyA9IG1lbVs1XTsgICAgICAgICAgICAgICAgICAgICAgICANCisJeDAgPSBtZW1bNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXgxID0gbWVtWzddOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl4MiA9IG1lbVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspDQorCXsNCisJCXgzID0geDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQl4MiA9IHgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJeDEgPSB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCXgwID0gd3NwW2ldOyAgICAgICAgICAgICAgICAgICAgICAgDQorCQkvKiB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiMTQwWzJdKnhbaS0yXSArIGJbM10qeFtpLTNdICAqLw0KKwkJLyogKyBhWzFdKnlbaS0xXSArIGFbMl0gKiB5W2ktMl0gICsgYVszXSp5W2ktM10gICovDQorDQorCQlMX3RtcCA9IDE2Mzg0TDsgICAgICAgICAgICAgICAgICAgIC8qIHJvdW5kaW5nIHRvIG1heGltaXNlIHByZWNpc2lvbiAqLw0KKwkJTF90bXAgKz0gKHkxX2xvICogYVsxXSk8PDE7DQorCQlMX3RtcCArPSAoeTJfbG8gKiBhWzJdKTw8MTsNCisJCUxfdG1wICs9ICh5M19sbyAqIGFbM10pPDwxOw0KKwkJTF90bXAgPSBMX3RtcCA+PiAxNTsNCisJCUxfdG1wICs9ICh5MV9oaSAqIGFbMV0pPDwxOw0KKwkJTF90bXAgKz0gKHkyX2hpICogYVsyXSk8PDE7DQorCQlMX3RtcCArPSAoeTNfaGkgKiBhWzNdKTw8MTsNCisJCUxfdG1wICs9ICh4MCAqIGJbMF0pPDwxOw0KKwkJTF90bXAgKz0gKHgxICogYlsxXSk8PDE7DQorCQlMX3RtcCArPSAoeDIgKiBiWzJdKTw8MTsNCisJCUxfdG1wICs9ICh4MyAqIGJbM10pPDwxOw0KKw0KKwkJTF90bXAgPSBMX3RtcCA8PCAyOw0KKw0KKwkJeTNfaGkgPSB5Ml9oaTsgICAgICAgICAgICAgICAgICAgICANCisJCXkzX2xvID0geTJfbG87ICAgICAgICAgICAgICAgICAgICAgDQorCQl5Ml9oaSA9IHkxX2hpOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJeTJfbG8gPSB5MV9sbzsgDQorCQl5MV9oaSA9IExfdG1wID4+IDE2Ow0KKwkJeTFfbG8gPSAoTF90bXAgJiAweGZmZmYpID4+MTsNCisNCisJCWhwX3dzcFtpXSA9IChMX3RtcCArIDB4NDAwMCk+PjE1OyAgICAgICAgICANCisJfQ0KKw0KKwltZW1bMF0gPSB5M19oaTsgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzFdID0geTNfbG87ICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1lbVsyXSA9IHkyX2hpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltZW1bM10gPSB5Ml9sbzsgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzRdID0geTFfaGk7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1lbVs1XSA9IHkxX2xvOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltZW1bNl0gPSB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzddID0geDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1lbVs4XSA9IHgyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaW50X2xwYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZmQwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaW50X2xwYy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGludF9scGMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOkludGVycG9sYXRpb24gb2YgdGhlIExQIHBhcmFtZXRlcnMgaW4gNCBzdWJmcmFtZXMuICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisNCisjZGVmaW5lIE1QMSAoTSsxKQ0KKw0KKw0KK3ZvaWQgSW50X2lzcCgNCisJCVdvcmQxNiBpc3Bfb2xkW10sICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc3BzIGZyb20gcGFzdCBmcmFtZSAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc3BfbmV3W10sICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc3BzIGZyb20gcHJlc2VudCBmcmFtZSAgICAgICAgICAgKi8NCisJCVdvcmQxNiBmcmFjW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBmcmFjdGlvbiBmb3IgMyBmaXJzdCBzdWJmciAoUTE1KSAgKi8NCisJCVdvcmQxNiBBeltdICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBMUCBjb2VmZmljaWVudHMgaW4gNCBzdWJmcmFtZXMgICAgKi8NCisJICAgICkNCit7DQorCVdvcmQzMiBpLCBrOyANCisJV29yZDE2IGZhY19vbGQsIGZhY19uZXc7DQorCVdvcmQxNiBpc3BbTV07DQorCVdvcmQzMiBMX3RtcDsNCisNCisJZm9yIChrID0gMDsgayA8IDM7IGsrKykNCisJew0KKwkJZmFjX25ldyA9IGZyYWNba107ICAgICAgICAgICAgICAgIA0KKwkJZmFjX29sZCA9ICgzMjc2NyAtIGZhY19uZXcpICsgMTsgIC8qIDEuMCAtIGZhY19uZXcgKi8NCisNCisJCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCQl7DQorCQkJTF90bXAgPSAoaXNwX29sZFtpXSAqIGZhY19vbGQpPDwxOw0KKwkJCUxfdG1wICs9IChpc3BfbmV3W2ldICogZmFjX25ldyk8PDE7DQorCQkJaXNwW2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICANCisJCX0NCisJCUlzcF9Beihpc3AsIEF6LCBNLCAwKTsNCisJCUF6ICs9IE1QMTsNCisJfQ0KKw0KKwkvKiA0dGggc3ViZnJhbWU6IGlzcF9uZXcgKGZyYWM9MS4wKSAqLw0KKwlJc3BfQXooaXNwX25ldywgQXosIE0sIDApOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9hei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDRkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9hei5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBpc3BfYXouYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjpDb21wdXRlIHRoZSBMUEMgY29lZmZpY2llbnRzIGZyb20gaXNwIChvcmRlcj1NKSAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorDQorI2RlZmluZSBOQyAoTS8yKQ0KKyNkZWZpbmUgTkMxNmsgKE0xNmsvMikNCisNCisvKiBsb2NhbCBmdW5jdGlvbiAqLw0KKw0KK3N0YXRpYyB2b2lkIEdldF9pc3BfcG9sKFdvcmQxNiAqIGlzcCwgV29yZDMyICogZiwgV29yZDE2IG4pOw0KK3N0YXRpYyB2b2lkIEdldF9pc3BfcG9sXzE2a0h6KFdvcmQxNiAqIGlzcCwgV29yZDMyICogZiwgV29yZDE2IG4pOw0KKw0KK3ZvaWQgSXNwX0F6KA0KKwkJV29yZDE2IGlzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogSW1taXR0YW5jZSBzcGVjdHJhbCBwYWlycyAgICAgICAgICAgICovDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTIgOiBwcmVkaWN0b3IgY29lZmZpY2llbnRzIChvcmRlciA9IE0pICAgKi8NCisJCVdvcmQxNiBtLA0KKwkJV29yZDE2IGFkYXB0aXZlX3NjYWxpbmcgICAgICAgICAgICAgICAvKiAoaSkgMCAgIDogYWRhcHRpdmUgc2NhbGluZyBkaXNhYmxlZCAqLw0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgMSAgIDogYWRhcHRpdmUgc2NhbGluZyBlbmFibGVkICAqLw0KKwkgICApDQorew0KKwlXb3JkMzIgaSwgajsgDQorCVdvcmQxNiBoaSwgbG87DQorCVdvcmQzMiBmMVtOQzE2ayArIDFdLCBmMltOQzE2a107DQorCVdvcmQxNiBuYzsNCisJV29yZDMyIHQwOw0KKwlXb3JkMTYgcSwgcV9zdWc7DQorCVdvcmQzMiB0bWF4Ow0KKw0KKwluYyA9IChtID4+IDEpOw0KKwlpZihuYyA+IDgpDQorCXsNCisJCUdldF9pc3BfcG9sXzE2a0h6KCZpc3BbMF0sIGYxLCBuYyk7DQorCQlmb3IgKGkgPSAwOyBpIDw9IG5jOyBpKyspDQorCQl7DQorCQkJZjFbaV0gPSBmMVtpXSA8PCAyOw0KKwkJfQ0KKwl9IGVsc2UNCisJCUdldF9pc3BfcG9sKCZpc3BbMF0sIGYxLCBuYyk7DQorDQorCWlmIChuYyA+IDgpDQorCXsNCisJCUdldF9pc3BfcG9sXzE2a0h6KCZpc3BbMV0sIGYyLCAobmMgLSAxKSk7DQorCQlmb3IgKGkgPSAwOyBpIDw9IG5jIC0gMTsgaSsrKQ0KKwkJew0KKwkJCWYyW2ldID0gZjJbaV0gPDwgMjsNCisJCX0NCisJfSBlbHNlDQorCQlHZXRfaXNwX3BvbCgmaXNwWzFdLCBmMiwgKG5jIC0gMSkpOw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgTXVsdGlwbHkgRjIoeikgYnkgKDEgLSB6Xi0yKSAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJZm9yIChpID0gKG5jIC0gMSk7IGkgPiAxOyBpLS0pDQorCXsNCisJCWYyW2ldID0gdm9fTF9zdWIoZjJbaV0sIGYyW2kgLSAyXSk7ICAgICAgICAgIC8qIGYyW2ldIC09IGYyW2ktMl07ICovDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgU2NhbGUgRjEoeikgYnkgKDEraXNwW20tMV0pICBhbmQgIEYyKHopIGJ5ICgxLWlzcFttLTFdKSAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCWZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKQ0KKwl7DQorCQkvKiBmMVtpXSAqPSAoMS4wICsgaXNwW00tMV0pOyAqLw0KKw0KKwkJaGkgPSBmMVtpXSA+PiAxNjsNCisJCWxvID0gKGYxW2ldICYgMHhmZmZmKT4+MTsNCisNCisJCXQwID0gTXB5XzMyXzE2KGhpLCBsbywgaXNwW20gLSAxXSk7DQorCQlmMVtpXSA9IHZvX0xfYWRkKGYxW2ldLCB0MCk7IA0KKw0KKwkJLyogZjJbaV0gKj0gKDEuMCAtIGlzcFtNLTFdKTsgKi8NCisNCisJCWhpID0gZjJbaV0gPj4gMTY7DQorCQlsbyA9IChmMltpXSAmIDB4ZmZmZik+PjE7DQorCQl0MCA9IE1weV8zMl8xNihoaSwgbG8sIGlzcFttIC0gMV0pOw0KKwkJZjJbaV0gPSB2b19MX3N1YihmMltpXSwgdDApOyANCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgQSh6KSA9IChGMSh6KStGMih6KSkvMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgRjEoeikgaXMgc3ltbWV0cmljIGFuZCBGMih6KSBpcyBhbnRpc3ltbWV0cmljICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJLyogYVswXSA9IDEuMDsgKi8NCisJYVswXSA9IDQwOTY7ICANCisJdG1heCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAxLCBqID0gbSAtIDE7IGkgPCBuYzsgaSsrLCBqLS0pDQorCXsNCisJCS8qIGFbaV0gPSAwLjUqKGYxW2ldICsgZjJbaV0pOyAqLw0KKw0KKwkJdDAgPSB2b19MX2FkZChmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSArIGYyW2ldICAgICAgICAgICAgICovDQorCQl0bWF4IHw9IExfYWJzKHQwKTsgICAgICAgICAgICAgICAgIA0KKwkJYVtpXSA9IChXb3JkMTYpKHZvX0xfc2hyX3IodDAsIDEyKSk7IC8qIGZyb20gUTIzIHRvIFExMiBhbmQgKiAwLjUgKi8NCisNCisJCS8qIGFbal0gPSAwLjUqKGYxW2ldIC0gZjJbaV0pOyAqLw0KKw0KKwkJdDAgPSB2b19MX3N1YihmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSAtIGYyW2ldICAgICAgICAgICAgICovDQorCQl0bWF4IHw9IExfYWJzKHQwKTsgICAgICAgICAgICAgICAgDQorCQlhW2pdID0gKFdvcmQxNikodm9fTF9zaHJfcih0MCwgMTIpKTsgLyogZnJvbSBRMjMgdG8gUTEyIGFuZCAqIDAuNSAqLw0KKwl9DQorDQorCS8qIHJlc2NhbGUgZGF0YSBpZiBvdmVyZmxvdyBoYXMgb2NjdXJlZCBhbmQgcmVwcm9jZXNzIHRoZSBsb29wICovDQorCWlmKGFkYXB0aXZlX3NjYWxpbmcgPT0gMSkNCisJCXEgPSA0IC0gbm9ybV9sKHRtYXgpOyAgICAgICAgLyogYWRhcHRpdmUgc2NhbGluZyBlbmFibGVkICovDQorCWVsc2UNCisJCXEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0aXZlIHNjYWxpbmcgZGlzYWJsZWQgKi8NCisNCisJaWYgKHEgPiAwKQ0KKwl7DQorCQlxX3N1ZyA9ICgxMiArIHEpOw0KKwkJZm9yIChpID0gMSwgaiA9IG0gLSAxOyBpIDwgbmM7IGkrKywgai0tKQ0KKwkJew0KKwkJCS8qIGFbaV0gPSAwLjUqKGYxW2ldICsgZjJbaV0pOyAqLw0KKwkJCXQwID0gdm9fTF9hZGQoZjFbaV0sIGYyW2ldKTsgICAgICAgICAgLyogZjFbaV0gKyBmMltpXSAgICAgICAgICAgICAqLw0KKwkJCWFbaV0gPSAoV29yZDE2KSh2b19MX3Nocl9yKHQwLCBxX3N1ZykpOyAvKiBmcm9tIFEyMyB0byBRMTIgYW5kICogMC41ICovDQorDQorCQkJLyogYVtqXSA9IDAuNSooZjFbaV0gLSBmMltpXSk7ICovDQorCQkJdDAgPSB2b19MX3N1YihmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSAtIGYyW2ldICAgICAgICAgICAgICovDQorCQkJYVtqXSA9IChXb3JkMTYpKHZvX0xfc2hyX3IodDAsIHFfc3VnKSk7IC8qIGZyb20gUTIzIHRvIFExMiBhbmQgKiAwLjUgKi8NCisJCX0NCisJCWFbMF0gPSBzaHIoYVswXSwgcSk7IA0KKwl9DQorCWVsc2UNCisJew0KKwkJcV9zdWcgPSAxMjsgDQorCQlxICAgICA9IDA7IA0KKwl9DQorCS8qIGFbTkNdID0gMC41KmYxW05DXSooMS4wICsgaXNwW00tMV0pOyAqLw0KKwloaSA9IGYxW25jXSA+PiAxNjsNCisJbG8gPSAoZjFbbmNdICYgMHhmZmZmKT4+MTsNCisJdDAgPSBNcHlfMzJfMTYoaGksIGxvLCBpc3BbbSAtIDFdKTsNCisJdDAgPSB2b19MX2FkZChmMVtuY10sIHQwKTsNCisJYVtuY10gPSAoV29yZDE2KShMX3Nocl9yKHQwLCBxX3N1ZykpOyAgICAvKiBmcm9tIFEyMyB0byBRMTIgYW5kICogMC41ICovDQorCS8qIGFbbV0gPSBpc3BbbS0xXTsgKi8NCisNCisJYVttXSA9IHZvX3Nocl9yKGlzcFttIC0gMV0sICgzICsgcSkpOyAgICAgICAgICAgLyogZnJvbSBRMTUgdG8gUTEyICAgICAgICAgICovDQorCXJldHVybjsNCit9DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqIHByb2NlZHVyZSBHZXRfaXNwX3BvbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgfn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICBGaW5kIHRoZSBwb2x5bm9taWFsIEYxKHopIG9yIEYyKHopIGZyb20gdGhlIElTUHMuICAgICAgICoNCisqIFRoaXMgaXMgcGVyZm9ybWVkIGJ5IGV4cGFuZGluZyB0aGUgcHJvZHVjdCBwb2x5bm9taWFsczogICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRjEoeikgPSAgIHByb2R1Y3QgICAoIDEgLSAyIGlzcF9pIHpeLTEgKyB6Xi0yICkgICAgICAgICAgICoNCisqICAgICAgICAgaT0wLDIsNCw2LDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBGMih6KSA9ICAgcHJvZHVjdCAgICggMSAtIDIgaXNwX2kgel4tMSArIHpeLTIgKSAgICAgICAgICAgKg0KKyogICAgICAgICBpPTEsMyw1LDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiB3aGVyZSBpc3BfaSBhcmUgdGhlIElTUHMgaW4gdGhlIGNvc2luZSBkb21haW4uICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBQYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIGlzcFtdICAgOiBpc3AgdmVjdG9yIChjb3NpbmUgZG9tYWluZSkgICAgICAgICBpbiBRMTUgICAgICoNCisqICBmW10gICAgIDogdGhlIGNvZWZmaWNpZW50cyBvZiBGMSBvciBGMiAgICAgICAgaW4gUTIzICAgICAqDQorKiAgbiAgICAgICA6ID09IE5DIGZvciBGMSh6KTsgPT0gTkMtMSBmb3IgRjIoeikgICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIHZvaWQgR2V0X2lzcF9wb2woV29yZDE2ICogaXNwLCBXb3JkMzIgKiBmLCBXb3JkMTYgbikNCit7DQorCVdvcmQxNiBoaSwgbG87DQorCVdvcmQzMiBpLCBqLCB0MDsNCisJLyogQWxsIGNvbXB1dGF0aW9uIGluIFEyMyAqLw0KKw0KKwlmWzBdID0gdm9fTF9tdWx0KDQwOTYsIDEwMjQpOyAgICAgICAgICAgICAgIC8qIGZbMF0gPSAxLjA7ICAgICAgICBpbiBRMjMgICovDQorCWZbMV0gPSB2b19MX211bHQoaXNwWzBdLCAtMjU2KTsgICAgICAgICAgICAgLyogZlsxXSA9IC0yLjAqaXNwWzBdIGluIFEyMyAgKi8NCisNCisJZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIGYgcG9pbnRlciAgICAgICAgICAqLw0KKwlpc3AgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgaXNwIHBvaW50ZXIgICAgICAgICovDQorCWZvciAoaSA9IDI7IGkgPD0gbjsgaSsrKQ0KKwl7DQorCQkqZiA9IGZbLTJdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChqID0gMTsgaiA8IGk7IGorKywgZi0tKQ0KKwkJew0KKwkJCWhpID0gZlstMV0+PjE2Ow0KKwkJCWxvID0gKGZbLTFdICYgMHhmZmZmKT4+MTsNCisNCisJCQl0MCA9IE1weV8zMl8xNihoaSwgbG8sICppc3ApOyAgLyogdDAgPSBmWy0xXSAqIGlzcCAgICAqLw0KKwkJCXQwID0gdDAgPDwgMTsNCisJCQkqZiA9IHZvX0xfc3ViKCpmLCB0MCk7ICAgICAgICAgICAgICAvKiAqZiAtPSB0MCAgICAgICAgICAgICovDQorCQkJKmYgPSB2b19MX2FkZCgqZiwgZlstMl0pOyAgICAgICAgICAgLyogKmYgKz0gZlstMl0gICAgICAgICAqLw0KKwkJfQ0KKwkJKmYgLT0gKCppc3AgPDwgOSk7ICAgICAgICAgICAvKiAqZiAtPSBpc3A8PDggICAgICAgICovDQorCQlmICs9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgZiBwb2ludGVyICAgKi8NCisJCWlzcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBpc3AgcG9pbnRlciAqLw0KKwl9DQorCXJldHVybjsNCit9DQorDQorc3RhdGljIHZvaWQgR2V0X2lzcF9wb2xfMTZrSHooV29yZDE2ICogaXNwLCBXb3JkMzIgKiBmLCBXb3JkMTYgbikNCit7DQorCVdvcmQxNiBoaSwgbG87DQorCVdvcmQzMiBpLCBqLCB0MDsNCisNCisJLyogQWxsIGNvbXB1dGF0aW9uIGluIFEyMyAqLw0KKwlmWzBdID0gTF9tdWx0KDQwOTYsIDI1Nik7ICAgICAgICAgICAgICAgIC8qIGZbMF0gPSAxLjA7ICAgICAgICBpbiBRMjMgICovDQorCWZbMV0gPSBMX211bHQoaXNwWzBdLCAtNjQpOyAgICAgICAgICAgICAgLyogZlsxXSA9IC0yLjAqaXNwWzBdIGluIFEyMyAgKi8NCisNCisJZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIGYgcG9pbnRlciAgICAgICAgICAqLw0KKwlpc3AgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgaXNwIHBvaW50ZXIgICAgICAgICovDQorDQorCWZvciAoaSA9IDI7IGkgPD0gbjsgaSsrKQ0KKwl7DQorCQkqZiA9IGZbLTJdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChqID0gMTsgaiA8IGk7IGorKywgZi0tKQ0KKwkJew0KKwkJCVZPX0xfRXh0cmFjdChmWy0xXSwgJmhpLCAmbG8pOw0KKwkJCXQwID0gTXB5XzMyXzE2KGhpLCBsbywgKmlzcCk7ICAvKiB0MCA9IGZbLTFdICogaXNwICAgICovDQorCQkJdDAgPSBMX3NobDIodDAsIDEpOw0KKwkJCSpmID0gTF9zdWIoKmYsIHQwKTsgICAgICAgICAgICAgIC8qICpmIC09IHQwICAgICAgICAgICAgKi8NCisJCQkqZiA9IExfYWRkKCpmLCBmWy0yXSk7ICAgICAgICAgICAvKiAqZiArPSBmWy0yXSAgICAgICAgICovDQorCQl9DQorCQkqZiA9IExfbXN1KCpmLCAqaXNwLCA2NCk7ICAgICAgICAgICAgLyogKmYgLT0gaXNwPDw4ICAgICAgICAqLw0KKwkJZiArPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIGYgcG9pbnRlciAgICovDQorCQlpc3AgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgaXNwIHBvaW50ZXIgKi8NCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2ZTM4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBpc3BfaXNmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKglJc3BfaXNmICAgVHJhbnNmb3JtYXRpb24gaXNwIHRvIGlzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKglJc2ZfaXNwICAgVHJhbnNmb3JtYXRpb24gaXNmIHRvIGlzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKglUaGUgdHJhbnNmb3JtYXRpb24gZnJvbSBpc3BbaV0gdG8gaXNmW2ldIGFuZCBpc2ZbaV0gdG8gaXNwW2ldICAqDQorKglhcmUgYXBwcm94aW1hdGVkIGJ5IGEgbG9vay11cCB0YWJsZSBhbmQgaW50ZXJwb2xhdGlvbiAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImlzcF9pc2YudGFiIiAgICAgICAgICAgICAgICAgICAgIC8qIExvb2stdXAgdGFibGUgZm9yIHRyYW5zZm9ybWF0aW9ucyAqLw0KKw0KK3ZvaWQgSXNwX2lzZigNCisJCVdvcmQxNiBpc3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGlzcFttXSAocmFuZ2U6IC0xPD12YWw8MSkgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc2ZbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IGlzZlttXSBub3JtYWxpemVkIChyYW5nZTogMC4wPD12YWw8PTAuNSkgKi8NCisJCVdvcmQxNiBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICkNCit7DQorCVdvcmQzMiBpLCBpbmQ7DQorCVdvcmQzMiBMX3RtcDsNCisJaW5kID0gMTI3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZWdpbmcgYXQgZW5kIG9mIHRhYmxlIC0xICovDQorCWZvciAoaSA9IChtIC0gMSk7IGkgPj0gMDsgaS0tKQ0KKwl7DQorCQlpZiAoaSA+PSAobSAtIDIpKQ0KKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtLTIgaXMgYSBjb25zdGFudCAqLw0KKwkJCWluZCA9IDEyNzsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlZ2luZyBhdCBlbmQgb2YgdGFibGUgLTEgKi8NCisJCX0NCisJCS8qIGZpbmQgdmFsdWUgaW4gdGFibGUgdGhhdCBpcyBqdXN0IGdyZWF0ZXIgdGhhbiBpc3BbaV0gKi8NCisJCXdoaWxlICh0YWJsZVtpbmRdIDwgaXNwW2ldKQ0KKwkJCWluZC0tOw0KKwkJLyogYWNvcyhpc3BbaV0pPSBpbmQqMTI4ICsgKCAoIGlzcFtpXS10YWJsZVtpbmRdICkgKiBzbG9wZVtpbmRdICkvMjA0OCAqLw0KKwkJTF90bXAgPSB2b19MX211bHQodm9fc3ViKGlzcFtpXSwgdGFibGVbaW5kXSksIHNsb3BlW2luZF0pOw0KKwkJaXNmW2ldID0gdm9fcm91bmQoKExfdG1wIDw8IDQpKTsgICAvKiAoaXNwW2ldLXRhYmxlW2luZF0pKnNsb3BlW2luZF0pPj4xMSAqLw0KKwkJaXNmW2ldID0gYWRkMShpc2ZbaV0sIChpbmQgPDwgNykpOyANCisJfQ0KKwlpc2ZbbSAtIDFdID0gKGlzZlttIC0gMV0gPj4gMSk7ICAgICAgDQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBJc2ZfaXNwKA0KKwkJV29yZDE2IGlzZltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaXNmW21dIG5vcm1hbGl6ZWQgKHJhbmdlOiAwLjA8PXZhbDw9MC41KSAqLw0KKwkJV29yZDE2IGlzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogaXNwW21dIChyYW5nZTogLTE8PXZhbDwxKSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDE2IG9mZnNldDsNCisJV29yZDMyIGksIGluZCwgTF90bXA7DQorDQorCWZvciAoaSA9IDA7IGkgPCBtIC0gMTsgaSsrKQ0KKwl7DQorCQlpc3BbaV0gPSBpc2ZbaV07ICAgICAgICAgICAgICAgICAgDQorCX0NCisJaXNwW20gLSAxXSA9IChpc2ZbbSAtIDFdIDw8IDEpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKQ0KKwl7DQorCQlpbmQgPSAoaXNwW2ldID4+IDcpOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmQgICAgPSBiNy1iMTUgb2YgaXNmW2ldICovDQorCQlvZmZzZXQgPSAoV29yZDE2KSAoaXNwW2ldICYgMHgwMDdmKTsgICAgICAvKiBvZmZzZXQgPSBiMC1iNiAgb2YgaXNmW2ldICovDQorDQorCQkvKiBpc3BbaV0gPSB0YWJsZVtpbmRdKyAoKHRhYmxlW2luZCsxXS10YWJsZVtpbmRdKSpvZmZzZXQpIC8gMTI4ICovDQorCQlMX3RtcCA9IHZvX0xfbXVsdCh2b19zdWIodGFibGVbaW5kICsgMV0sIHRhYmxlW2luZF0pLCBvZmZzZXQpOw0KKwkJaXNwW2ldID0gYWRkMSh0YWJsZVtpbmRdLCAoV29yZDE2KSgoTF90bXAgPj4gOCkpKTsgICANCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGFnX3dpbmQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGFnX3dpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk3NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sYWdfd2luZC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGxhZ193aW5kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKgkgICBEZXNjcmlwdGlvbjogTGFnX3dpbmRvd3Mgb24gYXV0b2NvcnJlbGF0aW9ucyAgICAgICAgICAgICAgICAqDQorKgkgICAgICAgICAgICAgICAgcltpXSAqPSBsYWdfd2luZFtpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImxhZ193aW5kLnRhYiINCisNCisNCit2b2lkIExhZ193aW5kb3coDQorCQlXb3JkMTYgcl9oW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBBdXRvY29ycmVsYXRpb25zICAobXNiKSAgICAgICAgICAqLw0KKwkJV29yZDE2IHJfbFtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKGxzYikgICAgICAgICAgKi8NCisJICAgICAgICkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgeDsNCisNCisJZm9yIChpID0gMTsgaSA8PSBNOyBpKyspDQorCXsNCisJCXggPSBNcHlfMzIocl9oW2ldLCByX2xbaV0sIHZvbGFnX2hbaSAtIDFdLCB2b2xhZ19sW2kgLSAxXSk7DQorCQlyX2hbaV0gPSB4ID4+IDE2Ow0KKwkJcl9sW2ldID0gKHggJiAweGZmZmYpPj4xOw0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sZXZpbnNvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sZXZpbnNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzZmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xldmluc29uLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGxldmluc29uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOkxFVklOU09OLURVUkJJTiBhbGdvcml0aG0gaW4gZG91YmxlIHByZWNpc2lvbiAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIExFVklOU09OLkMJCQkJCSAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgTEVWSU5TT04tRFVSQklOIGFsZ29yaXRobSBpbiBkb3VibGUgcHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIEFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFJbaV0gICAgYXV0b2NvcnJlbGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIEFbaV0gICAgZmlsdGVyIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIEsgICAgICAgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIEFscGhhICAgcHJlZGljdGlvbiBnYWluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIEluaXRpYWxpemF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgQVswXSA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgSyAgICA9IC1SWzFdL1JbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgQVsxXSA9IEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgQWxwaGEgPSBSWzBdICogKDEtSyoqMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIERvIGZvciAgaSA9IDIgdG8gTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgUyA9ICBTVU0gKCBSW2pdKkFbaS1qXSAsaj0xLGktMSApICsgIFJbaV0gICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgSyA9IC1TIC8gQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgQW5bal0gPSBBW2pdICsgSypBW2ktal0gICBmb3Igaj0xIHRvIGktMSAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSAgIEFuW2ldID0gbmV3IEFbaV0gICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgQW5baV09SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgQWxwaGE9QWxwaGEgKiAoMS1LKioyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFJlbWFya3Mgb24gdGhlIGR5bmFtaWNzIG9mIHRoZSBjYWxjdWxhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFRoZSBudW1iZXJzIHVzZWQgYXJlIGluIGRvdWJsZSBwcmVjaXNpb24gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQgOiAgKg0KKyAqICAgICAgIEEgPSBBSCA8PDE2ICsgQUw8PDEuICBBSCBhbmQgQUwgYXJlIDE2IGJpdCBzaWduZWQgaW50ZWdlcnMuICAgICAgICAgKg0KKyAqICAgICAgIFNpbmNlIHRoZSBMU0IncyBhbHNvIGNvbnRhaW4gYSBzaWduIGJpdCwgdGhpcyBmb3JtYXQgZG9lcyBub3QgICAgICAgKg0KKyAqICAgICAgIGNvcnJlc3BvbmQgdG8gc3RhbmRhcmQgMzIgYml0IGludGVnZXJzLiAgV2UgdXNlIHRoaXMgZm9ybWF0IHNpbmNlICAgKg0KKyAqICAgICAgIGl0IGFsbG93cyBmYXN0IGV4ZWN1dGlvbiBvZiBtdWx0aXBsaWNhdGlvbnMgYW5kIGRpdmlzaW9ucy4gICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICJEUEYiIHdpbGwgcmVmZXIgdG8gdGhpcyBzcGVjaWFsIGZvcm1hdCBpbiB0aGUgZm9sbG93aW5nIHRleHQuICAgICAgKg0KKyAqICAgICAgIFNlZSBvcGVyXzMyYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFRoZSBSW2ldIHdlcmUgbm9ybWFsaXplZCBpbiByb3V0aW5lIEFVVE8gKGhlbmNlLCBSW2ldIDwgMS4wKS4gICAgICAgKg0KKyAqICAgICAgIFRoZSBLW2ldIGFuZCBBbHBoYSBhcmUgdGhlb3JldGljYWxseSA8IDEuMC4gICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFRoZSBBW2ldLCBmb3IgYSBzYW1wbGluZyBmcmVxdWVuY3kgb2YgOCBrSHosIGFyZSBpbiBwcmFjdGljZSAgICAgICAgKg0KKyAqICAgICAgIGFsd2F5cyBpbmZlcmlvciB0byAxNi4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFRoZXNlIGNoYXJhY3RlcmlzdGljcyBhbGxvdyBzdHJhaWd0aGZvcndhcmQgZml4ZWQtcG9pbnQgICAgICAgICAgICAgKg0KKyAqICAgICAgIGltcGxlbWVudGF0aW9uLiAgV2UgY2hvb3NlIHRvIHJlcHJlc2VudCB0aGUgcGFyYW1ldGVycyBhcyAgICAgICAgICAgKg0KKyAqICAgICAgIGZvbGxvd3MgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgUltpXSAgICBRMzEgICArLSAuOTkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgS1tpXSAgICBRMzEgICArLSAuOTkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgQWxwaGEgICBOb3JtYWxpemVkIC0+IG1hbnRpc3NhIGluIFEzMSBwbHVzIGV4cG9uZW50ICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgQVtpXSAgICBRMjcgICArLSAxNS45OTkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIFRoZSBhZGRpdGlvbnMgYXJlIHBlcmZvcm1lZCBpbiAzMiBiaXQuICBGb3IgdGhlIHN1bW1hdGlvbiB1c2VkICAgICAgKg0KKyAqICAgICAgIHRvIGNhbGN1bGF0ZSB0aGUgS1tpXSwgd2UgbXVsdGlwbHkgbnVtYmVycyBpbiBRMzEgYnkgbnVtYmVycyAgICAgICAgKg0KKyAqICAgICAgIGluIFEyNywgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbnMgaW4gUTI3LCAgICAgICAgICAgICAgKg0KKyAqICAgICAgIHJlc3VsdGluZyBpbiBhIGR5bmFtaWMgb2YgKy0gMTYuICBUaGlzIGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgICAgICAgKg0KKyAqICAgICAgIG92ZXJmbG93LCBzaW5jZSB0aGUgZmluYWwgcmVzdWx0IG9mIHRoZSBzdW1tYXRpb24gaXMgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIG5lY2Vzc2FyaWx5IDwgMS4wIGFzIGJvdGggdGhlIEtbaV0gYW5kIEFscGhhIGFyZSAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgIHRoZW9yZXRpY2FsbHkgPCAxLjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fKi8NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKw0KKyNkZWZpbmUgTSAgIDE2DQorI2RlZmluZSBOQyAgKE0vMikNCisNCit2b2lkIEluaXRfTGV2aW5zb24oDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCAgOnN0YXRpYyBtZW1vcnkgKDE4IHdvcmRzKSAqLw0KKwkJKQ0KK3sNCisJU2V0X3plcm8obWVtLCAxOCk7ICAgICAgICAgICAgICAgICAgICAgLyogb2xkX0FbMC4uTS0xXSA9IDAsIG9sZF9yY1swLi4xXSA9IDAgKi8NCisJcmV0dXJuOw0KK30NCisNCisNCit2b2lkIExldmluc29uKA0KKwkJV29yZDE2IFJoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogUmhbTSsxXSBWZWN0b3Igb2YgYXV0b2NvcnJlbGF0aW9ucyAobXNiKSAqLw0KKwkJV29yZDE2IFJsW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogUmxbTSsxXSBWZWN0b3Igb2YgYXV0b2NvcnJlbGF0aW9ucyAobHNiKSAqLw0KKwkJV29yZDE2IEFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTEyIDogQVtNXSAgICBMUEMgY29lZmZpY2llbnRzICAobSA9IDE2KSAgICAgICAqLw0KKwkJV29yZDE2IHJjW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogcmNbTV0gICBSZWZsZWN0aW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDpzdGF0aWMgbWVtb3J5ICgxOCB3b3JkcykgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBpLCBqOw0KKwlXb3JkMTYgaGksIGxvOw0KKwlXb3JkMTYgS2gsIEtsOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWZsZWN0aW9uIGNvZWZmaWNpZW50OyBoaSBhbmQgbG8gICAgICAgICAgICovDQorCVdvcmQxNiBhbHBfaCwgYWxwX2wsIGFscF9leHA7ICAgICAgICAgIC8qIFByZWRpY3Rpb24gZ2FpbjsgaGkgbG8gYW5kIGV4cG9uZW50ICAgICAgICAgKi8NCisJV29yZDE2IEFoW00gKyAxXSwgQWxbTSArIDFdOyAgICAgICAgICAgLyogTFBDIGNvZWYuIGluIGRvdWJsZSBwcmVjLiAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgQW5oW00gKyAxXSwgQW5sW00gKyAxXTsgICAgICAgICAvKiBMUEMgY29lZi5mb3IgbmV4dCBpdGVyYXRpb24gaW4gZG91YmxlIHByZWMuICovDQorCVdvcmQzMiB0MCwgdDEsIHQyOyAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2ICpvbGRfQSwgKm9sZF9yYzsNCisNCisJLyogTGFzdCBBKHopIGZvciBjYXNlIG9mIHVuc3RhYmxlIGZpbHRlciAqLw0KKwlvbGRfQSA9IG1lbTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJb2xkX3JjID0gbWVtICsgTTsgICAgICAgICAgICAgICAgICAgICAgDQorDQorCS8qIEsgPSBBWzFdID0gLVJbMV0gLyBSWzBdICovDQorDQorCXQxID0gKChSaFsxXSA8PCAxNikgKyAoUmxbMV0gPDwgMSkpOyAgIC8qIFJbMV0gaW4gUTMxICovDQorCXQyID0gTF9hYnModDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFicyBSWzFdICAgICAgICAgKi8NCisJdDAgPSBEaXZfMzIodDIsIFJoWzBdLCBSbFswXSk7ICAgICAgICAgLyogUlsxXS9SWzBdIGluIFEzMSAqLw0KKwlpZiAodDEgPiAwKQ0KKwkJdDAgPSAtdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtUlsxXS9SWzBdICAgICAgICovDQorDQorCUtoID0gdDAgPj4gMTY7DQorCUtsID0gKHQwICYgMHhmZmZmKT4+MTsNCisJcmNbMF0gPSBLaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXQwID0gKHQwID4+IDQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFbMV0gaW4gUTI3ICAgICAgKi8NCisNCisJQWhbMV0gPSB0MCA+PiAxNjsNCisJQWxbMV0gPSAodDAgJiAweGZmZmYpPj4xOw0KKw0KKwkvKiBBbHBoYSA9IFJbMF0gKiAoMS1LKioyKSAqLw0KKwl0MCA9IE1weV8zMihLaCwgS2wsIEtoLCBLbCk7ICAgICAgICAgICAvKiBLKksgICAgICBpbiBRMzEgKi8NCisJdDAgPSBMX2Ficyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBjYXNlIDwwICEhICovDQorCXQwID0gdm9fTF9zdWIoKFdvcmQzMikgMHg3ZmZmZmZmZkwsIHQwKTsgIC8qIDEgLSBLKksgIGluIFEzMSAqLw0KKw0KKwloaSA9IHQwID4+IDE2Ow0KKwlsbyA9ICh0MCAmIDB4ZmZmZik+PjE7DQorDQorCXQwID0gTXB5XzMyKFJoWzBdLCBSbFswXSwgaGksIGxvKTsgICAgIC8qIEFscGhhIGluIFEzMSAgICAqLw0KKw0KKwkvKiBOb3JtYWxpemUgQWxwaGEgKi8NCisJYWxwX2V4cCA9IG5vcm1fbCh0MCk7DQorCXQwID0gKHQwIDw8IGFscF9leHApOw0KKw0KKwlhbHBfaCA9IHQwID4+IDE2Ow0KKwlhbHBfbCA9ICh0MCAmIDB4ZmZmZik+PjE7DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIElURVJBVElPTlMgIEk9MiB0byBNICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlmb3IgKGkgPSAyOyBpIDw9IE07IGkrKykNCisJew0KKwkJLyogdDAgPSBTVU0gKCBSW2pdKkFbaS1qXSAsaj0xLGktMSApICsgIFJbaV0gKi8NCisJCXQwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWZvciAoaiA9IDE7IGogPCBpOyBqKyspDQorCQkJdDAgPSB2b19MX2FkZCh0MCwgTXB5XzMyKFJoW2pdLCBSbFtqXSwgQWhbaSAtIGpdLCBBbFtpIC0gal0pKTsNCisNCisJCXQwID0gdDAgPDwgNDsgICAgICAgICAgICAgICAgIC8qIHJlc3VsdCBpbiBRMjcgLT4gY29udmVydCB0byBRMzEgKi8NCisJCS8qIE5vIG92ZXJmbG93IHBvc3NpYmxlICAgICAgICAgICAgKi8NCisJCXQxID0gKChSaFtpXSA8PCAxNikgKyAoUmxbaV0gPDwgMSkpOw0KKwkJdDAgPSB2b19MX2FkZCh0MCwgdDEpOyAgICAgICAgICAgICAgICAvKiBhZGQgUltpXSBpbiBRMzEgICAgICAgICAgICAgICAgICovDQorDQorCQkvKiBLID0gLXQwIC8gQWxwaGEgKi8NCisJCXQxID0gTF9hYnModDApOw0KKwkJdDIgPSBEaXZfMzIodDEsIGFscF9oLCBhbHBfbCk7ICAgICAvKiBhYnModDApL0FscGhhICAgICAgICAgICAgICAgICAgICovDQorCQlpZiAodDAgPiAwKQ0KKwkJCXQyID0gLXQyOyAgICAgICAgICAgICAgICAgICAvKiBLID0tdDAvQWxwaGEgICAgICAgICAgICAgICAgICAgICovDQorCQl0MiA9ICh0MiA8PCBhbHBfZXhwKTsgICAgICAgICAgIC8qIGRlbm9ybWFsaXplOyBjb21wYXJlIHRvIEFscGhhICAgKi8NCisNCisJCUtoID0gdDIgPj4gMTY7DQorCQlLbCA9ICh0MiAmIDB4ZmZmZik+PjE7DQorDQorCQlyY1tpIC0gMV0gPSBLaDsgICAgICAgICAgICAgICAgICAgDQorCQkvKiBUZXN0IGZvciB1bnN0YWJsZSBmaWx0ZXIuIElmIHVuc3RhYmxlIGtlZXAgb2xkIEEoeikgKi8NCisJCWlmIChhYnNfcyhLaCkgPiAzMjc1MCkNCisJCXsNCisJCQlBWzBdID0gNDA5NjsgICAgICAgICAgICAgICAgICAgIC8qIEFpWzBdIG5vdCBzdG9yZWQgKGFsd2F5cyAxLjApICovDQorCQkJZm9yIChqID0gMDsgaiA8IE07IGorKykNCisJCQl7DQorCQkJCUFbaiArIDFdID0gb2xkX0Fbal07ICAgICAgIA0KKwkJCX0NCisJCQlyY1swXSA9IG9sZF9yY1swXTsgICAgICAgICAgICAgLyogb25seSB0d28gcmMgY29lZmZpY2llbnRzIGFyZSBuZWVkZWQgKi8NCisJCQlyY1sxXSA9IG9sZF9yY1sxXTsNCisJCQlyZXR1cm47DQorCQl9DQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqICBDb21wdXRlIG5ldyBMUEMgY29lZmYuIC0+IEFuW2ldICAgICAgICAgKg0KKwkJICogIEFuW2pdPSBBW2pdICsgSypBW2ktal0gICAgICwgaj0xIHRvIGktMSAqDQorCQkgKiAgQW5baV09IEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCWZvciAoaiA9IDE7IGogPCBpOyBqKyspDQorCQl7DQorCQkJdDAgPSBNcHlfMzIoS2gsIEtsLCBBaFtpIC0gal0sIEFsW2kgLSBqXSk7DQorCQkJdDAgPSB2b19MX2FkZCh0MCwgKChBaFtqXSA8PCAxNikgKyAoQWxbal0gPDwgMSkpKTsNCisJCQlBbmhbal0gPSB0MCA+PiAxNjsNCisJCQlBbmxbal0gPSAodDAgJiAweGZmZmYpPj4xOw0KKwkJfQ0KKwkJdDIgPSAodDIgPj4gNCk7ICAgICAgICAgICAgICAgICAvKiB0MiA9IEsgaW4gUTMxIC0+Y29udmVydCB0byBRMjcgICovDQorDQorCQlWT19MX0V4dHJhY3QodDIsICZBbmhbaV0sICZBbmxbaV0pOyAgIC8qIEFuW2ldIGluIFEyNyAgICAgICAgICAgICAgICAgICAgKi8NCisNCisJCS8qIEFscGhhID0gQWxwaGEgKiAoMS1LKioyKSAqLw0KKwkJdDAgPSBNcHlfMzIoS2gsIEtsLCBLaCwgS2wpOyAgICAgICAgICAgICAgIC8qIEsqSyAgICAgIGluIFEzMSAqLw0KKwkJdDAgPSBMX2Ficyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgY2FzZSA8MCAhISAqLw0KKwkJdDAgPSB2b19MX3N1YigoV29yZDMyKSAweDdmZmZmZmZmTCwgdDApOyAgIC8qIDEgLSBLKksgIGluIFEzMSAqLw0KKwkJaGkgPSB0MCA+PiAxNjsNCisJCWxvID0gKHQwICYgMHhmZmZmKT4+MTsNCisJCXQwID0gTXB5XzMyKGFscF9oLCBhbHBfbCwgaGksIGxvKTsgLyogQWxwaGEgaW4gUTMxICAgICovDQorDQorCQkvKiBOb3JtYWxpemUgQWxwaGEgKi8NCisJCWogPSBub3JtX2wodDApOw0KKwkJdDAgPSAodDAgPDwgaik7DQorCQlhbHBfaCA9IHQwID4+IDE2Ow0KKwkJYWxwX2wgPSAodDAgJiAweGZmZmYpPj4xOw0KKwkJYWxwX2V4cCArPSBqOyAgICAgICAgIC8qIEFkZCBub3JtYWxpemF0aW9uIHRvIGFscF9leHAgKi8NCisNCisJCS8qIEFbal0gPSBBbltqXSAqLw0KKwkJZm9yIChqID0gMTsgaiA8PSBpOyBqKyspDQorCQl7DQorCQkJQWhbal0gPSBBbmhbal07ICAgICAgICAgICAgICAgDQorCQkJQWxbal0gPSBBbmxbal07ICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCS8qIFRydW5jYXRlIEFbaV0gaW4gUTI3IHRvIFExMiB3aXRoIHJvdW5kaW5nICovDQorCUFbMF0gPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDE7IGkgPD0gTTsgaSsrKQ0KKwl7DQorCQl0MCA9IChBaFtpXSA8PCAxNikgKyAoQWxbaV0gPDwgMSk7DQorCQlvbGRfQVtpIC0gMV0gPSBBW2ldID0gdm9fcm91bmQoKHQwIDw8IDEpKTsgICAgICANCisJfQ0KKwlvbGRfcmNbMF0gPSByY1swXTsgICAgICAgICAgICAgICAgICAgIA0KKwlvbGRfcmNbMV0gPSByY1sxXTsgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZDgxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCkBAIC0wLDAgKzEsMTExIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBGaWxlICAgICAgICAgICAgIDogbG9nMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBQdXJwb3NlICAgICAgICAgIDogQ29tcHV0ZXMgbG9nMihMX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAibG9nMi5oIg0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMIFZBUklBQkxFUyBBTkQgVEFCTEVTDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAibG9nMl90YWIuaCIgICAgIC8qIFRhYmxlIGZvciBMb2cyKCkgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgRlVOQ1RJT046ICAgTG9nMl9ub3JtKCkNCisqDQorKiAgIFBVUlBPU0U6ICAgQ29tcHV0ZXMgbG9nMihMX3gsIGV4cCksICB3aGVyZSAgIExfeCBpcyBwb3NpdGl2ZSBhbmQNCisqICAgICAgICAgICAgICBub3JtYWxpemVkLCBhbmQgZXhwIGlzIHRoZSBub3JtYWxpc2F0aW9uIGV4cG9uZW50DQorKiAgICAgICAgICAgICAgSWYgTF94IGlzIG5lZ2F0aXZlIG9yIHplcm8sIHRoZSByZXN1bHQgaXMgMC4NCisqDQorKiAgIERFU0NSSVBUSU9OOg0KKyogICAgICAgIFRoZSBmdW5jdGlvbiBMb2cyKExfeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgdGFibGUgYW5kIGxpbmVhcg0KKyogICAgICAgIGludGVycG9sYXRpb24uIFRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHVzZWQgdG8gY29tcHV0ZSBMb2cyKExfeCkNCisqDQorKiAgICAgICAgICAgMS0gZXhwb25lbnQgPSAzMC1ub3JtX2V4cG9uZW50DQorKiAgICAgICAgICAgMi0gaSA9IGJpdDI1LWIzMSBvZiBMX3g7ICAzMjw9aTw9NjMgIChiZWNhdXNlIG9mIG5vcm1hbGl6YXRpb24pLg0KKyogICAgICAgICAgIDMtIGEgPSBiaXQxMC1iMjQNCisqICAgICAgICAgICA0LSBpIC09MzINCisqICAgICAgICAgICA1LSBmcmFjdGlvbiA9IHRhYmxlW2ldPDwxNiAtICh0YWJsZVtpXSAtIHRhYmxlW2krMV0pICogYSAqIDINCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIExvZzJfbm9ybSAoDQorCQlXb3JkMzIgTF94LCAgICAgICAgIC8qIChpKSA6IGlucHV0IHZhbHVlIChub3JtYWxpemVkKSAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBleHAsICAgICAgICAgLyogKGkpIDogbm9ybV9sIChMX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICpleHBvbmVudCwgICAvKiAobykgOiBJbnRlZ2VyIHBhcnQgb2YgTG9nMi4gICAocmFuZ2U6IDA8PXZhbDw9MzApICovDQorCQlXb3JkMTYgKmZyYWN0aW9uICAgIC8qIChvKSA6IEZyYWN0aW9uYWwgcGFydCBvZiBMb2cyLiAocmFuZ2U6IDA8PXZhbDwxKSAgKi8NCisJICAgICAgICkNCit7DQorCVdvcmQxNiBpLCBhLCB0bXA7DQorCVdvcmQzMiBMX3k7DQorCWlmIChMX3ggPD0gKFdvcmQzMikgMCkNCisJew0KKwkJKmV4cG9uZW50ID0gMDsgDQorCQkqZnJhY3Rpb24gPSAwOyANCisJCXJldHVybjsNCisJfQ0KKwkqZXhwb25lbnQgPSAoMzAgLSBleHApOyANCisJTF94ID0gKExfeCA+PiA5KTsNCisJaSA9IGV4dHJhY3RfaCAoTF94KTsgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBiMjUtYjMxICovDQorCUxfeCA9IChMX3ggPj4gMSk7DQorCWEgPSAoV29yZDE2KShMX3gpOyAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIxMC1iMjQgb2YgZnJhY3Rpb24gKi8NCisJYSA9IChXb3JkMTYpKGEgJiAoV29yZDE2KTB4N2ZmZik7DQorCWkgLT0gMzI7DQorCUxfeSA9IExfZGVwb3NpdF9oICh0YWJsZVtpXSk7ICAgICAgIC8qIHRhYmxlW2ldIDw8IDE2ICAgICAgICAqLw0KKwl0bXAgPSB2b19zdWIodGFibGVbaV0sIHRhYmxlW2kgKyAxXSk7IC8qIHRhYmxlW2ldIC0gdGFibGVbaSsxXSAqLw0KKwlMX3kgPSB2b19MX21zdSAoTF95LCB0bXAsIGEpOyAgICAgICAgICAvKiBMX3kgLT0gdG1wKmEqMiAgICAgICAgKi8NCisJKmZyYWN0aW9uID0gZXh0cmFjdF9oIChMX3kpOyANCisNCisJcmV0dXJuOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgRlVOQ1RJT046ICAgTG9nMigpDQorKg0KKyogICBQVVJQT1NFOiAgIENvbXB1dGVzIGxvZzIoTF94KSwgIHdoZXJlICAgTF94IGlzIHBvc2l0aXZlLg0KKyogICAgICAgICAgICAgIElmIExfeCBpcyBuZWdhdGl2ZSBvciB6ZXJvLCB0aGUgcmVzdWx0IGlzIDAuDQorKg0KKyogICBERVNDUklQVElPTjoNCisqICAgICAgICBub3JtYWxpemVzIExfeCBhbmQgdGhlbiBjYWxscyBMb2cyX25vcm0oKS4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIExvZzIgKA0KKwkJV29yZDMyIExfeCwgICAgICAgICAvKiAoaSkgOiBpbnB1dCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKmV4cG9uZW50LCAgIC8qIChvKSA6IEludGVnZXIgcGFydCBvZiBMb2cyLiAgIChyYW5nZTogMDw9dmFsPD0zMCkgKi8NCisJCVdvcmQxNiAqZnJhY3Rpb24gICAgLyogKG8pIDogRnJhY3Rpb25hbCBwYXJ0IG9mIExvZzIuIChyYW5nZTogMDw9dmFsPDEpICovDQorCSAgKQ0KK3sNCisJV29yZDE2IGV4cDsNCisNCisJZXhwID0gbm9ybV9sKExfeCk7DQorCUxvZzJfbm9ybSAoKExfeCA8PCBleHApLCBleHAsIGV4cG9uZW50LCBmcmFjdGlvbik7DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbHBfZGVjMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9scF9kZWMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNzQ2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbHBfZGVjMi5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBscF9kZWMyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKglEZXNjcmlwdGlvbjpEZWNpbWF0ZSBhIHZlY3RvciBieSAyIHdpdGggMm5kIG9yZGVyIGZpciBmaWx0ZXIgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCisjZGVmaW5lIExfRklSICA1DQorI2RlZmluZSBMX01FTSAgKExfRklSLTIpDQorDQorLyogc3RhdGljIGZsb2F0IGhfZmlyW0xfRklSXSA9IHswLjEzLCAwLjIzLCAwLjI4LCAwLjIzLCAwLjEzfTsgKi8NCisvKiBmaXhlZC1wb2ludDogc3VtIG9mIGNvZWYgPSAzMjc2NyB0byBhdm9pZCBvdmVyZmxvdyBvbiBEQyAqLw0KK3N0YXRpYyBXb3JkMTYgaF9maXJbTF9GSVJdID0gezQyNjAsIDc1MzYsIDkxNzUsIDc1MzYsIDQyNjB9Ow0KKw0KK3ZvaWQgTFBfRGVjaW0yKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IHNpZ25hbCB0byBwcm9jZXNzICAgICAgICAgKi8NCisJCVdvcmQxNiBsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5IChzaXplPTMpICAgICAgICAgICAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMTYgKnBfeCwgeF9idWZbTF9GUkFNRSArIExfTUVNXTsNCisJV29yZDMyIGksIGo7DQorCVdvcmQzMiBMX3RtcDsNCisJLyogY29weSBpbml0aWFsIGZpbHRlciBzdGF0ZXMgaW50byBidWZmZXIgKi8NCisJcF94ID0geF9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBMX01FTTsgaSsrKQ0KKwl7DQorCQkqcF94KysgPSBtZW1baV07ICANCisJCW1lbVtpXSA9IHhbbCAtIExfTUVNICsgaV07ICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQ0KKwl7DQorCQkqcF94KysgPSB4W2ldOyAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSAyLCBqKyspDQorCXsNCisJCXBfeCA9ICZ4X2J1ZltpXTsgIA0KKwkJTF90bXAgID0gKCgqcF94KyspICogaF9maXJbMF0pOw0KKwkJTF90bXAgKz0gKCgqcF94KyspICogaF9maXJbMV0pOw0KKwkJTF90bXAgKz0gKCgqcF94KyspICogaF9maXJbMl0pOw0KKwkJTF90bXAgKz0gKCgqcF94KyspICogaF9maXJbM10pOw0KKwkJTF90bXAgKz0gKCgqcF94KyspICogaF9maXJbNF0pOw0KKwkJeFtqXSA9IChMX3RtcCArIDB4NDAwMCk+PjE1OyAgICAgICAgICAgICAgDQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21hdGhfb3AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWF0aF9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21hdGhfb3AuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hdGhlbWF0aWMgb3BlcmF0aW9ucyBpbiBmaXhlZCBwb2ludC4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgIElzcXJ0KCkgICAgICAgICAgICAgIDogaW52ZXJzZSBzcXVhcmUgcm9vdCAoMTYgYml0cyBwcmVjaXNpb24pLiAgICAgICAgICB8DQorfCAgUG93MigpICAgICAgICAgICAgICAgOiAyXnggICgxNiBiaXRzIHByZWNpc2lvbikuICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICBMb2cyKCkgICAgICAgICAgICAgICA6IGxvZzIgKDE2IGJpdHMgcHJlY2lzaW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgIERvdF9wcm9kdWN0KCkgICAgICAgIDogc2NhbGFyIHByb2R1Y3Qgb2YgPHhbXSx5W10+ICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICBUaGVzZSBvcGVyYXRpb25zIGFyZSBub3Qgc3RhbmRhcmQgZG91YmxlIHByZWNpc2lvbiBvcGVyYXRpb25zLiAgICAgICAgICAgfA0KK3wgIFRoZXkgYXJlIHVzZWQgd2hlcmUgbG93IGNvbXBsZXhpdHkgaXMgaW1wb3J0YW50IGFuZCB0aGUgZnVsbCAzMiBiaXRzICAgICB8DQorfCAgcHJlY2lzaW9uIGlzIG5vdCBuZWNlc3NhcnkuIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gRGl2XzMyKCkgaGFzIGEgICAgIHwNCit8ICAyNCBiaXRzIHByZWNpc2lvbiB3aGljaCBpcyBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgSW4gdGhpcyBmaWxlLCB0aGUgdmFsdWVzIHVzZSB0aGVzZXMgcmVwcmVzZW50YXRpb25zOiAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgIFdvcmQzMiBMXzMyICAgICA6IHN0YW5kYXJkIHNpZ25lZCAzMiBiaXRzIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgV29yZDE2IGhpLCBsbyAgIDogTF8zMiA9IGhpPDwxNiArIGxvPDwxICAoRFBGIC0gRG91YmxlIFByZWNpc2lvbiBGb3JtYXQpIHwNCit8ICBXb3JkMzIgZnJhYywgV29yZDE2IGV4cCA6IExfMzIgPSBmcmFjIDw8IGV4cC0zMSAgKG5vcm1hbGlzZWQgZm9ybWF0KSAgICAgfA0KK3wgIFdvcmQxNiBpbnQsIGZyYWMgICAgICAgIDogTF8zMiA9IGludC5mcmFjICAgICAgICAoZnJhY3Rpb25hbCBmb3JtYXQpICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBJc3FydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgQ29tcHV0ZSAxL3NxcnQoTF94KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBpZiBMX3ggaXMgbmVnYXRpdmUgb3IgemVybywgcmVzdWx0IGlzIDEgKDdmZmZmZmZmKS4gICAgICAgICAgICAgICAgIHwNCit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMS0gTm9ybWFsaXphdGlvbiBvZiBMX3guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAyLSBjYWxsIElzcXJ0X24oTF94LCBleHBvbmFudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDMtIExfeSA9IExfeCA8PCBleHBvbmFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorV29yZDMyIElzcXJ0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMzEgOiBvdXRwdXQgdmFsdWUgKHJhbmdlOiAwPD12YWw8MSkgICAgICAgICAqLw0KKwkJV29yZDMyIExfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogaW5wdXQgdmFsdWUgIChyYW5nZTogMDw9dmFsPD03ZmZmZmZmZikgKi8NCisJICAgICkNCit7DQorCVdvcmQxNiBleHA7DQorCVdvcmQzMiBMX3k7DQorCWV4cCA9IG5vcm1fbChMX3gpOw0KKwlMX3ggPSAoTF94IDw8IGV4cCk7ICAgICAgICAgICAgICAgICAvKiBMX3ggaXMgbm9ybWFsaXplZCAqLw0KKwlleHAgPSAoMzEgLSBleHApOw0KKwlJc3FydF9uKCZMX3gsICZleHApOw0KKwlMX3kgPSAoTF94IDw8IGV4cCk7ICAgICAgICAgICAgICAgICAvKiBkZW5vcm1hbGl6YXRpb24gICAqLw0KKwlyZXR1cm4gKExfeSk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IElzcXJ0X24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBDb21wdXRlIDEvc3FydCh2YWx1ZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgIGlmIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIHplcm8sIHJlc3VsdCBpcyAxIChmcmFjPTdmZmZmZmZmLCBleHA9MCkuICAgfA0KK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQorfCAgQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBUaGUgZnVuY3Rpb24gMS9zcXJ0KHZhbHVlKSBpcyBhcHByb3hpbWF0ZWQgYnkgYSB0YWJsZSBhbmQgbGluZWFyICAgICAgICB8DQorfCAgIGludGVycG9sYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAxLSBJZiBleHBvbmFudCBpcyBvZGQgdGhlbiBzaGlmdCBmcmFjdGlvbiByaWdodCBvbmNlLiAgICAgICAgICAgICAgICAgICB8DQorfCAgIDItIGV4cG9uYW50ID0gLSgoZXhwb25hbnQtMSk+PjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMy0gaSA9IGJpdDI1LWIzMCBvZiBmcmFjdGlvbiwgMTYgPD0gaSA8PSA2MyAtPmJlY2F1c2Ugb2Ygbm9ybWFsaXphdGlvbi4gfA0KK3wgICA0LSBhID0gYml0MTAtYjI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDUtIGkgLT0xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgNi0gZnJhY3Rpb24gPSB0YWJsZVtpXTw8MTYgLSAodGFibGVbaV0gLSB0YWJsZVtpKzFdKSAqIGEgKiAyICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCitzdGF0aWMgV29yZDE2IHRhYmxlX2lzcXJ0WzQ5XSA9DQorew0KKwkzMjc2NywgMzE3OTAsIDMwODk0LCAzMDA3MCwgMjkzMDksIDI4NjAyLCAyNzk0NSwgMjczMzAsIDI2NzU1LCAyNjIxNCwNCisJMjU3MDUsIDI1MjI1LCAyNDc3MCwgMjQzMzksIDIzOTMwLCAyMzU0MSwgMjMxNzAsIDIyODE3LCAyMjQ3OSwgMjIxNTUsDQorCTIxODQ1LCAyMTU0OCwgMjEyNjMsIDIwOTg4LCAyMDcyNCwgMjA0NzAsIDIwMjI1LCAxOTk4OCwgMTk3NjAsIDE5NTM5LA0KKwkxOTMyNiwgMTkxMTksIDE4OTE5LCAxODcyNSwgMTg1MzYsIDE4MzU0LCAxODE3NiwgMTgwMDQsIDE3ODM3LCAxNzY3NCwNCisJMTc1MTUsIDE3MzYxLCAxNzIxMSwgMTcwNjQsIDE2OTIxLCAxNjc4MiwgMTY2NDYsIDE2NTE0LCAxNjM4NA0KK307DQorDQordm9pZCBJc3FydF9uKA0KKwkJV29yZDMyICogZnJhYywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBRMzE6IG5vcm1hbGl6ZWQgdmFsdWUgKDEuMCA8IGZyYWMgPD0gMC41KSAqLw0KKwkJV29yZDE2ICogZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgICA6IGV4cG9uZW50ICh2YWx1ZSA9IGZyYWMgeCAyXmV4cG9uZW50KSAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDE2IGksIGEsIHRtcDsNCisNCisJaWYgKCpmcmFjIDw9IChXb3JkMzIpIDApDQorCXsNCisJCSpleHAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkqZnJhYyA9IDB4N2ZmZmZmZmZMOyAgICAgICAgICAgICAgIA0KKwkJcmV0dXJuOw0KKwl9DQorDQorCWlmKCgqZXhwICYgMSkgPT0gMSkgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgZXhwb25hbnQgb2RkIC0+IHNoaWZ0IHJpZ2h0ICovDQorCQkqZnJhYyA9ICgqZnJhYykgPj4gMTsNCisNCisJKmV4cCA9IG5lZ2F0ZSgoKmV4cCAtIDEpID4+IDEpOyAgIA0KKw0KKwkqZnJhYyA9ICgqZnJhYyA+PiA5KTsgICAgICAgICAgICAgICANCisJaSA9IGV4dHJhY3RfaCgqZnJhYyk7ICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBiMjUtYjMxICovDQorCSpmcmFjID0gKCpmcmFjID4+IDEpOyAgICAgICAgICAgICAgDQorCWEgPSAoV29yZDE2KSgqZnJhYyk7ICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBiMTAtYjI0ICovDQorCWEgPSAoV29yZDE2KSAoYSAmIChXb3JkMTYpIDB4N2ZmZik7ICAgIA0KKwlpIC09IDE2Ow0KKwkqZnJhYyA9IExfZGVwb3NpdF9oKHRhYmxlX2lzcXJ0W2ldKTsgICAvKiB0YWJsZVtpXSA8PCAxNiAgICAgICAgICovDQorCXRtcCA9IHZvX3N1Yih0YWJsZV9pc3FydFtpXSwgdGFibGVfaXNxcnRbaSArIDFdKTsgICAgICAvKiB0YWJsZVtpXSAtIHRhYmxlW2krMV0pICovDQorCSpmcmFjID0gdm9fTF9tc3UoKmZyYWMsIHRtcCwgYSk7ICAgICAgICAgIC8qIGZyYWMgLT0gIHRtcCphKjIgICAgICAgKi8NCisNCisJcmV0dXJuOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBQb3cyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgIExfeCA9IHBvdygyLjAsIGV4cG9uYW50LmZyYWN0aW9uKSAgICAgICAgIChleHBvbmFudCA9IGludGVyZ2VyIHBhcnQpICB8DQorfCAgICAgICAgID0gcG93KDIuMCwgMC5mcmFjdGlvbikgPDwgZXhwb25hbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgVGhlIGZ1bmN0aW9uIFBvdzIoTF94KSBpcyBhcHByb3hpbWF0ZWQgYnkgYSB0YWJsZSBhbmQgbGluZWFyICAgICAgICAgICAgfA0KK3wgICBpbnRlcnBvbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMS0gaSA9IGJpdDEwLWIxNSBvZiBmcmFjdGlvbiwgICAwIDw9IGkgPD0gMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAyLSBhID0gYml0MC1iOSAgIG9mIGZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDMtIExfeCA9IHRhYmxlW2ldPDwxNiAtICh0YWJsZVtpXSAtIHRhYmxlW2krMV0pICogYSAqIDIgICAgICAgICAgICAgICAgIHwNCit8ICAgNC0gTF94ID0gTF94ID4+ICgzMC1leHBvbmFudCkgICAgICh3aXRoIHJvdW5kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCitzdGF0aWMgV29yZDE2IHRhYmxlX3BvdzJbMzNdID0NCit7DQorCTE2Mzg0LCAxNjc0MywgMTcxMDksIDE3NDg0LCAxNzg2NywgMTgyNTgsIDE4NjU4LCAxOTA2NiwgMTk0ODQsIDE5OTExLA0KKwkyMDM0NywgMjA3OTIsIDIxMjQ3LCAyMTcxMywgMjIxODgsIDIyNjc0LCAyMzE3MCwgMjM2NzgsIDI0MTk2LCAyNDcyNiwNCisJMjUyNjgsIDI1ODIxLCAyNjM4NiwgMjY5NjQsIDI3NTU0LCAyODE1OCwgMjg3NzQsIDI5NDA1LCAzMDA0OCwgMzA3MDYsDQorCTMxMzc5LCAzMjA2NiwgMzI3NjcNCit9Ow0KKw0KK1dvcmQzMiBQb3cyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTAgIDogcmVzdWx0ICAgICAgIChyYW5nZTogMDw9dmFsPD0weDdmZmZmZmZmKSAqLw0KKwkJV29yZDE2IGV4cG9uYW50LCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogSW50ZWdlciBwYXJ0LiAgICAgIChyYW5nZTogMDw9dmFsPD0zMCkgICAqLw0KKwkJV29yZDE2IGZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogRnJhY3Rpb25uYWwgcGFydC4gIChyYW5nZTogMC4wPD12YWw8MS4wKSAqLw0KKwkgICApDQorew0KKwlXb3JkMTYgZXhwLCBpLCBhLCB0bXA7DQorCVdvcmQzMiBMX3g7DQorDQorCUxfeCA9IHZvX0xfbXVsdChmcmFjdGlvbiwgMzIpOyAgICAgICAgICAgIC8qIExfeCA9IGZyYWN0aW9uPDw2ICAgICAgICAgICAqLw0KKwlpID0gZXh0cmFjdF9oKExfeCk7ICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIxMC1iMTYgb2YgZnJhY3Rpb24gKi8NCisJTF94ID1MX3ggPj4gMTsNCisJYSA9IChXb3JkMTYpKExfeCk7ICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIwLWI5ICAgb2YgZnJhY3Rpb24gKi8NCisJYSA9IChXb3JkMTYpIChhICYgKFdvcmQxNikgMHg3ZmZmKTsgDQorDQorCUxfeCA9IExfZGVwb3NpdF9oKHRhYmxlX3BvdzJbaV0pOyAgICAgIC8qIHRhYmxlW2ldIDw8IDE2ICAgICAgICAqLw0KKwl0bXAgPSB2b19zdWIodGFibGVfcG93MltpXSwgdGFibGVfcG93MltpICsgMV0pOyAgICAgICAgLyogdGFibGVbaV0gLSB0YWJsZVtpKzFdICovDQorCUxfeCAtPSAodG1wICogYSk8PDE7ICAgICAgICAgICAgICAvKiBMX3ggLT0gdG1wKmEqMiAgICAgICAgKi8NCisNCisJZXhwID0gdm9fc3ViKDMwLCBleHBvbmFudCk7DQorCUxfeCA9IHZvX0xfc2hyX3IoTF94LCBleHApOw0KKw0KKwlyZXR1cm4gKExfeCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IERvdF9wcm9kdWN0MTIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBDb21wdXRlIHNjYWxhciBwcm9kdWN0IG9mIDx4W10seVtdPiB1c2luZyBhY2N1bXVsYXRvci4gICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgVGhlIHJlc3VsdCBpcyBub3JtYWxpemVkIChpbiBRMzEpIHdpdGggZXhwb25lbnQgKDAuLjMwKS4gICAgICAgICAgICB8DQorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCit8ICBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBkb3RfcHJvZHVjdCA9IHN1bSh4W2ldKnlbaV0pICAgICBpPTAuLk4tMSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorV29yZDMyIERvdF9wcm9kdWN0MTIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMzE6IG5vcm1hbGl6ZWQgcmVzdWx0ICgxIDwgdmFsIDw9IC0xKSAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB4IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IHZlY3RvciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiBleHBvbmVudCBvZiByZXN1bHQgKDAuLiszMCkgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiBzZnQ7DQorCVdvcmQzMiBpLCBMX3N1bTsNCisJTF9zdW0gPSAwOw0KKwlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykNCisJew0KKwkJTF9zdW0gKz0geFtpXSAqIHlbaV07DQorCX0NCisJTF9zdW0gPSAoTF9zdW0gPDwgMSkgKyAxOw0KKwkvKiBOb3JtYWxpemUgYWNjIGluIFEzMSAqLw0KKwlzZnQgPSBub3JtX2woTF9zdW0pOw0KKwlMX3N1bSA9IExfc3VtIDw8IHNmdDsNCisJKmV4cCA9IDMwIC0gc2Z0OyAgICAgICAgICAgIC8qIGV4cG9uZW50ID0gMC4uMzAgKi8NCisJcmV0dXJuIChMX3N1bSk7DQorDQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWVtX2FsaWduLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODkxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlGaWxlOgkJbWVtX2FsaWduLmMKKworCUNvbnRlbnQ6CU1lbW9yeSBhbGxvYyBhbGlnbm1lbnRzIGZ1bmN0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlCSJtZW1fYWxpZ24uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IG1lbV9tYWxsb2MKKyogZGVzY3JpcHRpb246ICBtYWxsb2MgdGhlIGFsaWdubWVudHMgbWVtb3J5IAorKiByZXR1cm5zOiAgICAgIHRoZSBwb2ludCBvZiB0aGUgbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqCittZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqbWVtX3B0cjsKKwlWT19NRU1fSU5GTyBNZW1JbmZvOworCisJaWYgKCFhbGlnbm1lbnQpIHsKKworCQlNZW1JbmZvLkZsYWcgPSAwOworCQlNZW1JbmZvLlNpemUgPSBzaXplICsgMTsKKwkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7CisJCWlmKHJldCAhPSAwKQorCQkJcmV0dXJuIDA7CisJCW1lbV9wdHIgPSAodW5zaWduZWQgY2hhciAqKU1lbUluZm8uVkJ1ZmZlcjsKKworCQlwTWVtb3AtPlNldChDb2RlY0lELCBtZW1fcHRyLCAwLCBzaXplICsgMSk7CisKKwkJKm1lbV9wdHIgPSAodW5zaWduZWQgY2hhcikxOworCisJCXJldHVybiAoKHZvaWQgKikobWVtX3B0cisxKSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciAqdG1wOworCisJCU1lbUluZm8uRmxhZyA9IDA7CisJCU1lbUluZm8uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnQ7CisJCXJldCA9IHBNZW1vcC0+QWxsb2MoQ29kZWNJRCwgJk1lbUluZm8pOworCQlpZihyZXQgIT0gMCkKKwkJCXJldHVybiAwOworCisJCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOworCisJCXBNZW1vcC0+U2V0KENvZGVjSUQsIHRtcCwgMCwgc2l6ZSArIGFsaWdubWVudCk7CisKKwkJbWVtX3B0ciA9CisJCQkodW5zaWduZWQgY2hhciAqKSAoKHVuc2lnbmVkIGludCkgKHRtcCArIGFsaWdubWVudCAtIDEpICYKKwkJCQkJKH4oKHVuc2lnbmVkIGludCkgKGFsaWdubWVudCAtIDEpKSkpOworCisJCWlmIChtZW1fcHRyID09IHRtcCkKKwkJCW1lbV9wdHIgKz0gYWxpZ25tZW50OworCisJCSoobWVtX3B0ciAtIDEpID0gKHVuc2lnbmVkIGNoYXIpIChtZW1fcHRyIC0gdG1wKTsKKworCQlyZXR1cm4gKCh2b2lkICopbWVtX3B0cik7CisJfQorCisJcmV0dXJuKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBtZW1fZnJlZQorKiBkZXNjcmlwdGlvbjogIGZyZWUgdGhlIG1lbW9yeQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK21lbV9mcmVlKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB2b2lkICptZW1fcHRyLCB1bnNpZ25lZCBpbnQgQ29kZWNJRCkKK3sKKworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmIChtZW1fcHRyID09IDApCisJCXJldHVybjsKKworCXB0ciA9IG1lbV9wdHI7CisKKwlwdHIgLT0gKihwdHIgLSAxKTsKKworCXBNZW1vcC0+RnJlZShDb2RlY0lELCBwdHIpOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9vcGVyXzMyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTUyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL29wZXJfMzJiLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogIFRoaXMgZmlsZSBjb250YWlucyBvcGVyYXRpb25zIGluIGRvdWJsZSBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIFRoZXNlIG9wZXJhdGlvbnMgYXJlIG5vdCBzdGFuZGFyZCBkb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMuICAgICAgICAgICAqDQorICogIFRoZXkgYXJlIHVzZWQgd2hlcmUgc2luZ2xlIHByZWNpc2lvbiBpcyBub3QgZW5vdWdoIGJ1dCB0aGUgZnVsbCAzMiBiaXRzICAqDQorICogIHByZWNpc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIERpdl8zMigpIGhhcyBhICAgICAqDQorICogIDI0IGJpdHMgcHJlY2lzaW9uIHdoaWNoIGlzIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIFRoZSBkb3VibGUgcHJlY2lzaW9uIG51bWJlcnMgdXNlIGEgc3BlY2lhbCByZXByZXNlbnRhdGlvbjogICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIExfMzIgPSBoaTw8MTYgKyBsbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIExfMzIgaXMgYSAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGhpIGFuZCBsbyBhcmUgMTYgYml0IHNpZ25lZCBpbnRlZ2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIEFzIHRoZSBsb3cgcGFydCBhbHNvIGNvbnRhaW5zIHRoZSBzaWduLCB0aGlzIGFsbG93cyBmYXN0IG11bHRpcGxpY2F0aW9uLiAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAweDgwMDAgMDAwMCA8PSBMXzMyIDw9IDB4N2ZmZiBmZmZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIFdlIHdpbGwgdXNlIERQRiAoRG91YmxlIFByZWNpc2lvbiBGb3JtYXQgKWluIHRoaXMgZmlsZSB0byBzcGVjaWZ5ICAgICAgICAqDQorICogIHRoaXMgc3BlY2lhbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBGdW5jdGlvbiBMX0V4dHJhY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBFeHRyYWN0IGZyb20gYSAzMiBiaXQgaW50ZWdlciB0d28gMTYgYml0IERQRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgTF8zMiAgICAgIDogMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgMHg4MDAwIDAwMDAgPD0gTF8zMiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaGkgICAgICAgIDogYjE2IHRvIGIzMSBvZiBMXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgbG8gICAgICAgIDogKExfMzIgLSBoaTw8MTYpPj4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorDQorX19pbmxpbmUgdm9pZCBWT19MX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKQ0KK3sNCisJKmhpID0gKFdvcmQxNikoTF8zMiA+PiAxNik7DQorCSpsbyA9IChXb3JkMTYpKChMXzMyICYgMHhmZmZmKSA+PiAxKTsNCisJcmV0dXJuOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgRnVuY3Rpb24gTF9Db21wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgQ29tcG9zZSBmcm9tIHR3byAxNiBiaXQgRFBGIGEgMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgTF8zMiA9IGhpPDwxNiArIGxvPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGhpICAgICAgICBtc2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGxvICAgICAgICBsc2YgKHdpdGggc2lnbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoNCisgKiAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZjAuICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKw0KK1dvcmQzMiBMX0NvbXAgKFdvcmQxNiBoaSwgV29yZDE2IGxvKQ0KK3sNCisJV29yZDMyIExfMzI7DQorDQorCUxfMzIgPSBMX2RlcG9zaXRfaCAoaGkpOw0KKw0KKwlyZXR1cm4gKExfbWFjIChMXzMyLCBsbywgMSkpOyAgICAgICAvKiA9IGhpPDwxNiArIGxvPDwxICovDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEZ1bmN0aW9uIE1weV8zMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgTXVsdGlwbHkgdHdvIDMyIGJpdCBpbnRlZ2VycyAoRFBGKS4gVGhlIHJlc3VsdCBpcyBkaXZpZGVkIGJ5IDIqKjMxICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgTF8zMiA9IChoaTEqaGkyKTw8MSArICggKGhpMSpsbzIpPj4xNSArIChsbzEqaGkyKT4+MTUgKTw8MSAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgVGhpcyBvcGVyYXRpb24gY2FuIGFsc28gYmUgdmlld2VkIGFzIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0d28gUTMxICAgICAgKg0KKyAqICAgbnVtYmVyIGFuZCB0aGUgcmVzdWx0IGlzIGFsc28gaW4gUTMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBoaTEgICAgICAgICBoaSBwYXJ0IG9mIGZpcnN0IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBsbzEgICAgICAgICBsbyBwYXJ0IG9mIGZpcnN0IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBoaTIgICAgICAgICBoaSBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBsbzIgICAgICAgICBsbyBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorDQorX19pbmxpbmUgV29yZDMyICBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpDQorew0KKwlXb3JkMzIgTF8zMjsNCisJTF8zMiA9IChoaTEgKiBoaTIpOw0KKwlMXzMyICs9IChoaTEgKiBsbzIpID4+IDE1Ow0KKwlMXzMyICs9IChsbzEgKiBoaTIpID4+IDE1Ow0KKwlMXzMyIDw8PSAxOw0KKw0KKwlyZXR1cm4gKExfMzIpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBGdW5jdGlvbiBNcHlfMzJfMTYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIE11bHRpcGx5IGEgMTYgYml0IGludGVnZXIgYnkgYSAzMiBiaXQgKERQRikuIFRoZSByZXN1bHQgaXMgZGl2aWRlZCAgICAgICoNCisgKiAgIGJ5IDIqKjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIExfMzIgPSAoaGkxKmxvMik8PDEgKyAoKGxvMSpsbzIpPj4xNSk8PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgaGkgICAgICAgICAgaGkgcGFydCBvZiAzMiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgbG8gICAgICAgICAgbG8gcGFydCBvZiAzMiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgbiAgICAgICAgICAgMTYgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKw0KK19faW5saW5lIFdvcmQzMiBNcHlfMzJfMTYgKFdvcmQxNiBoaSwgV29yZDE2IGxvLCBXb3JkMTYgbikNCit7DQorCVdvcmQzMiBMXzMyOw0KKw0KKwlMXzMyID0gKGhpICogbik8PDE7DQorCUxfMzIgKz0gKCgobG8gKiBuKT4+MTUpPDwxKTsNCisNCisJcmV0dXJuIChMXzMyKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBGdW5jdGlvbiBOYW1lIDogRGl2XzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgRnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHR3byAzMiBiaXQgbnVtYmVycy4gICAgICAgICAgICAqDQorICogICAgICAgICAgICAgTF9udW0gLyBMX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgTF9udW0gYW5kIExfZGVub20gbXVzdCBiZSBwb3NpdGl2ZSBhbmQgTF9udW0gPCBMX2Rlbm9tLiAgICAgICAqDQorICogICAgICAgICAgICAgTF9kZW5vbSA9IGRlbm9tX2hpPDwxNiArIGRlbm9tX2xvPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgZGVub21faGkgaXMgYSBub3JtYWxpemUgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgTF9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqDQorICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8IExfbnVtIDwgTF9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgTF9kZW5vbSA9IGRlbm9tX2hpPDwxNiArIGRlbm9tX2xvPDwxICAgICAgKERQRikgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgZGVub21faGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgMTYgYml0IHBvc2l0aXZlIG5vcm1hbGl6ZWQgaW50ZWdlciB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICAqDQorICogICAgICAgICAgICAgcmFuZ2UgOiAweDQwMDAgPCBoaSA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgZGVub21fbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgMTYgYml0IHBvc2l0aXZlIGludGVnZXIgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgcmFuZ2UgOiAwIDwgbG8gPCAweDdmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgTF9kaXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqDQorICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSBMX2RpdiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIC0gZmluZCA9IDEvTF9kZW5vbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICBGaXJzdCBhcHByb3hpbWF0aW9uOiBhcHByb3ggPSAxIC8gZGVub21faGkgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCApICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIC0gIHJlc3VsdCA9IExfbnVtICogKDEvTF9kZW5vbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisNCitXb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQxNiBkZW5vbV9oaSwgV29yZDE2IGRlbm9tX2xvKQ0KK3sNCisJV29yZDE2IGFwcHJveCwgaGksIGxvLCBuX2hpLCBuX2xvOw0KKwlXb3JkMzIgTF8zMjsNCisNCisJLyogRmlyc3QgYXBwcm94aW1hdGlvbjogMSAvIExfZGVub20gPSAxL2Rlbm9tX2hpICovDQorDQorCWFwcHJveCA9IGRpdl9zICgoV29yZDE2KSAweDNmZmYsIGRlbm9tX2hpKTsNCisNCisJLyogMS9MX2Rlbm9tID0gYXBwcm94ICogKDIuMCAtIExfZGVub20gKiBhcHByb3gpICovDQorDQorCUxfMzIgPSBNcHlfMzJfMTYgKGRlbm9tX2hpLCBkZW5vbV9sbywgYXBwcm94KTsNCisNCisJTF8zMiA9IExfc3ViICgoV29yZDMyKSAweDdmZmZmZmZmTCwgTF8zMik7DQorCWhpID0gTF8zMiA+PiAxNjsNCisJbG8gPSAoTF8zMiAmIDB4ZmZmZikgPj4gMTsNCisNCisJTF8zMiA9IE1weV8zMl8xNiAoaGksIGxvLCBhcHByb3gpOw0KKw0KKwkvKiBMX251bSAqICgxL0xfZGVub20pICovDQorCWhpID0gTF8zMiA+PiAxNjsNCisJbG8gPSAoTF8zMiAmIDB4ZmZmZikgPj4gMTsNCisJVk9fTF9FeHRyYWN0IChMX251bSwgJm5faGksICZuX2xvKTsNCisJTF8zMiA9IE1weV8zMiAobl9oaSwgbl9sbywgaGksIGxvKTsNCisJTF8zMiA9IExfc2hsMihMXzMyLCAyKTsNCisNCisJcmV0dXJuIChMXzMyKTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wX21lZF9vbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wX21lZF9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWU5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHBfbWVkX29sLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBDb21wdXRlIHRoZSBvcGVuIGxvb3AgcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAqDQorKgkgICAgICAgICAgICBvdXRwdXQ6IG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgInBfbWVkX29sLnRhYiINCisNCitXb3JkMTYgUGl0Y2hfbWVkX29sKA0KKwkJICAgV29yZDE2ICAgICAgd3NwW10sICAgICAgICAvKiAgIGk6IHNpZ25hbCB1c2VkIHRvIGNvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCovICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICB3c3BbLXBpdF9tYXhdIHRvIHdzcFstMV0gc2hvdWxkIGJlIGtub3duICovDQorCQkgICBDb2Rlcl9TdGF0ZSAqc3QsICAgICAgICAgIC8qIGkvbzogY29kZWMgZ2xvYmFsIHN0cnVjdHVyZSAqLw0KKwkJICAgV29yZDE2ICAgICAgTF9mcmFtZSAgICAgICAvKiAgIGk6IGxlbmd0aCBvZiBmcmFtZSB0byBjb21wdXRlIHBpdGNoICovDQorCQkpDQorew0KKwlXb3JkMTYgVG07DQorCVdvcmQxNiBoaSwgbG87DQorCVdvcmQxNiAqd3csICp3ZSwgKmhwX3dzcDsNCisJV29yZDE2IGV4cF9SMCwgZXhwX1IxLCBleHBfUjI7DQorCVdvcmQzMiBpLCBqLCBtYXgsIFIwLCBSMSwgUjI7DQorCVdvcmQxNiAqcDEsICpwMjsNCisJV29yZDE2IExfbWluID0gMTc7ICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gcGl0Y2ggbGFnOiBQSVRfTUlOIC8gT1BMX0RFQ0lNICovDQorCVdvcmQxNiBMX21heCA9IDExNTsgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHBpdGNoIGxhZzogUElUX01BWCAvIE9QTF9ERUNJTSAqLw0KKwlXb3JkMTYgTF8wID0gc3QtPm9sZF9UMF9tZWQ7ICAgICAgICAgLyogb2xkIG9wZW4tbG9vcCBwaXRjaCAqLw0KKwlXb3JkMTYgKmdhaW4gPSAmKHN0LT5vbF9nYWluKTsgICAgICAgLyogbm9ybWFsaXplIGNvcnJlbGF0aW9uIG9mIGhwX3dzcCBmb3IgdGhlIGxhZyAqLw0KKwlXb3JkMTYgKmhwX3dzcF9tZW0gPSBzdC0+aHBfd3NwX21lbTsgLyogbWVtb3J5IG9mIHRoZSBoeXBhc3MgZmlsdGVyIGZvciBocF93c3BbXSAobGcgPSA5KSovDQorCVdvcmQxNiAqb2xkX2hwX3dzcCA9IHN0LT5vbGRfaHBfd3NwOyAvKiBoeXBhc3Mgd3NwW10gKi8NCisJV29yZDE2IHdnaHRfZmxnID0gc3QtPm9sX3dnaHRfZmxnOyAgIC8qIGlzIHdlaWdodGluZyBmdW5jdGlvbiB1c2VkICovDQorDQorCXd3ID0gJmNvcnJ3ZWlnaHRbMTk4XTsNCisJd2UgPSAmY29ycndlaWdodFs5OCArIExfbWF4IC0gTF8wXTsNCisNCisJbWF4ID0gTUlOXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVRtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSBMX21heDsgaSA+IExfbWluOyBpLS0pDQorCXsNCisJCS8qIENvbXB1dGUgdGhlIGNvcnJlbGF0aW9uICovDQorCQlSMCA9IDA7DQorCQlwMSA9IHdzcDsNCisJCXAyID0gJndzcFstaV07DQorCQlmb3IgKGogPSAwOyBqIDwgTF9mcmFtZTsgais9NCkNCisJCXsNCisJCQlSMCArPSB2b19MX211bHQoKCpwMSsrKSwgKCpwMisrKSk7DQorCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOw0KKwkJCVIwICs9IHZvX0xfbXVsdCgoKnAxKyspLCAoKnAyKyspKTsNCisJCQlSMCArPSB2b19MX211bHQoKCpwMSsrKSwgKCpwMisrKSk7ICAgICANCisJCX0NCisJCS8qIFdlaWdodGluZyBvZiB0aGUgY29ycmVsYXRpb24gZnVuY3Rpb24uICAgKi8NCisJCWhpID0gUjA+PjE2Ow0KKwkJbG8gPSAoUjAgJiAweGZmZmYpPj4xOw0KKw0KKwkJUjAgPSBNcHlfMzJfMTYoaGksIGxvLCAqd3cpOw0KKwkJd3ctLTsNCisNCisJCWlmICgoTF8wID4gMCkgJiYgKHdnaHRfZmxnID4gMCkpDQorCQl7DQorCQkJLyogV2VpZ2h0IHRoZSBuZWlnaGJvdXJob29kIG9mIHRoZSBvbGQgbGFnLiAqLw0KKwkJCWhpID0gUjA+PjE2Ow0KKwkJCWxvID0gKFIwICYgMHhmZmZmKT4+MTsNCisJCQlSMCA9IE1weV8zMl8xNihoaSwgbG8sICp3ZSk7DQorCQkJd2UtLTsNCisJCX0NCisJCWlmKFIwID49IG1heCkNCisJCXsNCisJCQltYXggPSBSMDsNCisJCQlUbSA9IGk7DQorCQl9DQorCX0NCisNCisJLyogSHlwYXNzIHRoZSB3c3BbXSB2ZWN0b3IgKi8NCisJaHBfd3NwID0gb2xkX2hwX3dzcCArIExfbWF4OyAgICAgICAgICAgDQorCUhwX3dzcCh3c3AsIGhwX3dzcCwgTF9mcmFtZSwgaHBfd3NwX21lbSk7DQorDQorCS8qIENvbXB1dGUgbm9ybWFsaXplIGNvcnJlbGF0aW9uIGF0IGRlbGF5IFRtICovDQorCVIwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlSMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlSMiA9IDA7IA0KKwlwMSA9IGhwX3dzcDsNCisJcDIgPSBocF93c3AgLSBUbTsNCisJZm9yIChqID0gMDsgaiA8IExfZnJhbWU7IGorPTQpDQorCXsNCisJCVIyICs9IHZvX211bHQzMigqcDEsICpwMSk7DQorCQlSMSArPSB2b19tdWx0MzIoKnAyLCAqcDIpOw0KKwkJUjAgKz0gdm9fbXVsdDMyKCpwMSsrLCAqcDIrKyk7DQorCQlSMiArPSB2b19tdWx0MzIoKnAxLCAqcDEpOw0KKwkJUjEgKz0gdm9fbXVsdDMyKCpwMiwgKnAyKTsNCisJCVIwICs9IHZvX211bHQzMigqcDErKywgKnAyKyspOw0KKwkJUjIgKz0gdm9fbXVsdDMyKCpwMSwgKnAxKTsNCisJCVIxICs9IHZvX211bHQzMigqcDIsICpwMik7DQorCQlSMCArPSB2b19tdWx0MzIoKnAxKyssICpwMisrKTsNCisJCVIyICs9IHZvX211bHQzMigqcDEsICpwMSk7DQorCQlSMSArPSB2b19tdWx0MzIoKnAyLCAqcDIpOw0KKwkJUjAgKz0gdm9fbXVsdDMyKCpwMSsrLCAqcDIrKyk7DQorCX0NCisJUjAgPSBSMCA8PDE7DQorCVIxID0gKFIxIDw8MSkgKyAxTDsNCisJUjIgPSAoUjIgPDwxKSArIDFMOw0KKwkvKiBnYWluID0gUjAvIHNxcnQoUjEqUjIpICovDQorDQorCWV4cF9SMCA9IG5vcm1fbChSMCk7DQorCVIwID0gKFIwIDw8IGV4cF9SMCk7DQorDQorCWV4cF9SMSA9IG5vcm1fbChSMSk7DQorCVIxID0gKFIxIDw8IGV4cF9SMSk7DQorDQorCWV4cF9SMiA9IG5vcm1fbChSMik7DQorCVIyID0gKFIyIDw8IGV4cF9SMik7DQorDQorDQorCVIxID0gdm9fTF9tdWx0KHZvX3JvdW5kKFIxKSwgdm9fcm91bmQoUjIpKTsNCisNCisJaSA9IG5vcm1fbChSMSk7DQorCVIxID0gKFIxIDw8IGkpOw0KKw0KKwlleHBfUjEgKz0gZXhwX1IyOw0KKwlleHBfUjEgKz0gaTsNCisJZXhwX1IxID0gNjIgLSBleHBfUjE7DQorDQorCUlzcXJ0X24oJlIxLCAmZXhwX1IxKTsNCisNCisJUjAgPSB2b19MX211bHQodm9yb3VuZChSMCksIHZvcm91bmQoUjEpKTsNCisJZXhwX1IwID0gMzEgLSBleHBfUjA7DQorCWV4cF9SMCArPSBleHBfUjE7DQorDQorCSpnYWluID0gdm9fcm91bmQoTF9zaGwoUjAsIGV4cF9SMCkpOw0KKw0KKwkvKiBTaGl0ZiBocF93c3BbXSBmb3IgbmV4dCBmcmFtZSAqLw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9tYXg7IGkrKykNCisJew0KKwkJb2xkX2hwX3dzcFtpXSA9IG9sZF9ocF93c3BbaSArIExfZnJhbWVdOw0KKwl9DQorDQorCXJldHVybiAoVG0pOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRnVuY3Rpb246IG1lZGlhbjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgUmV0dXJucyB0aGUgbWVkaWFuIG9mIHRoZSBzZXQge1hbLTJdLCBYWy0xXSwuLi4sIFhbMl19LCAgICAgICAgICAqDQorKiAgICAgIHdob3NlIGVsZW1lbnRzIGFyZSAxNi1iaXQgaW50ZWdlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBJbnB1dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIFhbLTI6Ml0gICAxNi1iaXQgaW50ZWdlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBSZXR1cm46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIFRoZSBtZWRpYW4gb2Yge1hbLTJdLCBYWy0xXSwuLi4sIFhbMl19LiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitXb3JkMTYgbWVkaWFuNShXb3JkMTYgeFtdKQ0KK3sNCisJV29yZDE2IHgxLCB4MiwgeDMsIHg0LCB4NTsNCisJV29yZDE2IHRtcDsNCisNCisJeDEgPSB4Wy0yXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXgyID0geFstMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl4MyA9IHhbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJeDQgPSB4WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXg1ID0geFsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlpZiAoeDIgPCB4MSkNCisJew0KKwkJdG1wID0geDE7DQorCQl4MSA9IHgyOw0KKwkJeDIgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDMgPCB4MSkNCisJew0KKwkJdG1wID0geDE7DQorCQl4MSA9IHgzOw0KKwkJeDMgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDQgPCB4MSkNCisJew0KKwkJdG1wID0geDE7DQorCQl4MSA9IHg0Ow0KKwkJeDQgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDUgPCB4MSkNCisJew0KKwkJeDUgPSB4MTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDMgPCB4MikNCisJew0KKwkJdG1wID0geDI7DQorCQl4MiA9IHgzOw0KKwkJeDMgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDQgPCB4MikNCisJew0KKwkJdG1wID0geDI7DQorCQl4MiA9IHg0Ow0KKwkJeDQgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDUgPCB4MikNCisJew0KKwkJeDUgPSB4MjsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDQgPCB4MykNCisJew0KKwkJeDMgPSB4NDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoeDUgPCB4MykNCisJew0KKwkJeDMgPSB4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlyZXR1cm4gKHgzKTsNCit9DQorDQorDQorV29yZDE2IE1lZF9vbGFnKCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCA6IG1lZGlhbiBvZiAgNSBwcmV2aW91cyBvcGVuLWxvb3AgbGFncyAgICAgICAqLw0KKwkJV29yZDE2IHByZXZfb2xfbGFnLCAgICAgICAgICAgICAgICAvKiBpbnB1dCAgOiBwcmV2aW91cyBvcGVuLWxvb3AgbGFnICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBvbGRfb2xfbGFnWzVdDQorCSAgICAgICApDQorew0KKwlXb3JkMzIgaTsNCisNCisJLyogVXNlIG1lZGlhbiBvZiA1IHByZXZpb3VzIG9wZW4tbG9vcCBsYWdzIGFzIG9sZCBsYWcgKi8NCisNCisJZm9yIChpID0gNDsgaSA+IDA7IGktLSkNCisJew0KKwkJb2xkX29sX2xhZ1tpXSA9IG9sZF9vbF9sYWdbaSAtIDFdOyANCisJfQ0KKw0KKwlvbGRfb2xfbGFnWzBdID0gcHJldl9vbF9sYWc7ICAgICAgICAgICANCisNCisJaSA9IG1lZGlhbjUoJm9sZF9vbF9sYWdbMl0pOw0KKw0KKwlyZXR1cm4gaTsNCisNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRfc2hycC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRfc2hycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTIyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdF9zaHJwLmMKQEAgLTAsMCArMSw0OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogcGl0X3NocnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246IFBlcmZvcm1zIFBpdGNoIHNoYXJwZW5pbmcgcm91dGluZSAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCit2b2lkIFBpdF9zaHJwKA0KKwkJV29yZDE2ICogeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IGltcHVsc2UgcmVzcG9uc2UgKG9yIGFsZ2VicmFpYyBjb2RlKSAqLw0KKwkJV29yZDE2IHBpdF9sYWcsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNoYXJwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBpdGNoIHNoYXJwZW5pbmcgZmFjdG9yIChRMTUpICAgICAgICAqLw0KKwkJV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHN1YmZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgTF90bXA7DQorCVdvcmQxNiAqeF9wdHIgPSB4ICsgcGl0X2xhZzsNCisNCisJZm9yIChpID0gcGl0X2xhZzsgaSA8IExfc3ViZnI7IGkrKykNCisJew0KKwkJTF90bXAgPSAoKnhfcHRyIDw8IDE1KTsNCisJCUxfdG1wICs9ICp4KysgKiBzaGFycDsNCisJCSp4X3B0cisrID0gKChMX3RtcCArIDB4NDAwMCk+PjE1KTsNCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE1YjExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCkBAIC0wLDAgKzEsMzI0IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBwaXRjaF9mNC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjogRmluZCB0aGUgY2xvc2VkIGxvb3AgcGl0Y2ggcGVyaW9kIHdpdGggICAgICAgICAgICAgKg0KKyoJICAgICAgICAgICAgMS80IHN1YnNhbXBsZSByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCisjZGVmaW5lIFVQX1NBTVAgICAgICA0DQorI2RlZmluZSBMX0lOVEVSUE9MMSAgNA0KKw0KKy8qIExvY2FsIGZ1bmN0aW9ucyAqLw0KKw0KKyNpZmRlZiBBU01fT1BUDQordm9pZCBOb3JtX2NvcnJfYXNtKA0KKwkJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaW1wdWxzZSByZXNwb25zZSBvZiBzeW50aC93Z3QgZmlsdGVycyAqLw0KKwkJV29yZDE2IExfc3ViZnIsDQorCQlXb3JkMTYgdF9taW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtaW5pbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgdF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtYXhpbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgY29ycl9ub3JtW10gICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAgICAgICAgICAgICAgICovDQorCQkpOw0KKyNlbHNlDQorc3RhdGljIHZvaWQgTm9ybV9Db3JyKA0KKwkJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaW1wdWxzZSByZXNwb25zZSBvZiBzeW50aC93Z3QgZmlsdGVycyAqLw0KKwkJV29yZDE2IExfc3ViZnIsDQorCQlXb3JkMTYgdF9taW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtaW5pbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgdF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtYXhpbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgY29ycl9ub3JtW10gICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAgICAgICAgICAgICAgICovDQorCQkpOw0KKyNlbmRpZg0KKw0KK3N0YXRpYyBXb3JkMTYgSW50ZXJwb2xfNCggICAgICAgICAgICAgICAgICAvKiAobykgIDogaW50ZXJwb2xhdGVkIHZhbHVlICAqLw0KKwkJV29yZDE2ICogeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgIDogaW5wdXQgdmVjdG9yICAgICAgICAqLw0KKwkJV29yZDMyIGZyYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgIDogZnJhY3Rpb24gKC00Li4rMykgICAqLw0KKwkJKTsNCisNCisNCitXb3JkMTYgUGl0Y2hfZnI0KCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IHBpdGNoIHBlcmlvZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4Y2l0YXRpb24gYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHRhcmdldCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygc3ludGgvd2d0IGZpbHRlcnMgKi8NCisJCVdvcmQxNiB0MF9taW4sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgaW4gdGhlIHNlYXJjaGVkIHJhbmdlLiAgKi8NCisJCVdvcmQxNiB0MF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1heGltdW0gdmFsdWUgaW4gdGhlIHNlYXJjaGVkIHJhbmdlLiAgKi8NCisJCVdvcmQxNiAqIHBpdF9mcmFjLCAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IGNob3NlbiBmcmFjdGlvbiAoMCwgMSwgMiBvciAzKS4gICAgICAgKi8NCisJCVdvcmQxNiBpX3N1YmZyLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGluZGljYXRvciBmb3IgZmlyc3Qgc3ViZnJhbWUuICAgICAgICAgKi8NCisJCVdvcmQxNiB0MF9mcjIsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgZm9yIHJlc29sdXRpb24gMS8yICAgICAgKi8NCisJCVdvcmQxNiB0MF9mcjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgZm9yIHJlc29sdXRpb24gMSAgICAgICAgKi8NCisJCVdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExlbmd0aCBvZiBzdWJmcmFtZSAgICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBmcmFjdGlvbiwgaTsNCisJV29yZDE2IHRfbWluLCB0X21heDsNCisJV29yZDE2IG1heCwgdDAsIHN0ZXAsIHRlbXA7DQorCVdvcmQxNiAqY29ycjsNCisJV29yZDE2IGNvcnJfdls0MF07ICAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgbGVuZ3RoID0gdDBfbWF4LXQwX21pbisxKzIqTF9pbnRlciAqLw0KKw0KKwkvKiBGaW5kIGludGVydmFsIHRvIGNvbXB1dGUgbm9ybWFsaXplZCBjb3JyZWxhdGlvbiAqLw0KKw0KKwl0X21pbiA9IHQwX21pbiAtIExfSU5URVJQT0wxOw0KKwl0X21heCA9IHQwX21heCArIExfSU5URVJQT0wxOw0KKwljb3JyID0gJmNvcnJfdlstdF9taW5dOw0KKwkvKiBDb21wdXRlIG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGZpbHRlcmVkIGV4Y2l0YXRpb24gKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorICAgIE5vcm1fY29ycl9hc20oZXhjLCB4biwgaCwgTF9zdWJmciwgdF9taW4sIHRfbWF4LCBjb3JyKTsNCisjZWxzZQ0KKwlOb3JtX0NvcnIoZXhjLCB4biwgaCwgTF9zdWJmciwgdF9taW4sIHRfbWF4LCBjb3JyKTsNCisjZW5kaWYgDQorDQorCS8qIEZpbmQgaW50ZWdlciBwaXRjaCAqLw0KKw0KKwltYXggPSBjb3JyW3QwX21pbl07DQorCXQwID0gdDBfbWluOw0KKwlmb3IgKGkgPSB0MF9taW4gKyAxOyBpIDw9IHQwX21heDsgaSsrKQ0KKwl7DQorCQlpZiAoY29ycltpXSA+PSBtYXgpDQorCQl7DQorCQkJbWF4ID0gY29ycltpXTsgICAgICAgICAgICAgICAgIA0KKwkJCXQwID0gaTsgICAgICAgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KKwkvKiBJZiBmaXJzdCBzdWJmcmFtZSBhbmQgdDAgPj0gdDBfZnIxLCBkbyBub3Qgc2VhcmNoIGZyYWN0aW9ubmFsIHBpdGNoICovDQorCWlmICgoaV9zdWJmciA9PSAwKSAmJiAodDAgPj0gdDBfZnIxKSkNCisJew0KKwkJKnBpdF9mcmFjID0gMDsNCisJCXJldHVybiAodDApOw0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBTZWFyY2ggZnJhY3Rpb25uYWwgcGl0Y2ggd2l0aCAxLzQgc3Vic2FtcGxlIHJlc29sdXRpb24uICAgICAgICAgICoNCisJICogVGVzdCB0aGUgZnJhY3Rpb25zIGFyb3VuZCB0MCBhbmQgY2hvb3NlIHRoZSBvbmUgd2hpY2ggbWF4aW1pemVzICAqDQorCSAqIHRoZSBpbnRlcnBvbGF0ZWQgbm9ybWFsaXplZCBjb3JyZWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCXN0ZXAgPSAxOyAgICAgICAgICAgICAgIC8qIDEvNCBzdWJzYW1wbGUgcmVzb2x1dGlvbiAqLw0KKwlmcmFjdGlvbiA9IC0zOw0KKwlpZiAoKHQwX2ZyMiA9PSBQSVRfTUlOKXx8KChpX3N1YmZyID09IDApICYmICh0MCA+PSB0MF9mcjIpKSkNCisJew0KKwkJc3RlcCA9IDI7ICAgICAgICAgICAgICAvKiAxLzIgc3Vic2FtcGxlIHJlc29sdXRpb24gKi8NCisJCWZyYWN0aW9uID0gLTI7DQorCX0NCisJaWYodDAgPT0gdDBfbWluKQ0KKwl7DQorCQlmcmFjdGlvbiA9IDA7DQorCX0NCisJbWF4ID0gSW50ZXJwb2xfNCgmY29yclt0MF0sIGZyYWN0aW9uKTsNCisNCisJZm9yIChpID0gZnJhY3Rpb24gKyBzdGVwOyBpIDw9IDM7IGkgKz0gc3RlcCkNCisJew0KKwkJdGVtcCA9IEludGVycG9sXzQoJmNvcnJbdDBdLCBpKTsNCisJCWlmKHRlbXAgPiBtYXgpDQorCQl7DQorCQkJbWF4ID0gdGVtcDsNCisJCQlmcmFjdGlvbiA9IGk7DQorCQl9DQorCX0NCisJLyogbGltaXQgdGhlIGZyYWN0aW9uIHZhbHVlIGluIHRoZSBpbnRlcnZhbCBbMCwxLDIsM10gKi8NCisJaWYgKGZyYWN0aW9uIDwgMCkNCisJew0KKwkJZnJhY3Rpb24gKz0gVVBfU0FNUDsNCisJCXQwIC09IDE7DQorCX0NCisJKnBpdF9mcmFjID0gZnJhY3Rpb247DQorCXJldHVybiAodDApOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiAgTm9ybV9Db3JyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IEZpbmQgdGhlIG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQgdGhlICAgICoNCisqIGZpbHRlcmVkIHBhc3QgZXhjaXRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAoY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGZpbHRlcmVkIGV4Y2l0YXRpb24gZGl2aWRlZCBieSB0aGUgICAgICAgICAgICAgICAgKg0KKyogIHNxdWFyZSByb290IG9mIGVuZXJneSBvZiB0YXJnZXQgYW5kIGZpbHRlcmVkIGV4Y2l0YXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2lmbmRlZiBBU01fT1BUDQorc3RhdGljIHZvaWQgTm9ybV9Db3JyKA0KKwkJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaW1wdWxzZSByZXNwb25zZSBvZiBzeW50aC93Z3QgZmlsdGVycyAqLw0KKwkJV29yZDE2IExfc3ViZnIsDQorCQlXb3JkMTYgdF9taW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtaW5pbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgdF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtYXhpbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAgICAgICAgICovDQorCQlXb3JkMTYgY29ycl9ub3JtW10pICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBub3JtYWxpemVkIGNvcnJlbGF0aW9uICAgICAgICAgICAgICAgICovDQorew0KKwlXb3JkMzIgaSwgaywgdDsNCisJV29yZDMyIGNvcnIsIGV4cF9jb3JyLCBub3JtLCBleHAsIHNjYWxlOw0KKwlXb3JkMTYgZXhwX25vcm0sIGV4Y2ZbTF9TVUJGUl0sIHRtcDsNCisJV29yZDMyIExfdG1wLCBMX3RtcDEsIExfdG1wMjsNCisNCisJLyogY29tcHV0ZSB0aGUgZmlsdGVyZWQgZXhjaXRhdGlvbiBmb3IgdGhlIGZpcnN0IGRlbGF5IHRfbWluICovDQorCWsgPSAtdF9taW47DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCUNvbnZvbHZlX2FzbSgmZXhjW2tdLCBoLCBleGNmLCA2NCk7DQorI2Vsc2UNCisJQ29udm9sdmUoJmV4Y1trXSwgaCwgZXhjZiwgNjQpOw0KKyNlbmRpZg0KKw0KKwkvKiBDb21wdXRlIHJvdW5kZWQgZG93biAxL3NxcnQoZW5lcmd5IG9mIHhuW10pICovDQorCUxfdG1wID0gMDsgDQorCWZvciAoaSA9IDA7IGkgPCA2NDsgaSs9NCkNCisJew0KKwkJTF90bXAgKz0gKHhuW2ldICogeG5baV0pOw0KKwkJTF90bXAgKz0gKHhuW2krMV0gKiB4bltpKzFdKTsNCisJCUxfdG1wICs9ICh4bltpKzJdICogeG5baSsyXSk7DQorCQlMX3RtcCArPSAoeG5baSszXSAqIHhuW2krM10pOw0KKwl9DQorDQorCUxfdG1wID0gKExfdG1wIDw8IDEpICsgMTsNCisJZXhwID0gbm9ybV9sKExfdG1wKTsNCisJZXhwID0gKDMyIC0gZXhwKTsNCisJLy9leHAgPSBleHAgKyAyOyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZXJneSBvZiB4bltdIHggMiArIHJvdW5kZWQgdXAgICAgICovDQorCXNjYWxlID0gLShleHAgPj4gMSk7ICAgICAgICAgICAvKiAoMTw8c2NhbGUpIDwgMS9zcXJ0KGVuZXJneSByb3VuZGVkKSAqLw0KKw0KKwkvKiBsb29wIGZvciBldmVyeSBwb3NzaWJsZSBwZXJpb2QgKi8NCisNCisJZm9yICh0ID0gdF9taW47IHQgPD0gdF9tYXg7IHQrKykNCisJew0KKwkJLyogQ29tcHV0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHhuW10gYW5kIGV4Y2ZbXSAqLw0KKwkJTF90bXAgID0gMDsgIA0KKwkJTF90bXAxID0gMDsNCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSs9NCkNCisJCXsNCisJCQlMX3RtcCAgKz0gKHhuW2ldICogZXhjZltpXSk7DQorCQkJTF90bXAxICs9IChleGNmW2ldICogZXhjZltpXSk7DQorCQkJTF90bXAgICs9ICh4bltpKzFdICogZXhjZltpKzFdKTsNCisJCQlMX3RtcDEgKz0gKGV4Y2ZbaSsxXSAqIGV4Y2ZbaSsxXSk7DQorCQkJTF90bXAgICs9ICh4bltpKzJdICogZXhjZltpKzJdKTsNCisJCQlMX3RtcDEgKz0gKGV4Y2ZbaSsyXSAqIGV4Y2ZbaSsyXSk7DQorCQkJTF90bXAgICs9ICh4bltpKzNdICogZXhjZltpKzNdKTsNCisJCQlMX3RtcDEgKz0gKGV4Y2ZbaSszXSAqIGV4Y2ZbaSszXSk7DQorCQl9DQorDQorCQlMX3RtcCA9IChMX3RtcCA8PCAxKSArIDE7DQorCQlMX3RtcDEgPSAoTF90bXAxIDw8IDEpICsgMTsNCisNCisJCWV4cCA9IG5vcm1fbChMX3RtcCk7DQorCQlMX3RtcCA9IChMX3RtcCA8PCBleHApOw0KKwkJZXhwX2NvcnIgPSAoMzAgLSBleHApOw0KKwkJY29yciA9IGV4dHJhY3RfaChMX3RtcCk7DQorDQorCQlleHAgPSBub3JtX2woTF90bXAxKTsNCisJCUxfdG1wID0gKExfdG1wMSA8PCBleHApOw0KKwkJZXhwX25vcm0gPSAoMzAgLSBleHApOw0KKw0KKwkJSXNxcnRfbigmTF90bXAsICZleHBfbm9ybSk7DQorCQlub3JtID0gZXh0cmFjdF9oKExfdG1wKTsNCisNCisJCS8qIE5vcm1hbGl6ZSBjb3JyZWxhdGlvbiA9IGNvcnJlbGF0aW9uICogKDEvc3FydChlbmVyZ3kpKSAqLw0KKw0KKwkJTF90bXAgPSB2b19MX211bHQoY29yciwgbm9ybSk7DQorDQorCQlMX3RtcDIgPSBleHBfY29yciArIGV4cF9ub3JtICsgc2NhbGU7DQorCQlpZihMX3RtcDIgPCAwKQ0KKwkJew0KKwkJCUxfdG1wMiA9IC1MX3RtcDI7DQorCQkJTF90bXAgPSBMX3RtcCA+PiBMX3RtcDI7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJTF90bXAgPSBMX3RtcCA8PCBMX3RtcDI7DQorCQl9DQorDQorCQljb3JyX25vcm1bdF0gPSB2b19yb3VuZChMX3RtcCk7ICAgICAgDQorCQkvKiBtb2RpZnkgdGhlIGZpbHRlcmVkIGV4Y2l0YXRpb24gZXhjZltdIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8NCisNCisJCWlmKHQgIT0gdF9tYXgpDQorCQl7DQorCQkJayA9IC0odCArIDEpOw0KKwkJCXRtcCA9IGV4Y1trXTsNCisJCQlmb3IgKGkgPSA2MzsgaSA+IDA7IGktLSkNCisJCQl7DQorCQkJCWV4Y2ZbaV0gPSBhZGQxKHZvX211bHQodG1wLCBoW2ldKSwgZXhjZltpIC0gMV0pOw0KKwkJCX0NCisJCQlleGNmWzBdID0gdm9fbXVsdCh0bXAsIGhbMF0pOw0KKwkJfQ0KKwl9DQorCXJldHVybjsNCit9DQorDQorI2VuZGlmDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246IEludGVycG9sXzQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIERlc2NyaXB0aW9uOiBGb3IgaW50ZXJwb2xhdGluZyB0aGUgbm9ybWFsaXplZCBjb3JyZWxhdGlvbiB3aXRoIDEvNCByZXNvbHV0aW9uLiAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qIDEvNCByZXNvbHV0aW9uIGludGVycG9sYXRpb24gZmlsdGVyICgtMyBkQiBhdCAwLjc5MSpmcy8yKSBpbiBRMTQgKi8NCitzdGF0aWMgV29yZDE2IGludGVyNF8xWzRdWzhdID0NCit7DQorCXstMTIsIDQyMCwgLTE3MzIsIDU0MjksIDEzNDE4LCAtMTI0MiwgNzMsIDMyfSwNCisJey0yNiwgNDU1LCAtMjE0MiwgOTkxMCwgOTkxMCwgIC0yMTQyLCA0NTUsIC0yNn0sDQorCXszMiwgIDczLCAtMTI0MiwgMTM0MTgsIDU0MjksIC0xNzMyLCA0MjAsIC0xMn0sDQorCXsyMDYsIC03NjYsIDEzNzYsIDE0NzQ2LCAxMzc2LCAtNzY2LCAyMDYsIDB9DQorfTsNCisNCisvKioqIENvZWZmaWNpZW50cyBpbiBmbG9hdGluZyBwb2ludA0KK3N0YXRpYyBmbG9hdCBpbnRlcjRfMVtVUF9TQU1QKkxfSU5URVJQT0wxKzFdID0gew0KKzAuOTAwMDAwLA0KKzAuODE4OTU5LCAgMC42MDQ4NTAsICAwLjMzMTM3OSwgIDAuMDgzOTU4LA0KKy0wLjA3NTc5NSwgLTAuMTMwNzE3LCAtMC4xMDU2ODUsIC0wLjA0Njc3NCwNCiswLjAwNDQ2NywgIDAuMDI3Nzg5LCAgMC4wMjU2NDIsICAwLjAxMjU3MSwNCiswLjAwMTkyNywgLTAuMDAxNTcxLCAtMC4wMDA3NTMsICAwLjAwMDAwMH07DQorKioqLw0KKw0KK3N0YXRpYyBXb3JkMTYgSW50ZXJwb2xfNCggICAgICAgICAgICAgICAgICAvKiAobykgIDogaW50ZXJwb2xhdGVkIHZhbHVlICAqLw0KKwkJV29yZDE2ICogeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgIDogaW5wdXQgdmVjdG9yICAgICAgICAqLw0KKwkJV29yZDMyIGZyYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgIDogZnJhY3Rpb24gKC00Li4rMykgICAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IHN1bTsNCisJV29yZDMyICBrLCBMX3N1bTsNCisJV29yZDE2ICpwdHI7DQorDQorCWlmIChmcmFjIDwgMCkNCisJew0KKwkJZnJhYyArPSBVUF9TQU1QOw0KKwkJeC0tOw0KKwl9DQorCXggPSB4IC0gTF9JTlRFUlBPTDEgKyAxOw0KKwlrID0gVVBfU0FNUCAtIDEgLSBmcmFjOw0KKwlwdHIgPSAmKGludGVyNF8xW2tdWzBdKTsNCisNCisJTF9zdW0gID0gdm9fbXVsdDMyKHhbMF0sICgqcHRyKyspKTsNCisJTF9zdW0gKz0gdm9fbXVsdDMyKHhbMV0sICgqcHRyKyspKTsNCisJTF9zdW0gKz0gdm9fbXVsdDMyKHhbMl0sICgqcHRyKyspKTsNCisJTF9zdW0gKz0gdm9fbXVsdDMyKHhbM10sICgqcHRyKyspKTsNCisJTF9zdW0gKz0gdm9fbXVsdDMyKHhbNF0sICgqcHRyKyspKTsgIA0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFs1XSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFs2XSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFs3XSwgKCpwdHIrKykpOyAgIA0KKw0KKwlzdW0gPSBleHRyYWN0X2goTF9hZGQoTF9zaGwyKExfc3VtLCAyKSwgMHg4MDAwKSk7DQorCXJldHVybiAoc3VtKTsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVkX2x0NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVkX2x0NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWZmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHByZWRfbHQ0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBDb21wdXRlIHRoZSByZXN1bHQgb2YgbG9uZyB0ZXJtIHByZWRpY3Rpb24gd2l0aCAgICAqDQorKiAgICAgIGZyYWN0aW9uYWwgaW50ZXJwb2xhdGlvbiBvZiByZXNvbHV0aW9uIDEvNCAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIG9uIHJldHVybiBleGNbMC4uTF9zdWJyLTFdIGNvbnRhaW5zIHRoZSBpbnRlcnBvbGF0ZWQgc2lnbmFsICAgICAqDQorKiAgICAgIChhZGFwdGl2ZSBjb2RlYm9vayBleGNpdGF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQorI2RlZmluZSBVUF9TQU1QICAgICAgNA0KKyNkZWZpbmUgTF9JTlRFUlBPTDIgIDE2DQorDQorLyogMS80IHJlc29sdXRpb24gaW50ZXJwb2xhdGlvbiBmaWx0ZXIgKC0zIGRCIGF0IDAuODU2KmZzLzIpIGluIFExNCAqLw0KKw0KK1dvcmQxNiBpbnRlcjRfMls0XVszMl0gPQ0KK3sNCisJezAsLTIsNCwtMiwtMTAsMzgsLTg4LDE2NSwtMjc1LDQyNCwtNjE5LDg3MSwtMTIwNywxNjk5LC0yNTk4LDU1MzEsMTQwMzEsLTIxNDcsNzgwLC0yNDksDQorCS0xNiwxNTMsLTIxMywyMjYsLTIwOSwxNzUsLTEzMyw5MSwtNTUsMjgsLTEwLDJ9LA0KKw0KKwl7MSwtNywxOSwtMzMsNDcsLTUyLDQzLC05LC02MCwxNzUsLTM1NSw2MjYsLTEwNDQsMTc0OSwtMzI2NywxMDM1OSwxMDM1OSwtMzI2NywxNzQ5LC0xMDQ0LA0KKwk2MjYsLTM1NSwxNzUsLTYwLC05LDQzLC01Miw0NywtMzMsMTksIC03LCAxfSwNCisNCisJezIsLTEwLDI4LC01NSw5MSwtMTMzLDE3NSwtMjA5LDIyNiwtMjEzLDE1MywtMTYsLTI0OSw3ODAsLTIxNDcsMTQwMzEsNTUzMSwtMjU5OCwxNjk5LC0xMjA3LA0KKwk4NzEsLTYxOSw0MjQsLTI3NSwxNjUsLTg4LDM4LC0xMCwtMiw0LC0yLDB9LA0KKw0KKwl7MSwtNywyMiwtNDksOTIsLTE1MywyMzEsLTMyNSw0MzEsLTU0NCw2NTYsLTc2Miw4NTMsLTkyMyw5NjgsMTU0MDEsOTY4LC05MjMsODUzLC03NjIsDQorCTY1NiwtNTQ0LDQzMSwtMzI1LDIzMSwtMTUzLDkyLC00OSwyMiwtNywgMSwgMH0NCisNCit9Ow0KKw0KK3ZvaWQgUHJlZF9sdDQoDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogZXhjaXRhdGlvbiBidWZmZXIgKi8NCisJCVdvcmQxNiBUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLw0KKwkJV29yZDE2IGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovDQorCQlXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc3ViZnJhbWUgc2l6ZSAgICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMTYgaiwgaywgKng7DQorCVdvcmQzMiBMX3N1bTsNCisJV29yZDE2ICpwdHIsICpwdHIxOw0KKwlXb3JkMTYgKnB0cjI7DQorDQorCXggPSBleGMgLSBUMDsgICANCisJZnJhYyA9IC1mcmFjOw0KKwlpZiAoZnJhYyA8IDApDQorCXsNCisJCWZyYWMgKz0gVVBfU0FNUDsNCisJCXgtLTsNCisJfSAgIA0KKwl4IC09IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4ID0gTF9JTlRFUlBPTDIgLSAxICovDQorCWsgPSAzIC0gZnJhYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGsgPSBVUF9TQU1QIC0gMSAtIGZyYWMgKi8NCisNCisJcHRyMiA9ICYoaW50ZXI0XzJba11bMF0pOw0KKwlmb3IgKGogPSAwOyBqIDwgTF9zdWJmcjsgaisrKQ0KKwl7DQorCQlwdHIgPSBwdHIyOw0KKwkJcHRyMSA9IHg7DQorCQlMX3N1bSAgPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorCQlMX3N1bSArPSB2b19tdWx0MzIoKCpwdHIxKyspLCAoKnB0cisrKSk7DQorDQorCQlMX3N1bSA9IExfc2hsMihMX3N1bSwgMik7DQorCQlleGNbal0gPSBleHRyYWN0X2goTF9hZGQoTF9zdW0sIDB4ODAwMCkpOw0KKwkJeCsrOw0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJjZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMKQEAgLTAsMCArMSw4OCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogcHJlZW1waC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBQcmVlbXBoYXNpczogZmlsdGVyaW5nIHRocm91Z2ggMSAtIGcgel4tMSAgICAgICAgICoNCisqCSAgICAgICAgICAgUHJlZW1waDIgLS0+IHNpZ25hbCBpcyBtdWx0aXBsaWVkIGJ5IDIgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQordm9pZCBQcmVlbXBoKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICkNCit7DQorCVdvcmQxNiB0ZW1wOw0KKwlXb3JkMzIgaSwgTF90bXA7DQorDQorCXRlbXAgPSB4W2xnIC0gMV07ICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoaSA9IGxnIC0gMTsgaSA+IDA7IGktLSkNCisJew0KKwkJTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsNCisJCUxfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsNCisJCXhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOw0KKwlMX3RtcCAtPSAoKCptZW0pICogbXUpPDwxOw0KKwl4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkqbWVtID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJcmV0dXJuOw0KK30NCisNCisNCit2b2lkIFByZWVtcGgyKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMTYgdGVtcDsNCisJV29yZDMyIGksIExfdG1wOw0KKw0KKwl0ZW1wID0geFtsZyAtIDFdOyAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlmb3IgKGkgPSAoV29yZDE2KSAobGcgLSAxKTsgaSA+IDA7IGktLSkNCisJew0KKwkJTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsNCisJCUxfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsNCisJCUxfdG1wID0gKExfdG1wIDw8IDEpOw0KKwkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIA0KKwl9DQorDQorCUxfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7DQorCUxfdG1wIC09ICgoKm1lbSkgKiBtdSk8PDE7DQorCUxfdG1wID0gKExfdG1wIDw8IDEpOw0KKwl4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkqbWVtID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfZ2FpbjIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZWVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfZ2FpbjIuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBGaWxlOiBxX2dhaW4yLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFF1YW50aXphdGlvbiBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBNQSBwcmVkaWN0aW9uIGlzIHBlcmZvcm1lZCBvbiB0aGUgaW5ub3ZhdGlvbiBlbmVyZ3kgKGluIGRCIHdpdGggbWVhbiAgICAgKg0KKyogcmVtb3ZlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIEFuIGluaXRpYWwgcHJlZGljdGVkIGdhaW4sIGdfMCwgaXMgZmlyc3QgZGV0ZXJtaW5lZCBhbmQgdGhlIGNvcnJlY3Rpb24gICAqDQorKiBmYWN0b3IgICAgIGFscGhhID0gZ2FpbiAvIGdfMCAgICBpcyBxdWFudGl6ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogVGhlIHBpdGNoIGdhaW4gYW5kIHRoZSBjb3JyZWN0aW9uIGZhY3RvciBhcmUgdmVjdG9yIHF1YW50aXplZCBhbmQgdGhlICAgICoNCisqIG1lYW4tc3F1YXJlZCB3ZWlnaHRlZCBlcnJvciBjcml0ZXJpb24gaXMgdXNlZCBpbiB0aGUgcXVhbnRpemVyIHNlYXJjaC4gICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgImxvZzIuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAicV9nYWluMi50YWIiDQorDQorI2RlZmluZSBNRUFOX0VORVIgICAgMzANCisjZGVmaW5lIFJBTkdFICAgICAgICA2NA0KKyNkZWZpbmUgUFJFRF9PUkRFUiAgIDQNCisNCisNCisvKiBNQSBwcmVkaWN0aW9uIGNvZWZmID17MC41LCAwLjQsIDAuMywgMC4yfSBpbiBRMTMgKi8NCitzdGF0aWMgV29yZDE2IHByZWRbUFJFRF9PUkRFUl0gPSB7NDA5NiwgMzI3NywgMjQ1OCwgMTYzOH07DQorDQorDQordm9pZCBJbml0X1FfZ2FpbjIoDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCAgOnN0YXRpYyBtZW1vcnkgKDIgd29yZHMpICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpOw0KKw0KKwkvKiA0bmQgb3JkZXIgcXVhbnRpemVyIGVuZXJneSBwcmVkaWN0b3IgKGluaXQgdG8gLTE0LjAgaW4gUTEwKSAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgUFJFRF9PUkRFUjsgaSsrKQ0KKwl7DQorCQltZW1baV0gPSAtMTQzMzY7ICAgICAgICAgICAgICAgICAgICAgLyogcGFzdF9xdWFfZW5baV0gKi8NCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KK1dvcmQxNiBRX2dhaW4yKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gaW5kZXggb2YgcXVhbnRpemF0aW9uLiAgICAgICAgICAqLw0KKwkJV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUV94bjogVGFyZ2V0IHZlY3Rvci4gICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHkxW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUV94bjogQWRhcHRpdmUgY29kZWJvb2suICAgICAgICAgICAqLw0KKwkJV29yZDE2IFFfeG4sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogeG4gYW5kIHkxIGZvcm1hdCAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHkyW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDogRmlsdGVyZWQgaW5ub3ZhdGl2ZSB2ZWN0b3IuICAqLw0KKwkJV29yZDE2IGNvZGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDogSW5ub3ZhdGl2ZSB2ZWN0b3IuICAgICAgICAgICAqLw0KKwkJV29yZDE2IGdfY29lZmZbXSwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogQ29ycmVsYXRpb25zIDx4biB5MT4gPHkxIHkxPiAqLw0KKwkJLyogICAgICAgICAgIENvbXB1dGUgaW4gR19waXRjaCgpLiAgICAgICAgKi8NCisJCVdvcmQxNiBMX3N1YmZyLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IFN1YmZyYW1lIGxlbmdodC4gICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBiaXRzICg2IG9yIDcpICAgICAgKi8NCisJCVdvcmQxNiAqIGdhaW5fcGl0LCAgICAgICAgICAgICAgICAgICAgLyogKGkvbylRMTQ6IFBpdGNoIGdhaW4uICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQzMiAqIGdhaW5fY29kLCAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNiA6IENvZGUgZ2Fpbi4gICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBncF9jbGlwLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IEdwIENsaXBwaW5nIGZsYWcgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IHN0YXRpYyBtZW1vcnkgKDIgd29yZHMpICAgICAgKi8NCisJICAgICAgKQ0KK3sNCisJV29yZDE2IGluZGV4LCAqcCwgbWluX2luZCwgc2l6ZTsNCisJV29yZDE2IGV4cCwgZnJhYywgZ2NvZGUwLCBleHBfZ2NvZGUwLCBlX21heCwgZXhwX2NvZGUsIHF1YV9lbmVyOw0KKwlXb3JkMTYgZ19waXRjaCwgZzJfcGl0Y2gsIGdfY29kZSwgZ19waXRfY29kLCBnMl9jb2RlLCBnMl9jb2RlX2xvOw0KKwlXb3JkMTYgY29lZmZbNV0sIGNvZWZmX2xvWzVdLCBleHBfY29lZmZbNV07DQorCVdvcmQxNiBleHBfbWF4WzVdOw0KKwlXb3JkMzIgaSwgaiwgTF90bXAsIGRpc3RfbWluOw0KKwlXb3JkMTYgKnBhc3RfcXVhX2VuLCAqdF9xdWFfZ2FpbjsNCisNCisJcGFzdF9xdWFfZW4gPSBtZW07ICAgICAgICAgICAgICAgICAgICAgDQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIC0gRmluZCB0aGUgaW5pdGlhbCBxdWFudGl6YXRpb24gcGl0Y2ggaW5kZXggICAgICAgICAgICAgICAgICAgICAqDQorCSAqIC0gU2V0IGdhaW5zIHNlYXJjaCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZiAobmJpdHMgPT0gNikNCisJew0KKwkJdF9xdWFfZ2FpbiA9IHRfcXVhX2dhaW42YjsgICAgICAgICANCisJCW1pbl9pbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgDQorCQlzaXplID0gUkFOR0U7ICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwkJaWYoZ3BfY2xpcCA9PSAxKQ0KKwkJew0KKwkJCXNpemUgPSBzaXplIC0gMTY7ICAgICAgICAgIC8qIGxpbWl0IGdhaW4gcGl0Y2ggdG8gMS4wICovDQorCQl9DQorCX0gZWxzZQ0KKwl7DQorCQl0X3F1YV9nYWluID0gdF9xdWFfZ2FpbjdiOyAgICAgICAgIA0KKw0KKwkJcCA9IHRfcXVhX2dhaW43YiArIFJBTkdFOyAgICAgICAgICAgIC8qIHB0IGF0IDEvNHRoIG9mIHRhYmxlICovDQorDQorCQlqID0gbmJfcXVhX2dhaW43YiAtIFJBTkdFOyAgICAgICAgIA0KKw0KKwkJaWYgKGdwX2NsaXAgPT0gMSkNCisJCXsNCisJCQlqID0gaiAtIDI3OyAgICAgICAgICAgICAgICAvKiBsaW1pdCBnYWluIHBpdGNoIHRvIDEuMCAqLw0KKwkJfQ0KKwkJbWluX2luZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICANCisJCWdfcGl0Y2ggPSAqZ2Fpbl9waXQ7ICAgICAgICAgICAgICAgDQorDQorCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrLCBwICs9IDIpDQorCQl7DQorCQkJaWYgKGdfcGl0Y2ggPiAqcCkNCisJCQl7DQorCQkJCW1pbl9pbmQgPSBtaW5faW5kICsgMTsNCisJCQl9DQorCQl9DQorCQlzaXplID0gUkFOR0U7ICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgQ29tcHV0ZSBjb2VmZmljaWVudCBuZWVkIGZvciB0aGUgcXVhbnRpemF0aW9uLiAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBjb2VmZlswXSA9ICAgIHkxIHkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgY29lZmZbMV0gPSAtMiB4biB5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIGNvZWZmWzJdID0gICAgeTIgeTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBjb2VmZlszXSA9IC0yIHhuIHkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgY29lZmZbNF0gPSAgMiB5MSB5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIFByb2R1Y3QgPHkxIHkxPiBhbmQgPHhuIHkxPiBoYXZlIGJlZW4gY29tcHV0ZSBpbiBHX3BpdGNoKCkgYW5kICAgKg0KKwkgKiBhcmUgaW4gdmVjdG9yIGdfY29lZmZbXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwljb2VmZlswXSA9IGdfY29lZmZbMF07ICAgICAgICAgICAgICAgICANCisJZXhwX2NvZWZmWzBdID0gZ19jb2VmZlsxXTsgICAgICAgICAgICAgDQorCWNvZWZmWzFdID0gbmVnYXRlKGdfY29lZmZbMl0pOyAgICAgICAgICAgICAgICAgICAgLyogY29lZmZbMV0gPSAtMiB4biB5MSAqLw0KKwlleHBfY29lZmZbMV0gPSBnX2NvZWZmWzNdICsgMTsgICAgIA0KKw0KKwkvKiBDb21wdXRlIHNjYWxhciBwcm9kdWN0IDx5MltdLHkyW10+ICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJY29lZmZbMl0gPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMl9hc20oeTIsIHkyLCBMX3N1YmZyLCAmZXhwKSk7DQorI2Vsc2UNCisJY29lZmZbMl0gPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMih5MiwgeTIsIExfc3ViZnIsICZleHApKTsNCisjZW5kaWYNCisJZXhwX2NvZWZmWzJdID0gKGV4cCAtIDE4KSArIChRX3huIDw8IDEpOyAgICAgLyogLTE4ICh5MiBROSkgKi8NCisNCisJLyogQ29tcHV0ZSBzY2FsYXIgcHJvZHVjdCAtMio8eG5bXSx5MltdPiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJY29lZmZbM10gPSBleHRyYWN0X2goTF9uZWdhdGUoRG90X3Byb2R1Y3QxMl9hc20oeG4sIHkyLCBMX3N1YmZyLCAmZXhwKSkpOw0KKyNlbHNlDQorCWNvZWZmWzNdID0gZXh0cmFjdF9oKExfbmVnYXRlKERvdF9wcm9kdWN0MTIoeG4sIHkyLCBMX3N1YmZyLCAmZXhwKSkpOw0KKyNlbmRpZg0KKw0KKwlleHBfY29lZmZbM10gPSAoZXhwIC0gOCkgKyBRX3huOyAgLyogLTkgKHkyIFE5KSwgKzEgKDIgeG4geTIpICovDQorDQorCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgMio8eTFbXSx5MltdPiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwljb2VmZls0XSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbSh5MSwgeTIsIExfc3ViZnIsICZleHApKTsNCisjZWxzZQ0KKwljb2VmZls0XSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyKHkxLCB5MiwgTF9zdWJmciwgJmV4cCkpOw0KKyNlbmRpZg0KKwlleHBfY29lZmZbNF0gPSAoZXhwIC0gOCkgKyBRX3huOyAgLyogLTkgKHkyIFE5KSwgKzEgKDIgeTEgeTIpICovDQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBGaW5kIGVuZXJneSBvZiBjb2RlIGFuZCBjb21wdXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgIExfdG1wID0gTUVBTl9FTkVSIC0gMTBsb2cxMChlbmVyZ3kgb2YgY29kZS8gTF9zdWJmcikgICAgICAgICAqDQorCSAqICAgICAgICAgID0gTUVBTl9FTkVSIC0gMy4wMTAzKmxvZzIoZW5lcmd5IG9mIGNvZGUvIExfc3ViZnIpICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlMX3RtcCA9IERvdF9wcm9kdWN0MTJfYXNtKGNvZGUsIGNvZGUsIExfc3ViZnIsICZleHBfY29kZSk7DQorI2Vsc2UNCisJTF90bXAgPSBEb3RfcHJvZHVjdDEyKGNvZGUsIGNvZGUsIExfc3ViZnIsICZleHBfY29kZSk7DQorI2VuZGlmDQorCS8qIGV4cF9jb2RlOiAtMTggKGNvZGUgaW4gUTkpLCAtNiAoL0xfc3ViZnIpLCAtMzEgKExfdG1wIFEzMS0+UTApICovDQorCWV4cF9jb2RlID0gKGV4cF9jb2RlIC0gKDE4ICsgNiArIDMxKSk7DQorDQorCUxvZzIoTF90bXAsICZleHAsICZmcmFjKTsNCisJZXhwICs9IGV4cF9jb2RlOw0KKwlMX3RtcCA9IE1weV8zMl8xNihleHAsIGZyYWMsIC0yNDY2MCk7ICAvKiB4IC0zLjAxMDMoUTEzKSAtPiBRMTQgKi8NCisNCisJTF90bXAgKz0gKE1FQU5fRU5FUiAqIDgxOTIpPDwxOyAvKiArIE1FQU5fRU5FUiBpbiBRMTQgKi8NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQ29tcHV0ZSBnY29kZTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogID0gU3VtKGk9MCwxKSBwcmVkW2ldKnBhc3RfcXVhX2VuW2ldICsgbWVhbl9lbmVyIC0gZW5lcl9jb2RlICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUxfdG1wID0gKExfdG1wIDw8IDEwKTsgICAgICAgICAgICAgIC8qIEZyb20gUTE0IHRvIFEyNCAqLw0KKwlMX3RtcCArPSAocHJlZFswXSAqIHBhc3RfcXVhX2VuWzBdKTw8MTsgICAgICAvKiBRMTMqUTEwIC0+IFEyNCAqLw0KKwlMX3RtcCArPSAocHJlZFsxXSAqIHBhc3RfcXVhX2VuWzFdKTw8MTsgICAgICAvKiBRMTMqUTEwIC0+IFEyNCAqLw0KKwlMX3RtcCArPSAocHJlZFsyXSAqIHBhc3RfcXVhX2VuWzJdKTw8MTsgICAgICAvKiBRMTMqUTEwIC0+IFEyNCAqLw0KKwlMX3RtcCArPSAocHJlZFszXSAqIHBhc3RfcXVhX2VuWzNdKTw8MTsgICAgICAvKiBRMTMqUTEwIC0+IFEyNCAqLw0KKw0KKwlnY29kZTAgPSBleHRyYWN0X2goTF90bXApOyAgICAgICAgICAgICAvKiBGcm9tIFEyNCB0byBROCAgKi8NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogZ2NvZGUwID0gcG93KDEwLjAsIGdjb2RlMC8yMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgID0gcG93KDIsIDMuMzIxOTI4Kmdjb2RlMC8yMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgID0gcG93KDIsIDAuMTY2MDk2Kmdjb2RlMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCUxfdG1wID0gdm9fTF9tdWx0KGdjb2RlMCwgNTQ0Myk7ICAgICAgICAgIC8qICowLjE2NjA5NiBpbiBRMTUgLT4gUTI0ICAgICAqLw0KKwlMX3RtcCA9IExfdG1wID4+IDg7ICAgICAgICAgICAgICAgLyogRnJvbSBRMjQgdG8gUTE2ICAgICAgICAgICAgICovDQorCVZPX0xfRXh0cmFjdChMX3RtcCwgJmV4cF9nY29kZTAsICZmcmFjKTsgIC8qIEV4dHJhY3QgZXhwb25lbnQgb2YgZ2NvZGUwICAqLw0KKw0KKwlnY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBmcmFjKSk7ICAgIC8qIFB1dCAxNCBhcyBleHBvbmVudCBzbyB0aGF0ICAqLw0KKwkvKiBvdXRwdXQgb2YgUG93MigpIHdpbGwgYmU6ICAgKi8NCisJLyogMTYzODQgPCBQb3cyKCkgPD0gMzI3NjcgICAgICovDQorCWV4cF9nY29kZTAgLT0gMTQ7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogRmluZCB0aGUgYmVzdCBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIEJlZm9yZSBkb2luZyB0aGUgY29tcHV0YXRpb24gd2UgbmVlZCB0byBhbGluZyBleHBvbmVudHMgb2YgY29lZmZbXSAgICAgICoNCisJICogdG8gYmUgc3VyZSB0byBoYXZlIHRoZSBtYXhpbXVtIHByZWNpc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIEluIHRoZSB0YWJsZSB0aGUgcGl0Y2ggZ2FpbnMgYXJlIGluIFExNCwgdGhlIGNvZGUgZ2FpbnMgYXJlIGluIFExMSBhbmQgICoNCisJICogYXJlIG11bHRpcGx5IGJ5IGdjb2RlMCB3aGljaCBoYXZlIGJlZW4gbXVsdGlwbHkgYnkgMl5leHBfZ2NvZGUwLiAgICAgICAgKg0KKwkgKiBBbHNvIHdoZW4gd2UgY29tcHV0ZSBnX3BpdGNoKmdfcGl0Y2gsIGdfY29kZSpnX2NvZGUgYW5kIGdfcGl0Y2gqZ19jb2RlICAqDQorCSAqIHdlIGRpdmlkZSBieSAyXjE1LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogQ29uc2lkZXJpbmcgYWxsIHRoZSBzY2FsaW5nIGFib3ZlIHdlIGhhdmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZXhwX2NvZGUgPSBleHBfZ2NvZGUwLTExKzE1ID0gZXhwX2djb2RlMCs0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIGdfcGl0Y2gqZ19waXRjaCAgPSAtMTQtMTQrMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZ19waXRjaCAgICAgICAgICA9IC0xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBnX2NvZGUqZ19jb2RlICAgID0gKDIqZXhwX2NvZGUpKzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIGdfY29kZSAgICAgICAgICAgPSBleHBfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZ19waXRjaCpnX2NvZGUgICA9IC0xNCArIGV4cF9jb2RlICsxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIGdfcGl0Y2gqZ19waXRjaCAqIGNvZWZmWzBdICA7ZXhwX21heDAgPSBleHBfY29lZmZbMF0gLSAxMyAgICAgICAgICAgICAqDQorCSAqICAgZ19waXRjaCAgICAgICAgICogY29lZmZbMV0gIDtleHBfbWF4MSA9IGV4cF9jb2VmZlsxXSAtIDE0ICAgICAgICAgICAgICoNCisJICogICBnX2NvZGUqZ19jb2RlICAgKiBjb2VmZlsyXSAgO2V4cF9tYXgyID0gZXhwX2NvZWZmWzJdICsxNSsoMipleHBfY29kZSkgKg0KKwkgKiAgIGdfY29kZSAgICAgICAgICAqIGNvZWZmWzNdICA7ZXhwX21heDMgPSBleHBfY29lZmZbM10gKyBleHBfY29kZSAgICAgICAqDQorCSAqICAgZ19waXRjaCpnX2NvZGUgICogY29lZmZbNF0gIDtleHBfbWF4NCA9IGV4cF9jb2VmZls0XSArIDEgKyBleHBfY29kZSAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJZXhwX2NvZGUgPSAoZXhwX2djb2RlMCArIDQpOw0KKwlleHBfbWF4WzBdID0gKGV4cF9jb2VmZlswXSAtIDEzKTsgICAgDQorCWV4cF9tYXhbMV0gPSAoZXhwX2NvZWZmWzFdIC0gMTQpOyAgICANCisJZXhwX21heFsyXSA9IChleHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwX2NvZGUgPDwgMSkpKTsgIA0KKwlleHBfbWF4WzNdID0gKGV4cF9jb2VmZlszXSArIGV4cF9jb2RlKTsgICANCisJZXhwX21heFs0XSA9IChleHBfY29lZmZbNF0gKyAoMSArIGV4cF9jb2RlKSk7ICANCisNCisJLyogRmluZCBtYXhpbXVtIGV4cG9uYW50ICovDQorDQorCWVfbWF4ID0gZXhwX21heFswXTsgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspDQorCXsNCisJCWlmKGV4cF9tYXhbaV0gPiBlX21heCkNCisJCXsNCisJCQllX21heCA9IGV4cF9tYXhbaV07ICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJLyogYWxpZ24gY29lZmZbXSBhbmQgc2F2ZSBpbiBzcGVjaWFsIDMyIGJpdCBkb3VibGUgcHJlY2lzaW9uICovDQorDQorCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspDQorCXsNCisJCWogPSBhZGQxKHZvX3N1YihlX21heCwgZXhwX21heFtpXSksIDIpOy8qIC80IHRvIGF2b2lkIG92ZXJmbG93ICovDQorCQlMX3RtcCA9IExfZGVwb3NpdF9oKGNvZWZmW2ldKTsNCisJCUxfdG1wID0gTF9zaHIoTF90bXAsIGopOw0KKwkJVk9fTF9FeHRyYWN0KExfdG1wLCAmY29lZmZbaV0sICZjb2VmZl9sb1tpXSk7DQorCQljb2VmZl9sb1tpXSA9IChjb2VmZl9sb1tpXSA+PiAzKTsgICAvKiBsbyA+PiAzICovDQorCX0NCisNCisJLyogQ29kZWJvb2sgc2VhcmNoICovDQorCWRpc3RfbWluID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgIA0KKwlwID0gJnRfcXVhX2dhaW5bbWluX2luZCA8PCAxXTsgICAgICANCisNCisJaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspDQorCXsNCisJCWdfcGl0Y2ggPSAqcCsrOyAgICAgICAgICAgICAgICAgICAgDQorCQlnX2NvZGUgPSAqcCsrOyAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwkJZ19jb2RlID0gKChnX2NvZGUgKiBnY29kZTApICsgMHg0MDAwKT4+MTU7DQorCQlnMl9waXRjaCA9ICgoZ19waXRjaCAqIGdfcGl0Y2gpICsgMHg0MDAwKT4+MTU7DQorCQlnX3BpdF9jb2QgPSAoKGdfY29kZSAqIGdfcGl0Y2gpICsgMHg0MDAwKT4+MTU7DQorCQlMX3RtcCA9IChnX2NvZGUgKiBnX2NvZGUpPDwxOw0KKwkJVk9fTF9FeHRyYWN0KExfdG1wLCAmZzJfY29kZSwgJmcyX2NvZGVfbG8pOw0KKw0KKwkJTF90bXAgPSAoY29lZmZbMl0gKiBnMl9jb2RlX2xvKTw8MTsNCisJCUxfdG1wID0gIChMX3RtcCA+PiAzKTsNCisJCUxfdG1wICs9IChjb2VmZl9sb1swXSAqIGcyX3BpdGNoKTw8MTsNCisJCUxfdG1wICs9IChjb2VmZl9sb1sxXSAqIGdfcGl0Y2gpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmX2xvWzJdICogZzJfY29kZSk8PDE7DQorCQlMX3RtcCArPSAoY29lZmZfbG9bM10gKiBnX2NvZGUpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmX2xvWzRdICogZ19waXRfY29kKTw8MTsNCisJCUxfdG1wID0gIChMX3RtcCA+PiAxMik7DQorCQlMX3RtcCArPSAoY29lZmZbMF0gKiBnMl9waXRjaCk8PDE7DQorCQlMX3RtcCArPSAoY29lZmZbMV0gKiBnX3BpdGNoKTw8MTsNCisJCUxfdG1wICs9IChjb2VmZlsyXSAqIGcyX2NvZGUpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmWzNdICogZ19jb2RlKTw8MTsNCisJCUxfdG1wICs9IChjb2VmZls0XSAqIGdfcGl0X2NvZCk8PDE7DQorDQorCQlpZihMX3RtcCA8IGRpc3RfbWluKQ0KKwkJew0KKwkJCWRpc3RfbWluID0gTF90bXA7ICAgICAgICAgICAgICANCisJCQlpbmRleCA9IGk7ICAgICAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJLyogUmVhZCB0aGUgcXVhbnRpemVkIGdhaW5zICovDQorCWluZGV4ID0gaW5kZXggKyBtaW5faW5kOw0KKwlwID0gJnRfcXVhX2dhaW5bKGluZGV4ICsgaW5kZXgpXTsgICAgDQorCSpnYWluX3BpdCA9ICpwKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWxlY3RlZCBwaXRjaCBnYWluIGluIFExNCAqLw0KKwlnX2NvZGUgPSAqcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VsZWN0ZWQgY29kZSBnYWluIGluIFExMSAgKi8NCisNCisJTF90bXAgPSB2b19MX211bHQoZ19jb2RlLCBnY29kZTApOyAgICAgICAgICAgICAvKiBRMTEqUTAgLT4gUTEyICovDQorCUxfdG1wID0gTF9zaGwoTF90bXAsIChleHBfZ2NvZGUwICsgNCkpOyAgIC8qIFExMiAtPiBRMTYgKi8NCisNCisJKmdhaW5fY29kID0gTF90bXA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBnYWluIG9mIGNvZGUgaW4gUTE2ICovDQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBxdWFfZW5lciA9IDIwKmxvZzEwKGdfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgPSA2LjAyMDYqbG9nMihnX2NvZGUpICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgID0gNi4wMjA2Kihsb2cyKGdfY29kZVExMSkgLSAxMSkgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCUxfdG1wID0gTF9kZXBvc2l0X2woZ19jb2RlKTsNCisJTG9nMihMX3RtcCwgJmV4cCwgJmZyYWMpOw0KKwlleHAgLT0gMTE7DQorCUxfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjApOyAgIC8qIHggNi4wMjA2IGluIFExMiAqLw0KKw0KKwlxdWFfZW5lciA9IChXb3JkMTYpKExfdG1wID4+IDMpOyAvKiByZXN1bHQgaW4gUTEwICovDQorDQorCS8qIHVwZGF0ZSB0YWJsZSBvZiBwYXN0IHF1YW50aXplZCBlbmVyZ2llcyAqLw0KKw0KKwlwYXN0X3F1YV9lblszXSA9IHBhc3RfcXVhX2VuWzJdOyAgICAgICANCisJcGFzdF9xdWFfZW5bMl0gPSBwYXN0X3F1YV9lblsxXTsgICAgICAgDQorCXBhc3RfcXVhX2VuWzFdID0gcGFzdF9xdWFfZW5bMF07ICAgICAgIA0KKwlwYXN0X3F1YV9lblswXSA9IHF1YV9lbmVyOyAgICAgICAgICAgICANCisNCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4YmE0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jCkBAIC0wLDAgKzEsNDAwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBxX3B1bHNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjogQ29kaW5nIGFuZCBkZWNvZGluZyBvZiBhbGdlYnJhaWMgY29kZWJvb2sgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJxX3B1bHNlLmgiDQorDQorI2RlZmluZSBOQl9QT1MgMTYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvcyBpbiB0cmFjaywgbWFzayBmb3Igc2lnbiBiaXQgKi8NCisNCitXb3JkMzIgcXVhbnRfMXBfTjEoICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiBOKzEgYml0cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHBvcywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlICAgICAgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBtYXNrOw0KKwlXb3JkMzIgaW5kZXg7DQorDQorCW1hc2sgPSAoMSA8PCBOKSAtIDE7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBRdWFudGl6YXRpb24gb2YgMSBwdWxzZSB3aXRoIE4rMSBiaXRzOiAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWluZGV4ID0gTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvcyAmIG1hc2spKTsNCisJaWYgKChwb3MgJiBOQl9QT1MpICE9IDApDQorCXsNCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIExfZGVwb3NpdF9sKDEgPDwgTikpOyAgIC8qIGluZGV4ICs9IDEgPDwgTjsgKi8NCisJfQ0KKwlyZXR1cm4gKGluZGV4KTsNCit9DQorDQorDQorV29yZDMyIHF1YW50XzJwXzJOMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDIqTikrMSBiaXRzICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLw0KKwkJV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBtYXNrLCB0bXA7DQorCVdvcmQzMiBpbmRleDsNCisJbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFF1YW50aXphdGlvbiBvZiAyIHB1bHNlcyB3aXRoIDIqTisxIGJpdHM6ICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJaWYgKCgocG9zMiBeIHBvczEpICYgTkJfUE9TKSA9PSAwKQ0KKwl7DQorCQkvKiBzaWduIG9mIDFzdCBwdWxzZSA9PSBzaWduIG9mIDJ0aCBwdWxzZSAqLw0KKwkJaWYocG9zMSA8PSBwb3MyKSAgICAgICAgICAvKiAoKHBvczEgLSBwb3MyKSA8PSAwKSAqLw0KKwkJew0KKwkJCS8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOyAqLw0KKwkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsNCisJCX0gZWxzZQ0KKwkJew0KKwkJCS8qICgocG9zMiAmIG1hc2spIDw8IE4pICsgKHBvczEgJiBtYXNrKTsgKi8NCisJCQlpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MxICYgbWFzaykpKSk7DQorCQl9DQorCQlpZiAoKHBvczEgJiBOQl9QT1MpICE9IDApDQorCQl7DQorCQkJdG1wID0gKE4gPDwgMSk7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDFMIDw8IHRtcCkpOyAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLw0KKwkJfQ0KKwl9IGVsc2UNCisJew0KKwkJLyogc2lnbiBvZiAxc3QgcHVsc2UgIT0gc2lnbiBvZiAydGggcHVsc2UgKi8NCisJCWlmICh2b19zdWIoKFdvcmQxNikgKHBvczEgJiBtYXNrKSwgKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPD0gMCkNCisJCXsNCisJCQkvKiBpbmRleCA9ICgocG9zMiAmIG1hc2spIDw8IE4pICsgKHBvczEgJiBtYXNrKTsgKi8NCisJCQlpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MxICYgbWFzaykpKSk7IA0KKwkJCWlmICgocG9zMiAmIE5CX1BPUykgIT0gMCkNCisJCQl7DQorCQkJCXRtcCA9IChOIDw8IDEpOyAgICAgICAgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8NCisJCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDFMIDw8IHRtcCkpOw0KKwkJCX0NCisJCX0gZWxzZQ0KKwkJew0KKwkJCS8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOwkgKi8NCisJCQlpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMSAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MyICYgbWFzaykpKSk7IA0KKwkJCWlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkNCisJCQl7DQorCQkJCXRtcCA9IChOIDw8IDEpOw0KKwkJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMSA8PCB0bXApKTsgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8NCisJCQl9DQorCQl9DQorCX0NCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KK1dvcmQzMiBxdWFudF8zcF8zTjEoICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICgzKk4pKzEgYml0cyAgICAgICAgICovDQorCQlXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8NCisJCVdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLw0KKwkJV29yZDE2IHBvczMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDMgICAgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBuYl9wb3M7DQorCVdvcmQzMiBpbmRleDsNCisNCisJbmJfcG9zID0oMSA8PChOIC0gMSkpOyAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDwoTi0xKSk7ICovDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogUXVhbnRpemF0aW9uIG9mIDMgcHVsc2VzIHdpdGggMypOKzEgYml0czogICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApDQorCXsNCisJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIChOLTEpKTsgKi8NCisJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOyAgDQorCQkvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MzLCBOKSA8PCAoMipOKTsgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8xcF9OMShwb3MzLCBOKTw8KE4gPDwgMSkpKTsNCisNCisJfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkNCisJew0KKwkJaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgKE4tMSkpOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOyANCisJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczIsIE4pIDw8IChOIDw8IDEpKSk7DQorCQkvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MyLCBOKSA8PA0KKwkJICogKDIqTik7ICovDQorCX0gZWxzZQ0KKwl7DQorCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4tMSkpOyAqLw0KKwkJLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47CQkJICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczIgJiBuYl9wb3MpKSA8PCBOKSk7ICANCisJCS8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczEsIE4pIDw8ICgyKk4pOwkgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoTiA8PCAxKSkpOw0KKwl9DQorCXJldHVybiAoaW5kZXgpOw0KK30NCisNCisNCitXb3JkMzIgcXVhbnRfNHBfNE4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNCpOKSsxIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovDQorCQlXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8NCisJCVdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLw0KKwkJV29yZDE2IHBvczQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDQgICAgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBuYl9wb3M7DQorCVdvcmQzMiBpbmRleDsNCisNCisJbmJfcG9zID0gMSA8PCAoTiAtIDEpOyAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDwoTi0xKSk7ICAqLw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFF1YW50aXphdGlvbiBvZiA0IHB1bHNlcyB3aXRoIDQqTisxIGJpdHM6ICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJaWYgKCgocG9zMSBeIHBvczIpICYgbmJfcG9zKSA9PSAwKQ0KKwl7DQorCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovDQorCQkvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsJICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7ICANCisJCS8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoMipOKTsgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8ycF8yTjEocG9zMywgcG9zNCwgTikgPDwgKE4gPDwgMSkpKTsNCisJfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkNCisJew0KKwkJaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgKE4gLSAxKSk7DQorCQkvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsgIA0KKwkJLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8ICgyKk4pOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MyLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOw0KKwl9IGVsc2UNCisJew0KKwkJaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4gLSAxKSk7DQorCQkvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsgIA0KKwkJLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8ICgyKk4pOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MxLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOw0KKwl9DQorCXJldHVybiAoaW5kZXgpOw0KK30NCisNCisNCitXb3JkMzIgcXVhbnRfNHBfNE4oICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiA0Kk4gYml0cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjQgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBuYl9wb3MsIG1hc2ssIG5fMSwgdG1wOw0KKwlXb3JkMTYgcG9zQVs0XSwgcG9zQls0XTsNCisJV29yZDMyIGksIGosIGssIGluZGV4Ow0KKw0KKwluXzEgPSAoV29yZDE2KSAoTiAtIDEpOyAgICAgICAgICAgICAgICANCisJbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8NCisJbWFzayA9IHZvX3N1YigoMSA8PCBOKSwgMSk7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8NCisNCisJaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQ0KKwl7DQorCQlpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkNCisJCXsNCisJCQlwb3NBW2krK10gPSBwb3Nba107ICAgICAgICAgICAgDQorCQl9IGVsc2UNCisJCXsNCisJCQlwb3NCW2orK10gPSBwb3Nba107ICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJc3dpdGNoIChpKQ0KKwl7DQorCQljYXNlIDA6DQorCQkJdG1wID0gdm9fc3ViKChOIDw8IDIpLCAzKTsgICAgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDQqTiktMyk7ICovDQorCQkJaW5kZXggPSAoMUwgPDwgdG1wKTsNCisJCQkvKiBpbmRleCArPSBxdWFudF80cF80TjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgcG9zQlszXSwgbl8xKTsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF80cF80TjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgcG9zQlszXSwgbl8xKSk7DQorCQkJYnJlYWs7DQorCQljYXNlIDE6DQorCQkJLyogaW5kZXggPSBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpIDw8ICgoMypuXzEpKzEpOyAqLw0KKwkJCXRtcCA9IGFkZDEoKFdvcmQxNikoKHZvX0xfbXVsdCgzLCBuXzEpID4+IDEpKSwgMSk7DQorCQkJaW5kZXggPSBMX3NobChxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpLCB0bXApOw0KKwkJCS8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpKTsNCisJCQlicmVhazsNCisJCWNhc2UgMjoNCisJCQl0bXAgPSAoKG5fMSA8PCAxKSArIDEpOyAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovDQorCQkJaW5kZXggPSBMX3NobChxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSwgdG1wKTsNCisJCQkvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKTsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKSk7DQorCQkJYnJlYWs7DQorCQljYXNlIDM6DQorCQkJLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCBOOyAqLw0KKwkJCWluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIE4pOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgNDoNCisJCQlpbmRleCA9IHF1YW50XzRwXzROMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBwb3NBWzNdLCBuXzEpOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlpbmRleCA9IDA7DQorCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF80cF80TlxuIik7DQorCX0NCisJdG1wID0gKChOIDw8IDIpIC0gMik7ICAgICAgICAgICAgICAgLyogaW5kZXggKz0gKGkgJiAzKSA8PCAoKDQqTiktMik7ICovDQorCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIExfc2hsKChMX2RlcG9zaXRfbChpKSAmICgzTCkpLCB0bXApKTsNCisNCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KKw0KK1dvcmQzMiBxdWFudF81cF81TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDUqTiBiaXRzICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNSAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG5iX3Bvcywgbl8xLCB0bXA7DQorCVdvcmQxNiBwb3NBWzVdLCBwb3NCWzVdOw0KKwlXb3JkMzIgaSwgaiwgaywgaW5kZXgsIHRtcDI7DQorDQorCW5fMSA9IChXb3JkMTYpIChOIC0gMSk7ICAgICAgICAgICAgICAgIA0KKwluYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLw0KKw0KKwlpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoayA9IDA7IGsgPCA1OyBrKyspDQorCXsNCisJCWlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQ0KKwkJew0KKwkJCXBvc0FbaSsrXSA9IHBvc1trXTsgICAgICAgICAgICANCisJCX0gZWxzZQ0KKwkJew0KKwkJCXBvc0JbaisrXSA9IHBvc1trXTsgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwlzd2l0Y2ggKGkpDQorCXsNCisJCWNhc2UgMDoNCisJCQl0bXAgPSB2b19zdWIoKFdvcmQxNikoKHZvX0xfbXVsdCg1LCBOKSA+PiAxKSksIDEpOyAgICAgICAgLyogKCg1Kk4pLTEpKSAqLw0KKwkJCWluZGV4ID0gTF9zaGwoMUwsIHRtcCk7ICAgLyogaW5kZXggPSAxIDw8ICgoNSpOKS0xKTsgKi8NCisJCQl0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsqLw0KKwkJCXRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQls0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0JbNF0sIE4pOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSAxOg0KKwkJCXRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLw0KKwkJCWluZGV4ID0gTF9zaGwoMUwsIHRtcCk7DQorCQkJdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwoKDIqTikrMSk7ICAqLw0KKwkJCXRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQVswXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0FbMF0sIE4pOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSAyOg0KKwkJCXRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiAoKDUqTiktMSkpICovDQorCQkJaW5kZXggPSBMX3NobCgxTCwgdG1wKTsgICAgICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLw0KKwkJCXRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8NCisJCQl0bXAyID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSksIHRtcCk7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBOKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgMzoNCisJCQl0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8NCisJCQlpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgTik7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDQ6DQorCQkJdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovDQorCQkJaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQlswXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0JbMF0sIE4pOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSA1Og0KKwkJCXRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLw0KKwkJCWluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0FbNF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NBWzRdLCBOKTsgKi8NCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJaW5kZXggPSAwOw0KKwkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNXBfNU5cbiIpOw0KKwl9DQorDQorCXJldHVybiAoaW5kZXgpOw0KK30NCisNCisNCitXb3JkMzIgcXVhbnRfNnBfNk5fMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNipOKS0yIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjYgICovDQorCQlXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCit7DQorCVdvcmQxNiBuYl9wb3MsIG5fMTsNCisJV29yZDE2IHBvc0FbNl0sIHBvc0JbNl07DQorCVdvcmQzMiBpLCBqLCBrLCBpbmRleDsNCisNCisJLyogISEgIE4gYW5kIG5fMSBhcmUgY29uc3RhbnRzIC0+IGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBvcGVyYXRlZCBieSBCYXNpYyBPcGVyYXRvcnMgKi8NCisJbl8xID0gKFdvcmQxNikgKE4gLSAxKTsgICAgICAgICAgICAgICAgDQorCW5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovDQorDQorCWkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlqID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChrID0gMDsgayA8IDY7IGsrKykNCisJew0KKwkJaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApDQorCQl7DQorCQkJcG9zQVtpKytdID0gcG9zW2tdOyAgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJcG9zQltqKytdID0gcG9zW2tdOyAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCXN3aXRjaCAoaSkNCisJew0KKwkJY2FzZSAwOg0KKwkJCWluZGV4ID0gKDEgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOKSk7IC8qIGluZGV4ICs9IHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTjsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzVdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbNV0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDE6DQorCQkJaW5kZXggPSAoMUwgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOKSk7IC8qIGluZGV4ICs9IHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTjsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDI6DQorCQkJaW5kZXggPSAoMUwgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8NCisJCQkvKiBpbmRleCArPSBxdWFudF80cF80Tihwb3NCLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF80cF80Tihwb3NCLCBuXzEpIDw8IChXb3JkMTYpICgyICogbl8xICsgMSkpKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDM6DQorCQkJaW5kZXggPSAocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKFdvcmQxNikgKDMgKiBuXzEgKyAxKSk7ICAgIA0KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMypuXzEpKzEpOyAqLw0KKwkJCWluZGV4ID12b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOyAgICAgDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDQ6DQorCQkJaSA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWluZGV4ID0gKHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKFdvcmQxNikgKDIgKiBuXzEgKyAxKSk7ICAvKiBpbmRleCA9IHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovDQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSkpOyAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSA1Og0KKwkJCWkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDY6DQorCQkJaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NBWzVdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQlkZWZhdWx0Og0KKwkJCWluZGV4ID0gMDsNCisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzZwXzZOXzJcbiIpOw0KKwl9DQorCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsICgoTF9kZXBvc2l0X2woaSkgJiAzTCkgPDwgKFdvcmQxNikgKDYgKiBOIC0gNCkpKTsgICAvKiBpbmRleCArPSAoaSAmIDMpIDw8ICgoNipOKS00KTsgKi8NCisNCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcWlzZl9ucy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMGE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcWlzZl9ucy5jCkBAIC0wLDAgKzEsMTExIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogcWlzZl9ucy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjogQ29kaW5nL0RlY29kaW5nIG9mIElTRiBwYXJhbWV0ZXJzIGZvciBiYWNrZ3JvdW5kIG5vaXNlLioNCisqICAgICAgICAgICAgICAgICAgICBUaGUgSVNGIHZlY3RvciBpcyBxdWFudGl6ZWQgdXNpbmcgVlEgd2l0aCBzcGxpdC1ieS01ICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAicWlzZl9ucy50YWIiICAgICAgICAgICAgICAgICAgICAgLyogQ29kZWJvb2tzIG9mIElTRnMgKi8NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqIHJvdXRpbmU6ICAgUWlzZl9ucygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICB+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQordm9pZCBRaXNmX25zKA0KKwkJV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kaWNlICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDE2IGk7DQorCVdvcmQzMiB0bXA7DQorDQorCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpXSA9IHN1Yihpc2YxW2ldLCBtZWFuX2lzZl9ub2lzZVtpXSk7ICAgICANCisJfQ0KKw0KKwlpbmRpY2VbMF0gPSBTdWJfVlEoJmlzZl9xWzBdLCBkaWNvMV9pc2Zfbm9pc2UsIDIsIFNJWkVfQktfTk9JU0UxLCAmdG1wKTsgICAgDQorCWluZGljZVsxXSA9IFN1Yl9WUSgmaXNmX3FbMl0sIGRpY28yX2lzZl9ub2lzZSwgMywgU0laRV9CS19OT0lTRTIsICZ0bXApOyAgICANCisJaW5kaWNlWzJdID0gU3ViX1ZRKCZpc2ZfcVs1XSwgZGljbzNfaXNmX25vaXNlLCAzLCBTSVpFX0JLX05PSVNFMywgJnRtcCk7ICAgIA0KKwlpbmRpY2VbM10gPSBTdWJfVlEoJmlzZl9xWzhdLCBkaWNvNF9pc2Zfbm9pc2UsIDQsIFNJWkVfQktfTk9JU0U0LCAmdG1wKTsgICAgDQorCWluZGljZVs0XSA9IFN1Yl9WUSgmaXNmX3FbMTJdLCBkaWNvNV9pc2Zfbm9pc2UsIDQsIFNJWkVfQktfTk9JU0U1LCAmdG1wKTsgICANCisNCisJLyogZGVjb2RpbmcgdGhlIElTRnMgKi8NCisNCisJRGlzZl9ucyhpbmRpY2UsIGlzZl9xKTsNCisNCisJcmV0dXJuOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiAgIERpc2ZfbnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgfn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIERlY29kaW5nIG9mIElTRiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgIGluZGljZVtdIDogaW5kaWNlcyBvZiB0aGUgc2VsZWN0ZWQgY29kZWJvb2sgZW50cmllcyAgICAgICAgICAgICoNCisqICAgIGlzZltdICAgIDogcXVhbnRpemVkIElTRnMgKGluIGZyZXF1ZW5jeSBkb21haW4pICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQordm9pZCBEaXNmX25zKA0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9xICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgICovDQorCSAgICApDQorew0KKwlXb3JkMTYgaTsNCisNCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykNCisJew0KKwkJaXNmX3FbaV0gPSBkaWNvMV9pc2Zfbm9pc2VbaW5kaWNlWzBdICogMiArIGldOyAgDQorCX0NCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykNCisJew0KKwkJaXNmX3FbaSArIDJdID0gZGljbzJfaXNmX25vaXNlW2luZGljZVsxXSAqIDMgKyBpXTsgICAgICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpICsgNV0gPSBkaWNvM19pc2Zfbm9pc2VbaW5kaWNlWzJdICogMyArIGldOyAgICAgIA0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspDQorCXsNCisJCWlzZl9xW2kgKyA4XSA9IGRpY280X2lzZl9ub2lzZVtpbmRpY2VbM10gKiA0ICsgaV07ICAgICAgDQorCX0NCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykNCisJew0KKwkJaXNmX3FbaSArIDEyXSA9IGRpY281X2lzZl9ub2lzZVtpbmRpY2VbNF0gKiA0ICsgaV07ICAgICANCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykNCisJew0KKwkJaXNmX3FbaV0gPSBhZGQoaXNmX3FbaV0sIG1lYW5faXNmX25vaXNlW2ldKTsgICANCisJfQ0KKw0KKwlSZW9yZGVyX2lzZihpc2ZfcSwgSVNGX0dBUCwgT1JERVIpOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2VkYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jCkBAIC0wLDAgKzEsNTQyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogYXBpc2ZfMnMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IENvZGluZy9EZWNvZGVpbmcgb2YgSVNGIHBhcmFtZXRlcnMgd2l0aCBwcmVkaWNhdGlvbg0KKyogICAgICAgVGhlIElTRiB2ZWN0b3IgaXMgcXVhbnRpemVkIHVzaW5nIHR3by1zdGFnZSBWUSB3aXRoIHNwbGl0LWJ5LTIgKg0KKyogICAgICAgaW4gMXN0IHN0YWdlIGFuZCBzcGxpdC1ieS01KG9yIDMpIGluIHRoZSBzZWNvbmQgc3RhZ2UgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgInFwaXNmXzJzLnRhYiIgICAgICAgICAgICAgICAgICAgIC8qIENvZGVib29rcyBvZiBpc2ZzICovDQorDQorI2RlZmluZSBNVSAgICAgICAgIDEwOTIzICAgICAgICAgICAgICAgICAgIC8qIFByZWRpY3Rpb24gZmFjdG9yICAgKDEuMC8zLjApIGluIFExNSAqLw0KKyNkZWZpbmUgTl9TVVJWX01BWCA0ICAgICAgICAgICAgICAgICAgICAgICAvKiA0IHN1cnZpdm9ycyBtYXggKi8NCisjZGVmaW5lIEFMUEhBICAgICAgMjk0OTEgICAgICAgICAgICAgICAgICAgLyogMC4gOSBpbiBRMTUgICAgICovDQorI2RlZmluZSBPTkVfQUxQSEEgKDMyNzY4LUFMUEhBKSAgICAgICAgICAgIC8qICgxLjAgLSBBTFBIQSkgaW4gUTE1ICovDQorDQorLyogcHJpdmF0ZSBmdW5jdGlvbnMgKi8NCitzdGF0aWMgdm9pZCBWUV9zdGFnZTEoDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogSVNGIHJlc2lkdWFsIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGRpY28sICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBxdWFudGl6YXRpb24gY29kZWJvb2sgICAgICAgICAqLw0KKwkJV29yZDE2IGRpbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGRpbWVudGlvbiBvZiB2ZWN0b3IgICAgICAgICAgICovDQorCQlXb3JkMTYgZGljb19zaXplLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc2l6ZSBvZiBxdWFudGl6YXRpb24gY29kZWJvb2sgKi8NCisJCVdvcmQxNiAqIGluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBpbmRpY2VzIG9mIHN1cnZpdm9ycyAgICAgICAgICAqLw0KKwkJV29yZDE2IHN1cnYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG51bWJlciBvZiBzdXJ2aXZvciAgICAgICAgICAgICovDQorCQkpOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICAgUXBpc2ZfMnNfNDZCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IFF1YW50aXphdGlvbiBvZiBpc2YgcGFyYW1ldGVycyB3aXRoIHByZWRpY3Rpb24uICg0NiBiaXRzKSAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogVGhlIGlzZiB2ZWN0b3IgaXMgcXVhbnRpemVkIHVzaW5nIHR3by1zdGFnZSBWUSB3aXRoIHNwbGl0LWJ5LTIgaW4gICAgICAgKg0KKyogIDFzdCBzdGFnZSBhbmQgc3BsaXQtYnktNSBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIFFwaXNmXzJzXzQ2YigNCisJCVdvcmQxNiAqIGlzZjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogcXVhbnRpemVkIElTRiAgICAgICAgICAgICAgICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBwYXN0X2lzZnEsICAgICAgICAgICAgICAgICAgIC8qIChpbylRMTUgOiBwYXN0IElTRiBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG5iX3N1cnYgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbnVtYmVyIG9mIHN1cnZpdm9yICgxLCAyLCAzIG9yIDQpICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgdG1wX2luZFs1XTsNCisJV29yZDE2IHN1cnYxW05fU1VSVl9NQVhdOyAgICAgICAgICAgICAgLyogaW5kaWNlcyBvZiBzdXJ2aXZvcnMgZnJvbSAxc3Qgc3RhZ2UgKi8NCisJV29yZDMyIGksIGssIHRlbXAsIG1pbl9lcnIsIGRpc3RhbmNlOw0KKwlXb3JkMTYgaXNmW09SREVSXTsNCisJV29yZDE2IGlzZl9zdGFnZTJbT1JERVJdOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykNCisJew0KKwkJaXNmW2ldID0gdm9fc3ViKGlzZjFbaV0sIG1lYW5faXNmW2ldKTsNCisJCWlzZltpXSA9IHZvX3N1Yihpc2ZbaV0sIHZvX211bHQoTVUsIHBhc3RfaXNmcVtpXSkpOyANCisJfQ0KKw0KKwlWUV9zdGFnZTEoJmlzZlswXSwgZGljbzFfaXNmLCA5LCBTSVpFX0JLMSwgc3VydjEsIG5iX3N1cnYpOw0KKw0KKwlkaXN0YW5jZSA9IE1BWF8zMjsgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBuYl9zdXJ2OyBrKyspDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspDQorCQl7DQorCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbaV0sIGRpY28xX2lzZltpICsgc3VydjFba10gKiA5XSk7IA0KKwkJfQ0KKwkJdG1wX2luZFswXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlswXSwgZGljbzIxX2lzZiwgMywgU0laRV9CSzIxLCAmbWluX2Vycik7IA0KKwkJdGVtcCA9IG1pbl9lcnI7DQorCQl0bXBfaW5kWzFdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzNdLCBkaWNvMjJfaXNmLCAzLCBTSVpFX0JLMjIsICZtaW5fZXJyKTsgDQorCQl0ZW1wID0gdm9fTF9hZGQodGVtcCwgbWluX2Vycik7DQorCQl0bXBfaW5kWzJdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzZdLCBkaWNvMjNfaXNmLCAzLCBTSVpFX0JLMjMsICZtaW5fZXJyKTsgIA0KKwkJdGVtcCA9IHZvX0xfYWRkKHRlbXAsIG1pbl9lcnIpOw0KKw0KKwkJaWYodGVtcCA8IGRpc3RhbmNlKQ0KKwkJew0KKwkJCWRpc3RhbmNlID0gdGVtcDsgICAgICAgICAgICAgICANCisJCQlpbmRpY2VbMF0gPSBzdXJ2MVtrXTsgICAgICAgICAgDQorCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykNCisJCQl7DQorCQkJCWluZGljZVtpICsgMl0gPSB0bXBfaW5kW2ldOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKw0KKwlWUV9zdGFnZTEoJmlzZls5XSwgZGljbzJfaXNmLCA3LCBTSVpFX0JLMiwgc3VydjEsIG5iX3N1cnYpOw0KKw0KKwlkaXN0YW5jZSA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBuYl9zdXJ2OyBrKyspDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspDQorCQl7DQorCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbOSArIGldLCBkaWNvMl9pc2ZbaSArIHN1cnYxW2tdICogN10pOyAgICAgICANCisJCX0NCisNCisJCXRtcF9pbmRbMF0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbMF0sIGRpY28yNF9pc2YsIDMsIFNJWkVfQksyNCwgJm1pbl9lcnIpOw0KKwkJdGVtcCA9IG1pbl9lcnI7IA0KKwkJdG1wX2luZFsxXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlszXSwgZGljbzI1X2lzZiwgNCwgU0laRV9CSzI1LCAmbWluX2Vycik7DQorCQl0ZW1wID0gdm9fTF9hZGQodGVtcCwgbWluX2Vycik7DQorDQorCQlpZih0ZW1wIDwgZGlzdGFuY2UpDQorCQl7DQorCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIA0KKwkJCWluZGljZVsxXSA9IHN1cnYxW2tdOyAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQ0KKwkJCXsNCisJCQkJaW5kaWNlW2kgKyA1XSA9IHRtcF9pbmRbaV07DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCURwaXNmXzJzXzQ2YihpbmRpY2UsIGlzZl9xLCBwYXN0X2lzZnEsIGlzZl9xLCBpc2ZfcSwgMCwgMCk7DQorDQorCXJldHVybjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogICBRcGlzZl8yc18zNkIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogUXVhbnRpemF0aW9uIG9mIGlzZiBwYXJhbWV0ZXJzIHdpdGggcHJlZGljdGlvbi4gKDM2IGJpdHMpICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBUaGUgaXNmIHZlY3RvciBpcyBxdWFudGl6ZWQgdXNpbmcgdHdvLXN0YWdlIFZRIHdpdGggc3BsaXQtYnktMiBpbiAgICAgICAgICAqDQorKiAgMXN0IHN0YWdlIGFuZCBzcGxpdC1ieS0zIGluIHRoZSBzZWNvbmQgc3RhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgUXBpc2ZfMnNfMzZiKA0KKwkJV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogKGlvKVExNSA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbmJfc3VydiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBudW1iZXIgb2Ygc3Vydml2b3IgKDEsIDIsIDMgb3IgNCkgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiBpLCBrLCB0bXBfaW5kWzVdOw0KKwlXb3JkMTYgc3VydjFbTl9TVVJWX01BWF07ICAgICAgICAgICAgICAvKiBpbmRpY2VzIG9mIHN1cnZpdm9ycyBmcm9tIDFzdCBzdGFnZSAqLw0KKwlXb3JkMzIgdGVtcCwgbWluX2VyciwgZGlzdGFuY2U7DQorCVdvcmQxNiBpc2ZbT1JERVJdOw0KKwlXb3JkMTYgaXNmX3N0YWdlMltPUkRFUl07DQorDQorCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwl7DQorCQlpc2ZbaV0gPSB2b19zdWIoaXNmMVtpXSwgbWVhbl9pc2ZbaV0pOw0KKwkJaXNmW2ldID0gdm9fc3ViKGlzZltpXSwgdm9fbXVsdChNVSwgcGFzdF9pc2ZxW2ldKSk7DQorCX0NCisNCisJVlFfc3RhZ2UxKCZpc2ZbMF0sIGRpY28xX2lzZiwgOSwgU0laRV9CSzEsIHN1cnYxLCBuYl9zdXJ2KTsNCisNCisJZGlzdGFuY2UgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBuYl9zdXJ2OyBrKyspDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspDQorCQl7DQorCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbaV0sIGRpY28xX2lzZltpICsgc3VydjFba10gKiA5XSk7IA0KKwkJfQ0KKw0KKwkJdG1wX2luZFswXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlswXSwgZGljbzIxX2lzZl8zNmIsIDUsIFNJWkVfQksyMV8zNmIsICZtaW5fZXJyKTsgICAgICAgIA0KKwkJdGVtcCA9IG1pbl9lcnI7ICAgICAgICAgICAgICAgICAgDQorCQl0bXBfaW5kWzFdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzVdLCBkaWNvMjJfaXNmXzM2YiwgNCwgU0laRV9CSzIyXzM2YiwgJm1pbl9lcnIpOyAgICAgICAgDQorCQl0ZW1wID0gdm9fTF9hZGQodGVtcCwgbWluX2Vycik7DQorDQorCQlpZih0ZW1wIDwgZGlzdGFuY2UpDQorCQl7DQorCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIA0KKwkJCWluZGljZVswXSA9IHN1cnYxW2tdOyAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQ0KKwkJCXsNCisJCQkJaW5kaWNlW2kgKyAyXSA9IHRtcF9pbmRbaV07DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCVZRX3N0YWdlMSgmaXNmWzldLCBkaWNvMl9pc2YsIDcsIFNJWkVfQksyLCBzdXJ2MSwgbmJfc3Vydik7DQorCWRpc3RhbmNlID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBuYl9zdXJ2OyBrKyspDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspDQorCQl7DQorCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbOSArIGldLCBkaWNvMl9pc2ZbaSArIHN1cnYxW2tdICogN10pOyAgICAgDQorCQl9DQorDQorCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjNfaXNmXzM2YiwgNywgU0laRV9CSzIzXzM2YiwgJm1pbl9lcnIpOyAgDQorCQl0ZW1wID0gbWluX2VycjsgICAgICAgICAgICAgICAgICANCisNCisJCWlmKHRlbXAgPCBkaXN0YW5jZSkNCisJCXsNCisJCQlkaXN0YW5jZSA9IHRlbXA7ICAgICAgICAgICAgICAgDQorCQkJaW5kaWNlWzFdID0gc3VydjFba107ICAgICAgICAgIA0KKwkJCWluZGljZVs0XSA9IHRtcF9pbmRbMF07ICAgICAgICANCisJCX0NCisJfQ0KKw0KKwlEcGlzZl8yc18zNmIoaW5kaWNlLCBpc2ZfcSwgcGFzdF9pc2ZxLCBpc2ZfcSwgaXNmX3EsIDAsIDApOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiBEcGlzZl8yc180NmIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IERlY29kaW5nIG9mIElTRiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgRHBpc2ZfMnNfNDZiKA0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgaW4gZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiBpLzAgICA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZm9sZCwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwYXN0IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZfYnVmLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaXNmIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBiZmksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBCYWQgZnJhbWUgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZW5jX2RlYw0KKwkJKQ0KK3sNCisJV29yZDE2IHJlZl9pc2ZbTV0sIHRtcDsNCisJV29yZDMyIGksIGosIExfdG1wOw0KKw0KKwlpZiAoYmZpID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHb29kIGZyYW1lICovDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspDQorCQl7DQorCQkJaXNmX3FbaV0gPSBkaWNvMV9pc2ZbaW5kaWNlWzBdICogOSArIGldOyAgICANCisJCX0NCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspDQorCQl7DQorCQkJaXNmX3FbaSArIDldID0gZGljbzJfaXNmW2luZGljZVsxXSAqIDcgKyBpXTsgICAgICAgDQorCQl9DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2ldID0gYWRkMShpc2ZfcVtpXSwgZGljbzIxX2lzZltpbmRpY2VbMl0gKiAzICsgaV0pOyAgIA0KKwkJCWlzZl9xW2kgKyAzXSA9IGFkZDEoaXNmX3FbaSArIDNdLCBkaWNvMjJfaXNmW2luZGljZVszXSAqIDMgKyBpXSk7ICANCisJCQlpc2ZfcVtpICsgNl0gPSBhZGQxKGlzZl9xW2kgKyA2XSwgZGljbzIzX2lzZltpbmRpY2VbNF0gKiAzICsgaV0pOyANCisJCQlpc2ZfcVtpICsgOV0gPSBhZGQxKGlzZl9xW2kgKyA5XSwgZGljbzI0X2lzZltpbmRpY2VbNV0gKiAzICsgaV0pOyANCisJCX0NCisNCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspDQorCQl7DQorCQkJaXNmX3FbaSArIDEyXSA9IGFkZDEoaXNmX3FbaSArIDEyXSwgZGljbzI1X2lzZltpbmRpY2VbNl0gKiA0ICsgaV0pOyAgDQorCQl9DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykNCisJCXsNCisJCQl0bXAgPSBpc2ZfcVtpXTsgICAgICAgICAgICAgICANCisJCQlpc2ZfcVtpXSA9IGFkZDEodG1wLCBtZWFuX2lzZltpXSk7ICANCisJCQlpc2ZfcVtpXSA9IGFkZDEoaXNmX3FbaV0sIHZvX211bHQoTVUsIHBhc3RfaXNmcVtpXSkpOw0KKwkJCXBhc3RfaXNmcVtpXSA9IHRtcDsgIA0KKwkJfQ0KKw0KKwkJaWYgKGVuY19kZWMpDQorCQl7DQorCQkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCQl7DQorCQkJCWZvciAoaiA9IChMX01FQU5CVUYgLSAxKTsgaiA+IDA7IGotLSkNCisJCQkJew0KKwkJCQkJaXNmX2J1ZltqICogTSArIGldID0gaXNmX2J1ZlsoaiAtIDEpICogTSArIGldOyANCisJCQkJfQ0KKwkJCQlpc2ZfYnVmW2ldID0gaXNmX3FbaV07IA0KKwkJCX0NCisJCX0NCisJfSBlbHNlDQorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhZCBmcmFtZSAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCXsNCisJCQlMX3RtcCA9IG1lYW5faXNmW2ldIDw8IDE0Ow0KKwkJCWZvciAoaiA9IDA7IGogPCBMX01FQU5CVUY7IGorKykNCisJCQl7DQorCQkJCUxfdG1wICs9IChpc2ZfYnVmW2ogKiBNICsgaV0gPDwgMTQpOw0KKwkJCX0NCisJCQlyZWZfaXNmW2ldID0gdm9fcm91bmQoTF90bXApOw0KKwkJfQ0KKw0KKwkJLyogdXNlIHRoZSBwYXN0IElTRnMgc2xpZ2h0bHkgc2hpZnRlZCB0b3dhcmRzIHRoZWlyIG1lYW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2ldID0gYWRkMSh2b19tdWx0KEFMUEhBLCBpc2ZvbGRbaV0pLCB2b19tdWx0KE9ORV9BTFBIQSwgcmVmX2lzZltpXSkpOyANCisJCX0NCisNCisJCS8qIGVzdGltYXRlIHBhc3QgcXVhbnRpemVkIHJlc2lkdWFsIHRvIGJlIHVzZWQgaW4gbmV4dCBmcmFtZSAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCQl7DQorCQkJdG1wID0gYWRkMShyZWZfaXNmW2ldLCB2b19tdWx0KHBhc3RfaXNmcVtpXSwgTVUpKTsgICAgICAvKiBwcmVkaWN0ZWQgSVNGICovDQorCQkJcGFzdF9pc2ZxW2ldID0gdm9fc3ViKGlzZl9xW2ldLCB0bXApOyANCisJCQlwYXN0X2lzZnFbaV0gPSAocGFzdF9pc2ZxW2ldID4+IDEpOyAgICAgICAgLyogcGFzdF9pc2ZxW2ldICo9IDAuNSAqLw0KKwkJfQ0KKwl9DQorDQorCVJlb3JkZXJfaXNmKGlzZl9xLCBJU0ZfR0FQLCBPUkRFUik7DQorCXJldHVybjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICAgRGlzZl8yc18zNmIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogRGVjb2Rpbmcgb2YgSVNGIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIERwaXNmXzJzXzM2YigNCisJCVdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6ZWQgSVNGIGluIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogaS8wICAgOiBwYXN0IElTRiBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZvbGQsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGFzdCBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX2J1ZiwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzZiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgYmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogQmFkIGZyYW1lIGluZGljYXRvciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGVuY19kZWMNCisJCSkNCit7DQorCVdvcmQxNiByZWZfaXNmW01dLCB0bXA7DQorCVdvcmQzMiBpLCBqLCBMX3RtcDsNCisNCisJaWYgKGJmaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR29vZCBmcmFtZSAqLw0KKwl7DQorCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2ldID0gZGljbzFfaXNmW2luZGljZVswXSAqIDkgKyBpXTsgICAgDQorCQl9DQorCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2kgKyA5XSA9IGRpY28yX2lzZltpbmRpY2VbMV0gKiA3ICsgaV07ICAgICAgIA0KKwkJfQ0KKw0KKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpXSA9IGFkZDEoaXNmX3FbaV0sIGRpY28yMV9pc2ZfMzZiW2luZGljZVsyXSAqIDUgKyBpXSk7ICAgICAgIA0KKwkJfQ0KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpICsgNV0gPSBhZGQxKGlzZl9xW2kgKyA1XSwgZGljbzIyX2lzZl8zNmJbaW5kaWNlWzNdICogNCArIGldKTsgICAgICAgIA0KKwkJfQ0KKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpICsgOV0gPSBhZGQxKGlzZl9xW2kgKyA5XSwgZGljbzIzX2lzZl8zNmJbaW5kaWNlWzRdICogNyArIGldKTsgICAgICAgDQorCQl9DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykNCisJCXsNCisJCQl0bXAgPSBpc2ZfcVtpXTsNCisJCQlpc2ZfcVtpXSA9IGFkZDEodG1wLCBtZWFuX2lzZltpXSk7ICAgDQorCQkJaXNmX3FbaV0gPSBhZGQxKGlzZl9xW2ldLCB2b19tdWx0KE1VLCBwYXN0X2lzZnFbaV0pKTsgICANCisJCQlwYXN0X2lzZnFbaV0gPSB0bXA7ICAgICAgICAgICANCisJCX0NCisNCisNCisJCWlmIChlbmNfZGVjKQ0KKwkJew0KKwkJCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCQkJew0KKwkJCQlmb3IgKGogPSAoTF9NRUFOQlVGIC0gMSk7IGogPiAwOyBqLS0pDQorCQkJCXsNCisJCQkJCWlzZl9idWZbaiAqIE0gKyBpXSA9IGlzZl9idWZbKGogLSAxKSAqIE0gKyBpXTsgICAgICANCisJCQkJfQ0KKwkJCQlpc2ZfYnVmW2ldID0gaXNmX3FbaV07ICAgIA0KKwkJCX0NCisJCX0NCisJfSBlbHNlDQorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhZCBmcmFtZSAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCXsNCisJCQlMX3RtcCA9IChtZWFuX2lzZltpXSA8PCAxNCk7DQorCQkJZm9yIChqID0gMDsgaiA8IExfTUVBTkJVRjsgaisrKQ0KKwkJCXsNCisJCQkJTF90bXAgKz0gKGlzZl9idWZbaiAqIE0gKyBpXSA8PCAxNCk7DQorCQkJfQ0KKwkJCXJlZl9pc2ZbaV0gPSB2b19yb3VuZChMX3RtcCk7ICAgIA0KKwkJfQ0KKw0KKwkJLyogdXNlIHRoZSBwYXN0IElTRnMgc2xpZ2h0bHkgc2hpZnRlZCB0b3dhcmRzIHRoZWlyIG1lYW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2ldID0gYWRkMSh2b19tdWx0KEFMUEhBLCBpc2ZvbGRbaV0pLCB2b19tdWx0KE9ORV9BTFBIQSwgcmVmX2lzZltpXSkpOyAgICAgICAgDQorCQl9DQorDQorCQkvKiBlc3RpbWF0ZSBwYXN0IHF1YW50aXplZCByZXNpZHVhbCB0byBiZSB1c2VkIGluIG5leHQgZnJhbWUgKi8NCisJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwkJew0KKwkJCXRtcCA9IGFkZDEocmVmX2lzZltpXSwgdm9fbXVsdChwYXN0X2lzZnFbaV0sIE1VKSk7ICAgICAgLyogcHJlZGljdGVkIElTRiAqLw0KKwkJCXBhc3RfaXNmcVtpXSA9IHZvX3N1Yihpc2ZfcVtpXSwgdG1wKTsgIA0KKwkJCXBhc3RfaXNmcVtpXSA9IHBhc3RfaXNmcVtpXSA+PiAxOyAgICAgICAgIC8qIHBhc3RfaXNmcVtpXSAqPSAwLjUgKi8NCisJCX0NCisJfQ0KKw0KKwlSZW9yZGVyX2lzZihpc2ZfcSwgSVNGX0dBUCwgT1JERVIpOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiAgUmVvcmRlcl9pc2YoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSAgaXNmcyBhcmUgcHJvcGVybHkgb3JkZXIgYW5kIHRvICAgICAgICoNCisqICAgICAgICAgICAgICBrZWVwIGEgY2VydGFpbiBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUgaXNmcy4gICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICAgQXJndW1lbnQgICAgICAgICBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgIGluL291dCAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgaXNmW10gICAgICAgICAgIHZlY3RvciBvZiBpc2ZzICAgICAgICAgICAgICAgICAgICBpL28gICAgICAgICAgICAgICAgKg0KKyogICAgIG1pbl9kaXN0ICAgICAgICBtaW5pbXVtIHJlcXVpcmVkIGRpc3RhbmNlICAgICAgICAgaSAgICAgICAgICAgICAgICAgICoNCisqICAgICBuICAgICAgICAgICAgICAgTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIFJlb3JkZXJfaXNmKA0KKwkJV29yZDE2ICogaXNmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBRMTU6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2IG1pbl9kaXN0LCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1ICA6IG1pbmltdW0gZGlzdGFuY2UgdG8ga2VlcCAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgICA6IG51bWJlciBvZiBJU0YgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGk7IA0KKwlXb3JkMTYgaXNmX21pbjsNCisNCisJaXNmX21pbiA9IG1pbl9kaXN0OyAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBuIC0gMTsgaSsrKQ0KKwl7DQorCQlpZihpc2ZbaV0gPCBpc2ZfbWluKQ0KKwkJew0KKwkJCWlzZltpXSA9IGlzZl9taW47ICAgICAgICAgICAgICANCisJCX0NCisJCWlzZl9taW4gPSAoaXNmW2ldICsgbWluX2Rpc3QpOw0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorV29yZDE2IFN1Yl9WUSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcmV0dXJuIHF1YW50aXphdGlvbiBpbmRleCAgICAgKi8NCisJCVdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgcmVzaWR1YWwgdmVjdG9yICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZGljbywgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHF1YW50aXphdGlvbiBjb2RlYm9vayAgICAgICAgICovDQorCQlXb3JkMTYgZGltLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZGltZW50aW9uIG9mIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiBkaWNvX3NpemUsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaXplIG9mIHF1YW50aXphdGlvbiBjb2RlYm9vayAqLw0KKwkJV29yZDMyICogZGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGVycm9yIG9mIHF1YW50aXphdGlvbiAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDE2IHRlbXAsICpwX2RpY287DQorCVdvcmQzMiBpLCBqLCBpbmRleDsNCisJV29yZDMyIGRpc3RfbWluLCBkaXN0Ow0KKw0KKwlkaXN0X21pbiA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgICANCisJcF9kaWNvID0gZGljbzsgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWluZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgZGljb19zaXplOyBpKyspDQorCXsNCisJCWRpc3QgPSAwOyAgDQorDQorCQlmb3IgKGogPSAwOyBqIDwgZGltOyBqKyspDQorCQl7DQorCQkJdGVtcCA9IHhbal0gLSAoKnBfZGljbysrKTsNCisJCQlkaXN0ICs9ICh0ZW1wICogdGVtcCk8PDE7DQorCQl9DQorDQorCQlpZihkaXN0IDwgZGlzdF9taW4pDQorCQl7DQorCQkJZGlzdF9taW4gPSBkaXN0OyAgICAgICAgICAgICAgIA0KKwkJCWluZGV4ID0gaTsgICAgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwkqZGlzdGFuY2UgPSBkaXN0X21pbjsgICAgICAgICAgICAgICAgICANCisNCisJLyogUmVhZGluZyB0aGUgc2VsZWN0ZWQgdmVjdG9yICovDQorCXBfZGljbyA9ICZkaWNvW2luZGV4ICogZGltXTsgICAgICAgICAgIA0KKwlmb3IgKGogPSAwOyBqIDwgZGltOyBqKyspDQorCXsNCisJCXhbal0gPSAqcF9kaWNvKys7ICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJcmV0dXJuIGluZGV4Ow0KK30NCisNCisNCitzdGF0aWMgdm9pZCBWUV9zdGFnZTEoDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogSVNGIHJlc2lkdWFsIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGRpY28sICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBxdWFudGl6YXRpb24gY29kZWJvb2sgICAgICAgICAqLw0KKwkJV29yZDE2IGRpbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGRpbWVudGlvbiBvZiB2ZWN0b3IgICAgICAgICAgICovDQorCQlXb3JkMTYgZGljb19zaXplLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc2l6ZSBvZiBxdWFudGl6YXRpb24gY29kZWJvb2sgKi8NCisJCVdvcmQxNiAqIGluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBpbmRpY2VzIG9mIHN1cnZpdm9ycyAgICAgICAgICAqLw0KKwkJV29yZDE2IHN1cnYgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG51bWJlciBvZiBzdXJ2aXZvciAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgdGVtcCwgKnBfZGljbzsNCisJV29yZDMyIGksIGosIGssIGw7DQorCVdvcmQzMiBkaXN0X21pbltOX1NVUlZfTUFYXSwgZGlzdDsNCisNCisJZGlzdF9taW5bMF0gPSBNQVhfMzI7DQorCWRpc3RfbWluWzFdID0gTUFYXzMyOw0KKwlkaXN0X21pblsyXSA9IE1BWF8zMjsNCisJZGlzdF9taW5bM10gPSBNQVhfMzI7DQorCWluZGV4WzBdID0gMDsNCisJaW5kZXhbMV0gPSAxOw0KKwlpbmRleFsyXSA9IDI7DQorCWluZGV4WzNdID0gMzsNCisNCisJcF9kaWNvID0gZGljbzsgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoaSA9IDA7IGkgPCBkaWNvX3NpemU7IGkrKykNCisJew0KKwkJZGlzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWZvciAoaiA9IDA7IGogPCBkaW07IGorKykNCisJCXsNCisJCQl0ZW1wID0geFtqXSAtICAoKnBfZGljbysrKTsNCisJCQlkaXN0ICs9ICh0ZW1wICogdGVtcCk8PDE7DQorCQl9DQorDQorCQlmb3IgKGsgPSAwOyBrIDwgc3VydjsgaysrKQ0KKwkJew0KKwkJCWlmKGRpc3QgPCBkaXN0X21pbltrXSkNCisJCQl7DQorCQkJCWZvciAobCA9IHN1cnYgLSAxOyBsID4gazsgbC0tKQ0KKwkJCQl7DQorCQkJCQlkaXN0X21pbltsXSA9IGRpc3RfbWluW2wgLSAxXTsgICAgICANCisJCQkJCWluZGV4W2xdID0gaW5kZXhbbCAtIDFdOyAgICANCisJCQkJfQ0KKwkJCQlkaXN0X21pbltrXSA9IGRpc3Q7ICAgICAgICANCisJCQkJaW5kZXhba10gPSBpOyAgICAgICAgICAgICAgDQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmFuZG9tLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWE4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3JhbmRvbS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiByYW5kb20uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogU2lnbmVkIDE2IGJpdHMgcmFuZG9tIGdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQorV29yZDE2IFJhbmRvbShXb3JkMTYgKiBzZWVkKQ0KK3sNCisJLyogc3RhdGljIFdvcmQxNiBzZWVkID0gMjE4NDU7ICovDQorCSpzZWVkID0gKFdvcmQxNikoTF9hZGQoKExfbXVsdCgqc2VlZCwgMzE4MjEpID4+IDEpLCAxMzg0OUwpKTsNCisJcmV0dXJuICgqc2VlZCk7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Mjk4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRmlsZTogcmVzaWR1LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgRGVzY3JpcHRpb246IENvbXB1dGUgdGhlIExQQyByZXNpZHVhbCBieSBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICB0aGUgaW5wdXQgc3BlZWNoIHRocm91Z2ggQSh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQordm9pZCBSZXNpZHUoDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzcGVlY2ggKHZhbHVlcyB4Wy1tLi4tMV0gYXJlIG5lZWRlZCAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSB4MiAgOiByZXNpZHVhbCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgaSwqcDEsICpwMjsNCisJV29yZDMyIHM7DQorCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQ0KKwl7DQorCQlwMSA9IGE7DQorCQlwMiA9ICZ4W2ldOw0KKwkJcyAgPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKSwgKCpwMikpOw0KKw0KKwkJcyA9IExfc2hsMihzLCA1KTsgDQorCQl5W2ldID0gZXh0cmFjdF9oKExfYWRkKHMsIDB4ODAwMCkpOw0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDAxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMKQEAgLTAsMCArMSw1NyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IHNjYWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOiBTY2FsZSBzaWduYWwgdG8gZ2V0IG1heGltdW0gb2YgZHluYW1pYyAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCit2b2lkIFNjYWxlX3NpZygNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBzaWduYWwgdG8gc2NhbGUgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNpemUgb2YgeFtdICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhwb25lbnQ6IHggPSByb3VuZCh4IDw8IGV4cCkgKi8NCisJICAgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisJaWYoZXhwID4gMCkNCisJew0KKwkJZm9yIChpID0gbGcgLSAxIDsgaSA+PSAwOyBpLS0pDQorCQl7DQorCQkJTF90bXAgPSBMX3NobDIoeFtpXSwgMTYgKyBleHApOyAgDQorCQkJeFtpXSA9IGV4dHJhY3RfaChMX2FkZChMX3RtcCwgMHg4MDAwKSk7ICAgICAgICAgICAgDQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlleHAgPSAtZXhwOw0KKwkJZm9yIChpID0gbGcgLSAxOyBpID49IDA7IGktLSkNCisJCXsNCisJCQlMX3RtcCA9IHhbaV0gPDwgMTY7DQorCQkJTF90bXAgPj49IGV4cDsgDQorCQkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwODIzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMKQEAgLTAsMCArMSw1OCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IHN0cmVhbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOiBWT01FIEFQSSBCdWZmZXIgT3BlcmF0b3IgSW1wbGVtZW50IENvZGUgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInN0cmVhbS5oIg0KKw0KK3ZvaWQgdm9BV0JfSW5pdEZyYW1lQnVmZmVyKEZyYW1lU3RyZWFtICpzdHJlYW0pDQorew0KKwlzdHJlYW0tPnNldF9wdHIgPSBOVUxMOw0KKwlzdHJlYW0tPmZyYW1lX3B0cl9iayA9IHN0cmVhbS0+ZnJhbWVfcHRyOw0KKwlzdHJlYW0tPnNldF9sZW4gPSAwOw0KKwlzdHJlYW0tPmZyYW1lYnVmZmVyX2xlbiA9IDA7DQorCXN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4gPSAwOwkNCit9DQorDQordm9pZCB2b0FXQl9VcGRhdGVGcmFtZUJ1ZmZlcigNCisJCUZyYW1lU3RyZWFtICpzdHJlYW0sIA0KKwkJVk9fTUVNX09QRVJBVE9SICpwTWVtT1ANCisJCSkNCit7DQorCWludCAgbGVuOw0KKwlsZW4gID0gTUlOKEZyYW1lX01heHNpemUgLSBzdHJlYW0tPmZyYW1lX3N0b3JlbGVuLCBzdHJlYW0tPnNldF9sZW4pOw0KKwlwTWVtT1AtPkNvcHkoVk9fSU5ERVhfRU5DX0FNUldCLCBzdHJlYW0tPmZyYW1lX3B0cl9iayArIHN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4gLCBzdHJlYW0tPnNldF9wdHIsIGxlbik7DQorCXN0cmVhbS0+c2V0X2xlbiAtPSBsZW47DQorCXN0cmVhbS0+c2V0X3B0ciArPSBsZW47DQorCXN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuID0gc3RyZWFtLT5mcmFtZV9zdG9yZWxlbiArIGxlbjsNCisJc3RyZWFtLT5mcmFtZV9wdHIgPSBzdHJlYW0tPmZyYW1lX3B0cl9iazsNCisJc3RyZWFtLT51c2VkX2xlbiArPSBsZW47DQorfQ0KKw0KK3ZvaWQgdm9BV0JfRmx1c2hGcmFtZUJ1ZmZlcihGcmFtZVN0cmVhbSAqc3RyZWFtKQ0KK3sNCisJc3RyZWFtLT5zZXRfcHRyID0gTlVMTDsNCisJc3RyZWFtLT5mcmFtZV9wdHJfYmsgPSBzdHJlYW0tPmZyYW1lX3B0cjsNCisJc3RyZWFtLT5zZXRfbGVuID0gMDsNCisJc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gPSAwOw0KKwlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsJDQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFmYjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCkBAIC0wLDAgKzEsMTYwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogc3luX2ZpbHQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IERvIHRoZSBzeW50aGVzaXMgZmlsdGVyaW5nIDEvQSh6KSAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCit2b2lkIFN5bl9maWx0KA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG1lbVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLw0KKwkJV29yZDE2IHVwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogMD1ubyB1cGRhdGUsIDE9dXBkYXRlIG9mIG1lbW9yeS4gICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBpLCBhMDsNCisJV29yZDE2IHlfYnVmW0xfU1VCRlIxNmsgKyBNMTZrXTsNCisJV29yZDMyIExfdG1wOw0KKwlXb3JkMTYgKnl5LCAqcDEsICpwMjsNCisJeXkgPSAmeV9idWZbMF07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCS8qIGNvcHkgaW5pdGlhbCBmaWx0ZXIgc3RhdGVzIGludG8gc3ludGhlc2lzIGJ1ZmZlciAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykNCisJew0KKwkJKnl5KysgPSBtZW1baV07ICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlhMCA9IChhWzBdID4+IDEpOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IC8gMiAqLw0KKwkvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykNCisJew0KKwkJcDEgPSAmYVsxXTsNCisJCXAyID0gJnl5W2ktMV07DQorCQlMX3RtcCAgPSB2b19tdWx0MzIoYTAsIHhbaV0pOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJTF90bXAgLT0gdm9fbXVsdDMyKCgqcDEpLCAoKnAyKSk7DQorDQorCQlMX3RtcCA9IExfc2hsMihMX3RtcCwgNCk7DQorCQl5W2ldID0geXlbaV0gPSBleHRyYWN0X2goTF9hZGQoTF90bXAsIDB4ODAwMCkpOyAgDQorCX0NCisJLyogVXBkYXRlIG1lbW9yeSBpZiByZXF1aXJlZCAqLw0KKwlpZiAodXBkYXRlKQ0KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspDQorCQl7DQorCQkJbWVtW2ldID0geXlbbGcgLSAxNiArIGldOw0KKwkJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgU3luX2ZpbHRfMzIoDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgKi8NCisJCVdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUW5ldzogZXhjaXRhdGlvbiAoZXhjW2ldID4+IFFuZXcpICAgICovDQorCQlXb3JkMTYgUW5ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGMgc2NhbGluZyA9IDAobWluKSB0byA4KG1heCkgKi8NCisJCVdvcmQxNiBzaWdfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZ19sb1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGxvdyAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLGEwOw0KKwlXb3JkMzIgTF90bXAsIExfdG1wMTsNCisJV29yZDE2ICpwMSwgKnAyLCAqcDM7DQorCWEwID0gYVswXSA+PiAoNCArIFFuZXcpOyAgICAgICAgICAvKiBpbnB1dCAvIDE2IGFuZCA+PlFuZXcgKi8NCisJLyogRG8gdGhlIGZpbHRlcmluZy4gKi8NCisJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspDQorCXsNCisJCUxfdG1wICA9IDA7IA0KKwkJTF90bXAxID0gMDsNCisJCXAxID0gYTsNCisJCXAyID0gJnNpZ19sb1tpIC0gMV07DQorCQlwMyA9ICZzaWdfaGlbaSAtIDFdOw0KKw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKwkJTF90bXAgIC09IHZvX211bHQzMigoKnAyLS0pLCAoKnAxKSk7DQorCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOw0KKw0KKwkJTF90bXAgPSBMX3RtcCA+PiAxMTsgICAgICANCisJCUxfdG1wICs9IHZvX0xfbXVsdChleGNbaV0sIGEwKTsNCisNCisJCS8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLw0KKwkJTF90bXAgPSBMX3RtcCAtIChMX3RtcDE8PDEpOw0KKw0KKwkJTF90bXAgPSBMX3RtcCA+PiAzOyAgICAgICAgICAgLyogYWkgaW4gUTEyICovDQorCQlzaWdfaGlbaV0gPSBleHRyYWN0X2goTF90bXApOyAgICAgIA0KKw0KKwkJLyogc2lnX2xvID0gYml0NCB0byBiaXQxNSBvZiBzeW50aGVzaXMgKi8NCisJCUxfdG1wID4+PSA0OyAgICAgICAgICAgLyogNCA6IHNpZ19sb1tpXSA+PiA0ICovDQorCQlzaWdfbG9baV0gPSAoV29yZDE2KSgoTF90bXAgLSAoc2lnX2hpW2ldIDw8IDEzKSkpOyAgDQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3VwZHRfdGFyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3VwZHRfdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlNTY1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYwpAQCAtMCwwICsxLDQ5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogdXBkdF90YXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IFVwZGF0ZSB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgY29kZWJvb2sgc2VhcmNoICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KK3ZvaWQgVXBkdF90YXIoDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBvbGQgdGFyZ2V0IChmb3IgcGl0Y2ggc2VhcmNoKSAgICAgKi8NCisJCVdvcmQxNiAqIHgyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEwICA6IG5ldyB0YXJnZXQgKGZvciBjb2RlYm9vayBzZWFyY2gpICAqLw0KKwkJV29yZDE2ICogeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogZmlsdGVyZWQgYWRhcHRpdmUgY29kZWJvb2sgdmVjdG9yICovDQorCQlXb3JkMTYgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTQgOiBhZGFwdGl2ZSBjb2RlYm9vayBnYWluICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHN1YmZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgTF90bXA7DQorDQorCWZvciAoaSA9IDA7IGkgPCBMOyBpKyspDQorCXsNCisJCUxfdG1wID0geFtpXSA8PCAxNTsNCisJCUxfdG1wIC09ICh5W2ldICogZ2Fpbik8PDE7DQorCQl4MltpXSA9IGV4dHJhY3RfaChMX3NobDIoTF90bXAsIDEpKTsgDQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTQxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3V0aWwuYwpAQCAtMCwwICsxLDc0IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogdXRpbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IFJlc2V0IGFuZCBDb3B5IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICBTZXRfemVybygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IFNldCB2ZWN0b3IgeFtdIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIFNldF96ZXJvKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiB2ZWN0b3IgdG8gY2xlYXIgICAgICovDQorCQlXb3JkMTYgTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IGxlbmd0aCBvZiB2ZWN0b3IgICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMzIgbnVtID0gKFdvcmQzMilMOw0KKwlkb3sNCisJCSp4KysgPSAwOw0KKwl9d2hpbGUoLS1udW0gIT0wKTsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246IENvcHkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogQ29weSB2ZWN0b3IgeFtdIHRvIHlbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIENvcHkoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogaW5wdXQgdmVjdG9yICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgOiBvdXRwdXQgdmVjdG9yICAqLw0KKwkJV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHZlY3RvciBsZW5ndGggICovDQorCSApDQorew0KKwlXb3JkMzIJdGVtcDEsdGVtcDIsbnVtOw0KKwlpZihMJjEpDQorCXsNCisJCXRlbXAxID0gKngrKzsNCisJCSp5KysgPSB0ZW1wMTsNCisJfQ0KKwludW0gPSAoV29yZDMyKShMPj4xKTsNCisJdGVtcDEgPSAqeCsrOw0KKwl0ZW1wMiA9ICp4Kys7DQorCWRvew0KKwkJKnkrKyA9IHRlbXAxOw0KKwkJKnkrKyA9IHRlbXAyOw0KKwkJdGVtcDEgPSAqeCsrOw0KKwkJdGVtcDIgPSAqeCsrOw0KKwl9d2hpbGUoLS1udW0hPTApOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDk5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwpAQCAtMCwwICsxLDE5NDEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHZvQU1SV0JFbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBQZXJmb3JtcyB0aGUgbWFpbiBlbmNvZGVyIHJvdXRpbmUgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICBGaXhlZC1wb2ludCBDIHNpbXVsYXRpb24gb2YgQU1SIFdCIEFDRUxQIGNvZGluZyAgICAqDQorKgkJICAgIGFsZ29yaXRobSB3aXRoIDIwIG1zc3BlZWNoIGZyYW1lcyBmb3IgICAgICAgICAgICAgICoNCisqCQkgICAgd2lkZWJhbmQgc3BlZWNoIHNpZ25hbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgImNvZF9tYWluLmgiDQorI2luY2x1ZGUgImJpdHMuaCINCisjaW5jbHVkZSAibWFpbi5oIg0KKyNpbmNsdWRlICJ2b0FNUldCLmgiDQorI2luY2x1ZGUgIm1lbV9hbGlnbi5oIg0KKyNpbmNsdWRlICJjbW5NZW1vcnkuaCINCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisvKiBMUEMgaW50ZXJwb2xhdGlvbiBjb2VmIHswLjQ1LCAwLjgsIDAuOTYsIDEuMH07IGluIFExNSAqLw0KK3N0YXRpYyBXb3JkMTYgaW50ZXJwb2xfZnJhY1tOQl9TVUJGUl0gPSB7MTQ3NDYsIDI2MjE0LCAzMTQ1NywgMzI3Njd9Ow0KKw0KKy8qIGlzcCB0YWJsZXMgZm9yIGluaXRpYWxpemF0aW9uICovDQorc3RhdGljIFdvcmQxNiBpc3BfaW5pdFtNXSA9DQorew0KKwkzMjEzOCwgMzAyNzQsIDI3MjQ2LCAyMzE3MCwgMTgyMDUsIDEyNTQwLCA2MzkzLCAwLA0KKwktNjM5MywgLTEyNTQwLCAtMTgyMDUsIC0yMzE3MCwgLTI3MjQ2LCAtMzAyNzQsIC0zMjEzOCwgMTQ3NQ0KK307DQorDQorc3RhdGljIFdvcmQxNiBpc2ZfaW5pdFtNXSA9DQorew0KKwkxMDI0LCAyMDQ4LCAzMDcyLCA0MDk2LCA1MTIwLCA2MTQ0LCA3MTY4LCA4MTkyLA0KKwk5MjE2LCAxMDI0MCwgMTEyNjQsIDEyMjg4LCAxMzMxMiwgMTQzMzYsIDE1MzYwLCAzODQwDQorfTsNCisNCisvKiBIaWdoIEJhbmQgZW5jb2RpbmcgKi8NCitzdGF0aWMgY29uc3QgV29yZDE2IEhQX2dhaW5bMTZdID0NCit7DQorCTM2MjQsIDQ2NzMsIDU1OTcsIDY0NzksIDc0MjUsIDgzNzgsIDkzMjQsIDEwMjY0LA0KKwkxMTIxMCwgMTIyMDYsIDEzMzkxLCAxNDg0NCwgMTY3NzAsIDE5NjU1LCAyNDI4OSwgMzI3MjgNCit9Ow0KKw0KKy8qIFByaXZhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gKi8NCitzdGF0aWMgV29yZDE2IHN5bnRoZXNpcygNCisJCQlXb3JkMTYgQXFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEoeikgIDogcXVhbnRpemVkIEF6ICAgICAgICAgICAgICAgKi8NCisJCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhjaXRhdGlvbiBhdCAxMmtIeiAgICAgICAgKi8NCisJCQlXb3JkMTYgUV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogc2NhbGluZyBwZXJmb3JtZWQgb24gZXhjICAgKi8NCisJCQlXb3JkMTYgc3ludGgxNmtbXSwgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgIDogMTZrSHogc3ludGhlc2lzIHNpZ25hbCAgICAgKi8NCisJCQlDb2Rlcl9TdGF0ZSAqIHN0ICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgKi8NCisJCQkpOw0KKw0KKy8qIENvZGVjIHNvbWUgcGFyYW1ldGVycyBpbml0aWFsaXphdGlvbiAqLw0KK3ZvaWQgUmVzZXRfZW5jb2Rlcih2b2lkICpzdCwgV29yZDE2IHJlc2V0X2FsbCkNCit7DQorCVdvcmQxNiBpOw0KKwlDb2Rlcl9TdGF0ZSAqY29kX3N0YXRlOw0KKwljb2Rfc3RhdGUgPSAoQ29kZXJfU3RhdGUgKikgc3Q7DQorCVNldF96ZXJvKGNvZF9zdGF0ZS0+b2xkX2V4YywgUElUX01BWCArIExfSU5URVJQT0wpOw0KKwlTZXRfemVybyhjb2Rfc3RhdGUtPm1lbV9zeW4sIE0pOw0KKwlTZXRfemVybyhjb2Rfc3RhdGUtPnBhc3RfaXNmcSwgTSk7DQorCWNvZF9zdGF0ZS0+bWVtX3cwID0gMDsgICAgICAgICAgICAgICAgIA0KKwljb2Rfc3RhdGUtPnRpbHRfY29kZSA9IDA7ICAgICAgICAgICAgICANCisJY29kX3N0YXRlLT5maXJzdF9mcmFtZSA9IDE7ICAgICAgICAgICAgDQorCUluaXRfZ3BfY2xpcChjb2Rfc3RhdGUtPmdwX2NsaXApOw0KKwljb2Rfc3RhdGUtPkxfZ2NfdGhyZXMgPSAwOyAgICAgICAgICAgICANCisJaWYgKHJlc2V0X2FsbCAhPSAwKQ0KKwl7DQorCQkvKiBTdGF0aWMgdmVjdG9ycyB0byB6ZXJvICovDQorCQlTZXRfemVybyhjb2Rfc3RhdGUtPm9sZF9zcGVlY2gsIExfVE9UQUwgLSBMX0ZSQU1FKTsNCisJCVNldF96ZXJvKGNvZF9zdGF0ZS0+b2xkX3dzcCwgKFBJVF9NQVggLyBPUExfREVDSU0pKTsNCisJCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX2RlY2ltMiwgMyk7DQorCQkvKiByb3V0aW5lcyBpbml0aWFsaXphdGlvbiAqLw0KKwkJSW5pdF9EZWNpbV8xMms4KGNvZF9zdGF0ZS0+bWVtX2RlY2ltKTsNCisJCUluaXRfSFA1MF8xMms4KGNvZF9zdGF0ZS0+bWVtX3NpZ19pbik7DQorCQlJbml0X0xldmluc29uKGNvZF9zdGF0ZS0+bWVtX2xldmluc29uKTsNCisJCUluaXRfUV9nYWluMihjb2Rfc3RhdGUtPnF1YV9nYWluKTsNCisJCUluaXRfSHBfd3NwKGNvZF9zdGF0ZS0+aHBfd3NwX21lbSk7DQorCQkvKiBpc3AgaW5pdGlhbGl6YXRpb24gKi8NCisJCUNvcHkoaXNwX2luaXQsIGNvZF9zdGF0ZS0+aXNwb2xkLCBNKTsNCisJCUNvcHkoaXNwX2luaXQsIGNvZF9zdGF0ZS0+aXNwb2xkX3EsIE0pOw0KKwkJLyogdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gKi8NCisJCWNvZF9zdGF0ZS0+bWVtX3ByZWVtcGggPSAwOyAgICAgICAgDQorCQljb2Rfc3RhdGUtPm1lbV93c3AgPSAwOyAgICAgICAgICAgIA0KKwkJY29kX3N0YXRlLT5RX29sZCA9IDE1OyAgICAgICAgICAgICANCisJCWNvZF9zdGF0ZS0+UV9tYXhbMF0gPSAxNTsgICAgICAgICAgDQorCQljb2Rfc3RhdGUtPlFfbWF4WzFdID0gMTU7ICAgICAgICAgIA0KKwkJY29kX3N0YXRlLT5vbGRfd3NwX21heCA9IDA7ICAgICAgICANCisJCWNvZF9zdGF0ZS0+b2xkX3dzcF9zaGlmdCA9IDA7ICAgICAgDQorCQkvKiBwaXRjaCBvbCBpbml0aWFsaXphdGlvbiAqLw0KKwkJY29kX3N0YXRlLT5vbGRfVDBfbWVkID0gNDA7ICAgICAgICANCisJCWNvZF9zdGF0ZS0+b2xfZ2FpbiA9IDA7ICAgICAgICAgICAgDQorCQljb2Rfc3RhdGUtPmFkYV93ID0gMDsgICAgICAgICAgICAgIA0KKwkJY29kX3N0YXRlLT5vbF93Z2h0X2ZsZyA9IDA7ICAgICAgICANCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspDQorCQl7DQorCQkJY29kX3N0YXRlLT5vbGRfb2xfbGFnW2ldID0gNDA7IA0KKwkJfQ0KKwkJU2V0X3plcm8oY29kX3N0YXRlLT5vbGRfaHBfd3NwLCAoTF9GUkFNRSAvIDIpIC8gT1BMX0RFQ0lNICsgKFBJVF9NQVggLyBPUExfREVDSU0pKTsNCisJCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX3N5bl9oZiwgTSk7DQorCQlTZXRfemVybyhjb2Rfc3RhdGUtPm1lbV9zeW5faGksIE0pOw0KKwkJU2V0X3plcm8oY29kX3N0YXRlLT5tZW1fc3luX2xvLCBNKTsNCisJCUluaXRfSFA1MF8xMms4KGNvZF9zdGF0ZS0+bWVtX3NpZ19vdXQpOw0KKwkJSW5pdF9GaWx0XzZrXzdrKGNvZF9zdGF0ZS0+bWVtX2hmKTsNCisJCUluaXRfSFA0MDBfMTJrOChjb2Rfc3RhdGUtPm1lbV9ocDQwMCk7DQorCQlDb3B5KGlzZl9pbml0LCBjb2Rfc3RhdGUtPmlzZm9sZCwgTSk7DQorCQljb2Rfc3RhdGUtPm1lbV9kZWVtcGggPSAwOyAgICAgICAgIA0KKwkJY29kX3N0YXRlLT5zZWVkMiA9IDIxODQ1OyAgICAgICAgICANCisJCUluaXRfRmlsdF82a183ayhjb2Rfc3RhdGUtPm1lbV9oZjIpOw0KKwkJY29kX3N0YXRlLT5nYWluX2FscGhhID0gMzI3Njc7ICAgICANCisJCWNvZF9zdGF0ZS0+dmFkX2hpc3QgPSAwOw0KKwkJd2JfdmFkX3Jlc2V0KGNvZF9zdGF0ZS0+dmFkU3QpOw0KKwkJZHR4X2VuY19yZXNldChjb2Rfc3RhdGUtPmR0eF9lbmNTdCwgaXNmX2luaXQpOw0KKwl9DQorCXJldHVybjsNCit9DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqICAgRnVudGlvbiAgY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgIH5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAtPk1haW4gY29kZXIgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCit2b2lkIGNvZGVyKA0KKwkJV29yZDE2ICogbW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6ICB1c2VkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc3BlZWNoMTZrW10sICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogIDMyMCBuZXcgc3BlZWNoIHNhbXBsZXMgKGF0IDE2IGtIeikgICAgKi8NCisJCVdvcmQxNiBwcm1zW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiAgb3V0cHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogc2VyX3NpemUsICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6ICBiaXQgcmF0ZSBvZiB0aGUgdXNlZCBtb2RlICAgICAgICAgICAgICovDQorCQl2b2lkICpzcGVfc3RhdGUsICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyAgIDogIFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBhbGxvd19kdHggICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiAgRFRYIE9OL09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICkNCit7DQorCS8qIENvZGVyIHN0YXRlcyAqLw0KKwlDb2Rlcl9TdGF0ZSAqc3Q7DQorCS8qIFNwZWVjaCB2ZWN0b3IgKi8NCisJV29yZDE2IG9sZF9zcGVlY2hbTF9UT1RBTF07DQorCVdvcmQxNiAqbmV3X3NwZWVjaCwgKnNwZWVjaCwgKnBfd2luZG93Ow0KKw0KKwkvKiBXZWlnaHRlZCBzcGVlY2ggdmVjdG9yICovDQorCVdvcmQxNiBvbGRfd3NwW0xfRlJBTUUgKyAoUElUX01BWCAvIE9QTF9ERUNJTSldOw0KKwlXb3JkMTYgKndzcDsNCisNCisJLyogRXhjaXRhdGlvbiB2ZWN0b3IgKi8NCisJV29yZDE2IG9sZF9leGNbKExfRlJBTUUgKyAxKSArIFBJVF9NQVggKyBMX0lOVEVSUE9MXTsNCisJV29yZDE2ICpleGM7DQorDQorCS8qIExQQyBjb2VmZmljaWVudHMgKi8NCisJV29yZDE2IHJfaFtNICsgMV0sIHJfbFtNICsgMV07ICAgICAgICAgLyogQXV0b2NvcnJlbGF0aW9ucyBvZiB3aW5kb3dlZCBzcGVlY2ggICovDQorCVdvcmQxNiByY1tNXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZmxlY3Rpb24gY29lZmZpY2llbnRzLiAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgQXBbTSArIDFdOyAgICAgICAgICAgICAgICAgICAgICAvKiBBKHopIHdpdGggc3BlY3RyYWwgZXhwYW5zaW9uICAgICAgICAgKi8NCisJV29yZDE2IGlzcG5ld1tNXTsgICAgICAgICAgICAgICAgICAgICAgLyogaW1taXR0YW5jZSBzcGVjdHJhbCBwYWlycyBhdCA0bmQgc2ZyICovDQorCVdvcmQxNiBpc3BuZXdfcVtNXTsgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXplZCBJU1BzIGF0IDRuZCBzdWJmcmFtZSAgICAgICAqLw0KKwlXb3JkMTYgaXNmW01dOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU0YgKGZyZXF1ZW5jeSBkb21haW4pIGF0IDRuZCBzZnIgICAgKi8NCisJV29yZDE2ICpwX0EsICpwX0FxOyAgICAgICAgICAgICAgICAgICAgLyogcHRyIHRvIEEoeikgZm9yIHRoZSA0IHN1YmZyYW1lcyAgICAgICovDQorCVdvcmQxNiBBW05CX1NVQkZSICogKE0gKyAxKV07ICAgICAgICAgIC8qIEEoeikgdW5xdWFudGl6ZWQgZm9yIHRoZSA0IHN1YmZyYW1lcyAqLw0KKwlXb3JkMTYgQXFbTkJfU1VCRlIgKiAoTSArIDEpXTsgICAgICAgICAvKiBBKHopICAgcXVhbnRpemVkIGZvciB0aGUgNCBzdWJmcmFtZXMgKi8NCisNCisJLyogT3RoZXIgdmVjdG9ycyAqLw0KKwlXb3JkMTYgeG5bTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmVjdG9yIGZvciBwaXRjaCBzZWFyY2ggICAgICovDQorCVdvcmQxNiB4bjJbTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2ZWN0b3IgZm9yIGNvZGVib29rIHNlYXJjaCAgKi8NCisJV29yZDE2IGRuW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgLyogQ29ycmVsYXRpb24gYmV0d2VlbiB4bjIgYW5kIGgxICAgICAqLw0KKwlXb3JkMTYgY25bTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmVjdG9yIGluIHJlc2lkdWFsIGRvbWFpbiAgICovDQorCVdvcmQxNiBoMVtMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAgIC8qIEltcHVsc2UgcmVzcG9uc2UgdmVjdG9yICAgICAgICAgICAgKi8NCisJV29yZDE2IGgyW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgLyogSW1wdWxzZSByZXNwb25zZSB2ZWN0b3IgICAgICAgICAgICAqLw0KKwlXb3JkMTYgY29kZVtMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAgICovDQorCVdvcmQxNiB5MVtMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlcmVkIGFkYXB0aXZlIGV4Y2l0YXRpb24gICAgICAgKi8NCisJV29yZDE2IHkyW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyZWQgYWRhcHRpdmUgZXhjaXRhdGlvbiAgICAgICAqLw0KKwlXb3JkMTYgZXJyb3JbTSArIExfU1VCRlJdOyAgICAgICAgICAgICAvKiBlcnJvciBvZiBxdWFudGl6YXRpb24gICAgICAgICAgICAgICovDQorCVdvcmQxNiBzeW50aFtMX1NVQkZSXTsgICAgICAgICAgICAgICAgIC8qIDEyLjhrSHogc3ludGhlc2lzIHZlY3RvciAgICAgICAgICAgKi8NCisJV29yZDE2IGV4YzJbTF9GUkFNRV07ICAgICAgICAgICAgICAgICAgLyogZXhjaXRhdGlvbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgYnVmW0xfRlJBTUVdOyAgICAgICAgICAgICAgICAgICAvKiBWQUQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCS8qIFNjYWxhcnMgKi8NCisJV29yZDMyIGksIGosIGlfc3ViZnIsIHNlbGVjdCwgcGl0X2ZsYWcsIGNsaXBfZ2FpbiwgdmFkX2ZsYWc7DQorCVdvcmQxNiBjb2RlY19tb2RlOw0KKwlXb3JkMTYgVF9vcCwgVF9vcDIsIFQwLCBUMF9taW4sIFQwX21heCwgVDBfZnJhYywgaW5kZXg7DQorCVdvcmQxNiBnYWluX3BpdCwgZ2Fpbl9jb2RlLCBnX2NvZWZmWzRdLCBnX2NvZWZmMls0XTsNCisJV29yZDE2IHRtcCwgZ2FpbjEsIGdhaW4yLCBleHAsIFFfbmV3LCBtdSwgc2hpZnQsIG1heDsNCisJV29yZDE2IHZvaWNlX2ZhYzsNCisJV29yZDE2IGluZGljZVs4XTsNCisJV29yZDMyIExfdG1wLCBMX2dhaW5fY29kZSwgTF9tYXgsIExfdG1wMTsNCisJV29yZDE2IGNvZGUyW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAqLw0KKwlXb3JkMTYgc3RhYl9mYWMsIGZhYywgZ2Fpbl9jb2RlX2xvOw0KKw0KKwlXb3JkMTYgY29ycl9nYWluOw0KKwlXb3JkMTYgKnZvX3AwLCAqdm9fcDEsICp2b19wMiwgKnZvX3AzOw0KKw0KKwlzdCA9IChDb2Rlcl9TdGF0ZSAqKSBzcGVfc3RhdGU7DQorDQorCSpzZXJfc2l6ZSA9IG5iX29mX2JpdHNbKm1vZGVdOyAgICAgICAgIA0KKwljb2RlY19tb2RlID0gKm1vZGU7ICAgICAgICAgICAgICAgICAgICANCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogICAgICAgICAgSW5pdGlhbGl6ZSBwb2ludGVycyB0byBzcGVlY2ggdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICBwYXN0IHNwICAgc2YxICAgICBzZjIgICAgIHNmMyAgICAgc2Y0ICAgIExfTkVYVCAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tICBUb3RhbCBzcGVlY2ggYnVmZmVyIChMX1RPVEFMKSAgIC0tLS0tLT4gICAgICoNCisJICogICAgICAgICAgICAgIG9sZF9zcGVlY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tICBMUEMgYW5hbHlzaXMgd2luZG93IChMX1dJTkRPVykgIC0tLS0tLT4gICAgICoNCisJICogICAgICAgICAgICAgICAgICAgIHwgICAgICAgPC0tIHByZXNlbnQgZnJhbWUgKExfRlJBTUUpIC0tLS0+ICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgcF93aW5kb3cgfCAgICAgICA8LS0tLS0gbmV3IHNwZWVjaCAoTF9GUkFNRSkgLS0tLT4gICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVjaCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3BlZWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCW5ld19zcGVlY2ggPSBvbGRfc3BlZWNoICsgTF9UT1RBTCAtIExfRlJBTUUgLSBMX0ZJTFQ7ICAgICAgICAgLyogTmV3IHNwZWVjaCAgICAgKi8NCisJc3BlZWNoID0gb2xkX3NwZWVjaCArIExfVE9UQUwgLSBMX0ZSQU1FIC0gTF9ORVhUOyAgICAgICAgICAgICAvKiBQcmVzZW50IGZyYW1lICAqLw0KKwlwX3dpbmRvdyA9IG9sZF9zcGVlY2ggKyBMX1RPVEFMIC0gTF9XSU5ET1c7IA0KKw0KKwlleGMgPSBvbGRfZXhjICsgUElUX01BWCArIExfSU5URVJQT0w7ICANCisJd3NwID0gb2xkX3dzcCArIChQSVRfTUFYIC8gT1BMX0RFQ0lNKTsgDQorDQorCS8qIGNvcHkgY29kZXIgbWVtb3J5IHN0YXRlIGludG8gd29ya2luZyBzcGFjZSAqLw0KKwlDb3B5KHN0LT5vbGRfc3BlZWNoLCBvbGRfc3BlZWNoLCBMX1RPVEFMIC0gTF9GUkFNRSk7DQorCUNvcHkoc3QtPm9sZF93c3AsIG9sZF93c3AsIFBJVF9NQVggLyBPUExfREVDSU0pOw0KKwlDb3B5KHN0LT5vbGRfZXhjLCBvbGRfZXhjLCBQSVRfTUFYICsgTF9JTlRFUlBPTCk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBEb3duIHNhbXBsaW5nIHNpZ25hbCBmcm9tIDE2a0h6IHRvIDEyLjhrSHogICAgICAgICAgICAgICAgICAgICoNCisJICogLT4gVGhlIHNpZ25hbCBpcyBleHRlbmRlZCBieSBMX0ZJTFQgc2FtcGxlcyAocGFkZGVkIHRvIHplcm8pICAqDQorCSAqIHRvIGF2b2lkIGFkZGl0aW9uYWwgZGVsYXkgKExfRklMVCBzYW1wbGVzKSBpbiB0aGUgY29kZXIuICAgICAgKg0KKwkgKiBUaGUgbGFzdCBMX0ZJTFQgc2FtcGxlcyBhcmUgYXBwcm94aW1hdGVkIGFmdGVyIGRlY2ltYXRpb24gYW5kICoNCisJICogYXJlIHVzZWQgKGFuZCB3aW5kb3dlZCkgb25seSBpbiBhdXRvY29ycmVsYXRpb25zLiAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJRGVjaW1fMTJrOChzcGVlY2gxNmssIExfRlJBTUUxNmssIG5ld19zcGVlY2gsIHN0LT5tZW1fZGVjaW0pOw0KKw0KKwkvKiBsYXN0IExfRklMVCBzYW1wbGVzIGZvciBhdXRvY29ycmVsYXRpb24gd2luZG93ICovDQorCUNvcHkoc3QtPm1lbV9kZWNpbSwgY29kZSwgMiAqIExfRklMVDE2ayk7DQorCVNldF96ZXJvKGVycm9yLCBMX0ZJTFQxNmspOyAgICAgICAgICAgIC8qIHNldCBuZXh0IHNhbXBsZSB0byB6ZXJvICovDQorCURlY2ltXzEyazgoZXJyb3IsIExfRklMVDE2aywgbmV3X3NwZWVjaCArIExfRlJBTUUsIGNvZGUpOw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogUGVyZm9ybSA1MEh6IEhQIGZpbHRlcmluZyBvZiBpbnB1dCBzaWduYWwuICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJSFA1MF8xMms4KG5ld19zcGVlY2gsIExfRlJBTUUsIHN0LT5tZW1fc2lnX2luKTsNCisNCisJLyogbGFzdCBMX0ZJTFQgc2FtcGxlcyBmb3IgYXV0b2NvcnJlbGF0aW9uIHdpbmRvdyAqLw0KKwlDb3B5KHN0LT5tZW1fc2lnX2luLCBjb2RlLCA2KTsNCisJSFA1MF8xMms4KG5ld19zcGVlY2ggKyBMX0ZSQU1FLCBMX0ZJTFQsIGNvZGUpOw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogUGVyZm9ybSBmaXhlZCBwcmVlbXBoYXNpcyB0aHJvdWdoIDEgLSBnIHpeLTEgICAgICAgICAgICAgICAgICAqDQorCSAqIFNjYWxlIHNpZ25hbCB0byBnZXQgbWF4aW11bSBvZiBwcmVjaXNpb24gaW4gZmlsdGVyaW5nICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCW11ID0gUFJFRU1QSF9GQUMgPj4gMTsgICAgICAgICAgICAgIC8qIFExNSAtLT4gUTE0ICovDQorDQorCS8qIGdldCBtYXggb2YgbmV3IHByZWVtcGhhc2VkIHNhbXBsZXMgKExfRlJBTUUrTF9GSUxUKSAqLw0KKwlMX3RtcCA9IG5ld19zcGVlY2hbMF0gPDwgMTU7DQorCUxfdG1wIC09IChzdC0+bWVtX3ByZWVtcGggKiBtdSk8PDE7DQorCUxfbWF4ID0gTF9hYnMoTF90bXApOw0KKw0KKwlmb3IgKGkgPSAxOyBpIDwgTF9GUkFNRSArIExfRklMVDsgaSsrKQ0KKwl7DQorCQlMX3RtcCA9IG5ld19zcGVlY2hbaV0gPDwgMTU7DQorCQlMX3RtcCAtPSAobmV3X3NwZWVjaFtpIC0gMV0gKiBtdSk8PDE7DQorCQlMX3RtcCA9IExfYWJzKExfdG1wKTsNCisJCWlmKExfdG1wID4gTF9tYXgpDQorCQl7DQorCQkJTF9tYXggPSBMX3RtcDsgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCS8qIGdldCBzY2FsaW5nIGZhY3RvciBmb3IgbmV3IGFuZCBwcmV2aW91cyBzYW1wbGVzICovDQorCS8qIGxpbWl0IHNjYWxpbmcgdG8gUV9NQVggdG8ga2VlcCBkeW5hbWljIGZvciByaW5naW5nIGluIGxvdyBzaWduYWwgKi8NCisJLyogbGltaXQgc2NhbGluZyB0byBRX01BWCBhbHNvIHRvIGF2b2lkIGFbMF08MSBpbiBzeW5fZmlsdF8zMiAqLw0KKwl0bXAgPSBleHRyYWN0X2goTF9tYXgpOw0KKwlpZiAodG1wID09IDApDQorCXsNCisJCXNoaWZ0ID0gUV9NQVg7ICAgICAgICAgICAgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQlzaGlmdCA9IG5vcm1fcyh0bXApIC0gMTsNCisJCWlmIChzaGlmdCA8IDApDQorCQl7DQorCQkJc2hpZnQgPSAwOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwkJaWYgKHNoaWZ0ID4gUV9NQVgpDQorCQl7DQorCQkJc2hpZnQgPSBRX01BWDsgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCVFfbmV3ID0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpZiAoUV9uZXcgPiBzdC0+UV9tYXhbMF0pDQorCXsNCisJCVFfbmV3ID0gc3QtPlFfbWF4WzBdOyAgICAgICAgICAgICAgDQorCX0NCisJaWYgKFFfbmV3ID4gc3QtPlFfbWF4WzFdKQ0KKwl7DQorCQlRX25ldyA9IHN0LT5RX21heFsxXTsgICAgICAgICAgICAgIA0KKwl9DQorCWV4cCA9IChRX25ldyAtIHN0LT5RX29sZCk7DQorCXN0LT5RX29sZCA9IFFfbmV3OyAgICAgICAgICAgICAgICAgICAgIA0KKwlzdC0+UV9tYXhbMV0gPSBzdC0+UV9tYXhbMF07ICAgICAgICAgICANCisJc3QtPlFfbWF4WzBdID0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgDQorDQorCS8qIHByZWVtcGhhc2lzIHdpdGggc2NhbGluZyAoTF9GUkFNRStMX0ZJTFQpICovDQorCXRtcCA9IG5ld19zcGVlY2hbTF9GUkFNRSAtIDFdOyAgICAgICAgIA0KKw0KKwlmb3IgKGkgPSBMX0ZSQU1FICsgTF9GSUxUIC0gMTsgaSA+IDA7IGktLSkNCisJew0KKwkJTF90bXAgPSBuZXdfc3BlZWNoW2ldIDw8IDE1Ow0KKwkJTF90bXAgLT0gKG5ld19zcGVlY2hbaSAtIDFdICogbXUpPDwxOw0KKwkJTF90bXAgPSAoTF90bXAgPDwgUV9uZXcpOw0KKwkJbmV3X3NwZWVjaFtpXSA9IHZvX3JvdW5kKExfdG1wKTsgICAgICANCisJfQ0KKw0KKwlMX3RtcCA9IG5ld19zcGVlY2hbMF0gPDwgMTU7DQorCUxfdG1wIC09IChzdC0+bWVtX3ByZWVtcGggKiBtdSk8PDE7DQorCUxfdG1wID0gKExfdG1wIDw8IFFfbmV3KTsNCisJbmV3X3NwZWVjaFswXSA9IHZvX3JvdW5kKExfdG1wKTsgICAgICAgICAgDQorDQorCXN0LT5tZW1fcHJlZW1waCA9IHRtcDsgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBzY2FsZSBwcmV2aW91cyBzYW1wbGVzIGFuZCBtZW1vcnkgKi8NCisNCisJU2NhbGVfc2lnKG9sZF9zcGVlY2gsIExfVE9UQUwgLSBMX0ZSQU1FIC0gTF9GSUxULCBleHApOw0KKwlTY2FsZV9zaWcob2xkX2V4YywgUElUX01BWCArIExfSU5URVJQT0wsIGV4cCk7DQorCVNjYWxlX3NpZyhzdC0+bWVtX3N5biwgTSwgZXhwKTsNCisJU2NhbGVfc2lnKHN0LT5tZW1fZGVjaW0yLCAzLCBleHApOw0KKwlTY2FsZV9zaWcoJihzdC0+bWVtX3dzcCksIDEsIGV4cCk7DQorCVNjYWxlX3NpZygmKHN0LT5tZW1fdzApLCAxLCBleHApOw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogIENhbGwgVkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBQcmVlbXBoZXNpcyBzY2FsZSBkb3duIHNpZ25hbCBpbiBsb3cgZnJlcXVlbmN5IGFuZCBrZWVwIGR5bmFtaWMgaW4gSEYuKg0KKwkgKiAgVmFkIHdvcmsgc2xpZ2h0bHkgaW4gZnV0dXIgKG5ld19zcGVlY2ggPSBzcGVlY2ggKyBMX05FWFQgLSBMX0ZJTFQpLiAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlDb3B5KG5ld19zcGVlY2gsIGJ1ZiwgTF9GUkFNRSk7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCVNjYWxlX3NpZ19vcHQoYnVmLCBMX0ZSQU1FLCAxIC0gUV9uZXcpOw0KKyNlbHNlDQorCVNjYWxlX3NpZyhidWYsIExfRlJBTUUsIDEgLSBRX25ldyk7DQorI2VuZGlmDQorDQorCXZhZF9mbGFnID0gd2JfdmFkKHN0LT52YWRTdCwgYnVmKTsgICAgICAgICAgLyogVm9pY2UgQWN0aXZpdHkgRGV0ZWN0aW9uICovIA0KKwlpZiAodmFkX2ZsYWcgPT0gMCkNCisJew0KKwkJc3QtPnZhZF9oaXN0ID0gKHN0LT52YWRfaGlzdCArIDEpOyAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQlzdC0+dmFkX2hpc3QgPSAwOyAgICAgICAgICAgICANCisJfQ0KKw0KKwkvKiBEVFggcHJvY2Vzc2luZyAqLw0KKwlpZiAoYWxsb3dfZHR4ICE9IDApDQorCXsNCisJCS8qIE5vdGUgdGhhdCBtb2RlIG1heSBjaGFuZ2UgaGVyZSAqLw0KKwkJdHhfZHR4X2hhbmRsZXIoc3QtPmR0eF9lbmNTdCwgdmFkX2ZsYWcsIG1vZGUpOw0KKwkJKnNlcl9zaXplID0gbmJfb2ZfYml0c1sqbW9kZV07IA0KKwl9DQorDQorCWlmKCptb2RlICE9IE1SRFRYKQ0KKwl7DQorCQlQYXJtX3NlcmlhbCh2YWRfZmxhZywgMSwgJnBybXMpOw0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgUGVyZm9ybSBMUEMgYW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgLSBhdXRvY29ycmVsYXRpb24gKyBsYWcgd2luZG93aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIC0gTGV2aW5zb24tZHVyYmluIGFsZ29yaXRobSB0byBmaW5kIGFbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAtIGNvbnZlcnQgYVtdIHRvIGlzcFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgLSBjb252ZXJ0IGlzcFtdIHRvIGlzZltdIGZvciBxdWFudGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIC0gcXVhbnRpemUgYW5kIGNvZGUgdGhlIGlzZltdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAtIGNvbnZlcnQgaXNmW10gdG8gaXNwW10gZm9yIGludGVycG9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgLSBmaW5kIHRoZSBpbnRlcnBvbGF0ZWQgSVNQcyBhbmQgY29udmVydCB0byBhW10gZm9yIHRoZSA0IHN1YmZyYW1lcyAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCS8qIExQIGFuYWx5c2lzIGNlbnRlcmVkIGF0IDRuZCBzdWJmcmFtZSAqLw0KKwlBdXRvY29ycihwX3dpbmRvdywgTSwgcl9oLCByX2wpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG9jb3JyZWxhdGlvbnMgKi8NCisJTGFnX3dpbmRvdyhyX2gsIHJfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMYWcgd2luZG93aW5nICAgICovDQorCUxldmluc29uKHJfaCwgcl9sLCBBLCByYywgc3QtPm1lbV9sZXZpbnNvbik7ICAgICAgICAgICAgLyogTGV2aW5zb24gRHVyYmluICAqLw0KKwlBel9pc3AoQSwgaXNwbmV3LCBzdC0+aXNwb2xkKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gQSh6KSB0byBJU1AgKi8NCisNCisJLyogRmluZCB0aGUgaW50ZXJwb2xhdGVkIElTUHMgYW5kIGNvbnZlcnQgdG8gYVtdIGZvciBhbGwgc3ViZnJhbWVzICovDQorCUludF9pc3Aoc3QtPmlzcG9sZCwgaXNwbmV3LCBpbnRlcnBvbF9mcmFjLCBBKTsNCisNCisJLyogdXBkYXRlIGlzcG9sZFtdIGZvciB0aGUgbmV4dCBmcmFtZSAqLw0KKwlDb3B5KGlzcG5ldywgc3QtPmlzcG9sZCwgTSk7DQorDQorCS8qIENvbnZlcnQgSVNQcyB0byBmcmVxdWVuY3kgZG9tYWluIDAuLjY0MDAgKi8NCisJSXNwX2lzZihpc3BuZXcsIGlzZiwgTSk7DQorDQorCS8qIGNoZWNrIHJlc29uYW5jZSBmb3IgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorCUdwX2NsaXBfdGVzdF9pc2YoaXNmLCBzdC0+Z3BfY2xpcCk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogIFBlcmZvcm0gUElUQ0hfT0wgYW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIC0gRmluZCB0aGUgcmVzaWR1YWwgcmVzW10gZm9yIHRoZSB3aG9sZSBzcGVlY2ggZnJhbWUgICAgICAgICAgICAgICAgICoNCisJICogLSBGaW5kIHRoZSB3ZWlnaHRlZCBpbnB1dCBzcGVlY2ggd3NwW10gZm9yIHRoZSB3aG9sZSBzcGVlY2ggZnJhbWUgICAgKg0KKwkgKiAtIHNjYWxlIHdzcFtdIHRvIGF2b2lkIG92ZXJmbG93IGluIHBpdGNoIGVzdGltYXRpb24gICAgICAgICAgICAgICAgICAqDQorCSAqIC0gRmluZCBvcGVuIGxvb3AgcGl0Y2ggbGFnIGZvciB3aG9sZSBzcGVlY2ggZnJhbWUgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcF9BID0gQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGlfc3ViZnIgPSAwOyBpX3N1YmZyIDwgTF9GUkFNRTsgaV9zdWJmciArPSBMX1NVQkZSKQ0KKwl7DQorCQkvKiBXZWlnaHRpbmcgb2YgTFBDIGNvZWZmaWNpZW50cyAqLw0KKwkJV2VpZ2h0X2EocF9BLCBBcCwgR0FNTUExLCBNKTsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCVJlc2lkdV9vcHQoQXAsICZzcGVlY2hbaV9zdWJmcl0sICZ3c3BbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbHNlDQorCQlSZXNpZHUoQXAsICZzcGVlY2hbaV9zdWJmcl0sICZ3c3BbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbmRpZg0KKw0KKwkJcF9BICs9IChNICsgMSk7ICAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlEZWVtcGgyKHdzcCwgVElMVF9GQUMsIExfRlJBTUUsICYoc3QtPm1lbV93c3ApKTsNCisNCisJLyogZmluZCBtYXhpbXVtIHZhbHVlIG9uIHdzcFtdIGZvciAxMiBiaXRzIHNjYWxpbmcgKi8NCisJbWF4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykNCisJew0KKwkJdG1wID0gYWJzX3Mod3NwW2ldKTsNCisJCWlmKHRtcCA+IG1heCkNCisJCXsNCisJCQltYXggPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisJdG1wID0gc3QtPm9sZF93c3BfbWF4OyAgICAgICAgICAgICAgICAgDQorCWlmKG1heCA+IHRtcCkNCisJew0KKwkJdG1wID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0bXAgPSBtYXgod3NwX21heCwgb2xkX3dzcF9tYXgpICovDQorCX0NCisJc3QtPm9sZF93c3BfbWF4ID0gbWF4OyAgICAgICAgICAgICAgICANCisNCisJc2hpZnQgPSBub3JtX3ModG1wKSAtIDM7DQorCWlmIChzaGlmdCA+IDApDQorCXsNCisJCXNoaWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hpZnQgPSAwLi4tMyAqLw0KKwl9DQorCS8qIGRlY2ltYXRpb24gb2Ygd3NwW10gdG8gc2VhcmNoIHBpdGNoIGluIExGIGFuZCB0byByZWR1Y2UgY29tcGxleGl0eSAqLw0KKwlMUF9EZWNpbTIod3NwLCBMX0ZSQU1FLCBzdC0+bWVtX2RlY2ltMik7DQorDQorCS8qIHNjYWxlIHdzcFtdIGluIDEyIGJpdHMgdG8gYXZvaWQgb3ZlcmZsb3cgKi8NCisjaWZkZWYgIEFTTV9PUFQgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlTY2FsZV9zaWdfb3B0KHdzcCwgTF9GUkFNRSAvIE9QTF9ERUNJTSwgc2hpZnQpOw0KKyNlbHNlDQorCVNjYWxlX3NpZyh3c3AsIExfRlJBTUUgLyBPUExfREVDSU0sIHNoaWZ0KTsNCisjZW5kaWYNCisJLyogc2NhbGUgb2xkX3dzcCAod2FybmluZzogZXhwIG11c3QgYmUgUV9uZXctUV9vbGQpICovDQorCWV4cCA9IGV4cCArIChzaGlmdCAtIHN0LT5vbGRfd3NwX3NoaWZ0KTsNCisJc3QtPm9sZF93c3Bfc2hpZnQgPSBzaGlmdDsNCisNCisJU2NhbGVfc2lnKG9sZF93c3AsIFBJVF9NQVggLyBPUExfREVDSU0sIGV4cCk7DQorCVNjYWxlX3NpZyhzdC0+b2xkX2hwX3dzcCwgUElUX01BWCAvIE9QTF9ERUNJTSwgZXhwKTsNCisNCisJc2NhbGVfbWVtX0hwX3dzcChzdC0+aHBfd3NwX21lbSwgZXhwKTsNCisNCisJLyogRmluZCBvcGVuIGxvb3AgcGl0Y2ggbGFnIGZvciB3aG9sZSBzcGVlY2ggZnJhbWUgKi8NCisNCisJaWYoKnNlcl9zaXplID09IE5CQklUU183aykNCisJew0KKwkJLyogRmluZCBvcGVuIGxvb3AgcGl0Y2ggbGFnIGZvciB3aG9sZSBzcGVlY2ggZnJhbWUgKi8NCisJCVRfb3AgPSBQaXRjaF9tZWRfb2wod3NwLCBzdCwgTF9GUkFNRSAvIE9QTF9ERUNJTSk7DQorCX0gZWxzZQ0KKwl7DQorCQkvKiBGaW5kIG9wZW4gbG9vcCBwaXRjaCBsYWcgZm9yIGZpcnN0IDEvMiBmcmFtZSAqLw0KKwkJVF9vcCA9IFBpdGNoX21lZF9vbCh3c3AsIHN0LCAoTF9GUkFNRS8yKSAvIE9QTF9ERUNJTSk7DQorCX0NCisNCisJaWYoc3QtPm9sX2dhaW4gPiAxOTY2MSkgICAgICAgLyogMC42IGluIFExNSAqLw0KKwl7DQorCQlzdC0+b2xkX1QwX21lZCA9IE1lZF9vbGFnKFRfb3AsIHN0LT5vbGRfb2xfbGFnKTsgICAgICAgDQorCQlzdC0+YWRhX3cgPSAzMjc2NzsgICAgICAgICAgICAgICAgIA0KKwl9IGVsc2UNCisJew0KKwkJc3QtPmFkYV93ID0gdm9fbXVsdChzdC0+YWRhX3csIDI5NDkxKTsNCisJfQ0KKw0KKwlpZihzdC0+YWRhX3cgPCAyNjIxNCkNCisJCXN0LT5vbF93Z2h0X2ZsZyA9IDA7DQorCWVsc2UNCisJCXN0LT5vbF93Z2h0X2ZsZyA9IDE7DQorDQorCXdiX3ZhZF90b25lX2RldGVjdGlvbihzdC0+dmFkU3QsIHN0LT5vbF9nYWluKTsNCisJVF9vcCAqPSBPUExfREVDSU07ICAgICAgICAgICAgICAgICAgICAgDQorDQorCWlmKCpzZXJfc2l6ZSAhPSBOQkJJVFNfN2spDQorCXsNCisJCS8qIEZpbmQgb3BlbiBsb29wIHBpdGNoIGxhZyBmb3Igc2Vjb25kIDEvMiBmcmFtZSAqLw0KKwkJVF9vcDIgPSBQaXRjaF9tZWRfb2wod3NwICsgKChMX0ZSQU1FIC8gMikgLyBPUExfREVDSU0pLCBzdCwgKExfRlJBTUUvMikgLyBPUExfREVDSU0pOw0KKw0KKwkJaWYoc3QtPm9sX2dhaW4gPiAxOTY2MSkgICAvKiAwLjYgaW4gUTE1ICovDQorCQl7DQorCQkJc3QtPm9sZF9UMF9tZWQgPSBNZWRfb2xhZyhUX29wMiwgc3QtPm9sZF9vbF9sYWcpOyAgDQorCQkJc3QtPmFkYV93ID0gMzI3Njc7ICAgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJc3QtPmFkYV93ID0gbXVsdChzdC0+YWRhX3csIDI5NDkxKTsgDQorCQl9DQorDQorCQlpZihzdC0+YWRhX3cgPCAyNjIxNCkNCisJCQlzdC0+b2xfd2dodF9mbGcgPSAwOw0KKwkJZWxzZQ0KKwkJCXN0LT5vbF93Z2h0X2ZsZyA9IDE7DQorDQorCQl3Yl92YWRfdG9uZV9kZXRlY3Rpb24oc3QtPnZhZFN0LCBzdC0+b2xfZ2Fpbik7DQorDQorCQlUX29wMiAqPSBPUExfREVDSU07ICAgICAgICAgICAgICAgIA0KKw0KKwl9IGVsc2UNCisJew0KKwkJVF9vcDIgPSBUX29wOyAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFRYLUNORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJaWYoKm1vZGUgPT0gTVJEVFgpICAgICAgICAgICAgLyogQ05HIG1vZGUgKi8NCisJew0KKwkJLyogQnVmZmVyIGlzZidzIGFuZCBlbmVyZ3kgKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJUmVzaWR1X29wdCgmQVszICogKE0gKyAxKV0sIHNwZWVjaCwgZXhjLCBMX0ZSQU1FKTsNCisjZWxzZQ0KKwkJUmVzaWR1KCZBWzMgKiAoTSArIDEpXSwgc3BlZWNoLCBleGMsIExfRlJBTUUpOw0KKyNlbmRpZg0KKw0KKwkJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykNCisJCXsNCisJCQlleGMyW2ldID0gc2hyKGV4Y1tpXSwgUV9uZXcpOyAgDQorCQl9DQorDQorCQlMX3RtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykNCisJCQlMX3RtcCArPSAoZXhjMltpXSAqIGV4YzJbaV0pPDwxOw0KKw0KKwkJTF90bXAgPj49IDE7DQorDQorCQlkdHhfYnVmZmVyKHN0LT5kdHhfZW5jU3QsIGlzZiwgTF90bXAsIGNvZGVjX21vZGUpOw0KKw0KKwkJLyogUXVhbnRpemUgYW5kIGNvZGUgdGhlIElTRnMgKi8NCisJCWR0eF9lbmMoc3QtPmR0eF9lbmNTdCwgaXNmLCBleGMyLCAmcHJtcyk7DQorDQorCQkvKiBDb252ZXJ0IElTRnMgdG8gdGhlIGNvc2luZSBkb21haW4gKi8NCisJCUlzZl9pc3AoaXNmLCBpc3BuZXdfcSwgTSk7DQorCQlJc3BfQXooaXNwbmV3X3EsIEFxLCBNLCAwKTsNCisNCisJCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpDQorCQl7DQorCQkJY29ycl9nYWluID0gc3ludGhlc2lzKEFxLCAmZXhjMltpX3N1YmZyXSwgMCwgJnNwZWVjaDE2a1tpX3N1YmZyICogNSAvIDRdLCBzdCk7DQorCQl9DQorCQlDb3B5KGlzZiwgc3QtPmlzZm9sZCwgTSk7DQorDQorCQkvKiByZXNldCBzcGVlY2ggY29kZXIgbWVtb3JpZXMgKi8NCisJCVJlc2V0X2VuY29kZXIoc3QsIDApOw0KKw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIFVwZGF0ZSBzaWduYWwgZm9yIG5leHQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAtPiBzYXZlIHBhc3Qgb2Ygc3BlZWNoW10gYW5kIHdzcFtdLiAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQlDb3B5KCZvbGRfc3BlZWNoW0xfRlJBTUVdLCBzdC0+b2xkX3NwZWVjaCwgTF9UT1RBTCAtIExfRlJBTUUpOw0KKwkJQ29weSgmb2xkX3dzcFtMX0ZSQU1FIC8gT1BMX0RFQ0lNXSwgc3QtPm9sZF93c3AsIFBJVF9NQVggLyBPUExfREVDSU0pOw0KKw0KKwkJcmV0dXJuOw0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNFTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkvKiBRdWFudGl6ZSBhbmQgY29kZSB0aGUgSVNGcyAqLw0KKw0KKwlpZiAoKnNlcl9zaXplIDw9IE5CQklUU183aykNCisJew0KKwkJUXBpc2ZfMnNfMzZiKGlzZiwgaXNmLCBzdC0+cGFzdF9pc2ZxLCBpbmRpY2UsIDQpOw0KKw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCA4LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDgsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgNywgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCA3LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbNF0sIDYsICZwcm1zKTsNCisJfSBlbHNlDQorCXsNCisJCVFwaXNmXzJzXzQ2Yihpc2YsIGlzZiwgc3QtPnBhc3RfaXNmcSwgaW5kaWNlLCA0KTsNCisNCisJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgOCwgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCA4LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDYsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVszXSwgNywgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzRdLCA3LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbNV0sIDUsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVs2XSwgNSwgJnBybXMpOw0KKwl9DQorDQorCS8qIENoZWNrIHN0YWJpbGl0eSBvbiBpc2YgOiBkaXN0YW5jZSBiZXR3ZWVuIG9sZCBpc2YgYW5kIGN1cnJlbnQgaXNmICovDQorDQorCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IE0gLSAxOyBpKyspDQorCXsNCisJCXRtcCA9IHZvX3N1Yihpc2ZbaV0sIHN0LT5pc2ZvbGRbaV0pOw0KKwkJTF90bXAgKz0gKHRtcCAqIHRtcCk8PDE7DQorCX0NCisNCisJdG1wID0gZXh0cmFjdF9oKExfc2hsMihMX3RtcCwgOCkpOyANCisNCisJdG1wID0gdm9fbXVsdCh0bXAsIDI2MjE0KTsgICAgICAgICAgICAgICAgLyogdG1wID0gTF90bXAqMC44LzI1NiAqLw0KKwl0bXAgPSB2b19zdWIoMjA0ODAsIHRtcCk7ICAgICAgICAgICAgICAgICAvKiAxLjI1IC0gdG1wIChpbiBRMTQpICovDQorDQorCXN0YWJfZmFjID0gc2hsKHRtcCwgMSk7IA0KKw0KKwlpZiAoc3RhYl9mYWMgPCAwKQ0KKwl7DQorCQlzdGFiX2ZhYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCUNvcHkoaXNmLCBzdC0+aXNmb2xkLCBNKTsNCisNCisJLyogQ29udmVydCBJU0ZzIHRvIHRoZSBjb3NpbmUgZG9tYWluICovDQorCUlzZl9pc3AoaXNmLCBpc3BuZXdfcSwgTSk7DQorDQorCWlmIChzdC0+Zmlyc3RfZnJhbWUgIT0gMCkNCisJew0KKwkJc3QtPmZpcnN0X2ZyYW1lID0gMDsgICAgICAgICAgICAgIA0KKwkJQ29weShpc3BuZXdfcSwgc3QtPmlzcG9sZF9xLCBNKTsNCisJfQ0KKwkvKiBGaW5kIHRoZSBpbnRlcnBvbGF0ZWQgSVNQcyBhbmQgY29udmVydCB0byBhW10gZm9yIGFsbCBzdWJmcmFtZXMgKi8NCisNCisJSW50X2lzcChzdC0+aXNwb2xkX3EsIGlzcG5ld19xLCBpbnRlcnBvbF9mcmFjLCBBcSk7DQorDQorCS8qIHVwZGF0ZSBpc3BvbGRbXSBmb3IgdGhlIG5leHQgZnJhbWUgKi8NCisJQ29weShpc3BuZXdfcSwgc3QtPmlzcG9sZF9xLCBNKTsNCisNCisJcF9BcSA9IEFxOw0KKwlmb3IgKGlfc3ViZnIgPSAwOyBpX3N1YmZyIDwgTF9GUkFNRTsgaV9zdWJmciArPSBMX1NVQkZSKQ0KKwl7DQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJUmVzaWR1X29wdChwX0FxLCAmc3BlZWNoW2lfc3ViZnJdLCAmZXhjW2lfc3ViZnJdLCBMX1NVQkZSKTsNCisjZWxzZQ0KKwkJUmVzaWR1KHBfQXEsICZzcGVlY2hbaV9zdWJmcl0sICZleGNbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbmRpZg0KKwkJcF9BcSArPSAoTSArIDEpOyAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwkvKiBCdWZmZXIgaXNmJ3MgYW5kIGVuZXJneSBmb3IgZHR4IG9uIG5vbi1zcGVlY2ggZnJhbWUgKi8NCisJaWYgKHZhZF9mbGFnID09IDApDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspDQorCQl7DQorCQkJZXhjMltpXSA9IGV4Y1tpXSA+PiBRX25ldzsNCisJCX0NCisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQ0KKwkJCUxfdG1wICs9IChleGMyW2ldICogZXhjMltpXSk8PDE7DQorCQlMX3RtcCA+Pj0gMTsNCisNCisJCWR0eF9idWZmZXIoc3QtPmR0eF9lbmNTdCwgaXNmLCBMX3RtcCwgY29kZWNfbW9kZSk7DQorCX0NCisJLyogcmFuZ2UgZm9yIGNsb3NlZCBsb29wIHBpdGNoIHNlYXJjaCBpbiAxc3Qgc3ViZnJhbWUgKi8NCisNCisJVDBfbWluID0gVF9vcCAtIDg7DQorCWlmIChUMF9taW4gPCBQSVRfTUlOKQ0KKwl7DQorCQlUMF9taW4gPSBQSVRfTUlOOyAgICAgICAgICAgICAgICAgIA0KKwl9DQorCVQwX21heCA9IChUMF9taW4gKyAxNSk7DQorDQorCWlmKFQwX21heCA+IFBJVF9NQVgpDQorCXsNCisJCVQwX21heCA9IFBJVF9NQVg7ICAgICAgICAgICAgICAgICAgDQorCQlUMF9taW4gPSBUMF9tYXggLSAxNTsgICAgICAgICAgDQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICAgICAgICAgIExvb3AgZm9yIGV2ZXJ5IHN1YmZyYW1lIGluIHRoZSBhbmFseXNpcyBmcmFtZSAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogIFRvIGZpbmQgdGhlIHBpdGNoIGFuZCBpbm5vdmF0aW9uIHBhcmFtZXRlcnMuIFRoZSBzdWJmcmFtZSBzaXplIGlzICAgICAqDQorCSAqICBMX1NVQkZSIGFuZCB0aGUgbG9vcCBpcyByZXBlYXRlZCBMX0ZSQU1FL0xfU1VCRlIgdGltZXMuICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBjb21wdXRlIHRoZSB0YXJnZXQgc2lnbmFsIGZvciBwaXRjaCBzZWFyY2ggICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gY29tcHV0ZSBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKGgxW10pICAgICAqDQorCSAqICAgICAtIGZpbmQgdGhlIGNsb3NlZC1sb29wIHBpdGNoIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBlbmNvZGUgdGhlIHBpdGNoIGRlYWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gZmluZCAyIGx0IHByZWRpY3Rpb24gKHdpdGggLyB3aXRob3V0IExQIGZpbHRlciBmb3IgbHQgcHJlZCkgICAgICAqDQorCSAqICAgICAtIGZpbmQgMiBwaXRjaCBnYWlucyBhbmQgY2hvb3NlIHRoZSBiZXN0IGx0IHByZWRpY3Rpb24uICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBmaW5kIHRhcmdldCB2ZWN0b3IgZm9yIGNvZGVib29rIHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gdXBkYXRlIHRoZSBpbXB1bHNlIHJlc3BvbnNlIGgxW10gZm9yIGNvZGVib29rIHNlYXJjaCAgICAgICAgICAgICAqDQorCSAqICAgICAtIGNvcnJlbGF0aW9uIGJldHdlZW4gdGFyZ2V0IHZlY3RvciBhbmQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgKg0KKwkgKiAgICAgLSBjb2RlYm9vayBzZWFyY2ggYW5kIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gVlEgb2YgcGl0Y2ggYW5kIGNvZGVib29rIGdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAtIGZpbmQgdm9pY2luZyBmYWN0b3IgYW5kIHRpbHQgb2YgY29kZSBmb3IgbmV4dCBzdWJmcmFtZS4gICAgICAgICAgKg0KKwkgKiAgICAgLSB1cGRhdGUgc3RhdGVzIG9mIHdlaWdodGluZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gZmluZCBleGNpdGF0aW9uIGFuZCBzeW50aGVzaXMgc3BlZWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcF9BID0gQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXBfQXEgPSBBcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGlfc3ViZnIgPSAwOyBpX3N1YmZyIDwgTF9GUkFNRTsgaV9zdWJmciArPSBMX1NVQkZSKQ0KKwl7DQorCQlwaXRfZmxhZyA9IGlfc3ViZnI7ICAgICAgICAgICAgICAgIA0KKwkJaWYgKChpX3N1YmZyID09IDIgKiBMX1NVQkZSKSAmJiAoKnNlcl9zaXplID4gTkJCSVRTXzdrKSkNCisJCXsNCisJCQlwaXRfZmxhZyA9IDA7ICAgICAgICAgICAgICAgICANCisJCQkvKiByYW5nZSBmb3IgY2xvc2VkIGxvb3AgcGl0Y2ggc2VhcmNoIGluIDNyZCBzdWJmcmFtZSAqLw0KKwkJCVQwX21pbiA9IChUX29wMiAtIDgpOw0KKw0KKwkJCWlmIChUMF9taW4gPCBQSVRfTUlOKQ0KKwkJCXsNCisJCQkJVDBfbWluID0gUElUX01JTjsgICAgICAgICAgDQorCQkJfQ0KKwkJCVQwX21heCA9IChUMF9taW4gKyAxNSk7DQorCQkJaWYgKFQwX21heCA+IFBJVF9NQVgpDQorCQkJew0KKwkJCQlUMF9tYXggPSBQSVRfTUFYOyAgICAgICAgIA0KKwkJCQlUMF9taW4gPSAoVDBfbWF4IC0gMTUpOw0KKwkJCX0NCisJCX0NCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogICAgICAgIEZpbmQgdGhlIHRhcmdldCB2ZWN0b3IgZm9yIHBpdGNoIHNlYXJjaDogICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogICAgICAgICAgICAgfC0tLS0tLXwgIHJlc1tuXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqIHNwZWVjaFtuXS0tLXwgQSh6KSB8LS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICB8LS0tLS0tfCAgICAgICB8ICAgfC0tLS0tLS0tfCBlcnJvcltuXSAgfC0tLS0tLXwgICAgICAgICAgKg0KKwkJICogICAgICAgICAgICAgICAgICAgemVybyAtLSAoLSktLXwgMS9BKHopIHwtLS0tLS0tLS0tLXwgVyh6KSB8LS0gdGFyZ2V0ICoNCisJCSAqICAgICAgICAgICAgICAgICAgIGV4YyAgICAgICAgICB8LS0tLS0tLS18ICAgICAgICAgICB8LS0tLS0tfCAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogSW5zdGVhZCBvZiBzdWJ0cmFjdGluZyB0aGUgemVyby1pbnB1dCByZXNwb25zZSBvZiBmaWx0ZXJzIGZyb20gICAgICAgICoNCisJCSAqIHRoZSB3ZWlnaHRlZCBpbnB1dCBzcGVlY2gsIHRoZSBhYm92ZSBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gICAgICAgICAqDQorCQkgKiBjb21wdXRlIHRoZSB0YXJnZXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCXsNCisJCQllcnJvcltpXSA9IHZvX3N1YihzcGVlY2hbaSArIGlfc3ViZnIgLSBNXSwgc3QtPm1lbV9zeW5baV0pOw0KKwkJfQ0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJUmVzaWR1X29wdChwX0FxLCAmc3BlZWNoW2lfc3ViZnJdLCAmZXhjW2lfc3ViZnJdLCBMX1NVQkZSKTsNCisjZWxzZQ0KKwkJUmVzaWR1KHBfQXEsICZzcGVlY2hbaV9zdWJmcl0sICZleGNbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbmRpZg0KKwkJU3luX2ZpbHQocF9BcSwgJmV4Y1tpX3N1YmZyXSwgZXJyb3IgKyBNLCBMX1NVQkZSLCBlcnJvciwgMCk7DQorCQlXZWlnaHRfYShwX0EsIEFwLCBHQU1NQTEsIE0pOw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlSZXNpZHVfb3B0KEFwLCBlcnJvciArIE0sIHhuLCBMX1NVQkZSKTsNCisjZWxzZQ0KKwkJUmVzaWR1KEFwLCBlcnJvciArIE0sIHhuLCBMX1NVQkZSKTsNCisjZW5kaWYNCisJCURlZW1waDIoeG4sIFRJTFRfRkFDLCBMX1NVQkZSLCAmKHN0LT5tZW1fdzApKTsNCisNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIEZpbmQgYXBwcm94LiB0YXJnZXQgaW4gcmVzaWR1YWwgZG9tYWluICJjbltdIiBmb3IgaW5vdmF0aW9uIHNlYXJjaC4gICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkvKiBmaXJzdCBoYWxmOiB4bltdIC0tPiBjbltdICovDQorCQlTZXRfemVybyhjb2RlLCBNKTsNCisJCUNvcHkoeG4sIGNvZGUgKyBNLCBMX1NVQkZSIC8gMik7DQorCQl0bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlQcmVlbXBoMihjb2RlICsgTSwgVElMVF9GQUMsIExfU1VCRlIgLyAyLCAmdG1wKTsNCisJCVdlaWdodF9hKHBfQSwgQXAsIEdBTU1BMSwgTSk7DQorCQlTeW5fZmlsdChBcCxjb2RlICsgTSwgY29kZSArIE0sIExfU1VCRlIgLyAyLCBjb2RlLCAwKTsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJUmVzaWR1X29wdChwX0FxLGNvZGUgKyBNLCBjbiwgTF9TVUJGUiAvIDIpOw0KKyNlbHNlDQorCQlSZXNpZHUocF9BcSxjb2RlICsgTSwgY24sIExfU1VCRlIgLyAyKTsNCisjZW5kaWYNCisNCisJCS8qIHNlY29uZCBoYWxmOiByZXNbXSAtLT4gY25bXSAoYXBwcm94aW1hdGVkIGFuZCBmYXN0ZXIpICovDQorCQlDb3B5KCZleGNbaV9zdWJmciArIChMX1NVQkZSIC8gMildLCBjbiArIChMX1NVQkZSIC8gMiksIExfU1VCRlIgLyAyKTsNCisNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogQ29tcHV0ZSBpbXB1bHNlIHJlc3BvbnNlLCBoMVtdLCBvZiB3ZWlnaHRlZCBzeW50aGVzaXMgZmlsdGVyICAqIA0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkJU2V0X3plcm8oZXJyb3IsIE0gKyBMX1NVQkZSKTsNCisJCVdlaWdodF9hKHBfQSwgZXJyb3IgKyBNLCBHQU1NQTEsIE0pOw0KKw0KKwkJdm9fcDAgPSBlcnJvcitNOw0KKwkJdm9fcDMgPSBoMTsNCisJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCQl7DQorCQkJTF90bXAgPSAqdm9fcDAgPDwgMTQ7ICAgICAgICAvKiB4NCAoUTEyIHRvIFExNCkgKi8NCisJCQl2b19wMSA9IHBfQXEgKyAxOw0KKwkJCXZvX3AyID0gdm9fcDAtMTsNCisJCQlmb3IgKGogPSAxOyBqIDw9IE0vNDsgaisrKQ0KKwkJCXsNCisJCQkJTF90bXAgLT0gKnZvX3AxKysgKiAqdm9fcDItLTsNCisJCQkJTF90bXAgLT0gKnZvX3AxKysgKiAqdm9fcDItLTsNCisJCQkJTF90bXAgLT0gKnZvX3AxKysgKiAqdm9fcDItLTsNCisJCQkJTF90bXAgLT0gKnZvX3AxKysgKiAqdm9fcDItLTsNCisJCQl9DQorCQkJKnZvX3AzKysgPSAqdm9fcDArKyA9IHZvX3JvdW5kKChMX3RtcCA8PDQpKTsNCisJCX0NCisJCS8qIGRlZW1waCB3aXRob3V0IGRpdmlzaW9uIGJ5IDIgLT4gUTE0IHRvIFExNSAqLw0KKwkJdG1wID0gMDsgDQorCQlEZWVtcGgyKGgxLCBUSUxUX0ZBQywgTF9TVUJGUiwgJnRtcCk7ICAgLyogaDEgaW4gUTE0ICovDQorDQorCQkvKiBoMiBpbiBRMTIgZm9yIGNvZGVib29rIHNlYXJjaCAqLw0KKwkJQ29weShoMSwgaDIsIExfU1VCRlIpOw0KKw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiBzY2FsZSB4bltdIGFuZCBoMVtdIHRvIGF2b2lkIG92ZXJmbG93IGluIGRvdF9wcm9kdWN0MTIoKSAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisjaWZkZWYgIEFTTV9PUFQgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJU2NhbGVfc2lnX29wdChoMiwgTF9TVUJGUiwgLTIpOw0KKwkJU2NhbGVfc2lnX29wdCh4biwgTF9TVUJGUiwgc2hpZnQpOyAgICAgLyogc2NhbGluZyBvZiB4bltdIHRvIGxpbWl0IGR5bmFtaWMgYXQgMTIgYml0cyAqLw0KKwkJU2NhbGVfc2lnX29wdChoMSwgTF9TVUJGUiwgMSArIHNoaWZ0KTsgIC8qIHNldCBoMVtdIGluIFExNSB3aXRoIHNjYWxpbmcgZm9yIGNvbnZvbHV0aW9uICovDQorI2Vsc2UNCisJCVNjYWxlX3NpZyhoMiwgTF9TVUJGUiwgLTIpOw0KKwkJU2NhbGVfc2lnKHhuLCBMX1NVQkZSLCBzaGlmdCk7ICAgICAvKiBzY2FsaW5nIG9mIHhuW10gdG8gbGltaXQgZHluYW1pYyBhdCAxMiBiaXRzICovDQorCQlTY2FsZV9zaWcoaDEsIExfU1VCRlIsIDEgKyBzaGlmdCk7ICAvKiBzZXQgaDFbXSBpbiBRMTUgd2l0aCBzY2FsaW5nIGZvciBjb252b2x1dGlvbiAqLw0KKyNlbmRpZg0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogICAgICAgICAgICAgICAgIENsb3NlZC1sb29wIGZyYWN0aW9uYWwgcGl0Y2ggc2VhcmNoICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCS8qIGZpbmQgY2xvc2VkIGxvb3AgZnJhY3Rpb25hbCBwaXRjaCAgbGFnICovDQorCQlpZigqc2VyX3NpemUgPD0gTkJCSVRTXzlrKQ0KKwkJew0KKwkJCVQwID0gUGl0Y2hfZnI0KCZleGNbaV9zdWJmcl0sIHhuLCBoMSwgVDBfbWluLCBUMF9tYXgsICZUMF9mcmFjLA0KKwkJCQkJcGl0X2ZsYWcsIFBJVF9NSU4sIFBJVF9GUjFfOGIsIExfU1VCRlIpOw0KKw0KKwkJCS8qIGVuY29kZSBwaXRjaCBsYWcgKi8NCisJCQlpZiAocGl0X2ZsYWcgPT0gMCkgICAgICAgICAgICAgLyogaWYgMXN0LzNyZCBzdWJmcmFtZSAqLw0KKwkJCXsNCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkJICogVGhlIHBpdGNoIHJhbmdlIGZvciB0aGUgMXN0LzNyZCBzdWJmcmFtZSBpcyBlbmNvZGVkIHdpdGggICAgICoNCisJCQkJICogOCBiaXRzIGFuZCBpcyBkaXZpZGVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkJICogICBQSVRfTUlOIHRvIFBJVF9GUjEtMSAgcmVzb2x1dGlvbiAxLzIgKGZyYWMgPSAwIG9yIDIpICAgICAgICoNCisJCQkJICogICBQSVRfRlIxIHRvIFBJVF9NQVggICAgcmVzb2x1dGlvbiAxICAgKGZyYWMgPSAwKSAgICAgICAgICAgICoNCisJCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJCWlmIChUMCA8IFBJVF9GUjFfOGIpDQorCQkJCXsNCisJCQkJCWluZGV4ID0gKChUMCA8PCAxKSArIChUMF9mcmFjID4+IDEpIC0gKFBJVF9NSU48PDEpKTsNCisJCQkJfSBlbHNlDQorCQkJCXsNCisJCQkJCWluZGV4ID0gKChUMCAtIFBJVF9GUjFfOGIpICsgKChQSVRfRlIxXzhiIC0gUElUX01JTikqMikpOw0KKwkJCQl9DQorDQorCQkJCVBhcm1fc2VyaWFsKGluZGV4LCA4LCAmcHJtcyk7DQorDQorCQkJCS8qIGZpbmQgVDBfbWluIGFuZCBUMF9tYXggZm9yIHN1YmZyYW1lIDIgYW5kIDQgKi8NCisJCQkJVDBfbWluID0gKFQwIC0gOCk7DQorCQkJCWlmIChUMF9taW4gPCBQSVRfTUlOKQ0KKwkJCQl7DQorCQkJCQlUMF9taW4gPSBQSVRfTUlOOw0KKwkJCQl9DQorCQkJCVQwX21heCA9IFQwX21pbiArIDE1Ow0KKwkJCQlpZiAoVDBfbWF4ID4gUElUX01BWCkNCisJCQkJew0KKwkJCQkJVDBfbWF4ID0gUElUX01BWDsNCisJCQkJCVQwX21pbiA9IChUMF9tYXggLSAxNSk7DQorCQkJCX0NCisJCQl9IGVsc2UNCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgc3ViZnJhbWUgMiBvciA0ICovDQorCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkJCSAqIFRoZSBwaXRjaCByYW5nZSBmb3Igc3ViZnJhbWUgMiBvciA0IGlzIGVuY29kZWQgd2l0aCA1IGJpdHM6ICAqDQorCQkJCSAqICAgVDBfbWluICB0byBUMF9tYXggICAgIHJlc29sdXRpb24gMS8yIChmcmFjID0gMCBvciAyKSAgICAgICAqDQorCQkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJCQlpID0gKFQwIC0gVDBfbWluKTsNCisJCQkJaW5kZXggPSAoaSA8PCAxKSArIChUMF9mcmFjID4+IDEpOw0KKw0KKwkJCQlQYXJtX3NlcmlhbChpbmRleCwgNSwgJnBybXMpOw0KKwkJCX0NCisJCX0gZWxzZQ0KKwkJew0KKwkJCVQwID0gUGl0Y2hfZnI0KCZleGNbaV9zdWJmcl0sIHhuLCBoMSwgVDBfbWluLCBUMF9tYXgsICZUMF9mcmFjLA0KKwkJCQkJcGl0X2ZsYWcsIFBJVF9GUjIsIFBJVF9GUjFfOWIsIExfU1VCRlIpOw0KKw0KKwkJCS8qIGVuY29kZSBwaXRjaCBsYWcgKi8NCisJCQlpZiAocGl0X2ZsYWcgPT0gMCkgICAgICAgICAgICAgLyogaWYgMXN0LzNyZCBzdWJmcmFtZSAqLw0KKwkJCXsNCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkJICogVGhlIHBpdGNoIHJhbmdlIGZvciB0aGUgMXN0LzNyZCBzdWJmcmFtZSBpcyBlbmNvZGVkIHdpdGggICAgICoNCisJCQkJICogOSBiaXRzIGFuZCBpcyBkaXZpZGVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkJICogICBQSVRfTUlOIHRvIFBJVF9GUjItMSAgcmVzb2x1dGlvbiAxLzQgKGZyYWMgPSAwLDEsMiBvciAzKSAgICoNCisJCQkJICogICBQSVRfRlIyIHRvIFBJVF9GUjEtMSAgcmVzb2x1dGlvbiAxLzIgKGZyYWMgPSAwIG9yIDEpICAgICAgICoNCisJCQkJICogICBQSVRfRlIxIHRvIFBJVF9NQVggICAgcmVzb2x1dGlvbiAxICAgKGZyYWMgPSAwKSAgICAgICAgICAgICoNCisJCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQkJCWlmIChUMCA8IFBJVF9GUjIpDQorCQkJCXsNCisJCQkJCWluZGV4ID0gKChUMCA8PCAyKSArIFQwX2ZyYWMpIC0gKFBJVF9NSU4gPDwgMik7DQorCQkJCX0gZWxzZSBpZihUMCA8IFBJVF9GUjFfOWIpDQorCQkJCXsNCisJCQkJCWluZGV4ID0gKCgoKFQwIDw8IDEpICsgKFQwX2ZyYWMgPj4gMSkpIC0gKFBJVF9GUjI8PDEpKSArICgoUElUX0ZSMiAtIFBJVF9NSU4pPDwyKSk7DQorCQkJCX0gZWxzZQ0KKwkJCQl7DQorCQkJCQlpbmRleCA9ICgoKFQwIC0gUElUX0ZSMV85YikgKyAoKFBJVF9GUjIgLSBQSVRfTUlOKTw8MikpICsgKChQSVRfRlIxXzliIC0gUElUX0ZSMik8PDEpKTsNCisJCQkJfQ0KKw0KKwkJCQlQYXJtX3NlcmlhbChpbmRleCwgOSwgJnBybXMpOw0KKw0KKwkJCQkvKiBmaW5kIFQwX21pbiBhbmQgVDBfbWF4IGZvciBzdWJmcmFtZSAyIGFuZCA0ICovDQorDQorCQkJCVQwX21pbiA9IChUMCAtIDgpOw0KKwkJCQlpZiAoVDBfbWluIDwgUElUX01JTikNCisJCQkJew0KKwkJCQkJVDBfbWluID0gUElUX01JTjsgDQorCQkJCX0NCisJCQkJVDBfbWF4ID0gVDBfbWluICsgMTU7DQorDQorCQkJCWlmIChUMF9tYXggPiBQSVRfTUFYKQ0KKwkJCQl7DQorCQkJCQlUMF9tYXggPSBQSVRfTUFYOw0KKwkJCQkJVDBfbWluID0gKFQwX21heCAtIDE1KTsNCisJCQkJfQ0KKwkJCX0gZWxzZQ0KKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBzdWJmcmFtZSAyIG9yIDQgKi8NCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkJICogVGhlIHBpdGNoIHJhbmdlIGZvciBzdWJmcmFtZSAyIG9yIDQgaXMgZW5jb2RlZCB3aXRoIDYgYml0czogICoNCisJCQkJICogICBUMF9taW4gIHRvIFQwX21heCAgICAgcmVzb2x1dGlvbiAxLzQgKGZyYWMgPSAwLDEsMiBvciAzKSAgICoNCisJCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJCWkgPSAoVDAgLSBUMF9taW4pOw0KKwkJCQlpbmRleCA9IChpIDw8IDIpICsgVDBfZnJhYzsNCisJCQkJUGFybV9zZXJpYWwoaW5kZXgsIDYsICZwcm1zKTsNCisJCQl9DQorCQl9DQorDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogR2FpbiBjbGlwcGluZyB0ZXN0IHRvIGF2b2lkIHVuc3RhYmxlIHN5bnRoZXNpcyBvbiBmcmFtZSBlcmFzdXJlICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkJY2xpcF9nYWluID0gMDsNCisJCWlmKChzdC0+Z3BfY2xpcFswXSA8IDE1NCkgJiYgKHN0LT5ncF9jbGlwWzFdID4gMTQ3NDYpKQ0KKwkJCWNsaXBfZ2FpbiA9IDE7DQorDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogLSBmaW5kIHVuaXR5IGdhaW4gcGl0Y2ggZXhjaXRhdGlvbiAoYWRhcHRpdmUgY29kZWJvb2sgZW50cnkpICAgICoNCisJCSAqICAgd2l0aCBmcmFjdGlvbmFsIGludGVycG9sYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAtIGZpbmQgZmlsdGVyZWQgcGl0Y2ggZXhjLiB5MVtdPWV4Y1tdIGNvbnZvbHZlZCB3aXRoIGgxW10pICAgICAgKg0KKwkJICogLSBjb21wdXRlIHBpdGNoIGdhaW4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJLyogZmluZCBwaXRjaCBleGl0YXRpb24gKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlwcmVkX2x0NF9hc20oJmV4Y1tpX3N1YmZyXSwgVDAsIFQwX2ZyYWMsIExfU1VCRlIgKyAxKTsNCisjZWxzZQ0KKwkJUHJlZF9sdDQoJmV4Y1tpX3N1YmZyXSwgVDAsIFQwX2ZyYWMsIExfU1VCRlIgKyAxKTsNCisjZW5kaWYNCisJCWlmICgqc2VyX3NpemUgPiBOQkJJVFNfOWspDQorCQl7DQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCQlDb252b2x2ZV9hc20oJmV4Y1tpX3N1YmZyXSwgaDEsIHkxLCBMX1NVQkZSKTsNCisjZWxzZQ0KKwkJCUNvbnZvbHZlKCZleGNbaV9zdWJmcl0sIGgxLCB5MSwgTF9TVUJGUik7DQorI2VuZGlmIA0KKwkJCWdhaW4xID0gR19waXRjaCh4biwgeTEsIGdfY29lZmYsIExfU1VCRlIpOw0KKwkJCS8qIGNsaXAgZ2FpbiBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgcHJvYmxlbSBhdCBkZWNvZGVyICovDQorCQkJaWYgKChjbGlwX2dhaW4gIT0gMCkgJiYgKGdhaW4xID4gR1BfQ0xJUCkpDQorCQkJew0KKwkJCQlnYWluMSA9IEdQX0NMSVA7IA0KKwkJCX0NCisJCQkvKiBmaW5kIGVuZXJneSBvZiBuZXcgdGFyZ2V0IHhuMltdICovDQorCQkJVXBkdF90YXIoeG4sIGRuLCB5MSwgZ2FpbjEsIExfU1VCRlIpOyAgICAgICAvKiBkbiB1c2VkIHRlbXBvcmFyeSAqLw0KKwkJfSBlbHNlDQorCQl7DQorCQkJZ2FpbjEgPSAwOyANCisJCX0NCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAtIGZpbmQgcGl0Y2ggZXhjaXRhdGlvbiBmaWx0ZXJlZCBieSAxc3Qgb3JkZXIgTFAgZmlsdGVyLiAgICAgICAgKg0KKwkJICogLSBmaW5kIGZpbHRlcmVkIHBpdGNoIGV4Yy4geTJbXT1leGNbXSBjb252b2x2ZWQgd2l0aCBoMVtdKSAgICAgICoNCisJCSAqIC0gY29tcHV0ZSBwaXRjaCBnYWluMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCS8qIGZpbmQgcGl0Y2ggZXhjaXRhdGlvbiB3aXRoIGxwIGZpbHRlciAqLw0KKwkJdm9fcDAgPSBleGMgKyBpX3N1YmZyLTE7DQorCQl2b19wMSA9IGNvZGU7DQorCQkvKiBmaW5kIHBpdGNoIGV4Y2l0YXRpb24gd2l0aCBscCBmaWx0ZXIgKi8NCisJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSLzI7IGkrKykNCisJCXsNCisJCQlMX3RtcCA9IDU4OTggKiAqdm9fcDArKzsNCisJCQlMX3RtcDEgPSA1ODk4ICogKnZvX3AwOw0KKwkJCUxfdG1wICs9IDIwOTcyICogKnZvX3AwKys7DQorCQkJTF90bXAxICs9IDIwOTcyICogKnZvX3AwKys7DQorCQkJTF90bXAxICs9IDU4OTggKiAqdm9fcDAtLTsNCisJCQlMX3RtcCArPSA1ODk4ICogKnZvX3AwOw0KKwkJCSp2b19wMSsrID0gKExfdG1wICsgMHg0MDAwKT4+MTU7DQorCQkJKnZvX3AxKysgPSAoTF90bXAxICsgMHg0MDAwKT4+MTU7DQorCQl9DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlDb252b2x2ZV9hc20oY29kZSwgaDEsIHkyLCBMX1NVQkZSKTsNCisjZWxzZQ0KKwkJQ29udm9sdmUoY29kZSwgaDEsIHkyLCBMX1NVQkZSKTsNCisjZW5kaWYgDQorDQorCQlnYWluMiA9IEdfcGl0Y2goeG4sIHkyLCBnX2NvZWZmMiwgTF9TVUJGUik7DQorDQorCQkvKiBjbGlwIGdhaW4gaWYgbmVjZXNzYXJ5IHRvIGF2b2lkIHByb2JsZW0gYXQgZGVjb2RlciAqLw0KKwkJaWYgKChjbGlwX2dhaW4gIT0gMCkgJiYgKGdhaW4yID4gR1BfQ0xJUCkpDQorCQl7DQorCQkJZ2FpbjIgPSBHUF9DTElQOw0KKwkJfQ0KKwkJLyogZmluZCBlbmVyZ3kgb2YgbmV3IHRhcmdldCB4bjJbXSAqLw0KKwkJVXBkdF90YXIoeG4sIHhuMiwgeTIsIGdhaW4yLCBMX1NVQkZSKTsNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiB1c2UgdGhlIGJlc3QgcHJlZGljdGlvbiAobWluaW1pc2UgcXVhZHJhdGljIGVycm9yKS4gICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQlzZWxlY3QgPSAwOyANCisJCWlmKCpzZXJfc2l6ZSA+IE5CQklUU185aykNCisJCXsNCisJCQlMX3RtcCA9IDBMOw0KKwkJCXZvX3AwID0gZG47DQorCQkJdm9fcDEgPSB4bjI7DQorCQkJZm9yIChpID0gMDsgaSA8IExfU1VCRlIvMjsgaSsrKQ0KKwkJCXsNCisJCQkJTF90bXAgKz0gKnZvX3AwICogKnZvX3AwOw0KKwkJCQl2b19wMCsrOw0KKwkJCQlMX3RtcCAtPSAqdm9fcDEgKiAqdm9fcDE7DQorCQkJCXZvX3AxKys7DQorCQkJCUxfdG1wICs9ICp2b19wMCAqICp2b19wMDsNCisJCQkJdm9fcDArKzsNCisJCQkJTF90bXAgLT0gKnZvX3AxICogKnZvX3AxOw0KKwkJCQl2b19wMSsrOw0KKwkJCX0NCisNCisJCQlpZiAoTF90bXAgPD0gMCkNCisJCQl7DQorCQkJCXNlbGVjdCA9IDE7IA0KKwkJCX0NCisJCQlQYXJtX3NlcmlhbChzZWxlY3QsIDEsICZwcm1zKTsNCisJCX0NCisJCWlmIChzZWxlY3QgPT0gMCkNCisJCXsNCisJCQkvKiB1c2UgdGhlIGxwIGZpbHRlciBmb3IgcGl0Y2ggZXhjaXRhdGlvbiBwcmVkaWN0aW9uICovDQorCQkJZ2Fpbl9waXQgPSBnYWluMjsNCisJCQlDb3B5KGNvZGUsICZleGNbaV9zdWJmcl0sIExfU1VCRlIpOw0KKwkJCUNvcHkoeTIsIHkxLCBMX1NVQkZSKTsNCisJCQlDb3B5KGdfY29lZmYyLCBnX2NvZWZmLCA0KTsNCisJCX0gZWxzZQ0KKwkJew0KKwkJCS8qIG5vIGZpbHRlciB1c2VkIGZvciBwaXRjaCBleGNpdGF0aW9uIHByZWRpY3Rpb24gKi8NCisJCQlnYWluX3BpdCA9IGdhaW4xOw0KKwkJCUNvcHkoZG4sIHhuMiwgTF9TVUJGUik7ICAgICAgICAvKiB0YXJnZXQgdmVjdG9yIGZvciBjb2RlYm9vayBzZWFyY2ggKi8NCisJCX0NCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAtIHVwZGF0ZSBjbltdIGZvciBjb2RlYm9vayBzZWFyY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQlVcGR0X3RhcihjbiwgY24sICZleGNbaV9zdWJmcl0sIGdhaW5fcGl0LCBMX1NVQkZSKTsNCisNCisjaWZkZWYgIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJU2NhbGVfc2lnX29wdChjbiwgTF9TVUJGUiwgc2hpZnQpOyAgICAgLyogc2NhbGluZyBvZiBjbltdIHRvIGxpbWl0IGR5bmFtaWMgYXQgMTIgYml0cyAqLw0KKyNlbHNlDQorCQlTY2FsZV9zaWcoY24sIExfU1VCRlIsIHNoaWZ0KTsgICAgIC8qIHNjYWxpbmcgb2YgY25bXSB0byBsaW1pdCBkeW5hbWljIGF0IDEyIGJpdHMgKi8NCisjZW5kaWYNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAtIGluY2x1ZGUgZml4ZWQtZ2FpbiBwaXRjaCBjb250cmlidXRpb24gaW50byBpbXB1bHNlIHJlc3AuIGgxW10gKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQl0bXAgPSAwOw0KKwkJUHJlZW1waChoMiwgc3QtPnRpbHRfY29kZSwgTF9TVUJGUiwgJnRtcCk7DQorDQorCQlpZiAoVDBfZnJhYyA+IDIpDQorCQkJVDAgPSAoVDAgKyAxKTsNCisJCVBpdF9zaHJwKGgyLCBUMCwgUElUX1NIQVJQLCBMX1NVQkZSKTsNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAtIENvcnJlbGF0aW9uIGJldHdlZW4gdGFyZ2V0IHhuMltdIGFuZCBpbXB1bHNlIHJlc3BvbnNlIGgxW10gICAgKg0KKwkJICogLSBJbm5vdmF0aXZlIGNvZGVib29rIHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJY29yX2hfeChoMiwgeG4yLCBkbik7DQorCQlpZiAoKnNlcl9zaXplIDw9IE5CQklUU183aykNCisJCXsNCisJCQlBQ0VMUF8ydDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgMTIsICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzlrKQ0KKwkJew0KKwkJCUFDRUxQXzR0NjRfZngoZG4sIGNuLCBoMiwgY29kZSwgeTIsIDIwLCAqc2VyX3NpemUsIGluZGljZSk7DQorDQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCA1LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCA1LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCA1LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCA1LCAmcHJtcyk7DQorCQl9IGVsc2UgaWYoKnNlcl9zaXplIDw9IE5CQklUU18xMmspDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgMzYsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDksICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDksICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDksICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDksICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzE0aykNCisJCXsNCisJCQlBQ0VMUF80dDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCA0NCwgKnNlcl9zaXplLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgMTMsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDEzLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCA5LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCA5LCAmcHJtcyk7DQorCQl9IGVsc2UgaWYoKnNlcl9zaXplIDw9IE5CQklUU18xNmspDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgNTIsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDEzLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCAxMywgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgMTMsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDEzLCAmcHJtcyk7DQorCQl9IGVsc2UgaWYoKnNlcl9zaXplIDw9IE5CQklUU18xOGspDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgNjQsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDIsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDIsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDIsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDIsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNF0sIDE0LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzVdLCAxNCwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs2XSwgMTQsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbN10sIDE0LCAmcHJtcyk7DQorCQl9IGVsc2UgaWYoKnNlcl9zaXplIDw9IE5CQklUU18yMGspDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgNzIsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDEwLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCAxMCwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVszXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs0XSwgMTAsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNV0sIDEwLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzZdLCAxNCwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs3XSwgMTQsICZwcm1zKTsNCisJCX0gZWxzZQ0KKwkJew0KKwkJCUFDRUxQXzR0NjRfZngoZG4sIGNuLCBoMiwgY29kZSwgeTIsIDg4LCAqc2VyX3NpemUsIGluZGljZSk7DQorDQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCAxMSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgMTEsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDExLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCAxMSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs0XSwgMTEsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNV0sIDExLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzZdLCAxMSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs3XSwgMTEsICZwcm1zKTsNCisJCX0NCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gQWRkIHRoZSBmaXhlZC1nYWluIHBpdGNoIGNvbnRyaWJ1dGlvbiB0byBjb2RlW10uICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQl0bXAgPSAwOyANCisJCVByZWVtcGgoY29kZSwgc3QtPnRpbHRfY29kZSwgTF9TVUJGUiwgJnRtcCk7DQorCQlQaXRfc2hycChjb2RlLCBUMCwgUElUX1NIQVJQLCBMX1NVQkZSKTsNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqICAtIENvbXB1dGUgdGhlIGZpeGVkIGNvZGVib29rIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqICAtIHF1YW50aXplIGZpeGVkIGNvZGVib29rIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQlpZigqc2VyX3NpemUgPD0gTkJCSVRTXzlrKQ0KKwkJew0KKwkJCWluZGV4ID0gUV9nYWluMih4biwgeTEsIFFfbmV3ICsgc2hpZnQsIHkyLCBjb2RlLCBnX2NvZWZmLCBMX1NVQkZSLCA2LA0KKwkJCQkJJmdhaW5fcGl0LCAmTF9nYWluX2NvZGUsIGNsaXBfZ2Fpbiwgc3QtPnF1YV9nYWluKTsNCisJCQlQYXJtX3NlcmlhbChpbmRleCwgNiwgJnBybXMpOw0KKwkJfSBlbHNlDQorCQl7DQorCQkJaW5kZXggPSBRX2dhaW4yKHhuLCB5MSwgUV9uZXcgKyBzaGlmdCwgeTIsIGNvZGUsIGdfY29lZmYsIExfU1VCRlIsIDcsDQorCQkJCQkmZ2Fpbl9waXQsICZMX2dhaW5fY29kZSwgY2xpcF9nYWluLCBzdC0+cXVhX2dhaW4pOw0KKwkJCVBhcm1fc2VyaWFsKGluZGV4LCA3LCAmcHJtcyk7DQorCQl9DQorCQkvKiB0ZXN0IHF1YW50aXplZCBnYWluIG9mIHBpdGNoIGZvciBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCisJCUdwX2NsaXBfdGVzdF9nYWluX3BpdChnYWluX3BpdCwgc3QtPmdwX2NsaXApOw0KKw0KKwkJTF90bXAgPSBMX3NobChMX2dhaW5fY29kZSwgUV9uZXcpOyANCisJCWdhaW5fY29kZSA9IGV4dHJhY3RfaChMX2FkZChMX3RtcCwgMHg4MDAwKSk7DQorDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiBVcGRhdGUgcGFyYW1ldGVycyBmb3IgdGhlIG5leHQgc3ViZnJhbWUuICAgICAgICAgICAgICAgICAqDQorCQkgKiAtIHRpbHQgb2YgY29kZTogMC4wICh1bnZvaWNlZCkgdG8gMC41ICh2b2ljZWQpICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJLyogZmluZCB2b2ljZSBmYWN0b3IgaW4gUTE1ICgxPXZvaWNlZCwgLTE9dW52b2ljZWQpICovDQorCQlDb3B5KCZleGNbaV9zdWJmcl0sIGV4YzIsIExfU1VCRlIpOw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCVNjYWxlX3NpZ19vcHQoZXhjMiwgTF9TVUJGUiwgc2hpZnQpOw0KKyNlbHNlDQorCQlTY2FsZV9zaWcoZXhjMiwgTF9TVUJGUiwgc2hpZnQpOw0KKyNlbmRpZg0KKwkJdm9pY2VfZmFjID0gdm9pY2VfZmFjdG9yKGV4YzIsIHNoaWZ0LCBnYWluX3BpdCwgY29kZSwgZ2Fpbl9jb2RlLCBMX1NVQkZSKTsNCisJCS8qIHRpbHQgb2YgY29kZSBmb3IgbmV4dCBzdWJmcmFtZTogMC41PXZvaWNlZCwgMD11bnZvaWNlZCAqLw0KKwkJc3QtPnRpbHRfY29kZSA9ICgodm9pY2VfZmFjID4+IDIpICsgODE5Mik7DQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gVXBkYXRlIGZpbHRlcidzIG1lbW9yeSAibWVtX3cwIiBmb3IgZmluZGluZyB0aGUgICAgKg0KKwkJICogICB0YXJnZXQgdmVjdG9yIGluIHRoZSBuZXh0IHN1YmZyYW1lLiAgICAgICAgICAgICAgICAqDQorCQkgKiAtIEZpbmQgdGhlIHRvdGFsIGV4Y2l0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqIC0gRmluZCBzeW50aGVzaXMgc3BlZWNoIHRvIHVwZGF0ZSBtZW1fc3luW10uICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkJLyogeTIgaW4gUTksIGdhaW5fcGl0IGluIFExNCAqLw0KKwkJTF90bXAgPSAoZ2Fpbl9jb2RlICogeTJbTF9TVUJGUiAtIDFdKTw8MTsNCisJCUxfdG1wID0gTF9zaGwoTF90bXAsICg1ICsgc2hpZnQpKTsNCisJCUxfdG1wID0gTF9uZWdhdGUoTF90bXApOw0KKwkJTF90bXAgKz0gKHhuW0xfU1VCRlIgLSAxXSAqIDE2Mzg0KTw8MTsNCisJCUxfdG1wIC09ICh5MVtMX1NVQkZSIC0gMV0gKiBnYWluX3BpdCk8PDE7DQorCQlMX3RtcCA9IExfc2hsKExfdG1wLCAoMSAtIHNoaWZ0KSk7DQorCQlzdC0+bWVtX3cwID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsNCisNCisJCWlmICgqc2VyX3NpemUgPj0gTkJCSVRTXzI0aykNCisJCQlDb3B5KCZleGNbaV9zdWJmcl0sIGV4YzIsIExfU1VCRlIpOw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCXsNCisJCQkvKiBjb2RlIGluIFE5LCBnYWluX3BpdCBpbiBRMTQgKi8NCisJCQlMX3RtcCA9IChnYWluX2NvZGUgKiBjb2RlW2ldKTw8MTsNCisJCQlMX3RtcCA9IChMX3RtcCA8PCA1KTsNCisJCQlMX3RtcCArPSAoZXhjW2kgKyBpX3N1YmZyXSAqIGdhaW5fcGl0KTw8MTsNCisJCQlMX3RtcCA9IExfc2hsMihMX3RtcCwgMSk7IA0KKwkJCWV4Y1tpICsgaV9zdWJmcl0gPSBleHRyYWN0X2goTF9hZGQoTF90bXAsIDB4ODAwMCkpOw0KKwkJfQ0KKw0KKwkJU3luX2ZpbHQocF9BcSwmZXhjW2lfc3ViZnJdLCBzeW50aCwgTF9TVUJGUiwgc3QtPm1lbV9zeW4sIDEpOw0KKw0KKwkJaWYoKnNlcl9zaXplID49IE5CQklUU18yNGspDQorCQl7DQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkJICogcGhhc2UgZGlzcGVyc2lvbiB0byBlbmhhbmNlIG5vaXNlIGluIGxvdyBiaXQgcmF0ZSAgICAgICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJCS8qIExfZ2Fpbl9jb2RlIGluIFExNiAqLw0KKwkJCVZPX0xfRXh0cmFjdChMX2dhaW5fY29kZSwgJmdhaW5fY29kZSwgJmdhaW5fY29kZV9sbyk7DQorDQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkJICogbm9pc2UgZW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkJICogfn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkJICogLSBFbmhhbmNlIGV4Y2l0YXRpb24gb24gbm9pc2UuIChtb2RpZnkgZ2FpbiBvZiBjb2RlKSAgICAgICAqDQorCQkJICogICBJZiBzaWduYWwgaXMgbm9pc3kgYW5kIExQQyBmaWx0ZXIgaXMgc3RhYmxlLCBtb3ZlIGdhaW4gICAqDQorCQkJICogICBvZiBjb2RlIDEuNSBkQiB0b3dhcmQgZ2FpbiBvZiBjb2RlIHRocmVzaG9sZC4gICAgICAgICAgICAqDQorCQkJICogICBUaGlzIGRlY3JlYXNlIGJ5IDMgZEIgbm9pc2UgZW5lcmd5IHZhcmlhdGlvbi4gICAgICAgICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJCXRtcCA9ICgxNjM4NCAtICh2b2ljZV9mYWMgPj4gMSkpOyAgICAgICAgLyogMT11bnZvaWNlZCwgMD12b2ljZWQgKi8NCisJCQlmYWMgPSB2b19tdWx0KHN0YWJfZmFjLCB0bXApOw0KKwkJCUxfdG1wID0gTF9nYWluX2NvZGU7IA0KKwkJCWlmKExfdG1wIDwgc3QtPkxfZ2NfdGhyZXMpDQorCQkJew0KKwkJCQlMX3RtcCA9IHZvX0xfYWRkKExfdG1wLCBNcHlfMzJfMTYoZ2Fpbl9jb2RlLCBnYWluX2NvZGVfbG8sIDYyMjYpKTsNCisJCQkJaWYoTF90bXAgPiBzdC0+TF9nY190aHJlcykNCisJCQkJew0KKwkJCQkJTF90bXAgPSBzdC0+TF9nY190aHJlczsNCisJCQkJfQ0KKwkJCX0gZWxzZQ0KKwkJCXsNCisJCQkJTF90bXAgPSBNcHlfMzJfMTYoZ2Fpbl9jb2RlLCBnYWluX2NvZGVfbG8sIDI3NTM2KTsNCisJCQkJaWYoTF90bXAgPCBzdC0+TF9nY190aHJlcykNCisJCQkJew0KKwkJCQkJTF90bXAgPSBzdC0+TF9nY190aHJlczsNCisJCQkJfQ0KKwkJCX0NCisJCQlzdC0+TF9nY190aHJlcyA9IExfdG1wOw0KKw0KKwkJCUxfZ2Fpbl9jb2RlID0gTXB5XzMyXzE2KGdhaW5fY29kZSwgZ2Fpbl9jb2RlX2xvLCAoMzI3NjcgLSBmYWMpKTsNCisJCQlWT19MX0V4dHJhY3QoTF90bXAsICZnYWluX2NvZGUsICZnYWluX2NvZGVfbG8pOw0KKwkJCUxfZ2Fpbl9jb2RlID0gdm9fTF9hZGQoTF9nYWluX2NvZGUsIE1weV8zMl8xNihnYWluX2NvZGUsIGdhaW5fY29kZV9sbywgZmFjKSk7DQorDQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkJICogcGl0Y2ggZW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkJICogfn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkJICogLSBFbmhhbmNlIGV4Y2l0YXRpb24gb24gdm9pY2UuIChIUCBmaWx0ZXJpbmcgb2YgY29kZSkgICAgICAqDQorCQkJICogICBPbiB2b2ljZWQgc2lnbmFsLCBmaWx0ZXJpbmcgb2YgY29kZSBieSBhIHNtb290aCBmaXIgSFAgICAqDQorCQkJICogICBmaWx0ZXIgdG8gZGVjcmVhc2UgZW5lcmd5IG9mIGNvZGUgaW4gbG93IGZyZXF1ZW5jeS4gICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkJCXRtcCA9ICgodm9pY2VfZmFjID4+IDMpICsgNDA5Nik7IC8qIDAuMjU9dm9pY2VkLCAwPXVudm9pY2VkICovDQorDQorCQkJTF90bXAgPSBMX2RlcG9zaXRfaChjb2RlWzBdKTsNCisJCQlMX3RtcCAtPSAoY29kZVsxXSAqIHRtcCk8PDE7DQorCQkJY29kZTJbMF0gPSB2b19yb3VuZChMX3RtcCk7IA0KKw0KKwkJCWZvciAoaSA9IDE7IGkgPCBMX1NVQkZSIC0gMTsgaSsrKQ0KKwkJCXsNCisJCQkJTF90bXAgPSBMX2RlcG9zaXRfaChjb2RlW2ldKTsNCisJCQkJTF90bXAgLT0gKGNvZGVbaSArIDFdICogdG1wKTw8MTsNCisJCQkJTF90bXAgLT0gKGNvZGVbaSAtIDFdICogdG1wKTw8MTsNCisJCQkJY29kZTJbaV0gPSB2b19yb3VuZChMX3RtcCk7IA0KKwkJCX0NCisNCisJCQlMX3RtcCA9IExfZGVwb3NpdF9oKGNvZGVbTF9TVUJGUiAtIDFdKTsNCisJCQlMX3RtcCAtPSAoY29kZVtMX1NVQkZSIC0gMl0gKiB0bXApPDwxOw0KKwkJCWNvZGUyW0xfU1VCRlIgLSAxXSA9IHZvX3JvdW5kKExfdG1wKTsgDQorDQorCQkJLyogYnVpbGQgZXhjaXRhdGlvbiAqLw0KKwkJCWdhaW5fY29kZSA9IHZvX3JvdW5kKExfc2hsKExfZ2Fpbl9jb2RlLCBRX25ldykpOw0KKw0KKwkJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCQkJew0KKwkJCQlMX3RtcCA9IChjb2RlMltpXSAqIGdhaW5fY29kZSk8PDE7DQorCQkJCUxfdG1wID0gKExfdG1wIDw8IDUpOw0KKwkJCQlMX3RtcCArPSAoZXhjMltpXSAqIGdhaW5fcGl0KTw8MTsNCisJCQkJTF90bXAgPSAoTF90bXAgPDwgMSk7DQorCQkJCWV4YzJbaV0gPSB2b19yb3VuZChMX3RtcCk7DQorCQkJfQ0KKw0KKwkJCWNvcnJfZ2FpbiA9IHN5bnRoZXNpcyhwX0FxLCBleGMyLCBRX25ldywgJnNwZWVjaDE2a1tpX3N1YmZyICogNSAvIDRdLCBzdCk7DQorCQkJUGFybV9zZXJpYWwoY29ycl9nYWluLCA0LCAmcHJtcyk7DQorCQl9DQorCQlwX0EgKz0gKE0gKyAxKTsNCisJCXBfQXEgKz0gKE0gKyAxKTsNCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHN1YmZyYW1lIGxvb3AgKi8NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogVXBkYXRlIHNpZ25hbCBmb3IgbmV4dCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICoNCisJICogLT4gc2F2ZSBwYXN0IG9mIHNwZWVjaFtdLCB3c3BbXSBhbmQgZXhjW10uICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUNvcHkoJm9sZF9zcGVlY2hbTF9GUkFNRV0sIHN0LT5vbGRfc3BlZWNoLCBMX1RPVEFMIC0gTF9GUkFNRSk7DQorCUNvcHkoJm9sZF93c3BbTF9GUkFNRSAvIE9QTF9ERUNJTV0sIHN0LT5vbGRfd3NwLCBQSVRfTUFYIC8gT1BMX0RFQ0lNKTsNCisJQ29weSgmb2xkX2V4Y1tMX0ZSQU1FXSwgc3QtPm9sZF9leGMsIFBJVF9NQVggKyBMX0lOVEVSUE9MKTsNCisJcmV0dXJuOw0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogRnVuY3Rpb24gc3ludGhlc2lzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBTeW50aGVzaXMgb2Ygc2lnbmFsIGF0IDE2a0h6IHdpdGggSEYgZXh0ZW5zaW9uLiAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3N0YXRpYyBXb3JkMTYgc3ludGhlc2lzKA0KKwkJV29yZDE2IEFxW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBKHopICA6IHF1YW50aXplZCBBeiAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhjaXRhdGlvbiBhdCAxMmtIeiAgICAgICAgKi8NCisJCVdvcmQxNiBRX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzY2FsaW5nIHBlcmZvcm1lZCBvbiBleGMgICAqLw0KKwkJV29yZDE2IHN5bnRoMTZrW10sICAgICAgICAgICAgICAgICAgICAvKiAobykgICA6IDE2a0h6IHN5bnRoZXNpcyBzaWduYWwgICAgICovDQorCQlDb2Rlcl9TdGF0ZSAqIHN0ICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiBmYWMsIHRtcCwgZXhwOw0KKwlXb3JkMTYgZW5lciwgZXhwX2VuZXI7DQorCVdvcmQzMiBMX3RtcCwgaTsNCisNCisJV29yZDE2IHN5bnRoX2hpW00gKyBMX1NVQkZSXSwgc3ludGhfbG9bTSArIExfU1VCRlJdOw0KKwlXb3JkMTYgc3ludGhbTF9TVUJGUl07DQorCVdvcmQxNiBIRltMX1NVQkZSMTZrXTsgICAgICAgICAgICAgICAgIC8qIEhpZ2ggRnJlcXVlbmN5IHZlY3RvciAgICAgICovDQorCVdvcmQxNiBBcFtNICsgMV07DQorDQorCVdvcmQxNiBIRl9TUFtMX1NVQkZSMTZrXTsgICAgICAgICAgICAgIC8qIEhpZ2ggRnJlcXVlbmN5IHZlY3RvciAoZnJvbSBvcmlnaW5hbCBzaWduYWwpICovDQorDQorCVdvcmQxNiBIUF9lc3RfZ2FpbiwgSFBfY2FsY19nYWluLCBIUF9jb3JyX2dhaW47DQorCVdvcmQxNiBkaXN0X21pbiwgZGlzdDsNCisJV29yZDE2IEhQX2dhaW5faW5kID0gMDsNCisJV29yZDE2IGdhaW4xLCBnYWluMjsNCisJV29yZDE2IHdlaWdodDEsIHdlaWdodDI7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBzcGVlY2ggc3ludGhlc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogfn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIC0gRmluZCBzeW50aGVzaXMgc3BlZWNoIGNvcnJlc3BvbmRpbmcgdG8gZXhjMltdLiAgICAgICAgICAgKg0KKwkgKiAtIFBlcmZvcm0gZml4ZWQgZGVlbXBoYXNpcyBhbmQgaHAgNTBoeiBmaWx0ZXJpbmcuICAgICAgICAgICoNCisJICogLSBPdmVyc2FtcGxpbmcgZnJvbSAxMi44a0h6IHRvIDE2a0h6LiAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJQ29weShzdC0+bWVtX3N5bl9oaSwgc3ludGhfaGksIE0pOw0KKwlDb3B5KHN0LT5tZW1fc3luX2xvLCBzeW50aF9sbywgTSk7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCVN5bl9maWx0XzMyX2FzbShBcSwgTSwgZXhjLCBRX25ldywgc3ludGhfaGkgKyBNLCBzeW50aF9sbyArIE0sIExfU1VCRlIpOw0KKyNlbHNlDQorCVN5bl9maWx0XzMyKEFxLCBNLCBleGMsIFFfbmV3LCBzeW50aF9oaSArIE0sIHN5bnRoX2xvICsgTSwgTF9TVUJGUik7DQorI2VuZGlmDQorDQorCUNvcHkoc3ludGhfaGkgKyBMX1NVQkZSLCBzdC0+bWVtX3N5bl9oaSwgTSk7DQorCUNvcHkoc3ludGhfbG8gKyBMX1NVQkZSLCBzdC0+bWVtX3N5bl9sbywgTSk7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCURlZW1waF8zMl9hc20oc3ludGhfaGkgKyBNLCBzeW50aF9sbyArIE0sIHN5bnRoLCAmKHN0LT5tZW1fZGVlbXBoKSk7DQorI2Vsc2UNCisJRGVlbXBoXzMyKHN5bnRoX2hpICsgTSwgc3ludGhfbG8gKyBNLCBzeW50aCwgUFJFRU1QSF9GQUMsIExfU1VCRlIsICYoc3QtPm1lbV9kZWVtcGgpKTsNCisjZW5kaWYNCisNCisJSFA1MF8xMms4KHN5bnRoLCBMX1NVQkZSLCBzdC0+bWVtX3NpZ19vdXQpOw0KKw0KKwkvKiBPcmlnaW5hbCBzcGVlY2ggc2lnbmFsIGFzIHJlZmVyZW5jZSBmb3IgaGlnaCBiYW5kIGdhaW4gcXVhbnRpc2F0aW9uICovDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSMTZrOyBpKyspDQorCXsNCisJCUhGX1NQW2ldID0gc3ludGgxNmtbaV07IA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBIRiBub2lzZSBzeW50aGVzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogfn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIC0gR2VuZXJhdGUgSEYgbm9pc2UgYmV0d2VlbiA1LjUgYW5kIDcuNSBrSHouICAgICAgICAgKg0KKwkgKiAtIFNldCBlbmVyZ3kgb2Ygbm9pc2UgYWNjb3JkaW5nIHRvIHN5bnRoZXNpcyB0aWx0LiAgICoNCisJICogICAgIHRpbHQgPiAwLjggPT0+IC0gMTQgZEIgKHZvaWNlZCkgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICB0aWx0ICAgMC41ID09PiAtIDYgZEIgICh2b2ljZWQgb3Igbm9pc2UpICAgICAgICAgKg0KKwkgKiAgICAgdGlsdCA8IDAuMCA9PT4gICAwIGRCICAobm9pc2UpICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkvKiBnZW5lcmF0ZSB3aGl0ZSBub2lzZSB2ZWN0b3IgKi8NCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIxNms7IGkrKykNCisJew0KKwkJSEZbaV0gPSBSYW5kb20oJihzdC0+c2VlZDIpKT4+MzsNCisJfQ0KKwkvKiBlbmVyZ3kgb2YgZXhjaXRhdGlvbiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlTY2FsZV9zaWdfb3B0KGV4YywgTF9TVUJGUiwgLTMpOw0KKwlRX25ldyA9IFFfbmV3IC0gMzsNCisJZW5lciA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShleGMsIGV4YywgTF9TVUJGUiwgJmV4cF9lbmVyKSk7DQorI2Vsc2UNCisJU2NhbGVfc2lnKGV4YywgTF9TVUJGUiwgLTMpOw0KKwlRX25ldyA9IFFfbmV3IC0gMzsNCisJZW5lciA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyKGV4YywgZXhjLCBMX1NVQkZSLCAmZXhwX2VuZXIpKTsNCisjZW5kaWYNCisNCisJZXhwX2VuZXIgPSBleHBfZW5lciAtIChRX25ldyArIFFfbmV3KTsNCisJLyogc2V0IGVuZXJneSBvZiB3aGl0ZSBub2lzZSB0byBlbmVyZ3kgb2YgZXhjaXRhdGlvbiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwl0bXAgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMl9hc20oSEYsIEhGLCBMX1NVQkZSMTZrLCAmZXhwKSk7DQorI2Vsc2UNCisJdG1wID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoSEYsIEhGLCBMX1NVQkZSMTZrLCAmZXhwKSk7DQorI2VuZGlmDQorDQorCWlmKHRtcCA+IGVuZXIpDQorCXsNCisJCXRtcCA9ICh0bXAgPj4gMSk7ICAgICAgICAgICAgICAgICAvKiBCZSBzdXJlIHRtcCA8IGVuZXIgKi8NCisJCWV4cCA9IChleHAgKyAxKTsNCisJfQ0KKwlMX3RtcCA9IExfZGVwb3NpdF9oKGRpdl9zKHRtcCwgZW5lcikpOyAvKiByZXN1bHQgaXMgbm9ybWFsaXplZCAqLw0KKwlleHAgPSAoZXhwIC0gZXhwX2VuZXIpOw0KKwlJc3FydF9uKCZMX3RtcCwgJmV4cCk7DQorCUxfdG1wID0gTF9zaGwoTF90bXAsIChleHAgKyAxKSk7ICAgICAgIC8qIExfdG1wIHggMiwgTF90bXAgaW4gUTMxICovDQorCXRtcCA9IGV4dHJhY3RfaChMX3RtcCk7ICAgICAgICAgICAgICAgIC8qIHRtcCA9IDIgeCBzcXJ0KGVuZXJfZXhjL2VuZXJfaGYpICovDQorDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSMTZrOyBpKyspDQorCXsNCisJCUhGW2ldID0gdm9fbXVsdChIRltpXSwgdG1wKTsNCisJfQ0KKw0KKwkvKiBmaW5kIHRpbHQgb2Ygc3ludGhlc2lzIHNwZWVjaCAodGlsdDogMT12b2ljZWQsIC0xPXVudm9pY2VkKSAqLw0KKwlIUDQwMF8xMms4KHN5bnRoLCBMX1NVQkZSLCBzdC0+bWVtX2hwNDAwKTsNCisNCisJTF90bXAgPSAxTDsNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCUxfdG1wICs9IChzeW50aFtpXSAqIHN5bnRoW2ldKTw8MTsNCisNCisJZXhwID0gbm9ybV9sKExfdG1wKTsNCisJZW5lciA9IGV4dHJhY3RfaChMX3RtcCA8PCBleHApOyAgIC8qIGVuZXIgPSByWzBdICovDQorDQorCUxfdG1wID0gMUw7DQorCWZvciAoaSA9IDE7IGkgPCBMX1NVQkZSOyBpKyspDQorCQlMX3RtcCArPShzeW50aFtpXSAqIHN5bnRoW2kgLSAxXSk8PDE7DQorDQorCXRtcCA9IGV4dHJhY3RfaChMX3RtcCA8PCBleHApOyAgICAvKiB0bXAgPSByWzFdICovDQorDQorCWlmICh0bXAgPiAwKQ0KKwl7DQorCQlmYWMgPSBkaXZfcyh0bXAsIGVuZXIpOw0KKwl9IGVsc2UNCisJew0KKwkJZmFjID0gMDsgDQorCX0NCisNCisJLyogbW9kaWZ5IGVuZXJneSBvZiB3aGl0ZSBub2lzZSBhY2NvcmRpbmcgdG8gc3ludGhlc2lzIHRpbHQgKi8NCisJZ2FpbjEgPSAzMjc2NyAtIGZhYzsNCisJZ2FpbjIgPSB2b19tdWx0KGdhaW4xLCAyMDQ4MCk7DQorCWdhaW4yID0gc2hsKGdhaW4yLCAxKTsNCisNCisJaWYgKHN0LT52YWRfaGlzdCA+IDApDQorCXsNCisJCXdlaWdodDEgPSAwOw0KKwkJd2VpZ2h0MiA9IDMyNzY3Ow0KKwl9IGVsc2UNCisJew0KKwkJd2VpZ2h0MSA9IDMyNzY3Ow0KKwkJd2VpZ2h0MiA9IDA7DQorCX0NCisJdG1wID0gdm9fbXVsdCh3ZWlnaHQxLCBnYWluMSk7DQorCXRtcCA9IGFkZDEodG1wLCB2b19tdWx0KHdlaWdodDIsIGdhaW4yKSk7DQorDQorCWlmICh0bXAgIT0gMCkNCisJew0KKwkJdG1wID0gKHRtcCArIDEpOw0KKwl9DQorCUhQX2VzdF9nYWluID0gdG1wOw0KKw0KKwlpZihIUF9lc3RfZ2FpbiA8IDMyNzcpDQorCXsNCisJCUhQX2VzdF9nYWluID0gMzI3NzsgICAgICAgICAgICAgICAgLyogMC4xIGluIFExNSAqLw0KKwl9DQorCS8qIHN5bnRoZXNpcyBvZiBub2lzZTogNC44a0h6Li41LjZrSHogLS0+IDZrSHouLjdrSHogKi8NCisJV2VpZ2h0X2EoQXEsIEFwLCAxOTY2MSwgTSk7ICAgICAgICAgICAgLyogZmFjPTAuNiAqLw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCVN5bl9maWx0X2FzbShBcCwgSEYsIEhGLCBzdC0+bWVtX3N5bl9oZik7DQorCS8qIG5vaXNlIEhpZ2ggUGFzcyBmaWx0ZXJpbmcgKDFtcyBvZiBkZWxheSkgKi8NCisJRmlsdF82a183a19hc20oSEYsIExfU1VCRlIxNmssIHN0LT5tZW1faGYpOw0KKwkvKiBmaWx0ZXJpbmcgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCAqLw0KKwlGaWx0XzZrXzdrX2FzbShIRl9TUCwgTF9TVUJGUjE2aywgc3QtPm1lbV9oZjIpOw0KKw0KKwkvKiBjaGVjayB0aGUgZ2FpbiBkaWZmZXJlbmNlICovDQorCVNjYWxlX3NpZ19vcHQoSEZfU1AsIExfU1VCRlIxNmssIC0xKTsNCisJZW5lciA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShIRl9TUCwgSEZfU1AsIExfU1VCRlIxNmssICZleHBfZW5lcikpOw0KKwkvKiBzZXQgZW5lcmd5IG9mIHdoaXRlIG5vaXNlIHRvIGVuZXJneSBvZiBleGNpdGF0aW9uICovDQorCXRtcCA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShIRiwgSEYsIExfU1VCRlIxNmssICZleHApKTsNCisjZWxzZQ0KKwlTeW5fZmlsdChBcCwgSEYsIEhGLCBMX1NVQkZSMTZrLCBzdC0+bWVtX3N5bl9oZiwgMSk7DQorCS8qIG5vaXNlIEhpZ2ggUGFzcyBmaWx0ZXJpbmcgKDFtcyBvZiBkZWxheSkgKi8NCisJRmlsdF82a183ayhIRiwgTF9TVUJGUjE2aywgc3QtPm1lbV9oZik7DQorCS8qIGZpbHRlcmluZyBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsICovDQorCUZpbHRfNmtfN2soSEZfU1AsIExfU1VCRlIxNmssIHN0LT5tZW1faGYyKTsNCisJLyogY2hlY2sgdGhlIGdhaW4gZGlmZmVyZW5jZSAqLw0KKwlTY2FsZV9zaWcoSEZfU1AsIExfU1VCRlIxNmssIC0xKTsNCisJZW5lciA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyKEhGX1NQLCBIRl9TUCwgTF9TVUJGUjE2aywgJmV4cF9lbmVyKSk7DQorCS8qIHNldCBlbmVyZ3kgb2Ygd2hpdGUgbm9pc2UgdG8gZW5lcmd5IG9mIGV4Y2l0YXRpb24gKi8NCisJdG1wID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoSEYsIEhGLCBMX1NVQkZSMTZrLCAmZXhwKSk7DQorI2VuZGlmDQorDQorCWlmICh0bXAgPiBlbmVyKQ0KKwl7DQorCQl0bXAgPSAodG1wID4+IDEpOyAgICAgICAgICAgICAgICAgLyogQmUgc3VyZSB0bXAgPCBlbmVyICovDQorCQlleHAgPSAoZXhwICsgMSk7DQorCX0NCisJTF90bXAgPSBMX2RlcG9zaXRfaChkaXZfcyh0bXAsIGVuZXIpKTsgLyogcmVzdWx0IGlzIG5vcm1hbGl6ZWQgKi8NCisJZXhwID0gdm9fc3ViKGV4cCwgZXhwX2VuZXIpOw0KKwlJc3FydF9uKCZMX3RtcCwgJmV4cCk7DQorCUxfdG1wID0gTF9zaGwoTF90bXAsIGV4cCk7ICAgICAgICAgICAgIC8qIExfdG1wLCBMX3RtcCBpbiBRMzEgKi8NCisJSFBfY2FsY19nYWluID0gZXh0cmFjdF9oKExfdG1wKTsgICAgICAgLyogdG1wID0gc3FydChlbmVyX2lucHV0L2VuZXJfaGYpICovDQorDQorCS8qIHN0LT5nYWluX2FscGhhICo9IHN0LT5kdHhfZW5jU3QtPmR0eEhhbmdvdmVyQ291bnQvNyAqLw0KKwlMX3RtcCA9ICh2b19MX211bHQoc3QtPmR0eF9lbmNTdC0+ZHR4SGFuZ292ZXJDb3VudCwgNDY4MSkgPDwgMTUpOw0KKwlzdC0+Z2Fpbl9hbHBoYSA9IHZvX211bHQoc3QtPmdhaW5fYWxwaGEsIGV4dHJhY3RfaChMX3RtcCkpOw0KKw0KKwlpZihzdC0+ZHR4X2VuY1N0LT5kdHhIYW5nb3ZlckNvdW50ID4gNikNCisJCXN0LT5nYWluX2FscGhhID0gMzI3Njc7DQorCUhQX2VzdF9nYWluID0gSFBfZXN0X2dhaW4gPj4gMTsgICAgIC8qIEZyb20gUTE1IHRvIFExNCAqLw0KKwlIUF9jb3JyX2dhaW4gPSBhZGQxKHZvX211bHQoSFBfY2FsY19nYWluLCBzdC0+Z2Fpbl9hbHBoYSksIHZvX211bHQoKDMyNzY3IC0gc3QtPmdhaW5fYWxwaGEpLCBIUF9lc3RfZ2FpbikpOw0KKw0KKwkvKiBRdWFudGlzZSB0aGUgY29ycmVjdGlvbiBnYWluICovDQorCWRpc3RfbWluID0gMzI3Njc7DQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KKwl7DQorCQlkaXN0ID0gdm9fbXVsdCgoSFBfY29ycl9nYWluIC0gSFBfZ2FpbltpXSksIChIUF9jb3JyX2dhaW4gLSBIUF9nYWluW2ldKSk7DQorCQlpZiAoZGlzdF9taW4gPiBkaXN0KQ0KKwkJew0KKwkJCWRpc3RfbWluID0gZGlzdDsNCisJCQlIUF9nYWluX2luZCA9IGk7DQorCQl9DQorCX0NCisJSFBfY29ycl9nYWluID0gSFBfZ2FpbltIUF9nYWluX2luZF07DQorCS8qIHJldHVybiB0aGUgcXVhbnRpc2VkIGdhaW4gaW5kZXggd2hlbiB1c2luZyB0aGUgaGlnaGVzdCBtb2RlLCBvdGhlcndpc2UgemVybyAqLw0KKwlyZXR1cm4gKEhQX2dhaW5faW5kKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBCcmVpZjogQ29kZWMgbWFpbiBmdW5jdGlvbiANCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQoraW50IEFNUl9FbmNfRW5jb2RlKEhBTVJFTkMgaENvZGVjKQ0KK3sNCisJV29yZDMyIGk7DQorCUNvZGVyX1N0YXRlICpnRGF0YSA9IChDb2Rlcl9TdGF0ZSopaENvZGVjOw0KKwlXb3JkMTYgKnNpZ25hbDsNCisJV29yZDE2IHBhY2tlZF9zaXplID0gMDsNCisJV29yZDE2IHBybXNbTkJfQklUU19NQVhdOw0KKwlXb3JkMTYgY29kaW5nX21vZGUgPSAwLCBuYl9iaXRzLCBhbGxvd19kdHgsIG1vZGUsIHJlc2V0X2ZsYWc7DQorCW1vZGUgPSBnRGF0YS0+bW9kZTsNCisJY29kaW5nX21vZGUgPSBnRGF0YS0+bW9kZTsNCisJbmJfYml0cyA9IG5iX29mX2JpdHNbbW9kZV07DQorCXNpZ25hbCA9IChXb3JkMTYgKilnRGF0YS0+aW5wdXRTdHJlYW07DQorCWFsbG93X2R0eCA9IGdEYXRhLT5hbGxvd19kdHg7DQorDQorCS8qIGNoZWNrIGZvciBob21pbmcgZnJhbWUgKi8NCisJcmVzZXRfZmxhZyA9IGVuY29kZXJfaG9taW5nX2ZyYW1lX3Rlc3Qoc2lnbmFsKTsNCisNCisJZm9yIChpID0gMDsgaSA8IExfRlJBTUUxNms7IGkrKykgICAvKiBEZWxldGUgdGhlIDIgTFNCcyAoMTQtYml0IGlucHV0KSAqLw0KKwl7DQorCQkqKHNpZ25hbCArIGkpID0gKFdvcmQxNikgKCooc2lnbmFsICsgaSkgJiAweGZmZkMpOw0KKwl9DQorDQorCWNvZGVyKCZjb2RpbmdfbW9kZSwgc2lnbmFsLCBwcm1zLCAmbmJfYml0cywgZ0RhdGEsIGFsbG93X2R0eCk7DQorCXBhY2tlZF9zaXplID0gUGFja0JpdHMocHJtcywgY29kaW5nX21vZGUsIG1vZGUsIGdEYXRhKTsNCisJaWYgKHJlc2V0X2ZsYWcgIT0gMCkNCisJew0KKwkJUmVzZXRfZW5jb2RlcihnRGF0YSwgMSk7DQorCX0NCisJcmV0dXJuIHBhY2tlZF9zaXplOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKypCcmllZjogQ29kZWMgQVBJIGZ1bmN0aW9uIC0tLSBJbml0aWFsaXplIHRoZSBjb2RlYyBhbmQgcmV0dXJuIGEgY29kZWMgaGFuZGxlDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfSW5pdChWT19IQU5ETEUgKiBwaENvZGVjLCAgICAgICAgICAgICAgICAgICAvKiBvOiB0aGUgYXVkaW8gY29kZWMgaGFuZGxlICovDQorCQkJCQkJICAgVk9fQVVESU9fQ09ESU5HVFlQRSB2VHlwZSwgICAgICAgICAgICAgLyogaTogQ29kZWMgVHlwZSBJRCAqLw0KKwkJCQkJCSAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgKiBwVXNlckRhdGEgICAgIC8qIGk6IGluaXQgUGFyYW1ldGVycyAqLw0KKwkJCQkJCSAgICkNCit7DQorCUNvZGVyX1N0YXRlICpzdDsNCisJRnJhbWVTdHJlYW0gKnN0cmVhbTsNCisjaWZkZWYgVVNFX0RFQVVMVF9NRU0NCisJVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsNCisjZW5kaWYNCisJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7DQorCWludCBpbnRlck1lbSA9IDA7DQorDQorCWlmKHBVc2VyRGF0YSA9PSBOVUxMIHx8IHBVc2VyRGF0YS0+bWVtZmxhZyAhPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SIHx8IHBVc2VyRGF0YS0+bWVtRGF0YSA9PSBOVUxMICkNCisJew0KKyNpZmRlZiBVU0VfREVBVUxUX01FTQ0KKwkJdm9NZW1vcHJhdG9yLkFsbG9jID0gY21uTWVtQWxsb2M7DQorCQl2b01lbW9wcmF0b3IuQ29weSA9IGNtbk1lbUNvcHk7DQorCQl2b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7DQorCQl2b01lbW9wcmF0b3IuU2V0ID0gY21uTWVtU2V0Ow0KKwkJdm9NZW1vcHJhdG9yLkNoZWNrID0gY21uTWVtQ2hlY2s7DQorCQlpbnRlck1lbSA9IDE7DQorCQlwTWVtT1AgPSAmdm9NZW1vcHJhdG9yOw0KKyNlbHNlDQorCQkqcGhDb2RlYyA9IE5VTEw7DQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKyNlbmRpZg0KKwl9DQorCWVsc2UNCisJew0KKwkJcE1lbU9QID0gKFZPX01FTV9PUEVSQVRPUiAqKXBVc2VyRGF0YS0+bWVtRGF0YTsNCisJfSANCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgY29kZXIgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWlmICgoc3QgPSAoQ29kZXJfU3RhdGUgKiltZW1fbWFsbG9jKHBNZW1PUCwgc2l6ZW9mKENvZGVyX1N0YXRlKSwgMzIsIFZPX0lOREVYX0VOQ19BTVJXQikpID09IE5VTEwpDQorCXsNCisJCXJldHVybiBWT19FUlJfT1VUT0ZfTUVNT1JZOw0KKwl9DQorDQorCXN0LT52YWRTdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIA0KKwlzdC0+ZHR4X2VuY1N0ID0gTlVMTDsgICAgICAgICAgICAgICAgICANCisJc3QtPnNpZF91cGRhdGVfY291bnRlciA9IDM7DQorCXN0LT5zaWRfaGFuZG92ZXJfZGVidCA9IDA7DQorCXN0LT5wcmV2X2Z0ID0gVFhfU1BFRUNIOw0KKwlzdC0+aW5wdXRTdHJlYW0gPSBOVUxMOw0KKwlzdC0+aW5wdXRTaXplID0gMDsNCisNCisJLyogRGVmYXVsdCBzZXR0aW5nICovDQorCXN0LT5tb2RlID0gVk9BTVJXQl9NRDIzODU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0IHJhdGUgMjMuODVrYnBzICovDQorCXN0LT5mcmFtZVR5cGUgPSBWT0FNUldCX1JGQzMyNjc7ICAgICAgICAgICAgICAgICAgLyogZnJhbWUgdHlwZTogUkZDMzI2NyAqLw0KKwlzdC0+YWxsb3dfZHR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgRFRYIG1vZGUgKi8NCisNCisJc3QtPm91dHB1dFN0cmVhbSA9IE5VTEw7DQorCXN0LT5vdXRwdXRTaXplID0gMDsNCisNCisJc3QtPnN0cmVhbSA9IChGcmFtZVN0cmVhbSAqKW1lbV9tYWxsb2MocE1lbU9QLCBzaXplb2YoRnJhbWVTdHJlYW0pLCAzMiwgVk9fSU5ERVhfRU5DX0FNUldCKTsNCisJaWYoc3QtPnN0cmVhbSA9PSBOVUxMKQ0KKwkJcmV0dXJuIFZPX0VSUl9PVVRPRl9NRU1PUlk7DQorDQorCXN0LT5zdHJlYW0tPmZyYW1lX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtX21hbGxvYyhwTWVtT1AsIEZyYW1lX01heHNpemUsIDMyLCBWT19JTkRFWF9FTkNfQU1SV0IpOw0KKwlpZihzdC0+c3RyZWFtLT5mcmFtZV9wdHIgPT0gTlVMTCkNCisJCXJldHVybiAgVk9fRVJSX09VVE9GX01FTU9SWTsNCisNCisJc3RyZWFtID0gc3QtPnN0cmVhbTsNCisJdm9BV0JfSW5pdEZyYW1lQnVmZmVyKHN0cmVhbSk7DQorDQorCXdiX3ZhZF9pbml0KCYoc3QtPnZhZFN0KSwgcE1lbU9QKTsNCisJZHR4X2VuY19pbml0KCYoc3QtPmR0eF9lbmNTdCksIGlzZl9pbml0LCBwTWVtT1ApOw0KKw0KKwlSZXNldF9lbmNvZGVyKCh2b2lkICopIHN0LCAxKTsNCisNCisJaWYoaW50ZXJNZW0pDQorCXsNCisJCXN0LT52b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsNCisJCXN0LT52b01lbW9wcmF0b3IuQ29weSA9IGNtbk1lbUNvcHk7DQorCQlzdC0+dm9NZW1vcHJhdG9yLkZyZWUgPSBjbW5NZW1GcmVlOw0KKwkJc3QtPnZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7DQorCQlzdC0+dm9NZW1vcHJhdG9yLkNoZWNrID0gY21uTWVtQ2hlY2s7DQorCQlwTWVtT1AgPSAmc3QtPnZvTWVtb3ByYXRvcjsNCisJfQ0KKw0KKwlzdC0+cHZvTWVtb3AgPSBwTWVtT1A7DQorDQorCSpwaENvZGVjID0gKHZvaWQgKikgc3Q7DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBCcmllZjogQ29kZWMgQVBJIGZ1bmN0aW9uOiBJbnB1dCBQQ00gZGF0YQ0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfU2V0SW5wdXREYXRhKA0KKwkJVk9fSEFORExFIGhDb2RlYywgICAgICAgICAgICAgICAgICAgLyogaS9vOiBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24gKi8NCisJCVZPX0NPREVDQlVGRkVSICogcElucHV0ICAgICAgICAgICAgIC8qICAgaTogVGhlIGlucHV0IGJ1ZmZlciBwYXJhbWV0ZXIgICovDQorCQkpDQorew0KKwlDb2Rlcl9TdGF0ZSAgKmdEYXRhOw0KKwlGcmFtZVN0cmVhbSAgKnN0cmVhbTsNCisNCisJaWYoTlVMTCA9PSBoQ29kZWMpDQorCXsNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCX0NCisNCisJZ0RhdGEgPSAoQ29kZXJfU3RhdGUgKiloQ29kZWM7DQorCXN0cmVhbSA9IGdEYXRhLT5zdHJlYW07DQorDQorCWlmKE5VTEwgPT0gcElucHV0IHx8IE5VTEwgPT0gcElucHV0LT5CdWZmZXIgfHwgMCA+IHBJbnB1dC0+TGVuZ3RoKQ0KKwl7DQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwl9DQorDQorCXN0cmVhbS0+c2V0X3B0ciAgICA9IHBJbnB1dC0+QnVmZmVyOw0KKwlzdHJlYW0tPnNldF9sZW4gICAgPSBwSW5wdXQtPkxlbmd0aDsNCisJc3RyZWFtLT5mcmFtZV9wdHIgID0gc3RyZWFtLT5mcmFtZV9wdHJfYms7DQorCXN0cmVhbS0+dXNlZF9sZW4gICA9IDA7DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogQnJpZWY6IENvZGVjIEFQSSBmdW5jdGlvbjogR2V0IHRoZSBjb21wcmVzc2lvbiBhdWRpbyBkYXRhIGZyYW1lIGJ5IGZyYW1lDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfR2V0T3V0cHV0RGF0YSgNCisJCVZPX0hBTkRMRSBoQ29kZWMsICAgICAgICAgICAgICAgICAgICAvKiBpOiBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24qLw0KKwkJVk9fQ09ERUNCVUZGRVIgKiBwT3V0cHV0LCAgICAgICAgICAgIC8qIG86IFRoZSBvdXRwdXQgYXVkaW8gZGF0YSAqLw0KKwkJVk9fQVVESU9fT1VUUFVUSU5GTyAqIHBBdWRpb0Zvcm1hdCAgIC8qIG86IFRoZSBlbmNvZGVyIG1vZHVsZSBmaWxsZWQgYXVkaW8gZm9ybWF0IGFuZCB1c2VkIHRoZSBpbnB1dCBzaXplKi8NCisJCSkNCit7DQorCUNvZGVyX1N0YXRlKiBnRGF0YSA9IChDb2Rlcl9TdGF0ZSopaENvZGVjOw0KKwlWT19NRU1fT1BFUkFUT1IgICpwTWVtT1A7DQorCUZyYW1lU3RyZWFtICAqc3RyZWFtID0gKEZyYW1lU3RyZWFtICopZ0RhdGEtPnN0cmVhbTsNCisJcE1lbU9QID0gKFZPX01FTV9PUEVSQVRPUiAgKilnRGF0YS0+cHZvTWVtb3A7DQorDQorCWlmKHN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuICA8IEZyYW1lX01heEJ5dGUpICAgICAgICAgLyogY2hlY2sgdGhlIHdvcmsgYnVmZmVyIGxlbiAqLw0KKwl7DQorCQlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW47DQorCQlpZihzdHJlYW0tPmZyYW1lX3N0b3JlbGVuKQ0KKwkJew0KKwkJCXBNZW1PUC0+Q29weShWT19JTkRFWF9FTkNfQU1SV0IsIHN0cmVhbS0+ZnJhbWVfcHRyX2JrICwgc3RyZWFtLT5mcmFtZV9wdHIgLCBzdHJlYW0tPmZyYW1lX3N0b3JlbGVuKTsNCisJCX0NCisJCWlmKHN0cmVhbS0+c2V0X2xlbiA+IDApDQorCQl7DQorCQkJdm9BV0JfVXBkYXRlRnJhbWVCdWZmZXIoc3RyZWFtLCBwTWVtT1ApOw0KKwkJfQ0KKwkJaWYoc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gPCBGcmFtZV9NYXhCeXRlKQ0KKwkJew0KKwkJCWlmKHBBdWRpb0Zvcm1hdCkNCisJCQkJcEF1ZGlvRm9ybWF0LT5JbnB1dFVzZWQgPSBzdHJlYW0tPnVzZWRfbGVuOw0KKwkJCXJldHVybiBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMOw0KKwkJfQ0KKwl9DQorDQorCWdEYXRhLT5pbnB1dFN0cmVhbSA9IHN0cmVhbS0+ZnJhbWVfcHRyOw0KKwlnRGF0YS0+b3V0cHV0U3RyZWFtID0gKHVuc2lnbmVkIHNob3J0KilwT3V0cHV0LT5CdWZmZXI7DQorDQorCWdEYXRhLT5vdXRwdXRTaXplID0gQU1SX0VuY19FbmNvZGUoZ0RhdGEpOyAgICAgICAgIC8qIGVuY29kZXIgbWFpbiBmdW5jdGlvbiAqLw0KKw0KKwlwT3V0cHV0LT5MZW5ndGggPSBnRGF0YS0+b3V0cHV0U2l6ZTsgICAgICAgICAgICAgICAvKiBnZXQgdGhlIG91dHB1dCBidWZmZXIgbGVuZ3RoICovDQorCXN0cmVhbS0+ZnJhbWVfcHRyICs9IDY0MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgd29yayBidWZmZXIgcHRyICovDQorCXN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuICAtPSA2NDA7DQorDQorCWlmKHBBdWRpb0Zvcm1hdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBvdXRwdXQgYXVkaW8gaW5mb3JtYXRpb24gKi8NCisJew0KKwkJcEF1ZGlvRm9ybWF0LT5Gb3JtYXQuQ2hhbm5lbHMgPSAxOw0KKwkJcEF1ZGlvRm9ybWF0LT5Gb3JtYXQuU2FtcGxlUmF0ZSA9IDgwMDA7DQorCQlwQXVkaW9Gb3JtYXQtPkZvcm1hdC5TYW1wbGVCaXRzID0gMTY7CQ0KKwkJcEF1ZGlvRm9ybWF0LT5JbnB1dFVzZWQgPSBzdHJlYW0tPnVzZWRfbGVuOw0KKwl9DQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBCcmllZjogQ29kZWMgQVBJIGZ1bmN0aW9uLS0tc2V0IHRoZSBkYXRhIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXIgSUQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfU2V0UGFyYW0oDQorCQlWT19IQU5ETEUgaENvZGVjLCAgIC8qIGkvbzogVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uICovDQorCQlWT19TMzIgdVBhcmFtSUQsICAgIC8qICAgaTogVGhlIHBhcmFtIElEICovDQorCQlWT19QVFIgcERhdGEgICAgICAgIC8qICAgaTogVGhlIHBhcmFtIHZhbHVlIGRlcGVuZCBvbiB0aGUgSUQgKi8NCisJCSkNCit7DQorCUNvZGVyX1N0YXRlKiBnRGF0YSA9IChDb2Rlcl9TdGF0ZSopaENvZGVjOw0KKwlGcmFtZVN0cmVhbSAqc3RyZWFtID0gKEZyYW1lU3RyZWFtICopKGdEYXRhLT5zdHJlYW0pOw0KKwlpbnQgKmxWYWx1ZSA9IChpbnQqKXBEYXRhOw0KKw0KKwlzd2l0Y2godVBhcmFtSUQpDQorCXsNCisJCS8qIHNldHRpbmcgQU1SLVdCIGZyYW1lIHR5cGUqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfRlJBTUVUWVBFOg0KKwkJCWlmKCpsVmFsdWUgPCBWT0FNUldCX0RFRkFVTFQgfHwgKmxWYWx1ZSA+IFZPQU1SV0JfUkZDMzI2NykNCisJCQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsgDQorCQkJZ0RhdGEtPmZyYW1lVHlwZSA9ICpsVmFsdWU7DQorCQkJYnJlYWs7DQorCQkvKiBzZXR0aW5nIEFNUi1XQiBiaXQgcmF0ZSAqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfTU9ERToNCisJCQl7DQorCQkJCWlmKCpsVmFsdWUgPCBWT0FNUldCX01ENjYgfHwgKmxWYWx1ZSA+IFZPQU1SV0JfTUQyMzg1KQ0KKwkJCQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsgDQorCQkJCWdEYXRhLT5tb2RlID0gKmxWYWx1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQkvKiBlbmFibGUgb3IgZGlzYWJsZSBEVFggbW9kZSAqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfRFRYOg0KKwkJCWdEYXRhLT5hbGxvd19kdHggPSAoV29yZDE2KSgqbFZhbHVlKTsNCisJCQlicmVhazsNCisNCisJCWNhc2UgVk9fUElEX0NPTU1PTl9IRUFEREFUQToNCisJCQlicmVhazsNCisgICAgICAgIC8qIGZsdXNoIHRoZSB3b3JrIGJ1ZmZlciAqLw0KKwkJY2FzZSBWT19QSURfQ09NTU9OX0ZMVVNIOg0KKwkJCXN0cmVhbS0+c2V0X3B0ciA9IE5VTEw7DQorCQkJc3RyZWFtLT5mcmFtZV9zdG9yZWxlbiA9IDA7DQorCQkJc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gPSAwOw0KKwkJCXN0cmVhbS0+c2V0X2xlbiA9IDA7DQorCQkJYnJlYWs7DQorDQorCQlkZWZhdWx0Og0KKwkJCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7DQorCX0NCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKkJyaWVmOiBDb2RlYyBBUEkgZnVuY3Rpb24tLS1HZXQgdGhlIGRhdGEgYnkgc3BlY2lmaWVkIHBhcmFtZXRlciBJRA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorVk9fVTMyIFZPX0FQSSB2b0FNUldCX0dldFBhcmFtKA0KKwkJVk9fSEFORExFIGhDb2RlYywgICAgICAvKiBpOiBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24gKi8NCisJCVZPX1MzMiB1UGFyYW1JRCwgICAgICAgLyogaTogVGhlIHBhcmFtIElEICovDQorCQlWT19QVFIgcERhdGEgICAgICAgICAgIC8qIG86IFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEICovDQorCQkpDQorew0KKwlpbnQgICAgdGVtcDsNCisJQ29kZXJfU3RhdGUqIGdEYXRhID0gKENvZGVyX1N0YXRlKiloQ29kZWM7DQorDQorCWlmIChnRGF0YT09TlVMTCkgDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwlzd2l0Y2godVBhcmFtSUQpDQorCXsNCisJCS8qIG91dHB1dCBhdWRpbyBmb3JtYXQgKi8NCisJCWNhc2UgVk9fUElEX0FNUldCX0ZPUk1BVDoNCisJCQl7DQorCQkJCVZPX0FVRElPX0ZPUk1BVCogZm10ID0gKFZPX0FVRElPX0ZPUk1BVCopcERhdGE7DQorCQkJCWZtdC0+Q2hhbm5lbHMgICA9IDE7DQorCQkJCWZtdC0+U2FtcGxlUmF0ZSA9IDE2MDAwOw0KKwkJCQlmbXQtPlNhbXBsZUJpdHMgPSAxNjsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKyAgICAgICAgLyogb3V0cHV0IGF1ZGlvIGNoYW5uZWwgbnVtYmVyICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9DSEFOTkVMUzoNCisJCQl0ZW1wID0gMTsNCisJCQlwRGF0YSA9ICh2b2lkICopKCZ0ZW1wKTsNCisJCQlicmVhazsNCisgICAgICAgIC8qIG91dHB1dCBhdWRpbyBzYW1wbGUgcmF0ZSAqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfU0FNUExFUkFURToNCisJCQl0ZW1wID0gMTYwMDA7DQorCQkJcERhdGEgPSAodm9pZCAqKSgmdGVtcCk7DQorCQkJYnJlYWs7DQorCQkvKiBvdXRwdXQgYXVkaW8gZnJhbWUgdHlwZSAqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfRlJBTUVUWVBFOg0KKwkJCXRlbXAgPSBnRGF0YS0+ZnJhbWVUeXBlOw0KKwkJCXBEYXRhID0gKHZvaWQgKikoJnRlbXApOw0KKwkJCWJyZWFrOw0KKwkJLyogb3V0cHV0IGF1ZGlvIGJpdCByYXRlICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9NT0RFOg0KKwkJCXRlbXAgPSBnRGF0YS0+bW9kZTsNCisJCQlwRGF0YSA9ICh2b2lkICopKCZ0ZW1wKTsNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsNCisJfQ0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEJyaWVmOiBDb2RlYyBBUEkgZnVuY3Rpb24tLS1SZWxlYXNlIHRoZSBjb2RlYyBhZnRlciBhbGwgZW5jb2RlciBvcGVyYXRpb25zIGFyZSBkb25lDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorVk9fVTMyIFZPX0FQSSB2b0FNUldCX1VuaW5pdChWT19IQU5ETEUgaENvZGVjICAgICAgICAgICAvKiBpL286IENvZGVjIGhhbmRsZSBwb2ludGVyICovDQorCQkJCQkJCSApDQorew0KKwlDb2Rlcl9TdGF0ZSogZ0RhdGEgPSAoQ29kZXJfU3RhdGUqKWhDb2RlYzsNCisJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7DQorCXBNZW1PUCA9IGdEYXRhLT5wdm9NZW1vcDsNCisNCisJaWYoaENvZGVjKQ0KKwl7DQorCQlpZihnRGF0YS0+c3RyZWFtKQ0KKwkJew0KKwkJCWlmKGdEYXRhLT5zdHJlYW0tPmZyYW1lX3B0cl9iaykNCisJCQl7DQorCQkJCW1lbV9mcmVlKHBNZW1PUCwgZ0RhdGEtPnN0cmVhbS0+ZnJhbWVfcHRyX2JrLCBWT19JTkRFWF9FTkNfQU1SV0IpOw0KKwkJCQlnRGF0YS0+c3RyZWFtLT5mcmFtZV9wdHJfYmsgPSBOVUxMOw0KKwkJCX0NCisJCQltZW1fZnJlZShwTWVtT1AsIGdEYXRhLT5zdHJlYW0sIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCQkJZ0RhdGEtPnN0cmVhbSA9IE5VTEw7DQorCQl9DQorCQl3Yl92YWRfZXhpdCgmKCgoQ29kZXJfU3RhdGUgKikgZ0RhdGEpLT52YWRTdCksIHBNZW1PUCk7DQorCQlkdHhfZW5jX2V4aXQoJigoKENvZGVyX1N0YXRlICopIGdEYXRhKS0+ZHR4X2VuY1N0KSwgcE1lbU9QKTsNCisNCisJCW1lbV9mcmVlKHBNZW1PUCwgaENvZGVjLCBWT19JTkRFWF9FTkNfQU1SV0IpOw0KKwkJaENvZGVjID0gTlVMTDsNCisJfQ0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEJyaWVmOiB2b0dldEFNUldCRW5jQVBJIGdldHMgdGhlIEFQSSBoYW5kbGUgb2YgdGhlIGNvZGVjDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1ZPX1MzMiBWT19BUEkgdm9HZXRBTVJXQkVuY0FQSSgNCisJCQkJCQkJICAgVk9fQVVESU9fQ09ERUNBUEkgKiBwRW5jSGFuZGxlICAgICAgLyogaS9vOiBDb2RlYyBoYW5kbGUgcG9pbnRlciAqLw0KKwkJCQkJCQkgICApDQorew0KKwlpZihOVUxMID09IHBFbmNIYW5kbGUpDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwlwRW5jSGFuZGxlLT5Jbml0ID0gdm9BTVJXQl9Jbml0Ow0KKwlwRW5jSGFuZGxlLT5TZXRJbnB1dERhdGEgPSB2b0FNUldCX1NldElucHV0RGF0YTsNCisJcEVuY0hhbmRsZS0+R2V0T3V0cHV0RGF0YSA9IHZvQU1SV0JfR2V0T3V0cHV0RGF0YTsNCisJcEVuY0hhbmRsZS0+U2V0UGFyYW0gPSB2b0FNUldCX1NldFBhcmFtOw0KKwlwRW5jSGFuZGxlLT5HZXRQYXJhbSA9IHZvQU1SV0JfR2V0UGFyYW07DQorCXBFbmNIYW5kbGUtPlVuaW5pdCA9IHZvQU1SV0JfVW5pbml0Ow0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZDc3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYwpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICBGaWxlOiB2b2ljZWZhYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICBEZXNjcmlwdGlvbjogRmluZCB0aGUgdm9pY2luZyBmYWN0b3JzICgxID0gdm9pY2UgdG8gLTEgPSB1bnZvaWNlZCkgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKw0KK1dvcmQxNiB2b2ljZV9mYWN0b3IoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgICA6IGZhY3RvciAoLTE9dW52b2ljZWQgdG8gMT12b2ljZWQpICovDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRX2V4YyA6IHBpdGNoIGV4Y2l0YXRpb24gICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgUV9leGMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgICA6IGV4YyBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTQgICA6IGdhaW4gb2YgcGl0Y2ggICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBROSAgICA6IEZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICovDQorCQlXb3JkMTYgZ2Fpbl9jb2RlLCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgICA6IGdhaW4gb2YgY29kZSAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgICA6IHN1YmZyYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgdG1wLCBleHAsIGVuZXIxLCBleHAxLCBlbmVyMiwgZXhwMjsNCisJV29yZDMyIGksIExfdG1wOw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJZW5lcjEgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMl9hc20oZXhjLCBleGMsIExfc3ViZnIsICZleHAxKSk7DQorI2Vsc2UNCisJZW5lcjEgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMihleGMsIGV4YywgTF9zdWJmciwgJmV4cDEpKTsNCisjZW5kaWYNCisJZXhwMSA9IGV4cDEgLSAoUV9leGMgKyBRX2V4Yyk7DQorCUxfdG1wID0gdm9fTF9tdWx0KGdhaW5fcGl0LCBnYWluX3BpdCk7DQorCWV4cCA9IG5vcm1fbChMX3RtcCk7DQorCXRtcCA9IGV4dHJhY3RfaChMX3RtcCA8PCBleHApOw0KKwllbmVyMSA9IHZvX211bHQoZW5lcjEsIHRtcCk7DQorCWV4cDEgPSBleHAxIC0gZXhwIC0gMTA7ICAgICAgICAvKiAxMCAtPiBnYWluX3BpdCBRMTQgdG8gUTkgKi8NCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwllbmVyMiA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShjb2RlLCBjb2RlLCBMX3N1YmZyLCAmZXhwMikpOw0KKyNlbHNlDQorCWVuZXIyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoY29kZSwgY29kZSwgTF9zdWJmciwgJmV4cDIpKTsNCisjZW5kaWYNCisNCisJZXhwID0gbm9ybV9zKGdhaW5fY29kZSk7DQorCXRtcCA9IGdhaW5fY29kZSA8PCBleHA7DQorCXRtcCA9IHZvX211bHQodG1wLCB0bXApOw0KKwllbmVyMiA9IHZvX211bHQoZW5lcjIsIHRtcCk7DQorCWV4cDIgPSBleHAyIC0gKGV4cCArIGV4cCk7DQorDQorCWkgPSBleHAxIC0gZXhwMjsNCisNCisJaWYgKGkgPj0gMCkNCisJew0KKwkJZW5lcjEgPSBlbmVyMSA+PiAxOw0KKwkJZW5lcjIgPSBlbmVyMiA+PiAoaSArIDEpOw0KKwl9IGVsc2UNCisJew0KKwkJZW5lcjEgPSBlbmVyMSA+PiAoMSAtIGkpOw0KKwkJZW5lcjIgPSBlbmVyMiA+PiAxOw0KKwl9DQorDQorCXRtcCA9IHZvX3N1YihlbmVyMSwgZW5lcjIpOw0KKwllbmVyMSA9IGFkZDEoYWRkMShlbmVyMSwgZW5lcjIpLCAxKTsNCisNCisJaWYgKHRtcCA+PSAwKQ0KKwl7DQorCQl0bXAgPSBkaXZfcyh0bXAsIGVuZXIxKTsNCisJfSBlbHNlDQorCXsNCisJCXRtcCA9IHZvX25lZ2F0ZShkaXZfcyh2b19uZWdhdGUodG1wKSwgZW5lcjEpKTsNCisJfQ0KKw0KKwlyZXR1cm4gKHRtcCk7DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjY4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCkBAIC0wLDAgKzEsODA4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiB3Yl92YWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjogVm9pY2UgQWN0aXZpdHkgRGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAid2JfdmFkLmgiDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKyNpbmNsdWRlICJ3Yl92YWRfYy5oIg0KKyNpbmNsdWRlICJtZW1fYWxpZ24uaCINCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgQ2FsY3VsYXRlIExvZzIgYW5kIHNjYWxlIHRoZSBzaWduYWw6DQorKg0KKyogICAgaWxvZzIoV29yZDMyIGluKSA9IC0xMDI0KmxvZzEwKGluICogMl4tMzEpL2xvZzEwKDIpLCB3aGVyZSBpbiA9IFsxLCAyXjMxLTFdDQorKg0KKyogIGlucHV0ICAgb3V0cHV0DQorKiAgMzI3NjggICAxNjM4NA0KKyogIDEgICAgICAgMzE3NDQNCisqDQorKiBXaGVuIGlucHV0IGlzIGluIHRoZSByYW5nZSBvZiBbMSwyXjE2XSwgbWF4IGVycm9yIGlzIDAuMDM4MCUuDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBXb3JkMTYgaWxvZzIoICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm46IG91dHB1dCB2YWx1ZSBvZiB0aGUgbG9nMiAqLw0KKwkJV29yZDE2IG1hbnQgICAgICAgICAgICAgICAgICAgICAgICAvKiBpOiB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgKi8NCisJCSkNCit7DQorCVdvcmQxNiBleCwgZXgyLCByZXM7DQorCVdvcmQzMiBpLCBsX3RlbXA7DQorDQorCWlmIChtYW50IDw9IDApDQorCXsNCisJCW1hbnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlleCA9IG5vcm1fcyhtYW50KTsNCisJbWFudCA9IG1hbnQgPDwgZXg7DQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQltYW50ID0gdm9fbXVsdChtYW50LCBtYW50KTsNCisJbF90ZW1wID0gdm9fTF9tdWx0KG1hbnQsIG1hbnQpOw0KKw0KKwlleDIgPSBub3JtX2wobF90ZW1wKTsNCisJbWFudCA9IGV4dHJhY3RfaChsX3RlbXAgPDwgZXgyKTsNCisNCisJcmVzID0gKGV4ICsgMTYpIDw8IDEwOw0KKwlyZXMgPSBhZGQxKHJlcywgKGV4MiA8PCA2KSk7DQorCXJlcyA9IHZvX3N1YihhZGQxKHJlcywgMTI3KSwgKG1hbnQgPj4gOCkpOw0KKwlyZXR1cm4gKHJlcyk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogZmlsdGVyNQ0KKyogICAgIFB1cnBvc2UgICAgICA6IEZpZnRoLW9yZGVyIGhhbGYtYmFuZCBsb3dwYXNzL2hpZ2hwYXNzIGZpbHRlciBwYWlyIHdpdGgNCisqICAgICAgICAgICAgICAgICAgICBkZWNpbWF0aW9uLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyB2b2lkIGZpbHRlcjUoDQorCQlXb3JkMTYgKiBpbjAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGlucHV0IHZhbHVlczsgb3V0cHV0IGxvdy1wYXNzIHBhcnQgICovDQorCQlXb3JkMTYgKiBpbjEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGlucHV0IHZhbHVlczsgb3V0cHV0IGhpZ2gtcGFzcyBwYXJ0ICovDQorCQlXb3JkMTYgZGF0YVtdICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGZpbHRlciBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgdGVtcDAsIHRlbXAxLCB0ZW1wMjsNCisNCisJdGVtcDAgPSB2b19zdWIoKmluMCwgdm9fbXVsdChDT0VGRjVfMSwgZGF0YVswXSkpOw0KKwl0ZW1wMSA9IGFkZDEoZGF0YVswXSwgdm9fbXVsdChDT0VGRjVfMSwgdGVtcDApKTsNCisJZGF0YVswXSA9IHRlbXAwOyAgICAgICAgICAgICAgICAgICAgICANCisNCisJdGVtcDAgPSB2b19zdWIoKmluMSwgdm9fbXVsdChDT0VGRjVfMiwgZGF0YVsxXSkpOw0KKwl0ZW1wMiA9IGFkZDEoZGF0YVsxXSwgdm9fbXVsdChDT0VGRjVfMiwgdGVtcDApKTsNCisJZGF0YVsxXSA9IHRlbXAwOyAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCSppbjAgPSBleHRyYWN0X2goKHZvX0xfYWRkKHRlbXAxLCB0ZW1wMikgPDwgMTUpKTsgICANCisJKmluMSA9IGV4dHJhY3RfaCgodm9fTF9zdWIodGVtcDEsIHRlbXAyKSA8PCAxNSkpOyAgDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogZmlsdGVyMw0KKyogICAgIFB1cnBvc2UgICAgICA6IFRoaXJkLW9yZGVyIGhhbGYtYmFuZCBsb3dwYXNzL2hpZ2hwYXNzIGZpbHRlciBwYWlyIHdpdGgNCisqICAgICAgICAgICAgICAgICAgICBkZWNpbWF0aW9uLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyB2b2lkIGZpbHRlcjMoDQorCQlXb3JkMTYgKiBpbjAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGlucHV0IHZhbHVlczsgb3V0cHV0IGxvdy1wYXNzIHBhcnQgICovDQorCQlXb3JkMTYgKiBpbjEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGlucHV0IHZhbHVlczsgb3V0cHV0IGhpZ2gtcGFzcyBwYXJ0ICovDQorCQlXb3JkMTYgKiBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGZpbHRlciBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMTYgdGVtcDEsIHRlbXAyOw0KKw0KKwl0ZW1wMSA9IHZvX3N1YigqaW4xLCB2b19tdWx0KENPRUZGMywgKmRhdGEpKTsNCisJdGVtcDIgPSBhZGQxKCpkYXRhLCB2b19tdWx0KENPRUZGMywgdGVtcDEpKTsNCisJKmRhdGEgPSB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJKmluMSA9IGV4dHJhY3RfaCgodm9fTF9zdWIoKmluMCwgdGVtcDIpIDw8IDE1KSk7ICAgDQorCSppbjAgPSBleHRyYWN0X2goKHZvX0xfYWRkKCppbjAsIHRlbXAyKSA8PCAxNSkpOyAgIA0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgIEZ1bmN0aW9uICAgOiBsZXZlbF9jYWxjdWxhdGlvbg0KKyogICAgIFB1cnBvc2UgICAgOiBDYWxjdWxhdGUgc2lnbmFsIGxldmVsIGluIGEgc3ViLWJhbmQuIExldmVsIGlzIGNhbGN1bGF0ZWQNCisqICAgICAgICAgICAgICAgICAgYnkgc3VtbWluZyBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGlucHV0IGRhdGEuDQorKg0KKyogICAgICAgICAgICAgICAgICBTaWduYWwgbGV2ZWwgY2FsY3VsYXRlZCBmcm9tIG9mIHRoZSBlbmQgb2YgdGhlIGZyYW1lDQorKiAgICAgICAgICAgICAgICAgIChkYXRhW2NvdW50MSAtIGNvdW50Ml0pIGlzIHN0b3JlZCB0byAoKnN1Yl9sZXZlbCkNCisqICAgICAgICAgICAgICAgICAgYW5kIGFkZGVkIHRvIHRoZSBsZXZlbCBvZiB0aGUgbmV4dCBmcmFtZS4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBXb3JkMTYgbGV2ZWxfY2FsY3VsYXRpb24oICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybjogc2lnbmFsIGxldmVsICovDQorCQlXb3JkMTYgZGF0YVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHNpZ25hbCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogc3ViX2xldmVsLCAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBsZXZlbCBjYWxjdWxhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGZyYW1lKi8NCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogbGV2ZWwgb2Ygc2lnbmFsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbGFzdCAgICAgICAgICovDQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgIChjb3VudDIgLSBjb3VudDEpIHNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGNvdW50MSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBudW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBjb3VudGVkICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBjb3VudDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogbnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgY291bnRlZCAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaW5kX20sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHN0ZXAgc2l6ZSBmb3IgdGhlIGluZGV4IG9mIHRoZSBkYXRhIGJ1ZmZlciAgICAgICAqLw0KKwkJV29yZDE2IGluZF9hLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBzdGFydGluZyBpbmRleCBvZiB0aGUgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBzY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc2NhbGluZyBmb3IgdGhlIGxldmVsIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgbF90ZW1wMSwgbF90ZW1wMjsNCisJV29yZDE2IGxldmVsOw0KKw0KKwlsX3RlbXAxID0gMEw7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gY291bnQxOyBpIDwgY291bnQyOyBpKyspDQorCXsNCisJCWxfdGVtcDEgKz0gKGFic19zKGRhdGFbaW5kX20gKiBpICsgaW5kX2FdKTw8MSk7DQorCX0NCisNCisJbF90ZW1wMiA9IHZvX0xfYWRkKGxfdGVtcDEsIExfc2hsKCpzdWJfbGV2ZWwsIDE2IC0gc2NhbGUpKTsNCisJKnN1Yl9sZXZlbCA9IGV4dHJhY3RfaChMX3NobChsX3RlbXAxLCBzY2FsZSkpOyAgICAgIA0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspDQorCXsNCisJCWxfdGVtcDIgKz0gKGFic19zKGRhdGFbaW5kX20gKiBpICsgaW5kX2FdKTw8MSk7DQorCX0NCisJbGV2ZWwgPSBleHRyYWN0X2goTF9zaGwyKGxfdGVtcDIsIHNjYWxlKSk7DQorDQorCXJldHVybiBsZXZlbDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiBmaWx0ZXJfYmFuaw0KKyogICAgIFB1cnBvc2UgICAgICA6IERpdmlkZSBpbnB1dCBzaWduYWwgaW50byBiYW5kcyBhbmQgY2FsY3VsYXRlIGxldmVsIG9mDQorKiAgICAgICAgICAgICAgICAgICAgdGhlIHNpZ25hbCBpbiBlYWNoIGJhbmQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgdm9pZCBmaWx0ZXJfYmFuaygNCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogaW5wdXQgZnJhbWUgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZXZlbFtdICAgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogc2lnbmFsIGxldmVscyBhdCBlYWNoIGJhbmQgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMTYgdG1wX2J1ZltGUkFNRV9MRU5dOw0KKw0KKwkvKiBzaGlmdCBpbnB1dCAxIGJpdCBkb3duIGZvciBzYWZlIHNjYWxpbmcgKi8NCisJZm9yIChpID0gMDsgaSA8IEZSQU1FX0xFTjsgaSsrKQ0KKwl7DQorCQl0bXBfYnVmW2ldID0gaW5baV0gPj4gMTsgICAgICAgDQorCX0NCisNCisJLyogcnVuIHRoZSBmaWx0ZXIgYmFuayAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspDQorCXsNCisJCWZpbHRlcjUoJnRtcF9idWZbMiAqIGldLCAmdG1wX2J1ZlsyICogaSArIDFdLCBzdC0+YV9kYXRhNVswXSk7DQorCX0NCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspDQorCXsNCisJCWZpbHRlcjUoJnRtcF9idWZbNCAqIGldLCAmdG1wX2J1Zls0ICogaSArIDJdLCBzdC0+YV9kYXRhNVsxXSk7DQorCQlmaWx0ZXI1KCZ0bXBfYnVmWzQgKiBpICsgMV0sICZ0bXBfYnVmWzQgKiBpICsgM10sIHN0LT5hX2RhdGE1WzJdKTsNCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykNCisJew0KKwkJZmlsdGVyNSgmdG1wX2J1Zls4ICogaV0sICZ0bXBfYnVmWzggKiBpICsgNF0sIHN0LT5hX2RhdGE1WzNdKTsNCisJCWZpbHRlcjUoJnRtcF9idWZbOCAqIGkgKyAyXSwgJnRtcF9idWZbOCAqIGkgKyA2XSwgc3QtPmFfZGF0YTVbNF0pOw0KKwkJZmlsdGVyMygmdG1wX2J1Zls4ICogaSArIDNdLCAmdG1wX2J1Zls4ICogaSArIDddLCAmc3QtPmFfZGF0YTNbMF0pOw0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KKwl7DQorCQlmaWx0ZXIzKCZ0bXBfYnVmWzE2ICogaSArIDBdLCAmdG1wX2J1ZlsxNiAqIGkgKyA4XSwgJnN0LT5hX2RhdGEzWzFdKTsNCisJCWZpbHRlcjMoJnRtcF9idWZbMTYgKiBpICsgNF0sICZ0bXBfYnVmWzE2ICogaSArIDEyXSwgJnN0LT5hX2RhdGEzWzJdKTsNCisJCWZpbHRlcjMoJnRtcF9idWZbMTYgKiBpICsgNl0sICZ0bXBfYnVmWzE2ICogaSArIDE0XSwgJnN0LT5hX2RhdGEzWzNdKTsNCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQ0KKwl7DQorCQlmaWx0ZXIzKCZ0bXBfYnVmWzMyICogaSArIDBdLCAmdG1wX2J1ZlszMiAqIGkgKyAxNl0sICZzdC0+YV9kYXRhM1s0XSk7DQorCQlmaWx0ZXIzKCZ0bXBfYnVmWzMyICogaSArIDhdLCAmdG1wX2J1ZlszMiAqIGkgKyAyNF0sICZzdC0+YV9kYXRhM1s1XSk7DQorCX0NCisNCisJLyogY2FsY3VsYXRlIGxldmVscyBpbiBlYWNoIGZyZXF1ZW5jeSBiYW5kICovDQorDQorCS8qIDQ4MDAgLSA2NDAwIEh6ICovDQorCWxldmVsWzExXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzExXSwgMTYsIDY0LCA0LCAxLCAxNCk7ICAgDQorCS8qIDQwMDAgLSA0ODAwIEh6ICovDQorCWxldmVsWzEwXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzEwXSwgOCwgMzIsIDgsIDcsIDE1KTsgICANCisJLyogMzIwMCAtIDQwMDAgSHogKi8NCisJbGV2ZWxbOV0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs5XSw4LCAzMiwgOCwgMywgMTUpOyAgIA0KKwkvKiAyNDAwIC0gMzIwMCBIeiAqLw0KKwlsZXZlbFs4XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzhdLDgsIDMyLCA4LCAyLCAxNSk7ICAgDQorCS8qIDIwMDAgLSAyNDAwIEh6ICovDQorCWxldmVsWzddID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbN10sNCwgMTYsIDE2LCAxNCwgMTYpOyAgICAgICANCisJLyogMTYwMCAtIDIwMDAgSHogKi8NCisJbGV2ZWxbNl0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs2XSw0LCAxNiwgMTYsIDYsIDE2KTsgICAgICAgIA0KKwkvKiAxMjAwIC0gMTYwMCBIeiAqLw0KKwlsZXZlbFs1XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzVdLDQsIDE2LCAxNiwgNCwgMTYpOyAgICAgICAgDQorCS8qIDgwMCAtIDEyMDAgSHogKi8NCisJbGV2ZWxbNF0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs0XSw0LCAxNiwgMTYsIDEyLCAxNik7ICAgICAgIA0KKwkvKiA2MDAgLSA4MDAgSHogKi8NCisJbGV2ZWxbM10gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFszXSwyLCA4LCAzMiwgOCwgMTcpOyANCisJLyogNDAwIC0gNjAwIEh6ICovDQorCWxldmVsWzJdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMl0sMiwgOCwgMzIsIDI0LCAxNyk7ICAgICAgICANCisJLyogMjAwIC0gNDAwIEh6ICovDQorCWxldmVsWzFdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMV0sMiwgOCwgMzIsIDE2LCAxNyk7ICAgICAgICANCisJLyogMCAtIDIwMCBIeiAqLw0KKwlsZXZlbFswXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzBdLDIsIDgsIDMyLCAwLCAxNyk7IA0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgIEZ1bmN0aW9uICAgOiB1cGRhdGVfY250cmwNCisqICAgICBQdXJwb3NlICAgIDogQ29udHJvbCB1cGRhdGUgb2YgdGhlIGJhY2tncm91bmQgbm9pc2UgZXN0aW1hdGUuDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIHZvaWQgdXBkYXRlX2NudHJsKA0KKwkJVmFkVmFycyAqIHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGV2ZWxbXSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHN1Yi1iYW5kIGxldmVscyBvZiB0aGUgaW5wdXQgZnJhbWUgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMTYgbnVtLCB0ZW1wLCBzdGF0X3JhdCwgZXhwLCBkZW5vbTsNCisJV29yZDE2IGFscGhhOw0KKw0KKwkvKiBpZiBhIHRvbmUgaGFzIGJlZW4gZGV0ZWN0ZWQgZm9yIGEgd2hpbGUsIGluaXRpYWxpemUgc3RhdF9jb3VudCAqLw0KKwlpZiAoc3ViKChXb3JkMTYpIChzdC0+dG9uZV9mbGFnICYgMHg3YzAwKSwgMHg3YzAwKSA9PSAwKQ0KKwl7DQorCQlzdC0+c3RhdF9jb3VudCA9IFNUQVRfQ09VTlQ7ICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQkvKiBpZiA4IGxhc3QgdmFkLWRlY2lzaW9ucyBoYXZlIGJlZW4gIjAiLCByZWluaXRpYWxpemUgc3RhdF9jb3VudCAqLw0KKwkJaWYgKChzdC0+dmFkcmVnICYgMHg3ZjgwKSA9PSAwKQ0KKwkJew0KKwkJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsgICANCisJCX0gZWxzZQ0KKwkJew0KKwkJCXN0YXRfcmF0ID0gMDsgICAgICAgICAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwkJCXsNCisJCQkJaWYobGV2ZWxbaV0gPiBzdC0+YXZlX2xldmVsW2ldKQ0KKwkJCQl7DQorCQkJCQludW0gPSBsZXZlbFtpXTsgICAgICAgIA0KKwkJCQkJZGVub20gPSBzdC0+YXZlX2xldmVsW2ldOyAgIA0KKwkJCQl9IGVsc2UNCisJCQkJew0KKwkJCQkJbnVtID0gc3QtPmF2ZV9sZXZlbFtpXTsNCisJCQkJCWRlbm9tID0gbGV2ZWxbaV07ICAgICAgDQorCQkJCX0NCisJCQkJLyogTGltaXQgbmltaW11bSB2YWx1ZSBvZiBudW0gYW5kIGRlbm9tIHRvIFNUQVRfVEhSX0xFVkVMICovDQorCQkJCWlmKG51bSA8IFNUQVRfVEhSX0xFVkVMKQ0KKwkJCQl7DQorCQkJCQludW0gPSBTVEFUX1RIUl9MRVZFTDsgIA0KKwkJCQl9DQorCQkJCWlmKGRlbm9tIDwgU1RBVF9USFJfTEVWRUwpDQorCQkJCXsNCisJCQkJCWRlbm9tID0gU1RBVF9USFJfTEVWRUw7DQorCQkJCX0NCisJCQkJZXhwID0gbm9ybV9zKGRlbm9tKTsNCisJCQkJZGVub20gPSBkZW5vbSA8PCBleHA7DQorDQorCQkJCS8qIHN0YXRfcmF0ID0gbnVtL2Rlbm9tICogNjQgKi8NCisJCQkJdGVtcCA9IGRpdl9zKG51bSA+PiAxLCBkZW5vbSk7DQorCQkJCXN0YXRfcmF0ID0gYWRkMShzdGF0X3JhdCwgc2hyKHRlbXAsICg4IC0gZXhwKSkpOw0KKwkJCX0NCisNCisJCQkvKiBjb21wYXJlIHN0YXRfcmF0IHdpdGggYSB0aHJlc2hvbGQgYW5kIHVwZGF0ZSBzdGF0X2NvdW50ICovDQorCQkJaWYoc3RhdF9yYXQgPiBTVEFUX1RIUikNCisJCQl7DQorCQkJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsgICAgDQorCQkJfSBlbHNlDQorCQkJew0KKwkJCQlpZiAoKHN0LT52YWRyZWcgJiAweDQwMDApICE9IDApDQorCQkJCXsNCisNCisJCQkJCWlmIChzdC0+c3RhdF9jb3VudCAhPSAwKQ0KKwkJCQkJew0KKwkJCQkJCXN0LT5zdGF0X2NvdW50ID0gc3QtPnN0YXRfY291bnQgLSAxOyAgICAgICANCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKiBVcGRhdGUgYXZlcmFnZSBhbXBsaXR1ZGUgZXN0aW1hdGUgZm9yIHN0YXRpb25hcml0eSBlc3RpbWF0aW9uICovDQorCWFscGhhID0gQUxQSEE0OyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpZihzdC0+c3RhdF9jb3VudCA9PSBTVEFUX0NPVU5UKQ0KKwl7DQorCQlhbHBoYSA9IDMyNzY3OyAgICAgICAgICAgICAgICAgICAgDQorCX0gZWxzZSBpZiAoKHN0LT52YWRyZWcgJiAweDQwMDApID09IDApDQorCXsNCisJCWFscGhhID0gQUxQSEE1OyAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwl7DQorCQlzdC0+YXZlX2xldmVsW2ldID0gYWRkMShzdC0+YXZlX2xldmVsW2ldLCB2b19tdWx0X3IoYWxwaGEsIHZvX3N1YihsZXZlbFtpXSwgc3QtPmF2ZV9sZXZlbFtpXSkpKTsgICANCisJfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgIEZ1bmN0aW9uICAgICA6IGhhbmdvdmVyX2FkZGl0aW9uDQorKiAgICAgUHVycG9zZSAgICAgIDogQWRkIGhhbmdvdmVyIGFmdGVyIHNwZWVjaCBidXJzdHMNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgV29yZDE2IGhhbmdvdmVyX2FkZGl0aW9uKCAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm46IFZBRF9mbGFnIGluZGljYXRpbmcgZmluYWwgVkFEIGRlY2lzaW9uICovDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbG93X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IGZsYWcgcG93ZXIgb2YgdGhlIGlucHV0IGZyYW1lICAgICovDQorCQlXb3JkMTYgaGFuZ19sZW4sICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IGhhbmdvdmVyIGxlbmd0aCAqLw0KKwkJV29yZDE2IGJ1cnN0X2xlbiAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBtaW5pbXVtIGJ1cnN0IGxlbmd0aCBmb3IgaGFuZ292ZXIgYWRkaXRpb24gKi8NCisJCSkNCit7DQorCS8qIGlmIHRoZSBpbnB1dCBwb3dlciAocG93X3N1bSkgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZCwgY2xlYXIgY291bnRlcnMgYW5kIHNldCBWQURfZmxhZyB0byAiMCIgICAgICAgICAqLw0KKwlpZiAobG93X3Bvd2VyICE9IDApDQorCXsNCisJCXN0LT5idXJzdF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgDQorCQlzdC0+aGFuZ19jb3VudCA9IDA7ICAgICAgICAgICAgICAgIA0KKwkJcmV0dXJuIDA7DQorCX0NCisJLyogdXBkYXRlIHRoZSBjb3VudGVycyAoaGFuZ19jb3VudCwgYnVyc3RfY291bnQpICovDQorCWlmICgoc3QtPnZhZHJlZyAmIDB4NDAwMCkgIT0gMCkNCisJew0KKwkJc3QtPmJ1cnN0X2NvdW50ID0gc3QtPmJ1cnN0X2NvdW50ICsgMTsgICAgDQorCQlpZihzdC0+YnVyc3RfY291bnQgPj0gYnVyc3RfbGVuKQ0KKwkJew0KKwkJCXN0LT5oYW5nX2NvdW50ID0gaGFuZ19sZW47ICAgICANCisJCX0NCisJCXJldHVybiAxOw0KKwl9IGVsc2UNCisJew0KKwkJc3QtPmJ1cnN0X2NvdW50ID0gMDsgICAgICAgICAgICAgICANCisJCWlmIChzdC0+aGFuZ19jb3VudCA+IDApDQorCQl7DQorCQkJc3QtPmhhbmdfY291bnQgPSBzdC0+aGFuZ19jb3VudCAtIDE7ICAgIA0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgIEZ1bmN0aW9uICAgOiBub2lzZV9lc3RpbWF0ZV91cGRhdGUNCisqICAgICBQdXJwb3NlICAgIDogVXBkYXRlIG9mIGJhY2tncm91bmQgbm9pc2UgZXN0aW1hdGUNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgdm9pZCBub2lzZV9lc3RpbWF0ZV91cGRhdGUoDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZXZlbFtdICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc3ViLWJhbmQgbGV2ZWxzIG9mIHRoZSBpbnB1dCBmcmFtZSAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGk7IA0KKwlXb3JkMTYgYWxwaGFfdXAsIGFscGhhX2Rvd24sIGJja3JfYWRkID0gMjsNCisNCisJLyogQ29udHJvbCB1cGRhdGUgb2YgYmNrcl9lc3RbXSAqLw0KKwl1cGRhdGVfY250cmwoc3QsIGxldmVsKTsNCisNCisJLyogQ2hvb3NlIHVwZGF0ZSBzcGVlZCAqLw0KKwlpZiAoKDB4NzgwMCAmIHN0LT52YWRyZWcpID09IDApDQorCXsNCisJCWFscGhhX3VwID0gQUxQSEFfVVAxOyAgICAgICAgICAgICAgDQorCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjE7ICAgICAgICAgIA0KKwl9IGVsc2UNCisJew0KKwkJaWYgKChzdC0+c3RhdF9jb3VudCA9PSAwKSkNCisJCXsNCisJCQlhbHBoYV91cCA9IEFMUEhBX1VQMjsgICAgICAgICAgDQorCQkJYWxwaGFfZG93biA9IEFMUEhBX0RPV04yOyAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJYWxwaGFfdXAgPSAwOyAgICAgICAgICAgICAgICAgIA0KKwkJCWFscGhhX2Rvd24gPSBBTFBIQTM7ICAgICAgICAgICANCisJCQliY2tyX2FkZCA9IDA7ICAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJLyogVXBkYXRlIG5vaXNlIGVzdGltYXRlIChiY2tyX2VzdCkgKi8NCisJZm9yIChpID0gMDsgaSA8IENPTVBMRU47IGkrKykNCisJew0KKwkJV29yZDE2IHRlbXA7DQorCQl0ZW1wID0gKHN0LT5vbGRfbGV2ZWxbaV0gLSBzdC0+YmNrcl9lc3RbaV0pOw0KKw0KKwkJaWYgKHRlbXAgPCAwKQ0KKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgZG93bndhcmRzICovDQorCQkJc3QtPmJja3JfZXN0W2ldID0gYWRkMSgtMiwgYWRkKHN0LT5iY2tyX2VzdFtpXSx2b19tdWx0X3IoYWxwaGFfZG93biwgdGVtcCkpKTsgDQorCQkJLyogbGltaXQgbWluaW11bSB2YWx1ZSBvZiB0aGUgbm9pc2UgZXN0aW1hdGUgdG8gTk9JU0VfTUlOICovDQorCQkJaWYoc3QtPmJja3JfZXN0W2ldIDwgTk9JU0VfTUlOKQ0KKwkJCXsNCisJCQkJc3QtPmJja3JfZXN0W2ldID0gTk9JU0VfTUlOOyAgIA0KKwkJCX0NCisJCX0gZWxzZQ0KKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdXB3YXJkcyAqLw0KKwkJCXN0LT5iY2tyX2VzdFtpXSA9IGFkZDEoYmNrcl9hZGQsIGFkZDEoc3QtPmJja3JfZXN0W2ldLHZvX211bHRfcihhbHBoYV91cCwgdGVtcCkpKTsgICANCisNCisJCQkvKiBsaW1pdCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBub2lzZSBlc3RpbWF0ZSB0byBOT0lTRV9NQVggKi8NCisJCQlpZihzdC0+YmNrcl9lc3RbaV0gPiBOT0lTRV9NQVgpDQorCQkJew0KKwkJCQlzdC0+YmNrcl9lc3RbaV0gPSBOT0lTRV9NQVg7ICAgIA0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKiBVcGRhdGUgc2lnbmFsIGxldmVscyBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKG9sZF9sZXZlbCkgKi8NCisJZm9yIChpID0gMDsgaSA8IENPTVBMRU47IGkrKykNCisJew0KKwkJc3QtPm9sZF9sZXZlbFtpXSA9IGxldmVsW2ldOyAgICAgIA0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogdmFkX2RlY2lzaW9uDQorKiAgICAgUHVycG9zZSAgICAgIDogQ2FsY3VsYXRlcyBWQURfZmxhZw0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBXb3JkMTYgdmFkX2RlY2lzaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSA6IFZBRF9mbGFnICovDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZXZlbFtDT01QTEVOXSwgICAgICAgICAgICAgICAgLyogaSAgIDogc3ViLWJhbmQgbGV2ZWxzIG9mIHRoZSBpbnB1dCBmcmFtZSAqLw0KKwkJV29yZDMyIHBvd19zdW0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBwb3dlciBvZiB0aGUgaW5wdXQgZnJhbWUgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaTsNCisJV29yZDMyIExfc25yX3N1bTsNCisJV29yZDMyIExfdGVtcDsNCisJV29yZDE2IHZhZF90aHIsIHRlbXAsIG5vaXNlX2xldmVsOw0KKwlXb3JkMTYgbG93X3Bvd2VyX2ZsYWc7DQorCVdvcmQxNiBoYW5nX2xlbiwgYnVyc3RfbGVuOw0KKwlXb3JkMTYgaWxvZzJfc3BlZWNoX2xldmVsLCBpbG9nMl9ub2lzZV9sZXZlbDsNCisJV29yZDE2IHRlbXAyOw0KKw0KKwkvKiBDYWxjdWxhdGUgc3F1YXJlZCBzdW0gb2YgdGhlIGlucHV0IGxldmVscyAobGV2ZWwpIGRpdmlkZWQgYnkgdGhlIGJhY2tncm91bmQgbm9pc2UgY29tcG9uZW50cw0KKwkgKiAoYmNrcl9lc3QpLiAqLw0KKwlMX3Nucl9zdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwl7DQorCQlXb3JkMTYgZXhwOw0KKw0KKwkJZXhwID0gbm9ybV9zKHN0LT5iY2tyX2VzdFtpXSk7DQorCQl0ZW1wID0gKHN0LT5iY2tyX2VzdFtpXSA8PCBleHApOw0KKwkJdGVtcCA9IGRpdl9zKChsZXZlbFtpXSA+PiAxKSwgdGVtcCk7DQorCQl0ZW1wID0gc2hsKHRlbXAsIChleHAgLSAoVU5JUlNIRlQgLSAxKSkpOw0KKwkJTF9zbnJfc3VtID0gTF9tYWMoTF9zbnJfc3VtLCB0ZW1wLCB0ZW1wKTsNCisJfQ0KKw0KKwkvKiBDYWxjdWxhdGUgYXZlcmFnZSBsZXZlbCBvZiBlc3RpbWF0ZWQgYmFja2dyb3VuZCBub2lzZSAqLw0KKwlMX3RlbXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAxOyBpIDwgQ09NUExFTjsgaSsrKSAgICAgICAgICAvKiBpZ25vcmUgbG93ZXN0IGJhbmQgKi8NCisJew0KKwkJTF90ZW1wID0gdm9fTF9hZGQoTF90ZW1wLCBzdC0+YmNrcl9lc3RbaV0pOw0KKwl9DQorDQorCW5vaXNlX2xldmVsID0gZXh0cmFjdF9oKChMX3RlbXAgPDwgMTIpKTsNCisJLyogaWYgU05SIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQgKE1JTl9TUEVFQ0hfU05SKSwgYW5kIGluY3JlYXNlIHNwZWVjaF9sZXZlbCAqLw0KKwl0ZW1wID0gdm9fbXVsdChub2lzZV9sZXZlbCwgTUlOX1NQRUVDSF9TTlIpIDw8IDM7DQorDQorCWlmKHN0LT5zcGVlY2hfbGV2ZWwgPCB0ZW1wKQ0KKwl7DQorCQlzdC0+c3BlZWNoX2xldmVsID0gdGVtcDsgICAgICAgICAgDQorCX0NCisJaWxvZzJfbm9pc2VfbGV2ZWwgPSBpbG9nMihub2lzZV9sZXZlbCk7DQorDQorCS8qIElmIFNOUiBpcyB2ZXJ5IHBvb3IsIHNwZWVjaF9sZXZlbCBpcyBwcm9iYWJseSBjb3JydXB0ZWQgYnkgbm9pc2UgbGV2ZWwuIFRoaXMgaXMgY29ycmVjdHJlZCBieQ0KKwkgKiBzdWJ0cmFjdGluZyBNSU5fU1BFRUNIX1NOUipub2lzZV9sZXZlbCBmcm9tIHNwZWVjaCBsZXZlbCAqLw0KKwlpbG9nMl9zcGVlY2hfbGV2ZWwgPSBpbG9nMihzdC0+c3BlZWNoX2xldmVsIC0gdGVtcCk7DQorDQorCXRlbXAgPSBhZGQxKHZvX211bHQoTk9fU0xPUEUsIChpbG9nMl9ub2lzZV9sZXZlbCAtIE5PX1AxKSksIFRIUl9ISUdIKTsNCisNCisJdGVtcDIgPSBhZGQxKFNQX0NIX01JTiwgdm9fbXVsdChTUF9TTE9QRSwgKGlsb2cyX3NwZWVjaF9sZXZlbCAtIFNQX1AxKSkpOw0KKwlpZiAodGVtcDIgPCBTUF9DSF9NSU4pDQorCXsNCisJCXRlbXAyID0gU1BfQ0hfTUlOOyAgICAgICAgICAgICAgICAgDQorCX0NCisJaWYgKHRlbXAyID4gU1BfQ0hfTUFYKQ0KKwl7DQorCQl0ZW1wMiA9IFNQX0NIX01BWDsgICAgICAgICAgICAgICAgIA0KKwl9DQorCXZhZF90aHIgPSB0ZW1wICsgdGVtcDI7DQorDQorCWlmKHZhZF90aHIgPCBUSFJfTUlOKQ0KKwl7DQorCQl2YWRfdGhyID0gVEhSX01JTjsgICAgICAgICAgICAgICAgIA0KKwl9DQorCS8qIFNoaWZ0IFZBRCBkZWNpc2lvbiByZWdpc3RlciAqLw0KKwlzdC0+dmFkcmVnID0gKHN0LT52YWRyZWcgPj4gMSk7ICAgICAgIA0KKw0KKwkvKiBNYWtlIGludGVybWVkaWF0ZSBWQUQgZGVjaXNpb24gKi8NCisJaWYoTF9zbnJfc3VtID4gdm9fTF9tdWx0KHZhZF90aHIsICg1MTIgKiBDT01QTEVOKSkpDQorCXsNCisJCXN0LT52YWRyZWcgPSAoV29yZDE2KSAoc3QtPnZhZHJlZyB8IDB4NDAwMCk7IA0KKwl9DQorCS8qIGNoZWNrIGlmIHRoZSBpbnB1dCBwb3dlciAocG93X3N1bSkgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZCIgKi8NCisJaWYocG93X3N1bSA8IFZBRF9QT1dfTE9XKQ0KKwl7DQorCQlsb3dfcG93ZXJfZmxhZyA9IDE7ICAgICAgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQlsb3dfcG93ZXJfZmxhZyA9IDA7ICAgICAgICAgICAgICAgDQorCX0NCisJLyogVXBkYXRlIGJhY2tncm91bmQgbm9pc2UgZXN0aW1hdGVzICovDQorCW5vaXNlX2VzdGltYXRlX3VwZGF0ZShzdCwgbGV2ZWwpOw0KKw0KKwkvKiBDYWxjdWxhdGUgdmFsdWVzIGZvciBoYW5nX2xlbiBhbmQgYnVyc3RfbGVuIGJhc2VkIG9uIHZhZF90aHIgKi8NCisJaGFuZ19sZW4gPSBhZGQxKHZvX211bHQoSEFOR19TTE9QRSwgKHZhZF90aHIgLSBIQU5HX1AxKSksIEhBTkdfSElHSCk7DQorCWlmKGhhbmdfbGVuIDwgSEFOR19MT1cpDQorCXsNCisJCWhhbmdfbGVuID0gSEFOR19MT1c7ICAgICAgICAgICAgICANCisJfQ0KKwlidXJzdF9sZW4gPSBhZGQxKHZvX211bHQoQlVSU1RfU0xPUEUsICh2YWRfdGhyIC0gQlVSU1RfUDEpKSwgQlVSU1RfSElHSCk7DQorDQorCXJldHVybiAoaGFuZ292ZXJfYWRkaXRpb24oc3QsIGxvd19wb3dlcl9mbGFnLCBoYW5nX2xlbiwgYnVyc3RfbGVuKSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gOiBFc3RpbWF0ZV9TcGVlY2goKQ0KKyogICAgIFB1cnBvc2UgIDogRXN0aW1hdGUgc3BlZWNoIGxldmVsDQorKg0KKyogTWF4aW11bSBzaWduYWwgbGV2ZWwgaXMgc2VhcmNoZWQgYW5kIHN0b3JlZCB0byB0aGUgdmFyaWFibGUgc3BfbWF4Lg0KKyogVGhlIHNwZWVjaCBmcmFtZXMgbXVzdCBsb2NhdGUgd2l0aGluIFNQX0VTVF9DT1VOVCBudW1iZXIgb2YgZnJhbWVzLg0KKyogVGh1cywgbm9pc3kgZnJhbWVzIGhhdmluZyBvY2Nhc2lvbmFsIFZBRCA9ICIxIiBkZWNpc2lvbnMgd2lsbCBub3QNCisqIGFmZmVjdCB0byB0aGUgZXN0aW1hdGVkIHNwZWVjaF9sZXZlbC4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgdm9pZCBFc3RpbWF0ZV9TcGVlY2goDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAqLw0KKwkJV29yZDE2IGluX2xldmVsICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbCBvZiB0aGUgaW5wdXQgZnJhbWUgKi8NCisJCSkNCit7DQorCVdvcmQxNiBhbHBoYTsNCisNCisJLyogaWYgdGhlIHJlcXVpcmVkIGFjdGl2aXR5IGNvdW50IGNhbm5vdCBiZSBhY2hpZXZlZCwgcmVzZXQgY291bnRlcnMgKi8NCisJaWYoKHN0LT5zcF9lc3RfY250IC0gc3QtPnNwX21heF9jbnQpID4gKFNQX0VTVF9DT1VOVCAtIFNQX0FDVElWSVRZX0NPVU5UKSkNCisJew0KKwkJc3QtPnNwX2VzdF9jbnQgPSAwOyAgICAgICAgICAgICAgICANCisJCXN0LT5zcF9tYXggPSAwOyAgICAgICAgICAgICAgICAgICAgDQorCQlzdC0+c3BfbWF4X2NudCA9IDA7ICAgICAgICAgICAgICAgIA0KKwl9DQorCXN0LT5zcF9lc3RfY250ICs9IDE7IA0KKw0KKwlpZiAoKChzdC0+dmFkcmVnICYgMHg0MDAwKXx8KGluX2xldmVsID4gc3QtPnNwZWVjaF9sZXZlbCkpICYmIChpbl9sZXZlbCA+IE1JTl9TUEVFQ0hfTEVWRUwxKSkNCisJew0KKwkJLyogdXBkYXRlIHNwX21heCAqLw0KKwkJaWYoaW5fbGV2ZWwgPiBzdC0+c3BfbWF4KQ0KKwkJew0KKwkJCXN0LT5zcF9tYXggPSBpbl9sZXZlbDsgICAgICAgICANCisJCX0NCisJCXN0LT5zcF9tYXhfY250ICs9IDE7ICAgICAgICANCisNCisJCWlmKHN0LT5zcF9tYXhfY250ID49IFNQX0FDVElWSVRZX0NPVU5UKQ0KKwkJew0KKwkJCVdvcmQxNiB0bXA7DQorCQkJLyogdXBkYXRlIHNwZWVjaCBlc3RpbWF0ZSAqLw0KKwkJCXRtcCA9IChzdC0+c3BfbWF4ID4+IDEpOyAgICAgIC8qIHNjYWxlIHRvIGdldCAiYXZlcmFnZSIgc3BlZWNoIGxldmVsICovDQorDQorCQkJLyogc2VsZWN0IHVwZGF0ZSBzcGVlZCAqLw0KKwkJCWlmKHRtcCA+IHN0LT5zcGVlY2hfbGV2ZWwpDQorCQkJew0KKwkJCQlhbHBoYSA9IEFMUEhBX1NQX1VQOyAgICAgICANCisJCQl9IGVsc2UNCisJCQl7DQorCQkJCWFscGhhID0gQUxQSEFfU1BfRE9XTjsgICAgDQorCQkJfQ0KKwkJCWlmKHRtcCA+IE1JTl9TUEVFQ0hfTEVWRUwyKQ0KKwkJCXsNCisJCQkJc3QtPnNwZWVjaF9sZXZlbCA9IGFkZDEoc3QtPnNwZWVjaF9sZXZlbCwgdm9fbXVsdF9yKGFscGhhLCB2b19zdWIodG1wLCBzdC0+c3BlZWNoX2xldmVsKSkpOyANCisJCQl9DQorCQkJLyogY2xlYXIgYWxsIGNvdW50ZXJzIHVzZWQgZm9yIHNwZWVjaCBlc3RpbWF0aW9uICovDQorCQkJc3QtPnNwX21heCA9IDA7ICAgICAgICAgICAgICAgIA0KKwkJCXN0LT5zcF9tYXhfY250ID0gMDsgICAgICAgICAgICANCisJCQlzdC0+c3BfZXN0X2NudCA9IDA7ICAgICAgICAgICAgDQorCQl9DQorCX0NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICBGdW5jdGlvbjogICB3Yl92YWRfaW5pdA0KKyogIFB1cnBvc2U6ICAgIEFsbG9jYXRlcyBzdGF0ZSBtZW1vcnkgYW5kIGluaXRpYWxpemVzIHN0YXRlIG1lbW9yeQ0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1dvcmQxNiB3Yl92YWRfaW5pdCggICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm46IG5vbi16ZXJvIHdpdGggZXJyb3IsIHplcm8gZm9yIG9rLiAqLw0KKwkJVmFkVmFycyAqKiBzdGF0ZSwgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgKi8NCisJCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QDQorCQkpDQorew0KKwlWYWRWYXJzICpzOw0KKw0KKwlpZiAoc3RhdGUgPT0gKFZhZFZhcnMgKiopIE5VTEwpDQorCXsNCisJCWZwcmludGYoc3RkZXJyLCAidmFkX2luaXQ6IGludmFsaWQgcGFyYW1ldGVyXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkqc3RhdGUgPSBOVUxMOw0KKw0KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgKi8NCisJaWYgKChzID0gKFZhZFZhcnMgKikgbWVtX21hbGxvYyhwTWVtT1AsIHNpemVvZihWYWRWYXJzKSwgMzIsIFZPX0lOREVYX0VOQ19BTVJXQikpID09IE5VTEwpDQorCXsNCisJCWZwcmludGYoc3RkZXJyLCAidmFkX2luaXQ6IGNhbiBub3QgbWFsbG9jIHN0YXRlIHN0cnVjdHVyZVxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJd2JfdmFkX3Jlc2V0KHMpOw0KKw0KKwkqc3RhdGUgPSBzOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICBGdW5jdGlvbjogICB3Yl92YWRfcmVzZXQNCisqICBQdXJwb3NlOiAgICBJbml0aWFsaXplcyBzdGF0ZSBtZW1vcnkNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitXb3JkMTYgd2JfdmFkX3Jlc2V0KCAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuOiBub24temVybyB3aXRoIGVycm9yLCB6ZXJvIGZvciBvay4gKi8NCisJCVZhZFZhcnMgKiBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgajsNCisNCisJaWYgKHN0YXRlID09IChWYWRWYXJzICopIE5VTEwpDQorCXsNCisJCWZwcmludGYoc3RkZXJyLCAidmFkX3Jlc2V0OiBpbnZhbGlkIHBhcmFtZXRlclxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJc3RhdGUtPnRvbmVfZmxhZyA9IDA7DQorCXN0YXRlLT52YWRyZWcgPSAwOw0KKwlzdGF0ZS0+aGFuZ19jb3VudCA9IDA7DQorCXN0YXRlLT5idXJzdF9jb3VudCA9IDA7DQorCXN0YXRlLT5oYW5nX2NvdW50ID0gMDsNCisNCisJLyogaW5pdGlhbGl6ZSBtZW1vcnkgdXNlZCBieSB0aGUgZmlsdGVyIGJhbmsgKi8NCisJZm9yIChpID0gMDsgaSA8IEZfNVRIX0NOVDsgaSsrKQ0KKwl7DQorCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQ0KKwkJew0KKwkJCXN0YXRlLT5hX2RhdGE1W2ldW2pdID0gMDsNCisJCX0NCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgRl8zVEhfQ05UOyBpKyspDQorCXsNCisJCXN0YXRlLT5hX2RhdGEzW2ldID0gMDsNCisJfQ0KKw0KKwkvKiBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBtZW1vcnkgKi8NCisJZm9yIChpID0gMDsgaSA8IENPTVBMRU47IGkrKykNCisJew0KKwkJc3RhdGUtPmJja3JfZXN0W2ldID0gTk9JU0VfSU5JVDsNCisJCXN0YXRlLT5vbGRfbGV2ZWxbaV0gPSBOT0lTRV9JTklUOw0KKwkJc3RhdGUtPmF2ZV9sZXZlbFtpXSA9IE5PSVNFX0lOSVQ7DQorCQlzdGF0ZS0+c3ViX2xldmVsW2ldID0gMDsNCisJfQ0KKw0KKwlzdGF0ZS0+c3BfZXN0X2NudCA9IDA7DQorCXN0YXRlLT5zcF9tYXggPSAwOw0KKwlzdGF0ZS0+c3BfbWF4X2NudCA9IDA7DQorCXN0YXRlLT5zcGVlY2hfbGV2ZWwgPSBTUEVFQ0hfTEVWRUxfSU5JVDsNCisJc3RhdGUtPnByZXZfcG93X3N1bSA9IDA7DQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogIEZ1bmN0aW9uOiAgIHdiX3ZhZF9leGl0DQorKiAgUHVycG9zZTogICAgVGhlIG1lbW9yeSB1c2VkIGZvciBzdGF0ZSBtZW1vcnkgaXMgZnJlZWQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIHdiX3ZhZF9leGl0KA0KKwkJVmFkVmFycyAqKiBzdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICovDQorCQlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUA0KKwkJKQ0KK3sNCisJaWYgKHN0YXRlID09IE5VTEwgfHwgKnN0YXRlID09IE5VTEwpDQorCQlyZXR1cm47DQorCS8qIGRlYWxsb2NhdGUgbWVtb3J5ICovDQorCW1lbV9mcmVlKHBNZW1PUCwgKnN0YXRlLCBWT19JTkRFWF9FTkNfQU1SV0IpOw0KKwkqc3RhdGUgPSBOVUxMOw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogd2JfdmFkX3RvbmVfZGV0ZWN0aW9uDQorKiAgICAgUHVycG9zZSAgICAgIDogU2VhcmNoIG1heGltdW0gcGl0Y2ggZ2FpbiBmcm9tIGEgZnJhbWUuIFNldCB0b25lIGZsYWcgaWYNCisqICAgICAgICAgICAgICAgICAgICBwaXRjaCBnYWluIGlzIGhpZ2guIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QNCisqICAgICAgICAgICAgICAgICAgICBzaWduYWxpbmcgdG9uZXMgYW5kIG90aGVyIHNpZ25hbHMgd2l0aCBoaWdoIHBpdGNoIGdhaW4uDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQordm9pZCB3Yl92YWRfdG9uZV9kZXRlY3Rpb24oDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdCAgICAgICAgICAgICovDQorCQlXb3JkMTYgcF9nYWluICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpdGNoIGdhaW4gICAgICAqLw0KKwkJKQ0KK3sNCisJLyogdXBkYXRlIHRvbmUgZmxhZyAqLw0KKwlzdC0+dG9uZV9mbGFnID0gKHN0LT50b25lX2ZsYWcgPj4gMSk7DQorDQorCS8qIGlmIChwaXRjaF9nYWluID4gVE9ORV9USFIpIHNldCB0b25lIGZsYWcgKi8NCisJaWYgKHBfZ2FpbiA+IFRPTkVfVEhSKQ0KKwl7DQorCQlzdC0+dG9uZV9mbGFnID0gKFdvcmQxNikgKHN0LT50b25lX2ZsYWcgfCAweDQwMDApOw0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogd2JfdmFkDQorKiAgICAgUHVycG9zZSAgICAgIDogTWFpbiBwcm9ncmFtIGZvciBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24gKFZBRCkgZm9yIEFNUg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1dvcmQxNiB3Yl92YWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdmFsdWUgOiBWQUQgRGVjaXNpb24sIDEgPSBzcGVlY2gsIDAgPSBub2lzZSAqLw0KKwkJVmFkVmFycyAqIHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaW5fYnVmW10gICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHNhbXBsZXMgb2YgdGhlIGlucHV0IGZyYW1lICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMTYgbGV2ZWxbQ09NUExFTl07DQorCVdvcmQzMiBpOw0KKwlXb3JkMTYgVkFEX2ZsYWcsIHRlbXA7DQorCVdvcmQzMiBMX3RlbXAsIHBvd19zdW07DQorDQorCS8qIENhbGN1bGF0ZSBwb3dlciBvZiB0aGUgaW5wdXQgZnJhbWUuICovDQorCUxfdGVtcCA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTEVOOyBpKyspDQorCXsNCisJCUxfdGVtcCA9IExfbWFjKExfdGVtcCwgaW5fYnVmW2ldLCBpbl9idWZbaV0pOw0KKwl9DQorDQorCS8qIHBvd19zdW0gPSBwb3dlciBvZiBjdXJyZW50IGZyYW1lIGFuZCBwcmV2aW91cyBmcmFtZSAqLw0KKwlwb3dfc3VtID0gTF9hZGQoTF90ZW1wLCBzdC0+cHJldl9wb3dfc3VtKTsgIA0KKw0KKwkvKiBzYXZlIHBvd2VyIG9mIGN1cnJlbnQgZnJhbWUgZm9yIG5leHQgY2FsbCAqLw0KKwlzdC0+cHJldl9wb3dfc3VtID0gTF90ZW1wOyAgICAgICAgICAgICANCisNCisJLyogSWYgaW5wdXQgcG93ZXIgaXMgdmVyeSBsb3csIGNsZWFyIHRvbmUgZmxhZyAqLw0KKwlpZiAocG93X3N1bSA8IFBPV19UT05FX1RIUikNCisJew0KKwkJc3QtPnRvbmVfZmxhZyA9IChXb3JkMTYpIChzdC0+dG9uZV9mbGFnICYgMHgxZmZmKTsgICAgICANCisJfQ0KKwkvKiBSdW4gdGhlIGZpbHRlciBiYW5rIGFuZCBjYWxjdWxhdGUgc2lnbmFsIGxldmVscyBhdCBlYWNoIGJhbmQgKi8NCisJZmlsdGVyX2Jhbmsoc3QsIGluX2J1ZiwgbGV2ZWwpOw0KKw0KKwkvKiBjb21wdXRlIFZBRCBkZWNpc2lvbiAqLw0KKwlWQURfZmxhZyA9IHZhZF9kZWNpc2lvbihzdCwgbGV2ZWwsIHBvd19zdW0pOw0KKw0KKwkvKiBDYWxjdWxhdGUgaW5wdXQgbGV2ZWwgKi8NCisJTF90ZW1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAxOyBpIDwgQ09NUExFTjsgaSsrKSAgICAgICAgICAvKiBpZ25vcmUgbG93ZXN0IGJhbmQgKi8NCisJew0KKwkJTF90ZW1wID0gdm9fTF9hZGQoTF90ZW1wLCBsZXZlbFtpXSk7DQorCX0NCisNCisJdGVtcCA9IGV4dHJhY3RfaChMX3RlbXAgPDwgMTIpOw0KKw0KKwlFc3RpbWF0ZV9TcGVlY2goc3QsIHRlbXApOyAgICAgICAgICAgICAvKiBFc3RpbWF0ZSBzcGVlY2ggbGV2ZWwgKi8NCisJcmV0dXJuIChWQURfZmxhZyk7DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdiZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiB3ZWlnaHRfYS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjpXZWlnaHRpbmcgb2YgTFBDIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAqDQorKgkgICAgICAgICAgICAgICBhcFtpXSA9IGFbaV0gKiAoZ2FtbWEgKiogaSkgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KK3ZvaWQgV2VpZ2h0X2EoDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gIExQQyBjb2VmZmljaWVudHMgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBhcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExMiA6IFNwZWN0cmFsIGV4cGFuZGVkIExQQyBjb2VmZmljaWVudHMgICAqLw0KKwkJV29yZDE2IGdhbW1hLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogU3BlY3RyYWwgZXhwYW5zaW9uIGZhY3Rvci4gICAgICAgICAgICovDQorCQlXb3JkMTYgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBMUEMgb3JkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMzIgbnVtID0gbSAtIDEsIGZhYzsNCisJKmFwKysgPSAqYSsrOw0KKwlmYWMgPSBnYW1tYTsNCisJZG97DQorCQkqYXArKyA9KFdvcmQxNikoKCh2b19MX211bHQoKCphKyspLCBmYWMpKSArIDB4ODAwMCkgPj4gMTYpOw0KKwkJZmFjID0gKHZvX0xfbXVsdChmYWMsIGdhbW1hKSArIDB4ODAwMCkgPj4gMTY7DQorCX13aGlsZSgtLW51bSAhPSAwKTsNCisNCisJKmFwKysgPSAoV29yZDE2KSgoKHZvX0xfbXVsdCgoKmErKyksIGZhYykpICsgMHg4MDAwKSA+PiAxNik7DQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BVkNEZWNvZGVyLmNwcAppbmRleCBhYTJhM2QxLi44NjhjNTE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BVkNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BVkNEZWNvZGVyLmNwcApAQCAtMzEsOSArMzEsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgY29uc3QgY2hhciBrU3RhcnRDb2RlWzRdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAxIH07CisKIHN0YXRpYyBpbnQzMl90IE1hbGxvYyh2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdD4obWFsbG9jKHNpemUpKTsKIH0KQEAgLTQ5LDcgKzUyLDExIEBACiAgICAgICBtSW5wdXRCdWZmZXIoTlVMTCksCiAgICAgICBtQW5jaG9yVGltZVVzKDApLAogICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCi0gICAgICBtUGVuZGluZ1NlZWtUaW1lVXMoLTEpIHsKKyAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcygtMSksCisgICAgICBtUGVuZGluZ1NlZWtNb2RlKE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpLAorICAgICAgbVRhcmdldFRpbWVVcygtMSksCisgICAgICBtU1BTU2VlbihmYWxzZSksCisgICAgICBtUFBTU2VlbihmYWxzZSkgewogICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFnQVZDSGFuZGxlKSk7CiAgICAgbUhhbmRsZS0+QVZDT2JqZWN0ID0gTlVMTDsKICAgICBtSGFuZGxlLT51c2VyRGF0YSA9IHRoaXM7CkBAIC0xNTQsMjIgKzE2MSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IHBhcmFtcyA9IG5ldyBNZXRhRGF0YTsKLSAgICBwYXJhbXMtPnNldEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgdHJ1ZSk7Ci0gICAgbVNvdXJjZS0+c3RhcnQocGFyYW1zLmdldCgpKTsKKyAgICBtU291cmNlLT5zdGFydCgpOwogCiAgICAgbUFuY2hvclRpbWVVcyA9IDA7CiAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwogICAgIG1QZW5kaW5nU2Vla1RpbWVVcyA9IC0xOworICAgIG1QZW5kaW5nU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM7CisgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgIG1TUFNTZWVuID0gZmFsc2U7CisgICAgbVBQU1NlZW4gPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHZvaWQgQVZDRGVjb2Rlcjo6YWRkQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKHNpemUpOwotICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplICsgNCk7CisgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBrU3RhcnRDb2RlLCA0KTsKKyAgICBtZW1jcHkoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIDQsIGRhdGEsIHNpemUpOworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUgKyA0KTsKIAogICAgIG1Db2RlY1NwZWNpZmljRGF0YS5wdXNoKGJ1ZmZlcik7CiB9CkBAIC0yMDAsMTYgKzIxMCw4OCBAQAogICAgIHJldHVybiBtRm9ybWF0OwogfQogCitzdGF0aWMgdm9pZCBmaW5kTkFMRnJhZ21lbnQoCisgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyICpidWZmZXIsIGNvbnN0IHVpbnQ4X3QgKipmcmFnUHRyLCBzaXplX3QgKmZyYWdTaXplKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgQ0hFQ0soc2l6ZSA+PSA0KTsKKyAgICBDSEVDSyghbWVtY21wKGtTdGFydENvZGUsIGRhdGEsIDQpKTsKKworICAgIHNpemVfdCBvZmZzZXQgPSA0OworICAgIHdoaWxlIChvZmZzZXQgKyAzIDwgc2l6ZSAmJiBtZW1jbXAoa1N0YXJ0Q29kZSwgJmRhdGFbb2Zmc2V0XSwgNCkpIHsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorCisgICAgKmZyYWdQdHIgPSAmZGF0YVs0XTsKKyAgICBpZiAob2Zmc2V0ICsgMyA+PSBzaXplKSB7CisgICAgICAgICpmcmFnU2l6ZSA9IHNpemUgLSA0OworICAgIH0gZWxzZSB7CisgICAgICAgICpmcmFnU2l6ZSA9IG9mZnNldCAtIDQ7CisgICAgfQorfQorCitNZWRpYUJ1ZmZlciAqQVZDRGVjb2Rlcjo6ZHJhaW5PdXRwdXRCdWZmZXIoKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICBpbnQzMl90IFJlbGVhc2U7CisgICAgQVZDRnJhbWVJTyBPdXRwdXQ7CisgICAgT3V0cHV0LllDYkNyWzBdID0gT3V0cHV0LllDYkNyWzFdID0gT3V0cHV0LllDYkNyWzJdID0gTlVMTDsKKyAgICBBVkNEZWNfU3RhdHVzIHN0YXR1cyA9IFBWQVZDRGVjR2V0T3V0cHV0KG1IYW5kbGUsICZpbmRleCwgJlJlbGVhc2UsICZPdXRwdXQpOworCisgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICBMT0dWKCJQVkFWQ0RlY0dldE91dHB1dCByZXR1cm5lZCBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIENIRUNLKGluZGV4ID49IDApOworICAgIENIRUNLKGluZGV4IDwgKGludDMyX3QpbUZyYW1lcy5zaXplKCkpOworCisgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBtRnJhbWVzLmVkaXRJdGVtQXQoaW5kZXgpOworCisgICAgYm9vbCBza2lwRnJhbWUgPSBmYWxzZTsKKworICAgIGlmIChtVGFyZ2V0VGltZVVzID49IDApIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgQ0hFQ0sodGltZVVzIDw9IG1UYXJnZXRUaW1lVXMpOworCisgICAgICAgIGlmICh0aW1lVXMgPCBtVGFyZ2V0VGltZVVzKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgZnJhbWUgd2l0aCB0aGUgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBhbmQgd2Ugd29uJ3QgcmV0dXJuIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgICAgICAgIHNraXBGcmFtZSA9IHRydWU7CisKKyAgICAgICAgICAgIExPR1YoInNraXBwaW5nIGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigiZm91bmQgdGFyZ2V0IGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNraXBGcmFtZSkgeworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMCwgbWJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgbWJ1Zi0+YWRkX3JlZigpOworCisgICAgICAgIHJldHVybiBtYnVmOworICAgIH0KKworICAgIHJldHVybiBuZXcgTWVkaWFCdWZmZXIoMCk7Cit9CisKIHN0YXR1c190IEFWQ0RlY29kZXI6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBMT0dWKCJzZWVrIHJlcXVlc3RlZCB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKICAgICAgICAgbVBlbmRpbmdTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgbVBlbmRpbmdTZWVrTW9kZSA9IG1vZGU7CiAKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgewogICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yMjIsNiArMzA0LDggQEAKICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgTE9HVigiZmV0Y2hpbmcgbmV3IGlucHV0IGJ1ZmZlci4iKTsKIAorICAgICAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKKwogICAgICAgICBpZiAoIW1Db2RlY1NwZWNpZmljRGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG1Db2RlY1NwZWNpZmljRGF0YS5lZGl0SXRlbUF0KDApOwogICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhLnJlbW92ZUF0KDApOwpAQCAtMjM0LDE0ICszMTgsMTcgQEAKIAogICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zIHNlZWtPcHRpb25zOwogICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZWVrT3B0aW9ucy5zZXRTZWVrVG8obVBlbmRpbmdTZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vla2luZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgc2Vla09wdGlvbnMuc2V0U2Vla1RvKG1QZW5kaW5nU2Vla1RpbWVVcywgbVBlbmRpbmdTZWVrTW9kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcyA9IC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZzZWVrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgc2Vla09wdGlvbnMuY2xlYXJTZWVrVG8oKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IGRyYWluT3V0cHV0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKm91dCA9PSBOVUxMKSAgPyBlcnIgOiAoc3RhdHVzX3QpT0s7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CkBAIC0yNTIsMTg2ICszMzksMjA4IEBACiAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChzZWVraW5nKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgICYmIHRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgY29uc3QgdWludDhfdCAqaW5QdHIgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBjb25zdCB1aW50OF90ICpmcmFnUHRyOworICAgIHNpemVfdCBmcmFnU2l6ZTsKKyAgICBmaW5kTkFMRnJhZ21lbnQobUlucHV0QnVmZmVyLCAmZnJhZ1B0ciwgJmZyYWdTaXplKTsKKworICAgIGJvb2wgcmVsZWFzZUZyYWdtZW50ID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCiAgICAgaW50IG5hbFR5cGU7CiAgICAgaW50IG5hbFJlZklkYzsKICAgICBBVkNEZWNfU3RhdHVzIHJlcyA9CiAgICAgICAgIFBWQVZDRGVjR2V0TkFMVHlwZSgKLSAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLCBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwgZnJhZ1NpemUsCiAgICAgICAgICAgICAgICAgJm5hbFR5cGUsICZuYWxSZWZJZGMpOwogCiAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICBMT0dFKCJjYW5ub3QgZGV0ZXJtaW5lIG5hbCB0eXBlIik7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc3dpdGNoIChuYWxUeXBlKSB7Ci0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU1BTOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NlcVBhcmFtU2V0KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKLQotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxKSAqIDE2OwotCi0gICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAxNjsKLQotICAgICAgICAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbTsKLSAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCisgICAgICAgIExPR1YoImNhbm5vdCBkZXRlcm1pbmUgbmFsIHR5cGUiKTsKKyAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gQVZDX05BTFRZUEVfU1BTIHx8IG5hbFR5cGUgPT0gQVZDX05BTFRZUEVfUFBTCisgICAgICAgICAgICAgICAgfHwgKG1TUFNTZWVuICYmIG1QUFNTZWVuKSkgeworICAgICAgICBzd2l0Y2ggKG5hbFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU1BTOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNyb3BfbGVmdCA9IDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgbVNQU1NlZW4gPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfbWJzX29ubHlfZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCArIDEpOworICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjU2VxUGFyYW1TZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlBWQVZDRGVjU2VxUGFyYW1TZXQgcmV0dXJuZWQgZXJyb3IgJWQiLCByZXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKKworICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPQorICAgICAgICAgICAgICAgICAgICAocERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEpICogMTY7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpICogMTY7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IDQgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICg0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0ID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtICgyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCArIDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF90b3AgPSA0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGNyb3BfcmlnaHQgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gY3JvcF9sZWZ0ID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOwotICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gY3JvcF9sZWZ0ID0gMDsKKworICAgICAgICAgICAgICAgIGludDMyX3QgYWxpZ25lZF93aWR0aCA9IChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSArIDE1KSAmIH4xNTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfaGVpZ2h0ID0gKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxICsgMTUpICYgfjE1OworCisgICAgICAgICAgICAgICAgaW50MzJfdCBvbGRXaWR0aCwgb2xkSGVpZ2h0OworICAgICAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZvbGRXaWR0aCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmb2xkSGVpZ2h0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAob2xkV2lkdGggIT0gYWxpZ25lZF93aWR0aCB8fCBvbGRIZWlnaHQgIT0gYWxpZ25lZF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBhbGlnbmVkX3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgYWxpZ25lZF9oZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IElORk9fRk9STUFUX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfd2lkdGggPSAoY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDEgKyAxNSkgJiB+MTU7Ci0gICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfaGVpZ2h0ID0gKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxICsgMTUpICYgfjE1OwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBhbGlnbmVkX3dpZHRoKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGFsaWduZWRfaGVpZ2h0KTsKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfUFBTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1QUFNTZWVuID0gdHJ1ZTsKIAotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjUGljUGFyYW1TZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CiAKLSAgICAgICAgICAgIHJldHVybiBJTkZPX0ZPUk1BVF9DSEFOR0VEOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJQVkFWQ0RlY1BpY1BhcmFtU2V0IHJldHVybmVkIGVycm9yICVkIiwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfUFBTOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1BpY1BhcmFtU2V0KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0xJQ0U6Ci0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfSURSOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBQVkFWQ0RlY29kZVNsaWNlKAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9PVVRQVVRfUkVBRFkpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OwotICAgICAgICAgICAgICAgIGludDMyX3QgUmVsZWFzZTsKLSAgICAgICAgICAgICAgICBBVkNGcmFtZUlPIE91dHB1dDsKLSAgICAgICAgICAgICAgICBPdXRwdXQuWUNiQ3JbMF0gPSBPdXRwdXQuWUNiQ3JbMV0gPSBPdXRwdXQuWUNiQ3JbMl0gPSBOVUxMOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKFBWQVZDRGVjR2V0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsICZpbmRleCwgJlJlbGVhc2UsICZPdXRwdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ0RFQ19TVUNDRVNTKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKGluZGV4ID49IDApOwotICAgICAgICAgICAgICAgIENIRUNLKGluZGV4IDwgKGludDMyX3QpbUZyYW1lcy5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgKm91dCA9IG1GcmFtZXMuZWRpdEl0ZW1BdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgKCpvdXQpLT5zZXRfcmFuZ2UoMCwgKCpvdXQpLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICgqb3V0KS0+YWRkX3JlZigpOwotCi0gICAgICAgICAgICAgICAgLy8gRG8gX25vdF8gcmVsZWFzZSBpbnB1dCBidWZmZXIgeWV0LgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgPT0gQVZDREVDX1BJQ1RVUkVfUkVBRFkgfHwgcmVzID09IEFWQ0RFQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiZmFpbGVkIHRvIGRlY29kZSBmcmFtZSAocmVzID0gJWQpIiwgcmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0VJOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NFSSgKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGluUHRyKSwKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9TTElDRToKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfSURSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjb2RlU2xpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEFWQ0RFQ19QSUNUVVJFX09VVFBVVF9SRUFEWSkgeworICAgICAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IGRyYWluT3V0cHV0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG1idWY7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gX25vdF8gcmVsZWFzZSBpbnB1dCBidWZmZXIgeWV0LgorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VGcmFnbWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9SRUFEWSB8fCByZXMgPT0gQVZDREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJQVkFWQ0RlY29kZVNsaWNlIHJldHVybmVkIGVycm9yICVkIiwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0VJOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjU0VJKAorICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGZyYWdQdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworCisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfQVVEOgorICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9GSUxMOgorICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9FT1NFUToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworCisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HRSgiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG5hbFR5cGUgJWQiLCBuYWxUeXBlKTsKKyAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIFNQUyBvciBQUFMgeWV0LgogCi0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfQVVEOgotICAgICAgICB7CisgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIGlmIChyZWxlYXNlRnJhZ21lbnQpIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIGlmIChmcmFnU2l6ZSArIDQgPT0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewogICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBMT0dFKCJTaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbmFsVHlwZSAlZCIsIG5hbFR5cGUpOwotICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUiKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UoCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIGZyYWdTaXplICsgNCwKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIGZyYWdTaXplIC0gNCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIGVycjsKIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQW5kcm9pZC5tawppbmRleCAyYTFjOGUwLi4xYjAwMzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDcgQEAKICAJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAJJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZQorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmEzOTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFWQ0VuY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBVkNFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKworICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OworICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOworICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOworCisgICAgLyogWSBjb3B5aW5nICovCisgICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7CisKKyAgICAvKiBVICYgViBjb3B5aW5nICovCisgICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOworICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgorICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKKyAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IE1hbGxvY1dyYXBwZXIoCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihtYWxsb2Moc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCBGcmVlV3JhcHBlcih2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBwdHIpIHsKKyAgICBmcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihwdHIpKTsKK30KKworc3RhdGljIGludDMyX3QgRHBiQWxsb2NXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycykgeworICAgIEFWQ0VuY29kZXIgKmVuY29kZXIgPSBzdGF0aWNfY2FzdDxBVkNFbmNvZGVyICo+KHVzZXJEYXRhKTsKKyAgICBDSEVDSyhlbmNvZGVyICE9IE5VTEwpOworICAgIHJldHVybiBlbmNvZGVyLT5hbGxvY091dHB1dEJ1ZmZlcnMoc2l6ZUluTWJzLCBudW1CdWZmZXJzKTsKK30KKworc3RhdGljIGludDMyX3QgQmluZEZyYW1lV3JhcHBlcigKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsIGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpIHsKKyAgICBBVkNFbmNvZGVyICplbmNvZGVyID0gc3RhdGljX2Nhc3Q8QVZDRW5jb2RlciAqPih1c2VyRGF0YSk7CisgICAgQ0hFQ0soZW5jb2RlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gZW5jb2Rlci0+YmluZE91dHB1dEJ1ZmZlcihpbmRleCwgeXV2KTsKK30KKworc3RhdGljIHZvaWQgVW5iaW5kRnJhbWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IGluZGV4KSB7CisgICAgQVZDRW5jb2RlciAqZW5jb2RlciA9IHN0YXRpY19jYXN0PEFWQ0VuY29kZXIgKj4odXNlckRhdGEpOworICAgIENIRUNLKGVuY29kZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIGVuY29kZXItPnVuYmluZE91dHB1dEJ1ZmZlcihpbmRleCk7Cit9CisKK0FWQ0VuY29kZXI6OkFWQ0VuY29kZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lcygtMSksCisgICAgICBtUHJldlRpbWVzdGFtcFVzKC0xKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1JbnB1dEZyYW1lRGF0YShOVUxMKSwKKyAgICAgIG1Hcm91cChOVUxMKSB7CisKKyAgICBMT0dWKCJDb25zdHJ1Y3Qgc29mdHdhcmUgQVZDRW5jb2RlciIpOworCisgICAgbUhhbmRsZSA9IG5ldyB0YWdBVkNIYW5kbGU7CisgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWdBVkNIYW5kbGUpKTsKKyAgICBtSGFuZGxlLT5BVkNPYmplY3QgPSBOVUxMOworICAgIG1IYW5kbGUtPnVzZXJEYXRhID0gdGhpczsKKyAgICBtSGFuZGxlLT5DQkFWQ19EUEJBbGxvYyA9IERwYkFsbG9jV3JhcHBlcjsKKyAgICBtSGFuZGxlLT5DQkFWQ19GcmFtZUJpbmQgPSBCaW5kRnJhbWVXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX0ZyYW1lVW5iaW5kID0gVW5iaW5kRnJhbWVXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX01hbGxvYyA9IE1hbGxvY1dyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJlZSA9IEZyZWVXcmFwcGVyOworCisgICAgbUluaXRDaGVjayA9IGluaXRDaGVjayhtZXRhKTsKK30KKworQVZDRW5jb2Rlcjo6fkFWQ0VuY29kZXIoKSB7CisgICAgTE9HVigiRGVzdHJ1Y3Qgc29mdHdhcmUgQVZDRW5jb2RlciIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorCisgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgZGVsZXRlIG1IYW5kbGU7Cit9CisKK3N0YXR1c190IEFWQ0VuY29kZXI6OmluaXRDaGVjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBMT0dWKCJpbml0Q2hlY2siKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVZpZGVvV2lkdGgpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1WaWRlb0hlaWdodCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1WaWRlb0ZyYW1lUmF0ZSkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJm1WaWRlb0JpdFJhdGUpKTsKKworICAgIC8vIFhYWDogQWRkIG1vcmUgY29sb3IgZm9ybWF0IHN1cHBvcnQKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmbVZpZGVvQ29sb3JGb3JtYXQpKTsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgICAgIExPR0UoIkNvbG9yIGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwgbVZpZGVvQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGxvY2F0ZSBzcGFyZSBidWZmZXIgb25seSB3aGVuIGNvbG9yIGNvbnZlcnNpb24gaXMgbmVlZGVkLgorICAgICAgICAvLyBBc3N1bWUgdGhlIGNvbG9yIGZvcm1hdCBpcyBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hci4KKyAgICAgICAgbUlucHV0RnJhbWVEYXRhID0KKyAgICAgICAgICAgICh1aW50OF90ICopIG1hbGxvYygobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzICkgPj4gMSk7CisgICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSk7CisgICAgfQorCisgICAgLy8gWFhYOiBSZW1vdmUgdGhpcyByZXN0cmljdGlvbgorICAgIGlmIChtVmlkZW9XaWR0aCAlIDE2ICE9IDAgfHwgbVZpZGVvSGVpZ2h0ICUgMTYgIT0gMCkgeworICAgICAgICBMT0dFKCJWaWRlbyBmcmFtZSBzaXplICVkeCVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiIsCisgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ0FWQ0VuY1BhcmFtOworICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YobUVuY1BhcmFtcykpOworICAgIG1FbmNQYXJhbXMtPndpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgbUVuY1BhcmFtcy0+aGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmZyYW1lX3JhdGUgPSAxMDAwICogbVZpZGVvRnJhbWVSYXRlOyAgLy8gSW4gZnJhbWVzL21zIQorICAgIG1FbmNQYXJhbXMtPnJhdGVfY29udHJvbCA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5iaXRyYXRlID0gbVZpZGVvQml0UmF0ZTsKKyAgICBtRW5jUGFyYW1zLT5pbml0UVAgPSAwOworICAgIG1FbmNQYXJhbXMtPmluaXRfQ0JQX3JlbW92YWxfZGVsYXkgPSAxNjAwOworICAgIG1FbmNQYXJhbXMtPkNQQl9zaXplID0gKHVpbnQzMl90KSAobVZpZGVvQml0UmF0ZSA+PiAxKTsKKworICAgIG1FbmNQYXJhbXMtPmludHJhbWJfcmVmcmVzaCA9IDA7CisgICAgbUVuY1BhcmFtcy0+YXV0b19zY2QgPSBBVkNfT047CisgICAgbUVuY1BhcmFtcy0+b3V0X29mX2JhbmRfcGFyYW1fc2V0ID0gQVZDX09OOworICAgIG1FbmNQYXJhbXMtPnBvY190eXBlID0gMjsKKyAgICBtRW5jUGFyYW1zLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQgPSAxMjsKKyAgICBtRW5jUGFyYW1zLT5kZWx0YV9wb2NfemVyb19mbGFnID0gMDsKKyAgICBtRW5jUGFyYW1zLT5vZmZzZXRfcG9jX25vbl9yZWYgPSAwOworICAgIG1FbmNQYXJhbXMtPm9mZnNldF90b3BfYm90dG9tID0gMDsKKyAgICBtRW5jUGFyYW1zLT5udW1fcmVmX2luX2N5Y2xlID0gMDsKKyAgICBtRW5jUGFyYW1zLT5vZmZzZXRfcG9jX3JlZiA9IE5VTEw7CisKKyAgICBtRW5jUGFyYW1zLT5udW1fcmVmX2ZyYW1lID0gMTsKKyAgICBtRW5jUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXAgPSAxOworICAgIG1FbmNQYXJhbXMtPmZtb190eXBlID0gMDsKKworICAgIG1FbmNQYXJhbXMtPmRiX2ZpbHRlciA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5kaXNhYmxlX2RiX2lkYyA9IDA7CisKKyAgICBtRW5jUGFyYW1zLT5hbHBoYV9vZmZzZXQgPSAwOworICAgIG1FbmNQYXJhbXMtPmJldGFfb2Zmc2V0ID0gMDsKKyAgICBtRW5jUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gQVZDX09GRjsKKworICAgIG1FbmNQYXJhbXMtPmRhdGFfcGFyID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5mdWxsc2VhcmNoID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hfcmFuZ2UgPSAxNjsKKyAgICBtRW5jUGFyYW1zLT5zdWJfcGVsID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5zdWJtYl9wcmVkID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5yZG9wdF9tb2RlID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5iaWRpcl9wcmVkID0gQVZDX09GRjsKKyAgICBpbnQzMl90IG5NYWNyb0Jsb2NrcyA9ICgoKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0KSAqCisgICAgICAgICAgICAoKChtVmlkZW9IZWlnaHQgKyAxNSkgPj4gNCkgPDwgNCkpID4+IDg7CisgICAgdWludDMyX3QgKnNsaWNlR3JvdXAgPSAodWludDMyX3QgKikgbWFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBuTWFjcm9CbG9ja3MpOworICAgIGZvciAoaW50IGlpID0gMCwgaWR4ID0gMDsgaWkgPCBuTWFjcm9CbG9ja3M7ICsraWkpIHsKKyAgICAgICAgc2xpY2VHcm91cFtpaV0gPSBpZHgrKzsKKyAgICAgICAgaWYgKGlkeCA+PSBtRW5jUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXApIHsKKyAgICAgICAgICAgIGlkeCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVuY1BhcmFtcy0+c2xpY2VfZ3JvdXAgPSBzbGljZUdyb3VwOworCisgICAgbUVuY1BhcmFtcy0+dXNlX292ZXJydW5fYnVmZmVyID0gQVZDX09GRjsKKworICAgIC8vIFNldCBJRFIgZnJhbWUgcmVmcmVzaCBpbnRlcnZhbAorICAgIGludDMyX3QgaUZyYW1lc0ludGVydmFsU2VjOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsU2VjKSk7CisgICAgaWYgKGlGcmFtZXNJbnRlcnZhbFNlYyA8IDApIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCA9IC0xOworICAgIH0gZWxzZSBpZiAoaUZyYW1lc0ludGVydmFsU2VjID09IDApIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCA9IDE7ICAvLyBBbGwgSSBmcmFtZXMKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jUGFyYW1zLT5pZHJfcGVyaW9kID0KKyAgICAgICAgICAgIChpRnJhbWVzSW50ZXJ2YWxTZWMgKiBtVmlkZW9GcmFtZVJhdGUpOworICAgIH0KKyAgICBMT0dWKCJpZHJfcGVyaW9kOiAlZCwgSS1mcmFtZXMgaW50ZXJ2YWw6ICVkIHNlY29uZHMsIGFuZCBmcmFtZSByYXRlOiAlZCIsCisgICAgICAgIG1FbmNQYXJhbXMtPmlkcl9wZXJpb2QsIGlGcmFtZXNJbnRlcnZhbFNlYywgbVZpZGVvRnJhbWVSYXRlKTsKKworICAgIC8vIFNldCBwcm9maWxlIGFuZCBsZXZlbAorICAgIC8vIElmIHByb2ZpbGUgYW5kIGxldmVsIHNldHRpbmcgaXMgbm90IGNvcnJlY3QsIGZhaWx1cmUKKyAgICAvLyBpcyByZXBvcnRlZCB3aGVuIHRoZSBlbmNvZGVyIGlzIGluaXRpYWxpemVkLgorICAgIG1FbmNQYXJhbXMtPnByb2ZpbGUgPSBBVkNfQkFTRUxJTkU7CisgICAgbUVuY1BhcmFtcy0+bGV2ZWwgPSBBVkNfTEVWRUwzXzI7CisgICAgaW50MzJfdCBwcm9maWxlLCBsZXZlbDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKSkgeworICAgICAgICBtRW5jUGFyYW1zLT5wcm9maWxlID0gKEFWQ1Byb2ZpbGUpIHByb2ZpbGU7CisgICAgfQorICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCkpIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+bGV2ZWwgPSAoQVZDTGV2ZWwpIGxldmVsOworICAgIH0KKworCisgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIG1WaWRlb1dpZHRoKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtVmlkZW9IZWlnaHQpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpZGVvRnJhbWVSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIG1WaWRlb0NvbG9yRm9ybWF0KTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQVZDRW5jb2RlciIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIExPR1YoInN0YXJ0Iik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RhcnQoKSB3aGVuIGVuY29kZXIgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBVkNFbmNfU3RhdHVzIGVycjsKKyAgICBlcnIgPSBQVkFWQ0VuY0luaXRpYWxpemUobUhhbmRsZSwgbUVuY1BhcmFtcywgTlVMTCwgTlVMTCk7CisgICAgaWYgKGVyciAhPSBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlcjogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIGludDMyX3QgbWF4U2l6ZTsKKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0KKyAgICAgICAgUFZBVkNFbmNHZXRNYXhPdXRwdXRCdWZmZXJTaXplKG1IYW5kbGUsICZtYXhTaXplKSkgeworICAgICAgICBtYXhTaXplID0gMzE1ODQ7ICAvLyBNYWdpYyAjCisgICAgfQorICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobWF4U2l6ZSkpOworCisgICAgbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKyAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMjsgIC8vIDFzdCB0d28gYnVmZmVycyBjb250YWluIFNQUyBhbmQgUFBTCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IHRydWU7CisgICAgbUlzSURSRnJhbWUgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVkNFbmNvZGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RvcCgpIHdoZW4gZW5jb2RlciBoYXMgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1Hcm91cCkgeworICAgICAgICBkZWxldGUgbUdyb3VwOworICAgICAgICBtR3JvdXAgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtSW5wdXRGcmFtZURhdGEpIHsKKyAgICAgICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKG1IYW5kbGUpOworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZWxlYXNlT3V0cHV0QnVmZmVycygpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQVZDRW5jb2Rlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlcnMoKSB7CisgICAgTE9HVigicmVsZWFzZU91dHB1dEJ1ZmZlcnMiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRCdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpOworICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgbU91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKK30KKworc3A8TWV0YURhdGE+IEFWQ0VuY29kZXI6OmdldEZvcm1hdCgpIHsKKyAgICBMT0dWKCJnZXRGb3JtYXQiKTsKKyAgICByZXR1cm4gbUZvcm1hdDsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICBDSEVDSyghb3B0aW9ucyk7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyOworICAgIENIRUNLX0VRKE9LLCBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRwdXRCdWZmZXIpKTsKKyAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKSBvdXRwdXRCdWZmZXItPmRhdGEoKTsKKyAgICB1aW50MzJfdCBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCAmJiBtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIDQgYnl0ZXMgYXJlIHJlc2VydmVkIGZvciBob2xkaW5nIHRoZSBzdGFydCBjb2RlIDB4MDAwMDAwMDEKKyAgICAgICAgLy8gb2YgdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgb3V0UHRyICs9IDQ7CisgICAgICAgIGRhdGFMZW5ndGggLT0gNDsKKyAgICB9CisKKyAgICBpbnQzMl90IHR5cGU7CisgICAgQVZDRW5jX1N0YXR1cyBlbmNvZGVyU3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICAvLyBDb21iaW5lIFNQUyBhbmQgUFBTIGFuZCBwbGFjZSB0aGVtIGluIHRoZSB2ZXJ5IGZpcnN0IG91dHB1dCBidWZmZXIKKyAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc2VwYXJhdGVkIGJ5IHN0YXJ0IGNvZGUgMHgwMDAwMDAwMQorICAgIC8vIEFzc3VtZSB0aGF0IHdlIGhhdmUgZXhhY3RseSBvbmUgU1BTIGFuZCBleGFjdGx5IG9uZSBQUFMuCisgICAgd2hpbGUgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgJiYgbU51bUlucHV0RnJhbWVzIDw9IDApIHsKKyAgICAgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jb2RlTkFMKG1IYW5kbGUsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZ0eXBlKTsKKyAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1dST05HX1NUQVRFKSB7CisgICAgICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgbU51bUlucHV0RnJhbWVzKTsgIC8vIDFzdCB2aWRlbyBmcmFtZSBpcyAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NQUzoKKyAgICAgICAgICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKW91dHB1dEJ1ZmZlci0+ZGF0YSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCBkYXRhTGVuZ3RoICsgNCk7CisgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSAoZGF0YUxlbmd0aCArIDQpOyAgLy8gNCBieXRlcyBmb3IgbmV4dCBzdGFydCBjb2RlCisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggPSBvdXRwdXRCdWZmZXItPnNpemUoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9QUFM6CisgICAgICAgICAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKCh1aW50OF90ICopIG91dHB1dEJ1ZmZlci0+ZGF0YSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKyBvdXRwdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgNCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIDApOworICAgICAgICAgICAgICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTmFsIHR5cGUgKCVkKSBvdGhlciB0aGFuIFNQUy9QUFMgaXMgdW5leHBlY3RlZCIsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBuZXh0IGlucHV0IHZpZGVvIGZyYW1lCisgICAgaWYgKG1SZWFkeUZvck5leHRGcmFtZSkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgdmlkZW8gZnJhbWU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnNpemUoKSAtICgobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICAgICAvLyBXaGVuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGlzIHRoZSBzYW1lIGFzCisgICAgICAgIC8vIHRoYXQgb2YgdGhlIHByZXZpb3VzIHNhbXBsZSwgdGhlIGVuY29kaW5nIG9mIHRoZSBzYW1wbGUKKyAgICAgICAgLy8gaXMgYnlwYXNzZWQsIGFuZCB0aGUgb3V0cHV0IGxlbmd0aCBpcyBzZXQgdG8gMC4KKyAgICAgICAgaWYgKG1OdW1JbnB1dEZyYW1lcyA+PSAxICYmIG1QcmV2VGltZXN0YW1wVXMgPT0gdGltZVVzKSB7CisgICAgICAgICAgICAvLyBGcmFtZSBhcnJpdmVzIHRvbyBsYXRlCisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBhY2NlcHQgb3V0LW9mLW9yZGVyIHNhbXBsZXMKKyAgICAgICAgQ0hFQ0sobVByZXZUaW1lc3RhbXBVcyA8IHRpbWVVcyk7CisgICAgICAgIG1QcmV2VGltZXN0YW1wVXMgPSB0aW1lVXM7CisKKyAgICAgICAgQVZDRnJhbWVJTyB2aWRlb0lucHV0OworICAgICAgICBtZW1zZXQoJnZpZGVvSW5wdXQsIDAsIHNpemVvZih2aWRlb0lucHV0KSk7CisgICAgICAgIHZpZGVvSW5wdXQuaGVpZ2h0ID0gKChtVmlkZW9IZWlnaHQgICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgIHZpZGVvSW5wdXQucGl0Y2ggPSAoKG1WaWRlb1dpZHRoICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgIHZpZGVvSW5wdXQuY29kaW5nX3RpbWVzdGFtcCA9ICh0aW1lVXMgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCisgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9ICh1aW50OF90ICopIG1JbnB1dEJ1ZmZlci0+ZGF0YSgpOworCisgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEpOworICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0soaW5wdXREYXRhICE9IE5VTEwpOworICAgICAgICB2aWRlb0lucHV0LllDYkNyWzBdID0gaW5wdXREYXRhOworICAgICAgICB2aWRlb0lucHV0LllDYkNyWzFdID0gdmlkZW9JbnB1dC5ZQ2JDclswXSArIHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaDsKKyAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsyXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMV0gKworICAgICAgICAgICAgKCh2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2gpID4+IDIpOworICAgICAgICB2aWRlb0lucHV0LmRpc3Bfb3JkZXIgPSBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jU2V0SW5wdXQobUhhbmRsZSwgJnZpZGVvSW5wdXQpOworICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUyB8fAorICAgICAgICAgICAgZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUikgeworICAgICAgICAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gZmFsc2U7CisgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKSB7CisgICAgICAgICAgICAgICAgbUlzSURSRnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVuY29kZSBhbiBpbnB1dCB2aWRlbyBmcmFtZQorICAgIENIRUNLKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MgfHwKKyAgICAgICAgICBlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKTsKKyAgICBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyLT5zaXplKCk7ICAvLyBSZXNldCB0aGUgb3V0cHV0IGJ1ZmZlciBsZW5ndGgKKyAgICBlbmNvZGVyU3RhdHVzID0gUFZBVkNFbmNvZGVOQUwobUhhbmRsZSwgb3V0UHRyLCAmZGF0YUxlbmd0aCwgJnR5cGUpOworICAgIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgbUlzSURSRnJhbWUpOworICAgICAgICBDSEVDS19FUShOVUxMLCBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworICAgIH0gZWxzZSBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfUElDVFVSRV9SRUFEWSkgeworICAgICAgICBDSEVDS19FUShOVUxMLCBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworICAgICAgICBpZiAobUlzSURSRnJhbWUpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgbUlzSURSRnJhbWUpOworICAgICAgICAgICAgbUlzSURSRnJhbWUgPSAwOworICAgICAgICAgICAgTE9HVigiT3V0cHV0IGFuIElEUiBmcmFtZSIpOworICAgICAgICB9CisgICAgICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IHRydWU7CisgICAgICAgIEFWQ0ZyYW1lSU8gcmVjb247CisgICAgICAgIGlmIChQVkFWQ0VuY0dldFJlY29uKG1IYW5kbGUsICZyZWNvbikgPT0gQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBWQVZDRW5jUmVsZWFzZVJlY29uKG1IYW5kbGUsICZyZWNvbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb3V0cHV0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgZGF0YUxlbmd0aCk7CisgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludDMyX3QgQVZDRW5jb2Rlcjo6YWxsb2NPdXRwdXRCdWZmZXJzKAorICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycykgeworICAgIENIRUNLKG1PdXRwdXRCdWZmZXJzLmlzRW1wdHkoKSk7CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IChzaXplSW5NYnMgPDwgNykgKiAzOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgIG51bUJ1ZmZlcnM7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lU2l6ZSk7CisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJzLnB1c2goYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBBVkNFbmNvZGVyOjp1bmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCkgeworICAgIENIRUNLKGluZGV4ID49IDApOworfQorCitpbnQzMl90IEFWQ0VuY29kZXI6OmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dikgeworICAgIENIRUNLKGluZGV4ID49IDApOworICAgIENIRUNLKGluZGV4IDwgKGludDMyX3QpIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgbU91dHB1dEJ1ZmZlcnNbaW5kZXhdLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICAqeXV2ID0gKHVpbnQ4X3QgKikgbU91dHB1dEJ1ZmZlcnNbaW5kZXhdLT5kYXRhKCk7CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBBVkNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJlMzIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM1IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBVkNFbmNvZGVyLmNwcCBcCisgICAgc3JjL2F2Y2VuY19hcGkuY3BwIFwKKyAgICBzcmMvYml0c3RyZWFtX2lvLmNwcCBcCisgICAgc3JjL2Jsb2NrLmNwcCBcCisgICAgc3JjL2ZpbmRoYWxmcGVsLmNwcCBcCisgICAgc3JjL2hlYWRlci5jcHAgXAorICAgIHNyYy9pbml0LmNwcCBcCisgICAgc3JjL2ludHJhX2VzdC5jcHAgXAorICAgIHNyYy9tb3Rpb25fY29tcC5jcHAgXAorICAgIHNyYy9tb3Rpb25fZXN0LmNwcCBcCisgICAgc3JjL3JhdGVfY29udHJvbC5jcHAgXAorICAgIHNyYy9yZXNpZHVhbC5jcHAgXAorICAgIHNyYy9zYWQuY3BwIFwKKyAgICBzcmMvc2FkX2hhbGZwZWwuY3BwIFwKKyAgICBzcmMvc2xpY2UuY3BwIFwKKyAgICBzcmMvdmxjX2VuY29kZS5jcHAKKworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYXZjZW5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgLURfX2FybV9fIFwKKyAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ODg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmNwcApAQCAtMCwwICsxLDc0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDR2V0TkFMVHlwZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTbmlmZiBOQUwgdHlwZSBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDRU5DX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXROQUxUeXBlKHVuc2lnbmVkIGNoYXIgKmJpdHN0cmVhbSwgaW50IHNpemUsCisgICAgICAgIGludCAqbmFsX3R5cGUsIGludCAqbmFsX3JlZl9pZGMpCit7CisgICAgaW50IGZvcmJpZGRlbl96ZXJvX2JpdDsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgeworICAgICAgICBmb3JiaWRkZW5femVyb19iaXQgPSBiaXRzdHJlYW1bMF0gPj4gNzsKKyAgICAgICAgaWYgKGZvcmJpZGRlbl96ZXJvX2JpdCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICAqbmFsX3JlZl9pZGMgPSAoYml0c3RyZWFtWzBdICYgMHg2MCkgPj4gNTsKKyAgICAgICAgKm5hbF90eXBlID0gYml0c3RyZWFtWzBdICYgMHgxRjsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jSW5pdGlhbGl6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8xOC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBJbml0aWFsaXplIHRoZSBlbmNvZGVyIGxpYnJhcnksIGFsbG9jYXRlIG1lbW9yeSBhbmQgdmVyaWZ5ICAgKi8KKy8qICAgICAgICAgICAgICB0aGUgcHJvZmlsZS9sZXZlbCBzdXBwb3J0L3NldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogRW5jb2RpbmcgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0luaXRpYWxpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyAqZW5jUGFyYW0sCisgICAgICAgIHZvaWQqIGV4dFNQUywgdm9pZCogZXh0UFBTKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87CisgICAgdWludDMyICp1c2VyRGF0YSA9ICh1aW50MzIqKSBhdmNIYW5kbGUtPnVzZXJEYXRhOworICAgIGludCBmcmFtZXNpemU7CisKKyAgICBpZiAoYXZjSGFuZGxlLT5BVkNPYmplY3QgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfQUxSRUFEWV9JTklUSUFMSVpFRDsgLyogSXQncyBhbHJlYWR5IGluaXRpYWxpemVkLCBuZWVkIHRvIGNsZWFudXAgZmlyc3QgKi8KKyAgICB9CisKKyAgICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KKworICAgIC8qIGFsbG9jYXRlIHZpZGVvT2JqZWN0ICovCisgICAgYXZjSGFuZGxlLT5BVkNPYmplY3QgPSAodm9pZCopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNFbmNPYmplY3QpLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChhdmNIYW5kbGUtPkFWQ09iamVjdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBlbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgbWVtc2V0KGVuY3ZpZCwgMCwgc2l6ZW9mKEFWQ0VuY09iamVjdCkpOyAvKiByZXNldCBldmVyeXRoaW5nICovCisKKyAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19Jbml0aWFsaXppbmc7CisKKyAgICBlbmN2aWQtPmF2Y0hhbmRsZSA9IGF2Y0hhbmRsZTsKKworICAgIGVuY3ZpZC0+Y29tbW9uID0gKEFWQ0NvbW1vbk9iaiopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDQ29tbW9uT2JqKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5jb21tb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBtZW1zZXQodmlkZW8sIDAsIHNpemVvZihBVkNDb21tb25PYmopKTsKKworICAgIC8qIGFsbG9jYXRlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgKi8KKyAgICBlbmN2aWQtPmJpdHN0cmVhbSA9IChBVkNFbmNCaXRzdHJlYW0qKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0VuY0JpdHN0cmVhbSksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+Yml0c3RyZWFtID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBlbmN2aWQtPmJpdHN0cmVhbS0+ZW5jdmlkID0gZW5jdmlkOyAvKiB0byBwb2ludCBiYWNrIGZvciByZWFsbG9jYXRpb24gKi8KKworICAgIC8qIGFsbG9jYXRlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlICovCisgICAgdmlkZW8tPmN1cnJTZXFQYXJhbXMgPSAoQVZDU2VxUGFyYW1TZXQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1NlcVBhcmFtU2V0KSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPmN1cnJTZXFQYXJhbXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+Y3VyclNlcVBhcmFtcywgMCwgc2l6ZW9mKEFWQ1NlcVBhcmFtU2V0KSk7CisKKyAgICAvKiBhbGxvY2F0ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlICovCisgICAgdmlkZW8tPmN1cnJQaWNQYXJhbXMgPSAoQVZDUGljUGFyYW1TZXQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1BpY1BhcmFtU2V0KSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+Y3VyclBpY1BhcmFtcywgMCwgc2l6ZW9mKEFWQ1BpY1BhcmFtU2V0KSk7CisKKyAgICAvKiBhbGxvY2F0ZSBzbGljZSBoZWFkZXIgc3RydWN0dXJlICovCisgICAgdmlkZW8tPnNsaWNlSGRyID0gKEFWQ1NsaWNlSGVhZGVyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNTbGljZUhlYWRlciksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5zbGljZUhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KHZpZGVvLT5zbGljZUhkciwgMCwgc2l6ZW9mKEFWQ1NsaWNlSGVhZGVyKSk7CisKKyAgICAvKiBhbGxvY2F0ZSBlbmNvZGVkIHBpY3R1cmUgYnVmZmVyIHN0cnVjdHVyZSovCisgICAgdmlkZW8tPmRlY1BpY0J1ZiA9IChBVkNEZWNQaWNCdWZmZXIqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0RlY1BpY0J1ZmZlciksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+ZGVjUGljQnVmLCAwLCBzaXplb2YoQVZDRGVjUGljQnVmZmVyKSk7CisKKyAgICAvKiBhbGxvY2F0ZSByYXRlIGNvbnRyb2wgc3RydWN0dXJlICovCisgICAgZW5jdmlkLT5yYXRlQ3RybCA9IChBVkNSYXRlQ29udHJvbCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDUmF0ZUNvbnRyb2wpLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPnJhdGVDdHJsID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQoZW5jdmlkLT5yYXRlQ3RybCwgMCwgc2l6ZW9mKEFWQ1JhdGVDb250cm9sKSk7CisKKyAgICAvKiByZXNldCBmcmFtZSBsaXN0LCBub3QgcmVhbGx5IG5lZWRlZCAqLworICAgIHZpZGVvLT5jdXJyUGljID0gTlVMTDsKKyAgICB2aWRlby0+Y3VyckZTID0gTlVMTDsKKyAgICBlbmN2aWQtPmN1cnJJbnB1dCA9IE5VTEw7CisgICAgdmlkZW8tPnByZXZSZWZQaWMgPSBOVUxMOworCisgICAgLyogbm93IHJlYWQgZW5jUGFyYW1zLCBhbmQgYWxsb2NhdGUgZGltZW5zaW9uLWRlcGVuZGVudCB2YXJpYWJsZXMgKi8KKyAgICAvKiBzdWNoIGFzIG1ibG9jayAqLworICAgIHN0YXR1cyA9IFNldEVuY29kZVBhcmFtKGF2Y0hhbmRsZSwgZW5jUGFyYW0sIGV4dFNQUywgZXh0UFBTKTsgLyogaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHRvIGJlIHVzZWQgaW4gU1BTKi8KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoZW5jUGFyYW0tPnVzZV9vdmVycnVuX2J1ZmZlciA9PSBBVkNfT04pCisgICAgeworICAgICAgICAvKiBhbGxvY2F0ZSBvdmVycnVuIGJ1ZmZlciAqLworICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IGVuY3ZpZC0+cmF0ZUN0cmwtPmNwYlNpemU7CisgICAgICAgIGlmIChlbmN2aWQtPm9CU2l6ZSA+IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gKHVpbnQ4KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIGVuY3ZpZC0+b0JTaXplLCBERUZBVUxUX0FUVFIpOworICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5vQlNpemUgPSAwOworICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGZyYW1lIHNpemUgZGVwZW5kZW50IHN0cnVjdHVyZXMgKi8KKyAgICBmcmFtZXNpemUgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1icyAqIHZpZGVvLT5QaWNXaWR0aEluTWJzOworCisgICAgdmlkZW8tPm1ibG9jayA9IChBVkNNYWNyb2Jsb2NrKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNNYWNyb2Jsb2NrKSAqIGZyYW1lc2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXAgPSAoaW50KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50KSAqIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAqIDIsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBlbmN2aWQtPm1vdDE2eDE2ID0gKEFWQ01WKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNNVikgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+bW90MTZ4MTYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldChlbmN2aWQtPm1vdDE2eDE2LCAwLCBzaXplb2YoQVZDTVYpKmZyYW1lc2l6ZSk7CisKKyAgICBlbmN2aWQtPmludHJhU2VhcmNoID0gKHVpbnQ4KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50OCkgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+aW50cmFTZWFyY2ggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgZW5jdmlkLT5taW5fY29zdCA9IChpbnQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKGludCkgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+bWluX2Nvc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBtb3Rpb24gc2VhcmNoIHJlbGF0ZWQgbWVtb3J5ICovCisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IEluaXRNb3Rpb25TZWFyY2hNb2R1bGUoYXZjSGFuZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IEluaXRSYXRlQ29udHJvbE1vZHVsZShhdmNIYW5kbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICAvKiBpbnRpYWxpemUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlciA9IChBVkNFbmNGdW5jUHRyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNFbmNGdW5jUHRyKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5mdW5jdGlvblBvaW50ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZBVkNTQURfTWFjcm9ibG9ja19DOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJkFWQ1NBRF9NQl9IYWxmUGVsX0N4aDsKKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmQVZDU0FEX01CX0hhbGZQZWxfQ3loOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZBVkNTQURfTUJfSGFsZlBlbF9DeGh5aDsKKworICAgIC8qIGluaXRpYWxpemUgdGltaW5nIGNvbnRyb2wgKi8KKyAgICBlbmN2aWQtPm1vZFRpbWVSZWYgPSAwOyAgICAgLyogQUxXQVlTIEFTU1VNRSBUSEFUIFRJTUVTVEFNUCBTVEFSVCBGUk9NIDAgISEhKi8KKyAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gMDsKKyAgICBlbmN2aWQtPnByZXZDb2RlZEZyYW1lTnVtID0gMDsKKyAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSAwOworCisgICAgaWYgKGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX1NQUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0dldE1heE91dHB1dFNpemUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDExLzI5LzIwMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUmV0dXJuIG1heCBvdXRwdXQgYnVmZmVyIHNpemUgdGhhdCBhcHBzIHNob3VsZCBhbGxvY2F0ZSBmb3IgICovCisvKiAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldE1heE91dHB1dEJ1ZmZlclNpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCogc2l6ZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgICpzaXplID0gZW5jdmlkLT5yYXRlQ3RybC0+Y3BiU2l6ZTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY1NldElucHV0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMTgvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gZmVlZCBhbiB1bmVuY29kZWQgb3JpZ2luYWwgZnJhbWUgdG8gdGhlIGVuY29kZXIgbGlicmFyeS4gICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jU2V0SW5wdXQoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKmlucHV0KQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGZyYW1lTnVtOworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgIGlmIChlbmN2aWQtPmVuY19zdGF0ZSA9PSBBVkNFbmNfV2FpdGluZ0ZvckJ1ZmZlcikKKyAgICB7CisgICAgICAgIGdvdG8gUkVDQUxMX0lOSVRGUkFNRTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jdmlkLT5lbmNfc3RhdGUgIT0gQVZDRW5jX0FuYWx5emluZ19GcmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPnBpdGNoID4gMHhGRkZGKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOyAvLyB3ZSB1c2UgMi1ieXRlcyBmb3IgcGl0Y2gKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBMZXQncyByYXRlIGNvbnRyb2wgZGVjaWRlIHdoZXRoZXIgdG8gZW5jb2RlIHRoaXMgZnJhbWUgb3Igbm90ICovCisgICAgLyogQWxzbyBzZXQgdmlkZW8tPm5hbF91bml0X3R5cGUsIHNsaWNlSGRyLT5zbGljZV90eXBlLCB2aWRlby0+c2xpY2VfdHlwZSAqLworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBSQ0RldGVybWluZUZyYW1lTnVtKGVuY3ZpZCwgcmF0ZUN0cmwsIGlucHV0LT5jb2RpbmdfdGltZXN0YW1wLCAmZnJhbWVOdW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkU7IC8qIG5vdCB0aW1lIHRvIGVuY29kZSwgdGh1cyBza2lwcGluZyAqLworICAgIH0KKworICAgIC8qIHdlIG1heSBub3QgbmVlZCB0aGlzIGxpbmUgKi8KKyAgICAvL25leHRGcm1Nb2RUaW1lID0gKHVpbnQzMikoKCgoZnJhbWVOdW0rMSkqMTAwMCkvcmF0ZUN0cmwtPmZyYW1lX3JhdGUpICsgbW9kVGltZVJlZik7IC8qIHJlYy4gdGltZSAqLworICAgIC8vZW5jdmlkLT5uZXh0TW9kVGltZSA9IG5leHRGcm1Nb2RUaW1lIC0gKGVuY3ZpZC0+ZnJhbWVJbnRlcnZhbD4+MSkgLSAxOyAvKiBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5leHQgZnJhbWUgKi8KKworICAgIGVuY3ZpZC0+Y3VycklucHV0ID0gaW5wdXQ7CisgICAgZW5jdmlkLT5jdXJySW5wdXQtPmNvZGluZ19vcmRlciA9IGZyYW1lTnVtOworCitSRUNBTExfSU5JVEZSQU1FOgorICAgIC8qIGluaXRpYWxpemUgYW5kIGFuYWx5emUgdGhlIGZyYW1lICovCisgICAgc3RhdHVzID0gSW5pdEZyYW1lKGVuY3ZpZCk7CisKKyAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU7CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUikKKyAgICB7CisgICAgICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX0ZyYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gYXNzdW1pbmcgdGhhdCBpbi1iYW5kIHBhcmFtc2V0IGtlZXBzIHNlbmRpbmcgbmV3IFNQUyBhbmQgUFBTLgorICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19TUFM7CisgICAgICAgICAgICAvL3ZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCsrOworICAgICAgICAgICAgLy9pZih2aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPiAzMSkgLy8gcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAwOyAgLy8gcmVzZXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5zbGljZUhkci0+aWRyX3BpY19pZCsrOworICAgICAgICBpZiAodmlkZW8tPnNsaWNlSGRyLT5pZHJfcGljX2lkID4gNjU1MzUpIC8vIHJhbmdlIGNoZWNrCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZUhkci0+aWRyX3BpY19pZCA9IDA7ICAvLyByZXNldAorICAgICAgICB9CisgICAgfQorICAgIC8qIHRoZSBmb2xsb3dpbmcgbG9naWNzIG5lZWQgdG8gYmUgcmV2aXNpdGVkICovCisgICAgZWxzZSBpZiAoc3RhdHVzID09IEFWQ0VOQ19QSUNUVVJFX1JFQURZKSAvLyBubyBidWZmZXJzIHJldHVybmVkIGJhY2sgdG8gdGhlIGVuY29kZXIKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX1dhaXRpbmdGb3JCdWZmZXI7IC8vIElucHV0IGFjY2VwdGVkIGJ1dCBjYW4ndCBjb250aW51ZQorICAgICAgICAvLyBuZWVkIHRvIGZyZWUgdXAgc29tZSBtZW1vcnkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBFbmNvZGUKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOyAvLyByZXR1cm4gc3RhdHVzLCBpbmNsdWRpbmcgdGhlIEFWQ0VOQ19GQUlMIGNhc2UgYW5kIGFsbCAzIGFib3ZlLgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jb2RlTkFMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8yOS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBlbmNvZGUgb25lIE5BTC9zbGljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNvZGVOQUwoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50ICpidWZfbmFsX3NpemUsIGludCAqbmFsX3R5cGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmIChlbmN2aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuY3ZpZC0+ZW5jX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBBVkNFbmNfSW5pdGlhbGl6aW5nOgorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgICAgICBjYXNlIEFWQ0VuY19FbmNvZGluZ19TUFM6CisgICAgICAgICAgICAvKiBpbml0aWFsaXplZCB0aGUgc3RydWN0dXJlICovCisgICAgICAgICAgICBCaXRzdHJlYW1FbmNJbml0KGJpdHN0cmVhbSwgYnVmZmVyLCAqYnVmX25hbF9zaXplLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIDgsICgxIDw8IDUpIHwgQVZDX05BTFRZUEVfU1BTKTsKKworICAgICAgICAgICAgLyogZW5jb2RlIFNQUyAqLworICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU1BTKGVuY3ZpZCwgYml0c3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2xvc2luZyB0aGUgTkFMIHdpdGggdHJhaWxpbmcgYml0cyAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtVHJhaWxpbmdCaXRzKGJpdHN0cmVhbSwgYnVmX25hbF9zaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfUFBTOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQrKzsKKyAgICAgICAgICAgICAgICAqbmFsX3R5cGUgPSBBVkNfTkFMVFlQRV9TUFM7CisgICAgICAgICAgICAgICAgKmJ1Zl9uYWxfc2l6ZSA9IGJpdHN0cmVhbS0+d3JpdGVfcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDRW5jX0VuY29kaW5nX1BQUzoKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY0luaXQoYml0c3RyZWFtLCBidWZmZXIsICpidWZfbmFsX3NpemUsIE5VTEwsIDApOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgOCwgKDEgPDwgNSkgfCBBVkNfTkFMVFlQRV9QUFMpOworCisgICAgICAgICAgICAvKiBlbmNvZGUgUFBTICovCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVQUFMoZW5jdmlkLCBiaXRzdHJlYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjbG9zaW5nIHRoZSBOQUwgd2l0aCB0cmFpbGluZyBiaXRzICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoYml0c3RyZWFtLCBidWZfbmFsX3NpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBUUlVFKSAvLyBhbHJlYWR5IGV4dHJhY3QgUFBTLCBTUFMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0FuYWx5emluZ19GcmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLyBTZXRJbnB1dCBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIFNQUyBhbmQgUFBTLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKm5hbF90eXBlID0gQVZDX05BTFRZUEVfUFBTOworICAgICAgICAgICAgICAgICpidWZfbmFsX3NpemUgPSBiaXRzdHJlYW0tPndyaXRlX3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDRW5jX0VuY29kaW5nX0ZyYW1lOgorICAgICAgICAgICAgLyogaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgQml0c3RyZWFtRW5jSW5pdChiaXRzdHJlYW0sIGJ1ZmZlciwgKmJ1Zl9uYWxfc2l6ZSwgZW5jdmlkLT5vdmVycnVuQnVmZmVyLCBlbmN2aWQtPm9CU2l6ZSk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCA4LCAodmlkZW8tPm5hbF9yZWZfaWRjIDw8IDUpIHwgKHZpZGVvLT5uYWxfdW5pdF90eXBlKSk7CisKKyAgICAgICAgICAgIC8qIFJlLW9yZGVyIHRoZSByZWZlcmVuY2UgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKCkgKi8KKyAgICAgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gcmVvcmRlciB0aGUgbGlzdCBmb3IgdGhlIGVuY29kZXIgaGVyZS4gVGhpcyBjYW4gb25seSBiZSBkb25lCisgICAgICAgICAgICBhZnRlciB3ZSBlbmNvZGUgdGhpcyBzbGljZS4gV2UgY2FuIHJ1biB0aHJ1IGEgc2Vjb25kLXBhc3MgdG8gc2VlIGlmIG5ldyBvcmRlcmluZworICAgICAgICAgICAgd291bGQgc2F2ZSBtb3JlIGJpdHMuIFRvbyBtdWNoIGRlbGF5ICEhICovCisgICAgICAgICAgICAvKiBzdGF0dXMgPSBSZU9yZGVyTGlzdCh2aWRlbyk7Ki8KKyAgICAgICAgICAgIHN0YXR1cyA9IEluaXRTbGljZShlbmN2aWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3aGVuIHdlIGhhdmUgZXZlcnl0aGluZywgd2UgZW5jb2RlIHRoZSBzbGljZSBoZWFkZXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVNsaWNlSGVhZGVyKGVuY3ZpZCwgYml0c3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gQVZDRW5jb2RlU2xpY2UoZW5jdmlkKTsKKworICAgICAgICAgICAgdmlkZW8tPnNsaWNlX2lkKys7CisKKyAgICAgICAgICAgIC8qIGNsb3NpbmcgdGhlIE5BTCB3aXRoIHRyYWlsaW5nIGJpdHMgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVRyYWlsaW5nQml0cyhiaXRzdHJlYW0sIGJ1Zl9uYWxfc2l6ZSk7CisKKyAgICAgICAgICAgICpidWZfbmFsX3NpemUgPSBiaXRzdHJlYW0tPndyaXRlX3BvczsKKworICAgICAgICAgICAgZW5jdmlkLT5yYXRlQ3RybC0+bnVtRnJhbWVCaXRzICs9ICgoKmJ1Zl9uYWxfc2l6ZSkgPDwgMyk7CisKKyAgICAgICAgICAgICpuYWxfdHlwZSA9IHZpZGVvLT5uYWxfdW5pdF90eXBlOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19QSUNUVVJFX1JFQURZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJDVXBkYXRlRnJhbWUoZW5jdmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkUpIC8qIHNraXAgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBCUmVsZWFzZUN1cnJlbnRGcmFtZShhdmNIYW5kbGUsIHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcGVyZm9ybSBsb29wLWZpbHRlcmluZyBvbiB0aGUgZW50aXJlIGZyYW1lICovCisgICAgICAgICAgICAgICAgRGVibG9ja1BpY3R1cmUodmlkZW8pOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSBvcmlnaW5hbCBmcmFtZSBhcnJheSAqLworICAgICAgICAgICAgICAgIGVuY3ZpZC0+cHJldkNvZGVkRnJhbWVOdW0gPSBlbmN2aWQtPmN1cnJJbnB1dC0+Y29kaW5nX29yZGVyOworCisgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGVuY29kZWQgcGljdHVyZSBpbiB0aGUgRFBCIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIFN0b3JlUGljdHVyZUluRFBCKGF2Y0hhbmRsZSwgdmlkZW8pOworCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljLT5pc1JlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgUE9DIHJlbGF0ZWQgdmFyaWFibGVzICovCisgICAgICAgICAgICAgICAgUG9zdFBPQyh2aWRlbyk7CisKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19BbmFseXppbmdfRnJhbWU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1BJQ1RVUkVfUkVBRFk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1dST05HX1NUQVRFOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyByZXRyaWV2ZSB0aGUgb3ZlcnJ1biBidWZmZXIuIENoZWNrIHdoZXRoZXIgb3ZlcnJ1biBidWZmZXIgKi8KKy8qICAgICAgICAgICAgICBpcyB1c2VkIG9yIG5vdCBiZWZvcmUgcmV0dXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBvdmVycnVuIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgdWludDgqIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihBVkNIYW5kbGUqIGF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisKKyAgICBpZiAoYml0c3RyZWFtLT5vdmVycnVuQnVmZmVyID09IGJpdHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyKSAvKiBPQiBpcyB1c2VkICovCisgICAgeworICAgICAgICByZXR1cm4gZW5jdmlkLT5vdmVycnVuQnVmZmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0dldFJlY29uKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gcmV0cmlldmUgdGhlIG1vc3QgcmVjZW50bHkgZW5jb2RlZCBmcmFtZS4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdXNlciB3aWxsIG1ha2UgYSBjb3B5IGlmIHRoZXkgd2FudCB0byBob2xkIG9uICAgKi8KKy8qICAgICAgICAgICAgICB0byBpdC4gT3RoZXJ3aXNlLCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSByZXNlcnZlZC4gICAgICAqLworLyogICAgICAgICAgICAgIE1vc3QgYXBwbGljYXRpb25zIHByZWZlciB0byBzZWUgb3JpZ2luYWwgZnJhbWUgcmF0aGVyIHRoYW4gICovCisvKiAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZS4gU28sIHdlIGFyZSBzdGF5aW5nIGF3YXJlIGZyb20gY29tcGxleCAgKi8KKy8qICAgICAgICAgICAgICBidWZmZXJpbmcgbWVjaGFuaXNtLiBJZiBuZWVkZWQsIGNhbiBiZSBhZGRlZCBsYXRlci4gICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldFJlY29uKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICpyZWNvbikKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZVN0b3JlICpjdXJyRlMgPSB2aWRlby0+Y3VyckZTOworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgIHJlY29uLT5ZQ2JDclswXSA9IGN1cnJGUy0+ZnJhbWUuU2w7CisgICAgcmVjb24tPllDYkNyWzFdID0gY3VyckZTLT5mcmFtZS5TY2I7CisgICAgcmVjb24tPllDYkNyWzJdID0gY3VyckZTLT5mcmFtZS5TY3I7CisgICAgcmVjb24tPmhlaWdodCA9IGN1cnJGUy0+ZnJhbWUuaGVpZ2h0OworICAgIHJlY29uLT5waXRjaCA9IGN1cnJGUy0+ZnJhbWUucGl0Y2g7CisgICAgcmVjb24tPmRpc3Bfb3JkZXIgPSBjdXJyRlMtPlBpY09yZGVyQ250OworICAgIHJlY29uLT5jb2Rpbmdfb3JkZXIgPSBjdXJyRlMtPkZyYW1lTnVtOworICAgIHJlY29uLT5pZCA9ICh1aW50MzIpIGN1cnJGUy0+YmFzZV9kcGI7IC8qIHVzZSB0aGUgcG9pbnRlciBhcyB0aGUgaWQgKi8KKworICAgIGN1cnJGUy0+SXNPdXRwdXR0ZWQgfD0gMTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNSZWxlYXNlUmVjb24oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKnJlY29uKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhyZWNvbik7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7IC8vZm9yIG5vdworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDQ2xlYW5VcEVuY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xOC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBjbGVhbiB1cCBtZW1vcmllcyBhbGxvY2F0ZWQgYnkgUFZBVkNFbmNJbml0aWFsaXplKCkgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIHZvaWQgICAgUFZBVkNDbGVhblVwRW5jb2RlcihBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvOworICAgIHVpbnQzMiAqdXNlckRhdGEgPSAodWludDMyKikgYXZjSGFuZGxlLT51c2VyRGF0YTsKKworICAgIGlmIChlbmN2aWQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIENsZWFuTW90aW9uU2VhcmNoTW9kdWxlKGF2Y0hhbmRsZSk7CisKKyAgICAgICAgQ2xlYW51cFJhdGVDb250cm9sTW9kdWxlKGF2Y0hhbmRsZSk7CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmZ1bmN0aW9uUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5taW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+bWluX2Nvc3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+aW50cmFTZWFyY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmludHJhU2VhcmNoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPm1vdDE2eDE2KQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5tb3QxNngxNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5yYXRlQ3RybCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+cmF0ZUN0cmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICB2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgICAgICBpZiAodmlkZW8gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5tYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGVhblVwRFBCKGF2Y0hhbmRsZSwgdmlkZW8pOworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+ZGVjUGljQnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+c2xpY2VIZHIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPnNsaWNlSGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfaWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNsaWNlX2dyb3VwX2lkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmN1cnJQaWNQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyU2VxUGFyYW1zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5jdXJyU2VxUGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmN2aWQtPmJpdHN0cmVhbSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmJpdHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZCk7CisKKyAgICAgICAgYXZjSGFuZGxlLT5BVkNPYmplY3QgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlQml0UmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIGJpdHJhdGUpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKGJpdHJhdGUpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUZyYW1lUmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIG51bSwgdWludDMyIGRlbm9tKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhudW0pOworICAgIE9TQ0xfVU5VU0VEX0FSRyhkZW5vbSk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSURSSW50ZXJ2YWwoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCBJRFJJbnRlcnZhbCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoSURSSW50ZXJ2YWwpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0lEUlJlcXVlc3QoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSU1CUmVmcmVzaChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IG51bU1CKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhudW1NQik7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK3ZvaWQgUFZBVkNFbmNHZXRGcmFtZVN0YXRzKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNGcmFtZVN0YXRzICphdmNTdGF0cykKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworCisgICAgYXZjU3RhdHMtPmF2Z0ZyYW1lUVAgPSBHZXRBdmdGcmFtZVFQKHJhdGVDdHJsKTsKKyAgICBhdmNTdGF0cy0+bnVtSW50cmFNQnMgPSBlbmN2aWQtPm51bUludHJhTUI7CisKKyAgICByZXR1cm4gOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0MWVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmgKQEAgLTAsMCArMSwzMjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKK1RoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5CithbmQgbmVjZXNzYXJ5IHR5cGUgZGVmaXRpb25pdGlvbnMgYW5kIGVudW1lcmF0aW9ucy4KK0BwdWJsaXNoZWRBbGwKKyovCisKKyNpZm5kZWYgQVZDRU5DX0FQSV9IX0lOQ0xVREVECisjZGVmaW5lIEFWQ0VOQ19BUElfSF9JTkNMVURFRAorCisjaWZuZGVmIEFWQ0FQSV9DT01NT05fSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2FwaV9jb21tb24uaCIKKyNlbmRpZgorCisvLyBGb3IgbWVtc2V0LCBldGMKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgVGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIGZvciB0aGUgc3RhdHVzIHJldHVybmVkIGZyb20gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLgorKi8KK3R5cGVkZWYgZW51bQoreworICAgIC8qKgorICAgIEZhaWwgaW5mb3JtYXRpb24sIG5lZWQgdG8gYWRkIG1vcmUgZXJyb3IgY29kZSBmb3IgbW9yZSBzcGVjaWZpYyBpbmZvCisgICAgKi8KKyAgICBBVkNFTkNfVFJBSUxJTkdPTkVTX0ZBSUwgPSAtMzUsCisgICAgQVZDRU5DX1NMSUNFX0VNUFRZID0gLTM0LAorICAgIEFWQ0VOQ19QT0NfRkFJTCA9IC0zMywKKyAgICBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGID0gLTMyLAorICAgIEFWQ0VOQ19DQUJBQ19GQUlMID0gLTMxLAorICAgIEFWQ0VOQ19QUkVEX1dFSUdIVF9UQUJfRkFJTCA9IC0zMCwKKyAgICBBVkNFTkNfREVDX1JFRl9QSUNfTUFSS19GQUlMID0gLTI5LAorICAgIEFWQ0VOQ19TUFNfRkFJTCA9IC0yOCwKKyAgICBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMICAgID0gLTI3LAorICAgIEFWQ0VOQ19CSVRTVFJFQU1fSU5JVF9GQUlMID0gLTI2LAorICAgIEFWQ0VOQ19DSFJPTUFfUVBfRkFJTCA9IC0yNSwKKyAgICBBVkNFTkNfSU5JVF9RU19GQUlMID0gLTI0LAorICAgIEFWQ0VOQ19JTklUX1FQX0ZBSUwgPSAtMjMsCisgICAgQVZDRU5DX1dFSUdIVEVEX0JJUFJFRF9GQUlMID0gLTIyLAorICAgIEFWQ0VOQ19JTlZBTElEX0lOVFJBX1BFUklPRCA9IC0yMSwKKyAgICBBVkNFTkNfSU5WQUxJRF9DSEFOR0VfUkFURSA9IC0yMCwKKyAgICBBVkNFTkNfSU5WQUxJRF9CRVRBX09GRlNFVCA9IC0xOSwKKyAgICBBVkNFTkNfSU5WQUxJRF9BTFBIQV9PRkZTRVQgPSAtMTgsCisgICAgQVZDRU5DX0lOVkFMSURfREVCTE9DS19JREMgPSAtMTcsCisgICAgQVZDRU5DX0lOVkFMSURfUkVEVU5EQU5UX1BJQyA9IC0xNiwKKyAgICBBVkNFTkNfSU5WQUxJRF9GUkFNRVJBVEUgPSAtMTUsCisgICAgQVZDRU5DX0lOVkFMSURfTlVNX1NMSUNFR1JPVVAgPSAtMTQsCisgICAgQVZDRU5DX0lOVkFMSURfUE9DX0xTQiA9IC0xMywKKyAgICBBVkNFTkNfSU5WQUxJRF9OVU1fUkVGID0gLTEyLAorICAgIEFWQ0VOQ19JTlZBTElEX0ZNT19UWVBFID0gLTExLAorICAgIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTCA9IC0xMCwKKyAgICBBVkNFTkNfTEVWRUxfTk9UX1NVUFBPUlRFRCA9IC05LAorICAgIEFWQ0VOQ19MRVZFTF9GQUlMID0gLTgsCisgICAgQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCA9IC03LAorICAgIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEID0gLTYsCisgICAgQVZDRU5DX1dST05HX1NUQVRFID0gLTUsCisgICAgQVZDRU5DX1VOSU5JVElBTElaRUQgPSAtNCwKKyAgICBBVkNFTkNfQUxSRUFEWV9JTklUSUFMSVpFRCA9IC0zLAorICAgIEFWQ0VOQ19OT1RfU1VQUE9SVEVEID0gLTIsCisgICAgQVZDRU5DX01FTU9SWV9GQUlMID0gQVZDX01FTU9SWV9GQUlMLAorICAgIEFWQ0VOQ19GQUlMID0gQVZDX0ZBSUwsCisgICAgLyoqCisgICAgR2VuZXJpYyBzdWNjZXNzIHZhbHVlCisgICAgKi8KKyAgICBBVkNFTkNfU1VDQ0VTUyA9IEFWQ19TVUNDRVNTLAorICAgIEFWQ0VOQ19QSUNUVVJFX1JFQURZID0gMiwKKyAgICBBVkNFTkNfTkVXX0lEUiA9IDMsIC8qIHVwb24gZ2V0dGluZyB0aGlzLCB1c2VycyBoYXZlIHRvIGNhbGwgUFZBVkNFbmNvZGVTUFMgYW5kIFBWQVZDRW5jb2RlUFBTIHRvIGdldCBhIG5ldyBTUFMgYW5kIFBQUyovCisgICAgQVZDRU5DX1NLSVBQRURfUElDVFVSRSA9IDQgLyogY29udGludWFibGUgZXJyb3IgbWVzc2FnZSAqLworCit9IEFWQ0VuY19TdGF0dXM7CisKKyNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUCAgOCAgICAgIC8qIG1heGltdW0gZm9yIGFsbCB0aGUgcHJvZmlsZXMgKi8KKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycy4KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdBVkNFbmNQYXJhbQoreworICAgIC8qIGlmIHByb2ZpbGUvbGV2ZWwgaXMgc2V0IHRvIHplcm8sIGVuY29kZXIgd2lsbCBjaG9vc2UgdGhlIGNsb3Nlc3Qgb25lIGZvciB5b3UgKi8KKyAgICBBVkNQcm9maWxlIHByb2ZpbGU7IC8qIHByb2ZpbGUgb2YgdGhlIGJpdHN0cmVhbSB0byBiZSBjb21wbGlhbnQgd2l0aCovCisgICAgQVZDTGV2ZWwgICBsZXZlbDsgICAvKiBsZXZlbCBvZiB0aGUgYml0c3RyZWFtIHRvIGJlIGNvbXBsaWFudCB3aXRoKi8KKworICAgIGludCB3aWR0aDsgICAgICAvKiB3aWR0aCBvZiBhbiBpbnB1dCBmcmFtZSBpbiBwaXhlbCAqLworICAgIGludCBoZWlnaHQ7ICAgICAvKiBoZWlnaHQgb2YgYW4gaW5wdXQgZnJhbWUgaW4gcGl4ZWwgKi8KKworICAgIGludCBwb2NfdHlwZTsgLyogcGljdHVyZSBvcmRlciBjb3VudCBtb2RlLCAwLDEgb3IgMiAqLworICAgIC8qIGZvciBwb2NfdHlwZSA9PSAwICovCisgICAgdWludCBsb2cyX21heF9wb2NfbHNiX21pbnVzXzQ7IC8qIHNwZWNpZnkgbWF4aW11bSB2YWx1ZSBvZiBQT0MgTHNiLCByYW5nZSAwLi4xMiovCisgICAgLyogZm9yIHBvY190eXBlID09IDEgKi8KKyAgICB1aW50IGRlbHRhX3BvY196ZXJvX2ZsYWc7IC8qIGRlbHRhIFBPQyBhbHdheXMgemVybyAqLworICAgIGludCBvZmZzZXRfcG9jX25vbl9yZWY7IC8qIG9mZnNldCBmb3Igbm9uLXJlZmVyZW5jZSBwaWMgKi8KKyAgICBpbnQgb2Zmc2V0X3RvcF9ib3R0b207IC8qIG9mZnNldCBiZXR3ZWVuIHRvcCBhbmQgYm90dG9tIGZpZWxkICovCisgICAgdWludCBudW1fcmVmX2luX2N5Y2xlOyAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lIGluIG9uZSBjeWNsZSAqLworICAgIGludCAqb2Zmc2V0X3BvY19yZWY7IC8qIGFycmF5IG9mIG9mZnNldCBmb3IgcmVmIHBpYywgZGltZW5zaW9uIFtudW1fcmVmX2luX2N5Y2xlXSAqLworCisgICAgaW50IG51bV9yZWZfZnJhbWU7ICAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lIHVzZWQgKi8KKyAgICBpbnQgbnVtX3NsaWNlX2dyb3VwOyAgLyogbnVtYmVyIG9mIHNsaWNlIGdyb3VwICovCisgICAgaW50IGZtb190eXBlOyAgIC8qIDA6IGludGVybGVhdmUsIDE6IGRpc3BlcnNlZCwgMjogZm9yZWdyb3VuZCB3aXRoIGxlZnQtb3ZlcgorICAgICAgICAgICAgICAgICAgICAzOiBib3gtb3V0LCA0OnJhc3RlciBzY2FuLCA1OndpcGUsIDY6ZXhwbGljaXQgKi8KKyAgICAvKiBmb3IgZm1vX3R5cGUgPT0gMCAqLworICAgIHVpbnQgcnVuX2xlbmd0aF9taW51czFbTUFYX05VTV9TTElDRV9HUk9VUF07ICAgLyogYXJyYXkgb2Ygc2l6ZSBudW1fc2xpY2VfZ3JvdXAsIGluIHJvdW5kIHJvYmluIGZhc2lvbiAqLworICAgIC8qIGZtb190eXBlID09IDIqLworICAgIHVpbnQgdG9wX2xlZnRbTUFYX05VTV9TTElDRV9HUk9VUC0xXTsgICAgICAgICAgIC8qIGFycmF5IG9mIGNvLW9yZGluYXRlcyBvZiBlYWNoIHNsaWNlX2dyb3VwICovCisgICAgdWludCBib3R0b21fcmlnaHRbTUFYX05VTV9TTElDRV9HUk9VUC0xXTsgICAgICAgLyogZXhjZXB0IHRoZSBsYXN0IG9uZSB3aGljaCBpcyB0aGUgYmFja2dyb3VuZC4gKi8KKyAgICAvKiBmbW9fdHlwZSA9PSAzLDQsNSAqLworICAgIEFWQ0ZsYWcgY2hhbmdlX2Rpcl9mbGFnOyAgLyogc2xpY2UgZ3JvdXAgY2hhbmdlIGRpcmVjdGlvbiBmbGFnICovCisgICAgdWludCBjaGFuZ2VfcmF0ZV9taW51czE7CisgICAgLyogZm1vX3R5cGUgPT0gNiAqLworICAgIHVpbnQgKnNsaWNlX2dyb3VwOyAvKiBhcnJheSBvZiBzaXplIE1CV2lkdGgqTUJIZWlnaHQgKi8KKworICAgIEFWQ0ZsYWcgZGJfZmlsdGVyOyAgLyogZW5hYmxlIGRlYmxvY2tpbmcgbG9vcCBmaWx0ZXIgKi8KKyAgICBpbnQgZGlzYWJsZV9kYl9pZGM7ICAvKiAwOiBmaWx0ZXIgZXZlcnl3aGVyZSwgMTogbm8gZmlsdGVyLCAyOiBubyBmaWx0ZXIgYWNyb3NzIHNsaWNlIGJvdW5kYXJ5ICovCisgICAgaW50IGFscGhhX29mZnNldDsgICAvKiBhbHBoYSBvZmZzZXQgcmFuZ2UgLTYsLi4uLDYgKi8KKyAgICBpbnQgYmV0YV9vZmZzZXQ7ICAgIC8qIGJldGEgb2Zmc2V0IHJhbmdlIC02LC4uLiw2ICovCisKKyAgICBBVkNGbGFnIGNvbnN0cmFpbmVkX2ludHJhX3ByZWQ7IC8qIGNvbnN0cmFpbmVkIGludHJhIHByZWRpY3Rpb24gZmxhZyAqLworCisgICAgQVZDRmxhZyBhdXRvX3NjZDsgICAvKiBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIG9uIG9yIG9mZiAqLworICAgIGludCBpZHJfcGVyaW9kOyAvKiBpZHIgZnJhbWUgcmVmcmVzaCByYXRlIGluIG51bWJlciBvZiB0YXJnZXQgZW5jb2RlZCBmcmFtZSAobm8gY29uY2VwdCBvZiBhY3R1YWwgdGltZSkuKi8KKyAgICBpbnQgaW50cmFtYl9yZWZyZXNoOyAgICAvKiBtaW5pbXVtIG51bWJlciBvZiBpbnRyYSBNQiBwZXIgZnJhbWUgKi8KKyAgICBBVkNGbGFnIGRhdGFfcGFyOyAgIC8qIGVuYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAqLworCisgICAgQVZDRmxhZyBmdWxsc2VhcmNoOyAvKiBlbmFibGUgZnVsbC1wZWwgZnVsbC1zZWFyY2ggbW9kZSAqLworICAgIGludCBzZWFyY2hfcmFuZ2U7ICAgLyogc2VhcmNoIHJhbmdlIGZvciBtb3Rpb24gdmVjdG9yIGluICgtc2VhcmNoX3JhbmdlLCtzZWFyY2hfcmFuZ2UpIHBpeGVscyAqLworICAgIEFWQ0ZsYWcgc3ViX3BlbDsgICAgLyogZW5hYmxlIHN1YiBwZWwgcHJlZGljdGlvbiAqLworICAgIEFWQ0ZsYWcgc3VibWJfcHJlZDsgLyogZW5hYmxlIHN1YiBNQiBwYXJ0aXRpb24gbW9kZSAqLworICAgIEFWQ0ZsYWcgcmRvcHRfbW9kZTsgLyogUkQgb3B0aW1hbCBtb2RlIHNlbGVjdGlvbiAqLworICAgIEFWQ0ZsYWcgYmlkaXJfcHJlZDsgLyogZW5hYmxlIGJpLWRpcmVjdGlvbmFsIGZvciBCLXNsaWNlLCB0aGlzIGZsYWcgZm9yY2VzIHRoZSBlbmNvZGVyIHRvIGVuY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgYW55IGZyYW1lIHdpdGggUE9DIGxlc3MgdGhhbiB0aGUgcHJldmlvdXNseSBlbmNvZGVkIGZyYW1lIGFzIGEgQi1mcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0J3Mgb2ZmLCB0aGVuIHN1Y2ggZnJhbWVzIHdpbGwgcmVtYWluIFAtZnJhbWUuICovCisKKyAgICBBVkNGbGFnIHJhdGVfY29udHJvbDsgLyogcmF0ZSBjb250cm9sIGVuYWJsZSwgb246IFJDIG9uLCBvZmY6IGNvbnN0YW50IFFQICovCisgICAgaW50IGluaXRRUDsgICAgIC8qIGluaXRpYWwgUVAgKi8KKyAgICB1aW50MzIgYml0cmF0ZTsgICAgLyogdGFyZ2V0IGVuY29kaW5nIGJpdCByYXRlIGluIGJpdHMvc2Vjb25kICovCisgICAgdWludDMyIENQQl9zaXplOyAgLyogY29kZWQgcGljdHVyZSBidWZmZXIgaW4gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICB1aW50MzIgaW5pdF9DQlBfcmVtb3ZhbF9kZWxheTsgLyogaW5pdGlhbCBDQlAgcmVtb3ZhbCBkZWxheSBpbiBtc2VjICovCisKKyAgICB1aW50MzIgZnJhbWVfcmF0ZTsgIC8qIGZyYW1lIHJhdGUgaW4gdGhlIHVuaXQgb2YgZnJhbWVzIHBlciAxMDAwIHNlY29uZCAqLworICAgIC8qIG5vdGUsIGZyYW1lIHJhdGUgaXMgb25seSBuZWVkZWQgYnkgdGhlIHJhdGUgY29udHJvbCwgQVZDIGlzIHRpbWVzdGFtcCBhZ25vc3RpYy4gKi8KKworICAgIEFWQ0ZsYWcgb3V0X29mX2JhbmRfcGFyYW1fc2V0OyAvKiBmbGFnIHRvIHNldCB3aGV0aGVyIHBhcmFtIHNldHMgYXJlIHRvIGJlIHJldHJpZXZlZCB1cCBmcm9udCBvciBub3QgKi8KKworICAgIEFWQ0ZsYWcgdXNlX292ZXJydW5fYnVmZmVyOyAgLyogZG8gbm90IHRocm93IGF3YXkgdGhlIGZyYW1lIGlmIG91dHB1dCBidWZmZXIgaXMgbm90IGJpZyBlbm91Z2guCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IGV4Y2VzcyBiaXRzIHRvIHRoZSBvdmVycnVuIGJ1ZmZlciAqLworfSBBVkNFbmNQYXJhbXM7CisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyBjdXJyZW50IGZyYW1lIGVuY29kaW5nIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0FWQ0VuY0ZyYW1lU3RhdHMKK3sKKyAgICBpbnQgYXZnRnJhbWVRUDsgICAvKiBhdmVyYWdlIGZyYW1lIFFQICovCisgICAgaW50IG51bUludHJhTUJzOyAgLyogbnVtYmVyIG9mIGludHJhIE1CcyAqLworICAgIGludCBudW1GYWxzZUFsYXJtOworICAgIGludCBudW1NaXNEZXRlY3RlZDsKKyAgICBpbnQgbnVtRGV0ZWN0ZWQ7CisKK30gQVZDRW5jRnJhbWVTdGF0czsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICAvKiogVEhFIEZPTExPV0lOR1MgQVJFIEFQSVMgKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBlbmNvZGVyIGxpYnJhcnkuIEl0IHZlcmlmaWVzIHRoZSB2YWxpZGl0eSBvZiB0aGUKKyAgICBlbmNvZGluZyBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsIGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKKyAgICB0b29scyBieSB0aGlzIGxpYnJhcnkuIEl0IGFsbG9jYXRlcyBuZWNlc3NhcnkgbWVtb3JpZXMgcmVxdWlyZWQgdG8gcGVyZm9ybSBlbmNvZGluZy4KKyAgICBGb3IgcmUtZW5jb2RpbmcgYXBwbGljYXRpb24sIGlmIHVzZXJzIHdhbnQgdG8gc2V0dXAgZW5jb2RlciBpbiBhIG1vcmUgcHJlY2lzZSB3YXksCisgICAgdXNlcnMgY2FuIGdpdmUgdGhlIGV4dGVybmFsIFNQUyBhbmQgUFBTIHRvIHRoZSBlbmNvZGVyIHRvIGZvbGxvdy4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gImVuY1BhcmFtIiAgICJQb2ludGVyIHRvIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImV4dFNQUyIgICAgICJFeHRlcm5hbCBTUFMgdXNlZCBmb3IgcmUtZW5jb2RpbmcgcHVycG9zZS4gTlVMTCBpZiBub3QgcHJlc2VudCIKKyAgICBccGFyYW0gImV4dFBQUyIgICAgICJFeHRlcm5hbCBQUFMgdXNlZCBmb3IgcmUtZW5jb2RpbmcgcHVycG9zZS4gTlVMTCBpZiBub3QgcHJlc2VudCIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywKKyAgICAgICAgICAgICBBVkNFTkNfTk9UX1NVUFBPUlRFRCBmb3IgdGhlIHVzZSBvZiB1bnN1cHBvcnRlZCB0b29scywKKyAgICAgICAgICAgICBBVkNFTkNfTUVNT1JZX0ZBSUwgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsCisgICAgICAgICAgICAgQVZDRU5DX0ZBSUwgZm9yIGdlbmVyaWMgZmFpbHVyZS4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0luaXRpYWxpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyAqZW5jUGFyYW0sIHZvaWQqIGV4dFNQUywgdm9pZCogZXh0UFBTKTsKKworCisgICAgLyoqCisgICAgU2luY2UgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyBub3Qga25vd24gcHJpb3IgdG8gZW5jb2RpbmcgYSBmcmFtZSwgdXNlcnMgbmVlZCB0bworICAgIGFsbG9jYXRlIGJpZyBlbm91Z2ggYnVmZmVyIG90aGVyd2lzZSwgdGhhdCBmcmFtZSB3aWxsIGJlIGRyb3BwZWQuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgdXNlcnMgdGhhdCBndWFyYW50ZWVzIHRvIGhvbGQgb25lIGZyYW1lLgorICAgIEl0IGZvbGxvd3MgdGhlIENQQiBzcGVjIGZvciBhIHBhcnRpY3VsYXIgbGV2ZWwuICBIb3dldmVyLCB3aGVuIHRoZSB1c2VycyBzZXQgdXNlX292ZXJydW5fYnVmZmVyCisgICAgZmxhZywgdGhpcyBBUEkgaXMgdXNlbGVzcyBhcyBleGNlc3Mgb3V0cHV0IGJpdHMgYXJlIHNhdmVkIGluIHRoZSBvdmVycnVuIGJ1ZmZlciB3YWl0aW5nIHRvIGJlCisgICAgY29waWVkIG91dCBpbiBzbWFsbCBjaHVua3MsIGkuZS4gdXNlcnMgY2FuIGFsbG9jYXRlIGFueSBzaXplIG9mIG91dHB1dCBidWZmZXIuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJzaXplIiAgICJQb2ludGVyIHRvIHRoZSBzaXplIHRvIGJlIG1vZGlmaWVkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX1VOSU5JVElBTElaRUQgd2hlbiBsZXZlbCBpcyBub3Qga25vd24uCisgICAgKi8KKworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TWF4T3V0cHV0QnVmZmVyU2l6ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50KiBzaXplKTsKKworICAgIC8qKgorICAgIFVzZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBwcm92aWRlIGFuIGlucHV0IHN0cnVjdHVyZSB0byB0aGUgZW5jb2RlciBsaWJyYXJ5IHdoaWNoIHdpbGwga2VlcAorICAgIGEgbGlzdCBvZiBpbnB1dCBzdHJ1Y3R1cmVzIGl0IHJlY2VpdmVzIGluIGNhc2UgdGhlIHVzZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiBtYW55IHRpbWUgYmVmb3JlCisgICAgY2FsbGluZyBQVkFWQ0VuY29kZVNsaWNlLiBUaGUgZW5jb2RlciBsaWJyYXJ5IHdpbGwgZW5jb2RlIHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBmcmFtZV9udW0gb3JkZXIuCisgICAgVXNlcnMgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGZyYW1lIHVudGlsIHRoaXMgZnJhbWUgaXMgZW5jb2RlZCBhbmQKKyAgICByZXR1cm5lZCB0aHJ1IENCQVZDRW5jX1JldHVybklucHV0KCkgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJpbnB1dCIgICAgICAiUG9pbnRlciB0byB0aGUgaW5wdXQgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywKKyAgICAgICAgICAgIEFWQ0VOQ19GQUlMIGlmIHRoZSBlbmNvZGVyIGlzIG5vdCBpbiB0aGUgcmlnaHQgc3RhdGUgdG8gdGFrZSBhIG5ldyBpbnB1dCBmcmFtZS4KKyAgICAgICAgICAgIEFWQ0VOQ19ORVdfSURSIGZvciB0aGUgZGV0ZWN0aW9uIG9yIGRldGVybWluYXRpb24gb2YgYSBuZXcgSURSLCB3aXRoIHRoaXMgc3RhdHVzLAorICAgICAgICAgICAgdGhlIHJldHVybmVkIE5BTCBpcyBhbiBTUFMgTkFMLAorICAgICAgICAgICAgQVZDRU5DX05PX1BJQ1RVUkUgaWYgdGhlIGlucHV0IGZyYW1lIGNvZGluZyB0aW1lc3RhbXAgaXMgdG9vIGVhcmx5LCB1c2VycyBtdXN0CisgICAgICAgICAgICBnZXQgbmV4dCBmcmFtZSBvciBhZGp1c3QgdGhlIGNvZGluZyB0aW1lc3RhbXAuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNTZXRJbnB1dChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqaW5wdXQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5jb2RlIGEgTkFMIHVuaXQgd2hpY2ggY2FuIGJlIGFuIFNQUyBOQUwsIGEgUFBTIE5BTCBvcgorICAgIGEgVkNMICh2aWRlbyBjb2RpbmcgbGF5ZXIpIE5BTCB3aGljaCBjb250YWlucyBvbmUgc2xpY2Ugb2YgZGF0YS4gSXQgY291bGQgYmUgYQorICAgIGZpeGVkIG51bWJlciBvZiBtYWNyb2Jsb2NrcywgYXMgc3BlY2lmaWVkIGluIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMgc2V0LCBvciB0aGUKKyAgICBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBmaXR0ZWQgaW50byB0aGUgZ2l2ZW4gaW5wdXQgYXJndW1lbnQgImJ1ZmZlciIuIFRoZQorICAgIGlucHV0IGZyYW1lIGlzIHRha2VuIGZyb20gdGhlIG9sZGVzdCB1bmVuY29kZWQgaW5wdXQgZnJhbWUgcmV0cmlldmVkIGJ5IHVzZXJzIGJ5CisgICAgUFZBVkNFbmNHZXRJbnB1dCBBUEkuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJidWZmZXIiICAgICAiUG9pbnRlciB0byB0aGUgb3V0cHV0IEFWQyBiaXRzdHJlYW0gYnVmZmVyLCB0aGUgZm9ybWF0IHdpbGwgYmUgRUJTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3QgUkJTUC4iCisgICAgXHBhcmFtICJidWZfbmFsX3NpemUiICAgIkFzIGlucHV0LCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGh5c2ljYWwgbGltaXRhdGlvbiBvZiB0aGUgYnVmZmVyLiBBcyBvdXRwdXQsIHRoZSBzaXplIG9mIHRoZSBFQlNQLiIKKyAgICBccGFyYW0gIm5hbF90eXBlIiAgICJQb2ludGVyIHRvIHRoZSBOQUwgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYnVmZmVyLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvZiBlbmNvZGluZyBvbmUgc2xpY2UsCisgICAgICAgICAgICAgQVZDRU5DX1BJQ1RVUkVfUkVBRFkgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGEgZnJhbWUgZW5jb2RpbmcsCisgICAgICAgICAgICAgQVZDRU5DX0ZBSUwgZm9yIGZhaWx1cmUgKHRoaXMgc2hvdWxkIG5vdCBvY2N1ciwgdGhvdWdoKS4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY29kZU5BTChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDggKmJ1ZmZlciwgdWludCAqYnVmX25hbF9zaXplLCBpbnQgKm5hbF90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gc25pZmZzIHRoZSBuYWxfdW5pdF90eXBlIHN1Y2ggdGhhdCB1c2VycyBjYW4gY2FsbCBjb3JyZXNwb25kaW5nIEFQSXMuCisgICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gUFZBVkNEZWNHZXROQUxUeXBlKCkgaW4gdGhlIGRlY29kZXIuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEgTkFMIHVuaXQgKHN0YXJ0IHdpdGggZm9yYmlkZGVuX3plcm9fYml0LCBldGMuKS4iCisgICAgXHBhcmFtICJzaXplIiAgICAgICAic2l6ZSBvZiB0aGUgYml0c3RyZWFtIChOdW1CeXRlc0luTkFMdW5pdCArIDEpLiIKKyAgICBccGFyYW0gIm5hbF91bml0X3R5cGUiICJQb2ludGVyIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgbmFsIHVuaXQgdHlwZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDRU5DX0ZBSUwgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TkFMVHlwZSh1aW50OCAqYml0c3RyZWFtLCBpbnQgc2l6ZSwgaW50ICpuYWxfdHlwZSwgaW50ICpuYWxfcmVmX2lkYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gaW50ZXJuYWwgb3ZlcnJ1biBidWZmZXIuIFVzZXJzIGNhbiBjYWxsIHRoaXMgdG8gcXVlcnkKKyAgICB3aGV0aGVyIHRoZSBvdmVycnVuIGJ1ZmZlciBoYXMgYmVlbiB1c2VkIHRvIGVuY29kZSB0aGUgY3VycmVudCBOQUwuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiUG9pbnRlciB0byB0aGUgaGFuZGxlLiIKKyAgICBccmV0dXJuICJQb2ludGVyIHRvIG92ZXJydW4gYnVmZmVyIGlmIGl0IGlzIHVzZWQsIG90aGVyd2lzZSwgTlVMTC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgdWludDgqIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihBVkNIYW5kbGUqIGF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgb2YgdGhlIG1vc3QgcmVjZW50bHkgZW5jb2RlZCBmcmFtZS4KKyAgICBOb3RlIHRoYXQgdGhpcyBmcmFtZSBpcyBub3QgcmV0dXJuZWQgdG8gdGhlIHVzZXJzIHlldC4gVXNlcnMgc2hvdWxkIG9ubHkgcmVhZCB0aGUKKyAgICBjb250ZW50IG9mIHRoaXMgZnJhbWUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJvdXRwdXQiICAgICAiUG9pbnRlciB0byB0aGUgaW5wdXQgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX05PX1BJQ1RVUkUgaWYgbm8gcGljdHVyZSB0byBiZSBvdXRwdXR0ZWQuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXRSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgcmVjb250cnVjdGVkIGZyYW1lIGJhY2sgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkKKyAgICBpbiBvcmRlciB0byBiZSByZS11c2VkIGZvciBlbmNvZGluZyBvcGVyYXRpb24uIElmIHVzZXJzIHdhbnQgdGhlIGNvbnRlbnQgb2YgaXQgdG8gcmVtYWluCisgICAgdW5jaGFuZ2VkIGZvciBhIGxvbmcgdGltZSwgdGhleSBzaG91bGQgbWFrZSBhIGNvcHkgb2YgaXQgYW5kIHJlbGVhc2UgdGhlIG1lbW9yeSBiYWNrIHRvCisgICAgdGhlIGVuY29kZXIuIFRoZSBlbmNvZGVyIHJlbGllcyBvbiB0aGUgaWQgZWxlbWVudCBpbiB0aGUgQVZDRnJhbWVJTyBzdHJ1Y3R1cmUsCisgICAgdGh1cyB1c2VycyBzaG91bGQgbm90IGNoYW5nZSB0aGUgaWQgdmFsdWUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZGVjb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJvdXRwdXQiICAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0ZyYW1lSU8gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX0ZBSUwgZm9yIGZhaWwgZm9yIGlkIG5vdCBmb3VuZC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1JlbGVhc2VSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjbGVhbiB1cCBvcGVyYXRpb24gaW5jbHVkaW5nIG1lbW9yeSBkZWFsbG9jYXRpb24uCisgICAgVGhlIGVuY29kZXIgd2lsbCBhbHNvIGNsZWFyIHRoZSBsaXN0IG9mIGlucHV0IHN0cnVjdHVyZXMgaXQgaGFzIG5vdCByZWxlYXNlZC4KKyAgICBUaGlzIGltcGxpZXMgdGhhdCB1c2VycyBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbnB1dCBzdHJ1Y3R1cmUgdGhleSBoYXZlIGFsbG9jYXRlZAorICAgIGFuZCBmcmVlIHRoZW0gYWNjb3JkaW5nbHkuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgc3RhdGlzdGljcyBvZiB0aGUgY3VycmVudCBmcmFtZS4gSWYgdGhlIGVuY29kZXIgaGFzIG5vdCBmaW5pc2hlZAorICAgIHdpdGggdGhlIGN1cnJlbnQgZnJhbWUsIHRoZSByZXN1bHQgaXMgbm90IGFjY3VyYXRlLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAiYXZjU3RhdHMiICAgIlBvaW50ZXIgdG8gQVZDRW5jRnJhbWVTdGF0cyBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBQVkFWQ0VuY0dldEZyYW1lU3RhdHMoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY0ZyYW1lU3RhdHMgKmF2Y1N0YXRzKTsKKworICAgIC8qKgorICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbiBvZiBlbmNvZGluZyBwYXJhbWV0ZXJzLgorICAgIFRvIGJlIHBvbGlzaGVkLgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVCaXRSYXRlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50MzIgYml0cmF0ZSk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVGcmFtZVJhdGUoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQzMiBudW0sIHVpbnQzMiBkZW5vbSk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVJRFJJbnRlcnZhbChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IElEUkludGVydmFsKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0lEUlJlcXVlc3QoQVZDSGFuZGxlICphdmNIYW5kbGUpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSU1CUmVmcmVzaChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IG51bU1CKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmICAvKiBfQVZDRU5DX0FQSV9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2ludC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmUwOGExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19pbnQuaApAQCAtMCwwICsxLDQ3MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkKK2FuZCBuZWNlc3NhcnkgdHlwZSBkZWZpdGlvbml0aW9ucyBhbmQgZW51bWVyYXRpb25zLgorQHB1Ymxpc2hlZEFsbAorKi8KKworI2lmbmRlZiBBVkNFTkNfSU5UX0hfSU5DTFVERUQKKyNkZWZpbmUgQVZDRU5DX0lOVF9IX0lOQ0xVREVECisKKyNpZm5kZWYgQVZDSU5UX0NPTU1PTl9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjaW50X2NvbW1vbi5oIgorI2VuZGlmCisjaWZuZGVmIEFWQ0VOQ19BUElfSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKyNlbmRpZgorCit0eXBlZGVmIGZsb2F0IE9zY2xGbG9hdDsKKworLyogRGVmaW5pdGlvbiBmb3IgdGhlIHN0cnVjdHVyZXMgYmVsb3cgKi8KKyNkZWZpbmUgREVGQVVMVF9BVFRSICAgIDAgLyogZGVmYXVsdCBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIE1BWF9JTlBVVF9GUkFNRSAzMCAvKiBzb21lIGFyYml0cmFyeSBudW1iZXIsIGl0IGNhbiBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoaXMuICovCisjZGVmaW5lIE1BWF9SRUZfRlJBTUUgIDE2IC8qIG1heCBzaXplIG9mIHRoZSBSZWZQaWNMaXN0MCBhbmQgUmVmUGljTGlzdDEgKi8KKyNkZWZpbmUgTUFYX1JFRl9QSUNfTElTVCAzMworCisjZGVmaW5lIE1JTl9RUCAgICAgICAgICAwCisjZGVmaW5lIE1BWF9RUCAgICAgICAgICA1MQorI2RlZmluZSBTSElGVF9RUCAgICAgICAgMTIKKyNkZWZpbmUgIExBTUJEQV9BQ0NVUkFDWV9CSVRTICAgICAgICAgMTYKKyNkZWZpbmUgIExBTUJEQV9GQUNUT1IobGFtYmRhKSAgICAgICAgKChpbnQpKChkb3VibGUpKDE8PExBTUJEQV9BQ0NVUkFDWV9CSVRTKSpsYW1iZGErMC41KSkKKworCisjZGVmaW5lIERJU0FCTEVfVEhSRVNIT0xESU5HICAwCisvLyBmb3IgYmV0dGVyIFItRCBwZXJmb3JtYW5jZQorI2RlZmluZSBfTFVNQV9DT0VGRl9DT1NUXyAgICAgICA0IC8vITwgdGhyZXNob2xkIGZvciBsdW1hIGNvZWZmcworI2RlZmluZSBfQ0hST01BX0NPRUZGX0NPU1RfICAgICA0IC8vITwgdGhyZXNob2xkIGZvciBjaHJvbWEgY29lZmZzLCB1c2VkIHRvIGJlIDcKKyNkZWZpbmUgX0xVTUFfTUJfQ09FRkZfQ09TVF8gICAgNSAvLyE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMgb2YgaW50ZXIgTWFjcm9ibG9ja3MKKyNkZWZpbmUgX0xVTUFfOHg4X0NPRUZGX0NPU1RfICAgNSAvLyE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMgb2YgOHg4IEludGVyIFBhcnRpdGlvbgorI2RlZmluZSBNQVhfVkFMVUUgICAgICAgOTk5OTk5ICAgLy8hPCB1c2VkIGZvciBzdGFydCB2YWx1ZSBmb3Igc29tZSB2YXJpYWJsZXMKKworI2RlZmluZSAgV0VJR0hURURfQ09TVChmYWN0b3IsYml0cykgICAoKChmYWN0b3IpKihiaXRzKSk+PkxBTUJEQV9BQ0NVUkFDWV9CSVRTKQorI2RlZmluZSAgTVZfQ09TVChmLHMsY3gsY3kscHgscHkpICAgICAoV0VJR0hURURfQ09TVChmLG12Yml0c1soKGN4KTw8KHMpKS1weF0rbXZiaXRzWygoY3kpPDwocykpLXB5XSkpCisjZGVmaW5lICBNVl9DT1NUX1MoZixjeCxjeSxweCxweSkgICAgIChXRUlHSFRFRF9DT1NUKGYsbXZiaXRzW2N4LXB4XSttdmJpdHNbY3ktcHldKSkKKworLyogZm9yIHN1Yi1wZWwgc2VhcmNoIGFuZCBpbnRlcnBvbGF0aW9uICovCisjZGVmaW5lIFNVQlBFTF9QUkVEX0JMS19TSVpFIDU3NiAvLyAyNHgyNAorI2RlZmluZSBSRUZfQ0VOVEVSIDc1CisjZGVmaW5lIFYyUV9IMFEgMQorI2RlZmluZSBWMFFfSDJRIDIKKyNkZWZpbmUgVjJRX0gyUSAzCisKKy8qCisjZGVmaW5lIFYzUV9IMFEgMQorI2RlZmluZSBWM1FfSDFRIDIKKyNkZWZpbmUgVjBRX0gxUSAzCisjZGVmaW5lIFYxUV9IMVEgNAorI2RlZmluZSBWMVFfSDBRIDUKKyNkZWZpbmUgVjFRX0gzUSA2CisjZGVmaW5lIFYwUV9IM1EgNworI2RlZmluZSBWM1FfSDNRIDgKKyNkZWZpbmUgVjJRX0gzUSA5CisjZGVmaW5lIFYyUV9IMFEgMTAKKyNkZWZpbmUgVjJRX0gxUSAxMQorI2RlZmluZSBWMlFfSDJRIDEyCisjZGVmaW5lIFYzUV9IMlEgMTMKKyNkZWZpbmUgVjBRX0gyUSAxNAorI2RlZmluZSBWMVFfSDJRIDE1CisqLworCisKKyNkZWZpbmUgREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFIDEwMDAKKworLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBhYm92ZSBjb3N0IG1vZGVsCitjb25zdCB1aW50OCBDT0VGRl9DT1NUWzJdWzE2XSA9Cit7CisgICAgezMsIDIsIDIsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHs5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5fQorfTsKKworCisKKy8vISBjb252ZXJ0IGZyb20gSC4yNjMgUVAgdG8gSC4yNjQgcXVhbnQgZ2l2ZW4gYnk6IHF1YW50PXBvdygyLFFQLzYpCitjb25zdCBpbnQgUVAyUVVBTlRbNDBdID0KK3sKKyAgICAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAorICAgIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDYsCisgICAgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTQsCisgICAgMTYsIDE4LCAyMCwgMjMsIDI1LCAyOSwgMzIsIDM2LAorICAgIDQwLCA0NSwgNTEsIDU3LCA2NCwgNzIsIDgxLCA5MQorfTsKKworCisvKioKK1RoaXMgZW51bWVyYXRpb24ga2VlcHMgdHJhY2sgb2YgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZW5jb2RlciB3aGV0aGVyIGl0IGlzIGRvaW5nCitzb21ldGhpbmcuIFRoZSBlbmNvZGluZyBmbG93IGZvbGxvd3MgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIHN0YXRlcyBhcmUuCitAcHVibGlzaGVkQWxsCisqLwordHlwZWRlZiBlbnVtCit7CisgICAgQVZDRW5jX0luaXRpYWxpemluZyA9IDAsCisgICAgQVZDRW5jX0VuY29kaW5nX1NQUywKKyAgICBBVkNFbmNfRW5jb2RpbmdfUFBTLAorICAgIEFWQ0VuY19BbmFseXppbmdfRnJhbWUsCisgICAgQVZDRW5jX1dhaXRpbmdGb3JCdWZmZXIsICAvLyBwZW5kaW5nIHN0YXRlCisgICAgQVZDRW5jX0VuY29kaW5nX0ZyYW1lLAorfSBBVkNFbmNfU3RhdGUgOworCisvKioKK0JpdHN0cmVhbSBzdHJ1Y3R1cmUgY29udGFpbnMgYml0c3RyZWFtIHJlbGF0ZWQgcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBwb2ludGVyCit0byB0aGUgYnVmZmVyLCB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGFuZCBiaXQgcG9zaXRpb24uIFRoZSBjb250ZW50IG9mIHRoZQorYml0c3RyZWFtQnVmZmVyIHdpbGwgYmUgaW4gRUJTUCBmb3JtYXQgYXMgdGhlIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGNvZGVzIGFyZQorYXV0b21hdGljYWxseSBpbnNlcnRlZCBhcyB0aGUgUkJTUCBpcyByZWNvcmRlZC4KK0BwdWJsaXNoZWRBbGwKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdFbmNCaXRzdHJlYW0KK3sKKyAgICB1aW50OCAqYml0c3RyZWFtQnVmZmVyOyAvKiBwb2ludGVyIHRvIGJ1ZmZlciBtZW1vcnkgICAqLworICAgIGludCBidWZfc2l6ZTsgICAgICAgLyogc2l6ZSBvZiB0aGUgYnVmZmVyIG1lbW9yeSAqLworICAgIGludCB3cml0ZV9wb3M7ICAgICAgLyogbmV4dCBwb3NpdGlvbiB0byB3cml0ZSB0byBiaXRzdHJlYW1CdWZmZXIgICovCisgICAgaW50IGNvdW50X3plcm9zOyAgIC8qIGNvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvICovCisgICAgdWludCBjdXJyZW50X3dvcmQ7ICAvKiBieXRlLXN3YXBwZWQgKE1TQiBsZWZ0KSBjdXJyZW50IHdvcmQgdG8gd3JpdGUgdG8gYnVmZmVyICovCisgICAgaW50IGJpdF9sZWZ0OyAgICAgIC8qIG51bWJlciBvZiBiaXQgbGVmdCBpbiBjdXJyZW50X3dvcmQgKi8KKyAgICB1aW50OCAgICpvdmVycnVuQnVmZmVyOyAgLyogZXh0cmEgb3V0cHV0IGJ1ZmZlciB0byBwcmV2ZW50IGN1cnJlbnQgc2tpcCBkdWUgdG8gb3V0cHV0IGJ1ZmZlciBvdmVycnVuKi8KKyAgICBpbnQgICAgIG9CU2l6ZTsgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIG92ZXJydW4gYnVmZmVyICovCisgICAgdm9pZCAgICplbmN2aWQ7IC8qIHBvaW50ZXIgdG8gdGhlIG1haW4gb2JqZWN0ICovCisKK30gQVZDRW5jQml0c3RyZWFtOworCisvKioKK1RoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwdXJwb3NlIGFuZCBvdGhlciBwZXJmb3JtYW5jZSByZWxhdGVkIGNvbnRyb2wKK3ZhcmlhYmxlcyBzdWNoIGFzLCBSRCBjb3N0LCBzdGF0aXN0aWNzLCBtb3Rpb24gc2VhcmNoIHN0dWZmcywgZXRjLgorc2hvdWxkIGJlIGluIHRoaXMgc3RydWN0dXJlLgorQHB1Ymxpc2hlZEFsbAorKi8KKworCit0eXBlZGVmIHN0cnVjdCB0YWdSREluZm8KK3sKKyAgICBpbnQgUVA7CisgICAgaW50IGFjdHVhbF9iaXRzOworICAgIE9zY2xGbG9hdCBtYWQ7CisgICAgT3NjbEZsb2F0IFJfRDsKK30gUkRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdNdWx0aVBhc3MKK3sKKyAgICAvKiBtdWx0aXBhc3MgcmF0ZSBjb250cm9sIGRhdGEgKi8KKyAgICBpbnQgdGFyZ2V0X2JpdHM7ICAgIC8qIHRhcmdldCBiaXRzIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5UICovCisgICAgaW50IGFjdHVhbF9iaXRzOyAgICAvKiBhY3R1YWwgYml0cyBmb3IgY3VycmVudCBmcmFtZSBvYnRhaW5lZCBhZnRlciBlbmNvZGluZywgPSByYy0+UmMqLworICAgIGludCBRUDsgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5RYyovCisgICAgaW50IHByZXZfUVA7ICAgICAgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgaW50IHByZXZfcHJldl9RUDsgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lIGJlZm9yZSBsYXN0Ki8KKyAgICBPc2NsRmxvYXQgbWFkOyAgICAgICAgICAvKiBtYWQgZm9yIGN1cnJlbnQgZnJhbWUsID0gdmlkZW8tPmF2Z01BRCovCisgICAgaW50IGJpdHJhdGU7ICAgICAgICAvKiBiaXRyYXRlIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgT3NjbEZsb2F0IGZyYW1lcmF0ZTsgICAgLyogZnJhbWVyYXRlIGZvciBjdXJyZW50IGZyYW1lKi8KKworICAgIGludCBuUmVfUXVhbnRpemVkOyAgLyogY29udHJvbCB2YXJpYWJsZSBmb3IgbXVsdGlwYXNzIGVuY29kaW5nLCAqLworICAgIC8qIDAgOiBmaXJzdCBwYXNzICovCisgICAgLyogMSA6IGludGVybWVkaWF0ZSBwYXNzKHF1YW50aXphdGlvbiBhbmQgVkxDIGxvb3Agb25seSkgKi8KKyAgICAvKiAyIDogZmluYWwgcGFzcyhkZS1xdWFudGl6YXRpb24sIGlkY3QsIGV0YykgKi8KKyAgICAvKiAzIDogbWFjcm9ibG9jayBsZXZlbCByYXRlIGNvbnRyb2wgKi8KKworICAgIGludCBlbmNvZGVkX2ZyYW1lczsgICAgIC8qIGNvdW50ZXIgZm9yIGFsbCBlbmNvZGVkIGZyYW1lcyAqLworICAgIGludCByZV9lbmNvZGVkX2ZyYW1lczsgIC8qIGNvdW50ZXIgZm9yIGFsbCBtdWx0aXBhc3MgZW5jb2RlZCBmcmFtZXMqLworICAgIGludCByZV9lbmNvZGVkX3RpbWVzOyAgIC8qIGNvdW50ZXIgZm9yIGFsbCB0aW1lcyBvZiBtdWx0aXBhc3MgZnJhbWUgZW5jb2RpbmcgKi8KKworICAgIC8qIE11bHRpcGxlIGZyYW1lIHByZWRpY3Rpb24qLworICAgIFJESW5mbyAqKnBSRFNhbXBsZXM7ICAgICAgICAvKiBwUkRTYW1wbGVzWzMwXVszMl0sIDMwLT4zMGZwcywgMzIgLT4gNSBiaXQgcXVhbnRpemVyLCAzMiBjYW5kaWRhdGVzKi8KKyAgICBpbnQgZnJhbWVQb3M7ICAgICAgICAgICAgICAgLyogc3BlY2lmaWMgcG9zaXRpb24gaW4gcHJldmlvdXMgbXVsdGlwbGUgZnJhbWVzKi8KKyAgICBpbnQgZnJhbWVSYW5nZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG92ZXJhbGwgcHJldmlvdXMgbXVsdGlwbGUgZnJhbWVzICovCisgICAgaW50IHNhbXBsZXNQZXJGcmFtZVszMF07ICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZSwgMzAtPjMwZnBzICovCisKKyAgICAvKiBCaXQgYWxsb2NhdGlvbiBmb3Igc2NlbmUgY2hhbmdlIGZyYW1lcyBhbmQgaGlnaCBtb3Rpb24gZnJhbWVzICovCisgICAgT3NjbEZsb2F0IHN1bV9tYWQ7CisgICAgaW50IGNvdW50ZXJfQlRzcmM7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIGZyb20gbG93IG1vdGlvbiBmcmFtZXMgb3IgbGVzcyBjb21wbGljYXRlZGx5IGNvbXByZXNzZWQgZnJhbWVzICovCisgICAgaW50IGNvdW50ZXJfQlRkc3Q7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIHRvIHNjZW5lIGNoYW5nZSBmcmFtZXMgb3IgaGlnaCBtb3Rpb24gZnJhbWVzIG9yIG1vcmUgY29tcGxpY2F0ZWRseSBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgIE9zY2xGbG9hdCBzdW1fUVA7CisgICAgaW50IGRpZmZfY291bnRlcjsgICAvKiBkaWZmX2NvdW50ZXIgPSAtZGlmZl9jb3VudGVyX0JUZHN0LCBvciBkaWZmX2NvdW50ZXJfQlRzcmMgKi8KKworICAgIC8qIEZvciB0YXJnZXQgYml0cmF0ZSBvciBmcmFtZXJhdGUgdXBkYXRlICovCisgICAgT3NjbEZsb2F0IHRhcmdldF9iaXRzX3Blcl9mcmFtZTsgICAgICAgIC8qID0gQyA9IGJpdHJhdGUvZnJhbWVyYXRlICovCisgICAgT3NjbEZsb2F0IHRhcmdldF9iaXRzX3Blcl9mcmFtZV9wcmV2OyAgIC8qIHByZXZpb3VzIEMgKi8KKyAgICBPc2NsRmxvYXQgYXZlcl9tYWQ7ICAgICAgICAgICAgICAgICAgICAgLyogc28tZmFyIGF2ZXJhZ2UgbWFkIGNvdWxkIHJlcGxhY2Ugc3VtX21hZCAqLworICAgIE9zY2xGbG9hdCBhdmVyX21hZF9wcmV2OyAgICAgICAgICAgICAgICAvKiBwcmV2aW91cyBhdmVyYWdlIG1hZCAqLworICAgIGludCAgIG92ZXJsYXBwZWRfd2luX3NpemU7ICAgICAgICAgIC8qIHRyYW5zaXRpb24gcGVyaW9kIG9mIHRpbWUgKi8KKyAgICBpbnQgICBlbmNvZGVkX2ZyYW1lc19wcmV2OyAgICAgICAgICAvKiBwcmV2aW91cyBlbmNvZGVkX2ZyYW1lcyAqLworfSBNdWx0aVBhc3M7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkKK3sKKyAgICBpbnQgUXA7CisgICAgaW50IFJwOworICAgIE9zY2xGbG9hdCBNcDsgICAvKiBmb3IgTUItYmFzZWQgUkMgKi8KKyAgICBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkgKm5leHQ7CisgICAgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5ICpwcmV2OworfSBkYXRhUG9pbnRBcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDUmF0ZUNvbnRyb2wKK3sKKworICAgIC8qIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSB1c2VycyBBVkNFbmNQYXJhbXMgKi8KKyAgICAvKiBiaXRyYXRlLXJvYnVzdG5lc3MgdHJhZGVvZmYgKi8KKyAgICB1aW50IHNjZEVuYWJsZTsgLyogZW5hYmxlIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gKi8KKyAgICBpbnQgaWRyUGVyaW9kOyAgLyogSURSIHBlcmlvZCBpbiBudW1iZXIgb2YgZnJhbWVzICovCisgICAgaW50IGludHJhTUJSYXRlOyAgIC8qIGludHJhIE1CIHJlZnJlc2ggcmF0ZSBwZXIgZnJhbWUgKi8KKyAgICB1aW50IGRwRW5hYmxlOyAgLyogZW5hYmxlIGRhdGEgcGFydGl0aW9uaW5nICovCisKKyAgICAvKiBxdWFsaXR5LWNvbXBsZXhpdHkgdHJhZGVvZmYgKi8KKyAgICB1aW50IHN1YlBlbEVuYWJsZTsgIC8qIGVuYWJsZSBxdWFydGVyIHBlbCBzZWFyY2ggKi8KKyAgICBpbnQgbXZSYW5nZTsgICAgLyogbW90aW9uIHZlY3RvciBzZWFyY2ggcmFuZ2UgaW4gKy8tIHBpeGVsICovCisgICAgdWludCBzdWJNQkVuYWJsZTsgIC8qIGVuYWJsZSBzdWIgTUIgcHJlZGljdGlvbiBtb2RlICg0eDQsIDR4OCwgOHg0KSAqLworICAgIHVpbnQgcmRPcHRFbmFibGU7ICAvKiBlbmFibGUgUkQtb3B0IG1vZGUgc2VsZWN0aW9uICovCisgICAgdWludCB0d29QYXNzOyAvKiBmbGFnIGZvciAyIHBhc3MgZW5jb2RpbmcgKCBmb3IgZnV0dXJlICkqLworICAgIHVpbnQgYmlkaXJQcmVkOyAvKiBiaS1kaXJlY3Rpb25hbCBwcmVkaWN0aW9uIGZvciBCLWZyYW1lLiAqLworCisgICAgdWludCByY0VuYWJsZTsgIC8qIGVuYWJsZSByYXRlIGNvbnRyb2wsICcxJyBvbiwgJzAnIGNvbnN0IFFQICovCisgICAgaW50IGluaXRRUDsgLyogaW5pdGlhbCBRUCAqLworCisgICAgLyogbm90ZSB0aGUgZm9sbG93aW5nIDMgcGFyYW1zIGFyZSBmb3IgSFJELCB0aGVzZSB0cmlwbGV0cyBjYW4gYmUgYSBzZXJpZXMKKyAgICBvZiB0cmlwbGV0cyBhcyB0aGUgZ2VuZXJhbGl6ZWQgSFJEIGFsbG93cy4gU0VJIG1lc3NhZ2UgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhpcyBjYXNlLiAqLworICAgIC8qIFdlIG5vIGxvbmdlciBoYXZlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBDQlIgYW5kIFZCUi4gVGhlIHVzZXJzIHRvIHRoZQorICAgIEFWQyBlbmNvZGVyIGxpYiB3aWxsIGRvIHRoZSBtYXBwaW5nIGZyb20gQ0JSL1ZCUiB0byB0aGVzZSBwYXJhbWV0ZXJzLiAqLworICAgIGludDMyIGJpdFJhdGU7ICAvKiB0YXJnZXQgYml0IHJhdGUgZm9yIHRoZSBvdmVyYWxsIGNsaXAgaW4gYml0cy9zZWNvbmQqLworICAgIGludDMyIGNwYlNpemU7ICAvKiBjb2RlZCBwaWN0dXJlIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisgICAgaW50MzIgaW5pdERlbGF5T2Zmc2V0OyAvKiBpbml0aWFsIENCUCByZW1vdmFsIGRlbGF5IGluIGJpdHMgKi8KKworICAgIE9zY2xGbG9hdCBmcmFtZV9yYXRlOyAvKiBmcmFtZSByYXRlICovCisgICAgaW50IHNyY0ludGVydmFsOyAvKiBzb3VyY2UgZnJhbWUgcmF0ZSBpbiBtc2VjICovCisgICAgaW50IGJhc2ljVW5pdDsgIC8qIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBwZXIgQlUgKi8KKworICAgIC8qIFRoZW4gaW50ZXJuYWwgcGFyYW1ldGVycyBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIHVpbnQgZmlyc3RfZnJhbWU7IC8qIGEgZmxhZyBmb3IgdGhlIGZpcnN0IGZyYW1lICovCisgICAgaW50IGxhbWJkYV9tZjsgLyogZm9yIGV4YW1wbGUgKi8KKyAgICBpbnQgdG90YWxTQUQ7ICAgIC8qIFNBRCBvZiBjdXJyZW50IGZyYW1lICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiB0aGlzIHBhcnQgY29tZXMgZnJvbSBNUEVHNCByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgYWxwaGE7ICAvKiB3ZWlnaHQgZm9yIEkgZnJhbWUgKi8KKyAgICBpbnQgUnM7ICAgICAvKmJpdCByYXRlIGZvciB0aGUgc2VxdWVuY2UgKG9yIHNlZ21lbnQpIGUuZy4sIDI0MDAwIGJpdHMvc2VjICovCisgICAgaW50IFJjOyAgICAgLypiaXRzIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiBJdCBpcyB0aGUgYml0IGNvdW50IG9idGFpbmVkIGFmdGVyIGVuY29kaW5nLiAqLworICAgIGludCBScDsgICAgIC8qYml0cyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciBwZXIgcGljdHVyZS4gKi8KKyAgICAvKj8gaXMgdGhpcyB0aGUgYXZlcmFnZSBvbmUsIG9yIGp1c3QgdGhlIGJpdHMgY29kZWQgZm9yIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBScHM7ICAgIC8qYml0IHRvIGJlIHJlbW92ZWQgZnJvbSBidWZmZXIgcGVyIHNyYyBmcmFtZSAqLworICAgIE9zY2xGbG9hdCBUczsgICAvKm51bWJlciBvZiBzZWNvbmRzIGZvciB0aGUgc2VxdWVuY2UgIChvciBzZWdtZW50KS4gZS5nLiwgMTAgc2VjICovCisgICAgT3NjbEZsb2F0IEVwOworICAgIE9zY2xGbG9hdCBFYzsgICAvKm1lYW4gYWJzb2x1dGUgZGlmZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgYWZ0ZXIgbW90aW9uIGNvbXBlbnNhdGlvbi4qLworICAgIC8qSWYgdGhlIG1hY3JvYmxvY2sgaXMgaW50cmEgY29kZWQsIHRoZSBvcmlnaW5hbCBzcGF0aWFsIHBpeGVsIHZhbHVlcyBhcmUgc3VtbWVkLiovCisgICAgaW50IFFjOyAgICAgLypxdWFudGl6YXRpb24gbGV2ZWwgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgaW50IE5yOyAgICAgLypudW1iZXIgb2YgUCBmcmFtZXMgcmVtYWluaW5nIGZvciBlbmNvZGluZy4qLworICAgIGludCBScjsgLypudW1iZXIgb2YgYml0cyByZW1haW5pbmcgZm9yIGVuY29kaW5nIHRoaXMgc2VxdWVuY2UgKG9yIHNlZ21lbnQpLiovCisgICAgaW50IFJyX09sZDsKKyAgICBpbnQgVDsgICAgICAvKnRhcmdldCBiaXQgdG8gYmUgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuKi8KKyAgICBpbnQgUzsgICAgICAvKm51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGVuY29kaW5nIHRoZSBwcmV2aW91cyBmcmFtZS4qLworICAgIGludCBIYzsgLypoZWFkZXIgYW5kIG1vdGlvbiB2ZWN0b3IgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGZyYW1lLiBJdCBpbmNsdWRlcyBhbGwgdGhlICBpbmZvcm1hdGlvbiBleGNlcHQgdG8gdGhlIHJlc2lkdWFsIGluZm9ybWF0aW9uLiovCisgICAgaW50IEhwOyAvKmhlYWRlciBhbmQgbW90aW9uIHZlY3RvciBiaXRzIHVzZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lLiBJdCBpbmNsdWRlcyBhbGwgdGhlICAgICBpbmZvcm1hdGlvbiBleGNlcHQgdG8gdGhlIHJlc2lkdWFsIGluZm9ybWF0aW9uLiovCisgICAgaW50IFFsOyAvKnF1YW50aXphdGlvbiBsZXZlbCB1c2VkIGluIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBCczsgLypidWZmZXIgc2l6ZSBlLmcuLCBSLzIgKi8KKyAgICBpbnQgQjsgICAgICAvKmN1cnJlbnQgYnVmZmVyIGxldmVsIGUuZy4sIFIvNCAtIHN0YXJ0IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgYnVmZmVyICovCisgICAgT3NjbEZsb2F0IFgxOworICAgIE9zY2xGbG9hdCBYMjsKKyAgICBPc2NsRmxvYXQgWDExOworICAgIE9zY2xGbG9hdCBNOyAgICAgICAgICAgIC8qc2FmZSBtYXJnaW4gZm9yIHRoZSBidWZmZXIgKi8KKyAgICBPc2NsRmxvYXQgc21UaWNrOyAgICAvKnJhdGlvIG9mIHNyYyB2ZXJzdXMgZW5jIGZyYW1lIHJhdGUgKi8KKyAgICBkb3VibGUgcmVtbmFudDsgIC8qcmVtYWluZGVyIGZyYW1lIG9mIHNyYy9lbmMgZnJhbWUgZm9yIGZpbmUgZnJhbWUgc2tpcHBpbmcgKi8KKyAgICBpbnQgdGltZUluY1JlczsgLyogdm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiAqLworCisgICAgZGF0YVBvaW50QXJyYXkgICAqZW5kOyAvKnF1YW50aXphdGlvbiBsZXZlbHMgZm9yIHRoZSBwYXN0ICgyMCkgZnJhbWVzICovCisKKyAgICBpbnQgICAgIGZyYW1lTnVtYmVyOyAvKiByYW5naW5nIGZyb20gMCB0byAyMCBub2RlcyovCisgICAgaW50ICAgICB3OworICAgIGludCAgICAgTnJfT3JpZ2luYWw7CisgICAgaW50ICAgICBOcl9PbGQsIE5yX09sZDI7CisgICAgaW50ICAgICBza2lwX25leHRfZnJhbWU7CisgICAgaW50ICAgICBRZGVwOyAgICAgICAvKiBzbW9vdGggUSBhZGp1c3RtZW50ICovCisgICAgaW50ICAgICBWQlJfRW5hYmxlZDsKKworICAgIGludCB0b3RhbEZyYW1lTnVtYmVyOyAvKiB0b3RhbCBjb2RlZCBmcmFtZXMsIGZvciBkZWJ1Z2dpbmchISovCisKKyAgICBjaGFyICAgIG9GaXJzdFRpbWU7CisKKyAgICBpbnQgbnVtRnJhbWVCaXRzOyAvKiBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgaW50IE51bWJlcm9mSGVhZGVyQml0czsKKyAgICBpbnQgTnVtYmVyb2ZUZXh0dXJlQml0czsKKyAgICBpbnQgbnVtTUJIZWFkZXJCaXRzOworICAgIGludCBudW1NQlRleHR1cmVCaXRzOworICAgIGRvdWJsZSAqTUFEb2ZNQjsKKyAgICBpbnQzMiBiaXRzUGVyRnJhbWU7CisKKyAgICAvKiBCWCByYXRlIGNvbnRyb2wsIHNvbWV0aGluZyBsaWtlIFRNTjggcmF0ZSBjb250cm9sKi8KKworICAgIE11bHRpUGFzcyAqcE1QOworCisgICAgaW50ICAgICBUTU5fVzsKKyAgICBpbnQgICAgIFRNTl9USDsKKyAgICBpbnQgICAgIFZCVl9mdWxsbmVzczsKKyAgICBpbnQgICAgIG1heF9CaXRWYXJpYW5jZV9udW07IC8qIHRoZSBudW1iZXIgb2YgdGhlIG1heGltdW0gYml0IHZhcmlhbmNlIHdpdGhpbiB0aGUgZ2l2ZW4gYnVmZmVyIHdpdGggdGhlIHVuaXQgb2YgMTAlIG9mIGJpdHJhdGUvZnJhbWVyYXRlKi8KKyAgICBpbnQgICAgIGVuY29kZWRfZnJhbWVzOyAvKiBjb3VudGVyIGZvciBhbGwgZW5jb2RlZCBmcmFtZXMgKi8KKyAgICBpbnQgICAgIGxvd19ib3VuZDsgICAgICAgICAgICAgIC8qIGJvdW5kIGZvciB1bmRlcmZsb3cgZGV0ZWN0aW9uLCB1c3VhbGx5IGxvd19ib3VuZD0tQnMvMiwgYnV0IGNvdWxkIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSAqLworICAgIGludCAgICAgVkJWX2Z1bGxuZXNzX29mZnNldDsgICAgLyogb2Zmc2V0IG9mIFZCVl9mdWxsbmVzcywgdXN1YWxseSBpcyB6ZXJvLCBidXQgY2FuIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSovCisgICAgLyogRW5kIEJYICovCisKK30gQVZDUmF0ZUNvbnRyb2w7CisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBpcyBmb3IgdGhlIG1vdGlvbiB2ZWN0b3IgaW5mb3JtYXRpb24uICovCit0eXBlZGVmIHN0cnVjdCB0YWdNVgoreworICAgIGludCB4OworICAgIGludCB5OworICAgIHVpbnQgc2FkOworfSBBVkNNVjsKKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZgorZnVuY3Rpb25zLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDRW5jRnVuY1B0cgoreworCisgICAgaW50ICgqU0FEX01CX0hhbGZQZWxbNF0pKHVpbnQ4KiwgdWludDgqLCBpbnQsIHZvaWQgKik7CisgICAgaW50ICgqU0FEX01hY3JvYmxvY2spKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKworfSBBVkNFbmNGdW5jUHRyOworCisvKioKK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBwYWRkaW5nLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1BhZEluZm8KK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGo7CisgICAgaW50IGhlaWdodDsKK30gQVZDUGFkSW5mbzsKKworCisjaWZkZWYgSFRGTQordHlwZWRlZiBzdHJ1Y3QgdGFnSFRGTV9TdGF0Cit7CisgICAgaW50IGFic19kaWZfbWFkX2F2ZzsKKyAgICB1aW50IGNvdW50YnJlYWs7CisgICAgaW50IG9mZnNldEFycmF5WzE2XTsKKyAgICBpbnQgb2Zmc2V0UmVmWzE2XTsKK30gSFRGTV9TdGF0OworI2VuZGlmCisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBpcyB0aGUgbWFpbiBvYmplY3QgZm9yIEFWQyBlbmNvZGVyIGxpYnJhcnkgcHJvdmlkaW5nIGFjY2VzcyB0byBhbGwKK2dsb2JhbCB2YXJpYWJsZXMuIEl0IGlzIGFsbG9jYXRlZCBhdCBQVkFWQ0luaXRFbmNvZGVyIGFuZCBmcmVlZCBhdCBQVkFWQ0NsZWFuVXBFbmNvZGVyLgorQHB1Ymxpc2hlZEFsbAorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0VuY09iamVjdAoreworCisgICAgQVZDQ29tbW9uT2JqICpjb21tb247CisKKyAgICBBVkNFbmNCaXRzdHJlYW0gICAgICpiaXRzdHJlYW07IC8qIGZvciBjdXJyZW50IE5BTCAqLworICAgIHVpbnQ4ICAgKm92ZXJydW5CdWZmZXI7ICAvKiBleHRyYSBvdXRwdXQgYnVmZmVyIHRvIHByZXZlbnQgY3VycmVudCBza2lwIGR1ZSB0byBvdXRwdXQgYnVmZmVyIG92ZXJydW4qLworICAgIGludCAgICAgb0JTaXplOyAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgb3ZlcnJ1biBidWZmZXIgKi8KKworICAgIC8qIHJhdGUgY29udHJvbCAqLworICAgIEFWQ1JhdGVDb250cm9sICAgICAgKnJhdGVDdHJsOyAvKiBwb2ludGVyIHRvIHRoZSByYXRlIGNvbnRyb2wgc3RydWN0dXJlICovCisKKyAgICAvKiBlbmNvZGluZyBvcGVyYXRpb24gKi8KKyAgICBBVkNFbmNfU3RhdGUgICAgICAgIGVuY19zdGF0ZTsgLyogZW5jb2Rpbmcgc3RhdGUgKi8KKworICAgIEFWQ0ZyYW1lSU8gICAgICAgICAgKmN1cnJJbnB1dDsgLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBpbnB1dCBmcmFtZSAqLworCisgICAgaW50ICAgICAgICAgICAgICAgICBjdXJyU2xpY2VHcm91cDsgLyogY3VycmVudGx5IGVuY29kZWQgc2xpY2UgZ3JvdXAgaWQgKi8KKworICAgIGludCAgICAgbGV2ZWxbMjRdWzE2XSwgcnVuWzI0XVsxNl07IC8qIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgaW50ICAgICBsZXZlbGRjWzE2XSwgcnVuZGNbMTZdOyAvKiBmb3IgREMgY29tcG9uZW50ICovCisgICAgaW50ICAgICBsZXZlbGNkY1sxNl0sIHJ1bmNkY1sxNl07IC8qIGZvciBjaHJvbWEgREMgY29tcG9uZW50ICovCisgICAgaW50ICAgICBudW1jb2VmY2RjWzJdOyAvKiBudW1iZXIgb2YgY29lZmZpY2llbnQgZm9yIGNocm9tYSBEQyAqLworICAgIGludCAgICAgbnVtY29lZmRjOyAgICAgIC8qIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIERDIGNvbXBvbmVudCAqLworCisgICAgaW50ICAgICBxcF9jb25zdDsKKyAgICBpbnQgICAgIHFwX2NvbnN0X2M7CisgICAgLyoqKioqKioqKiBpbnRyYSBwcmVkaWN0aW9uIHNjcmF0Y2ggbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDggICBwcmVkX2kxNltBVkNOdW1JMTZQcmVkTW9kZV1bMjU2XTsgLyogc2F2ZSBwcmVkaWN0aW9uIGZvciBNQiAqLworICAgIHVpbnQ4ICAgcHJlZF9pNFtBVkNOdW1JNFByZWRNb2RlXVsxNl07ICAvKiBzYXZlIHByZWRpY3Rpb24gZm9yIGJsayAqLworICAgIHVpbnQ4ICAgcHJlZF9pY1tBVkNOdW1JQ2hyb21hTW9kZV1bMTI4XTsgIC8qIGZvciAyIGNocm9tYSAqLworCisgICAgaW50ICAgICBtb3N0UHJvYmFibGVJNE1vZGVbMTZdOyAvKiBpbiByYXN0ZXIgc2NhbiBvcmRlciAqLworICAgIC8qKioqKioqKiogbW90aW9uIGNvbXBlbnNhdGlvbiByZWxhdGVkIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqLworICAgIEFWQ01WICAgKm1vdDE2eDE2OyAgICAgICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgMTZ4MTYgYmxvY2sqLworICAgIEFWQ01WKCptb3QxNng4KVsyXTsgICAgIC8qIFNhdmVkIG1vdGlvbiB2ZWN0b3JzIGZvciAxNng4IGJsb2NrKi8KKyAgICBBVkNNVigqbW90OHgxNilbMl07ICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgOHgxNiBibG9jayovCisgICAgQVZDTVYoKm1vdDh4OClbNF07ICAgICAgLyogU2F2ZWQgbW90aW9uIHZlY3RvcnMgZm9yIDh4OCBibG9jayovCisKKyAgICAvKioqKioqKioqIHN1YnBlbCBwb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzIgIHN1YnBlbF9wcmVkW1NVQlBFTF9QUkVEX0JMS19TSVpFLyo8PDIqL107IC8qIGFsbCAxNiBzdWItcGVsIHBvc2l0aW9ucyAgKi8KKyAgICB1aW50OCAgICpocGVsX2NhbmRbOV07ICAgICAgLyogcG9pbnRlciB0byBoYWxmLXBlbCBwb3NpdGlvbiAqLworICAgIGludCAgICAgYmVzdF9ocGVsX3BvczsgICAgICAgICAgLyogYmVzdCBwb3NpdGlvbiAqLworICAgIHVpbnQ4ICAgcXBlbF9jYW5kWzhdWzI0KjE2XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gcXVhcnRlci1wZWwgcG9zaXRpb24gKi8KKyAgICBpbnQgICAgIGJlc3RfcXBlbF9wb3M7CisgICAgdWludDggICAqYmlsaW5fYmFzZVs5XVs0XTsgICAgLyogcG9pbnRlciB0byA0IHBvc2l0aW9uIGF0IHRvcCBsZWZ0IG9mIGJpbGluZWFyIHF1YXJ0ZXItcGVsICovCisKKyAgICAvKiBuZWVkIGZvciBpbnRyYSByZWZyZXNoIHJhdGUgKi8KKyAgICB1aW50OCAgICppbnRyYVNlYXJjaDsgICAgICAgLyogSW50cmEgQXJyYXkgZm9yIE1CcyB0byBiZSBpbnRyYSBzZWFyY2hlZCAqLworICAgIHVpbnQgICAgZmlyc3RJbnRyYVJlZnJlc2hNQkluZHg7IC8qIGtlZXAgdHJhY2sgZm9yIGludHJhIHJlZnJlc2ggKi8KKworICAgIGludCAgICAgaTRfc2FkOyAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgZm9yIGk0IG1vZGUgU0FEICovCisgICAgaW50ICAgICAqbWluX2Nvc3Q7ICAgICAgICAgIC8qIE1pbmltdW0gY29zdCBmb3IgdGhlIGFsbCBNQnMgKi8KKyAgICBpbnQgICAgIGxhbWJkYV9tb2RlOyAgICAgICAgLyogTGFncmFuZ2UgcGFyYW1ldGVyIGZvciBtb2RlIHNlbGVjdGlvbiAqLworICAgIGludCAgICAgbGFtYmRhX21vdGlvbjsgICAgICAvKiBMYWdyYW5nZSBwYXJhbWV0ZXIgZm9yIE1WIHNlbGVjdGlvbiAqLworCisgICAgdWludDggICAqbXZiaXRzX2FycmF5OyAgICAgIC8qIFRhYmxlIGZvciBiaXRzIHNwZW50IGluIHRoZSBjb3N0IGZ1bmNpdG9uICovCisgICAgdWludDggICAqbXZiaXRzOyAgICAgICAgICAgIC8qIEFuIG9mZnNldCB0byB0aGUgYWJvdmUgYXJyYXkuICovCisKKyAgICAvKiB0byBzcGVlZHVwIHRoZSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICB2b2lkICpzYWRfZXh0cmFfaW5mbzsKKyAgICB1aW50OCBjdXJyWU1CWzI1Nl07ICAgICAvKiBpbnRlcmxlYXZlZCBjdXJyZW50IG1hY3JvYmxvY2sgaW4gSFRGTSBvcmRlciAqLworCisjaWZkZWYgSFRGTQorICAgIGludCBucm1sel90aFs0OF07ICAgICAgIC8qIFRocmVzaG9sZCBmb3IgZmFzdCBTQUQgY2FsY3VsYXRpb24gdXNpbmcgSFRGTSAqLworICAgIEhURk1fU3RhdCBodGZtX3N0YXQ7ICAgIC8qIEZvciBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gKi8KKyNlbmRpZgorCisgICAgLyogc3RhdGlzdGljcyAqLworICAgIGludCBudW1JbnRyYU1COyAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGludHJhIE1CICovCisKKyAgICAvKiBlbmNvZGluZyBjb21wbGV4aXR5IGNvbnRyb2wgKi8KKyAgICB1aW50IGZ1bGxzZWFyY2hfZW5hYmxlOyAvKiBmbGFnIHRvIGVuYWJsZSBmdWxsLXBlbCBmdWxsLXNlYXJjaCAqLworCisgICAgLyogbWlzYy4qLworICAgIGJvb2wgb3V0T2ZCYW5kUGFyYW1TZXQ7IC8qIGZsYWcgdG8gZW5hYmxlIG91dC1vZi1iYW5kIHBhcmFtIHNldCAqLworCisgICAgQVZDU2VxUGFyYW1TZXQgZXh0U1BTOyAvKiBmb3IgZXh0ZXJuYWwgU1BTICovCisgICAgQVZDUGljUGFyYW1TZXQgZXh0UFBTOyAvKiBmb3IgZXh0ZXJuYWwgUFBTICovCisKKyAgICAvKiB0aW1lIGNvbnRyb2wgKi8KKyAgICB1aW50MzIgIHByZXZGcmFtZU51bTsgICAvKiBwcmV2aW91cyBmcmFtZSBudW1iZXIgc3RhcnRpbmcgZnJvbSBtb2RUaW1lUmVmICovCisgICAgdWludDMyICBtb2RUaW1lUmVmOyAgICAgLyogUmVmZXJlbmNlIG1vZFRpbWUgdXBkYXRlIGV2ZXJ5IEktVm9wKi8KKyAgICB1aW50MzIgIHdyYXBNb2RUaW1lOyAgICAvKiBPZmZzZXQgdG8gbW9kVGltZSBSZWYsIHJhcmVseSB1c2VkICovCisKKyAgICB1aW50ICAgIHByZXZQcm9jRnJhbWVOdW07ICAvKiBwcmV2aW91c2x5IHByb2Nlc3NlZCBmcmFtZSBudW1iZXIsIGNvdWxkIGJlIHNraXBwZWQgKi8KKyAgICB1aW50ICAgIHByZXZDb2RlZEZyYW1lTnVtOyAgLyogcHJldmlvdXNseSBlbmNvZGVkIGZyYW1lIG51bWJlciAqLworICAgIC8qIFBPQyByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgIHVpbnQzMiAgZGlzcE9yZFBPQ1JlZjsgICAgICAvKiByZWZlcmVuY2UgUE9DIGlzIGRpc3BsYXllciBvcmRlciB1bml0LiAqLworCisgICAgLyogRnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBBVkNFbmNGdW5jUHRyICpmdW5jdGlvblBvaW50ZXI7IC8qIHN0b3JlIHBvaW50ZXJzIHRvIHBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCisgICAgLyogQXBwbGljYXRpb24gY29udHJvbCBkYXRhICovCisgICAgQVZDSGFuZGxlICphdmNIYW5kbGU7CisKKworfSBBVkNFbmNPYmplY3Q7CisKKworI2VuZGlmIC8qQVZDRU5DX0lOVF9IX0lOQ0xVREVEKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19saWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlMjhlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfbGliLmgKQEAgLTAsMCArMSwxMDIwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCitUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIG9mIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgQVZDIGRlY29kZXIgbGlicmFyeS4KK0BwdWJsaXNoZWRBbGwKKyovCisjaWZuZGVmIEFWQ0VOQ19MSUJfSF9JTkNMVURFRAorI2RlZmluZSBBVkNFTkNfTElCX0hfSU5DTFVERUQKKworI2lmbmRlZiBBVkNMSUJfQ09NTU9OX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNsaWJfY29tbW9uLmgiCisjZW5kaWYKKyNpZm5kZWYgQVZDRU5DX0lOVF9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgLyotLS0tLS0tLS0tLS0tIGJsb2NrLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gcmVzaWR1ZSBjYWxjdWxhdGlvbiwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgaW52ZXJzZSBxdWFudGl6ZSwKKyAgICBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgcmVzaWR1ZSBjb21wZW5zYXRpb24gb24gYSA0eDQgYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJibGtpZHgiICAicmFzdGVyIHNjYW4gYmxvY2sgaW5kZXggb2YgdGhlIGN1cnJlbnQgNHg0IGJsb2NrLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgYmxvY2suIgorICAgIFxwYXJhbSAib3JnIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2suIgorICAgIFxwYXJhbSAiY29lZl9jb3N0IiAgIlBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvc3QgdG8gYmUgZmlsbGVkIGluIGFuZCByZXR1cm5lZC4iCisgICAgXHJldHVybiAiTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cy4iCisgICAgKi8KKyAgICBpbnQgZGN0X2x1bWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcsIGludCAqY29lZl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgSURDVCBvbiBhbiBJTlRFUiBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIHRoZSBtYWNyb2Jsb2NrIG9uIHRoZSBjdXJyZW50IGZyYW1lLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInBpY1BpdGNoIiAiUGl0Y2ggb2YgdGhlIGN1cnJlbnQgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiLgorICAgICovCisgICAgdm9pZCBNQkludGVySWRjdChBVkNDb21tb25PYmogKnZpZGVvLCB1aW50OCAqY3VyTCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgcGljUGl0Y2gpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHJlc2lkdWUgY2FsY3VsYXRpb24sIHRyYW5zZm9ybSwgcXVhbnRpemUsIGludmVyc2UgcXVhbnRpemUsCisgICAgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIHJlc2lkdWUgY29tcGVuc2F0aW9uIG9uIGEgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgTUIuIgorICAgIFxwYXJhbSAib3JnTCIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIE1CLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBkY3RfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckwsIHVpbnQ4ICpvcmdMKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSByZXNpZHVlIGNhbGN1bGF0aW9uLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBpbnZlcnNlIHF1YW50aXplLAorICAgIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZXNpZHVlIGNvbXBlbnNhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMgb2YgYW4gTUIuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJjdXJDIiAgICJQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIE1CLiIKKyAgICBccGFyYW0gIm9yZ0MiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBNQi4iCisgICAgXHBhcmFtICJjciIgICAgICJGbGFnIHdoZXRoZXIgaXQgaXMgQ3Igb3Igbm90LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBkY3RfY2hyb21hKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyQywgdWludDggKm9yZ0MsIGludCBjcik7CisKKyAgICAvKi0tLS0tLS0tLS0tIGluaXQuYyAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBwcm92aWRlZCBieSB1c2VycyBpbiBlbmNQYXJhbS4KKyAgICBUaGUgcmVzdWx0cyBhcmUga2VwdCBpbiBBVkNFbmNPYmplY3QsIEFWQ1NlcVBhcmFtU2V0LCBBVkNQaWNQYXJhbVNldCBhbmQgQVZDU2xpY2VIZWFkZXIuCisgICAgXHBhcmFtICJlbmN2aWQiICAgICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiZW5jUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDRW5jUGFyYW0uIgorICAgIFxwYXJhbSAiZXh0U1BTIiAgICAgIkV4dGVybmFsIFNQUyB0ZW1wbGF0ZSB0byBiZSBmb2xsb3dlZC4gTlVMTCBpZiBub3QgcHJlc2VudC4iCisgICAgXHBhcmFtICJleHRQUFMiICAgICAiRXh0ZXJuYWwgUFBTIHRlbXBsYXRlIHRvIGJlIGZvbGxvd2VkLiBOVUxMIGlmIG5vdCBwcmVzZW50LiIKKyAgICBccmV0dXJuICJzZWUgQVZDRW5jX1N0YXR1cy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzICBTZXRFbmNvZGVQYXJhbShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jUGFyYW1zICplbmNQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRTUFMsIHZvaWQgKmV4dFBQUyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHdoZXRoZXIgdGhleSBtZWV0IHRoZSBzZXQgb2Ygc3VwcG9ydGVkCisgICAgdG9vbCBieSBhIHNwZWNpZmljIHByb2ZpbGUuIElmIHRoZSBwcm9maWxlIGlzIG5vdCBzZXQsIGl0IHdpbGwganVzdCBmaW5kIHRoZSBjbG9zZXN0CisgICAgcHJvZmlsZSBpbnN0ZWFkIG9mIHZlcmlmeWluZyBpdC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInNlcVBhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1NlcVBhcmFtU2V0LiIKKyAgICBccGFyYW0gInBpY1BhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1BpY1BhcmFtU2V0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCBpZiB0aGUgc3BlY2lmaWVkIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHRvb2xzIGFyZQorICAgICAgICAgICAgbm90IHN1cHBvcnRlZCBieSB0aGUgdXNlci1zZWxlY3RlZCBwcm9maWxlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgVmVyaWZ5UHJvZmlsZShBVkNFbmNPYmplY3QgKnZpZGVvLCBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0sIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHdoZXRoZXIgdGhleSBtZWV0IHRoZSByZXF1aXJlbWVudAorICAgIGZvciBhIHNwZWNpZmljIGxldmVsLiBJZiB0aGUgbGV2ZWwgaXMgbm90IHNldCwgaXQgd2lsbCBqdXN0IGZpbmQgdGhlIGNsb3Nlc3QKKyAgICBsZXZlbCBpbnN0ZWFkIG9mIHZlcmlmeWluZyBpdC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInNlcVBhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1NlcVBhcmFtU2V0LiIKKyAgICBccGFyYW0gInBpY1BhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1BpY1BhcmFtU2V0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQgaWYgdGhlIHNwZWNpZmllZCBsZXZlbAorICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LAorICAgICAgICAgICAgQVZDRU5DX0xFVkVMX0ZBSUwgaWYgYW55IG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIGV4Y2VlZAorICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSB1c2VyLXNlbGVjdGVkIGxldmVsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgVmVyaWZ5TGV2ZWwoQVZDRW5jT2JqZWN0ICp2aWRlbywgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jaXRvbiBpbml0aWFsaXplcyB0aGUgZnJhbWUgZW5jb2RpbmcgYnkgc2V0dGluZyBwb2MvZnJhbWVfbnVtIHJlbGF0ZWQgcGFyYW1ldGVycy4gaXQKKyAgICBhbHNvIHBlcmZvcm1zIG1vdGlvbiBlc3RpbWF0aW9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNFTkNfTk9fUElDVFVSRSBpZiB0aGVyZSBpcyBubyBpbnB1dCBwaWN0dXJlCisgICAgICAgICAgICBpbiB0aGUgcXVldWUgdG8gZW5jb2RlLCBBVkNFTkNfUE9DX0ZBSUwgb3IgQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRiBmb3IgUE9DCisgICAgICAgICAgICByZWxhdGVkIGVycm9ycywgQVZDRU5DX05FV19JRFIgaWYgbmV3IElEUiBpcyBkZXRlY3RlZC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNsaWNlIGhlYWRlciByZWxhdGVkIHZhcmlhYmxlcyBhbmQgb3RoZXIgdmFyaWFibGVzIG5lY2Vzc2FyeQorICAgIGZvciBkZWNvZGluZyBvbmUgc2xpY2UuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0U2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyotLS0tLS0tLS0tLSBoZWFkZXIuYyAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGJpdHN0cmVhbSBlbmNvZGluZyBvZiB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBOQUwuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX1NQU19GQUlMIG9yIG90aGVycyBmb3IgdW5leHBlY3RlZCBmYWlsdXJlIHdoaWNoCisgICAgc2hvdWxkIG5vdCBvY2N1ci4gVGhlIFNQUyBwYXJhbWV0ZXJzIHNob3VsZCBhbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlU1BTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIFZVSSBwYXJhbWV0ZXJzIGludG8gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYml0c3RyZWFtLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAidnVpIiAgICAiUG9pbnRlciB0byBBVkNWVUlQYXJhbXMuIgorICAgIFxyZXR1cm4gIm5vdGhpbmcuIgorICAgICovCisgICAgdm9pZCBFbmNvZGVWVUkoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ1ZVSVBhcmFtcyogdnVpKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBIUkQgcGFyYW1ldGVycyBpbnRvIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGJpdHN0cmVhbQorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiaHJkIiAgICAiUG9pbnRlciB0byBBVkNIUkRQYXJhbXMuIgorICAgIFxyZXR1cm4gIm5vdGhpbmcuIgorICAgICovCisgICAgdm9pZCBFbmNvZGVIUkQoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ0hSRFBhcmFtcyogaHJkKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBiaXRzdHJlYW0gZW5jb2Rpbmcgb2YgdGhlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBOQUwuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX1BQU19GQUlMIG9yIG90aGVycyBmb3IgdW5leHBlY3RlZCBmYWlsdXJlIHdoaWNoCisgICAgc2hvdWxkIG5vdCBvY2N1ci4gVGhlIFNQUyBwYXJhbWV0ZXJzIHNob3VsZCBhbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlUFBTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgc2xpY2UgaGVhZGVyIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIG9yIGZhYnJpY2F0ZWQKKyAgICBwcmlvciB0byBlbnRlcmluZyB0aGlzIGZ1bmNpdG9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIGJpdHN0cmVhbSBmYWlsIHN0YXR1c2VzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlU2xpY2VIZWFkZXIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgcmVsdGVkIHN5bnRheC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAic2xpY2VIZHIiICJQb2ludGVyIHRvIEFWQ1NsaWNlSGRyLiIKKyAgICBccGFyYW0gInNsaWNlX3R5cGUiICJWYWx1ZSBvZiBzbGljZV90eXBlIC0gNSBpZiBncmVhdGVyIHRoYW4gNS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0VOQ19GQUlMIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIsIGludCBzbGljZV90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBkZWNfcmVmX3BpY19tYXJraW5nIHJlbGF0ZWQgc3ludGF4LgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJzbGljZUhkciIgIlBvaW50ZXIgdG8gQVZDU2xpY2VIZHIuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIGFuZCBBVkNFTkNfRkFJTCBvdGhlcndpc2UuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUE9DIHJlbGF0ZWQgdmFyaWFibGVzIGFuZCB0aGUgUE9DIHN5bnRheCB0byBiZSBlbmNvZGVkCisgICAgdG8gdGhlIHNsaWNlIGhlYWRlciBkZXJpdmVkIGZyb20gdGhlIGRpc3Bfb3JkZXIgYW5kIGlzX3JlZmVyZW5jZSBmbGFnIG9mIHRoZSBvcmlnaW5hbAorICAgIGlucHV0IGZyYW1lIHRvIGJlIGVuY29kZWQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsCisgICAgICAgICAgICBBVkNFTkNfUE9DX0ZBSUwgaWYgdGhlIHBvYyB0eXBlIGlzIHVuZGVmaW5lZCBvcgorICAgICAgICAgICAgQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRiBpZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgbm9uLXJlZmVyZW5jZSBmcmFtZSBmb3IgUE9DIHR5cGUgMi4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRQT0MoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIFBPQyByZWxhdGVkIG9wZXJhdGlvbiBhZnRlciBhIHBpY3R1cmUgaXMgZGVjb2RlZC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBQb3N0UE9DKEFWQ0NvbW1vbk9iaiAqdmlkZW8pOworCisgICAgLyotLS0tLS0tLS0tLSBiaXRzdHJlYW1faW8uYyAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBiaXRzdHJlYW0gc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uIGdpdmVuIGJ5CisgICAgdGhlIHVzZXJzLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiYnVmZmVyIiAgICAgIlBvaW50ZXIgdG8gdGhlIHVuc2lnbmVkIGNoYXIgYnVmZmVyIGZvciBvdXRwdXQuIgorICAgIFxwYXJhbSAiYnVmX3NpemUiICAgIlRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuIgorICAgIFxwYXJhbSAib3ZlcnJ1bkJ1ZmZlciIgICJQb2ludGVyIHRvIGV4dHJhIG92ZXJydW4gYnVmZmVyLiIKKyAgICBccGFyYW0gIm9CU2l6ZSIgICAgICJTaXplIG9mIG92ZXJydW4gYnVmZmVyIGluIGJ5dGVzLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNFTkNfQklUU1RSRUFNX0lOSVRfRkFJTCBpZiBmYWlsIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1FbmNJbml0KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50OCAqYnVmZmVyLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdmVycnVuQnVmZmVyLCBpbnQgb0JTaXplKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBkYXRhIGZyb20gdGhlIGNhY2hlIGludG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuIEl0IGFsc28gYWRkcyB0aGUKKyAgICBlbXVsYXRpb24gcHJldmVudGlvbiBjb2RlIGlmIG5lY2Vzc2FyeS4KKyAgICBccGFyYW0gInN0cmVhbSIgICAgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVNhdmVXb3JkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBjb2Rld29yZCBpbnRvIHRoZSBjYWNoZSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUgd3JpdHRlbiB0bworICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyLgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibkJpdHMiICAgICAgIk51bWJlciBvZiBiaXRzIGluIHRoZSBjb2Rld29yZC4iCisgICAgXHBhcmFtICJjb2RlIiAgICAgICAiVGhlIGNvZGV3b3JkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlQml0cyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IG5CaXRzLCB1aW50IGNvZGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgb25lIGJpdCBvZiBkYXRhIGludG8gdGhlIGNhY2hlIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBiZSB3cml0dGVuCisgICAgdG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuCisgICAgXHBhcmFtICJzdHJlYW0iICAgICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjb2RlIiAgICAgICAiVGhlIGNvZGV3b3JkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlMUJpdChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgdWludCBjb2RlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gYWRkcyB0cmFpbGluZyBiaXRzIHRvIHRoZSBiaXRzdHJlYW0gYW5kIHJlcG9ydHMgYmFjayB0aGUgZmluYWwgRUJTUCBzaXplLgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibmFsX3NpemUiICAgIk91dHB1dCB0aGUgZmluYWwgTkFMIHNpemUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCBpZiBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQml0c3RyZWFtVHJhaWxpbmdCaXRzKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50ICpuYWxfc2l6ZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpcyBieXRlLWFsaWduZWQgb3Igbm90LgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidHJ1ZSBpZiBieXRlLWFsaWduZWQsIGZhbHNlIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBib29sIGJ5dGVfYWxpZ25lZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBhdmFpbGFiaWxpdHkgb2Ygb3ZlcnJ1biBidWZmZXIgYW5kIHN3aXRjaGVzIHRvIHVzZSBpdCB3aGVuCisgICAgbm9ybWFsIGJ1ZmZmZXIgaXMgbm90IGJpZyBlbm91Z2guCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm51bUV4dHJhQnl0ZXMiICJOdW1iZXIgb2YgZXh0cmEgYnl0ZSBuZWVkZWQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQVZDQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgaW50IG51bUV4dHJhQnl0ZXMpOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tIGludHJhX2VzdC5jIC0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRyYS9pbnRlciBkZWNpc2lvbiBiYXNlZCBvbiBBQkUuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgICAiQmVzdCBpbnRlciBjb3N0LiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgTUIgb3JpZ2luIGluIHJlY29uc3RydWN0ZWQgZnJhbWUuIgorICAgIFxwYXJhbSAicGljUGl0Y2giICJQaXRjaCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHJldHVybiAiQm9vbGVhbiBmb3IgaW50cmEgbW9kZS4iCisgICAgKi8KKworLy9ib29sIEludHJhRGVjaXNpb25BQkUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBtaW5fY29zdCwgdWludDggKmN1ckwsIGludCBwaWNQaXRjaCk7CisgICAgYm9vbCBJbnRyYURlY2lzaW9uKGludCAqbWluX2Nvc3QsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCwgYm9vbCBhdmUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgc2VhcmNoLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAibWJudW0iICAiQ3VycmVudCBNQiBudW1iZXIuIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBNQiBvcmlnaW4gaW4gcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHBhcmFtICJwaWNQaXRjaCIgIlBpdGNoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1ibnVtLCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGFsbCB0aGUgSTE2IHByZWRpY3Rpb24gbW9kZXMgZm9yIGFuIE1CIGFuZCBrZWVwIGl0IGluCisgICAgZW5jdmlkLT5wcmVkX2kxNi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBpbnRyYXByZWRfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgY29zdCBvZiBhbGwgSTE2IG1vZGVzIGFuZCBjb21wYXJlIHRoZW0gdG8gZ2V0IHRoZSBtaW5pbXVtLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAib3JnWSIgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgbHVtYSBNQi4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgIlBvaW50ZXIgdG8gdGhlIG1pbmltYWwgY29zdCBzby1mYXIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGZpbmRfY29zdF8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKm9yZ1ksIGludCAqbWluX2Nvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb3N0IG9mIGVhY2ggSTE2IG1vZGUuCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBsdW1hIE1CLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgIlN0cmlkZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBmcmFtZS4iCisgICAgXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIHZhbHVlcy4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgIk1pbmltYWwgY29zdCBzby1mYXIuIgorICAgIFxyZXR1cm4gIkNvc3QiCisgICAgKi8KKworICAgIGludCBjb3N0X2kxNih1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGFsbCB0aGUgSTQgcHJlZGljdGlvbiBtb2RlcyBhbmQgc2VsZWN0IHRoZSBiZXN0IG9uZQorICAgIGZvciBhbGwgdGhlIGJsb2NrcyBpbnNpZGUgYSBtYWNyb2Jsb2NrLkl0IGFsc28gY2FsbHMgZGN0X2x1bWEgdG8gZ2VuZXJhdGUgdGhlIHJlY29uc3RydWN0ZWQKKyAgICBNQiwgYW5kIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgdG8gYmUgZW5jb2RlZC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm1pbl9jb3N0IiAiUG9pbnRlciB0byB0aGUgbWluaW1hbCBjb3N0IHNvLWZhci4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgbWJfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgKm1pbl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbW9zdCBwcm9iYWJsZSBJNCBtb2RlIG9mIGEgZ2l2ZW4gNHg0IGJsb2NrCisgICAgZnJvbSBuZWlnaGJvcmluZyBpbmZvcm1hdGlvbmFjY29yZGluZyB0byBBVkMvSC4yNjQgc3RhbmRhcmQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJibGtpZHgiICJUaGUgY3VycmVudCBibG9jayBpbmRleC4iCisgICAgXHJldHVybiAiTW9zdCBwcm9iYWJsZSBtb2RlLiIKKyAgICAqLworICAgIGludCBGaW5kTW9zdFByb2JhYmxlSTRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibGtpZHgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyB3aGVyZSBhIGxvdCBvZiBhY3Rpb25zIHRha2UgcGxhY2UgaW4gdGhlIDR4NCBibG9jayBsZXZlbCBpbnNpZGUKKyAgICBtYl9pbnRyYTR4NF9zZWFyY2guCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJibGtpZHgiICJUaGUgY3VycmVudCA0eDQgYmxvY2sgaW5kZXguIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jay4iCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jay4iCisgICAgXHJldHVybiAiTWluaW1hbCBjb3N0LCBhbHNvIHNldCBjdXJyTUItPmk0TW9kZSIKKyAgICAqLworICAgIGludCBibGtfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29zdCBvZiBhIGdpdmVuIEk0IHByZWRpY3Rpb24gbW9kZS4KKyAgICBccGFyYW0gIm9yZyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgICJTdHJpZGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZnJhbWUuIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBibG9jay4gKGVuY3ZpZC0+cHJlZF9pNCkiCisgICAgXHBhcmFtICJjb3N0IiAgICJQb2ludGVyIHRvIHRoZSBtaW5pbWFsIGNvc3QgKHRvIGJlIHVwZGF0ZWQpLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBjb3N0X2k0KHVpbnQ4ICpvcmcsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCB1aW50MTYgKmNvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50cmEgc2VhcmNoLiBFYWNoIG1vZGUgaXMgc2F2ZWQgaW4gZW5jdmlkLT5wcmVkX2ljLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGNocm9tYV9pbnRyYV9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb3N0IG9mIGEgY2hyb21hIHByZWRpY3Rpb24gbW9kZS4KKyAgICBccGFyYW0gIm9yZ0NiIiAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIENiIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ0NyIiAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIENyIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgICJTdHJpZGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZnJhbWUuIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBibG9jayAoZW5jdmlkLT5wcmVkX2ljKSIKKyAgICBccGFyYW0gIm1pbmNvc3QiICAgICJNaW5pbWFsIGNvc3Qgc28gZmFyLiIKKyAgICBccmV0dXJuICJDb3N0LiIKKyAgICAqLworCisgICAgaW50IFNBVERDaHJvbWEodWludDggKm9yZ0NiLCB1aW50OCAqb3JnQ3IsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluY29zdCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tIG1vdGlvbl9jb21wLmMgLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uIHRvIHBlZm9ybSBpbnRlciBwcmVkaWN0aW9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAgICAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInZpZGVvIiAgICAgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHJldHVybiAidm9pZCIuCisgICAgKi8KKyAgICB2b2lkIEFWQ01CTW90aW9uQ29tcChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbyk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBsdW1hIG1vdGlvbiBjb21wZW5zYXRpb24uCisgICAgXHBhcmFtICJyZWYiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW4gb2YgYSByZWZlcmVuY2UgbHVtYS4iCisgICAgXHBhcmFtICJwaWN3aWR0aCIgICAiV2lkdGggb2YgdGhlIHBpY3R1cmUuIgorICAgIFxwYXJhbSAicGljaGVpZ2h0IiAgIkhlaWdodCBvZiB0aGUgcGljdHVyZS4iCisgICAgXHBhcmFtICJ4X3BvcyIgICJYLWNvb3JkaW5hdGUgb2YgdGhlIHByZWRpY3RlZCBibG9jayBpbiBxdWFydGVyIHBlbCByZXNvbHV0aW9uLiIKKyAgICBccGFyYW0gInlfcG9zIiAgIlktY29vcmRpbmF0ZSBvZiB0aGUgcHJlZGljdGVkIGJsb2NrIGluIHF1YXJ0ZXIgcGVsIHJlc29sdXRpb24uIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgb3V0cHV0IHByZWRpY3RlZCBibG9jay4iCisgICAgXHBhcmFtICJwcmVkX3BpdGNoIiAiV2lkdGggb2YgcHJlZC4iCisgICAgXHBhcmFtICJibGt3aWR0aCIgICAiV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKKyAgICBccGFyYW0gImJsa2hlaWdodCIgICJIZWlnaHQgb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBlTHVtYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlRnVsbFBlbE1DKHVpbnQ4ICppbiwgaW50IGlud2lkdGgsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUhvcnpJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpOworCisgICAgdm9pZCBlSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpOworCisgICAgdm9pZCBlSG9yekludGVycDNNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZVZlcnRJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpOworCisgICAgdm9pZCBlVmVydEludGVycDJNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZVZlcnRJbnRlcnAzTUMoaW50ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KTsKKworICAgIHZvaWQgZURpYWdvbmFsSW50ZXJwTUModWludDggKmluMSwgdWludDggKmluMiwgaW50IGlucGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYURpYWdvbmFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYVZlcnRpY2FsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFGdWxsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYVZlcnRpY2FsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYUhvcml6b250YWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFEaWFnb25hbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0gbW90aW9uX2VzdC5jIC0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhcnJheXMgbmVjZXNzYXJ5IGZvciBtb3Rpb24gc2VhcmNoIGFsZ29yaXRobS4KKyAgICBccGFyYW0gImVudmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ19TVUNDRVNTIG9yIEFWQ19NRU1PUllfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRNb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBpbiBJbml0TW90aW9uU2VhcmNoTW9kdWxlLgorICAgIFxwYXJhbSAiZW52aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIENsZWFuTW90aW9uU2VhcmNoTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtb3Rpb24gZXN0aW1hdGlvbiBvZiBhbGwgbWFjcm9ibG9ja3MgaW4gYSBmcmFtZSBkdXJpbmcgdGhlIEluaXRGcmFtZS4KKyAgICBUaGUgZ29hbCBpcyB0byBmaW5kIHRoZSBiZXN0IE1CIHBhcnRpdGlvbiBmb3IgaW50ZXIgYW5kIGZpbmQgb3V0IGlmIGludHJhIHNlYXJjaCBpcyBuZWVkZWQgZm9yCisgICAgYW55IE1Ccy4gVGhpcyBpbnRyYSBNQiB0ZW5kZW5jeSBjYW4gYmUgdXNlZCBmb3Igc2NlbmUgY2hhbmdlIGRldGVjdGlvbi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBBVkNNb3Rpb25Fc3RpbWF0aW9uKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcmVwZXRpdGl2ZSBlZGdlIHBhZGRpbmcgdG8gdGhlIHJlZmVyZW5jZSBwaWN0dXJlIGJ5IGFkZGluZyAxNiBwaXhlbHMKKyAgICBhcm91bmQgdGhlIGx1bWEgYW5kIDggcGl4ZWxzIGFyb3VuZCB0aGUgY2hyb21hcy4KKyAgICBccGFyYW0gInJlZlBpYyIgIlBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBwaWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCAgQVZDUGFkZGluZ0VkZ2UoQVZDUGljdHVyZURhdGEgKnJlZlBpYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyYWNrIG9mIGludHJhIHJlZnJlc2ggbWFjcm9ibG9jayBsb2NhdGlvbnMuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgYXJyYXkgc3RydWN0dXJlIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZXMuIgorICAgIFxwYXJhbSAidG90YWxNQiIgIlRvdGFsIG51bWJlciBvZiBNQnMgaW4gYSBmcmFtZS4iCisgICAgXHBhcmFtICJudW1SZWZyZXNoIiAiTnVtYmVyIG9mIE1CIHRvIGJlIGludHJhIHJlZnJlc2ggaW4gYSBzaW5nbGUgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEFWQ1Jhc3RlckludHJhVXBkYXRlKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICptYmxvY2ssIGludCB0b3RhbE1CLCBpbnQgbnVtUmVmcmVzaCk7CisKKyNpZmRlZiBIVEZNCisgICAgdm9pZCBJbml0SFRGTShWaWRlb0VuY0RhdGEgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIGRvdWJsZSAqbmV3dmFyLCBpbnQgKmNvbGxlY3QpOworICAgIHZvaWQgVXBkYXRlSFRGTShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgZG91YmxlICpuZXd2YXIsIGRvdWJsZSAqZXhwX2xhbWRhLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCk7CisgICAgdm9pZCBDYWxjVGhyZXNob2xkKGRvdWJsZSBwZiwgZG91YmxlIGV4cF9sYW1kYVtdLCBpbnQgbnJtbHpfdGhbXSk7CisgICAgdm9pZCAgICBIVEZNUHJlcGFyZUN1ck1CX0FWQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCk7CisjZW5kaWYKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGlucHV0IE1CIGludG8gYSBzbWFsbGVyIGZhc3RlciBtZW1vcnkgc3BhY2UgdG8gbWluaW1pemUgdGhlIGNhY2hlIG1pc3MuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGlucHV0IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAicGl0Y2giICAiU3RyaWRlIHNpemUgb2YgdGhlIGlucHV0IGZyYW1lIChsdW1hKS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgICAgQVZDUHJlcGFyZUN1ck1CKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gpOworCisgICAgLyoqCisgICAgUGVyZm9ybXMgbW90aW9uIHZlY3RvciBzZWFyY2ggZm9yIGEgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGlucHV0IGZyYW1lLiIKKyAgICBccGFyYW0gImJlc3RfY2FuZCIgIkFycmF5IG9mIGJlc3QgY2FuZGlkYXRlcyAodG8gYmUgZmlsbGVkIGluIGFuZCByZXR1cm5lZCkuIgorICAgIFxwYXJhbSAiaTAiICAgICAiWC1jb29yZGluYXRlIG9mIHRoZSBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gImowIiAgICAgIlktY29vcmRpbmF0ZSBvZiB0aGUgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJ0eXBlX3ByZWQiICJJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb3BlcmF0aW9ucy4iCisgICAgXHBhcmFtICJGU19lbiIgICAgICAiRmxhZyBmb3IgZnVsbHNlYXJjaCBlbmFibGUuIgorICAgIFxwYXJhbSAiaHBfZ3Vlc3MiICAgIkd1ZXNzIGZvciBoYWxmLXBlbCBzZWFyY2guIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCB1aW50OCAqYmVzdF9jYW5kW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTAsIGludCBqMCwgaW50IHR5cGVfcHJlZCwgaW50IEZTX2VuLCBpbnQgKmhwX2d1ZXNzKTsKKworLy9BVkNFbmNfU3RhdHVzIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYXNzKTsKKworICAgIC8qKgorICAgIFBlcmZvcm0gZnVsbC1wZWwgZXhoYXVzdGl2ZSBzZWFyY2ggYXJvdW5kIHRoZSBwcmVkaWN0ZWQgTVYuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicHJldiIgICAiUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGZyYW1lLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAiaW1pbiIgICAiUG9pbnRlciB0byBtaW5pbWFsIG12ICh4KS4iCisgICAgXHBhcmFtICJqbWluIiAgICJQb2ludGVyIHRvIG1pbmltYWwgbXYgKHkpLiIKKyAgICBccGFyYW0gImlsb3csIGloaWdoLCBqbG93LCBqaGlnaCIgICAiTG93ZXIgYm91bmQgb24gc2VhcmNoIHJhbmdlLiIKKyAgICBccGFyYW0gImNtdngsIGNtdnkiICJQcmVkaWN0ZWQgTVYgdmFsdWUuIgorCisgICAgXHJldHVybiAiVGhlIGNvc3QgZnVuY3Rpb24gb2YgdGhlIGJlc3QgY2FuZGlkYXRlLiIKKyAgICAqLworICAgIGludCBBVkNGdWxsU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqcHJldiwgdWludDggKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmltaW4sIGludCAqam1pbiwgaW50IGlsb3csIGludCBpaGlnaCwgaW50IGpsb3csIGludCBqaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY212eCwgaW50IGNtdnkpOworCisgICAgLyoqCisgICAgU2VsZWN0IGNhbmRpZGF0ZXMgZnJvbSBuZWlnaGJvcmluZyBibG9ja3MgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZQorICAgIHByZWRpY3Rpb24gc2VsZWN0aW9uLgorICAgIFxwYXJhbSAibXZ4IiAgICAiUG9pbnRlciB0byB0aGUgY2FuZGlkYXRlLCB4LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAibXZ5IiAgICAiUG9pbnRlciB0byB0aGUgY2FuZGlkYXRlLCB5LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAibnVtX2NhbiIgICAgIlBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBjYW5kaWRhdGVzIHJldHVybmVkLiIKKyAgICBccGFyYW0gImltYiIgICAgIlRoZSBNQiBpbmRleCB4LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAiam1iIiAgICAiVGhlIE1CIGluZGV4IHktY29vcmRpbmF0ZS4iCisgICAgXHBhcmFtICJ0eXBlX3ByZWQiICAiVHlwZSBvZiB0aGUgcHJlZGljdGlvbi4iCisgICAgXHBhcmFtICJjbXZ4LCBjbXZ5IiAiUG9pbnRlciB0byBwcmVkaWN0ZWQgTVYgKG1vZGlmaWVkIHZlcnNpb24pLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgQVZDQ2FuZGlkYXRlU2VsZWN0aW9uKGludCAqbXZ4LCBpbnQgKm12eSwgaW50ICpudW1fY2FuLCBpbnQgaW1iLCBpbnQgam1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgdHlwZV9wcmVkLCBpbnQgKmNtdngsIGludCAqY212eSk7CisKKyAgICAvKioKKyAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIG1vdmUgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgZG4gYWNjb3JkaW5nIHRvIHRoZSBuZXcKKyAgICBsb2NhdGlvbiB0byBhdm9pZCByZWR1bmRhbnQgY2FsY3VsYXRpb24uCisgICAgXHBhcmFtICJkbiIgIkFycmF5IG9mIGludGVnZXIgb2Ygc2l6ZSA5LiIKKyAgICBccGFyYW0gIm5ld19sb2MiICAgICJOZXcgbG9jYXRpb24gaW5kZXguIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBBVkNNb3ZlTmVpZ2hib3JTQUQoaW50IGRuW10sIGludCBuZXdfbG9jKTsKKworICAgIC8qKgorICAgIEZpbmQgbWluaW11bSBpbmRleCBvZiBkbi4KKyAgICBccGFyYW0gImRuIiAiQXJyYXkgb2YgaW50ZWdlciBvZiBzaXplIDkuIgorICAgIFxyZXR1cm4gIlRoZSBpbmRleCBvZiBkbiB3aXRoIHRoZSBzbWFsbGVzdCBkbltdIHZhbHVlLiIKKyAgICAqLworICAgIGludCBBVkNGaW5kTWluKGludCBkbltdKTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tIGZpbmRoYWxmcGVsLmMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBTZWFyY2ggZm9yIHRoZSBiZXN0IGhhbGYtcGVsIHJlc29sdXRpb24gTVYgYXJvdW5kIHRoZSBmdWxsLXBlbCBNVi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGdsb2JhbCBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJtb3QiICAgICJQb2ludGVyIHRvIHRoZSBBVkNNViBhcnJheSBvZiB0aGUgZnJhbWUuIgorICAgIFxwYXJhbSAibmNhbmQiICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIHRoZSBmdWxsc2VhcmNoIHJlc3VsdC4iCisgICAgXHBhcmFtICJ4cG9zIiAgICJUaGUgY3VycmVudCBNQiBwb3NpdGlvbiBpbiB4LiIKKyAgICBccGFyYW0gInlwb3MiICAgIlRoZSBjdXJyZW50IE1CIHBvc2l0aW9uIGluIHkuIgorICAgIFxwYXJhbSAiaHBfZ3Vlc3MiICAgIklucHV0IHRvIGhlbHAgc3BlZWR1cCB0aGUgc2VhcmNoLiIKKyAgICBccGFyYW0gImNtdngsIGNtdnkiICJQcmVkaWN0ZWQgbW90aW9uIHZlY3RvciB1c2UgZm9yIG12Y29zdC4iCisgICAgXHJldHVybiAiTWluaW1hbCBjb3N0IChTQVREKSB3aXRob3V0IE1WIGNvc3QuIChmb3IgcmF0ZSBjb250cm9sIHB1cnBvc2UpIgorICAgICovCisgICAgaW50IEFWQ0ZpbmRIYWxmUGVsTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIEFWQ01WICptb3QsIHVpbnQ4ICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHBvcywgaW50IHlwb3MsIGludCBocF9ndWVzcywgaW50IGNtdngsIGludCBjbXZ5KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHN1Yi1wZWwgcGl4ZWxzIHJlcXVpcmVkIHRvIGRvIHN1YnBlbCBNViBzZWFyY2guCisgICAgXHBhcmFtICJzdWJwZWxfcHJlZCIgIlBvaW50ZXIgdG8gMi1EIGFycmF5LCBlYWNoIGFycmF5IGZvciBlYWNoIHBvc2l0aW9uLiIKKyAgICBccGFyYW0gIm5jYW5kIiAiUG9pbnRlciB0byB0aGUgZnVsbC1wZWwgY2VudGVyIHBvc2l0aW9uIGluIHJlZiBmcmFtZS4iCisgICAgXHBhcmFtICJseCIgIlBpdGNoIG9mIHRoZSByZWYgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgICovCisgICAgdm9pZCBHZW5lcmF0ZUhhbGZQZWxQcmVkKHVpbnQ4ICpzdWJwZWxfcHJlZCwgdWludDggKm5jYW5kLCBpbnQgbHgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhdCBoYWxmLXBvaW50IG9mIHNpemUgNHgxNy4KKyAgICBccGFyYW0gImRzdCIgIlBvaW50ZXIgdG8gZGVzdGluYXRpb24uIgorICAgIFxwYXJhbSAicmVmIiAiUG9pbnRlciB0byB0aGUgc3RhcnRpbmcgcmVmZXJlbmNlIHBpeGVsLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgVmVydEludGVycFdDbGlwKHVpbnQ4ICpkc3QsIHVpbnQ4ICpyZWYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgcXVhcnRlci1wZWwgcGl4ZWxzIGFyb3VuZCB0aGUgYmVzdCBoYWxmLXBlbCByZXN1bHQKKyAgICBkdXJpbmcgdGhlIHN1Yi1wZWwgTVYgc2VhcmNoLgorICAgIFxwYXJhbSAiYmlsaW5fYmFzZSIgICJBcnJheSBvZiBwb2ludGVycyB0byBiZSB1c2VkIGFzIGJhc2lzIGZvciBxLXBlbCBpbnRlcnAuIgorICAgIFxwYXJhbSAicXBlbF9wcmVkIiAgIkFycmF5IG9mIHBvaW50ZXJzIHBvaW50aW5nIHRvIHF1YXJ0ZXItcGVsIGNhbmRpZGF0ZXMuIgorICAgIFxwYXJhbSAiaHBlbF9wb3MiICJCZXN0IGhhbGYtcGVsIHBvc2l0aW9uIGF0IHRoZSBjZW50ZXIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlUXVhcnRQZWxQcmVkKHVpbnQ4ICoqYmlsaW5fYmFzZSwgdWludDggKnFwZWxfcHJlZCwgaW50IGhwZWxfcG9zKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FURCBvZiBhIHN1YnBlbCBjYW5kaWRhdGUuCisgICAgXHBhcmFtICJjYW5kIiAgICJQb2ludGVyIHRvIGEgY2FuZGlkYXRlLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2suIgorICAgIFxwYXJhbSAiZG1pbiIgICAiTWluLXNvLWZhciBTQVRELiIKKyAgICBccmV0dXJuICJTdW0gb2YgQWJzb2x1dGUgVHJhbnNmb3JtZWQgRGlmZmVyZW5jZS4iCisgICAgKi8KKyAgICBpbnQgU0FURF9NQih1aW50OCAqY2FuZCwgdWludDggKmN1ciwgaW50IGRtaW4pOworCisgICAgLyotLS0tLS0tLS0tLS0tIHJhdGVfY29udHJvbC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgYSB1dGlsaXR5IGZ1bmN0aW9uLiBJdCByZXR1cm5zIGF2ZXJhZ2UgUVAgb2YgdGhlIHByZXZpb3VzbHkgZW5jb2RlZCBmcmFtZS4KKyAgICBccGFyYW0gInJhdGVDdHJsIiAiUG9pbnRlciB0byBBVkNSYXRlQ29udHJvbCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkF2ZXJhZ2UgUVAuIgorICAgICovCisgICAgaW50IEdldEF2Z0ZyYW1lUVAoQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5wdXQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZCBiZSBlbmNvZGVkCisgICAgb3Igc2tpcHBlZC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICAgIlBvaW50ZXIgdG8gdGhlIEFWQ1JhdGVDb250cm9sIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJtb2RUaW1lIiAgICAiVGhlIDMyIGJpdCB0aW1lc3RhbXAgb2YgdGhlIGlucHV0IGZyYW1lLiIKKyAgICBccGFyYW0gImZyYW1lTnVtIiAgICJQb2ludGVyIHRvIHRoZSBmcmFtZSBudW1iZXIgaWYgdG8gYmUgZW5jb2RlZC4iCisgICAgXHJldHVybiAiQVZDX1NVQ0NFU1Mgb3IgZWxzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFJDRGV0ZXJtaW5lRnJhbWVOdW0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgdWludDMyIG1vZFRpbWUsIHVpbnQgKmZyYW1lTnVtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgYnVmZmVyIGZ1bGxuZXNzIHdoZW4gZnJhbWVzIGFyZSBkcm9wcGVkIGVpdGhlciBieSB0aGUKKyAgICByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIG9yIGJ5IHRoZSB1c2VycyB0byBtYWtlIHN1cmUgdGhhdCB0YXJnZXQgYml0IHJhdGUgaXMgc3RpbGwgbWV0LgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIHRoZSBjb21tb24gb2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJyYXRlQ3RybCIgIlBvaW50ZXIgdG8gcmF0ZSBjb250cm9sIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJmcmFtZUluYyIgIkRpZmZlcmVuY2Ugb2YgdGhlIGN1cnJlbnQgZnJhbWUgbnVtYmVyIGFuZCBwcmV2aW91cyBmcmFtZSBudW1iZXIuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBSQ1VwZGF0ZUJ1ZmZlcihBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBmcmFtZUluYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHJhdGUgY29udHJvbCBtb2R1bGUgYW5kIGFsbG9jYXRlcyBuZWNlc3NhcnkgYnVmZmVyZXMgdG8gZG8gdGhlIGpvYi4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfTUVNT1JZX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0UmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyBidWZmZXJzIGFsbG9jYXRlZCBpbiBJbml0UmF0ZUNvbnRyb2xNb2R1bGUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGhhbmRsZS4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggR09QIG9yIHRoZSBmaXJzdCBJRFIgZnJhbWUuIEl0IGNhbGN1bGF0ZXMKKyAgICB0YXJnZXQgYml0cyBmb3IgYSBHT1AuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdEdPUChBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGFyZ2V0IGJpdHMgZm9yIGEgcGFydGljdWxhciBmcmFtZS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdEZyYW1lUVAoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgUVAgZm9yIHRoZSB1cGNvbWluZyBmcmFtZSBvciBiYXNpYyB1bml0LgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIHRoZSByYXRlIGNvbnRyb2wgb2JqZWN0LiIKKyAgICBccmV0dXJuICJRUCB2YWx1ZSByYW5naW5nIGZyb20gMC01MS4iCisgICAgKi8KKyAgICBpbnQgIFJDQ2FsY3VsYXRlUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGx1bWEgUVAgdG8gY2hyb21hIFFQIGFuZCBjYWxjdWxhdGVzIGxhbWJkYSBiYXNlZCBvbiBRUC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdENocm9tYVFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBlbmNvZGluZyBlYWNoIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdE1CUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIGJpdHMgdXNhZ2Ugc3RhdHMgYWZ0ZXIgZW5jb2RpbmcgYW4gbWFjcm9ibG9jay4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIEFWQ1JhdGVDb250cm9sLiIKKyAgICBccGFyYW0gIm51bV9oZWFkZXJfYml0cyIgIk51bWJlciBvZiBiaXRzIHVzZWQgZm9yIE1CIGhlYWRlci4iCisgICAgXHBhcmFtICJudW1fdGV4dHVyZV9iaXRzIiAiTnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgTUIgdGV4dHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgUkNQb3N0TUIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgbnVtX2hlYWRlcl9iaXRzLCBpbnQgbnVtX3RleHR1cmVfYml0cyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmVkaWN0aW9uIGFuZCBvcmlnaW5hbCBNQi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAib3JnTCIgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIE1CLiIKKyAgICBccGFyYW0gIm9yZ1BpdGNoIiAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgcGljdHVyZSBwaXRjaC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDQ2FsY3VsYXRlTUFEKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIHVpbnQ4ICpvcmdMLCBpbnQgb3JnUGl0Y2gpOworCisgICAgLyoqCisgICAgUmVzdG9yZSBRUCByZWxhdGVkIHBhcmFtZXRlcnMgb2YgcHJldmlvdXMgTUIgd2hlbiBjdXJyZW50IE1CIGlzIHNraXBwZWQuCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgY29tbW9uIHZpZGVvIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgZW5jb2Rpbmcgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBSQ1Jlc3RvcmVRUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGRvbmUgd2l0aCBhIGZyYW1lLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkUgd2hlbiBidWZlciBvdmVyZmxvdyAobmVlZCB0byBkaXNjYXJkIGN1cnJlbnQgZnJhbWUpLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgUkNVcGRhdGVGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKi0tLS0tLS0tLSByZXNpZHVhbC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBpbnRyYSBwY20gZGF0YSBhbmQgZmlsbCBpdCBpbiB0aGUgY29ycmVzcG9uZGluZyBsb2NhdGlvbgorICAgIG9uIHRoZSBjdXJyZW50IHBpY3R1cmUuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzcywgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGVycm9ycy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhUENNKEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBDQVZMQyBzeW50YXggZW5jb2Rpbmcgb24gdGhlIHJ1biBhbmQgbGV2ZWwgaW5mb3JtYXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgICBUaGUgbGV2ZWwgYW5kIHJ1biBhcnJheXMgYXJlIGVsZW1lbnRzIGluIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUsIHBvcHVsYXRlZCBieSBUcmFuc1F1YW50WlosCisgICAgVHJhbnNRdWFudEludHJhREMgYW5kIFRyYW5zUXVhbnRDaHJvbWFEQyBmdW5jdGlvbnMuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJ0eXBlIiAgICJPbmUgb2YgQVZDUmVzaWR1YWxUeXBlIGZvciBhIHBhcnRpY3VsYXIgNHg0IGJsb2NrLiIKKyAgICBccGFyYW0gImJpbmR4IiAgIkJsb2NrIGluZGV4IG9yIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBmb3IgQVZDX0ludHJhMTZEQyBhbmQgQVZDX0Nocm9tYURDIG1vZGUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgorICAgIFxOb3RlICAgIlRoaXMgZnVuY3Rpb24gaGFzIDMyLWJpdCBtYWNoaW5lIHNwZWNpZmljIGluc3RydWN0aW9uISEhISIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgZW5jX3Jlc2lkdWFsX2Jsb2NrKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSZXNpZHVhbFR5cGUgdHlwZSwgaW50IGJpbmR4LCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIpOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0gc2FkLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3loKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01hY3JvYmxvY2tfQyh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisKKyNpZmRlZiBIVEZNIC8qICAzLzIvMSwgSHlwb3RoZXNpcyBUZXN0aW5nIEZhc3QgTWF0Y2hpbmcgKi8KKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTXhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTXloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk14aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IVEZNX0NvbGxlY3QodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFRGTSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisjZW5kaWYKKworCisgICAgLyotLS0tLS0tLS0tLS0tIHNsaWNlLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtYWluIGVuY29kaW5nIGxvb3AgZm9yIGEgc2xpY2UuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIEFWQ0VOQ19QSUNUVVJFX1JFQURZIGZvciBlbmQtb2YtcGljdHVyZSBhbmQKKyAgICAgICAgICAgICBBVkNFTkNfRkFJTCBvciBBVkNFTkNfU0xJQ0VfRU1QVFkgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQVZDRW5jb2RlU2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbWFpbiBlbmNvZGluZyBvcGVyYXRpb24gZm9yIG9uZSBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAidmlkZW8iICJwb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIG9yIG90aGVyIGJpdHN0cmVhbSByZWxhdGVkIGZhaWx1cmUgc3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlTUIoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHByZWRpY3Rpb24gSU5UUkEvSU5URVIgZnVuY3Rpb25zLCB0cmFuc2Zvcm0sCisgICAgcXVhbnRpemF0aW9uIGFuZCB6aWd6YWcgc2Nhbm5pbmcgdG8gZ2V0IHRoZSBydW4tbGV2ZWwgc3ltYm9scy4KKyAgICBccGFyYW0gImVuY3ZpZCIgInBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ckwiICAgInBvaW50ZXIgdG8gTHVtYSBjb21wb25lbnQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgXHBhcmFtICJjdXJDYiIgICJwb2ludGVyIHRvIENiIGNvbXBvbmVudCBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICBccGFyYW0gImN1ckNyIiAgInBvaW50ZXIgdG8gQ3IgY29tcG9uZW50IG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIFxyZXR1cm4gInZvaWQgZm9yIG5vdy4iCisgICAgICovCisgICAgdm9pZCBNQlByZWRUcmFuc1F1YW50WlooQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJMLCB1aW50OCAqY3VyQ2IsIHVpbnQ4ICpjdXJDcik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgY29udGVudCBvZiB0aGUgcHJlZGljdGlvbiBNQiBpbnRvIHRoZSByZWNvbnN0cnVjdGVkIFlVVgorICAgIGZyYW1lIGRpcmVjdGx5LgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gWSBjb21wb25lbnQuIgorICAgIFxwYXJhbSAiY3VyQ2IiICAiUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gQ2IgY29tcG9uZW50LiIKKyAgICBccGFyYW0gImN1ckNyIiAgIlBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIENyIGNvbXBvbmVudC4iCisgICAgXHBhcmFtICJwcmVkQmxvY2siICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBNQi4iCisgICAgXHBhcmFtICJwaWNXaWR0aCIgICAiVGhlIHdpZHRoIG9mIHRoZSBmcmFtZS4iCisgICAgXHJldHVybiAiTm9uZS4iCisgICAgKi8KKyAgICB2b2lkIENvcHlfTUIodWludDggKmN1ckwsIHVpbnQ4ICpjdXJDYiwgdWludDggKmN1ckNyLCB1aW50OCAqcHJlZEJsb2NrLCBpbnQgcGljV2lkdGgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBtYl90eXBlLCBDQlAsIHByZWRpY3Rpb24gbW9kZSwgcmVmIGlkeCBhbmQgTVYuCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZU1CSGVhZGVyKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSByaWdodCBtYl90eXBlIGZvciBhIG1hY3JvYmxvY2sgZ2l2ZW4gdGhlIG1iTW9kZSwgQ0JQLAorICAgIE51bVBhcnQsIFByZWRQYXJ0TW9kZS4KKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic2xpY2VfdHlwZSIgIlZhbHVlIG9mIHRoZSBzbGljZV90eXBlLiIKKyAgICBccmV0dXJuICJtYl90eXBlLiIKKyAgICAqLworICAgIHVpbnQgSW50ZXJwcmV0TUJUeXBlKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHNsaWNlX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBtYl9wcmVkIHBhcnQgb2YgdGhlIG1hY3JvYmxvY2sgZGF0YS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0NvbW1vbk9iaiBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZmFpbCBzdGF0dXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBtYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBzdWJfbWJfcHJlZCBwYXJ0IG9mIHRoZSBtYWNyb2Jsb2NrIGRhdGEuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNDb21tb25PYmogc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGZhaWwgc3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgc3ViX21iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIHN1Yl9tYl90eXBlIGFuZCBzZXRzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgIHdoZW4gdGhlIHNsaWNlIHR5cGUgaXMgQVZDX1BfU0xJQ0UuCisgICAgaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgorICAgIFxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byBjdXJyZW50IEFWQ01hY3JvYmxvY2suIgorICAgIFxwYXJhbSAic3ViX21iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBJbnRlcnByZXRTdWJNQlR5cGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBzdWJfbWJfdHlwZSBhbmQgc2V0cyBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICB3aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19CX1NMSUNFLgorICAgIGluIHRoZSBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4KKyAgICBccGFyYW0gIm1ibG9jayIgIlBvaW50ZXIgdG8gY3VycmVudCBBVkNNYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInN1Yl9tYl90eXBlIiAiRnJvbSB0aGUgc3ludGF4IGJpdHN0cmVhbS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgSW50ZXJwcmV0U3ViTUJUeXBlQihBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBpbnRyYSA0eDQgbW9kZS4gSXQgY2FsY3VsYXRlcyB0aGUgcHJlZGljdGVkIEk0eDQgbW9kZSBhbmQgdGhlCisgICAgcmVtbmFudCB0byBiZSBlbmNvZGVkLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtIHNydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhNHg0TW9kZShBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLSB2bGNfZW5jb2RlLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBhbmQgd3JpdGVzIGEgdmFsdWUgaW50byBhbiBFeHAtR29sb21iIGNvZGV3b3JkLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiY29kZU51bSIgIlBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlTnVtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZXJyb3IgbWVzc2FnZXMgZm9yIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyB1ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBtYXBzIGFuZCBlbmNvZGVzIHNpZ25lZCBFeHAtR29sb21iIGNvZGVzLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAidmFsdWUiICAiUG9pbnRlciB0byBzeW50YXggZWxlbWVudCB2YWx1ZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyAgc2VfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgaW50IHZhbHVlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gbWFwcyBhbmQgZW5jb2RlcyB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2Rlcy4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInZhbHVlIiAgIlBvaW50ZXIgdG8gc3ludGF4IGVsZW1lbnQgdmFsdWUuIgorICAgIFxwYXJhbSAicmFuZ2UiICAiUmFuZ2Ugb2YgdGhlIHZhbHVlIGFzIGlucHV0IHRvIGRldGVybWluZSB0aGUgYWxnb3JpdGhtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHRlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgdmFsdWUsIHVpbnQgcmFuZ2UpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIEV4cC1Hb2xvbWIgY29kZXdvcmQgZnJvbSBjb2RlTnVtLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiY29kZU51bSIgIlBvaW50ZXIgdG8gdGhlIGNvZGVOdW0gdmFsdWUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGJpdHN0cmVhbSBlcnJvciBtZXNzYWdlcyBmb3IgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFNldEVHQml0c3RyaW5nKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBDQVZMQyBlbmNvZGluZyBvZiB0aGUgQ0JQIChjb2RlZCBibG9jayBwYXR0ZXJuKSBvZiBhIG1hY3JvYmxvY2sKKyAgICBieSBjYWxsaW5nIHVlX3YoKSBhbmQgdGhlbiBtYXBwaW5nIHRoZSBDQlAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVkxDIGNvZGVOdW0uCisgICAgXHBhcmFtICJjdXJyTUIiICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVDQlAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdHJhaWxpbmcgb25lcyBhbmQgdG90YWwgY29lZmZpY2llbnQuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVHJhaWxpbmdPbmVzIiAgICJUaGUgdHJhaWxpbmcgb25lIHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJuQyIgIkNvbnRleHQgZm9yIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50IChwcmVkaWN0aW9uIGNvbnRleHQpLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmLCBpbnQgbkMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRyYWlsaW5nIG9uZXMgYW5kIHRvdGFsIGNvZWZmaWNpZW50IGZvciBjaHJvbWEgREMgYmxvY2suCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVHJhaWxpbmdPbmVzIiAgICJUaGUgdHJhaWxpbmcgb25lIHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0b3RhbF96ZXJvcyB2YWx1ZSBhcyBpbiBUYWJsZSA5LTcgYW5kIDktOC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJUb3RhbFplcm9zIiAiVGhlIHRvdGFsX3plcm9zIHZhbHVlLiIKKyAgICBccGFyYW0gIlRvdGFsQ29lZmYiICJUaGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3MoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRvdGFsX3plcm9zIFZMQyBzeW50YXggZm9yIGNocm9tYSBEQyBhcyBpbiBUYWJsZSA5LTkuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVG90YWxaZXJvcyIgIlRoZSB0b3RhbF96ZXJvcyB2YWx1ZS4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbFplcm9zQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHJ1bl9iZWZvcmUgVkxDIHN5bnRheCBhcyBpbiBUYWJsZSA5LTEwLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInJ1bl9iZWZvcmUiICJUaGUgcnVuX2JlZm9yZSB2YWx1ZS4iCisgICAgXHBhcmFtICJ6ZXJvc0xlZnQiICAiVGhlIGNvbnRleHQgZm9yIG51bWJlciBvZiB6ZXJvcyBsZWZ0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1J1bkJlZm9yZShBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHJ1bl9iZWZvcmUsIGludCB6ZXJvc0xlZnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfQVZDRU5DX0xJQl9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApAQCAtMCwwICsxLDMzNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKyNkZWZpbmUgV09SRF9TSVpFIDMyCisKKy8qIGFycmF5IGZvciB0cmFpbGluZyBiaXQgcGF0dGVybiBhcyBmdW5jdGlvbiBvZiBudW1iZXIgb2YgYml0cyAqLworLyogdGhlIGZpcnN0IG9uZSBpcyB1bnVzZWQuICovCitjb25zdCBzdGF0aWMgdWludDggdHJhaWxpbmdfYml0c1s5XSA9IHswLCAweDEsIDB4MiwgMHg0LCAweDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbUluaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQb3B1bGF0ZSBiaXRzdHJlYW0gc3RydWN0dXJlIHdpdGggYml0c3RyZWFtIGJ1ZmZlciBhbmQgc2l6ZSAgKi8KKy8qICAgICAgICAgICAgIGl0IGFsc28gaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19GQUlMIGlmIGZhaWxlZC4gICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS1+fn5+fi0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfAorICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF53cml0ZV9wb3MgICAgICAgICAgXmJ1Zl9zaXplCisgICBiaXRzdHJlYW1CdWZmZXIgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkCisKKyAgIHwtLS0tLXh4eHh4eHh4eHh4eHh8ICA9IGN1cnJlbnRfd29yZCAzMiBvciAxNiBiaXRzCisgICAgPC0tLS0+CisgICAgIGJpdF9sZWZ0CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK0FWQ0VuY19TdGF0dXMgQml0c3RyZWFtRW5jSW5pdChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgdWludDggKmJ1ZmZlciwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdmVycnVuQnVmZmVyLCBpbnQgb0JTaXplKQoreworICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZfc2l6ZSA8PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19CSVRTVFJFQU1fSU5JVF9GQUlMOworICAgIH0KKworICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnVmZmVyOworCisgICAgc3RyZWFtLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgc3RyZWFtLT53cml0ZV9wb3MgPSAwOworCisgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisKKyAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IDA7CisKKyAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gV09SRF9TSVpFOworCisgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gb3ZlcnJ1bkJ1ZmZlcjsKKworICAgIHN0cmVhbS0+b0JTaXplID0gb0JTaXplOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogU2F2ZSB0aGUgY3VycmVudF93b3JkIGludG8gdGhlIGJ1ZmZlciwgYnl0ZS1zd2FwLCBhbmQgICAgICAgICovCisvKiAgICAgICAgICAgICAgYWRkIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGluc2VydGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfV1JJVEVfRkFJTCBpZiBidWZmZXIgaXMgICovCisvKiAgICAgICAgICAgICAgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVNhdmVXb3JkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIGludCBudW1fYml0czsKKyAgICB1aW50OCAqd3JpdGVfcG50LCBieXRlOworICAgIHVpbnQgY3VycmVudF93b3JkOworCisgICAgLyogY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIGluIGN1cnJlbnRfd29yZCwgbXVzdCBhbHdheXMgYmUgYnl0ZS1hbGlnbmVkISEhISAqLworICAgIG51bV9iaXRzID0gV09SRF9TSVpFIC0gc3RyZWFtLT5iaXRfbGVmdDsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICEhKi8KKworICAgIGlmIChzdHJlYW0tPmJ1Zl9zaXplIC0gc3RyZWFtLT53cml0ZV9wb3MgPD0gKG51bV9iaXRzID4+IDMpICsgMikgLyogMiBtb3JlIGJ5dGVzIGZvciBwb3NzaWJsZSBFUEJTICovCisgICAgeworICAgICAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gQVZDQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihzdHJlYW0sIChudW1fYml0cyA+PiAzKSArIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHdyaXRlIHdvcmQsIGJ5dGUtYnktYnl0ZSAqLworICAgIHdyaXRlX3BudCA9IHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICsgc3RyZWFtLT53cml0ZV9wb3M7CisgICAgY3VycmVudF93b3JkID0gc3RyZWFtLT5jdXJyZW50X3dvcmQ7CisgICAgd2hpbGUgKG51bV9iaXRzKSAvKiBubyBuZWVkIHRvIGNoZWNrIHN0cmVhbS0+YnVmX3NpemUgYW5kIHN0cmVhbS0+d3JpdGVfcG9zLCB0YWtlbiBjYXJlIGFscmVhZHkgKi8KKyAgICB7CisgICAgICAgIG51bV9iaXRzIC09IDg7CisgICAgICAgIGJ5dGUgPSAoY3VycmVudF93b3JkID4+IG51bV9iaXRzKSAmIDB4RkY7CisgICAgICAgIGlmIChieXRlICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IGJ5dGU7CisgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOworICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zKys7CisgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOworICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmNvdW50X3plcm9zID09IDIpCisgICAgICAgICAgICB7ICAgLyogZm9yIG51bV9iaXRzID0gMzIsIHRoaXMgY2FuIGFkZCAyIG1vcmUgYnl0ZXMgZXh0cmEgZm9yIEVQQlMgKi8KKyAgICAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSAweDM7CisgICAgICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc2V0IGN1cnJlbnRfd29yZCBhbmQgYml0X2xlZnQgKi8KKyAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IDA7CisgICAgc3RyZWFtLT5iaXRfbGVmdCA9IFdPUkRfU0laRTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1Xcml0ZUJpdHMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogV3JpdGUgdXAgdG8gbWFjaGluZSB3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBVbnVzZWQgYml0cyBpbiAnY29kZScgbXVzdCBiZSBhbGwgemVyb3MuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZUJpdHMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBuQml0cywgdWludCBjb2RlKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgaW50IGJpdF9sZWZ0ID0gc3RyZWFtLT5iaXRfbGVmdDsKKyAgICB1aW50IGN1cnJlbnRfd29yZCA9IHN0cmVhbS0+Y3VycmVudF93b3JkOworCisgICAgLy9ERUJVR19MT0codXNlckRhdGEsQVZDX0xPR1RZUEVfSU5GTywiQml0c3RyZWFtV3JpdGVCaXRzIixuQml0cywtMSk7CisKKyAgICBpZiAobkJpdHMgPiBXT1JEX1NJWkUpIC8qIGhhcyB0byBiZSB0YWtlbiBjYXJlIG9mIHNwZWNpYWxseSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOyAvKiBmb3Igbm93ICovCisgICAgICAgIC8qIG90aGVyd2lzZSwgYnJlYWsgaXQgZG93biB0byAyIHdyaXRlIG9mIGxlc3MgdGhhbiAxNiBiaXRzIGF0IGEgdGltZS4gKi8KKyAgICB9CisKKyAgICBpZiAobkJpdHMgPD0gYml0X2xlZnQpIC8qIG1vcmUgYml0cyBsZWZ0IGluIGN1cnJlbnRfd29yZCAqLworICAgIHsKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IG5CaXRzKSB8IGNvZGU7CisgICAgICAgIHN0cmVhbS0+Yml0X2xlZnQgLT0gbkJpdHM7CisgICAgICAgIGlmIChzdHJlYW0tPmJpdF9sZWZ0ID09IDApIC8qIHByZXBhcmUgZm9yIHRoZSBuZXh0IHdvcmQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IGJpdF9sZWZ0KSB8IChjb2RlID4+IChuQml0cyAtIGJpdF9sZWZ0KSk7CisKKyAgICAgICAgbkJpdHMgLT0gYml0X2xlZnQ7CisKKyAgICAgICAgc3RyZWFtLT5iaXRfbGVmdCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsgLyogc2F2ZSBjdXJyZW50IHdvcmQgKi8KKworICAgICAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gV09SRF9TSVpFIC0gbkJpdHM7CisKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSBjb2RlOyAvKiBubyBleHRyYSBtYXNraW5nIGZvciBjb2RlLCBtdXN0IGJlIGhhbmRsZWQgYmVmb3JlIHNhdmluZyAqLworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1Xcml0ZTFCaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMzAvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogV3JpdGUgMSBiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBVbnVzZWQgYml0cyBpbiAnY29kZScgbXVzdCBiZSBhbGwgemVyb3MuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZTFCaXQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgY29kZSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGN1cnJlbnRfd29yZCA9IHN0cmVhbS0+Y3VycmVudF93b3JkOworCisgICAgLy9ERUJVR19MT0codXNlckRhdGEsQVZDX0xPR1RZUEVfSU5GTywiQml0c3RyZWFtV3JpdGUxQml0Iixjb2RlLC0xKTsKKworICAgIC8vaWYoMSA8PSBiaXRfbGVmdCkgLyogbW9yZSBiaXRzIGxlZnQgaW4gY3VycmVudF93b3JkICovCisgICAgLyogd2UgY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGFsd2F5cyBiZSBwb3NpdGl2ZSBiaXRfbGVmdCBpbiB0aGUgY3VycmVudCB3b3JkICovCisgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IDEpIHwgY29kZTsKKyAgICBzdHJlYW0tPmJpdF9sZWZ0LS07CisgICAgaWYgKHN0cmVhbS0+Yml0X2xlZnQgPT0gMCkgLyogcHJlcGFyZSBmb3IgdGhlIG5leHQgd29yZCAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMzEvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQWRkIHRyYWlsaW5nIGJpdHMgYW5kIHJlcG9ydCB0aGUgZmluYWwgRUJTUCBzaXplLiAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKm5hbF9zaXplKQoreworICAgICh2b2lkKShuYWxfc2l6ZSk7CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgYml0X2xlZnQgPSBiaXRzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgYml0X2xlZnQgJj0gMHg3OyAvKiBtb2R1bG8gYnkgOCAqLworICAgIGlmIChiaXRfbGVmdCA9PSAwKSBiaXRfbGVmdCA9IDg7CisgICAgLyogYml0c3RyZWFtLT5iaXRfbGVmdCA9PSAwIGNhbm5vdCBoYXBwZW4gaGVyZSBzaW5jZSBpdCB3b3VsZCBoYXZlIGJlZW4gU2F2ZWQgYWxyZWFkeSAqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgYml0X2xlZnQsIHRyYWlsaW5nX2JpdHNbYml0X2xlZnRdKTsKKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIGlmIGl0J3Mgbm90IHNhdmVkLCBzYXZlIGl0LiAqLworICAgIC8vaWYoYml0c3RyZWFtLT5iaXRfbGVmdDwoV09SRF9TSVpFPDwzKSkgLyogaW4gZmFjdCwgbm8gbmVlZCB0byBjaGVjayAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoYml0c3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBjaGVjayB3aGV0aGVyIGl0J3MgYnl0ZS1hbGlnbmVkICovCitib29sIGJ5dGVfYWxpZ25lZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBpZiAoc3RyZWFtLT5iaXRfbGVmdCAlIDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0cnVlOworfQorCisKKy8qIGRldGVybWluZSB3aGV0aGVyIG92ZXJydW4gYnVmZmVyIGNhbiBiZSB1c2VkIG9yIG5vdCAqLworQVZDRW5jX1N0YXR1cyBBVkNCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBpbnQgbnVtRXh0cmFCeXRlcykKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKXN0cmVhbS0+ZW5jdmlkOworCisgICAgaWYgKHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciAhPSBOVUxMKSAvLyBvdmVycnVuQnVmZmVyIGlzIHNldAorICAgIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICE9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcikgLy8gbm90IGFscmVhZHkgdXNlZAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzID49IHN0cmVhbS0+b0JTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplID0gc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzICsgMTAwOworICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplICY9ICh+MHgzKTsgLy8gbWFrZSBpdCBtdWx0aXBsZSBvZiA0CisKKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBuZXcgb3ZlcnJ1biBCdWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX0ZyZWUoKHVpbnQzMiopZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSAodWludDgqKSBlbmN2aWQtPmF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSwgREVGQVVMVF9BVFRSKTsKKworICAgICAgICAgICAgICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGV2ZXJ5dGhpbmcgdG8gb3ZlcnJ1biBidWZmZXIgYW5kIHN0YXJ0IHVzaW5nIGl0LgorICAgICAgICAgICAgbWVtY3B5KHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIsIHN0cmVhbS0+d3JpdGVfcG9zKTsKKyAgICAgICAgICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5idWZfc2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gb3ZlcnJ1biBidWZmZXIgaXMgYWxyZWFkeSB1c2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplID0gc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzICsgMTAwOworICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgJj0gKH4weDMpOyAvLyBtYWtlIGl0IG11bHRpcGxlIG9mIDQKKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IG92ZXJydW4gYnVmZmVyCisgICAgICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gKHVpbnQ4KikgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSwgREVGQVVMVF9BVFRSKTsKKworICAgICAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyBjb3B5IGZyb20gdGhlIG9sZCBidWZmZXIgdG8gbmV3IGJ1ZmZlcgorICAgICAgICAgICAgbWVtY3B5KGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5vdmVycnVuQnVmZmVyLCBzdHJlYW0tPndyaXRlX3Bvcyk7CisgICAgICAgICAgICAvLyBmcmVlIG9sZCBidWZmZXIKKyAgICAgICAgICAgIGVuY3ZpZC0+YXZjSGFuZGxlLT5DQkFWQ19GcmVlKCh1aW50MzIqKWVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc3RyZWFtLT5vdmVycnVuQnVmZmVyKTsKKworICAgICAgICAgICAgLy8gYXNzaWduIHBvaW50ZXIgdG8gbmV3IGJ1ZmZlcgorICAgICAgICAgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gZW5jdmlkLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBzdHJlYW0tPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICBzdHJlYW0tPmJ1Zl9zaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UgLy8gb3ZlcnJ1bkJ1ZmZlciBpcyBub3QgZW5hYmxlLgorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgIH0KKworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2Jsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9ibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMjZhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9ibG9jay5jcHAKQEAgLTAsMCArMSwxMjgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworLyogc3VidHJhY3Qgd2l0aCB0aGUgcHJlZGljdGlvbiBhbmQgZG8gdHJhbnNmb3JtYXRpb24gKi8KK3ZvaWQgdHJhbnModWludDggKmN1ciwgaW50IHBpdGNoLCB1aW50OCAqcHJlZEJsb2NrLCBpbnQxNiAqZGF0YUJsb2NrKQoreworICAgIGludDE2ICpwdHIgPSBkYXRhQmxvY2s7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqOworICAgIGludCBjdXJwaXRjaCA9ICh1aW50KXBpdGNoID4+IDE2OworICAgIGludCBwcmVkcGl0Y2ggPSAocGl0Y2ggJiAweEZGRkYpOworCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSBmaXJzdCAqLworICAgICAgICByMCA9IGN1clswXSAtIHByZWRCbG9ja1swXTsKKyAgICAgICAgcjEgPSBjdXJbMV0gLSBwcmVkQmxvY2tbMV07CisgICAgICAgIHIyID0gY3VyWzJdIC0gcHJlZEJsb2NrWzJdOworICAgICAgICByMyA9IGN1clszXSAtIHByZWRCbG9ja1szXTsKKworICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICByMyA9IHIwIC0gKHIzIDw8IDEpOyAgICAvL3B0clswXSAtIHB0clszXTsKKyAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICAvL3B0clsxXSArIHB0clsyXTsKKyAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgcHRyWzBdID0gcjAgKyByMTsKKyAgICAgICAgcHRyWzJdID0gcjAgLSByMTsKKyAgICAgICAgcHRyWzFdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIHB0clszXSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIHB0ciArPSAxNjsKKyAgICAgICAgcHJlZEJsb2NrICs9IHByZWRwaXRjaDsKKyAgICAgICAgY3VyICs9IGN1cnBpdGNoOworICAgICAgICBqLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsICovCisgICAgcHRyID0gZGF0YUJsb2NrOworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIHIwID0gcHRyWzBdICsgcHRyWzQ4XTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbNDhdOworICAgICAgICByMSA9IHB0clsxNl0gKyBwdHJbMzJdOworICAgICAgICByMiA9IHB0clsxNl0gLSBwdHJbMzJdOworCisgICAgICAgIHB0clswXSA9IHIwICsgcjE7CisgICAgICAgIHB0clszMl0gPSByMCAtIHIxOworICAgICAgICBwdHJbMTZdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIHB0cls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBwdHIrKzsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogZG8gcmVzaWR1ZSB0cmFuc2Zvcm0gcXVhbnQgaW52cXVhbnQsIGludnRyYW5zIGFuZCB3cml0ZSBvdXRwdXQgb3V0ICovCitpbnQgZGN0X2x1bWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcsIGludCAqY29lZl9jb3N0KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQxNiAqY29lZiA9IHZpZGVvLT5ibG9jazsKKyAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOyAvLyBzaXplIDE2IGZvciBhIDR4NCBibG9jaworICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqLCBrLCBpZHg7CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgUXEsIFJxLCBxX2JpdHMsIHFwX2NvbnN0LCBxdWFudDsKKyAgICBpbnQgZGF0YSwgbGV2LCB6ZXJvX3J1bjsKKyAgICBpbnQgbnVtY29lZmY7CisKKyAgICBjb2VmICs9ICgoYmxraWR4ICYgMHgzKSA8PCAyKSArICgoYmxraWR4ID4+IDIpIDw8IDYpOyAvKiBwb2ludCB0byB0aGUgNHg0IGJsb2NrICovCisKKyAgICAvKiBmaXJzdCB0YWtlIGEgNHg0IHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJlc2lkdWUgZmlyc3QgKi8KKyAgICAgICAgcjAgPSBvcmdbMF0gLSBwcmVkWzBdOyAgIC8qIE9QVElNSVpFQUJMRSAqLworICAgICAgICByMSA9IG9yZ1sxXSAtIHByZWRbMV07CisgICAgICAgIHIyID0gb3JnWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgcjMgPSBvcmdbM10gLSBwcmVkWzNdOworCisgICAgICAgIHIwICs9IHIzOyAgICAgICAgICAgLy9wdHJbMF0gKyBwdHJbM107CisgICAgICAgIHIzID0gcjAgLSAocjMgPDwgMSk7ICAgIC8vcHRyWzBdIC0gcHRyWzNdOworICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICByMiA9IHIxIC0gKHIyIDw8IDEpOyAgICAvL3B0clsxXSAtIHB0clsyXTsKKworICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgY29lZlsyXSA9IHIwIC0gcjE7CisgICAgICAgIGNvZWZbMV0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgY29lZlszXSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgICAgIHByZWQgKz0gcHJlZF9waXRjaDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIGNvZWYgLT0gNjQ7CisgICAgcHJlZCAtPSAocHJlZF9waXRjaCA8PCAyKTsKKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApICAgLyogT1BUSU1JWkFCTEUgKi8KKyAgICB7CisgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNDhdOworICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzQ4XTsKKyAgICAgICAgcjEgPSBjb2VmWzE2XSArIGNvZWZbMzJdOworICAgICAgICByMiA9IGNvZWZbMTZdIC0gY29lZlszMl07CisKKyAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgIGNvZWZbMzJdID0gcjAgLSByMTsKKyAgICAgICAgY29lZlsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgY29lZls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBjb2VmKys7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICBjb2VmIC09IDQ7CisKKyAgICAvKiBxdWFudCAqLworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtyYXMyZGVjW2Jsa2lkeF1dOworICAgIHJ1biA9IGVuY3ZpZC0+cnVuW3JhczJkZWNbYmxraWR4XV07CisKKyAgICBScSA9IHZpZGVvLT5RUHlfbW9kXzY7CisgICAgUXEgPSB2aWRlby0+UVB5X2Rpdl82OworICAgIHFwX2NvbnN0ID0gZW5jdmlkLT5xcF9jb25zdDsKKyAgICBxX2JpdHMgPSAxNSArIFFxOworCisgICAgemVyb19ydW4gPSAwOworICAgIG51bWNvZWZmID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKyAgICB7CisgICAgICAgIGlkeCA9IFpaX1NDQU5fQkxPQ0tba107IC8qIG1hcCBiYWNrIHRvIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1ba107CisgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSBxX2JpdHM7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpjb2VmX2Nvc3QgKz0gKChsZXYgPiAxKSA/IE1BWF9WQUxVRSA6IENPRUZGX0NPU1RbRElTQUJMRV9USFJFU0hPTERJTkddW3plcm9fcnVuXSk7CisKKyAgICAgICAgICAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVtrXTsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtudW1jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKGxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtudW1jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9ICgtbGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW251bWNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+Y3Vyck1CLT5tYl9pbnRyYSkgLy8gb25seSBkbyBpbnZlcnNlIHRyYW5zZm9ybSB3aXRoIGludHJhIGJsb2NrCisgICAgeworICAgICAgICBpZiAobnVtY29lZmYpIC8qIHRoZW4gZG8gaW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkgLyogaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pIC8qIHZlcnRpY2FsLCBoYXMgdG8gYmUgZG9uZSBhZnRlciBob3Jpem9udGFsICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlszMl07CisgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisKKyAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMiA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjMgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKHIzID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKworICAgICAgICAgICAgICAgICpjdXIgPSByMDsKKyAgICAgICAgICAgICAgICAqKGN1ciArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAqKGN1ciArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICBjdXJbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgY3VyIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgICAgICBwcmVkIC09IChwcmVkX3BpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgIHByZWQrKzsKKyAgICAgICAgICAgICAgICBjb2VmKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgLy8gY29weSBmcm9tIHByZWQgdG8gY3VyCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopY3VyKSA9ICooKHVpbnQzMiopcHJlZCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXIgKz0gcGl0Y2gpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gcHJlZF9waXRjaCkpOworICAgICAgICAgICAgKigodWludDMyKikoY3VyICs9IHBpdGNoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IHByZWRfcGl0Y2gpKTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ciArPSBwaXRjaCkpID0gKigodWludDMyKikocHJlZCArPSBwcmVkX3BpdGNoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtY29lZmY7Cit9CisKKwordm9pZCBNQkludGVySWRjdChBVkNDb21tb25PYmogKnZpZGVvLCB1aW50OCAqY3VyTCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgcGljUGl0Y2gpCit7CisgICAgaW50MTYgKmNvZWYsICpjb2VmOCA9IHZpZGVvLT5ibG9jazsKKyAgICB1aW50OCAqY3VyOyAgLy8gdGhlIHNhbWUgYXMgY3VyTAorICAgIGludCBiOCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqLCBibGtpZHg7CisKKyAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgIHsKKyAgICAgICAgY3VyID0gY3VyTDsKKyAgICAgICAgY29lZiA9IGNvZWY4OworCisgICAgICAgIGlmIChjdXJyTUItPkNCUCYoMSA8PCBiOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVtiNF07CisgICAgICAgICAgICAgICAgLyogZG8gSURDVCAqLworICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiBob3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb2VmIC09IDY0OworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiB2ZXJ0aWNhbCwgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxNl0gKyAoY29lZls0OF0gPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gY3VyWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmN1ciA9IHIwOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKGN1ciArPSBwaWNQaXRjaCkgKyAocjEgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICAqY3VyID0gcjE7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICooY3VyICs9IHBpY1BpdGNoKSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXIgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gY3VyW3BpY1BpdGNoXSArIChyMyA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cltwaWNQaXRjaF0gPSByMzsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3VyIC09IChwaWNQaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cisrOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1ciAtPSA0OworICAgICAgICAgICAgICAgICAgICBjb2VmIC09IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiNCYxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9ICgocGljUGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSA2MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYjgmMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSAoKHBpY1BpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgICAgICBjb2VmOCArPSAxMjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9IDg7CisgICAgICAgICAgICBjb2VmOCArPSA4OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogcGVyZm9ybWEgZGN0LCBxdWFudCwgaXF1YW50LCBpZGN0IGZvciB0aGUgZW50aXJlIE1CICovCit2b2lkIGRjdF9sdW1hXzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyTCwgdWludDggKm9yZ0wpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50MTYgKmNvZWYgPSB2aWRlby0+YmxvY2s7CisgICAgdWludDggKnByZWQgPSBlbmN2aWQtPnByZWRfaTE2W2N1cnJNQi0+aTE2TW9kZV07CisgICAgaW50IGJsa194LCBibGtfeSwgaiwgaywgaWR4LCBiOCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBtMCwgbTEsIG0yICwgbTM7CisgICAgaW50IGRhdGEsIGxldjsKKyAgICBpbnQgKmxldmVsLCAqcnVuLCB6ZXJvX3J1biwgbmNvZWZmOworICAgIGludCBScSwgUXEsIHF1YW50LCBxX2JpdHMsIHFwX2NvbnN0OworICAgIGludCBvZmZzZXRfY3VyWzRdLCBvZmZzZXRfcHJlZFs0XSwgb2Zmc2V0OworCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGZvciAoaiA9IDE2OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChibGtfeCA9IDQ7IGJsa194ID4gMDsgYmxrX3gtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgICAgICByMCA9ICpvcmdMKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjEgPSAqb3JnTCsrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIyID0gKm9yZ0wrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMyA9ICpvcmdMKysgLSAqcHJlZCsrOworCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgICAgICpjb2VmKysgPSByMCArIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgKmNvZWYrKyA9IHIwIC0gcjE7CisgICAgICAgICAgICAqY29lZisrID0gcjMgLSAocjIgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgb3JnTCArPSAob3JnX3BpdGNoIC0gMTYpOworICAgIH0KKyAgICBwcmVkIC09IDI1NjsKKyAgICBjb2VmIC09IDI1NjsKKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIGZvciAoYmxrX3kgPSA0OyBibGtfeSA+IDA7IGJsa195LS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZls0OF07CisgICAgICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgIHIxID0gY29lZlsxNl0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgIHIyID0gY29lZlsxNl0gLSBjb2VmWzMyXTsKKworICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgICAgICBjb2VmWzMyXSA9IHIwIC0gcjE7CisgICAgICAgICAgICBjb2VmWzE2XSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgY29lZls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICAgICAgY29lZisrOworICAgICAgICB9CisgICAgICAgIGNvZWYgKz0gNDg7CisgICAgfQorCisgICAgLyogdGhlbiBwZXJmb3JtIERDIHRyYW5zZm9ybSAqLworICAgIGNvZWYgLT0gMjU2OworICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzEyXTsKKyAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZlsxMl07CisgICAgICAgIHIxID0gY29lZls0XSArIGNvZWZbOF07CisgICAgICAgIHIyID0gY29lZls0XSAtIGNvZWZbOF07CisKKyAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgIGNvZWZbOF0gPSByMCAtIHIxOworICAgICAgICBjb2VmWzRdID0gcjMgKyByMjsKKyAgICAgICAgY29lZlsxMl0gPSByMyAtIHIyOworICAgICAgICBjb2VmICs9IDY0OworICAgIH0KKyAgICBjb2VmIC09IDI1NjsKKyAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsxOTJdOworICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzE5Ml07CisgICAgICAgIHIxID0gY29lZls2NF0gKyBjb2VmWzEyOF07CisgICAgICAgIHIyID0gY29lZls2NF0gLSBjb2VmWzEyOF07CisKKyAgICAgICAgY29lZlswXSA9IChyMCArIHIxKSA+PiAxOworICAgICAgICBjb2VmWzEyOF0gPSAocjAgLSByMSkgPj4gMTsKKyAgICAgICAgY29lZls2NF0gPSAocjMgKyByMikgPj4gMTsKKyAgICAgICAgY29lZlsxOTJdID0gKHIzIC0gcjIpID4+IDE7CisgICAgICAgIGNvZWYgKz0gNDsKKyAgICB9CisKKyAgICBjb2VmIC09IDE2OworICAgIC8vIHRoZW4gcXVhbnRpemUgREMKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxkYzsKKyAgICBydW4gPSBlbmN2aWQtPnJ1bmRjOworCisgICAgUnEgPSB2aWRlby0+UVB5X21vZF82OworICAgIFFxID0gdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdWzBdOworICAgIHFfYml0cyA9IDE1ICsgUXE7CisgICAgcXBfY29uc3QgPSBlbmN2aWQtPnFwX2NvbnN0OworCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgeworICAgICAgICBpZHggPSBaSUdaQUcyUkFTVEVSRENba107CisgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgIGlmIChkYXRhID4gMCkgICAvLyBxdWFudAorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KSAvLyBkZXF1YW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpbnZlcnNlIHRyYW5zZm9ybSBEQyAqLworICAgIGVuY3ZpZC0+bnVtY29lZmRjID0gbmNvZWZmOworICAgIGlmIChuY29lZmYpCisgICAgeworICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1bMF07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls0XTsKKyAgICAgICAgICAgIG0xID0gY29lZlswXSAtIGNvZWZbNF07CisgICAgICAgICAgICBtMiA9IGNvZWZbOF0gKyBjb2VmWzEyXTsKKyAgICAgICAgICAgIG0zID0gY29lZls4XSAtIGNvZWZbMTJdOworCisKKyAgICAgICAgICAgIGNvZWZbMF0gPSBtMCArIG0yOworICAgICAgICAgICAgY29lZls0XSA9IG0wIC0gbTI7CisgICAgICAgICAgICBjb2VmWzhdID0gbTEgLSBtMzsKKyAgICAgICAgICAgIGNvZWZbMTJdID0gbTEgKyBtMzsKKyAgICAgICAgICAgIGNvZWYgKz0gNjQ7CisgICAgICAgIH0KKworICAgICAgICBjb2VmIC09IDI1NjsKKworICAgICAgICBpZiAoUXEgPj0gMikgIC8qIHRoaXMgd2F5IHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBKTSAqLworICAgICAgICB7ICAgICAgICAgICAvKiB0aGV5IHVzZSAoKChtNCpzY2FsZSk8PChRUHkvNikpKzIpPj4yIGZvciBib3RoIGNhc2VzLiAqLworICAgICAgICAgICAgUXEgLT0gMjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls2NF07CisgICAgICAgICAgICAgICAgbTEgPSBjb2VmWzBdIC0gY29lZls2NF07CisgICAgICAgICAgICAgICAgbTIgPSBjb2VmWzEyOF0gKyBjb2VmWzE5Ml07CisgICAgICAgICAgICAgICAgbTMgPSBjb2VmWzEyOF0gLSBjb2VmWzE5Ml07CisKKyAgICAgICAgICAgICAgICBjb2VmWzBdID0gKChtMCArIG0yKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmWzY0XSA9ICgobTAgLSBtMikgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgY29lZlsxMjhdID0gKChtMSAtIG0zKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmWzE5Ml0gPSAoKG0xICsgbTMpICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFFxICs9IDI7IC8qIHJlc3RvcmUgdGhlIHZhbHVlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRcSA9IDIgLSBRcTsKKyAgICAgICAgICAgIG9mZnNldCA9IDEgPDwgKFFxIC0gMSk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls2NF07CisgICAgICAgICAgICAgICAgbTEgPSBjb2VmWzBdIC0gY29lZls2NF07CisgICAgICAgICAgICAgICAgbTIgPSBjb2VmWzEyOF0gKyBjb2VmWzE5Ml07CisgICAgICAgICAgICAgICAgbTMgPSBjb2VmWzEyOF0gLSBjb2VmWzE5Ml07CisKKyAgICAgICAgICAgICAgICBjb2VmWzBdID0gKCgobTAgKyBtMikgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWZbNjRdID0gKCgobTAgLSBtMikgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWZbMTI4XSA9ICgoKG0xIC0gbTMpICogcXVhbnQgKyBvZmZzZXQpID4+IFFxKTsKKyAgICAgICAgICAgICAgICBjb2VmWzE5Ml0gPSAoKChtMSArIG0zKSAqIHF1YW50ICsgb2Zmc2V0KSA+PiBRcSk7CisgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUXEgPSAyIC0gUXE7IC8qIHJlc3RvcmUgdGhlIHZhbHVlICovCisgICAgICAgIH0KKyAgICAgICAgY29lZiAtPSAxNjsgLyogYmFjayB0byB0aGUgb3JpZ2luICovCisgICAgfQorCisgICAgLyogbm93IHppZ3phZyBzY2FuIGFjIGNvZWZzLCBxdWFudCwgaXF1YW50IGFuZCBpdHJhbnMgKi8KKyAgICBydW4gPSBlbmN2aWQtPnJ1blswXTsKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbMF07CisKKyAgICAvKiBvZmZzZXQgYnR3IDR4NCBibG9jayAqLworICAgIG9mZnNldF9jdXJbMF0gPSAwOworICAgIG9mZnNldF9jdXJbMV0gPSAocGl0Y2ggPDwgMikgLSA4OworCisgICAgLyogb2Zmc2V0IGJ0dyA4eDggYmxvY2sgKi8KKyAgICBvZmZzZXRfY3VyWzJdID0gOCAtIChwaXRjaCA8PCAzKTsKKyAgICBvZmZzZXRfY3VyWzNdID0gLTg7CisKKyAgICAvKiBzaW1pbGFybHkgZm9yIHByZWQgKi8KKyAgICBvZmZzZXRfcHJlZFswXSA9IDA7CisgICAgb2Zmc2V0X3ByZWRbMV0gPSA1NjsKKyAgICBvZmZzZXRfcHJlZFsyXSA9IC0xMjA7CisgICAgb2Zmc2V0X3ByZWRbM10gPSAtODsKKworICAgIGN1cnJNQi0+Q0JQID0gMDsKKworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgIG5jb2VmZiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCAxNjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlkeCA9IFpaX1NDQU5fQkxPQ0tba107IC8qIG1hcCBiYWNrIHRvIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgICAgICAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgICAgICAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdW2tdOworICAgICAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldiA+Pj0gcV9iaXRzOworICAgICAgICAgICAgICAgIGlmIChsZXYpCisgICAgICAgICAgICAgICAgeyAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAobGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAoLWxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxrSWR4MmJsa1hZW2I4XVtiNF1dID0gbmNvZWZmOyAvKiBpbiByYXN0ZXIgc2NhbiAhISEgKi8KKyAgICAgICAgICAgIGlmIChuY29lZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDEgPDwgYjgpOworCisgICAgICAgICAgICAgICAgLy8gZG8gaW52ZXJzZSB0cmFuc2Zvcm0gaGVyZQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzFdICsgKGNvZWZbM10gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgICAgICBjb2VmWzJdID0gcjEgLSByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzE2XSA+PiAxKSAtIGNvZWZbNDhdOworICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgICAgICByMyA9IChyMCAtIChyMyA8PCAxKSk7IC8qIHIwLXIzICovCisgICAgICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgICAgIHIwICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIzICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSBwcmVkWzE2XSArIChyMSA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMiA9IHByZWRbMzJdICsgKHIyID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFs0OF0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckwgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJMICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckxbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckwgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJMKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8vIGRvIERDLW9ubHkgaW52ZXJzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0wID0gY29lZlswXSArIDMyOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMSA9IHByZWRbMTZdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFszMl0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjMgPSBwcmVkWzQ4XSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyTCA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyTCArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyTFtwaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyTCAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckwrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1biArPSAxNjsgIC8vIGZvbGxvdyBjb2Rpbmcgb3JkZXIKKyAgICAgICAgICAgIGxldmVsICs9IDE2OworICAgICAgICAgICAgY3VyTCArPSBvZmZzZXRfY3VyW2I0JjFdOworICAgICAgICAgICAgcHJlZCArPSBvZmZzZXRfcHJlZFtiNCYxXTsKKyAgICAgICAgICAgIGNvZWYgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgIH0KKworICAgICAgICBjdXJMICs9IG9mZnNldF9jdXJbMiArIChiOCYxKV07CisgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbMiArIChiOCYxKV07CisgICAgICAgIGNvZWYgKz0gb2Zmc2V0X3ByZWRbMiArIChiOCYxKV07CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIGRjdF9jaHJvbWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJDLCB1aW50OCAqb3JnQywgaW50IGNyKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBvcmdfcGl0Y2ggPSAoZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoKSA+PiAxOworICAgIGludCBwaXRjaCA9ICh2aWRlby0+Y3VyclBpYy0+cGl0Y2gpID4+IDE7CisgICAgaW50IHByZWRfcGl0Y2ggPSAxNjsKKyAgICBpbnQxNiAqY29lZiA9IHZpZGVvLT5ibG9jayArIDI1NjsKKyAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOworICAgIGludCBqLCBibGtfeCwgYmxrX3ksIGssIGlkeCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBtMDsKKyAgICBpbnQgUXEsIFJxLCBxcF9jb25zdCwgcV9iaXRzLCBxdWFudDsKKyAgICBpbnQgKmxldmVsLCAqcnVuLCB6ZXJvX3J1biwgbmNvZWZmOworICAgIGludCBkYXRhLCBsZXY7CisgICAgaW50IG9mZnNldF9jdXJbMl0sIG9mZnNldF9wcmVkWzJdLCBvZmZzZXRfY29lZlsyXTsKKyAgICB1aW50OCBuel90ZW1wWzRdOworICAgIGludCAgY29lZmZfY29zdDsKKworICAgIGlmIChjcikKKyAgICB7CisgICAgICAgIGNvZWYgKz0gODsKKyAgICAgICAgcHJlZCArPSA4OworICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhID09IDApIC8vIGludGVyIG1vZGUKKyAgICB7CisgICAgICAgIHByZWQgPSBjdXJDOworICAgICAgICBwcmVkX3BpdGNoID0gcGl0Y2g7CisgICAgfQorCisgICAgLyogZG8gNHg0IHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBmb3IgKGogPSA4OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChibGtfeCA9IDI7IGJsa194ID4gMDsgYmxrX3gtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgICAgICByMCA9ICpvcmdDKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjEgPSAqb3JnQysrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIyID0gKm9yZ0MrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMyA9ICpvcmdDKysgLSAqcHJlZCsrOworCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgICAgICpjb2VmKysgPSByMCArIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgKmNvZWYrKyA9IHIwIC0gcjE7CisgICAgICAgICAgICAqY29lZisrID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgfQorICAgICAgICBjb2VmICs9IDg7IC8vIGNvZWYgcGl0Y2ggaXMgMTYKKyAgICAgICAgcHJlZCArPSAocHJlZF9waXRjaCAtIDgpOyAvLyBwcmVkX3BpdGNoIGlzIDE2CisgICAgICAgIG9yZ0MgKz0gKG9yZ19waXRjaCAtIDgpOworICAgIH0KKyAgICBwcmVkIC09IChwcmVkX3BpdGNoIDw8IDMpOworICAgIGNvZWYgLT0gMTI4OworICAgIC8qIHZlcnRpY2FsICovCisgICAgZm9yIChibGtfeSA9IDI7IGJsa195ID4gMDsgYmxrX3ktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDg7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNDhdOworICAgICAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZls0OF07CisgICAgICAgICAgICByMSA9IGNvZWZbMTZdICsgY29lZlszMl07CisgICAgICAgICAgICByMiA9IGNvZWZbMTZdIC0gY29lZlszMl07CisKKyAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICAgICAgY29lZlszMl0gPSByMCAtIHIxOworICAgICAgICAgICAgY29lZlsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgICAgIGNvZWZbNDhdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgfQorICAgICAgICBjb2VmICs9IDU2OworICAgIH0KKyAgICAvKiB0aGVuIHBlcmZvcm0gREMgdHJhbnNmb3JtICovCisgICAgY29lZiAtPSAxMjg7CisKKyAgICAvKiAyeDIgdHJhbnNmb3JtIG9mIERDIGNvbXBvbmVudHMqLworICAgIHIwID0gY29lZlswXTsKKyAgICByMSA9IGNvZWZbNF07CisgICAgcjIgPSBjb2VmWzY0XTsKKyAgICByMyA9IGNvZWZbNjhdOworCisgICAgY29lZlswXSA9IHIwICsgcjEgKyByMiArIHIzOworICAgIGNvZWZbNF0gPSByMCAtIHIxICsgcjIgLSByMzsKKyAgICBjb2VmWzY0XSA9IHIwICsgcjEgLSByMiAtIHIzOworICAgIGNvZWZbNjhdID0gcjAgLSByMSAtIHIyICsgcjM7CisKKyAgICBRcSAgICA9IHZpZGVvLT5RUGNfZGl2XzY7CisgICAgUnEgICAgPSB2aWRlby0+UVBjX21vZF82OworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzICAgID0gMTUgKyBRcTsKKyAgICBxcF9jb25zdCA9IGVuY3ZpZC0+cXBfY29uc3RfYzsKKworICAgIHplcm9fcnVuID0gMDsKKyAgICBuY29lZmYgPSAwOworICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjICsgKGNyIDw8IDIpOworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYyArIChjciA8PCAyKTsKKworICAgIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKyAgICB7CisgICAgICAgIGlkeCA9ICgoayA+PiAxKSA8PCA2KSArICgoayAmIDEpIDw8IDIpOworICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPm51bWNvZWZjZGNbY3JdID0gbmNvZWZmOworCisgICAgaWYgKG5jb2VmZikKKyAgICB7CisgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IDQpOyAvLyBEQyBwcmVzZW50CisgICAgICAgIC8vIGRvIGludmVyc2UgdHJhbnNmb3JtCisgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVswXTsKKworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzRdOworICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzRdOworICAgICAgICByMiA9IGNvZWZbNjRdICsgY29lZls2OF07CisgICAgICAgIHIzID0gY29lZls2NF0gLSBjb2VmWzY4XTsKKworICAgICAgICByMCArPSByMjsKKyAgICAgICAgcjIgPSByMCAtIChyMiA8PCAxKTsKKyAgICAgICAgcjEgKz0gcjM7CisgICAgICAgIHIzID0gcjEgLSAocjMgPDwgMSk7CisKKyAgICAgICAgaWYgKFFxID49IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFFxIC09IDE7CisgICAgICAgICAgICBjb2VmWzBdID0gKHIwICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgY29lZls0XSA9IChyMSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIGNvZWZbNjRdID0gKHIyICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgY29lZls2OF0gPSAocjMgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICBRcSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29lZlswXSA9IChyMCAqIHF1YW50KSA+PiAxOworICAgICAgICAgICAgY29lZls0XSA9IChyMSAqIHF1YW50KSA+PiAxOworICAgICAgICAgICAgY29lZls2NF0gPSAocjIgKiBxdWFudCkgPj4gMTsKKyAgICAgICAgICAgIGNvZWZbNjhdID0gKHIzICogcXVhbnQpID4+IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgZG8gQUMgemlnemFnIHNjYW4sIHF1YW50LCBpcXVhbnQgYW5kIGl0cmFucyAqLworICAgIGlmIChjcikKKyAgICB7CisgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuWzIwXTsKKyAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsWzIwXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bMTZdOworICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbMTZdOworICAgIH0KKworICAgIC8qIG9mZnNldCBidHcgNHg0IGJsb2NrICovCisgICAgb2Zmc2V0X2N1clswXSA9IDA7CisgICAgb2Zmc2V0X2N1clsxXSA9IChwaXRjaCA8PCAyKSAtIDg7CisgICAgb2Zmc2V0X3ByZWRbMF0gPSAwOworICAgIG9mZnNldF9wcmVkWzFdID0gKHByZWRfcGl0Y2ggPDwgMikgLSA4OworICAgIG9mZnNldF9jb2VmWzBdID0gMDsKKyAgICBvZmZzZXRfY29lZlsxXSA9IDU2OworCisgICAgY29lZmZfY29zdCA9IDA7CisKKyAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgIHsKKyAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICBuY29lZmYgPSAwOworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgMTY7IGsrKykgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWR4ID0gWlpfU0NBTl9CTE9DS1trXTsgLyogbWFwIGJhY2sgdG8gcmFzdGVyIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgICAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdW2tdOworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldiA+Pj0gcV9iaXRzOworICAgICAgICAgICAgaWYgKGxldikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmb3IgUkQgcGVyZm9ybWFuY2UqLworICAgICAgICAgICAgICAgIGlmIChsZXYgPiAxKQorICAgICAgICAgICAgICAgICAgICBjb2VmZl9jb3N0ICs9IE1BWF9WQUxVRTsgICAgICAgICAgICAgICAgLy8gc2V0IGhpZ2ggY29zdCwgc2hhbGwgbm90IGJlIGRpc2NhcmRlZAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29lZmZfY29zdCArPSBDT0VGRl9DT1NUW0RJU0FCTEVfVEhSRVNIT0xESU5HXVt6ZXJvX3J1bl07CisKKyAgICAgICAgICAgICAgICAvKiBkZXF1YW50ICovCisgICAgICAgICAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdW2tdOworICAgICAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IChsZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAoLWxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuel90ZW1wW2I0XSA9IG5jb2VmZjsgLy8gcmFzdGVyIHNjYW4KKworICAgICAgICAvLyBqdXN0IGFkdmFuY2UgdGhlIHBvaW50ZXJzIGZvciBub3csIGRvIElEQ1QgbGF0ZXIKKyAgICAgICAgY29lZiArPSA0OworICAgICAgICBydW4gKz0gMTY7CisgICAgICAgIGxldmVsICs9IDE2OworICAgICAgICBjb2VmICs9IG9mZnNldF9jb2VmW2I0JjFdOworICAgIH0KKworICAgIC8qIHJld2luZCB0aGUgcG9pbnRlcnMgKi8KKyAgICBjb2VmIC09IDEyODsKKworICAgIGlmIChjb2VmZl9jb3N0IDwgX0NIUk9NQV9DT0VGRl9DT1NUXykKKyAgICB7CisgICAgICAgIC8qIGlmIGl0J3Mgbm90IGVmZmljaWVudCB0byBlbmNvZGUgYW55IGJsb2Nrcy4KKyAgICAgICAgSnVzdCBkbyBEQyBvbmx5ICovCisgICAgICAgIC8qIFdlIGNhbiByZXNldCBsZXZlbCBhbmQgcnVuIGFsc28sIGJ1dCBzZXR0aW5nIG56IHRvIHplcm8gc2hvdWxkIGJlIGVub3VnaC4gKi8KKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsxNisoY3I8PDEpXSA9IDA7CisgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMTcrKGNyPDwxKV0gPSAwOworICAgICAgICBjdXJyTUItPm56X2NvZWZmWzIwKyhjcjw8MSldID0gMDsKKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsyMSsoY3I8PDEpXSA9IDA7CisKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gREMtb25seSBpbnZlcnNlCisgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyAzMjsKKworICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMiA9IHByZWRbcHJlZF9waXRjaF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoPDwxXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgKmN1ckMgPSByMDsKKyAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgIGN1ckNbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgY3VyQyAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgY3VyQysrOworICAgICAgICAgICAgICAgIHByZWQgKz0gKDEgLSBwcmVkX3BpdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIGN1ckMgKz0gb2Zmc2V0X2N1cltiNCYxXTsKKyAgICAgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgICAgICBjb2VmICs9IG9mZnNldF9jb2VmW2I0JjFdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gbm90IGRyb3BwaW5nIGFueXRoaW5nLCBjb250aW51ZSB3aXRoIHRoZSBJRENUCisgICAgeworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmYgPSBuel90ZW1wW2I0XSA7IC8vIGluIHJhc3RlciBzY2FuCisgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmWzE2KyhiNCYxKSsoY3I8PDEpKygoYjQ+PjEpPDwyKV0gPSBuY29lZmY7IC8vIGluIHJhc3RlciBzY2FuCisKKyAgICAgICAgICAgIGlmIChuY29lZmYpIC8vIGRvIGEgY2hlY2sgb24gdGhlIG5vbnplcm8tY29lZmYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAoMiA8PCA0KTsKKworICAgICAgICAgICAgICAgIC8vIGRvIGludmVyc2UgdHJhbnNmb3JtIGhlcmUKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxXSArIChjb2VmWzNdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlsyXSA9IHIxIC0gcjI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWYgLT0gNjQ7CisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzE2XSArIChjb2VmWzQ4XSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjAgLSAocjMgPDwgMSkpOyAvKiByMC1yMyAqLworICAgICAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgICAgICByMCArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMyArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFtwcmVkX3BpdGNoXSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMyA9IHByZWRbcHJlZF9waXRjaDw8MV0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckMgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckNbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckMgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJDKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQgKz0gKDEgLSBwcmVkX3BpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBEQy1vbmx5IGludmVyc2UKKyAgICAgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyAzMjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoPDwxXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyQyA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyQ1twaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyQyAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckMrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCArPSAoMSAtIHByZWRfcGl0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJDICs9IG9mZnNldF9jdXJbYjQmMV07CisgICAgICAgICAgICBwcmVkICs9IG9mZnNldF9wcmVkW2I0JjFdOworICAgICAgICAgICAgY29lZiArPSBvZmZzZXRfY29lZltiNCYxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogb25seSBEQyB0cmFuc2Zvcm0gKi8KK2ludCBUcmFuc1F1YW50SW50cmExNkRDKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQxNiAqYmxvY2sgPSB2aWRlby0+YmxvY2s7CisgICAgaW50ICpsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxkYzsKKyAgICBpbnQgKnJ1biA9IGVuY3ZpZC0+cnVuZGM7CisgICAgaW50MTYgKnB0ciA9IGJsb2NrOworICAgIGludCByMCwgcjEsIHIyLCByMywgajsKKyAgICBpbnQgUXEgPSB2aWRlby0+UVB5X2Rpdl82OworICAgIGludCBScSA9IHZpZGVvLT5RUHlfbW9kXzY7CisgICAgaW50IHFfYml0cywgcXBfY29uc3QsIHF1YW50OworICAgIGludCBkYXRhLCBsZXYsIHplcm9fcnVuOworICAgIGludCBrLCBuY29lZmYsIGlkeDsKKworICAgIC8qIERDIHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaikKKyAgICB7CisgICAgICAgIHIwID0gcHRyWzBdICsgcHRyWzEyXTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbMTJdOworICAgICAgICByMSA9IHB0cls0XSArIHB0cls4XTsKKyAgICAgICAgcjIgPSBwdHJbNF0gLSBwdHJbOF07CisKKyAgICAgICAgcHRyWzBdID0gcjAgKyByMTsKKyAgICAgICAgcHRyWzhdID0gcjAgLSByMTsKKyAgICAgICAgcHRyWzRdID0gcjMgKyByMjsKKyAgICAgICAgcHRyWzEyXSA9IHIzIC0gcjI7CisgICAgICAgIHB0ciArPSA2NDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIHB0ciA9IGJsb2NrOworICAgIGogPSA0OworICAgIHdoaWxlIChqKQorICAgIHsKKyAgICAgICAgcjAgPSBwdHJbMF0gKyBwdHJbMTkyXTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbMTkyXTsKKyAgICAgICAgcjEgPSBwdHJbNjRdICsgcHRyWzEyOF07CisgICAgICAgIHIyID0gcHRyWzY0XSAtIHB0clsxMjhdOworCisgICAgICAgIHB0clswXSA9IChyMCArIHIxKSA+PiAxOworICAgICAgICBwdHJbMTI4XSA9IChyMCAtIHIxKSA+PiAxOworICAgICAgICBwdHJbNjRdID0gKHIzICsgcjIpID4+IDE7CisgICAgICAgIHB0clsxOTJdID0gKHIzIC0gcjIpID4+IDE7CisgICAgICAgIHB0ciArPSA0OworICAgICAgICBqLS07CisgICAgfQorCisgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVswXTsKKyAgICBxX2JpdHMgICAgPSAxNSArIFFxOworICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDM7ICAgIC8vIGludHJhCisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbmNvZWZmID0gMDsKKworICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIHsKKyAgICAgICAgaWR4ID0gWklHWkFHMlJBU1RFUkRDW2tdOworICAgICAgICBkYXRhID0gYmxvY2tbaWR4XTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdID0gbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuY29lZmY7Cit9CisKK2ludCBUcmFuc1F1YW50Q2hyb21hREMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludDE2ICpibG9jaywgaW50IHNsaWNlX3R5cGUsIGludCBjcikKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjM7CisgICAgaW50IFFxLCBScSwgcV9iaXRzLCBxcF9jb25zdCwgcXVhbnQ7CisgICAgaW50IGRhdGEsIGxldiwgemVyb19ydW47CisgICAgaW50IGssIG5jb2VmZiwgaWR4OworCisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjICsgKGNyIDw8IDIpOyAvKiBjYiBvciBjciAqLworICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjICsgKGNyIDw8IDIpOworCisgICAgLyogMngyIHRyYW5zZm9ybSBvZiBEQyBjb21wb25lbnRzKi8KKyAgICByMCA9IGJsb2NrWzBdOworICAgIHIxID0gYmxvY2tbNF07CisgICAgcjIgPSBibG9ja1s2NF07CisgICAgcjMgPSBibG9ja1s2OF07CisKKyAgICBibG9ja1swXSA9IHIwICsgcjEgKyByMiArIHIzOworICAgIGJsb2NrWzRdID0gcjAgLSByMSArIHIyIC0gcjM7CisgICAgYmxvY2tbNjRdID0gcjAgKyByMSAtIHIyIC0gcjM7CisgICAgYmxvY2tbNjhdID0gcjAgLSByMSAtIHIyICsgcjM7CisKKyAgICBRcSAgICA9IHZpZGVvLT5RUGNfZGl2XzY7CisgICAgUnEgICAgPSB2aWRlby0+UVBjX21vZF82OworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzICAgID0gMTUgKyBRcTsKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDY7CisgICAgfQorCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIHsKKyAgICAgICAgaWR4ID0gKChrID4+IDEpIDw8IDYpICsgKChrICYgMSkgPDwgMik7CisgICAgICAgIGRhdGEgPSBibG9ja1tpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSBsZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IC1sZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgYmxvY2tbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5jb2VmZjsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGEyYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApAQCAtMCwwICsxLDYyMiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisvKiAzLzI5LzAxIGZhc3QgaGFsZi1wZWwgc2VhcmNoIGJhc2VkIG9uIG5laWdoYm9yaW5nIGd1ZXNzICovCisvKiB2YWx1ZSByYW5naW5nIGZyb20gMCB0byA0LCBoaWdoIGNvbXBsZXhpdHkgKG1vcmUgYWNjdXJhdGUpIHRvCisgICBsb3cgY29tcGxleGl0eSAobGVzcyBhY2N1cmF0ZSkgKi8KKyNkZWZpbmUgSFBfRElTVEFOQ0VfVEggICAgICA1IC8vIDIgIC8qIGhhbGYtcGVsIGRpc3RhbmNlIHRocmVzaG9sZCAqLworCisjZGVmaW5lIFBSRUZfMTZfVkVDIDEyOSAgICAgLyogMU1WIGJpYXMgdmVyc3VzIDRNVnMqLworCitjb25zdCBzdGF0aWMgaW50IGRpc3RhbmNlX3RhYls5XVs5XSA9ICAgLyogW2hwX2d1ZXNzXVtrXSAqLworeworICAgIHswLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7MSwgMCwgMSwgMiwgMywgNCwgMywgMiwgMX0sCisgICAgezEsIDAsIDAsIDAsIDEsIDIsIDMsIDIsIDF9LAorICAgIHsxLCAyLCAxLCAwLCAxLCAyLCAzLCA0LCAzfSwKKyAgICB7MSwgMiwgMSwgMCwgMCwgMCwgMSwgMiwgM30sCisgICAgezEsIDQsIDMsIDIsIDEsIDAsIDEsIDIsIDN9LAorICAgIHsxLCAyLCAzLCAyLCAxLCAwLCAwLCAwLCAxfSwKKyAgICB7MSwgMiwgMywgNCwgMywgMiwgMSwgMCwgMX0sCisgICAgezEsIDAsIDEsIDIsIDMsIDIsIDEsIDAsIDB9Cit9OworCisjZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKHVpbnQpeCA+IDB4RkYpeyBcCisgICAgICAgICAgICAgICAgIHggPSAweEZGICYgKH4oeD4+MzEpKTt9CisKKyNkZWZpbmUgQ0xJUF9VUFBFUjE2KHgpICAgICBpZigodWludCl4ID49IDB4MjAwMDAwMDApeyBcCisgICAgICAgIHggPSAweEZGMDAwMCAmICh+KHg+PjMxKSk7fSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgIHggPSAoeD4+NSkmMHhGRjAwMDA7IFwKKyAgICAgICAgfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0ZpbmRIYWxmUGVsTUIKKyAgICBEYXRlOiAgICAgICAxMC8zMS8yMDA3CisgICAgUHVycG9zZTogICAgRmluZCBoYWxmIHBlbCByZXNvbHV0aW9uIE1WIHN1cnJvdW5kaW5nIHRoZSBmdWxsLXBlbCBNVgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IEFWQ0ZpbmRIYWxmUGVsTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIEFWQ01WICptb3QsIHVpbnQ4ICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4cG9zLCBpbnQgeXBvcywgaW50IGhwX2d1ZXNzLCBpbnQgY212eCwgaW50IGNtdnkpCit7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSBlbmN2aWQtPmNvbW1vbi0+Y3VyclBpYzsKKyAgICBpbnQgbHggPSBjdXJyUGljLT5waXRjaDsKKyAgICBpbnQgZCwgZG1pbiwgc2F0ZF9taW47CisgICAgdWludDgqIGNhbmQ7CisgICAgaW50IGxhbWJkYV9tb3Rpb24gPSBlbmN2aWQtPmxhbWJkYV9tb3Rpb247CisgICAgdWludDggKm12Yml0cyA9IGVuY3ZpZC0+bXZiaXRzOworICAgIGludCBtdmNvc3Q7CisgICAgLyogbGlzdCBvZiBjYW5kaWRhdGUgdG8gZ28gdGhyb3VnaCBmb3IgaGFsZi1wZWwgc2VhcmNoKi8KKyAgICB1aW50OCAqc3VicGVsX3ByZWQgPSAodWludDgqKSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvLyBhbGwgMTYgc3ViLXBlbCBwb3NpdGlvbnMKKyAgICB1aW50OCAqKmhwZWxfY2FuZCA9ICh1aW50OCoqKSBlbmN2aWQtPmhwZWxfY2FuZDsgLyogaGFsZi1wZWwgcG9zaXRpb24gKi8KKworICAgIGludCB4aFs5XSA9IHswLCAwLCAyLCAyLCAyLCAwLCAtMiwgLTIsIC0yfTsKKyAgICBpbnQgeWhbOV0gPSB7MCwgLTIsIC0yLCAwLCAyLCAyLCAyLCAwLCAtMn07CisgICAgaW50IHhxWzhdID0gezAsIDEsIDEsIDEsIDAsIC0xLCAtMSwgLTF9OworICAgIGludCB5cVs4XSA9IHsgLTEsIC0xLCAwLCAxLCAxLCAxLCAwLCAtMX07CisgICAgaW50IGgsIGhtaW4sIHEsIHFtaW47CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoeHBvcyk7CisgICAgT1NDTF9VTlVTRURfQVJHKHlwb3MpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhocF9ndWVzcyk7CisKKyAgICBHZW5lcmF0ZUhhbGZQZWxQcmVkKHN1YnBlbF9wcmVkLCBuY2FuZCwgbHgpOworCisgICAgY3VyID0gZW5jdmlkLT5jdXJyWU1COyAvLyBwcmUtbG9hZCBjdXJyZW50IG9yaWdpbmFsIE1CCisKKyAgICBjYW5kID0gaHBlbF9jYW5kWzBdOworCisgICAgLy8gZmluZCBjb3N0IGZvciB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbgorICAgIGRtaW4gPSBTQVREX01CKGNhbmQsIGN1ciwgNjU1MzUpOyAvLyBnZXQgSGFkYW1hYXJkIHRyYW5zZm9ybSBTQUQKKyAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54LCBtb3QtPnksIGNtdngsIGNtdnkpOworICAgIHNhdGRfbWluID0gZG1pbjsKKyAgICBkbWluICs9IG12Y29zdDsKKyAgICBobWluID0gMDsKKworICAgIC8qIGZpbmQgaGFsZi1wZWwgKi8KKyAgICBmb3IgKGggPSAxOyBoIDwgOTsgaCsrKQorICAgIHsKKyAgICAgICAgZCA9IFNBVERfTUIoaHBlbF9jYW5kW2hdLCBjdXIsIGRtaW4pOworICAgICAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54ICsgeGhbaF0sIG1vdC0+eSArIHloW2hdLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgZCArPSBtdmNvc3Q7CisKKyAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICB7CisgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgIGhtaW4gPSBoOworICAgICAgICAgICAgc2F0ZF9taW4gPSBkIC0gbXZjb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgbW90LT5zYWQgPSBkbWluOworICAgIG1vdC0+eCArPSB4aFtobWluXTsKKyAgICBtb3QtPnkgKz0geWhbaG1pbl07CisgICAgZW5jdmlkLT5iZXN0X2hwZWxfcG9zID0gaG1pbjsKKworICAgIC8qKiogc2VhcmNoIGZvciBxdWFydGVyLXBlbCAqKioqLworICAgIEdlbmVyYXRlUXVhcnRQZWxQcmVkKGVuY3ZpZC0+YmlsaW5fYmFzZVtobWluXSwgJihlbmN2aWQtPnFwZWxfY2FuZFswXVswXSksIGhtaW4pOworCisgICAgZW5jdmlkLT5iZXN0X3FwZWxfcG9zID0gcW1pbiA9IC0xOworCisgICAgZm9yIChxID0gMDsgcSA8IDg7IHErKykKKyAgICB7CisgICAgICAgIGQgPSBTQVREX01CKGVuY3ZpZC0+cXBlbF9jYW5kW3FdLCBjdXIsIGRtaW4pOworICAgICAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54ICsgeHFbcV0sIG1vdC0+eSArIHlxW3FdLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgZCArPSBtdmNvc3Q7CisgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICBxbWluID0gcTsKKyAgICAgICAgICAgIHNhdGRfbWluID0gZCAtIG12Y29zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChxbWluICE9IC0xKQorICAgIHsKKyAgICAgICAgbW90LT5zYWQgPSBkbWluOworICAgICAgICBtb3QtPnggKz0geHFbcW1pbl07CisgICAgICAgIG1vdC0+eSArPSB5cVtxbWluXTsKKyAgICAgICAgZW5jdmlkLT5iZXN0X3FwZWxfcG9zID0gcW1pbjsKKyAgICB9CisKKyAgICByZXR1cm4gc2F0ZF9taW47Cit9CisKKworCisvKiogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgc3ViLXBlbCBwcmVkaWN0aW9uIGFyb3VuZCB0aGUgZnVsbC1wZWwgY2FuZGlkYXRlLgorRWFjaCBzdWItcGVsIHBvc2l0aW9uIGFycmF5IGlzIDIwIHBpeGVsIHdpZGUgKGZvciB3b3JkLWFsaWdubWVudCkgYW5kIDE3IHBpeGVsIHRhbGwuICovCisvKiogVGhlIHN1Yi1wZWwgcG9zaXRpb24gaXMgbGFiZWxlZCBpbiBzcGlyYWwgbWFubmVyIGZyb20gdGhlIGNlbnRlci4gKi8KKwordm9pZCBHZW5lcmF0ZUhhbGZQZWxQcmVkKHVpbnQ4KiBzdWJwZWxfcHJlZCwgdWludDggKm5jYW5kLCBpbnQgbHgpCit7CisgICAgLyogbGV0J3MgZG8gc3RyYWlnaHRmb3J3YXJkIHdheSBmaXJzdCAqLworICAgIHVpbnQ4ICpyZWY7CisgICAgdWludDggKmRzdDsKKyAgICB1aW50OCB0bXA4OworICAgIGludDMyIHRtcDMyOworICAgIGludDE2IHRtcF9ob3J6WzE4KjIyXSwgKmRzdF8xNiwgKnNyY18xNjsKKyAgICByZWdpc3RlciBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMCwgZCA9IDAsIGUgPSAwLCBmID0gMDsgLy8gdGVtcCByZWdpc3RlcgorICAgIGludCBtc2s7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBmaXJzdCBjb3B5IGZ1bGwtcGVsIHRvIHRoZSBmaXJzdCBhcnJheSAqLworICAgIC8qIHRvIGJlIG9wdGltaXplZCBsYXRlciBiYXNlZCBvbiBieXRlLW9mZnNldCBsb2FkICovCisgICAgcmVmID0gbmNhbmQgLSAzIC0gbHggLSAobHggPDwgMSk7IC8qIG1vdmUgYmFjayAoLTMsLTMpICovCisgICAgZHN0ID0gc3VicGVsX3ByZWQ7CisKKyAgICBkc3QgLT0gNDsgLyogb2Zmc2V0ICovCisgICAgZm9yIChqID0gMDsgaiA8IDIyOyBqKyspIC8qIDI0eDIyICovCisgICAgeworICAgICAgICBpID0gNjsKKyAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAzMiA9ICpyZWYrKzsKKyAgICAgICAgICAgIHRtcDggPSAqcmVmKys7CisgICAgICAgICAgICB0bXAzMiB8PSAodG1wOCA8PCA4KTsKKyAgICAgICAgICAgIHRtcDggPSAqcmVmKys7CisgICAgICAgICAgICB0bXAzMiB8PSAodG1wOCA8PCAxNik7CisgICAgICAgICAgICB0bXA4ID0gKnJlZisrOworICAgICAgICAgICAgdG1wMzIgfD0gKHRtcDggPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IHRtcDMyOworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIHJlZiArPSAobHggLSAyNCk7CisgICAgfQorCisgICAgLyogZnJvbSB0aGUgZmlyc3QgYXJyYXksIHdlIGRvIGhvcml6b250YWwgaW50ZXJwICovCisgICAgcmVmID0gc3VicGVsX3ByZWQgKyAyOworICAgIGRzdF8xNiA9IHRtcF9ob3J6OyAvKiAxNyB4IDIyICovCisKKyAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSByZWZbLTJdOworICAgICAgICAgICAgYiA9IHJlZlstMV07CisgICAgICAgICAgICBjID0gcmVmWzBdOworICAgICAgICAgICAgZCA9IHJlZlsxXTsKKyAgICAgICAgICAgIGUgPSByZWZbMl07CisgICAgICAgICAgICBmID0gcmVmWzNdOworICAgICAgICAgICAgKmRzdF8xNisrID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIGEgPSByZWZbNF07CisgICAgICAgICAgICAqZHN0XzE2KysgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgYiA9IHJlZls1XTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICBjID0gcmVmWzZdOworICAgICAgICAgICAgKmRzdF8xNisrID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKworICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZG8gdGhlIDE3dGggY29sdW1uIGhlcmUgKi8KKyAgICAgICAgZCA9IHJlZlszXTsKKyAgICAgICAgKmRzdF8xNiA9ICBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICBkc3RfMTYgKz0gMjsgLyogc3RyaWRlIGZvciB0bXBfaG9yeiBpcyAxOCAqLworICAgICAgICByZWYgKz0gODsgIC8qIHN0cmlkZSBmb3IgcmVmIGlzIDI0ICovCisgICAgICAgIGlmIChqID09IDMpICAvLyBtb3ZlIDE4IGxpbmVzIGRvd24KKyAgICAgICAgeworICAgICAgICAgICAgZHN0XzE2ICs9IDMyNDsvLzE4KjE4OworICAgICAgICAgICAgcmVmICs9IDQzMjsvLzE4KjI0OworICAgICAgICB9CisgICAgfQorCisgICAgcmVmIC09IDQ4MDsvLzIwKjI0OworICAgIGRzdF8xNiAtPSAzNjA7Ly8yMCoxODsKKyAgICBkc3QgPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsgLyogZ28gdG8gdGhlIDE0dGggYXJyYXkgMTd4MTgqLworCisgICAgZm9yIChqID0gMTg7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IHJlZlstMl07CisgICAgICAgICAgICBiID0gcmVmWy0xXTsKKyAgICAgICAgICAgIGMgPSByZWZbMF07CisgICAgICAgICAgICBkID0gcmVmWzFdOworICAgICAgICAgICAgZSA9IHJlZlsyXTsKKyAgICAgICAgICAgIGYgPSByZWZbM107CisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICBhID0gcmVmWzRdOworICAgICAgICAgICAgdG1wMzIgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgKmRzdF8xNisrID0gdG1wMzI7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqZHN0KysgPSB0bXAzMjsKKworICAgICAgICAgICAgYiA9IHJlZls1XTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IHRtcDMyOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKmRzdCsrID0gdG1wMzI7CisKKyAgICAgICAgICAgIGMgPSByZWZbNl07CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB0aGUgMTd0aCBjb2x1bW4gaGVyZSAqLworICAgICAgICBkID0gcmVmWzNdOworICAgICAgICB0bXAzMiA9ICBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICAqZHN0XzE2ID0gdG1wMzI7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAqZHN0ID0gdG1wMzI7CisKKyAgICAgICAgZHN0ICs9IDg7ICAvKiBzdHJpZGUgZm9yIGRzdCBpcyAyNCAqLworICAgICAgICBkc3RfMTYgKz0gMjsgLyogc3RyaWRlIGZvciB0bXBfaG9yeiBpcyAxOCAqLworICAgICAgICByZWYgKz0gODsgIC8qIHN0cmlkZSBmb3IgcmVmIGlzIDI0ICovCisgICAgfQorCisKKyAgICAvKiBEbyBtaWRkbGUgcG9pbnQgZmlsdGVyaW5nKi8KKyAgICBzcmNfMTYgPSB0bXBfaG9yejsgLyogMTcgeCAyMiAqLworICAgIGRzdCA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOyAvKiAxMnRoIGFycmF5IDE3eDE3Ki8KKyAgICBkc3QgLT0gMjQ7IC8vIG9mZnNldAorICAgIGZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMTY7IGogPiAwOyBqIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSAqc3JjXzE2OworICAgICAgICAgICAgYiA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGMgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICBkID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgZSA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGYgPSAqKHNyY18xNiArPSAxOCk7CisKKyAgICAgICAgICAgIHRtcDMyID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIGEgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOworCisgICAgICAgICAgICBiID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsKKworICAgICAgICAgICAgYyA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIHRtcDMyID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIHNyY18xNiAtPSAoMTggPDwgMik7CisgICAgICAgIH0KKworICAgICAgICBkID0gc3JjXzE2WzkwXTsgLy8gMTgqNQorICAgICAgICB0bXAzMiA9IGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgIGRzdFsyNF0gPSB0bXAzMjsKKworICAgICAgICBzcmNfMTYgLT0gKCgxOCA8PCA0KSAtIDEpOworICAgICAgICBkc3QgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgIH0KKworICAgIC8qIGRvIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICByZWYgPSBzdWJwZWxfcHJlZCArIDI7CisgICAgZHN0ID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7IC8qIDEwdGggYXJyYXkgMTh4MTcgKi8KKyAgICBkc3QgLT0gMjQ7IC8vIG9mZnNldAorCisgICAgZm9yIChpID0gMjsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDE2OyBqID4gMDsgaiAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gKnJlZjsKKyAgICAgICAgICAgIGIgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZCA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGUgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBmID0gKihyZWYgKz0gMjQpOworCisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYSA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGMgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgcmVmIC09ICgyNCA8PCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGQgPSByZWZbMTIwXTsgLy8gMjQqNQorICAgICAgICB0bXAzMiA9IGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICBkc3RbMjRdID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgZHN0IC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICAgICAgcmVmIC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICB9CisKKyAgICAvLyBub3RlIHRoYXQgdXNpbmcgU0lNRCBoZXJlIGRvZXNuJ3QgaGVscCBtdWNoLCB0aGUgY3ljbGUgYWxtb3N0IHN0YXlzIHRoZSBzYW1lCisgICAgLy8gb25lIGNhbiBqdXN0IHVzZSB0aGUgYWJvdmUgY29kZSBhbmQgY2hhbmdlIHRoZSBmb3IoaT0yIHRvIGZvcihpPTE4CisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpIC09IDQpCisgICAgeworICAgICAgICBtc2sgPSAwOworICAgICAgICBmb3IgKGogPSAxNzsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICooKHVpbnQzMiopcmVmKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICBiID0gKGEgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLworICAgICAgICAgICAgYSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyA9ICooKHVpbnQzMiopKHJlZiArIDEyMCkpOworICAgICAgICAgICAgZCA9IChjID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBjICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBhICs9IGM7CisgICAgICAgICAgICBiICs9IGQ7CisKKyAgICAgICAgICAgIGUgPSAqKCh1aW50MzIqKShyZWYgKyA3MikpOyAvKiBlLCBmICovCisgICAgICAgICAgICBmID0gKGUgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGUgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgPSAqKCh1aW50MzIqKShyZWYgKyA0OCkpOyAvKiBjLCBkICovCisgICAgICAgICAgICBkID0gKGMgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGMgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgKz0gZTsKKyAgICAgICAgICAgIGQgKz0gZjsKKworICAgICAgICAgICAgYSArPSAyMCAqIGM7CisgICAgICAgICAgICBiICs9IDIwICogZDsKKyAgICAgICAgICAgIGEgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICBiICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICBlID0gKigodWludDMyKikocmVmICs9IDI0KSk7IC8qIGUsIGYgKi8KKyAgICAgICAgICAgIGYgPSAoZSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgZSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyA9ICooKHVpbnQzMiopKHJlZiArIDcyKSk7IC8qIGMsIGQgKi8KKyAgICAgICAgICAgIGQgPSAoYyA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgYyAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyArPSBlOworICAgICAgICAgICAgZCArPSBmOworCisgICAgICAgICAgICBhIC09IDUgKiBjOworICAgICAgICAgICAgYiAtPSA1ICogZDsKKworICAgICAgICAgICAgYyA9IGEgPDwgMTY7CisgICAgICAgICAgICBkID0gYiA8PCAxNjsKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihhKQorICAgICAgICAgICAgQ0xJUF9VUFBFUjE2KGMpCisgICAgICAgICAgICBDTElQX1VQUEVSMTYoYikKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihkKQorCisgICAgICAgICAgICBhIHw9IChjID4+IDE2KTsKKyAgICAgICAgICAgIGIgfD0gKGQgPj4gMTYpOworICAgICAgICAgICAgLy8gIGE+Pj01OworICAgICAgICAgICAgLy8gIGI+Pj01OworICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgLy8gIG1zayB8PSBiOyAgbXNrfD1hOworICAgICAgICAgICAgLy8gIGEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAvLyAgYiAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIGEgfD0gKGIgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKworICAgICAgICAgICAgKigodWludDE2KikoZHN0ICs9IDI0KSkgPSBhICYgMHhGRkZGOyAvL2RzdCBpcyBub3Qgd29yZC1hbGlnbmVkLgorICAgICAgICAgICAgKigodWludDE2KikoZHN0ICsgMikpID0gYSA+PiAxNjsKKworICAgICAgICB9CisgICAgICAgIGRzdCAtPSA0MDQ7IC8vIDI0KjE3LTQKKyAgICAgICAgcmVmIC09IDQwNDsKKyAgICAgICAgLyogICAgICBpZihtc2sgJiAweEZGMDBGRjAwKSAvLyBuZWVkIGNsaXBwaW5nCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZXJ0SW50ZXJwV0NsaXAoZHN0LHJlZik7IC8vIHJlLWRvIDQgY29sdW1uIHdpdGggY2xpcAorICAgICAgICAgICAgICAgIH0qLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgVmVydEludGVycFdDbGlwKHVpbnQ4ICpkc3QsIHVpbnQ4ICpyZWYpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGEsIGIsIGMsIGQsIGUsIGY7CisgICAgaW50MzIgdG1wMzI7CisKKyAgICBkc3QgLT0gNDsKKyAgICByZWYgLT0gNDsKKworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGogLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICpyZWY7CisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgYyA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGQgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBlID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZiA9ICoocmVmICs9IDI0KTsKKworICAgICAgICAgICAgdG1wMzIgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGEgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYiA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIHJlZiAtPSAoMjQgPDwgMik7CisgICAgICAgIH0KKworICAgICAgICBkID0gcmVmWzEyMF07IC8vIDI0KjUKKyAgICAgICAgdG1wMzIgPSBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgZHN0WzI0XSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgIGRzdCAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgICAgIHJlZiAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIEdlbmVyYXRlUXVhcnRQZWxQcmVkKHVpbnQ4ICoqYmlsaW5fYmFzZSwgdWludDggKnFwZWxfY2FuZCwgaW50IGhwZWxfcG9zKQoreworICAgIC8vIGZvciBldmVuIHZhbHVlIG9mIGhwZWxfcG9zLCBzdGFydCB3aXRoIHBhdHRlcm4gMSwgb3RoZXJ3aXNlLCBzdGFydCB3aXRoIHBhdHRlcm4gMgorICAgIGludCBpLCBqOworCisgICAgdWludDggKmMxID0gcXBlbF9jYW5kOworICAgIHVpbnQ4ICp0bCA9IGJpbGluX2Jhc2VbMF07CisgICAgdWludDggKnRyID0gYmlsaW5fYmFzZVsxXTsKKyAgICB1aW50OCAqYmwgPSBiaWxpbl9iYXNlWzJdOworICAgIHVpbnQ4ICpiciA9IGJpbGluX2Jhc2VbM107CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IG9mZnNldCA9IDEgLSAoMzg0ICogNyk7CisKKyAgICBpZiAoIShocGVsX3BvcyYxKSkgLy8gZGlhbW9uZCBwYXR0ZXJuCisgICAgeworICAgICAgICBqID0gMTY7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9IHRyWzI0XTsKKyAgICAgICAgICAgICAgICBhID0gKnRyKys7CisgICAgICAgICAgICAgICAgYiA9IGJsWzFdOworICAgICAgICAgICAgICAgIGMgPSAqYnIrKzsKKworICAgICAgICAgICAgICAgICpjMSA9IChjICsgYSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBhICsgMSkgPj4gMTsgLyogYzIgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGMgKyAxKSA+PiAxOyAvKiBjMyAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgZCArIDEpID4+IDE7IC8qIGM0ICovCisKKyAgICAgICAgICAgICAgICBiID0gKmJsKys7CisKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYyArIGQgKyAxKSA+PiAxOyAgLyogYzUgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGQgKyAxKSA+PiAxOyAgLyogYzYgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGMgKyAxKSA+PiAxOyAgLyogYzcgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGEgKyAxKSA+PiAxOyAgLyogYzggKi8KKworICAgICAgICAgICAgICAgIGMxICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSwgcGl0Y2ggaXMgMjQKKyAgICAgICAgICAgIHRsICs9IDg7CisgICAgICAgICAgICB0ciArPSA4OworICAgICAgICAgICAgYmwgKz0gODsKKyAgICAgICAgICAgIGJyICs9IDg7CisgICAgICAgICAgICBjMSArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gc3RhciBwYXR0ZXJuCisgICAgeworICAgICAgICBqID0gMTY7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYSA9ICpicisrOworICAgICAgICAgICAgICAgIGIgPSAqdHIrKzsKKyAgICAgICAgICAgICAgICBjID0gdGxbMV07CisgICAgICAgICAgICAgICAgKmMxID0gKGEgKyBiICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBiID0gYmxbMV07CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzIgKi8KKyAgICAgICAgICAgICAgICBjID0gdGxbMjVdOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYiArIDEpID4+IDE7IC8qIGMzICovCisgICAgICAgICAgICAgICAgYiA9IHRyWzIzXTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjNCAqLworICAgICAgICAgICAgICAgIGMgPSB0bFsyNF07CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBiICsgMSkgPj4gMTsgLyogYzUgKi8KKyAgICAgICAgICAgICAgICBiID0gKmJsKys7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzYgKi8KKyAgICAgICAgICAgICAgICBjID0gKnRsKys7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBiICsgMSkgPj4gMTsgLyogYzcgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjOCAqLworCisgICAgICAgICAgICAgICAgYzEgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBsaW5lLCBwaXRjaCBpcyAyNAorICAgICAgICAgICAgdGwgKz0gODsKKyAgICAgICAgICAgIHRyICs9IDg7CisgICAgICAgICAgICBibCArPSA4OworICAgICAgICAgICAgYnIgKz0gODsKKyAgICAgICAgICAgIGMxICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIGFzc3VtaW5nIGNhbmQgYWx3YXlzIGhhcyBhIHBpdGNoIG9mIDI0ICovCitpbnQgU0FURF9NQih1aW50OCAqY2FuZCwgdWludDggKmN1ciwgaW50IGRtaW4pCit7CisgICAgaW50IGNvc3Q7CisKKworICAgIGRtaW4gPSAoZG1pbiA8PCAxNikgfCAyNDsKKyAgICBjb3N0ID0gQVZDU0FEX01hY3JvYmxvY2tfQyhjYW5kLCBjdXIsIGRtaW4sIE5VTEwpOworCisgICAgcmV0dXJuIGNvc3Q7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2hlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNmZjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2hlYWRlci5jcHAKQEAgLTAsMCArMSw5MTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjIuMSAqLworLyogbm8gbmVlZCBmb3IgY2hlY2tpbmcgdGhlIHZhbGlkIHJhbmdlICwgYWxyZWFkeSBkb25lIGluIFNldEVuY29kZVBhcmFtKCksCitpZiB3ZSBoYXZlIHRvIHNlbmQgYW5vdGhlciBTUFMsIHRoZSByYW5nZXMgc2hvdWxkIGJlIHZlcmlmaWVkIGZpcnN0IGJlZm9yZQordXNlcnMgY2FsbCBQVkFWQ0VuY29kZVNQUygpICovCitBVkNFbmNfU3RhdHVzIEVuY29kZVNQUyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1ZVSVBhcmFtcyAqdnVpID0gJihzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnMpOworICAgIGludCBpOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICAvL0RFQlVHX0xPRyh1c2VyRGF0YSxBVkNfTE9HVFlQRV9JTkZPLCJFbmNvZGVTUFMiLC0xLC0xKTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHNlcVBhcmFtLT5wcm9maWxlX2lkYyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDBfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNCwgMCk7ICAvKiBmb3JiaWRkZW4gemVybyBiaXRzICovCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIHdlIGNhbiBjaGVjayBhZnRlciBlYWNoIHdyaXRlIGFsc28gKi8KKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgc2VxUGFyYW0tPmxldmVsX2lkYyk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0KTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKTsKKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNlcVBhcmFtLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLyogaWYgZnJhbWVfbWJzX29ubHlfZmxhZyBpcyAwLCB0aGVuIHdyaXRlLCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mcmFtZSBoZXJlICovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpOworICAgIGlmIChzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZykKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCk7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpOworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCk7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICAvKiBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIC8vcmV0dXJuIEFWQ0VOQ19TUFNfRkFJTDsKKyAgICAgICAgRW5jb2RlVlVJKHN0cmVhbSwgdnVpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgRW5jb2RlVlVJKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBBVkNWVUlQYXJhbXMqIHZ1aSkKK3sKKyAgICBpbnQgdGVtcDsKKworICAgIHRlbXAgPSB2dWktPmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHZ1aS0+YXNwZWN0X3JhdGlvX2lkYyk7CisgICAgICAgIGlmICh2dWktPmFzcGVjdF9yYXRpb19pZGMgPT0gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgdnVpLT5zYXJfd2lkdGgpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIHZ1aS0+c2FyX2hlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+b3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPm92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcpOworICAgIH0KKyAgICB0ZW1wID0gdnVpLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzLCB2dWktPnZpZGVvX2Zvcm1hdCk7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnKTsKKyAgICAgICAgdGVtcCA9IHZ1aS0+Y29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgICAgIGlmICh0ZW1wKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCB2dWktPmNvbG91cl9wcmltYXJpZXMpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT5tYXRyaXhfY29lZmZpY2llbnRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZW1wID0gdnVpLT5jaHJvbWFfbG9jYXRpb25faW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5jaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkKTsKKyAgICB9CisKKyAgICB0ZW1wID0gdnVpLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgdnVpLT5udW1fdW5pdHNfaW5fdGljayk7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCB2dWktPnRpbWVfc2NhbGUpOworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyk7CisgICAgfQorCisgICAgdGVtcCA9IHZ1aS0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEVuY29kZUhSRChzdHJlYW0sICYodnVpLT5uYWxfaHJkX3BhcmFtZXRlcnMpKTsKKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEVuY29kZUhSRChzdHJlYW0sICYodnVpLT52Y2xfaHJkX3BhcmFtZXRlcnMpKTsKKyAgICB9CisgICAgaWYgKHZ1aS0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fCB2dWktPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPmxvd19kZWxheV9ocmRfZmxhZyk7CisgICAgfQorICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpOworICAgIHRlbXAgPSB2dWktPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5tb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5tYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPm1heF9iaXRzX3Blcl9tYl9kZW5vbSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2RlY19mcmFtZV9yZW9yZGVyaW5nKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBFbmNvZGVIUkQoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ0hSRFBhcmFtcyogaHJkKQoreworICAgIGludCBpOworCisgICAgdWVfdihzdHJlYW0sIGhyZC0+Y3BiX2NudF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDQsIGhyZC0+Yml0X3JhdGVfc2NhbGUpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDQsIGhyZC0+Y3BiX3NpemVfc2NhbGUpOworICAgIGZvciAoaSA9IDA7IGkgPD0gKGludClocmQtPmNwYl9jbnRfbWludXMxOyBpKyspCisgICAgeworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5iaXRfcmF0ZV92YWx1ZV9taW51czFbaV0pOworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5jcGJfc2l6ZV92YWx1ZV9taW51czFbaV0pOworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5jYnJfZmxhZ1tpXSk7CisgICAgfQorICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPnRpbWVfb2Zmc2V0X2xlbmd0aCk7CisKKyAgICByZXR1cm4gOworfQorCisKKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjIuMiAqLworLyogbm8gbmVlZCBmb3IgY2hlY2tpbmcgdGhlIHZhbGlkIHJhbmdlICwgYWxyZWFkeSBkb25lIGluIFNldEVuY29kZVBhcmFtKCkuCitJZiB3ZSBoYXZlIHRvIHNlbmQgYW5vdGhlciBTUFMsIHRoZSByYW5nZXMgc2hvdWxkIGJlIHZlcmlmaWVkIGZpcnN0IGJlZm9yZQordXNlcnMgY2FsbCBQVkFWQ0VuY29kZVNQUygpKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlUFBTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0gPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBpbnQgaSwgaUdyb3VwLCBudW1CaXRzOworICAgIHVpbnQgdGVtcDsKKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxKTsKKyAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUpOworICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDw9IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lHcm91cF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlHcm91cCA9IDA7IGlHcm91cCA8IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnRvcF9sZWZ0W2lHcm91cF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lHcm91cF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAzIHx8CisgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA0IHx8CisgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA1KQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qaWYocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDYpKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxKTsKKworICAgICAgICAgICAgbnVtQml0cyA9IDA7LyogY2VpbChsb2cyKG51bV9zbGljZV9ncm91cHNfbWludXMxKzEpKSBiaXRzICovCisgICAgICAgICAgICBpID0gcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOworICAgICAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bUJpdHMrKzsKKyAgICAgICAgICAgICAgICBpID4+PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IChpbnQpcGljUGFyYW0tPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBudW1CaXRzLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAyLCBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2KTsKKyAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYpOworICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCk7CisKKyAgICB0ZW1wID0gcGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnIDw8IDI7CisgICAgdGVtcCB8PSAocGljUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA8PCAxKTsKKyAgICB0ZW1wIHw9IHBpY1BhcmFtLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzLCB0ZW1wKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4zICovCitBVkNFbmNfU3RhdHVzIEVuY29kZVNsaWNlSGVhZGVyKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1BpY1BhcmFtU2V0ICpjdXJyUFBTID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBzbGljZV90eXBlLCB0ZW1wLCBpOworICAgIGludCBudW1fYml0czsKKworICAgIG51bV9iaXRzID0gKHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gc3RyZWFtLT5iaXRfbGVmdDsKKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+Zmlyc3RfbWJfaW5fc2xpY2UpOworCisgICAgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgaWYgKHZpZGVvLT5tYk51bSA9PSAwKSAvKiBmaXJzdCBtYiBpbiBmcmFtZSAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV90eXBlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlX3R5cGUpOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgY3VyclNQUy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQsIHNsaWNlSGRyLT5mcmFtZV9udW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8qIGlmIGZyYW1lX21ic19vbmx5X2ZsYWcgaXMgMCwgZW5jb2RlIGZpZWxkX3BpY19mbGFnLCBib3R0b21fZmllbGRfZmxhZyBoZXJlICovCisKKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5pZHJfcGljX2lkKTsKKyAgICB9CisKKyAgICBpZiAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlID09IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBjdXJyU1BTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiKTsKKworICAgICAgICBpZiAoY3VyclBQUy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tKTsgLyogMzIgYml0cyAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMSAmJiAhY3VyclNQUy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpCisgICAgeworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0pOyAgICAvKiAzMiBiaXRzICovCisgICAgICAgIGlmIChjdXJyUFBTLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSk7IC8qIDMyIGJpdHMgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyUFBTLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnJlZHVuZGFudF9waWNfY250KTsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpOworICAgICAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBzaG91bGRuJ3QgZW50ZXIgdGhpcyBwYXJ0IGF0IGFsbCAqLworICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgIGlmIChzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoKSAqLworICAgIHN0YXR1cyA9IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKHZpZGVvLCBzdHJlYW0sIHNsaWNlSGRyLCBzbGljZV90eXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoKGN1cnJQUFMtPndlaWdodGVkX3ByZWRfZmxhZyAmJiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSkpIHx8CisgICAgICAgICAgICAoY3VyclBQUy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAxICYmIHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpKQorICAgIHsKKyAgICAgICAgLy8gICAgICBwcmVkX3dlaWdodF90YWJsZSgpOyAvLyBub3Qgc3VwcG9ydGVkICEhCisgICAgICAgIHJldHVybiBBVkNFTkNfUFJFRF9XRUlHSFRfVEFCX0ZBSUw7CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyAhPSAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gZGVjX3JlZl9waWNfbWFya2luZyh2aWRlbywgc3RyZWFtLCBzbGljZUhkcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICYmIHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0NBQkFDX0ZBSUw7CisgICAgICAgIC8qICAgICAgdWVfdihzdHJlYW0sJihzbGljZUhkci0+Y2FiYWNfaW5pdF9pZGMpKTsKKyAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+Y2FiYWNfaW5pdF9pZGMgPiAyKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCAhISEhCisgICAgICAgICAgICAgICAgfSovCisgICAgfQorCisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9xcF9kZWx0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NJX1NMSUNFKQorICAgIHsKKyAgICAgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+c3BfZm9yX3N3aXRjaF9mbGFnKTsKKyAgICAgICAgICAgIC8qIGlmIHNwX2Zvcl9zd2l0Y2hfZmxhZyBpcyAwLCBQIG1hY3JvYmxvY2tzIGluIFNQIHNsaWNlIGlzIGRlY29kZWQgdXNpbmcKKyAgICAgICAgICAgIFNQIGRlY29kaW5nIHByb2Nlc3MgZm9yIG5vbi1zd2l0Y2hpbmcgcGljdHVyZXMgaW4gOC42LjEgKi8KKyAgICAgICAgICAgIC8qIGVsc2UsIFAgbWFjcm9ibG9ja3MgaW4gU1Agc2xpY2UgaXMgZGVjb2RlZCB1c2luZyBTUCBhbmQgU0kgZGVjb2RpbmcKKyAgICAgICAgICAgIHByb2Nlc3MgZm9yIHN3aXRjaGluZyBwaWN0dXJlIGluIDguNi4yICovCisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9xc19kZWx0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpCisgICAgeworCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMpOworCisgICAgICAgIGlmIChzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2Mik7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlID49IDMKKyAgICAgICAgICAgICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlIDw9IDUpCisgICAgeworICAgICAgICAvKiBDZWlsKExvZzIoUGljU2l6ZUluTWFwVW5pdHMvKGZsb2F0KVNsaWNlR3JvdXBDaGFuZ2VSYXRlICsgMSkpICovCisgICAgICAgIHRlbXAgPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLyB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGU7CisgICAgICAgIGlmICh2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgJSB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHRlbXAgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID4+PSAxOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgaSwgc2xpY2VIZHItPnNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSk7CisgICAgfQorCisKKyAgICBlbmN2aWQtPnJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHMgKz0gKHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gc3RyZWFtLT5iaXRfbGVmdCAtIG51bV9iaXRzOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMy4xICovCitBVkNFbmNfU3RhdHVzIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIsIGludCBzbGljZV90eXBlKQoreworICAgICh2b2lkKSh2aWRlbyk7CisgICAgaW50IGk7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIGlmIChzbGljZV90eXBlICE9IEFWQ19JX1NMSUNFICYmIHNsaWNlX3R5cGUgIT0gQVZDX1NJX1NMSUNFKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDApOworICAgICAgICBpZiAoc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMFtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgY2hlY2sgc2hvdWxkIGJlIGluIEluaXRTbGljZSgpLCBpZiB3ZSBldmVyIHVzZSBpdCAqLworICAgICAgICAgICAgICAgICAgICAvKmlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9waWNfbnVtX2wwW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSAhPSAzCisgICAgICAgICAgICAgICAgICAgICYmIGkgPD0gKGludClzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDEpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxKTsKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDFbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNoZWNrIHNob3VsZCBiZSBpbiBJbml0U2xpY2UoKSBpZiB3ZSBldmVyIHVzZSBpdAorICAgICAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wxW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wxW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfSovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fcGljX251bV9sMVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gIT0gMworICAgICAgICAgICAgICAgICAgICAmJiBpIDw9IChpbnQpc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKyAxKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMy4zICovCitBVkNFbmNfU3RhdHVzIGRlY19yZWZfcGljX21hcmtpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkcikKK3sKKyAgICBpbnQgaTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnKTsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyk7CisgICAgICAgIGlmIChzbGljZUhkci0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnID09IDApIC8qIHVzZWQgZm9yIHNob3J0LXRlcm0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPk1heExvbmdUZXJtRnJhbWVJZHggPSAtMTsgLyogbm8gbG9uZy10ZXJtIGZyYW1lIGluZHggKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHVzZWQgZm9yIGxvbmctdGVybSAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+TWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgICAgICB2aWRlby0+TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcpOyAvKiBkZWZhdWx0IHRvIHplcm8gKi8KKyAgICAgICAgaWYgKHNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9waWNfbnVtW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX2ZyYW1lX2lkeFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldICE9IDAgJiYgaSA8IE1BWF9ERUNfUkVGX1BJQ19NQVJLSU5HKTsKKyAgICAgICAgICAgIGlmIChpID49IE1BWF9ERUNfUkVGX1BJQ19NQVJLSU5HICYmIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfREVDX1JFRl9QSUNfTUFSS19GQUlMOyAvKiB3ZSdyZSBzY3Jld2VkISEsIG5vdCBlbm91Z2ggbWVtb3J5ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgc3ViY2xhdXNlIDguMi4xIERlY29kaW5nIHByb2Nlc3MgZm9yIHBpY3R1cmUgb3JkZXIgY291bnQuCitTZWUgYWxzbyBQb3N0UE9DKCkgZm9yIGluaXRpYWxpemF0aW9uIG9mIHNvbWUgdmFyaWFibGVzLiAqLworQVZDRW5jX1N0YXR1cyBJbml0UE9DKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNGcmFtZUlPICAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgMDogLyogUE9DIE1PREUgMCAsIHN1YmNsYXVzZSA4LjIuMS4xICovCisgICAgICAgICAgICAvKiBlbmNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjdXJySW5wdXQtPmRpc3Bfb3JkZXIgPCBlbmN2aWQtPmRpc3BPcmRQT0NSZWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmIC09IHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlciAtIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZjsKKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgPj0gdmlkZW8tPk1heFBpY09yZGVyQ250THNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAtPSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIE1TQnMgb2YgY3VycmVudCBwaWN0dXJlICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAgPCAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IpICA+PSAodmlkZW8tPk1heFBpY09yZGVyQ250THNiIC8gMikpCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiArIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAgPiAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiAgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgLSB2aWRlby0+cHJldlBpY09yZGVyQ250THNiKSAgPiAodmlkZW8tPk1heFBpY09yZGVyQ250THNiIC8gMikpCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiAtIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnRNc2IgPSB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiOworCisgICAgICAgICAgICAvKiBKVlQtSTAxMCBwYWdlIDgxIGlzIGRpZmZlcmVudCBmcm9tIEpNNy4zICovCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyB8fCAhc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250TXNiICsgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250TXNiICsgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSBBVkNfTUlOKHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250LCB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSA9IDA7IC8qIGRlZmF1bHRlZCB0byB6ZXJvICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIFBPQyBNT0RFIDEsIHN1YmNsYXVzZSA4LjIuMS4yICovCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgRnJhbWVOdW1PZmZzZXQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gY3VycklucHV0LT5kaXNwX29yZGVyOyAgLyogcmVzZXQgdGhlIHJlZmVyZW5jZSBwb2ludCAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+cHJldkZyYW1lTnVtID4gc2xpY2VIZHItPmZyYW1lX251bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYWJzRnJhbWVOdW0gKi8KKyAgICAgICAgICAgIGlmIChjdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5hYnNGcmFtZU51bSA9IHZpZGVvLT5GcmFtZU51bU9mZnNldCArIHNsaWNlSGRyLT5mcmFtZV9udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSA+IDAgJiYgdmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGRlcml2ZSBwaWNPcmRlckNudEN5Y2xlQ250IGFuZCBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnBpY09yZGVyQ250Q3ljbGVDbnQgPSAodmlkZW8tPmFic0ZyYW1lTnVtIC0gMSkgLyBjdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworICAgICAgICAgICAgICAgIHZpZGVvLT5mcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSA9ICh2aWRlby0+YWJzRnJhbWVOdW0gLSAxKSAlIGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUsIHRoaXMgdmFsdWUgY2FuIGJlIGNvbXB1dGVkIHVwIGZyb250LiAqLworICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgZXhwZWN0ZWRQaWNPcmRlckNudCAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCA9IHZpZGVvLT5waWNPcmRlckNudEN5Y2xlQ250ICogdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gdmlkZW8tPmZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArPSBjdXJyU1BTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSBUb3BGaWVsZE9yZGVyQ250IGFuZCBCb3R0b21GaWVsZE9yZGVyQ250ICovCisgICAgICAgICAgICAvKiBlbmNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICBpZiAoIWN1cnJTUFMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0gY3VycklucHV0LT5kaXNwX29yZGVyIC0gZW5jdmlkLT5kaXNwT3JkUE9DUmVmIC0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07IC8qIHNob3VsZCBiZSBjYWxjdWxhdGVkIGZyb20gY3VycklucHV0LT5ib3R0b21fZmllbGQtPmRpc3Bfb3JkZXIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ICsgY3VyclNQUy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV07CisKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSBBVkNfTUlOKHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250LCB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArIGN1cnJTUFMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIDI6IC8qIFBPQyBNT0RFIDIsIHN1YmNsYXVzZSA4LjIuMS4zICovCisgICAgICAgICAgICAvKiBkZWNvZGluZyBvcmRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIGRpc3BsYXkgb3JkZXIgKi8KKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGNoZWNrIGZvciB0aGF0LiBUaGUgZGVjb2RlciB3aWxsIGp1c3Qgb3V0cHV0IGluIGRlY29kaW5nIG9yZGVyLiAqLworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIDIgY29uc2VjdXRpdmUgbm9uLXJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSAxOyAgLyogYWN0IGFzIGEgZmxhZyBmb3Igbm9uIHJlZiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IDA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPnByZXZGcmFtZU51bSA+IHNsaWNlSGRyLT5mcmFtZV9udW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCArIHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIHRlbXBQaWNPcmRlckNudCwgd2UganVzdCB1c2UgUGljT3JkZXJDbnQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgVG9wRmllbGRPcmRlckNudCBhbmQgQm90dG9tRmllbGRPcmRlckNudCAqLworICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUE9DX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA4LjIuMSAqLworQVZDRW5jX1N0YXR1cyBQb3N0UE9DKEFWQ0NvbW1vbk9iaiAqdmlkZW8pCit7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisKKyAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gc2xpY2VIZHItPmZyYW1lX251bTsKKworICAgIHN3aXRjaCAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBzdWJjbGF1c2UgOC4yLjEuMSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiA9IHZpZGVvLT5QaWNPcmRlckNudE1zYjsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiID0gc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogIC8qIHN1YmNsYXVzZSA4LjIuMS4yIGFuZCA4LjIuMS4zICovCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWVtX21ncl9jdHJsX2VxXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IHZpZGVvLT5GcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNThiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAKQEAgLTAsMCArMSw4OTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKworI2RlZmluZSBMT0cyX01BWF9GUkFNRV9OVU1fTUlOVVM0ICAgMTIgICAvKiAxMiBkZWZhdWx0ICovCisjZGVmaW5lIFNMSUNFX0dST1VQX0NIQU5HRV9DWUNMRSAgICAxICAgIC8qIGRlZmF1bHQgKi8KKworLyogaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHRvIGJlIHVzZWQgaW4gU1BTKi8KK0FWQ0VuY19TdGF0dXMgIFNldEVuY29kZVBhcmFtKEFWQ0hhbmRsZSogYXZjSGFuZGxlLCBBVkNFbmNQYXJhbXMqIGVuY1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0U1BTLCB2b2lkKiBleHRQUFMpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIHZvaWQgKnVzZXJEYXRhID0gYXZjSGFuZGxlLT51c2VyRGF0YTsKKyAgICBpbnQgaWksIG1heEZyYW1lTnVtOworCisgICAgQVZDU2VxUGFyYW1TZXQqIGV4dFMgPSBOVUxMOworICAgIEFWQ1BpY1BhcmFtU2V0KiBleHRQID0gTlVMTDsKKworICAgIGlmIChleHRTUFMpIGV4dFMgPSAoQVZDU2VxUGFyYW1TZXQqKSBleHRTUFM7CisgICAgaWYgKGV4dFBQUykgZXh0UCA9IChBVkNQaWNQYXJhbVNldCopIGV4dFBQUzsKKworICAgIC8qIFRoaXMgcGFydCBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgZW5jb2Rpbmcgb3B0aW9ucyB0aGlzCisgICAgbGlicmFyeSBzdXBwb3J0cyBpbiBzZXFQYXJhbSwgcGljUGFyYW0gYW5kIHNsaWNlSGRyIHN0cnVjdHVyZXMgYW5kCisgICAgYWxzbyBjb3B5IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZW5jUGFyYW0gaW50byB0aGUgYWJvdmUgMyBzdHJ1Y3R1cmVzLgorCisgICAgU29tZSBwYXJhbWV0ZXJzIHdpbGwgYmUgYXNzaWduZWQgbGF0ZXIgd2hlbiB3ZSBlbmNvZGUgU1BTIG9yIFBQUyBzdWNoIGFzCisgICAgdGhlIHNlcV9wYXJhbWV0ZXJfaWQgb3IgcGljX3BhcmFtZXRlcl9pZC4gQWxzbyBzb21lIG9mIHRoZSBzbGljZSBwYXJhbWV0ZXJzCisgICAgaGF2ZSB0byBiZSByZS1hc3NpZ25lZCBwZXIgc2xpY2UgYmFzaXMgc3VjaCBhcyBmcmFtZV9udW0sIHNsaWNlX3R5cGUsCisgICAgZmlyc3RfbWJfaW5fc2xpY2UsIHBpY19vcmRlcl9jbnRfbHNiLCBzbGljZV9xcF9kZWx0YSwgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlICovCisKKyAgICAvKiBwcm9maWxlX2lkYywgY29uc3RyYWluZWRfc2V0eF9mbGFnIGFuZCBsZXZlbF9pZGMgaXMgc2V0IGJ5IFZlcmlmeVByb2ZpbGUoKSwKKyAgICBhbmQgVmVyaWZ5TGV2ZWwoKSBmdW5jdGlvbnMgbGF0ZXIuICovCisKKyAgICBlbmN2aWQtPmZ1bGxzZWFyY2hfZW5hYmxlID0gZW5jUGFyYW0tPmZ1bGxzZWFyY2g7CisKKyAgICBlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID0gKChlbmNQYXJhbS0+b3V0X29mX2JhbmRfcGFyYW1fc2V0ID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0UpOworCisgICAgLyogcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gdGhlIHRoZSBlbmNQYXJhbSB0aGF0IGFyZSB1c2VkIGluIFNQUyAqLworICAgIGlmIChleHRTKQorICAgIHsKKyAgICAgICAgdmlkZW8tPk1heFBpY09yZGVyQ250THNiID0gIDEgPDwgKGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOworICAgICAgICB2aWRlby0+UGljV2lkdGhJbk1icyA9IGV4dFMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMTsKKyAgICAgICAgdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgPSBleHRTLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxIDsKKyAgICAgICAgdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnMgPSAoMiAtIGV4dFMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICogdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IgPSAgMSA8PCAoZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNCArIDQpOworICAgICAgICB2aWRlby0+UGljV2lkdGhJbk1icyA9IChlbmNQYXJhbS0+d2lkdGggKyAxNSkgPj4gNDsgLyogcm91bmQgaXQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KKyAgICAgICAgdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnMgPSAoZW5jUGFyYW0tPmhlaWdodCArIDE1KSA+PiA0OyAvKiByb3VuZCBpdCB0byBtdWx0aXBsZSBvZiAxNiAqLworICAgICAgICB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA9IHZpZGVvLT5GcmFtZUhlaWdodEluTWJzOworICAgIH0KKworICAgIHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIDE2IDsKKyAgICBpZiAodmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCArIDMyID4gMHhGRkZGKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOyAvLyB3ZSB1c2UgMi1ieXRlcyBmb3IgcGl0Y2gKKyAgICB9CisKKyAgICB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNDID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiA4IDsKKyAgICB2aWRlby0+UGljSGVpZ2h0SW5NYnMgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1iczsKKyAgICB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzIDsKKyAgICB2aWRlby0+UGljSGVpZ2h0SW5TYW1wbGVzTCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1icyAqIDE2OworICAgIHZpZGVvLT5QaWNIZWlnaHRJblNhbXBsZXNDID0gdmlkZW8tPlBpY0hlaWdodEluTWJzICogODsKKyAgICB2aWRlby0+UGljU2l6ZUluTWJzID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiB2aWRlby0+UGljSGVpZ2h0SW5NYnM7CisKKyAgICBpZiAoIWV4dFMgJiYgIWV4dFApCisgICAgeworICAgICAgICBtYXhGcmFtZU51bSA9IChlbmNQYXJhbS0+aWRyX3BlcmlvZCA9PSAtMSkgPyAoMSA8PCAxNikgOiBlbmNQYXJhbS0+aWRyX3BlcmlvZDsKKyAgICAgICAgaWkgPSAwOworICAgICAgICB3aGlsZSAobWF4RnJhbWVOdW0gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpaSsrOworICAgICAgICAgICAgbWF4RnJhbWVOdW0gPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlpIDwgNCkgaWkgPSA0OworICAgICAgICBlbHNlIGlmIChpaSA+IDE2KSBpaSA9IDE2OworCisgICAgICAgIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gaWkgLSA0Oy8vTE9HMl9NQVhfRlJBTUVfTlVNX01JTlVTNDsgLyogZGVmYXVsdCAqLworCisgICAgICAgIHZpZGVvLT5NYXhGcmFtZU51bSA9IDEgPDwgaWk7IC8vKExPRzJfTUFYX0ZSQU1FX05VTV9NSU5VUzQgKyA0KTsgLyogZGVmYXVsdCAqLworICAgICAgICB2aWRlby0+TWF4UGljTnVtID0gdmlkZW8tPk1heEZyYW1lTnVtOworCisgICAgICAgIC8qKioqKioqKioqKioqIHNldCB0aGUgU1BTICoqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IDA7IC8qIHN0YXJ0IHdpdGggemVybyAqLworICAgICAgICAvKiBQT0MgKi8KKyAgICAgICAgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9IGVuY1BhcmFtLT5wb2NfdHlwZTsgLyogUE9DIHR5cGUgKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5wb2NfdHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLyplbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180PDAgfHwgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpKi8KKyAgICAgICAgICAgICAgICBlbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180ID4gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX1BPQ19MU0I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbmNQYXJhbS0+cG9jX3R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnID0gZW5jUGFyYW0tPmRlbHRhX3BvY196ZXJvX2ZsYWc7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyA9IGVuY1BhcmFtLT5vZmZzZXRfcG9jX25vbl9yZWY7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0gZW5jUGFyYW0tPm9mZnNldF90b3BfYm90dG9tOworICAgICAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBlbmNQYXJhbS0+bnVtX3JlZl9pbl9jeWNsZTsKKyAgICAgICAgICAgIGlmIChlbmNQYXJhbS0+b2Zmc2V0X3BvY19yZWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgZW5jUGFyYW0tPm51bV9yZWZfZnJhbWU7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXSA9IGVuY1BhcmFtLT5vZmZzZXRfcG9jX3JlZltpaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICBpZiAoZW5jUGFyYW0tPm51bV9yZWZfZnJhbWUgPiAxNiB8fCBlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fUkVGOworICAgICAgICB9CisgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyA9IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lOyAvKiBudW0gcmVmZXJlbmNlIGZyYW1lIHJhbmdlIDAuLi4xNiovCisgICAgICAgIHNlcVBhcmFtLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPnBpY193aWR0aF9pbl9tYnNfbWludXMxID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgLSAxOworICAgICAgICBzZXFQYXJhbS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgLSAxOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IFRSVUU7CisgICAgICAgIHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIH0KKyAgICBlbHNlIGlmIChleHRTKSAvLyB1c2UgZXh0ZXJuYWwgU1BTIGFuZCBQUFMKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IGV4dFMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkOworICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IGV4dFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7CisgICAgICAgIHZpZGVvLT5NYXhGcmFtZU51bSA9IDEgPDwgKGV4dFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKKyAgICAgICAgdmlkZW8tPk1heFBpY051bSA9IHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgaWYgKGVuY1BhcmFtLT5pZHJfcGVyaW9kID4gKGludCkodmlkZW8tPk1heEZyYW1lTnVtKSB8fCAoZW5jUGFyYW0tPmlkcl9wZXJpb2QgPT0gLTEpKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbS0+aWRyX3BlcmlvZCA9IChpbnQpdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9IGV4dFMtPnBpY19vcmRlcl9jbnRfdHlwZTsKKyAgICAgICAgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC8qZXh0Uy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0PDAgfHwgKG5vIG5lZWQgaXQncyB1bnNpZ25lZCkqLworICAgICAgICAgICAgICAgIGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA+IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9QT0NfTFNCOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VxUGFyYW0tPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9IGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IGV4dFMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPSBleHRTLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCA9IGV4dFMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlID0gZXh0Uy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKKyAgICAgICAgICAgIGlmIChleHRTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KSBleHRTLT5udW1fcmVmX2ZyYW1lczsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaWldID0gZXh0Uy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaWldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgaWYgKGV4dFMtPm51bV9yZWZfZnJhbWVzID4gMTYgLyp8fCBleHRTLT5udW1fcmVmX2ZyYW1lczwwIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSovKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfTlVNX1JFRjsKKyAgICAgICAgfQorICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgPSBleHRTLT5udW1fcmVmX2ZyYW1lczsgLyogbnVtIHJlZmVyZW5jZSBmcmFtZSByYW5nZSAwLi4uMTYqLworICAgICAgICBzZXFQYXJhbS0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0gZXh0Uy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOworICAgICAgICBzZXFQYXJhbS0+cGljX3dpZHRoX2luX21ic19taW51czEgPSBleHRTLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMTsKKyAgICAgICAgc2VxUGFyYW0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IGV4dFMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMTsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcgPSBleHRTLT5mcmFtZV9tYnNfb25seV9mbGFnOworICAgICAgICBpZiAoZXh0Uy0+ZnJhbWVfbWJzX29ubHlfZmxhZyAhPSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgc2VxUGFyYW0tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgPSBleHRTLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnOworICAgICAgICBpZiAoZXh0Uy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyAhPSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSBleHRTLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IGV4dFMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgOworICAgICAgICBpZiAoZXh0Uy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyAhPSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBleHRTLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgICAgIGlmIChleHRTLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSgmKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVycyksICYoZXh0Uy0+dnVpX3BhcmFtZXRlcnMpLCBzaXplb2YoQVZDVlVJUGFyYW1zKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKiBub3cgUFBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoIWV4dFAgJiYgIWV4dFMpCisgICAgeworICAgICAgICBwaWNQYXJhbS0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAodWludCkoLTEpOyAvKiBzdGFydCB3aXRoIHplcm8gKi8KKyAgICAgICAgcGljUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gKHVpbnQpKC0xKTsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPSAwOyAvKiBkZWZhdWx0IHRvIENBVkxDICovCisgICAgICAgIHBpY1BhcmFtLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnID0gMDsgLyogZGVmYXVsdCBmb3Igbm93LCB3aWxsIG5lZWQgaXQgZm9yIEItc2xpY2UgKi8KKyAgICAgICAgLyogRk1PICovCisgICAgICAgIGlmIChlbmNQYXJhbS0+bnVtX3NsaWNlX2dyb3VwIDwgMSB8fCBlbmNQYXJhbS0+bnVtX3NsaWNlX2dyb3VwID4gTUFYX05VTV9TTElDRV9HUk9VUCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX05VTV9TTElDRUdST1VQOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9IGVuY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXAgLSAxOworCisgICAgICAgIGlmIChwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSBlbmNQYXJhbS0+Zm1vX3R5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGVuY1BhcmFtLT5mbW9fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8PSAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lpXSA9IGVuY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnRvcF9sZWZ0W2lpXSA9IGVuY1BhcmFtLT50b3BfbGVmdFtpaV07CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lpXSA9IGVuY1BhcmFtLT5ib3R0b21fcmlnaHRbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW0tPmNoYW5nZV9kaXJfZmxhZyA9PSBBVkNfT04pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgvKmVuY1BhcmFtLT5jaGFuZ2VfcmF0ZV9taW51czEgPCAwIHx8IChubyBuZWVkIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbS0+Y2hhbmdlX3JhdGVfbWludXMxID4gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0NIQU5HRV9SQVRFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPSBlbmNQYXJhbS0+Y2hhbmdlX3JhdGVfbWludXMxOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUgPSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkICovCisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9ICh1aW50KilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQpICogdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzLCBERUZBVUxUX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW0tPnNsaWNlX2dyb3VwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludCl2aWRlby0+UGljU2l6ZUluTWFwVW5pdHM7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZFtpaV0gPSBlbmNQYXJhbS0+c2xpY2VfZ3JvdXBbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9GTU9fVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lIC0gMTsgLyogYXNzdW1lIGZyYW1lIG9ubHkgKi8KKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPSAwOyAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAwOyAvKiBubyB3ZWlnaHRlZCBwcmVkaWN0aW9uIHN1cHBvcnRlZCAqLworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IDA7IC8qIHJhbmdlIDAsMSwyICovCisgICAgICAgIGlmICgvKnBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19XRUlHSFRFRF9CSVBSRURfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA9IDA7IC8qIGRlZmF1bHQsIHdpbGwgYmUgY2hhbmdlZCBhdCBzbGljZSBsZXZlbCBhbnl3YXkgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA9IDA7CisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKworICAgICAgICBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA9IDA7IC8qIGRlZmF1bHQgdG8gemVybyBmb3Igbm93ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA8IC0xMiB8fCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA+IDEyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0NIUk9NQV9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBkZWJsb2NraW5nICovCisgICAgICAgIHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IChlbmNQYXJhbS0+ZGJfZmlsdGVyID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0UgOworICAgICAgICAvKiBjb25zdHJhaW5lZCBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgICAgIHBpY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSAoZW5jUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgcGljUGFyYW0tPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IDA7IC8qIGRlZmF1bHQgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZXh0UCkvLyBleHRlcm5hbCBQUFMKKyAgICB7CisgICAgICAgIHBpY1BhcmFtLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IGV4dFAtPnBpY19wYXJhbWV0ZXJfc2V0X2lkIC0gMTsgLyogdG8gYmUgaW5jcmVhc2VkIGJ5IG9uZSAqLworICAgICAgICBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBleHRQLT5zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IGV4dFAtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZzsKKyAgICAgICAgaWYgKGV4dFAtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAhPSAwKSAvKiBkZWZhdWx0IHRvIENBVkxDICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IGV4dFAtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWc7IC8qIGRlZmF1bHQgZm9yIG5vdywgd2lsbCBuZWVkIGl0IGZvciBCLXNsaWNlICovCisgICAgICAgIGlmIChleHRQLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICAvKiBGTU8gKi8KKyAgICAgICAgaWYgKC8qKGV4dFAtPm51bV9zbGljZV9ncm91cHNfbWludXMxPDApIHx8IChubyBuZWVkIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICAoZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiBNQVhfTlVNX1NMSUNFX0dST1VQIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fU0xJQ0VHUk9VUDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPSBleHRQLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsKKworICAgICAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID0gZXh0UC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGV4dFAtPnNsaWNlX2dyb3VwX21hcF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDw9IChpbnQpZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV0gPSBleHRQLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnRvcF9sZWZ0W2lpXSA9IGV4dFAtPnRvcF9sZWZ0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ib3R0b21fcmlnaHRbaWldID0gZXh0UC0+Ym90dG9tX3JpZ2h0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9IGV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC8qZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA+IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9DSEFOR0VfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxID0gZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUgPSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBpZiAoZXh0UC0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSAhPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9IGV4dFAtPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkICovCisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9ICh1aW50KilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQpICogdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzLCBERUZBVUxUX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0UC0+c2xpY2VfZ3JvdXBfaWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXZpZGVvLT5QaWNTaXplSW5NYXBVbml0czsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkW2lpXSA9IGV4dFAtPnNsaWNlX2dyb3VwX2lkW2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfRk1PX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSBleHRQLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IGV4dFAtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7IC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHRQLT53ZWlnaHRlZF9wcmVkX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAwOyAvKiBubyB3ZWlnaHRlZCBwcmVkaWN0aW9uIHN1cHBvcnRlZCAqLworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IGV4dFAtPndlaWdodGVkX2JpcHJlZF9pZGM7IC8qIHJhbmdlIDAsMSwyICovCisgICAgICAgIGlmICgvKnBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19XRUlHSFRFRF9CSVBSRURfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA9IGV4dFAtPnBpY19pbml0X3FwX21pbnVzMjY7IC8qIGRlZmF1bHQsIHdpbGwgYmUgY2hhbmdlZCBhdCBzbGljZSBsZXZlbCBhbnl3YXkgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA9IGV4dFAtPnBpY19pbml0X3FzX21pbnVzMjY7CisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKworICAgICAgICBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA9IGV4dFAtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQ7IC8qIGRlZmF1bHQgdG8gemVybyBmb3Igbm93ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA8IC0xMiB8fCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA+IDEyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0NIUk9NQV9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBkZWJsb2NraW5nICovCisgICAgICAgIHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGV4dFAtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOworICAgICAgICAvKiBjb25zdHJhaW5lZCBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgICAgIHBpY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSBleHRQLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWc7CisgICAgICAgIGlmIChleHRQLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gZXh0UC0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOyAvKiBkZWZhdWx0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqIG5vdyBzZXQgdXAgc29tZSBTbGljZUhlYWRlciBwYXJhbWV0ZXJzICoqKioqKioqKioqLworICAgIGlmIChwaWNQYXJhbS0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8qIHRoZXNlIHZhbHVlcyBvbmx5IHByZXNlbnQgd2hlbiBkYl9maWx0ZXIgaXMgT04gKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5kaXNhYmxlX2RiX2lkYyA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9ERUJMT0NLX0lEQzsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgc2xpY2VIZHItPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjID0gZW5jUGFyYW0tPmRpc2FibGVfZGJfaWRjOworCisgICAgICAgIGlmIChlbmNQYXJhbS0+YWxwaGFfb2Zmc2V0IDwgLTYgfHwgZW5jUGFyYW0tPmFscGhhX29mZnNldCA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9BTFBIQV9PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgICAgc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyID0gZW5jUGFyYW0tPmFscGhhX29mZnNldDsKKworICAgICAgICBpZiAoZW5jUGFyYW0tPmJldGFfb2Zmc2V0IDwgLTYgfHwgZW5jUGFyYW0tPmJldGFfb2Zmc2V0ID4gNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0JFVEFfT0ZGU0VUOworICAgICAgICB9CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV9iZXRhX29mZnNldF9kaXZfMiA9ICBlbmNQYXJhbS0+YmV0YV9vZmZzZXQ7CisgICAgfQorICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpCisgICAgeworICAgICAgICBzbGljZUhkci0+aWRyX3BpY19pZCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5pZHJfcGljX2lkID0gKHVpbnQpKC0xKTsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgfQorICAgIHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9IEZBTFNFOworICAgIHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZyA9IEZBTFNFOyAgLyogd29uJ3QgYmUgdXNlZCBhbnl3YXkgKi8KKyAgICB2aWRlby0+TWJhZmZGcmFtZUZsYWcgPSAoc2VxUGFyYW0tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyk7CisKKyAgICAvKiB0aGUgcmVzdCB3aWxsIGJlIHNldCBpbiBJbml0U2xpY2UoKSAqLworCisgICAgLyogbm93IHRoZSByYXRlIGNvbnRyb2wgYW5kIHBlcmZvcm1hbmNlIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgIHJhdGVDdHJsLT5zY2RFbmFibGUgPSAoZW5jUGFyYW0tPmF1dG9fc2NkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPmlkclBlcmlvZCA9IGVuY1BhcmFtLT5pZHJfcGVyaW9kICsgMTsKKyAgICByYXRlQ3RybC0+aW50cmFNQlJhdGUgPSBlbmNQYXJhbS0+aW50cmFtYl9yZWZyZXNoOworICAgIHJhdGVDdHJsLT5kcEVuYWJsZSA9IChlbmNQYXJhbS0+ZGF0YV9wYXIgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKworICAgIHJhdGVDdHJsLT5zdWJQZWxFbmFibGUgPSAoZW5jUGFyYW0tPnN1Yl9wZWwgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+bXZSYW5nZSA9IGVuY1BhcmFtLT5zZWFyY2hfcmFuZ2U7CisKKyAgICByYXRlQ3RybC0+c3ViTUJFbmFibGUgPSAoZW5jUGFyYW0tPnN1Ym1iX3ByZWQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+cmRPcHRFbmFibGUgPSAoZW5jUGFyYW0tPnJkb3B0X21vZGUgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+YmlkaXJQcmVkID0gKGVuY1BhcmFtLT5iaWRpcl9wcmVkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisKKyAgICByYXRlQ3RybC0+cmNFbmFibGUgPSAoZW5jUGFyYW0tPnJhdGVfY29udHJvbCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5pbml0UVAgPSBlbmNQYXJhbS0+aW5pdFFQOworICAgIHJhdGVDdHJsLT5pbml0UVAgPSBBVkNfQ0xJUDMoMCwgNTEsIHJhdGVDdHJsLT5pbml0UVApOworCisgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPSBlbmNQYXJhbS0+Yml0cmF0ZTsKKyAgICByYXRlQ3RybC0+Y3BiU2l6ZSA9IGVuY1BhcmFtLT5DUEJfc2l6ZTsKKyAgICByYXRlQ3RybC0+aW5pdERlbGF5T2Zmc2V0ID0gKHJhdGVDdHJsLT5iaXRSYXRlICogZW5jUGFyYW0tPmluaXRfQ0JQX3JlbW92YWxfZGVsYXkgLyAxMDAwKTsKKworICAgIGlmIChlbmNQYXJhbS0+ZnJhbWVfcmF0ZSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0ZSQU1FUkFURTsKKyAgICB9CisKKyAgICByYXRlQ3RybC0+ZnJhbWVfcmF0ZSA9IChPc2NsRmxvYXQpKGVuY1BhcmFtLT5mcmFtZV9yYXRlICogMS4wIC8gMTAwMCk7CisvLyAgcmF0ZUN0cmwtPnNyY0ludGVydmFsID0gZW5jUGFyYW0tPnNyY19pbnRlcnZhbDsKKyAgICByYXRlQ3RybC0+Zmlyc3RfZnJhbWUgPSAxOyAvKiBzZXQgdGhpcyBmbGFnIGZvciB0aGUgZmlyc3QgdGltZSAqLworCisgICAgLyogY29udHJhaW5lZF9zZXR4X2ZsYWcgd2lsbCBiZSBzZXQgaW5zaWRlIHRoZSBWZXJpZnlQcm9maWxlIGNhbGxlZCBiZWxvdy4qLworICAgIGlmICghZXh0UyAmJiAhZXh0UCkKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IGVuY1BhcmFtLT5wcm9maWxlOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5sZXZlbF9pZGMgPSBlbmNQYXJhbS0+bGV2ZWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IGV4dFMtPnByb2ZpbGVfaWRjOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0MF9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MV9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0MV9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0M19mbGFnOworICAgICAgICBzZXFQYXJhbS0+bGV2ZWxfaWRjID0gZXh0Uy0+bGV2ZWxfaWRjOworICAgIH0KKworCisgICAgc3RhdHVzID0gVmVyaWZ5UHJvZmlsZShlbmN2aWQsIHNlcVBhcmFtLCBwaWNQYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gVmVyaWZ5TGV2ZWwoZW5jdmlkLCBzZXFQYXJhbSwgcGljUGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogdmVyaWZ5IHRoZSBwcm9maWxlIHNldHRpbmcgKi8KK0FWQ0VuY19TdGF0dXMgVmVyaWZ5UHJvZmlsZShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pCit7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgaWYgKHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9PSAwKSAvKiBmaW5kIHByb2ZpbGUgZm9yIHRoaXMgc2V0dGluZyAqLworICAgIHsKKyAgICAgICAgLyogZmluZCB0aGUgcmlnaHQgcHJvZmlsZSBmb3IgaXQgKi8KKyAgICAgICAgaWYgKHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID09IFRSVUUgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxIDw9IDcgLyomJgorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPj0wIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLykKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gQVZDX0VYVEVOREVEOworICAgICAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmF0ZUN0cmwtPmRwRW5hYmxlID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID09IDAgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBBVkNfTUFJTjsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5iaWRpclByZWQgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+ZHBFbmFibGUgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9PSBUUlVFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDAgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxIDw9IDcgLyomJgorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPj0wIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSovKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBBVkNfQkFTRUxJTkU7CisgICAgICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPT0gMCkgLyogc3RpbGwgemVybyAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9maWxlIGJ5IHRoaXMgbGlicmFyeSAqLworICAgIHN3aXRjaCAoc2VxUGFyYW0tPnByb2ZpbGVfaWRjKQorICAgIHsKKyAgICAgICAgY2FzZSBBVkNfQkFTRUxJTkU6CisgICAgICAgICAgICBpZiAocmF0ZUN0cmwtPmJpZGlyUHJlZCA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5kcEVuYWJsZSA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnICE9IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjICE9IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDcgLyp8fAorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPDAgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVkNfTUFJTjoKKyAgICAgICAgY2FzZSBBVkNfRVhURU5ERUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHZlcmlmeSB0aGUgbGV2ZWwgc2V0dGluZyAqLworQVZDRW5jX1N0YXR1cyBWZXJpZnlMZXZlbChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pCit7CisgICAgKHZvaWQpKHBpY1BhcmFtKTsKKworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBtYl9wZXJfc2VjLCBpaTsKKyAgICBpbnQgbGV2X2lkeDsKKyAgICBpbnQgZHBiX3NpemU7CisKKyAgICBtYl9wZXJfc2VjID0gKGludCkodmlkZW8tPlBpY1NpemVJbk1icyAqIHJhdGVDdHJsLT5mcmFtZV9yYXRlICsgMC41KTsKKyAgICBkcGJfc2l6ZSA9IChzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgKiB2aWRlby0+UGljU2l6ZUluTWJzICogMykgPj4gNjsKKworICAgIGlmIChzZXFQYXJhbS0+bGV2ZWxfaWRjID09IDApIC8qIGZpbmQgbGV2ZWwgZm9yIHRoaXMgc2V0dGluZyAqLworICAgIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgTUFYX0xFVkVMX0lEWDsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1iX3Blcl9zZWMgPD0gTWF4TUJQU1tpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlBpY1NpemVJbk1icyA8PSAodWludClNYXhGU1tpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPD0gKGludDMyKU1heEJSW2lpXSoxMDAwICYmCisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5jcGJTaXplIDw9IChpbnQzMilNYXhDUEJbaWldKjEwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPm12UmFuZ2UgPD0gTWF4Vm12UltpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgZHBiX3NpemUgPD0gTWF4RFBCWDJbaWldKjUxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+bGV2ZWxfaWRjID0gbWFwSWR4MkxldltpaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcVBhcmFtLT5sZXZlbF9pZGMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19MRVZFTF9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhpcyBsZXZlbCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5ICovCisgICAgbGV2X2lkeCA9IG1hcExldjJJZHhbc2VxUGFyYW0tPmxldmVsX2lkY107CisgICAgaWYgKHNlcVBhcmFtLT5sZXZlbF9pZGMgPT0gQVZDX0xFVkVMMV9CKQorICAgIHsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyA9IDE7CisgICAgfQorCisKKyAgICBpZiAobGV2X2lkeCA9PSAyNTUpIC8qIG5vdCBkZWZpbmVkICovCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhlIGVuY29kaW5nIHNldHRpbmcgY29tcGxpZXMgd2l0aCB0aGUgbGV2ZWwgKi8KKyAgICBpZiAobWJfcGVyX3NlYyA+IE1heE1CUFNbbGV2X2lkeF0gfHwKKyAgICAgICAgICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgPiAodWludClNYXhGU1tsZXZfaWR4XSB8fAorICAgICAgICAgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPiAoaW50MzIpTWF4QlJbbGV2X2lkeF0qMTAwMCB8fAorICAgICAgICAgICAgcmF0ZUN0cmwtPmNwYlNpemUgPiAoaW50MzIpTWF4Q1BCW2xldl9pZHhdKjEwMDAgfHwKKyAgICAgICAgICAgIHJhdGVDdHJsLT5tdlJhbmdlID4gTWF4Vm12UltsZXZfaWR4XSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTEVWRUxfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIGluaXRpYWxpemUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZSAqLworLyogZGV0ZXJtaW5lIHRoZSBwaWN0dXJlIHR5cGUgKi8KKy8qIGVuY29kZSBQT0MgKi8KKy8qIG1heWJlIHdlIHNob3VsZCBkbyBtb3JlIHN0dWZmIGhlcmUuIE1vdGlvbkVzdGltYXRpb24rU0NEIGFuZCBnZW5lcmF0ZSBhIG5ldyBTUFMgYW5kIFBQUyAqLworQVZDRW5jX1N0YXR1cyBJbml0RnJhbWUoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDU3RhdHVzIHJldDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworCisgICAgLyogbG9vayBmb3IgdGhlIG5leHQgZnJhbWUgaW4gY29kaW5nX29yZGVyIGFuZCBsb29rIGZvciBhdmFpbGFibGUgcGljdHVyZQorICAgICAgIGluIHRoZSBEUEIuIE5vdGUsIHZpZGVvLT5jdXJyRlMtPlBpY09yZGVyQ250LCBjdXJyRlMtPkZyYW1lTnVtIGFuZCBjdXJyUGljLT5QaWNOdW0KKyAgICAgICBhcmUgc2V0IHRvIHdyb25nIG51bWJlciBpbiB0aGlzIGZ1bmN0aW9uIChyaWdodCBmb3IgZGVjb2RlcikuICovCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIC8vIGNhbGwgaW5pdCBEUEIgaW4gaGVyZS4KKyAgICAgICAgcmV0ID0gQVZDQ29uZmlndXJlU2VxdWVuY2UoZW5jdmlkLT5hdmNIYW5kbGUsIHZpZGVvLCBUUlVFKTsKKyAgICAgICAgaWYgKHJldCAhPSBBVkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZyAoZXZlcnkgZnJhbWUpKi8KKyAgICAvKiBwb3B1bGF0ZSB2aWRlby0+bWFwVW5pdFRvU2xpY2VHcm91cE1hcCBhbmQgdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwICovCisgICAgLyogSXQgY2hhbmdlcyBvbmNlIHBlciBlYWNoIFBQUy4gKi8KKyAgICBGTU9Jbml0KHZpZGVvKTsKKworICAgIHJldCA9IERQQkluaXRCdWZmZXIoZW5jdmlkLT5hdmNIYW5kbGUsIHZpZGVvKTsgLy8gZ2V0IG5ldyBidWZmZXIKKworICAgIGlmIChyZXQgIT0gQVZDX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gKEFWQ0VuY19TdGF0dXMpcmV0OyAvLyBBVkNFTkNfUElDVFVSRV9SRUFEWSwgRkFJTAorICAgIH0KKworICAgIERQQkluaXRQaWModmlkZW8sIDApOyAvKiAwIGlzIGR1bW15ICovCisKKyAgICAvKioqKioqKioqKioqKiBkZXRlcm1pbmUgcGljdHVyZSB0eXBlIElEUiBvciBub24tSURSICoqKioqKioqKioqLworICAgIHZpZGVvLT5jdXJyUGljVHlwZSA9IEFWQ19GUkFNRTsKKyAgICB2aWRlby0+c2xpY2VfZGF0YV9wYXJ0aXRpb25pbmcgPSBGQUxTRTsKKyAgICBlbmN2aWQtPmN1cnJJbnB1dC0+aXNfcmVmZXJlbmNlID0gMTsgLyogZGVmYXVsdCB0byBhbGwgZnJhbWVzICovCisgICAgdmlkZW8tPm5hbF9yZWZfaWRjID0gMTsgIC8qIG5lZWQgdG8gc2V0IHRoaXMgZm9yIEluaXRQT0MgKi8KKyAgICB2aWRlby0+Y3VyclBpYy0+aXNSZWZlcmVuY2UgPSBUUlVFOworCisgICAgLyoqKioqKioqKioqKiogc2V0IGZyYW1lX251bSAqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgdmlkZW8tPlByZXZSZWZGcmFtZU51bSA9IDA7CisgICAgICAgIHNsaWNlSGRyLT5mcmFtZV9udW0gPSAwOworICAgIH0KKyAgICAvKiBvdGhlcndpc2UsIGl0J3Mgc2V0IHRvIHByZXZpb3VzIHJlZmVyZW5jZSBmcmFtZSBhY2Nlc3MgdW5pdCdzIGZyYW1lX251bSBpbiBkZWNvZGluZyBvcmRlciwKKyAgICAgICBzZWUgdGhlIGVuZCBvZiBQVkFWQ0RlY29kZVNsaWNlKCkqLworICAgIC8qIFRoZXJlJ3MgYWxzbyByZXN0cmljdGlvbiBvbiB0aGUgZnJhbWVfbnVtLCBzZWUgcGFnZSA1OSBvZiBKVlQtSTEwMTAuZG9jLiAqLworICAgIC8qIEJhc2ljYWxseSwgZnJhbWVfbnVtIGNhbid0IGJlIHJlcGVhdGVkIHVubGVzcyBpdCdzIG9wcG9zaXRlIGZpZWxkcyBvciBub24gcmVmZXJlbmNlIGZpZWxkcyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5mcmFtZV9udW0gPSAodmlkZW8tPlByZXZSZWZGcmFtZU51bSArIDEpICUgdmlkZW8tPk1heEZyYW1lTnVtOworICAgIH0KKyAgICB2aWRlby0+Q3VyclBpY051bSA9IHNsaWNlSGRyLT5mcmFtZV9udW07ICAvKiBmb3IgZmllbGRfcGljX2ZsYWcgPSAwICovCisgICAgLy92aWRlby0+Q3VyclBpY051bSA9IDIqc2xpY2VIZHItPmZyYW1lX251bSArIDE7IC8qIGZvciBmaWVsZF9waWNfZmxhZyA9IDEgKi8KKworICAgIC8qIGFzc2lnbiBwaWNfb3JkZXJfY250LCB2aWRlby0+UGljT3JkZXJDbnQgKi8KKyAgICBzdGF0dXMgPSBJbml0UE9DKGVuY3ZpZCk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIGluY29ycmlnYWJsZSBmYWlsICovCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgcmVmTGlzdElkeCBmb3IgdGhpcyBwaWN0dXJlICovCisgICAgUmVmTGlzdEluaXQodmlkZW8pOworCisgICAgLyoqKioqKioqKioqKiogbW90aW9uIGVzdGltYXRpb24gYW5kIHNjZW5lIGFuYWx5c2lzICoqKioqKioqKioqKi8KKyAgICAvLyAsIHRvIG1vdmUgdGhpcyB0byBNQi1iYXNlZCBNViBzZWFyY2ggZm9yIGNvbXBhcmlzb24KKyAgICAvLyB1c2Ugc3ViLW9wdGltYWwgUVAgZm9yIG12IHNlYXJjaAorICAgIEFWQ01vdGlvbkVzdGltYXRpb24oZW5jdmlkKTsgIC8qIEFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19ORVdfSURSICovCisKKyAgICAvKiBhZnRlciB0aGlzIHBvaW50LCB0aGUgcGljdHVyZSB0eXBlIHdpbGwgYmUgZml4ZWQgdG8gZWl0aGVyIElEUiBvciBub24tSURSICovCisgICAgdmlkZW8tPmN1cnJGUy0+UGljT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgdmlkZW8tPmN1cnJGUy0+RnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKKyAgICB2aWRlby0+Y3VyclBpYy0+UGljTnVtID0gdmlkZW8tPkN1cnJQaWNOdW07CisgICAgdmlkZW8tPm1iTnVtID0gMDsgLyogc3RhcnQgZnJvbSB6ZXJvIE1CICovCisgICAgZW5jdmlkLT5jdXJyU2xpY2VHcm91cCA9IDA7IC8qIHN0YXJ0IGZyb20gc2xpY2UgZ3JvdXAgIzAgKi8KKyAgICBlbmN2aWQtPm51bUludHJhTUIgPSAwOyAvKiByZXNldCB0aGlzIGNvdW50ZXIgKi8KKworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICBSQ0luaXRHT1AoZW5jdmlkKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgcGljdHVyZSBRUCAqLworICAgICAgICBSQ0luaXRGcmFtZVFQKGVuY3ZpZCk7CisKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19ORVdfSURSOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBwaWN0dXJlIFFQICovCisgICAgUkNJbml0RnJhbWVRUChlbmN2aWQpOyAvKiBnZXQgUVAgYWZ0ZXIgTVYgc2VhcmNoICovCisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIGluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGlzIHNsaWNlICovCitBVkNFbmNfU3RhdHVzIEluaXRTbGljZShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1BpY1BhcmFtU2V0ICpjdXJyUFBTID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBpbnQgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgc2xpY2VIZHItPmZpcnN0X21iX2luX3NsaWNlID0gdmlkZW8tPm1iTnVtOworICAgIGlmICh2aWRlby0+bWJOdW0pIC8vIG5vdCBmaXJzdCBzbGljZSBvZiBhIGZyYW1lCisgICAgeworICAgICAgICB2aWRlby0+c2xpY2VIZHItPnNsaWNlX3R5cGUgPSAoQVZDU2xpY2VUeXBlKXNsaWNlX3R5cGU7CisgICAgfQorCisgICAgLyogc2xpY2VIZHItPnNsaWNlX3R5cGUgYWxyZWFkeSBzZXQgaW4gSW5pdEZyYW1lICovCisKKyAgICBzbGljZUhkci0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSB2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICAvKiBzbGljZUhkci0+ZnJhbWVfbnVtIGFscmVhZHkgc2V0IGluIEluaXRGcmFtZSAqLworCisgICAgaWYgKCFjdXJyU1BTLT5mcmFtZV9tYnNfb25seV9mbGFnKSAgLyogd2Ugc2hvdWxkbid0IG5lZWQgdGhpcyBjaGVjayAqLworICAgIHsKKyAgICAgICAgc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnID0gc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnID0gRkFMU0U7CisgICAgICAgIHJldHVybiBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBzbGljZUhkci0+aWRyX3BpY19pZCBhbHJlYWR5IHNldCBpbiBQVkFWQ0VuY29kZU5BTAorCisgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiBhbHJlYWR5IHNldCBpbiBJbml0RnJhbWUuLkluaXRQT0MKKyAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICBhbHJlYWR5IHNldCBpbiBJbml0UE9DCisKKyAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSBhbHJlYWR5IHNldCBpbiBJbml0UE9DCisgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gYWxyZWFkeSBzZXQgaW4gSW5pdFBPQworICAgICovCisKKyAgICBzbGljZUhkci0+cmVkdW5kYW50X3BpY19jbnQgPSAwOyAvKiBkZWZhdWx0IGlmKGN1cnJQUFMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyksIHJhbmdlIDAuLjEyNyAqLworICAgIHNsaWNlSGRyLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgPSAwOyAvLyBkZWZhdWx0IGlmKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisKKyAgICBzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCwgaWYoc2xpY2VfdHlwZT09IFAsU1Agb3IgQikqLworICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gMDsgLyogZGVmYXVsdCwgaWYgKG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKSAqLworICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gMDsgLyogZGVmYXVsdCwgaWYgYWJvdmUgYW5kIEJfc2xpY2UgKi8KKyAgICAvKiB0aGUgYWJvdmUgMiB2YWx1ZXMgcmFuZ2UgZnJvbSAwLi4xNSBmb3IgZnJhbWUgcGljdHVyZSBhbmQgMC4uMzEgZm9yIGZpZWxkIHBpY3R1cmUgKi8KKworICAgIC8qIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKCksIGN1cnJlbnRseSB3ZSBkb24ndCBkbyBhbnl0aGluZyAqLworICAgIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wwID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICBzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMSA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgLyogaWYgdGhlIGFib3ZlIGFyZSBUUlVFLCBzb21lIG90aGVyIHBhcmFtcyBtdXN0IGJlIHNldCAqLworCisgICAgaWYgKChjdXJyUFBTLT53ZWlnaHRlZF9wcmVkX2ZsYWcgJiYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UpKSB8fAorICAgICAgICAgICAgKGN1cnJQUFMtPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJiBzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKSkKKyAgICB7CisgICAgICAgIC8vICAgICAgcHJlZF93ZWlnaHRfdGFibGUoKTsgLy8gbm90IHN1cHBvcnRlZCAhIQorICAgICAgICByZXR1cm4gQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogZGVjX3JlZl9waWNfbWFya2luZygpLCB0aGlzIHdpbGwgYmUgZG9uZSBsYXRlciovCisgICAgc2xpY2VIZHItPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIHNsaWNlSGRyLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgPSBGQUxTRTsgLyogZm9yIElEUiBmcmFtZSwgZG8gbm90IG1ha2UgaXQgbG9uZyB0ZXJtICovCisgICAgc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIC8qIG90aGVyIHBhcmFtcyBhcmUgbm90IHNldCBoZXJlIGJlY2F1c2UgdGhleSBhcmUgbm90IHVzZWQgKi8KKworICAgIHNsaWNlSGRyLT5jYWJhY19pbml0X2lkYyA9IDA7IC8qIGRlZmF1bHQsIGlmIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAmJiBzbGljZV90eXBlPT1JIG9yIFNJLCByYW5nZSAwLi4yICAqLworICAgIHNsaWNlSGRyLT5zbGljZV9xcF9kZWx0YSA9IDA7IC8qIGRlZmF1bHQgZm9yIG5vdyAqLworICAgIHNsaWNlSGRyLT5zcF9mb3Jfc3dpdGNoX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCwgaWYgc2xpY2VfdHlwZSA9PSBTUCAqLworICAgIHNsaWNlSGRyLT5zbGljZV9xc19kZWx0YSA9IDA7IC8qIGRlZmF1bHQsIGlmIHNsaWNlX3R5cGUgPT0gU1Agb3IgU0kgKi8KKworICAgIC8qIGRlcml2ZWQgdmFyaWFibGVzIGZyb20gZW5jUGFyYW0gKi8KKyAgICAvKiBkZWJsb2NraW5nIGZpbHRlciAqLworICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRBID0gdmlkZW8tPkZpbHRlck9mZnNldEIgPSAwOworICAgIGlmIChjdXJyUFBTLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgdmlkZW8tPkZpbHRlck9mZnNldEEgPSBzbGljZUhkci0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgPDwgMTsKKyAgICAgICAgdmlkZW8tPkZpbHRlck9mZnNldEIgPSBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIgPDwgMTsKKyAgICB9CisKKyAgICAvKiBmbGV4aWJsZSBtYWNyb2Jsb2NrIG9yZGVyaW5nICovCisgICAgLyogcG9wdWxhdGUgdmlkZW8tPm1hcFVuaXRUb1NsaWNlR3JvdXBNYXAgYW5kIHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCAqLworICAgIC8qIFdlIGFscmVhZHkgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIFBWQVZDRW5jSW5pdGlhbGl6ZSgpLiBJdCBjaGFuZ2VzIG9uY2UgcGVyIGVhY2ggUFBTLiAqLworICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwICYmIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9tYXBfdHlwZSA+PSAzCisgICAgICAgICAgICAmJiB2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPD0gNSkKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgPSBTTElDRV9HUk9VUF9DSEFOR0VfQ1lDTEU7ICAvKiBkZWZhdWx0LCBkb24ndCB1bmRlcnN0YW5kIGhvdyB0byBzZXQgaXQhISEqLworCisgICAgICAgIHZpZGVvLT5NYXBVbml0c0luU2xpY2VHcm91cDAgPQorICAgICAgICAgICAgQVZDX01JTihzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlICogdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlLCB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMpOworCisgICAgICAgIEZNT0luaXQodmlkZW8pOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBTbGljZVFQeSBmaXJzdCAgKi8KKyAgICAvKiBjYWxjdWxhdGUgUVN5IGZpcnN0ICovCisKKyAgICBzbGljZUhkci0+c2xpY2VfcXBfZGVsdGEgPSB2aWRlby0+UVB5IC0gMjYgLSBjdXJyUFBTLT5waWNfaW5pdF9xcF9taW51czI2OworICAgIC8vc2xpY2VIZHItPnNsaWNlX3FzX2RlbHRhID0gdmlkZW8tPlFTeSAtIDI2IC0gY3VyclBQUy0+cGljX2luaXRfcXNfbWludXMyNjsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ludHJhX2VzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW50cmFfZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U1OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ludHJhX2VzdC5jcHAKQEAgLTAsMCArMSwyMTk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworI2RlZmluZSBUSF9JNCAgMCAgLyogdGhyZXNob2xkIGJpYXNpbmcgdG93YXJkIEkxNiBtb2RlIGluc3RlYWQgb2YgSTQgbW9kZSAqLworI2RlZmluZSBUSF9JbnRyYSAgMCAvKiB0aHJlc2hvbGQgYmlhc2luZyB0b3dhcmQgSU5URVIgbW9kZSBpbnN0ZWFkIG9mIGludHJhIG1vZGUgKi8KKworI2RlZmluZSBGSVhFRF9JTlRSQVBSRURfTU9ERSAgQVZDX0kxNgorI2RlZmluZSBGSVhFRF9JMTZfTU9ERSAgQVZDX0kxNl9EQworI2RlZmluZSBGSVhFRF9JNF9NT0RFICAgQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdAorI2RlZmluZSBGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSBBVkNfSUNfREMKKworI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKCh1aW50KXggPiAweEZGKXsgXAorICAgICAgICAgICAgICAgICB4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQorCisKK2Jvb2wgSW50cmFEZWNpc2lvbkFCRShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1pbl9jb3N0LCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBpbnQgb3JnUGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCB4X3BvcyA9ICh2aWRlby0+bWJfeCkgPDwgNDsKKyAgICBpbnQgeV9wb3MgPSAodmlkZW8tPm1iX3kpIDw8IDQ7CisgICAgdWludDggKm9yZ1kgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgeV9wb3MgKiBvcmdQaXRjaCArIHhfcG9zOworICAgIGludCBqOworICAgIHVpbnQ4ICp0b3BMLCAqbGVmdEwsICpvcmdZXzIsICpvcmdZXzM7CisgICAgaW50IHRlbXAsIFNCRSwgb2Zmc2V0OworICAgIE9zY2xGbG9hdCBBQkU7CisgICAgYm9vbCBpbnRyYSA9IHRydWU7CisKKyAgICBpZiAoKCh4X3BvcyA+PiA0KSAhPSAoaW50KXZpZGVvLT5QaWNXaWR0aEluTWJzIC0gMSkgJiYKKyAgICAgICAgICAgICgoeV9wb3MgPj4gNCkgIT0gKGludCl2aWRlby0+UGljSGVpZ2h0SW5NYnMgLSAxKSAmJgorICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBICYmCisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBTQkUgPSAwOworICAgICAgICAvKiB0b3AgbmVpZ2hib3IgKi8KKyAgICAgICAgdG9wTCA9IGN1ckwgLSBwaWNQaXRjaDsKKyAgICAgICAgLyogbGVmdCBuZWlnaGJvciAqLworICAgICAgICBsZWZ0TCA9IGN1ckwgLSAxOworICAgICAgICBvcmdZXzIgPSBvcmdZIC0gb3JnUGl0Y2g7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAqdG9wTCsrIC0gb3JnWVtqXTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICAgICAgdGVtcCA9ICoobGVmdEwgKz0gcGljUGl0Y2gpIC0gKihvcmdZXzIgKz0gb3JnUGl0Y2gpOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjYWxjdWxhdGUgY2hyb21hICovCisgICAgICAgIG9mZnNldCA9ICh5X3BvcyA+PiAyKSAqIHBpY1BpdGNoICsgKHhfcG9zID4+IDEpOworICAgICAgICB0b3BMID0gdmlkZW8tPmN1cnJQaWMtPlNjYiArIG9mZnNldDsKKyAgICAgICAgb3JnWV8yID0gY3VycklucHV0LT5ZQ2JDclsxXSArIG9mZnNldCArICh5X3BvcyA+PiAyKSAqIChvcmdQaXRjaCAtIHBpY1BpdGNoKTsKKworICAgICAgICBsZWZ0TCA9IHRvcEwgLSAxOworICAgICAgICB0b3BMIC09IChwaWNQaXRjaCA+PiAxKTsKKyAgICAgICAgb3JnWV8zID0gb3JnWV8yIC0gKG9yZ1BpdGNoID4+IDEpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKnRvcEwrKyAtIG9yZ1lfMltqXTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICAgICAgdGVtcCA9ICoobGVmdEwgKz0gKHBpY1BpdGNoID4+IDEpKSAtICoob3JnWV8zICs9IChvcmdQaXRjaCA+PiAxKSk7CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIHRvcEwgPSB2aWRlby0+Y3VyclBpYy0+U2NyICsgb2Zmc2V0OworICAgICAgICBvcmdZXzIgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgb2Zmc2V0ICsgKHlfcG9zID4+IDIpICogKG9yZ1BpdGNoIC0gcGljUGl0Y2gpOworCisgICAgICAgIGxlZnRMID0gdG9wTCAtIDE7CisgICAgICAgIHRvcEwgLT0gKHBpY1BpdGNoID4+IDEpOworICAgICAgICBvcmdZXzMgPSBvcmdZXzIgLSAob3JnUGl0Y2ggPj4gMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAqdG9wTCsrIC0gb3JnWV8yW2pdOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gKihsZWZ0TCArPSAocGljUGl0Y2ggPj4gMSkpIC0gKihvcmdZXzMgKz0gKG9yZ1BpdGNoID4+IDEpKTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcGFyZSBtaW5jb3N0LzM4NCBhbmQgU0JFLzY0ICovCisgICAgICAgIEFCRSA9IFNCRSAvIDY0LjA7CisgICAgICAgIGlmIChBQkUqMC44ID49IG1pbl9jb3N0IC8gMzg0LjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludHJhID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW50cmE7Cit9CisKKy8qIHBlcmZvcm0gc2VhcmNoaW5nIGZvciBNQiBtb2RlICovCisvKiBhc3N1bWluZyB0aGF0IHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIGVuY29kaW5nIGxvb3AsCitubyBuZWVkIHRvIGNhbGwgSW5pdE5laWdoYm9yQXZhaWxhYmlsaXR5ICovCisKK3ZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1ibnVtLCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBtaW5fY29zdDsKKyAgICB1aW50OCAqb3JnWTsKKyAgICBpbnQgeF9wb3MgPSAodmlkZW8tPm1iX3gpIDw8IDQ7CisgICAgaW50IHlfcG9zID0gKHZpZGVvLT5tYl95KSA8PCA0OworICAgIHVpbnQzMiAqc2F2ZWRfaW50ZXI7CisgICAgaW50IGo7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBib29sIGludHJhID0gdHJ1ZTsKKworICAgIGN1cnJNQi0+Q0JQID0gMDsKKworICAgIC8qIGZpcnN0IGRvIG1vdGlvbiB2ZWN0b3IgYW5kIHZhcmlhYmxlIGJsb2NrIHNpemUgc2VhcmNoICovCisgICAgbWluX2Nvc3QgPSBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXTsKKworICAgIC8qIG5vdyBwZXJmb3JtIGludHJhIHByZWRpY3Rpb24gc2VhcmNoICovCisgICAgLyogbmVlZCB0byBhZGQgdGhlIGNoZWNrIGZvciBlbmN2aWQtPmludHJhU2VhcmNoW3ZpZGVvLT5tYk51bV0gdG8gc2tpcCBpbnRyYQorICAgICAgIGlmIGl0J3Mgbm90IHdvcnRoIGNoZWNraW5nLiAqLworICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICB7CisgICAgICAgIC8qIERlY2lkZSB3aGV0aGVyIGludHJhIHNlYXJjaCBpcyBuZWNlc3Nhcnkgb3Igbm90ICovCisgICAgICAgIC8qIFRoaXMgb25lLCB3ZSBkbyBpdCBpbiB0aGUgZW5jb2RpbmcgbG9vcCBzbyB0aGUgbmVpZ2hib3JpbmcgcGl4ZWwgYXJlIHRoZQorICAgICAgICBhY3R1YWwgcmVjb25zdHJ1Y3RlZCBwaXhlbHMuICovCisgICAgICAgIGludHJhID0gSW50cmFEZWNpc2lvbkFCRShlbmN2aWQsIG1pbl9jb3N0LCBjdXJMLCBwaWNQaXRjaCk7CisgICAgfQorCisgICAgaWYgKGludHJhID09IHRydWUgfHwgdmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBvcmdZID0gY3VycklucHV0LT5ZQ2JDclswXSArIHlfcG9zICogb3JnUGl0Y2ggKyB4X3BvczsKKworICAgICAgICAvKiBpMTYgbW9kZSBzZWFyY2ggKi8KKyAgICAgICAgLyogZ2VuZXJhdGUgYWxsIHRoZSBwcmVkaWN0aW9ucyAqLworICAgICAgICBpbnRyYXByZWRfbHVtYV8xNngxNihlbmN2aWQpOworCisgICAgICAgIC8qIGV2YWx1YXRlIHRoZW0gb25lIGJ5IG9uZSAqLworICAgICAgICBmaW5kX2Nvc3RfMTZ4MTYoZW5jdmlkLCBvcmdZLCAmbWluX2Nvc3QpOworCisgICAgICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2F2ZSBjdXJyZW50IGludGVyIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIHNhdmVkX2ludGVyID0gZW5jdmlkLT5zdWJwZWxfcHJlZDsgLyogcmV1c2UgZXhpc3RpbmcgYnVmZmVyICovCisgICAgICAgICAgICBqID0gMTY7CisgICAgICAgICAgICBjdXJMIC09IDQ7CisgICAgICAgICAgICBwaWNQaXRjaCAtPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICAqc2F2ZWRfaW50ZXIrKyA9ICooKHVpbnQzMiopKGN1ckwgKz0gNCkpOworICAgICAgICAgICAgICAgICpzYXZlZF9pbnRlcisrID0gKigodWludDMyKikoY3VyTCArPSA0KSk7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICBjdXJMICs9IHBpY1BpdGNoOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBpNCBtb2RlIHNlYXJjaCAqLworICAgICAgICBtYl9pbnRyYTR4NF9zZWFyY2goZW5jdmlkLCAmbWluX2Nvc3QpOworCisgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbbWJudW1dID0gbWluX2Nvc3Q7IC8qIHVwZGF0ZSBtaW5fY29zdCAqLworICAgIH0KKworCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgeworICAgICAgICBjaHJvbWFfaW50cmFfc2VhcmNoKGVuY3ZpZCk7CisKKyAgICAgICAgLyogbmVlZCB0byBzZXQgdGhpcyBpbiBvcmRlciBmb3IgdGhlIE1CSW50ZXJQcmVkaWN0aW9uIHRvIHdvcmshISAqLworICAgICAgICBtZW1zZXQoY3Vyck1CLT5tdkwwLCAwLCBzaXplb2YoaW50MzIpKjE2KTsKKyAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID0gY3Vyck1CLT5yZWZfaWR4X0wwWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsyXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFszXSA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSAmJiBpbnRyYSA9PSB0cnVlKQorICAgIHsKKyAgICAgICAgLyogcmVzdG9yZSBjdXJyZW50IGludGVyIHByZWRpY3Rpb24gKi8KKyAgICAgICAgc2F2ZWRfaW50ZXIgPSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvKiByZXVzZSBleGlzdGluZyBidWZmZXIgKi8KKyAgICAgICAgaiA9IDE2OworICAgICAgICBjdXJMIC09ICgocGljUGl0Y2ggKyAxNikgPDwgNCk7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXJMICs9IDQpKSA9ICpzYXZlZF9pbnRlcisrOworICAgICAgICAgICAgKigodWludDMyKikoY3VyTCArPSA0KSkgPSAqc2F2ZWRfaW50ZXIrKzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICBjdXJMICs9IHBpY1BpdGNoOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogZ2VuZXJhdGUgYWxsIHRoZSBwcmVkaWN0aW9uIHZhbHVlcyAqLwordm9pZCBpbnRyYXByZWRfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKworICAgIGludCB4X3BvcyA9ICh2aWRlby0+bWJfeCkgPDwgNDsKKyAgICBpbnQgeV9wb3MgPSAodmlkZW8tPm1iX3kpIDw8IDQ7CisgICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisKKyAgICBpbnQgb2Zmc2V0ID0geV9wb3MgKiBwaXRjaCArIHhfcG9zOworCisgICAgdWludDggKnByZWQsICp0b3AsICpsZWZ0OworICAgIHVpbnQ4ICpjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7IC8qIHBvaW50IHRvIHJlY29uc3RydWN0ZWQgZnJhbWUgKi8KKyAgICB1aW50MzIgd29yZDEsIHdvcmQyLCB3b3JkMywgd29yZDQ7CisgICAgdWludDMyIHN1bSA9IDA7CisKKyAgICBpbnQgYV8xNiwgYiwgYywgZmFjdG9yX2M7CisgICAgdWludDggKmNvbXBfcmVmX3gwLCAqY29tcF9yZWZfeDEsICpjb21wX3JlZl95MCwgKmNvbXBfcmVmX3kxOworICAgIGludCBIID0gMCwgViA9IDAsIHRtcCwgdmFsdWU7CisgICAgaW50IGk7CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgLy9nZXQgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlCisgICAgICAgIHRvcCA9IGN1ckwgLSBwaXRjaDsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1ZlcnRpY2FsXSAtIDE2OworCisgICAgICAgIHdvcmQxID0gKigodWludDMyKikodG9wKSk7ICAvKiByZWFkIDQgYnl0ZXMgZnJvbSB0b3AgKi8KKyAgICAgICAgd29yZDIgPSAqKCh1aW50MzIqKSh0b3AgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHRvcCAqLworICAgICAgICB3b3JkMyA9ICooKHVpbnQzMiopKHRvcCArIDgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisgICAgICAgIHdvcmQ0ID0gKigodWludDMyKikodG9wICsgMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gMTYpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHdvcmQyOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHdvcmQzOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSB3b3JkNDsKKworICAgICAgICB9CisKKyAgICAgICAgc3VtID0gd29yZDEgJiAweEZGMDBGRjsKKyAgICAgICAgd29yZDEgPSAod29yZDEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkMSA9ICh3b3JkMiAmIDB4RkYwMEZGKTsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkMiA9ICh3b3JkMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICBzdW0gKz0gd29yZDI7CisgICAgICAgIHdvcmQxID0gKHdvcmQzICYgMHhGRjAwRkYpOworICAgICAgICBzdW0gKz0gd29yZDE7CisgICAgICAgIHdvcmQzID0gKHdvcmQzID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgIHN1bSArPSB3b3JkMzsKKyAgICAgICAgd29yZDEgPSAod29yZDQgJiAweEZGMDBGRik7CisgICAgICAgIHN1bSArPSB3b3JkMTsKKyAgICAgICAgd29yZDQgPSAod29yZDQgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQ0OworCisgICAgICAgIHN1bSArPSAoc3VtID4+IDE2KTsKKyAgICAgICAgc3VtICY9IDB4RkZGRjsKKworICAgICAgICBpZiAoIXZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtID0gKHN1bSArIDgpID4+IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgLy8gZ2V0IGhvcml6b250YWwgbW9kZQorICAgICAgICBsZWZ0ID0gY3VyTCAtIDEgLSBwaXRjaDsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X0hvcml6b250YWxdIC0gMTY7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKihsZWZ0ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bSArPSB3b3JkMTsKKworICAgICAgICAgICAgd29yZDEgPSAod29yZDEgPDwgOCkgfCB3b3JkMTsKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxIDw8IDE2KSB8IHdvcmQxOyAvKiBtYWtlIGl0IDQgKi8KKworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICs9IDE2KSA9IHdvcmQxOworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICsgNCkgPSB3b3JkMTsKKyAgICAgICAgICAgICoodWludDMyKikocHJlZCArIDgpID0gd29yZDE7CisgICAgICAgICAgICAqKHVpbnQzMiopKHByZWQgKyAxMikgPSB3b3JkMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gPSAoc3VtICsgOCkgPj4gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bSA9IChzdW0gKyAxNikgPj4gNTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGdldCBEQyBtb2RlCisgICAgaWYgKCF2aWRlby0+aW50cmFBdmFpbEEgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIHN1bSA9IDB4ODA4MDgwODA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN1bSA9IChzdW0gPDwgOCkgfCBzdW07CisgICAgICAgIHN1bSA9IChzdW0gPDwgMTYpIHwgc3VtOworICAgIH0KKworICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfRENdIC0gMTY7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDE2KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gc3VtOworICAgIH0KKworICAgIC8vIGdldCBwbGFuZSBtb2RlCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9QbGFuZV0gLSAxNjsKKworICAgICAgICBjb21wX3JlZl94MCA9IGN1ckwgLSBwaXRjaCArIDg7CisgICAgICAgIGNvbXBfcmVmX3gxID0gY3VyTCAtIHBpdGNoICsgNjsKKyAgICAgICAgY29tcF9yZWZfeTAgPSBjdXJMIC0gMSArIChwaXRjaCA8PCAzKTsKKyAgICAgICAgY29tcF9yZWZfeTEgPSBjdXJMIC0gMSArIDYgKiBwaXRjaDsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSAqY29tcF9yZWZfeDEtLSk7CisgICAgICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kwICs9IHBpdGNoOworICAgICAgICAgICAgY29tcF9yZWZfeTEgLT0gcGl0Y2g7CisgICAgICAgIH0KKworICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSBjdXJMWy1waXRjaC0xXSk7CisgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworCisKKyAgICAgICAgYV8xNiA9ICgoKihjdXJMIC0gcGl0Y2ggKyAxNSkgKyAqKGN1ckwgLSAxICsgMTUgKiBwaXRjaCkpIDw8IDQpICsgMTY7OworICAgICAgICBiID0gKDUgKiBIICsgMzIpID4+IDY7CisgICAgICAgIGMgPSAoNSAqIFYgKyAzMikgPj4gNjsKKworICAgICAgICB0bXAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmFjdG9yX2MgPSBhXzE2ICsgYyAqICh0bXArKyAtIDcpOworICAgICAgICAgICAgZmFjdG9yX2MgLT0gNyAqIGI7CisKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gMTYpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHdvcmQxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBldmFsdWF0ZSBlYWNoIHByZWRpY3Rpb24gbW9kZSBvZiBJMTYgKi8KK3ZvaWQgZmluZF9jb3N0XzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqb3JnWSwgaW50ICptaW5fY29zdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgY29zdDsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworCisgICAgLyogZXZhbHVhdGUgdmVydGljYWwgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfVmVydGljYWxdLCAqbWluX2Nvc3QpOworICAgICAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9WZXJ0aWNhbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogZXZhbHVhdGUgaG9yaXpvbnRhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvc3QgPSBjb3N0X2kxNihvcmdZLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9Ib3Jpem9udGFsXSwgKm1pbl9jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfSG9yaXpvbnRhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGV2YWx1YXRlIERDIG1vZGUgKi8KKyAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfRENdLCAqbWluX2Nvc3QpOworICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgIHsKKyAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICB9CisKKyAgICAvKiBldmFsdWF0ZSBwbGFuZSBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgY29zdCA9IGNvc3RfaTE2KG9yZ1ksIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1BsYW5lXSwgKm1pbl9jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK2ludCBjb3N0X2kxNih1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbl9jb3N0KQoreworCisgICAgaW50IGNvc3Q7CisgICAgaW50IGosIGs7CisgICAgaW50MTYgcmVzWzI1Nl0sICpwcmVzOyAvLyByZXNpZHVlCisgICAgaW50IG0wLCBtMSwgbTIsIG0zOworCisgICAgLy8gY2FsY3VsYXRlIFNBVEQKKyAgICBvcmdfcGl0Y2ggLT0gMTY7CisgICAgcHJlcyA9IHJlczsKKyAgICAvLyBob3Jpem9udGFsIHRyYW5zZm9ybQorICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgayA9IDQ7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBvcmdbMF0gLSBwcmVkWzBdOworICAgICAgICAgICAgbTMgPSBvcmdbM10gLSBwcmVkWzNdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBvcmdbMV0gLSBwcmVkWzFdOworICAgICAgICAgICAgbTIgPSBvcmdbMl0gLSBwcmVkWzJdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgICAgIHByZXNbMV0gPSBtMiArIG0zOworICAgICAgICAgICAgcHJlc1szXSA9IG0zIC0gbTI7CisKKyAgICAgICAgICAgIG9yZyArPSA0OworICAgICAgICAgICAgcHJlcyArPSA0OworICAgICAgICAgICAgcHJlZCArPSA0OworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgfQorICAgIC8qIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgIGNvc3QgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBwcmVzID0gcmVzICsgKGogPDwgNik7CisgICAgICAgIGsgPSAxNjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgICAgICBtMyA9IHByZXNbMzw8NF07CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IHByZXNbMTw8NF07CisgICAgICAgICAgICBtMiA9IHByZXNbMjw8NF07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgPSBtMCArIG0xOworCisgICAgICAgICAgICBpZiAoayYweDMpICAvLyBvbmx5IHN1bSB1cCBub24gREMgdmFsdWVzLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvc3QgKz0gKChtMCA+IDApID8gbTAgOiAtbTApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtMSA9IG0wIC0gKG0xIDw8IDEpOworICAgICAgICAgICAgY29zdCArPSAoKG0xID4gMCkgPyBtMSA6IC1tMSk7CisgICAgICAgICAgICBtMyA9IG0yICsgbTM7CisgICAgICAgICAgICBjb3N0ICs9ICgobTMgPiAwKSA/IG0zIDogLW0zKTsKKyAgICAgICAgICAgIG0yID0gbTMgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBjb3N0ICs9ICgobTIgPiAwKSA/IG0yIDogLW0yKTsKKworICAgICAgICAgICAgcHJlcysrOworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIGlmICgoY29zdCA+PiAxKSA+IG1pbl9jb3N0KSAvKiBlYXJseSBkcm9wIG91dCAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGNvc3QgPj4gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYWRhbWFyZCBvZiB0aGUgREMgY29lZmZpY2llbnQgKi8KKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgbTMgPSBwcmVzWzM8PDJdOworICAgICAgICBtMCA+Pj0gMjsKKyAgICAgICAgbTAgKz0gKG0zID4+IDIpOworICAgICAgICBtMyA9IG0wIC0gKG0zID4+IDEpOworICAgICAgICBtMSA9IHByZXNbMTw8Ml07CisgICAgICAgIG0yID0gcHJlc1syPDwyXTsKKyAgICAgICAgbTEgPj49IDI7CisgICAgICAgIG0xICs9IChtMiA+PiAyKTsKKyAgICAgICAgbTIgPSBtMSAtIChtMiA+PiAxKTsKKyAgICAgICAgcHJlc1swXSA9IChtMCArIG0xKTsKKyAgICAgICAgcHJlc1syPDwyXSA9IChtMCAtIG0xKTsKKyAgICAgICAgcHJlc1sxPDwyXSA9IChtMiArIG0zKTsKKyAgICAgICAgcHJlc1szPDwyXSA9IChtMyAtIG0yKTsKKyAgICAgICAgcHJlcyArPSAoNCA8PCA0KTsKKyAgICAgICAgay0tOworICAgIH0KKworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICBtMyA9IHByZXNbMzw8Nl07CisgICAgICAgIG0wICs9IG0zOworICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICBtMSA9IHByZXNbMTw8Nl07CisgICAgICAgIG0yID0gcHJlc1syPDw2XTsKKyAgICAgICAgbTEgKz0gbTI7CisgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgIG0wID0gbTAgKyBtMTsKKyAgICAgICAgY29zdCArPSAoKG0wID49IDApID8gbTAgOiAtbTApOworICAgICAgICBtMSA9IG0wIC0gKG0xIDw8IDEpOworICAgICAgICBjb3N0ICs9ICgobTEgPj0gMCkgPyBtMSA6IC1tMSk7CisgICAgICAgIG0zID0gbTIgKyBtMzsKKyAgICAgICAgY29zdCArPSAoKG0zID49IDApID8gbTMgOiAtbTMpOworICAgICAgICBtMiA9IG0zIC0gKG0yIDw8IDEpOworICAgICAgICBjb3N0ICs9ICgobTIgPj0gMCkgPyBtMiA6IC1tMik7CisgICAgICAgIHByZXMgKz0gNDsKKworICAgICAgICBpZiAoKGNvc3QgPj4gMSkgPiBtaW5fY29zdCkgLyogZWFybHkgZHJvcCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChjb3N0ID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgay0tOworICAgIH0KKworICAgIHJldHVybiAoY29zdCA+PiAxKTsKK30KKworCit2b2lkIG1iX2ludHJhNHg0X3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50ICptaW5fY29zdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIGludCBwaXRjaCA9IGN1cnJQaWMtPnBpdGNoOworICAgIGludCBvcmdfcGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCBvZmZzZXQ7CisgICAgdWludDggKmN1ckwsICpjb21wLCAqb3JnNCwgKm9yZzg7CisgICAgaW50IHkgPSB2aWRlby0+bWJfeSA8PCA0OworICAgIGludCB4ID0gdmlkZW8tPm1iX3ggPDwgNDsKKworICAgIGludCBiOCwgYjQsIGNvc3Q0eDQsIGJsa2lkeDsKKyAgICBpbnQgY29zdCA9IDA7CisgICAgaW50IG51bWNvZWY7CisgICAgaW50IGR1bW15ID0gMDsKKyAgICBpbnQgbWJfaW50cmEgPSBjdXJyTUItPm1iX2ludHJhOyAvLyBzYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZQorCisgICAgb2Zmc2V0ID0geSAqIHBpdGNoICsgeDsKKworICAgIGN1ckwgPSBjdXJyUGljLT5TbCArIG9mZnNldDsKKyAgICBvcmc4ID0gY3VycklucHV0LT5ZQ2JDclswXSArIHkgKiBvcmdfcGl0Y2ggKyB4OworICAgIHZpZGVvLT5wcmVkX3BpdGNoID0gNDsKKworICAgIGNvc3QgPSAoaW50KSg2LjAgKiBlbmN2aWQtPmxhbWJkYV9tb2RlICsgMC40OTk5KTsKKyAgICBjb3N0IDw8PSAyOworCisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7ICAvLyB0ZW1wb3Jhcnkgc2V0IHRoaXMgdG8gb25lIHRvIGVuYWJsZSB0aGUgSURDVAorICAgIC8vIG9wZXJhdGlvbiBpbnNpZGUgZGN0X2x1bWEKKworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBjb21wID0gY3VyTDsKKyAgICAgICAgb3JnNCA9IG9yZzg7CisKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVtiNF07CisgICAgICAgICAgICBjb3N0NHg0ID0gYmxrX2ludHJhNHg0X3NlYXJjaChlbmN2aWQsIGJsa2lkeCwgY29tcCwgb3JnNCk7CisgICAgICAgICAgICBjb3N0ICs9IGNvc3Q0eDQ7CisgICAgICAgICAgICBpZiAoY29zdCA+ICptaW5fY29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gbWJfaW50cmE7IC8vIHJlc3RvcmUgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZG8gcmVzaWR1ZSwgWGZybSwgUSwgaW52USwgaW52WGZybSwgcmVjb24gYW5kIHNhdmUgdGhlIERDVCBjb2Vmcy4qLworICAgICAgICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSBlbmN2aWQtPnByZWRfaTRbY3Vyck1CLT5pNE1vZGVbYmxraWR4XV07CisgICAgICAgICAgICBudW1jb2VmID0gZGN0X2x1bWEoZW5jdmlkLCBibGtpZHgsIGNvbXAsIG9yZzQsICZkdW1teSk7CisgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0gPSBudW1jb2VmOworICAgICAgICAgICAgaWYgKG51bWNvZWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmNicDR4NCB8PSAoMSA8PCBibGtpZHgpOworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IGI4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGI0JjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcCArPSAoKHBpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgb3JnNCArPSAoKG9yZ19waXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgICAgICBvcmc0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYjgmMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSAoKHBpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgICAgICBvcmc4ICs9ICgob3JnX3BpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9IDg7CisgICAgICAgICAgICBvcmc4ICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyTUItPm1iX2ludHJhID0gbWJfaW50cmE7IC8vIHJlc3RvcmUgdGhlIHZhbHVlCisKKyAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICB7CisgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0k0OworICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIHNlYXJjaCBmb3IgaTQgbW9kZSBmb3IgYSA0eDQgYmxvY2sgKi8KK2ludCBibGtfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNOZWlnaGJvckF2YWlsYWJpbGl0eSBhdmFpbGFiaWxpdHk7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBib29sIHRvcF9sZWZ0ID0gRkFMU0U7CisgICAgaW50IHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworICAgIHVpbnQ4IG1vZGVfYXZhaWxbQVZDTnVtSTRQcmVkTW9kZV07CisgICAgdWludDMyIHRlbXAsIERDOworICAgIHVpbnQ4ICpwcmVkOworICAgIGludCBvcmdfcGl0Y2ggPSBlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2g7CisgICAgdWludDE2IG1pbl9jb3N0LCBjb3N0OworCisgICAgaW50IFBfeCwgUV94LCBSX3gsIFBfeSwgUV95LCBSX3ksIEQsIEQwLCBEMTsKKyAgICBpbnQgUDAsIFEwLCBSMCwgUzAsIFAxLCBRMSwgUjEsIFAyLCBRMjsKKyAgICB1aW50OCBQX0EsIFBfQiwgUF9DLCBQX0QsIFBfRSwgUF9GLCBQX0csIFBfSCwgUF9JLCBQX0osIFBfSywgUF9MLCBQX1g7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNzsKKyAgICBpbnQgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NTsKKyAgICB1aW50MzIgdGVtcDEsIHRlbXAyOworCisgICAgaW50IGlwbW9kZSwgbW9zdFByb2JhYmxlTW9kZTsKKyAgICBpbnQgZml4ZWRjb3N0ID0gNCAqIGVuY3ZpZC0+bGFtYmRhX21vZGU7CisgICAgaW50IG1pbl9zYWQgPSAweDdGRkY7CisKKyAgICBhdmFpbGFiaWxpdHkubGVmdCA9IFRSVUU7CisgICAgYXZhaWxhYmlsaXR5LnRvcCA9IFRSVUU7CisgICAgaWYgKGJsa2lkeCA8PSAzKSAvKiB0b3Agcm93IGJsb2NrICAoIWJsb2NrX3kpICovCisgICAgeyAvKiBjaGVjayBhdmFpbGFiaWxpdHkgdXAgKi8KKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcCA9IHZpZGVvLT5pbnRyYUF2YWlsQiA7CisgICAgfQorICAgIGlmICghKGJsa2lkeCYweDMpKSAvKiBsZWZ0IGNvbHVtbiBibG9jayAoIWJsb2NrX3gpKi8KKyAgICB7IC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBsZWZ0ICovCisgICAgICAgIGF2YWlsYWJpbGl0eS5sZWZ0ID0gdmlkZW8tPmludHJhQXZhaWxBIDsKKyAgICB9CisgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IEJsa1RvcFJpZ2h0W2Jsa2lkeF07CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAyKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQjsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAzKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQzsKKyAgICB9CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoodWludDMyKikoY3VyIC0gcGl0Y2gpOworICAgICAgICBQX0EgPSB0ZW1wICYgMHhGRjsKKyAgICAgICAgUF9CID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICBQX0MgPSAodGVtcCA+PiAxNikgJiAweEZGOworICAgICAgICBQX0QgPSAodGVtcCA+PiAyNCkgJiAweEZGOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX0EgPSBQX0IgPSBQX0MgPSBQX0QgPSAxMjg7CisgICAgfQorCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHVpbnQzMiopKGN1ciAtIHBpdGNoICsgNCk7CisgICAgICAgIFBfRSA9IHRlbXAgJiAweEZGOworICAgICAgICBQX0YgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgIFBfRyA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7CisgICAgICAgIFBfSCA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBfRSA9IFBfRiA9IFBfRyA9IFBfSCA9IDEyODsKKyAgICB9CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LmxlZnQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGN1ci0tOworICAgICAgICBQX0kgPSAqY3VyOworICAgICAgICBQX0ogPSAqKGN1ciArPSBwaXRjaCk7CisgICAgICAgIFBfSyA9ICooY3VyICs9IHBpdGNoKTsKKyAgICAgICAgUF9MID0gKihjdXIgKyBwaXRjaCk7CisgICAgICAgIGN1ciAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgIGN1cisrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX0kgPSBQX0ogPSBQX0sgPSBQX0wgPSAxMjg7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdG9wLWxlZnQgcGl4ZWwgaXMgYXZhaWxhYmxlICovCisgICAgaWYgKCgoYmxraWR4ID4gMykgJiYgKGJsa2lkeCYweDMpKSB8fCAoKGJsa2lkeCA+IDMpICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgIHx8ICgoYmxraWR4JjB4MykgJiYgdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICB7CisgICAgICAgIHRvcF9sZWZ0ID0gVFJVRTsKKyAgICAgICAgUF9YID0gKihjdXIgLSBwaXRjaCAtIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX1ggPSAxMjg7CisgICAgfQorCisgICAgLy89PT09PSBJTlRSQSBQUkVESUNUSU9OIEZPUiA0eDQgQkxPQ0sgPT09PT0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsXSA9IDA7CisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9WZXJ0aWNhbF07CisKKyAgICAgICAgdGVtcCA9IChQX0QgPDwgMjQpIHwgKFBfQyA8PCAxNikgfCAoUF9CIDw8IDgpIHwgUF9BIDsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOyAvKiB3cml0ZSA0IGF0IGEgdGltZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgIH0KKyAgICAvKiBob3Jpem9udGFsICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF0gPSAwOworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfVXBdID0gMDsKKyAgICBpZiAoYXZhaWxhYmlsaXR5LmxlZnQpCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0hvcml6b250YWxdOworCisgICAgICAgIHRlbXAgPSBQX0kgfCAoUF9JIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBQX0ogfCAoUF9KIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICAgICB0ZW1wID0gUF9LIHwgKFBfSyA8PCA4KTsKKyAgICAgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IFBfTCB8IChQX0wgPDwgOCk7CisgICAgICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9VcF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9Ib3Jpem9udGFsX1VwXTsKKworICAgICAgICBRMCA9IChQX0ogKyBQX0sgKyAxKSA+PiAxOworICAgICAgICBRMSA9IChQX0ogKyAoUF9LIDw8IDEpICsgUF9MICsgMikgPj4gMjsKKyAgICAgICAgUDAgPSAoKFBfSSArIFBfSiArIDEpID4+IDEpOworICAgICAgICBQMSA9ICgoUF9JICsgKFBfSiA8PCAxKSArIFBfSyArIDIpID4+IDIpOworCisgICAgICAgIHRlbXAgPSBQMCB8IChQMSA8PCA4KTsgICAgICAvLyBbUDAgUDEgUTAgUTFdCisgICAgICAgIHRlbXAgfD0gKFEwIDw8IDE2KTsgICAgIC8vIFtRMCBRMSBSMCBET10KKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMjQpOyAgICAgLy8gW1IwIEQwIEQxIEQxXQorICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsgICAgICAvLyBbRDEgRDEgRDEgRDFdCisKKyAgICAgICAgRDAgPSAoUF9LICsgMyAqIFBfTCArIDIpID4+IDI7CisgICAgICAgIFIwID0gKFBfSyArIFBfTCArIDEpID4+IDE7CisKKyAgICAgICAgdGVtcCA9IFEwIHwgKFExIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChSMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQwIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIEQxID0gUF9MOworCisgICAgICAgIHRlbXAgPSBSMCB8IChEMCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoRDEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChEMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRDEgfCAoRDEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgfQorICAgIC8qIERDICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfRENdID0gMTsKKyAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9EQ107CisgICAgaWYgKGF2YWlsYWJpbGl0eS5sZWZ0KQorICAgIHsKKyAgICAgICAgREMgPSBQX0kgKyBQX0ogKyBQX0sgKyBQX0w7CisKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gKFBfQSArIFBfQiArIFBfQyArIFBfRCArIERDICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gKERDICsgMikgPj4gMjsKKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBEQyA9IChQX0EgKyBQX0IgKyBQX0MgKyBQX0QgKyAyKSA+PiAyOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERDID0gMTI4OworICAgIH0KKworICAgIHRlbXAgPSBEQyB8IChEQyA8PCA4KTsKKyAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKyAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgIC8qIERvd24tbGVmdCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdF0gPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnRdID0gMTsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnRdOworCisgICAgICAgIHIwID0gUF9BOworICAgICAgICByMSA9IFBfQjsKKyAgICAgICAgcjIgPSBQX0M7CisgICAgICAgIHIzID0gUF9EOworCisgICAgICAgIHIwICs9IChyMSA8PCAxKTsKKyAgICAgICAgcjAgKz0gcjI7CisgICAgICAgIHIwICs9IDI7CisgICAgICAgIHIwID4+PSAyOworICAgICAgICByMSArPSAocjIgPDwgMSk7CisgICAgICAgIHIxICs9IHIzOworICAgICAgICByMSArPSAyOworICAgICAgICByMSA+Pj0gMjsKKworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgcjQgPSBQX0U7CisgICAgICAgICAgICByNSA9IFBfRjsKKyAgICAgICAgICAgIHI2ID0gUF9HOworICAgICAgICAgICAgcjcgPSBQX0g7CisKKyAgICAgICAgICAgIHIyICs9IChyMyA8PCAxKTsKKyAgICAgICAgICAgIHIyICs9IHI0OworICAgICAgICAgICAgcjIgKz0gMjsKKyAgICAgICAgICAgIHIyID4+PSAyOworICAgICAgICAgICAgcjMgKz0gKHI0IDw8IDEpOworICAgICAgICAgICAgcjMgKz0gcjU7CisgICAgICAgICAgICByMyArPSAyOworICAgICAgICAgICAgcjMgPj49IDI7CisgICAgICAgICAgICByNCArPSAocjUgPDwgMSk7CisgICAgICAgICAgICByNCArPSByNjsKKyAgICAgICAgICAgIHI0ICs9IDI7CisgICAgICAgICAgICByNCA+Pj0gMjsKKyAgICAgICAgICAgIHI1ICs9IChyNiA8PCAxKTsKKyAgICAgICAgICAgIHI1ICs9IHI3OworICAgICAgICAgICAgcjUgKz0gMjsKKyAgICAgICAgICAgIHI1ID4+PSAyOworICAgICAgICAgICAgcjYgKz0gKDMgKiByNyk7CisgICAgICAgICAgICByNiArPSAyOworICAgICAgICAgICAgcjYgPj49IDI7CisgICAgICAgICAgICB0ZW1wID0gcjAgfCAocjEgPDwgOCk7CisgICAgICAgICAgICB0ZW1wIHw9IChyMiA8PCAxNik7CisgICAgICAgICAgICB0ZW1wIHw9IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI0IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI1IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI2IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHIyICs9IChyMyAqIDMpOworICAgICAgICAgICAgcjIgKz0gMjsKKyAgICAgICAgICAgIHIyID4+PSAyOworICAgICAgICAgICAgcjMgPSAoKHIzIDw8IDIpICsgMik7CisgICAgICAgICAgICByMyA+Pj0gMjsKKworICAgICAgICAgICAgdGVtcCA9IHIwIHwgKHIxIDw8IDgpOworICAgICAgICAgICAgdGVtcCB8PSAocjIgPDwgMTYpOworICAgICAgICAgICAgdGVtcCB8PSAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERvd24gUmlnaHQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX1JpZ2h0XSA9IDA7CisgICAgLyogRGlhZ29uYWwgVmVydGljYWwgUmlnaHQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9SaWdodF0gPSAwOworICAgIC8qIEhvcml6b250YWwgRG93biAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfRG93bl0gPSAwOworCisgICAgaWYgKHRvcF9sZWZ0ID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBEb3duIFJpZ2h0ICovCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHRdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodF07CisKKyAgICAgICAgUV94ID0gKFBfQSArIDIgKiBQX0IgKyBQX0MgKyAyKSA+PiAyOworICAgICAgICBSX3ggPSAoUF9CICsgMiAqIFBfQyArIFBfRCArIDIpID4+IDI7CisgICAgICAgIFBfeCA9IChQX1ggKyAyICogUF9BICsgUF9CICsgMikgPj4gMjsKKyAgICAgICAgRCAgID0gKFBfQSArIDIgKiBQX1ggKyBQX0kgKyAyKSA+PiAyOworICAgICAgICBQX3kgPSAoUF9YICsgMiAqIFBfSSArIFBfSiArIDIpID4+IDI7CisgICAgICAgIFFfeSA9IChQX0kgKyAyICogUF9KICsgUF9LICsgMikgPj4gMjsKKyAgICAgICAgUl95ID0gKFBfSiArIDIgKiBQX0sgKyBQX0wgKyAyKSA+PiAyOworCisgICAgICAgIC8qIHdlIGNhbiBwYWNrIHRoZXNlICovCisgICAgICAgIHRlbXAgPSAgRCB8IChQX3ggPDwgOCk7ICAgLy9bRCAgIFBfeCBRX3ggUl94XQorICAgICAgICAvL1tQX3kgRCAgIFBfeCBRX3hdCisgICAgICAgIHRlbXAgfD0gKFFfeCA8PCAxNik7IC8vW1FfeSBQX3kgRCAgIFBfeF0KKyAgICAgICAgdGVtcCB8PSAoUl94IDw8IDI0KTsgIC8vW1JfeSBRX3kgUF95IEQgIF0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9ICBQX3kgfCAoRCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUF94IDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUV94IDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSAgUV95IHwgKFBfeSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoRCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFBfeCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gUl95IHwgKFFfeSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUF95IDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoRCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworCisgICAgICAgIC8qIERpYWdvbmFsIFZlcnRpY2FsIFJpZ2h0ICovCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0XSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0XTsKKworICAgICAgICBRMCA9IFBfQSArIFBfQiArIDE7CisgICAgICAgIFIwID0gUF9CICsgUF9DICsgMTsKKyAgICAgICAgUzAgPSBQX0MgKyBQX0QgKyAxOworICAgICAgICBQMCA9IFBfWCArIFBfQSArIDE7CisgICAgICAgIEQgPSAoUF9JICsgMiAqIFBfWCArIFBfQSArIDIpID4+IDI7CisKKyAgICAgICAgUDEgPSAoUDAgKyBRMCkgPj4gMjsKKyAgICAgICAgUTEgPSAoUTAgKyBSMCkgPj4gMjsKKyAgICAgICAgUjEgPSAoUjAgKyBTMCkgPj4gMjsKKworICAgICAgICBQMCA+Pj0gMTsKKyAgICAgICAgUTAgPj49IDE7CisgICAgICAgIFIwID4+PSAxOworICAgICAgICBTMCA+Pj0gMTsKKworICAgICAgICBQMiA9IChQX1ggKyAyICogUF9JICsgUF9KICsgMikgPj4gMjsKKyAgICAgICAgUTIgPSAoUF9JICsgMiAqIFBfSiArIFBfSyArIDIpID4+IDI7CisKKyAgICAgICAgdGVtcCA9ICBQMCB8IChRMCA8PCA4KTsgIC8vW1AwIFEwIFIwIFMwXQorICAgICAgICAvL1tEICBQMSBRMSBSMV0KKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMTYpOyAvL1tQMiBQMCBRMCBSMF0KKyAgICAgICAgdGVtcCB8PSAoUzAgPDwgMjQpOyAvL1tRMiBEICBQMSBRMV0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOworCisgICAgICAgIHRlbXAgPSAgRCB8IChQMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChSMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFAyIHwgKFAwIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChRMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFIwIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKworICAgICAgICB0ZW1wID0gUTIgfCAoRCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUDEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChRMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisKKworICAgICAgICAvKiBIb3Jpem9udGFsIERvd24gKi8KKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9Eb3duXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0hvcml6b250YWxfRG93bl07CisKKworICAgICAgICBRMiA9IChQX0EgKyAyICogUF9CICsgUF9DICsgMikgPj4gMjsKKyAgICAgICAgUDIgPSAoUF9YICsgMiAqIFBfQSArIFBfQiArIDIpID4+IDI7CisgICAgICAgIEQgPSAoUF9JICsgMiAqIFBfWCArIFBfQSArIDIpID4+IDI7CisgICAgICAgIFAwID0gUF9YICsgUF9JICsgMTsKKyAgICAgICAgUTAgPSBQX0kgKyBQX0ogKyAxOworICAgICAgICBSMCA9IFBfSiArIFBfSyArIDE7CisgICAgICAgIFMwID0gUF9LICsgUF9MICsgMTsKKworICAgICAgICBQMSA9IChQMCArIFEwKSA+PiAyOworICAgICAgICBRMSA9IChRMCArIFIwKSA+PiAyOworICAgICAgICBSMSA9IChSMCArIFMwKSA+PiAyOworCisgICAgICAgIFAwID4+PSAxOworICAgICAgICBRMCA+Pj0gMTsKKyAgICAgICAgUjAgPj49IDE7CisgICAgICAgIFMwID4+PSAxOworCisKKyAgICAgICAgLyogd2UgY2FuIHBhY2sgdGhlc2UgKi8KKyAgICAgICAgdGVtcCA9IFAwIHwgKEQgPDwgOCk7ICAgLy9bUDAgRCAgUDIgUTJdCisgICAgICAgIC8vW1EwIFAxIFAwIEQgXQorICAgICAgICB0ZW1wIHw9IChQMiA8PCAxNik7ICAvL1tSMCBRMSBRMCBQMV0KKyAgICAgICAgdGVtcCB8PSAoUTIgPDwgMjQpOyAvL1tTMCBSMSBSMCBRMV0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFEwIHwgKFAxIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChQMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFIwIHwgKFExIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChRMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFAxIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBTMCB8IChSMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChRMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgIH0KKworICAgIC8qIHZlcnRpY2FsIGxlZnQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9MZWZ0XSA9IDA7CisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9MZWZ0XSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X1ZlcnRpY2FsX0xlZnRdOworCisgICAgICAgIHgwID0gUF9BICsgUF9CICsgMTsKKyAgICAgICAgeDEgPSBQX0IgKyBQX0MgKyAxOworICAgICAgICB4MiA9IFBfQyArIFBfRCArIDE7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICB4MyA9IFBfRCArIFBfRSArIDE7CisgICAgICAgICAgICB4NCA9IFBfRSArIFBfRiArIDE7CisgICAgICAgICAgICB4NSA9IFBfRiArIFBfRyArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB4MyA9IHg0ID0geDUgPSAoUF9EIDw8IDEpICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAxID0gKHgwID4+IDEpOworICAgICAgICB0ZW1wMSB8PSAoKHgxID4+IDEpIDw8IDgpOworICAgICAgICB0ZW1wMSB8PSAoKHgyID4+IDEpIDw8IDE2KTsKKyAgICAgICAgdGVtcDEgfD0gKCh4MyA+PiAxKSA8PCAyNCk7CisKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXAxOworCisgICAgICAgIHRlbXAyID0gKCh4MCArIHgxKSA+PiAyKTsKKyAgICAgICAgdGVtcDIgfD0gKCgoeDEgKyB4MikgPj4gMikgPDwgOCk7CisgICAgICAgIHRlbXAyIHw9ICgoKHgyICsgeDMpID4+IDIpIDw8IDE2KTsKKyAgICAgICAgdGVtcDIgfD0gKCgoeDMgKyB4NCkgPj4gMikgPDwgMjQpOworCisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDI7CisKKyAgICAgICAgdGVtcDEgPSAodGVtcDEgPj4gOCkgfCAoKHg0ID4+IDEpIDw8IDI0KTsgICAvKiByb3RhdGUgb3V0IG9sZCB2YWx1ZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXAxOworCisgICAgICAgIHRlbXAyID0gKHRlbXAyID4+IDgpIHwgKCgoeDQgKyB4NSkgPj4gMikgPDwgMjQpOyAvKiByb3RhdGUgb3V0IG9sZCB2YWx1ZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXAyOworICAgIH0KKworICAgIC8vPT09PT0gTE9PUCBPVkVSIEFMTCA0eDQgSU5UUkEgUFJFRElDVElPTiBNT0RFUyA9PT09PQorICAgIC8vIGNhbiByZS1vcmRlciB0aGUgc2VhcmNoIGhlcmUgaW5zdGVhZCBvZiBnb2luZyBpbiBvcmRlcgorCisgICAgLy8gZmluZCBtb3N0IHByb2JhYmxlIG1vZGUKKyAgICBlbmN2aWQtPm1vc3RQcm9iYWJsZUk0TW9kZVtibGtpZHhdID0gbW9zdFByb2JhYmxlTW9kZSA9IEZpbmRNb3N0UHJvYmFibGVJNE1vZGUodmlkZW8sIGJsa2lkeCk7CisKKyAgICBtaW5fY29zdCA9IDB4RkZGRjsKKworICAgIGZvciAoaXBtb2RlID0gMDsgaXBtb2RlIDwgQVZDTnVtSTRQcmVkTW9kZTsgaXBtb2RlKyspCisgICAgeworICAgICAgICBpZiAobW9kZV9hdmFpbFtpcG1vZGVdID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvc3QgID0gKGlwbW9kZSA9PSBtb3N0UHJvYmFibGVNb2RlKSA/IDAgOiBmaXhlZGNvc3Q7CisgICAgICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W2lwbW9kZV07CisKKyAgICAgICAgICAgIGNvc3RfaTQob3JnLCBvcmdfcGl0Y2gsIHByZWQsICZjb3N0KTsKKworICAgICAgICAgICAgaWYgKGNvc3QgPCBtaW5fY29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVtibGtpZHhdID0gKEFWQ0ludHJhNHg0UHJlZE1vZGUpaXBtb2RlOworICAgICAgICAgICAgICAgIG1pbl9jb3N0ICAgPSBjb3N0OworICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBjb3N0IC0gKChpcG1vZGUgPT0gbW9zdFByb2JhYmxlTW9kZSkgPyAwIDogZml4ZWRjb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChibGtpZHggPT0gMCkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+aTRfc2FkID0gbWluX3NhZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5pNF9zYWQgKz0gbWluX3NhZDsKKyAgICB9CisKKyAgICByZXR1cm4gbWluX2Nvc3Q7Cit9CisKK2ludCBGaW5kTW9zdFByb2JhYmxlSTRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibGtpZHgpCit7CisgICAgaW50IGRjT25seVByZWRpY3Rpb25GbGFnOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQiwgcHJlZEludHJhNHg0UHJlZE1vZGU7CisKKworICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMDsKKyAgICBpZiAoYmxraWR4JjB4MykKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gY3Vyck1CLT5pNE1vZGVbYmxraWR4LTFdOyAvLyBibG9jayB0byB0aGUgbGVmdAorICAgIH0KKyAgICBlbHNlIC8qIGZvciBibGsgMCwgNCwgOCwgMTIgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0uaTRNb2RlW2Jsa2lkeCArIDNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgZ290byBQUkVEX1JFU1VMVF9SRUFEWTsgIC8vIHNraXAgYmVsb3cKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChibGtpZHggPj4gMikKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gY3Vyck1CLT5pNE1vZGVbYmxraWR4LTRdOyAvLyBibG9jayBhYm92ZQorICAgIH0KKyAgICBlbHNlIC8qIGJsb2NrIDAsIDEsIDIsIDMgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0uaTRNb2RlW2Jsa2lkeCsxMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKK1BSRURfUkVTVUxUX1JFQURZOgorICAgIGlmIChkY09ubHlQcmVkaWN0aW9uRmxhZykKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgfQorCisgICAgcHJlZEludHJhNHg0UHJlZE1vZGUgPSBBVkNfTUlOKGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQik7CisKKyAgICByZXR1cm4gcHJlZEludHJhNHg0UHJlZE1vZGU7Cit9CisKK3ZvaWQgY29zdF9pNCh1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgdWludDE2ICpjb3N0KQoreworICAgIGludCBrOworICAgIGludDE2IHJlc1sxNl0sICpwcmVzOworICAgIGludCBtMCwgbTEsIG0yLCBtMywgdG1wMTsKKyAgICBpbnQgc2F0ZCA9IDA7CisKKyAgICBwcmVzID0gcmVzOworICAgIC8vIGhvcml6b250YWwgdHJhbnNmb3JtCisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBvcmdbMF0gLSBwcmVkWzBdOworICAgICAgICBtMyA9IG9yZ1szXSAtIHByZWRbM107CisgICAgICAgIG0wICs9IG0zOworICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICBtMSA9IG9yZ1sxXSAtIHByZWRbMV07CisgICAgICAgIG0yID0gb3JnWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgbTEgKz0gbTI7CisgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgcHJlZCArPSA0OworICAgICAgICBrLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICBtMyA9IHByZXNbMTJdOworICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgbTEgPSBwcmVzWzRdOworICAgICAgICBtMiA9IHByZXNbOF07CisgICAgICAgIG0xICs9IG0yOworICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgcHJlc1s4XSA9IG0wIC0gbTE7CisgICAgICAgIHByZXNbNF0gPSBtMiArIG0zOworICAgICAgICBwcmVzWzEyXSA9IG0zIC0gbTI7CisKKyAgICAgICAgcHJlcysrOworICAgICAgICBrLS07CisKKyAgICB9CisKKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIGstLTsKKyAgICB9CisKKyAgICBzYXRkID0gKHNhdGQgKyAxKSA+PiAxOworICAgICpjb3N0ICs9IHNhdGQ7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGNocm9tYV9pbnRyYV9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisKKyAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJfeCA8PCAzOworICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYl95IDw8IDM7CisgICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2ggPj4gMTsKKyAgICBpbnQgb2Zmc2V0ID0geV9wb3MgKiBwaXRjaCArIHhfcG9zOworCisgICAgdWludDggKmNvbXBfcmVmX3gsICpjb21wX3JlZl95LCAqcHJlZDsKKyAgICBpbnQgIHN1bV94MCwgc3VtX3gxLCBzdW1feTAsIHN1bV95MTsKKyAgICBpbnQgcHJlZF8wWzJdLCBwcmVkXzFbMl0sIHByZWRfMlsyXSwgcHJlZF8zWzJdOworICAgIHVpbnQzMiBwcmVkX2EsIHByZWRfYiwgcHJlZF9jLCBwcmVkX2Q7CisgICAgaW50IGksIGosIGNvbXBvbmVudDsKKyAgICBpbnQgYV8xNiwgYiwgYywgZmFjdG9yX2MsIHRvcGxlZnQ7CisgICAgaW50IEgsIFYsIHZhbHVlOworICAgIHVpbnQ4ICpjb21wX3JlZl94MCwgKmNvbXBfcmVmX3gxLCAgKmNvbXBfcmVmX3kwLCAqY29tcF9yZWZfeTE7CisKKyAgICB1aW50OCAqY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgdWludDggKmN1ckNyID0gY3VyclBpYy0+U2NyICsgb2Zmc2V0OworCisgICAgdWludDggKm9yZ0NiLCAqb3JnQ3I7CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgb3JnX3BpdGNoOworICAgIGludCBjb3N0LCBtaW5jb3N0OworCisgICAgLyogZXZhbHVhdGUgREMgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIgJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNiIC0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgY29tcF9yZWZfeCArPSA0OworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MCA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDEgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfMVtpXSA9IChzdW1feDEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBzdW1feTAgPSAqY29tcF9yZWZfeTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgc3VtX3kxID0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgcHJlZF8yW2ldID0gKHN1bV95MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIHByZWRfMFtpXSA9IChzdW1feTAgKyBzdW1feDAgKyA0KSA+PiAzOworICAgICAgICAgICAgcHJlZF8zW2ldID0gKHN1bV95MSArIHN1bV94MSArIDQpID4+IDM7CisKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIHBpdGNoOworICAgICAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNyIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bV95MCA9ICpjb21wX3JlZl95OworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBzdW1feTEgPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBwcmVkXzBbaV0gPSBwcmVkXzFbaV0gPSAoc3VtX3kwICsgMikgPj4gMjsKKyAgICAgICAgICAgIHByZWRfMltpXSA9IHByZWRfM1tpXSA9IChzdW1feTEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgY29tcF9yZWZfeCArPSA0OworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MCA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDEgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfMFtpXSA9IHByZWRfMltpXSA9IChzdW1feDAgKyAyKSA+PiAyOworICAgICAgICAgICAgcHJlZF8xW2ldID0gcHJlZF8zW2ldID0gKHN1bV94MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIHBpdGNoOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByZWRfMFswXSA9IHByZWRfMFsxXSA9IHByZWRfMVswXSA9IHByZWRfMVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkXzJbMF0gPSBwcmVkXzJbMV0gPSBwcmVkXzNbMF0gPSBwcmVkXzNbMV0gPSAxMjg7CisgICAgfQorCisgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfRENdOworCisgICAgcHJlZF9hID0gcHJlZF8wWzBdOworICAgIHByZWRfYiA9IHByZWRfMVswXTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgOCk7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgMTYpOworCisgICAgcHJlZF9jID0gcHJlZF8wWzFdOworICAgIHByZWRfZCA9IHByZWRfMVsxXTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCA4KTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCAxNik7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgOCk7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgMTYpOworCisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSAvKiA0IGxpbmVzICovCisgICAgeworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9hOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9jOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfZDsKKyAgICAgICAgcHJlZCArPSAxNjsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgfQorCisgICAgcHJlZF9hID0gcHJlZF8yWzBdOworICAgIHByZWRfYiA9IHByZWRfM1swXTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgOCk7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgMTYpOworCisgICAgcHJlZF9jID0gcHJlZF8yWzFdOworICAgIHByZWRfZCA9IHByZWRfM1sxXTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCA4KTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCAxNik7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgOCk7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgMTYpOworCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgLyogNCBsaW5lcyAqLworICAgIHsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYzsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2Q7CisgICAgICAgIHByZWQgKz0gMTY7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgIH0KKworICAgIC8qIHByZWRpY3QgaG9yaXpvbnRhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0hvcml6b250YWxdOworCisgICAgICAgIGZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJlZF9hID0gKmNvbXBfcmVmX3k7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeSArPSBwaXRjaDsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9hOworCisgICAgICAgICAgICAgICAgcHJlZF9hID0gKmNvbXBfcmVmX3g7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeCArPSBwaXRjaDsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfYTsKKworICAgICAgICAgICAgICAgIHByZWQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB2ZXJ0aWNhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfVmVydGljYWxdOworCisgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgIHByZWRfYiA9ICooKHVpbnQzMiopKGNvbXBfcmVmX3ggKyA0KSk7CisgICAgICAgIHByZWRfYyA9ICooKHVpbnQzMiopY29tcF9yZWZfeSk7CisgICAgICAgIHByZWRfZCA9ICooKHVpbnQzMiopKGNvbXBfcmVmX3kgKyA0KSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2I7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9jOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2Q7CisgICAgICAgICAgICBwcmVkICs9IDE2OworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW50cmFfQ2hyb21hX1BsYW5lICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIHRvcGxlZnQgPSBjdXJDYlstcGl0Y2gtMV07CisKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfUGxhbmVdOworICAgICAgICBmb3IgKGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDI7IGNvbXBvbmVudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBIID0gViA9IDA7CisgICAgICAgICAgICBjb21wX3JlZl94MCA9IGNvbXBfcmVmX3ggKyA0OworICAgICAgICAgICAgY29tcF9yZWZfeDEgPSBjb21wX3JlZl94ICsgMjsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kwID0gY29tcF9yZWZfeSArIChwaXRjaCA8PCAyKTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kxID0gY29tcF9yZWZfeSArIChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gKmNvbXBfcmVmX3gxLS0pOworICAgICAgICAgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kwICs9IHBpdGNoOworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kxIC09IHBpdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gdG9wbGVmdCk7CisgICAgICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKworICAgICAgICAgICAgYV8xNiA9ICgoKihjb21wX3JlZl94ICsgNykgKyAqKGNvbXBfcmVmX3kgKyA3ICogcGl0Y2gpKSA8PCA0KSArIDE2OworICAgICAgICAgICAgYiA9ICgxNyAqIEggKyAxNikgPj4gNTsKKyAgICAgICAgICAgIGMgPSAoMTcgKiBWICsgMTYpID4+IDU7CisKKyAgICAgICAgICAgIHByZWRfYSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyA9IGFfMTYgKyBjICogKHByZWRfYSsrIC0gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgLT0gMyAqIGI7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYjsKKworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAgICAgICAgICAgICBwcmVkICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZCAtPSAxMjA7IC8qIHBvaW50IHRvIGNyICovCisgICAgICAgICAgICBjb21wX3JlZl94ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDciAtIDE7CisgICAgICAgICAgICB0b3BsZWZ0ID0gY3VyQ3JbLXBpdGNoLTFdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IGV2YWx1YXRlIGl0ICovCisKKyAgICBvcmdfcGl0Y2ggPSAoY3VycklucHV0LT5waXRjaCkgPj4gMTsKKyAgICBvZmZzZXQgPSB4X3BvcyArIHlfcG9zICogb3JnX3BpdGNoOworCisgICAgb3JnQ2IgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0OworICAgIG9yZ0NyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgIG1pbmNvc3QgPSAweDdmZmZmZmZmOworICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0RDXSwgbWluY29zdCk7CisgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgIHsKKyAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfSG9yaXpvbnRhbF0sIG1pbmNvc3QpOworICAgICAgICBpZiAoY29zdCA8IG1pbmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbmNvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0hvcml6b250YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfVmVydGljYWxdLCBtaW5jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICBtaW5jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19WZXJ0aWNhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX1BsYW5lXSwgbWluY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgbWluY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybiA7Cit9CisKKworaW50IFNBVERDaHJvbWEodWludDggKm9yZ0NiLCB1aW50OCAqb3JnQ3IsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluX2Nvc3QpCit7CisgICAgaW50IGNvc3Q7CisgICAgLyogZmlyc3QgdGFrZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JnQ2IsIG9yZ0NyIGFuZCBwcmVkICovCisgICAgaW50MTYgcmVzWzEyOF0sICpwcmVzOyAvLyByZXNpZHVlCisgICAgaW50IG0wLCBtMSwgbTIsIG0zLCB0bXAxOworICAgIGludCBqLCBrOworCisgICAgcHJlcyA9IHJlczsKKyAgICBvcmdfcGl0Y2ggLT0gODsKKyAgICAvLyBob3Jpem9udGFsIHRyYW5zZm9ybQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgeworICAgICAgICBrID0gMjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IG9yZ0NiWzBdIC0gcHJlZFswXTsKKyAgICAgICAgICAgIG0zID0gb3JnQ2JbM10gLSBwcmVkWzNdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBvcmdDYlsxXSAtIHByZWRbMV07CisgICAgICAgICAgICBtMiA9IG9yZ0NiWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syXSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzFdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgICAgICBvcmdDYiArPSA0OworICAgICAgICAgICAgcHJlcyArPSA0OworICAgICAgICAgICAgcHJlZCArPSA0OworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIG9yZ0NiICs9IG9yZ19waXRjaDsKKyAgICAgICAgayA9IDI7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBvcmdDclswXSAtIHByZWRbMF07CisgICAgICAgICAgICBtMyA9IG9yZ0NyWzNdIC0gcHJlZFszXTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gb3JnQ3JbMV0gLSBwcmVkWzFdOworICAgICAgICAgICAgbTIgPSBvcmdDclsyXSAtIHByZWRbMl07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgICAgIHByZXNbMl0gPSBtMCAtIG0xOworICAgICAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgICAgICBwcmVzWzNdID0gbTMgLSBtMjsKKworICAgICAgICAgICAgb3JnQ3IgKz0gNDsKKyAgICAgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgICAgIHByZWQgKz0gNDsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgICAgICBvcmdDciArPSBvcmdfcGl0Y2g7CisgICAgfQorCisgICAgLyogdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICB7CisgICAgICAgIHByZXMgPSByZXMgKyAoaiA8PCA2KTsKKyAgICAgICAgayA9IDE2OworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgICAgIG0zID0gcHJlc1szPDw0XTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gcHJlc1sxPDw0XTsKKyAgICAgICAgICAgIG0yID0gcHJlc1syPDw0XTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syPDw0XSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzE8PDRdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbMzw8NF0gPSBtMyAtIG0yOworCisgICAgICAgICAgICBwcmVzKys7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgc3VtIG9mIGFic29sdXRlIHZhbHVlICovCisgICAgcHJlcyA9IHJlczsKKyAgICBjb3N0ID0gMDsKKyAgICBrID0gMTI4OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIGsgLT0gODsKKyAgICAgICAgaWYgKGNvc3QgPiBtaW5fY29zdCkgLyogZWFybHkgZHJvcCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29zdDsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBvbGQgY29kZSwgdW51c2VkCisvKiBmaW5kIHRoZSBiZXN0IGludHJhIG1vZGUgYmFzZWQgb24gb3JpZ2luYWwgKHVuZW5jb2RlZCkgZnJhbWUgKi8KKy8qIG91dHB1dCBpcworICAgIGN1cnJNQi0+bWJfaW50cmEsIGN1cnJNQi0+bWJNb2RlLAorICAgIGN1cnJNQi0+aTE2TW9kZSAgKGlmIGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgY3Vyck1CLT5pNE1vZGVbLi5dIChpZiBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpICovCisKKyNpZmRlZiBGSVhFRF9JTlRSQVBSRURfTU9ERQordm9pZCBNQkludHJhU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSkKK3sKKyAgICAodm9pZCkobWJOdW0pOworCisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBpbmR4LCBibG9ja194LCBibG9ja195OworCisgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKKworICAgIGlmICghdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKKyAgICB7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYkF2YWlsQTsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1iQXZhaWxCOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJBdmFpbEM7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYkF2YWlsRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJfaW50cmEgOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckNdLm1iX2ludHJhOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckRdLm1iX2ludHJhOworICAgICAgICB9CisgICAgfQorCisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IFRSVUU7CisgICAgY3Vyck1CLT5tYk1vZGUgPSBGSVhFRF9JTlRSQVBSRURfTU9ERTsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gRklYRURfSTE2X01PREU7CisKKyAgICAgICAgaWYgKEZJWEVEX0kxNl9NT0RFID09IEFWQ19JMTZfVmVydGljYWwgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGSVhFRF9JMTZfTU9ERSA9PSBBVkNfSTE2X0hvcml6b250YWwgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGSVhFRF9JMTZfTU9ERSA9PSBBVkNfSTE2X1BsYW5lICYmICEodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy9pZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpCisgICAgeworICAgICAgICBmb3IgKGluZHggPSAwOyBpbmR4IDwgMTY7IGluZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tfeCA9IGJsa0lkeDJibGtYW2luZHhdOworICAgICAgICAgICAgYmxvY2tfeSA9IGJsa0lkeDJibGtZW2luZHhdOworCisgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBGSVhFRF9JNF9NT0RFOworCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfVmVydGljYWwgJiYgIShibG9ja195ID4gMCB8fCB2aWRlby0+aW50cmFBdmFpbEIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0hvcml6b250YWwgJiYgIShibG9ja194IHx8IHZpZGVvLT5pbnRyYUF2YWlsQSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0ICYmCisgICAgICAgICAgICAgICAgICAgIChibG9ja195ID09IDAgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAhKChibG9ja195ICYmIGJsb2NrX3gpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9WZXJ0aWNhbF9SaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAhKChibG9ja195ICYmIGJsb2NrX3gpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9Ib3Jpem9udGFsX0Rvd24gJiYKKyAgICAgICAgICAgICAgICAgICAgISgoYmxvY2tfeSAmJiBibG9ja194KQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja195ICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeCAmJiB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfVmVydGljYWxfTGVmdCAmJgorICAgICAgICAgICAgICAgICAgICAoYmxvY2tfeSA9PSAwICYmICF2aWRlby0+aW50cmFBdmFpbEIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0hvcml6b250YWxfVXAgJiYgIShibG9ja194IHx8IHZpZGVvLT5pbnRyYUF2YWlsQSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gRklYRURfSU5UUkFfQ0hST01BX01PREU7CisKKyAgICBpZiAoRklYRURfSU5UUkFfQ0hST01BX01PREUgPT0gQVZDX0lDX0hvcml6b250YWwgJiYgISh2aWRlby0+aW50cmFBdmFpbEEpKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIGlmIChGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSA9PSBBVkNfSUNfVmVydGljYWwgJiYgISh2aWRlby0+aW50cmFBdmFpbEIpKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIGlmIChGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSA9PSBBVkNfSUNfUGxhbmUgJiYgISh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkpCisgICAgeworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisgICAgfQorCisgICAgLyogYWxzbyByZXNldCB0aGUgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAvKiBzZXQgTVYgYW5kIFJlZl9JZHggY29kZXMgb2YgSW50cmEgYmxvY2tzIGluIFAtc2xpY2VzICovCisgICAgbWVtc2V0KGN1cnJNQi0+bXZMMCwgMCwgc2l6ZW9mKGludDMyKSoxNik7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzFdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzJdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzNdID0gLTE7CisKKyAgICAvLyBvdXRwdXQgZnJvbSB0aGlzIGZ1bmN0aW9uLCBjdXJyTUItPm1iTW9kZSBzaG91bGQgYmUgc2V0IHRvIGVpdGhlcgorICAgIC8vIEFWQ19JNCwgQVZDX0kxNiwgb3IgZWxzZSBpbiBBVkNNQk1vZGUgZW51bSwgbWJUeXBlLCBtYl9pbnRyYSwgaW50cmFfY2hyb21hX3ByZWRfbW9kZSAqLworICAgIHJldHVybiA7Cit9CisjZWxzZSAvLyBmYXN0ZXIgY29tYmluZWQgcHJlZGljdGlvbitTQUQgY2FsY3VsYXRpb24KK3ZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIHVpbnQ4ICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKKyAgICB1aW50OCAqY29tcCwgKnByZWRfYmxvY2s7CisgICAgaW50IGJsb2NrX3gsIGJsb2NrX3ksIG9mZnNldDsKKyAgICB1aW50IHNhZCwgc2FkNCwgc2FkSTQsIHNhZEkxNjsKKyAgICBpbnQgY29tcG9uZW50LCBTdWJCbG9ja19pbmR4LCB0ZW1wOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgY29zdCBvZiBlYWNoIGludHJhIHByZWRpY3Rpb24gbW9kZSAgYW5kIGNvbXBhcmUgdG8gdGhlCisgICAgaW50ZXIgbW9kZSAqLworICAgIC8qIGZ1bGwgc2VhcmNoIGZvciBhbGwgaW50cmEgcHJlZGljdGlvbiAqLworICAgIG9mZnNldCA9ICh2aWRlby0+bWJfeSA8PCA0KSAqIHBpdGNoICsgKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGN1ckwgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworICAgIHByZWRfYmxvY2sgPSB2aWRlby0+cHJlZF9ibG9jayArIDg0OworCisgICAgLyogQXNzdW1pbmcgdGhhdCBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkgaGFzIGJlZW4gY2FsbGVkIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+aW50cmFBdmFpbEQgPSAwOworCisgICAgaWYgKCF2aWRlby0+Y3VyclBpY1BhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnKQorICAgIHsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1iQXZhaWxBOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJBdmFpbEI7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYkF2YWlsQzsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1iQXZhaWxEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYl9pbnRyYSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQ10ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsRCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyRF0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjdXJyZW50bHkgd2UncmUgZG9pbmcgZXhoYXVzdGl2ZSBzZWFyY2guIFNtYXJ0IHNlYXJjaCB3aWxsIGJlIHVzZWQgbGF0ZXIgKi8KKworICAgIC8qIEkxNiBtb2RlcyAqLworICAgIGN1ckwgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3AgPSBjdXJMIC0gcGl0Y2g7CisgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQgPSBjdXJMIC0gMTsKKyAgICBpZiAodmlkZW8tPm1iX3kpCisgICAgeworICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0ID0gKihjdXJMIC0gcGl0Y2ggLSAxKTsKKyAgICB9CisKKyAgICAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgIHNhZEkxNiA9IDY1NTM2OworICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgc2FkID0gU0FEX0kxNl9WZXJ0KHZpZGVvLCBjdXJMLCBzYWRJMTYpOworCisgICAgICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfVmVydGljYWw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBsZWZ0ICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIHNhZCA9IFNBRF9JMTZfSG9yekRDKHZpZGVvLCBjdXJMLCBBVkNfSTE2X0hvcml6b250YWwsIHNhZEkxNik7CisKKyAgICAgICAgaWYgKHNhZCA8IHNhZEkxNikKKyAgICAgICAgeworICAgICAgICAgICAgc2FkSTE2ID0gc2FkOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9Ib3Jpem9udGFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW50cmFfMTZ4MTZfREMsIGRlZmF1bHQgbW9kZSAqLworICAgIHNhZCA9IFNBRF9JMTZfSG9yekRDKHZpZGVvLCBjdXJMLCBBVkNfSTE2X0RDLCBzYWRJMTYpOworICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgeworICAgICAgICBzYWRJMTYgPSBzYWQ7CisgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgfQorCisgICAgLyogSW50cmFfMTZ4MTZfUGxhbmUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBzYWQgPSBTQURfSTE2X1BsYW5lKHZpZGVvLCBjdXJMLCBzYWRJMTYpOworCisgICAgICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzYWRJMTYgPj49IDE7ICAvKiBiZWZvcmUgY29tcGFyaXNvbiAqLworCisgICAgLyogc2VsZWN0aW9uIGJldHdlZW4gaW50cmE0LCBpbnRyYTE2IG9yIGludGVyIG1vZGUgKi8KKyAgICBpZiAoc2FkSTE2IDwgZW5jdmlkLT5taW5fY29zdCkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSBUUlVFOworICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3QgPSBzYWRJMTY7CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpIC8qIG9ubHkgZG8gdGhlIGNocm9taW5hbmNlIHNlYXJjaCB3aGVuIGludHJhIGlzIGRlY2lkZWQgKi8KKyAgICB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBtaWdodCBiZSBhYmxlIHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHByZWRpY3Rpb24gZnJvbQorICAgICAgICB0aGUgbHVtYSBwcmVkaWN0aW9uIHR5cGUgKi8KKworICAgICAgICAvKiBub3cgc2VhcmNoIGZvciB0aGUgYmVzdCBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiAqLworICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ID4+IDIpICsgKHZpZGVvLT5tYl94IDw8IDIpOworICAgICAgICBjdXJDYiA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyBvZmZzZXQ7CisgICAgICAgIGN1ckNyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgICAgICBwaXRjaCA+Pj0gMTsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jYiA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NiID0gY3VyQ2IgLSAxOworICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NyID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY3IgPSBjdXJDciAtIDE7CisKKyAgICAgICAgaWYgKHZpZGVvLT5tYl95KQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NiID0gKihjdXJDYiAtIHBpdGNoIC0gMSk7CisgICAgICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NyID0gKihjdXJDciAtIHBpdGNoIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfREMgKi8KKyAgICAgICAgc2FkNCA9IFNBRF9DaHJvbWFfREModmlkZW8sIGN1ckNiLCBjdXJDciwgNjU1MzYpOworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisKKyAgICAgICAgLyogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIGxlZnQgKi8KKyAgICAgICAgICAgIHNhZCA9IFNBRF9DaHJvbWFfSG9yeih2aWRlbywgY3VyQ2IsIGN1ckNyLCBzYWQ0KTsKKyAgICAgICAgICAgIGlmIChzYWQgPCBzYWQ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhZDQgPSBzYWQ7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0hvcml6b250YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRvcCAqLworICAgICAgICAgICAgc2FkID0gU0FEX0Nocm9tYV9WZXJ0KHZpZGVvLCBjdXJDYiwgY3VyQ3IsIHNhZDQpOworCisgICAgICAgICAgICBpZiAoc2FkIDwgc2FkNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWQ0ID0gc2FkOworICAgICAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19WZXJ0aWNhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgYW5kIGxlZnQgKi8KKyAgICAgICAgICAgIEludHJhX0Nocm9tYV9QbGFuZSh2aWRlbywgcGl0Y2gpOworCisgICAgICAgICAgICBzYWQgPSBTQURDaHJvbWEocHJlZF9ibG9jayArIDQ1MiwgY3VyQ2IsIGN1ckNyLCBwaXRjaCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPCBzYWQ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhZDQgPSBzYWQ7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX1BsYW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYWxzbyByZXNldCB0aGUgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgLyogc2V0IE1WIGFuZCBSZWZfSWR4IGNvZGVzIG9mIEludHJhIGJsb2NrcyBpbiBQLXNsaWNlcyAqLworICAgICAgICBtZW1zZXQoY3Vyck1CLT5tdkwwLCAwLCBzaXplb2YoaW50MzIpKjE2KTsKKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+cmVmX2lkeF9MMCwgLTEsIHNpemVvZihpbnQxNikqNCk7CisKKyAgICB9CisKKyAgICAvLyBvdXRwdXQgZnJvbSB0aGlzIGZ1bmN0aW9uLCBjdXJyTUItPm1iTW9kZSBzaG91bGQgYmUgc2V0IHRvIGVpdGhlcgorICAgIC8vIEFWQ19JNCwgQVZDX0kxNiwgb3IgZWxzZSBpbiBBVkNNQk1vZGUgZW51bSwgbWJUeXBlLCBtYl9pbnRyYSwgaW50cmFfY2hyb21hX3ByZWRfbW9kZSAqLworCisgICAgcmV0dXJuIDsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCkBAIC0wLDAgKzEsMjE1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorCisKKyNkZWZpbmUgQ0xJUF9SRVNVTFQoeCkgICAgICBpZigodWludCl4ID4gMHhGRil7IFwKKyAgICAgICAgICAgICAgICAgeCA9IDB4RkYgJiAofih4Pj4zMSkpO30KKworLyogKGJsa3dpZHRoIDw8IDIpICsgKGR5IDw8IDEpICsgZHggKi8KK3N0YXRpYyB2b2lkICgqY29uc3QgZUNocm9tYU1DX1NJTURbOF0pKHVpbnQ4ICosIGludCAsIGludCAsIGludCAsIHVpbnQ4ICosIGludCwgaW50ICwgaW50KSA9Cit7CisgICAgJmVDaHJvbWFGdWxsTUNfU0lNRCwKKyAgICAmZUNocm9tYUhvcml6b250YWxNQ19TSU1ELAorICAgICZlQ2hyb21hVmVydGljYWxNQ19TSU1ELAorICAgICZlQ2hyb21hRGlhZ29uYWxNQ19TSU1ELAorICAgICZlQ2hyb21hRnVsbE1DX1NJTUQsCisgICAgJmVDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQsCisgICAgJmVDaHJvbWFWZXJ0aWNhbE1DMl9TSU1ELAorICAgICZlQ2hyb21hRGlhZ29uYWxNQzJfU0lNRAorfTsKKy8qIFBlcmZvcm0gbW90aW9uIHByZWRpY3Rpb24gYW5kIGNvbXBlbnNhdGlvbiB3aXRoIHJlc2lkdWUgaWYgZXhpc3QuICovCit2b2lkIEFWQ01CTW90aW9uQ29tcChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbykKK3sKKyAgICAodm9pZCkoZW5jdmlkKTsKKworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBpbnQgbWJQYXJ0SWR4LCBzdWJNYlBhcnRJZHg7CisgICAgaW50IHJlZl9pZHg7CisgICAgaW50IG9mZnNldF9NYlBhcnRfaW5keCA9IDA7CisgICAgaW50MTYgKm12OworICAgIHVpbnQzMiB4X3BvcywgeV9wb3M7CisgICAgdWludDggKmN1ckwsICpjdXJDYiwgKmN1ckNyOworICAgIHVpbnQ4ICpyZWZfbCwgKnJlZl9DYiwgKnJlZl9DcjsKKyAgICB1aW50OCAqcHJlZEJsb2NrLCAqcHJlZENiLCAqcHJlZENyOworICAgIGludCBibG9ja194LCBibG9ja195LCBvZmZzZXRfeCwgb2Zmc2V0X3ksIG9mZnNldFAsIG9mZnNldDsKKyAgICBpbnQgeF9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBpbnQgeV9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeSA8PCA0KTsKKyAgICBpbnQgTWJIZWlnaHQsIE1iV2lkdGgsIG1iUGFydElkeF9YLCBtYlBhcnRJZHhfWSwgb2Zmc2V0X2luZHg7CisgICAgaW50IHBpY1dpZHRoID0gY3VyclBpYy0+d2lkdGg7CisgICAgaW50IHBpY1BpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IHBpY0hlaWdodCA9IGN1cnJQaWMtPmhlaWdodDsKKyAgICB1aW50MzIgdG1wX3dvcmQ7CisKKyAgICB0bXBfd29yZCA9IHlfcG9zaXRpb24gKiBwaWNQaXRjaDsKKyAgICBjdXJMID0gY3VyclBpYy0+U2wgKyB0bXBfd29yZCArIHhfcG9zaXRpb247CisgICAgb2Zmc2V0ID0gKHRtcF93b3JkID4+IDIpICsgKHhfcG9zaXRpb24gPj4gMSk7CisgICAgY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgY3VyQ3IgPSBjdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisKKyAgICBwcmVkQmxvY2sgPSBjdXJMOworICAgIHByZWRDYiA9IGN1ckNiOworICAgIHByZWRDciA9IGN1ckNyOworCisgICAgR2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKHZpZGVvLCAxKTsKKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgTWJIZWlnaHQgPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFttYlBhcnRJZHhdOworICAgICAgICBNYldpZHRoID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFttYlBhcnRJZHhdOworICAgICAgICBtYlBhcnRJZHhfWCA9ICgobWJQYXJ0SWR4ICsgb2Zmc2V0X01iUGFydF9pbmR4KSAmIDEpOworICAgICAgICBtYlBhcnRJZHhfWSA9IChtYlBhcnRJZHggKyBvZmZzZXRfTWJQYXJ0X2luZHgpID4+IDE7CisgICAgICAgIHJlZl9pZHggPSBjdXJyTUItPnJlZl9pZHhfTDBbKG1iUGFydElkeF9ZIDw8IDEpICsgbWJQYXJ0SWR4X1hdOworICAgICAgICBvZmZzZXRfaW5keCA9IDA7CisKKyAgICAgICAgcmVmX2wgPSB2aWRlby0+UmVmUGljTGlzdDBbcmVmX2lkeF0tPlNsOworICAgICAgICByZWZfQ2IgPSB2aWRlby0+UmVmUGljTGlzdDBbcmVmX2lkeF0tPlNjYjsKKyAgICAgICAgcmVmX0NyID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TY3I7CisKKyAgICAgICAgZm9yIChzdWJNYlBhcnRJZHggPSAwOyBzdWJNYlBhcnRJZHggPCBjdXJyTUItPk51bVN1Yk1iUGFydFttYlBhcnRJZHhdOyBzdWJNYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tfeCA9IChtYlBhcnRJZHhfWCA8PCAxKSArICgoc3ViTWJQYXJ0SWR4ICsgb2Zmc2V0X2luZHgpICYgMSk7CisgICAgICAgICAgICBibG9ja195ID0gKG1iUGFydElkeF9ZIDw8IDEpICsgKCgoc3ViTWJQYXJ0SWR4ICsgb2Zmc2V0X2luZHgpID4+IDEpICYgMSk7CisgICAgICAgICAgICBtdiA9IChpbnQxNiopKGN1cnJNQi0+bXZMMCArIGJsb2NrX3ggKyAoYmxvY2tfeSA8PCAyKSk7CisgICAgICAgICAgICBvZmZzZXRfeCA9IHhfcG9zaXRpb24gKyAoYmxvY2tfeCA8PCAyKTsKKyAgICAgICAgICAgIG9mZnNldF95ID0geV9wb3NpdGlvbiArIChibG9ja195IDw8IDIpOworICAgICAgICAgICAgeF9wb3MgPSAob2Zmc2V0X3ggPDwgMikgKyAqbXYrKzsgICAvKnF1YXJ0ZXIgcGVsICovCisgICAgICAgICAgICB5X3BvcyA9IChvZmZzZXRfeSA8PCAyKSArICptdjsgICAvKnF1YXJ0ZXIgcGVsICovCisKKyAgICAgICAgICAgIC8vb2Zmc2V0ID0gb2Zmc2V0X3kgKiBjdXJyUGljLT53aWR0aDsKKyAgICAgICAgICAgIC8vb2Zmc2V0QyA9IChvZmZzZXQgPj4gMikgKyAob2Zmc2V0X3ggPj4gMSk7CisgICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgPDwgMikgKiBwaWNQaXRjaCArIChibG9ja194IDw8IDIpOworICAgICAgICAgICAgZUx1bWFNb3Rpb25Db21wKHJlZl9sLCBwaWNQaXRjaCwgcGljSGVpZ2h0LCB4X3BvcywgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb21wX1NsICsgb2Zmc2V0ICsgb2Zmc2V0X3gsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQmxvY2sgKyBvZmZzZXRQLCBwaWNQaXRjaCwgTWJXaWR0aCwgTWJIZWlnaHQpOworCisgICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgKiBwaWNXaWR0aCkgKyAoYmxvY2tfeCA8PCAxKTsKKyAgICAgICAgICAgIGVDaHJvbWFNb3Rpb25Db21wKHJlZl9DYiwgcGljV2lkdGggPj4gMSwgcGljSGVpZ2h0ID4+IDEsIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TY2IgKyAgb2Zmc2V0QywqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENiICsgb2Zmc2V0UCwgcGljUGl0Y2ggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKKyAgICAgICAgICAgIGVDaHJvbWFNb3Rpb25Db21wKHJlZl9DciwgcGljV2lkdGggPj4gMSwgcGljSGVpZ2h0ID4+IDEsIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TY3IgKyAgb2Zmc2V0QywqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENyICsgb2Zmc2V0UCwgcGljUGl0Y2ggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKKworICAgICAgICAgICAgb2Zmc2V0X2luZHggPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW21iUGFydElkeF0gPj4gMzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXRfTWJQYXJ0X2luZHggPSBjdXJyTUItPk1iUGFydFdpZHRoID4+IDQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBwcmVmb3JtIHRoZSBhY3R1YWwgIG1vdGlvbiBjb21wIGhlcmUgKi8KK3ZvaWQgZUx1bWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWNwaXRjaCwgaW50IHBpY2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShwaWNoZWlnaHQpOworCisgICAgaW50IGR4LCBkeTsKKyAgICBpbnQgdGVtcDJbMjFdWzIxXTsgLyogZm9yIGludGVybWVkaWF0ZSByZXN1bHRzICovCisgICAgdWludDggKnJlZjI7CisKKyAgICBkeCA9IHhfcG9zICYgMzsKKyAgICBkeSA9IHlfcG9zICYgMzsKKyAgICB4X3BvcyA9IHhfcG9zID4+IDI7ICAvKiByb3VuZCBpdCB0byBmdWxsLXBlbCByZXNvbHV0aW9uICovCisgICAgeV9wb3MgPSB5X3BvcyA+PiAyOworCisgICAgLyogcGVyZm9ybSBhY3R1YWwgbW90aW9uIGNvbXBlbnNhdGlvbiAqLworICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApCisgICAgeyAgLyogZnVsbHBlbCBwb3NpdGlvbiAqLy8qIEcgKi8KKworICAgICAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIGVGdWxsUGVsTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7CisKKyAgICB9ICAgLyogb3RoZXIgcG9zaXRpb25zICovCisgICAgZWxzZSAgaWYgKGR5ID09IDApCisgICAgeyAvKiBubyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovLyogYSxiLGMqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgZUhvcnpJbnRlcnAxTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHgpOworICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAwKQorICAgIHsgLypubyBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8vKiBkLGgsbiAqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgZVZlcnRJbnRlcnAxTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOworICAgIH0KKyAgICBlbHNlIGlmIChkeSA9PSAyKQorICAgIHsgIC8qIGhvcml6b250YWwgY3Jvc3MgKi8vKiBpLCBqLCBrICovCisKKyAgICAgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvcyAtIDI7IC8qIG1vdmUgdG8gdGhlIGxlZnQgMiBwaXhlbHMgKi8KKworICAgICAgICBlVmVydEludGVycDJNQyhyZWYsIHBpY3BpdGNoLCAmdGVtcDJbMF1bMF0sIDIxLCBibGt3aWR0aCArIDUsIGJsa2hlaWdodCk7CisKKyAgICAgICAgZUhvcnpJbnRlcnAyTUMoJnRlbXAyWzBdWzJdLCAyMSwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHgpOworICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAyKQorICAgIHsgLyogdmVydGljYWwgY3Jvc3MgKi8gLyogZixxICovCisKKyAgICAgICAgcmVmICs9ICh5X3BvcyAtIDIpICogcGljcGl0Y2ggKyB4X3BvczsgLyogbW92ZSB0byB1cCAyIGxpbmVzICovCisKKyAgICAgICAgZUhvcnpJbnRlcnAzTUMocmVmLCBwaWNwaXRjaCwgJnRlbXAyWzBdWzBdLCAyMSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOworICAgICAgICBlVmVydEludGVycDNNQygmdGVtcDJbMl1bMF0sIDIxLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIGRpYWdvbmFsICovLyogZSxnLHAsciAqLworCisgICAgICAgIHJlZjIgPSByZWYgKyAoeV9wb3MgKyAoZHkgLyAyKSkgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIHJlZiArPSAoeV9wb3MgKiBwaWNwaXRjaCkgKyB4X3BvcyArIChkeCAvIDIpOworCisgICAgICAgIGVEaWFnb25hbEludGVycE1DKHJlZjIsIHJlZiwgcGljcGl0Y2gsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZUNyZWF0ZUFsaWduKHVpbnQ4ICpyZWYsIGludCBwaWNwaXRjaCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXQsIG91dF9vZmZzZXQ7CisgICAgdWludDMyIHByZXZfcGl4LCByZXN1bHQsIHBpeDEsIHBpeDIsIHBpeDQ7CisKKyAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaDsvLyArIHhfcG9zOworICAgIG91dF9vZmZzZXQgPSAyNCAtIGJsa3dpZHRoOworCisgICAgLy9zd2l0Y2goeF9wb3MmMHgzKXsKKyAgICBzd2l0Y2ggKCgodWludDMyKXJlZikmMHgzKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgb2Zmc2V0ID0gIHBpY3BpdGNoIC0gYmxrd2lkdGggLSAzOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpeDEgPSAqcmVmKys7CisgICAgICAgICAgICAgICAgcGl4MiA9ICooKHVpbnQxNiopcmVmKTsKKyAgICAgICAgICAgICAgICByZWYgKz0gMjsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocGl4MiA8PCA4KSB8IHBpeDE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAzOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpeDQgPSAqKCh1aW50MzIqKXJlZik7CisgICAgICAgICAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCA9IChwaXg0IDw8IDI0KSAmIDB4RkYwMDAwMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDg7IC8qIGZvciB0aGUgbmV4dCBsb29wICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZiArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgb3V0ICs9IG91dF9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgb2Zmc2V0ID0gIHBpY3BpdGNoIC0gYmxrd2lkdGggLSAyOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICooKHVpbnQxNiopcmVmKTsKKyAgICAgICAgICAgICAgICByZWYgKz0gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpeDQgPSAqKCh1aW50MzIqKXJlZik7CisgICAgICAgICAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCA9IChwaXg0IDw8IDE2KSAmIDB4RkZGRjAwMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDE2OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG9mZnNldCA9ICBwaWNwaXRjaCAtIGJsa3dpZHRoIC0gMTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAqcmVmKys7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOworICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCA4KSAmIDB4RkZGRkZGMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDI0OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGVIb3J6SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpCit7CisgICAgdWludDggKnBfcmVmOworICAgIHVpbnQzMiAqcF9jdXI7CisgICAgdWludDMyIHRtcCwgcGtyZXM7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGo7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKyAgICBpbnQzMiByMTMsIHI2OworCisgICAgcF9jdXIgPSAodWludDMyKilvdXQ7IC8qIGFzc3VtZSBpdCdzIHdvcmQgYWxpZ25lZCAqLworICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpID4+IDI7CisgICAgcF9yZWYgPSBpbjsKKyAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOworCisgICAgaWYgKGR4JjEpCisgICAgeworICAgICAgICBkeCA9ICgoZHggPj4gMSkgPyAtMyA6IC00KTsgLyogdXNlIGluIDMvNCBwZWwgKi8KKyAgICAgICAgcF9yZWYgLT0gMjsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIHIwID0gcF9yZWZbMF07CisgICAgICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgICAgIHIxID0gcF9yZWZbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSA0KTsgLyogbW92ZSBwb2ludGVyIHRvIGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgICAgIHIyIHw9IChyMyA8PCAxNik7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgICAgIHIzIHw9IChyNCA8PCAxNik7ICAgICAgICAgICAvKiAwLGgsMCxmICovCisKKyAgICAgICAgICAgICAgICByNCA9IHIwICsgcjM7ICAgICAgIC8qIGMraCwgYStmICovCisgICAgICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICAgICAgcjYgPSByMiArIHIzOyAgIC8qIGcraCwgZStmICovCisgICAgICAgICAgICAgICAgcjUgPj49IDE2OworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgICAgICByNCArPSByNSAqIDIwOyAgICAgIC8qIGMrMjAqZSsyMCpmK2gsIGErMjAqYysyMCpkK2YgKi8KKyAgICAgICAgICAgICAgICByNCArPSAweDEwMDAxMDsgLyogKzE2LCArMTYgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICAgICAgcjQgLT0gcjUgKiA1OyAgICAgICAvKiBjLTUqZCsyMCplKzIwKmYtNSpnK2gsIGEtNSpiKzIwKmMrMjAqZC01KmUrZiAqLworICAgICAgICAgICAgICAgIHI0ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworCisgICAgICAgICAgICAgICAgcjUgPSBwX3JlZltkeCsyXTsKKyAgICAgICAgICAgICAgICByNiA9IHBfcmVmW2R4KzRdOworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7CisgICAgICAgICAgICAgICAgcjQgKz0gcjU7CisgICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgICAgICByNCA9IChyNCA+PiAxKSAmIDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KKyAgICAgICAgICAgICAgICByNiA9IChyNSA8PCAxNik7CisgICAgICAgICAgICAgICAgcjUgPSByNiB8IChyMiA+PiAxNik7LyogMCxpLDAsZyAqLworICAgICAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLworICAgICAgICAgICAgICAgIHIxID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMSB8PSAocjMgPDwgMTYpOyAvKiAwLGYsMCxkICovIC8qIHIxIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCisgICAgICAgICAgICAgICAgcjUgKz0gMjAgKiByMTsgIC8qIGQrMjBmKzIwZytpLCBiKzIwZCsyMGUrZyAqLworICAgICAgICAgICAgICAgIHIwID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgIC8qIGUraCwgYytmICovCisgICAgICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTA7IC8qIDE2LDE2ICovCisgICAgICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KKyAgICAgICAgICAgICAgICByNSA+Pj0gNTsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjU7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKworICAgICAgICAgICAgICAgIHIwID0gcF9yZWZbZHgrM107CisgICAgICAgICAgICAgICAgcjEgPSBwX3JlZltkeCs1XTsKKyAgICAgICAgICAgICAgICByMCB8PSAocjEgPDwgMTYpOworICAgICAgICAgICAgICAgIHI1ICs9IHIwOworICAgICAgICAgICAgICAgIHI1ICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjUgPSAocjUgPj4gMSkgJiAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHI0IHw9IChyNSA8PCA4KTsgICAgLyogcGFjayB0aGVtIHRvZ2V0aGVyICovCisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSByNDsKKyAgICAgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisKKyAgICAgICAgICAgIGlmIChyMTMmMHhGRjAwMDcwMCkgLyogbmVlZCBjbGlwcGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gKHJlZl9vZmZzZXQgKyBibGt3aWR0aCk7ICAgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICBwX2N1ciAtPSAob3V0cGl0Y2ggPj4gMik7CisKKyAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOworICAgICAgICAgICAgICAgICAgICBwa3JlcyA9IChyZXN1bHQgPj4gMSkgOworICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gNTsgIC8qIG9mZnNldCBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgZmlsdGVyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgICAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9yZWYgLT0gMjsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIHIwID0gcF9yZWZbMF07CisgICAgICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgICAgIHIxID0gcF9yZWZbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSA0KTsgLyogbW92ZSBwb2ludGVyIHRvIGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgICAgIHIyIHw9IChyMyA8PCAxNik7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgICAgIHIzIHw9IChyNCA8PCAxNik7ICAgICAgICAgICAvKiAwLGgsMCxmICovCisKKyAgICAgICAgICAgICAgICByNCA9IHIwICsgcjM7ICAgICAgIC8qIGMraCwgYStmICovCisgICAgICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICAgICAgcjYgPSByMiArIHIzOyAgIC8qIGcraCwgZStmICovCisgICAgICAgICAgICAgICAgcjUgPj49IDE2OworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgICAgICByNCArPSByNSAqIDIwOyAgICAgIC8qIGMrMjAqZSsyMCpmK2gsIGErMjAqYysyMCpkK2YgKi8KKyAgICAgICAgICAgICAgICByNCArPSAweDEwMDAxMDsgLyogKzE2LCArMTYgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICAgICAgcjQgLT0gcjUgKiA1OyAgICAgICAvKiBjLTUqZCsyMCplKzIwKmYtNSpnK2gsIGEtNSpiKzIwKmMrMjAqZC01KmUrZiAqLworICAgICAgICAgICAgICAgIHI0ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgICAgIHI0ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgICAgICByNSA9IHBfcmVmWzRdOyAgLyogaSAqLworICAgICAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKKyAgICAgICAgICAgICAgICByNSA9IHI2IHwgKHIyID4+IDE2KTsvKiAwLGksMCxnICovCisgICAgICAgICAgICAgICAgcjUgKz0gcjE7ICAgICAgIC8qIGQraSwgYitnICovIC8qIHI1IG5vdCBmcmVlICovCisgICAgICAgICAgICAgICAgcjEgPj49IDE2OworICAgICAgICAgICAgICAgIHIxIHw9IChyMyA8PCAxNik7IC8qIDAsZiwwLGQgKi8gLyogcjEgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMSArPSByMjsgICAgICAgLyogZitnLCBkK2UgKi8KKyAgICAgICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCisgICAgICAgICAgICAgICAgcjAgPj49IDE2OworICAgICAgICAgICAgICAgIHIwIHw9IChyMiA8PCAxNik7IC8qIDAsZSwwLGMgKi8gLyogcjAgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KKyAgICAgICAgICAgICAgICByNSArPSAweDEwMDAxMDsgLyogMTYsMTYgKi8KKyAgICAgICAgICAgICAgICByNSAtPSByMCAqIDU7ICAgICAgIC8qIGQtNWUrMjBmKzIwZy01aCtpLCBiLTVjKzIwZCsyMGUtNWYrZyAqLworICAgICAgICAgICAgICAgIHI1ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNTsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgICAgIHI1ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcjQ7CisgICAgICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICAgICByMCA9IHIyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLworCisgICAgICAgICAgICBpZiAocjEzJjB4RkYwMDA3MDApIC8qIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBtb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IChyZWZfb2Zmc2V0ICsgYmxrd2lkdGgpOyAgIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgcF9jdXIgLT0gKG91dHBpdGNoID4+IDIpOworCisgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAgIC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCkKK3sKKyAgICBpbnQgKnBfcmVmOworICAgIHVpbnQzMiAqcF9jdXI7CisgICAgdWludDMyIHRtcCwgcGtyZXM7CisgICAgaW50IHJlc3VsdCwgcmVzdWx0MiwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9ICh1aW50MzIqKW91dDsgLyogYXNzdW1lIGl0J3Mgd29yZCBhbGlnbmVkICovCisgICAgY3Vycl9vZmZzZXQgPSAob3V0cGl0Y2ggLSBibGt3aWR0aCkgPj4gMjsKKyAgICBwX3JlZiA9IGluOworICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisKKyAgICBpZiAoZHgmMSkKKyAgICB7CisgICAgICAgIGR4ID0gKChkeCA+PiAxKSA/IC0zIDogLTQpOyAvKiB1c2UgaW4gMy80IHBlbCAqLworCisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgcjAgPSBwX3JlZlstMl07CisgICAgICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gMzsgIC8qIG9mZnNldCBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgZmlsdGVyICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgICAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMCA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICByMCA9IHBfcmVmWy0yXTsKKyAgICAgICAgICAgICAgICByMSA9IHBfcmVmWy0xXTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7CisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAzOyAgLyogb2Zmc2V0IGJhY2sgdG8gdGhlIG1pZGRsZSBvZiBmaWx0ZXIgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZUhvcnpJbnRlcnAzTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIHVpbnQ4ICpwX3JlZjsKKyAgICBpbnQgICAqcF9jdXI7CisgICAgdWludDMyIHRtcDsKKyAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpOworICAgIHBfcmVmID0gaW47CisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKworICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCisgICAgeworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICB7CisKKyAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOworICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07CisgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgcF9yZWYgLT0gMzsgLyogbW92ZSBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGZpbHRlciAqLworICAgICAgICB9CisgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQordm9pZCBlVmVydEludGVycDFNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KQoreworICAgIHVpbnQ4ICpwX2N1ciwgKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIGk7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjEzOworICAgIHVpbnQ4ICB0bXBfaW5bMjRdWzI0XTsKKworICAgIC8qIG5vdCB3b3JkLWFsaWduZWQgKi8KKyAgICBpZiAoKCh1aW50MzIpaW4pJjB4MykKKyAgICB7CisgICAgICAgIGVDcmVhdGVBbGlnbihpbiwgaW5waXRjaCwgLTIsICZ0bXBfaW5bMF1bMF0sIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKKyAgICAgICAgaW4gPSAmdG1wX2luWzJdWzBdOworICAgICAgICBpbnBpdGNoID0gMjQ7CisgICAgfQorICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KKyAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCisKKyAgICBjdXJyX29mZnNldCArPSAzOworCisgICAgaWYgKGR5JjEpCisgICAgeworICAgICAgICBkeSA9IChkeSA+PiAxKSA/IDAgOiAtaW5waXRjaDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjEzID0gMDsKKyAgICAgICAgICAgIHBfcmVmID0gaW47CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKKyAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgICAgIHI2ICs9IHI3OworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOworICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKKworICAgICAgICAgICAgICAgIHIwID4+PSA1OworICAgICAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMTMgfD0gcjY7CisgICAgICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQorCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGR5KSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMCArPSByMTsKKyAgICAgICAgICAgICAgICByNiArPSByMjsKKyAgICAgICAgICAgICAgICByMCArPSAweDEwMDAxOworICAgICAgICAgICAgICAgIHI2ICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjAgPSAocjAgPj4gMSkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByNiA9IChyNiA+PiAxKSAmIDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCisgICAgICAgICAgICAgICAgKigodWludDMyKikocF9jdXIgKz0gb3V0cGl0Y2gpKSA9IHIwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLworICAgICAgICAgICAgaWYgKHIxMyAmIDB4RkYwMDA3MDApIC8qIHRoaXMgY29sdW1uIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2N1ciAtPSA0OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX3JlZiA9IGluICsgaTsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjEzID0gMDsKKyAgICAgICAgICAgIHBfcmVmID0gaW47CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKKyAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgICAgIHI2ICs9IHI3OworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOworICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKKworICAgICAgICAgICAgICAgIHIwID4+PSA1OworICAgICAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMTMgfD0gcjY7CisgICAgICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQorICAgICAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHI2ICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIwIHw9IChyNiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgLT0gNDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgPSBpbiArIGk7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZVZlcnRJbnRlcnAyTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCAqcF9jdXI7CisgICAgdWludDggKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgYmFjayB1cCBhbmQgb25lIHBpeGVsIHRvIHJpZ2h0ICovCisgICAgcmVmX29mZnNldCA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIGZvciBsaW1pdCAqLworCisgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgeworICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgfQorICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVWZXJ0SW50ZXJwM01DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KQoreworICAgIHVpbnQ4ICpwX2N1cjsKKyAgICBpbnQgKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgcmVzdWx0MiwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgYmFjayB1cCBhbmQgb25lIHBpeGVsIHRvIHJpZ2h0ICovCisgICAgcmVmX29mZnNldCA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIGZvciBsaW1pdCAqLworCisgICAgaWYgKGR5JjEpCisgICAgeworICAgICAgICBkeSA9IChkeSA+PiAxKSA/IC0oaW5waXRjaCA8PCAxKSA6IC0oaW5waXRjaCA8PCAxKSAtIGlucGl0Y2g7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlRGlhZ29uYWxJbnRlcnBNQyh1aW50OCAqaW4xLCB1aW50OCAqaW4yLCBpbnQgaW5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50IGosIGk7CisgICAgaW50IHJlc3VsdDsKKyAgICB1aW50OCAqcF9jdXIsICpwX3JlZiwgKnBfdG1wODsKKyAgICBpbnQgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgdWludDggdG1wX3Jlc1syNF1bMjRdLCB0bXBfaW5bMjRdWzI0XTsKKyAgICB1aW50MzIgKnBfdG1wOworICAgIHVpbnQzMiB0bXAsIHBrcmVzLCB0bXBfcmVzdWx0OworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisgICAgaW50MzIgcjYsIHI3LCByOCwgcjksIHIxMCwgcjEzOworCisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKyAgICBwX3JlZiA9IGluMSAtIDI7CisgICAgLyogcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCisgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IHRpbWUgdG8gYXZvaWQgY2FsbGluZyBDcmVhdGVBbGlnbiAqLworICAgIC8qICBpZigoKHVpbnQzMilwX3JlZikmMHgzKQorICAgICAgICB7CisgICAgICAgICAgICBDcmVhdGVBbGlnbihwX3JlZixpbnBpdGNoLDAsJnRtcF9pblswXVswXSxibGt3aWR0aCs4LGJsa2hlaWdodCk7CisgICAgICAgICAgICBwX3JlZiA9ICZ0bXBfaW5bMF1bMF07CisgICAgICAgICAgICByZWZfb2Zmc2V0ID0gMjQtYmxrd2lkdGg7CisgICAgICAgIH0qLworCisgICAgcF90bXAgPSAodWludDMyKikgJiAodG1wX3Jlc1swXVswXSk7CisgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisKKyAgICAgICAgLy9yMCA9ICooKHVpbnQzMiopcF9yZWYpOyAgIC8qIGQsYyxiLGEgKi8KKyAgICAgICAgLy9yMSA9IChyMD4+OCkmMHhGRjAwRkY7ICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgLy9yMCAmPSAweEZGMDBGRjsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IGEgdGltZSAqLworICAgICAgICByMCA9IHBfcmVmWzBdOworICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICByMCB8PSAocjEgPDwgMTYpOyAgICAgICAgICAgLyogMCxjLDAsYSAqLworICAgICAgICByMSA9IHBfcmVmWzFdOworICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICByMSB8PSAocjIgPDwgMTYpOyAgICAgICAgICAgLyogMCxkLDAsYiAqLworCisgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICB7CisgICAgICAgICAgICAvL3IyID0gKigodWludDMyKikocF9yZWYrPTQpKTsvKiBoLGcsZixlICovCisgICAgICAgICAgICAvL3IzID0gKHIyPj44KSYweEZGMDBGRjsgIC8qIDAsaCwwLGYgKi8KKyAgICAgICAgICAgIC8vcjIgJj0gMHhGRjAwRkY7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgYSB0aW1lICovCisgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7CisgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjIgfD0gKHIzIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KKyAgICAgICAgICAgIHIzID0gcF9yZWZbMV07CisgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjMgfD0gKHI0IDw8IDE2KTsgICAgICAgICAgIC8qIDAsaCwwLGYgKi8KKworICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLworICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICByNiA9IHIyICsgcjM7ICAgLyogZytoLCBlK2YgKi8KKyAgICAgICAgICAgIHI1ID4+PSAxNjsKKyAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgIHI0ICs9IHI1ICogMjA7ICAgICAgLyogYysyMCplKzIwKmYraCwgYSsyMCpjKzIwKmQrZiAqLworICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCisgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICByNCAtPSByNSAqIDU7ICAgICAgIC8qIGMtNSpkKzIwKmUrMjAqZi01KmcraCwgYS01KmIrMjAqYysyMCpkLTUqZStmICovCisgICAgICAgICAgICByNCA+Pj0gNTsKKyAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgcjQgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KKworICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KKyAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKKyAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KKyAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLworICAgICAgICAgICAgcjEgPj49IDE2OworICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCisgICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCisgICAgICAgICAgICByMCA+Pj0gMTY7CisgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KKyAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLworICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KKyAgICAgICAgICAgIHI1ID4+PSA1OworICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisgICAgICAgICAgICByNSAmPSAweEZGMDBGRjsgLyogbWFzayAqLworCisgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLworICAgICAgICAgICAgKnBfdG1wKysgPSByNDsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICByMCA9IHIyOworICAgICAgICB9CisgICAgICAgIHBfdG1wICs9ICgoMjQgLSBibGt3aWR0aCkgPj4gMik7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisKKyAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLworICAgICAgICAgICAgcF90bXAgLT0gNjsgLyogaW50ZXJtZWRpYXRlIG91dHB1dCAqLworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgMjQpOworCisgICAgICAgICAgICAgICAgKnBfdG1wKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX3RtcCArPSAoKDI0IC0gYmxrd2lkdGgpID4+IDIpOyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCisgICAgaWYgKCgodWludDMyKWluMikmMHgzKQorICAgIHsKKyAgICAgICAgZUNyZWF0ZUFsaWduKGluMiwgaW5waXRjaCwgLTIsICZ0bXBfaW5bMF1bMF0sIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKKyAgICAgICAgaW4yID0gJnRtcF9pblsyXVswXTsKKyAgICAgICAgaW5waXRjaCA9IDI0OworICAgIH0KKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSB1cCBhbmQgb25lIHBpeGVsIHJpZ2h0ICovCisgICAgcGtyZXMgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiByZXVzZSBpdCBmb3IgbGltaXQgKi8KKworICAgIGN1cnJfb2Zmc2V0ICs9IDM7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4yICs9IDQpCisgICAgeworICAgICAgICByMTMgPSAwOworICAgICAgICBwX3JlZiA9IGluMjsKKyAgICAgICAgcF90bXA4ID0gJih0bXBfcmVzWzBdW2pdKTsgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICBwX3RtcDggLT0gMjQ7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHBrcmVzKTsgLyogbGltaXQgKi8KKyAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgMSBieXRlIGF0IGEgdGltZSBpcyB0b28gc2xvdywgdG9vIG1hbnkgcmVhZCBhbmQgcGFjayBvcHMsIG5lZWQgdG8gY2FsbCBDcmVhdGVBbGlnbiAqLworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi0oaW5waXRjaDw8MSk7ICAgICAgICAgIHIwID0gcF9yZWY4WzBdOyAgICAgICAgIHIxID0gcF9yZWY4WzJdOworICAgICAgICAgICAgcjAgfD0gKHIxPDwxNik7ICAgICAgICAgcjYgPSBwX3JlZjhbMV07ICAgICAgICAgcjEgPSBwX3JlZjhbM107CisgICAgICAgICAgICByNiB8PSAocjE8PDE2KTsgICAgICAgICBwX3JlZis9aW5waXRjaDsgKi8KKyAgICAgICAgICAgIHIwID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IGlucGl0Y2g7CisgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICByMCAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZisoaW5waXRjaDw8MSk7CisgICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsgICAgICAgICByMSB8PSAocjc8PDE2KTsKKyAgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOyAgICAgICAgIHIyID0gcF9yZWY4WzNdOyAgICAgICAgIHI3IHw9IChyMjw8MTYpOyovCisgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgcjYgKz0gcjc7CisKKyAgICAgICAgICAgIC8qcjIgPSBwX3JlZlswXTsgICAgICAgICAgICByOCA9IHBfcmVmWzJdOyAgICAgICAgICByMiB8PSAocjg8PDE2KTsKKyAgICAgICAgICAgIHI4ID0gcF9yZWZbMV07ICAgICAgICAgIHIxID0gcF9yZWZbM107ICAgICAgICAgIHI4IHw9IChyMTw8MTYpOyovCisgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopcF9yZWYpOyAvKiByMiwgcjgsIHJlZlsxXSAqLworICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmLWlucGl0Y2g7ICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIxIHw9IChyNzw8MTYpOyAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgcjcgPSBwX3JlZjhbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLworICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgcjAgKz0gMjAgKiByMTsKKyAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICByMCArPSAweDEwMDAxMDsKKyAgICAgICAgICAgIHI2ICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmLShpbnBpdGNoPDwxKTsgICAgICAgICAgcjIgPSBwX3JlZjhbMF07ICAgICAgICAgcjggPSBwX3JlZjhbMl07CisgICAgICAgICAgICByMiB8PSAocjg8PDE2KTsgICAgICAgICByOCA9IHBfcmVmOFsxXTsgICAgICAgICByMSA9IHBfcmVmOFszXTsgICAgICAgICByOCB8PSAocjE8PDE2KTsqLworICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIHIyLCByOCwgcmVmWy0xXSAqLworICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmK2lucGl0Y2g7ICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIxIHw9IChyNzw8MTYpOyAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgcjcgPSBwX3JlZjhbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLworICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMl0gKi8KKyAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgcjYgLT0gNSAqIHI3OworCisgICAgICAgICAgICByMCA+Pj0gNTsKKyAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgcjEzIHw9IHI2OworICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgLy9DTElQUEFDSyhyNixyZXN1bHQpCisgICAgICAgICAgICAvKiBhZGQgd2l0aCBob3Jpem9udGFsIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIHIxMCA9ICooKHVpbnQzMiopKHBfdG1wOCArPSAyNCkpOworICAgICAgICAgICAgcjkgPSAocjEwID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMTAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIHIwICs9IHIxMDsKKyAgICAgICAgICAgIHIwICs9IDB4MTAwMDE7CisgICAgICAgICAgICByMCA9IChyMCA+PiAxKSAmIDB4RkYwMEZGOyAgIC8qIG1hc2sgdG8gOCBieXRlcyAqLworCisgICAgICAgICAgICByNiArPSByOTsKKyAgICAgICAgICAgIHI2ICs9IDB4MTAwMDE7CisgICAgICAgICAgICByNiA9IChyNiA+PiAxKSAmIDB4RkYwMEZGOyAgIC8qIG1hc2sgdG8gOCBieXRlcyAqLworCisgICAgICAgICAgICByMCB8PSAocjYgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKyAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKKyAgICAgICAgfQorICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBuZXh0IHBpeGVsICovCisgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IDQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfcmVmID0gaW4yICsgaTsKKyAgICAgICAgICAgICAgICBwX3RtcDggPSAmKHRtcF9yZXNbMF1baitpXSk7IC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICBwX3RtcDggLT0gMjQ7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBwa3Jlcyk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9jdXIgKz0gKGN1cnJfb2Zmc2V0IC0gMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKiBwb3NpdGlvbiBHICovCit2b2lkIGVGdWxsUGVsTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgb2Zmc2V0X2luID0gaW5waXRjaCAtIGJsa3dpZHRoOworICAgIGludCBvZmZzZXRfb3V0ID0gb3V0cGl0Y2ggLSBibGt3aWR0aDsKKyAgICB1aW50MzIgdGVtcDsKKyAgICB1aW50OCBieXRlOworCisgICAgaWYgKCgodWludDMyKWluKSYzKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKmluKys7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICAgICAgICAgIGJ5dGUgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHRlbXA7IC8qIHdyaXRlIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgaW4gKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQzMiopaW4pOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHRlbXA7CisgICAgICAgICAgICAgICAgaW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgaW4gKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZVBhZENocm9tYSh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsIGludCBwaWNwaXRjaCwgaW50IHhfcG9zLCBpbnQgeV9wb3MpCit7CisgICAgaW50IHBhZF9oZWlnaHQ7CisgICAgaW50IHBhZF93aWR0aDsKKyAgICB1aW50OCAqc3RhcnQ7CisgICAgdWludDMyIHdvcmQxLCB3b3JkMiwgd29yZDM7CisgICAgaW50IG9mZnNldCwgajsKKworCisgICAgcGFkX2hlaWdodCA9IDggKyAoKHlfcG9zICYgNykgPyAxIDogMCk7CisgICAgcGFkX3dpZHRoID0gOCArICgoeF9wb3MgJiA3KSA/IDEgOiAwKTsKKworICAgIHlfcG9zID4+PSAzOworICAgIHhfcG9zID4+PSAzOworICAgIC8vIHBhZCB2ZXJ0aWNhbCBmaXJzdAorICAgIGlmICh5X3BvcyA8IDApIC8vIG5lZWQgdG8gcGFkIHVwCisgICAgeworICAgICAgICBpZiAoeF9wb3MgPCAtOCkgc3RhcnQgPSByZWYgLSA4OworICAgICAgICBlbHNlIGlmICh4X3BvcyArIHBhZF93aWR0aCA+IHBpY3dpZHRoICsgNykgc3RhcnQgPSByZWYgKyBwaWN3aWR0aCArIDcgLSBwYWRfd2lkdGg7CisgICAgICAgIGVsc2Ugc3RhcnQgPSByZWYgKyB4X3BvczsKKworICAgICAgICAvKiB3b3JkLWFsaWduIHN0YXJ0ICovCisgICAgICAgIG9mZnNldCA9ICh1aW50MzIpc3RhcnQgJiAweDM7CisgICAgICAgIGlmIChvZmZzZXQpIHN0YXJ0IC09IG9mZnNldDsKKworICAgICAgICB3b3JkMSA9ICooKHVpbnQzMiopc3RhcnQpOworICAgICAgICB3b3JkMiA9ICooKHVpbnQzMiopKHN0YXJ0ICsgNCkpOworICAgICAgICB3b3JkMyA9ICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpOworCisgICAgICAgIC8qIHBhZCB1cCBOIHJvd3MgKi8KKyAgICAgICAgaiA9IC15X3BvczsKKyAgICAgICAgaWYgKGogPiA4KSBqID0gODsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgLT0gcGljcGl0Y2gpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA0KSkgPSB3b3JkMjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpID0gd29yZDM7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmICh5X3BvcyArIHBhZF9oZWlnaHQgPj0gcGljaGVpZ2h0KSAvKiBwYWQgZG93biAqLworICAgIHsKKyAgICAgICAgaWYgKHhfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmICsgcGljcGl0Y2ggKiAocGljaGVpZ2h0IC0gMSkgLSA4OworICAgICAgICBlbHNlIGlmICh4X3BvcyArIHBhZF93aWR0aCA+IHBpY3dpZHRoICsgNykgc3RhcnQgPSByZWYgKyBwaWNwaXRjaCAqIChwaWNoZWlnaHQgLSAxKSArCisgICAgICAgICAgICAgICAgICAgIHBpY3dpZHRoICsgNyAtIHBhZF93aWR0aDsKKyAgICAgICAgZWxzZSAgICBzdGFydCA9IHJlZiArIHBpY3BpdGNoICogKHBpY2hlaWdodCAtIDEpICsgeF9wb3M7CisKKyAgICAgICAgLyogd29yZC1hbGlnbiBzdGFydCAqLworICAgICAgICBvZmZzZXQgPSAodWludDMyKXN0YXJ0ICYgMHgzOworICAgICAgICBpZiAob2Zmc2V0KSBzdGFydCAtPSBvZmZzZXQ7CisKKyAgICAgICAgd29yZDEgPSAqKCh1aW50MzIqKXN0YXJ0KTsKKyAgICAgICAgd29yZDIgPSAqKCh1aW50MzIqKShzdGFydCArIDQpKTsKKyAgICAgICAgd29yZDMgPSAqKCh1aW50MzIqKShzdGFydCArIDgpKTsKKworICAgICAgICAvKiBwYWQgZG93biBOIHJvd3MgKi8KKyAgICAgICAgaiA9IHlfcG9zICsgcGFkX2hlaWdodCAtIHBpY2hlaWdodDsKKyAgICAgICAgaWYgKGogPiA4KSBqID0gODsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKz0gcGljcGl0Y2gpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA0KSkgPSB3b3JkMjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpID0gd29yZDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgcGFkIGhvcml6b250YWwgKi8KKyAgICBpZiAoeF9wb3MgPCAwKSAvLyBwYWQgbGVmdAorICAgIHsKKyAgICAgICAgaWYgKHlfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmIC0gKHBpY3BpdGNoIDw8IDMpOworICAgICAgICBlbHNlIGlmICh5X3BvcyArIHBhZF9oZWlnaHQgPiBwaWNoZWlnaHQgKyA3KSBzdGFydCA9IHJlZiArIChwaWNoZWlnaHQgKyA3IC0gcGFkX2hlaWdodCkgKiBwaWNwaXRjaDsKKyAgICAgICAgZWxzZSBzdGFydCA9IHJlZiArIHlfcG9zICogcGljcGl0Y2g7CisKKyAgICAgICAgLy8gbm93IHBhZCBsZWZ0IDggcGl4ZWxzIGZvciBwYWRfaGVpZ2h0IHJvd3MgKi8KKyAgICAgICAgaiA9IHBhZF9oZWlnaHQ7CisgICAgICAgIHN0YXJ0IC09IHBpY3BpdGNoOworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JkMSA9ICooc3RhcnQgKz0gcGljcGl0Y2gpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDgpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDE2KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0IC0gOCkpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCAtIDQpKSA9IHdvcmQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHhfcG9zICsgcGFkX3dpZHRoID49IHBpY3dpZHRoKSAvKiBwYWQgcmlnaHQgKi8KKyAgICB7CisgICAgICAgIGlmICh5X3BvcyA8IC04KSBzdGFydCA9IHJlZiAtIChwaWNwaXRjaCA8PCAzKSArIHBpY3dpZHRoIC0gMTsKKyAgICAgICAgZWxzZSBpZiAoeV9wb3MgKyBwYWRfaGVpZ2h0ID4gcGljaGVpZ2h0ICsgNykgc3RhcnQgPSByZWYgKyAocGljaGVpZ2h0ICsgNyAtIHBhZF9oZWlnaHQpICogcGljcGl0Y2ggKyBwaWN3aWR0aCAtIDE7CisgICAgICAgIGVsc2Ugc3RhcnQgPSByZWYgKyB5X3BvcyAqIHBpY3BpdGNoICsgcGljd2lkdGggLSAxOworCisgICAgICAgIC8vIG5vdyBwYWQgcmlnaHQgOCBwaXhlbHMgZm9yIHBhZF9oZWlnaHQgcm93cyAqLworICAgICAgICBqID0gcGFkX2hlaWdodDsKKyAgICAgICAgc3RhcnQgLT0gcGljcGl0Y2g7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKihzdGFydCArPSBwaWNwaXRjaCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgOCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgMTYpOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyAxKSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgNSkpID0gd29yZDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgZUNocm9tYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwaWNwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBkeCwgZHk7CisgICAgaW50IG9mZnNldF9keCwgb2Zmc2V0X2R5OworICAgIGludCBpbmRleDsKKworICAgIGVQYWRDaHJvbWEocmVmLCBwaWN3aWR0aCwgcGljaGVpZ2h0LCBwaWNwaXRjaCwgeF9wb3MsIHlfcG9zKTsKKworICAgIGR4ID0geF9wb3MgJiA3OworICAgIGR5ID0geV9wb3MgJiA3OworICAgIG9mZnNldF9keCA9IChkeCArIDcpID4+IDM7CisgICAgb2Zmc2V0X2R5ID0gKGR5ICsgNykgPj4gMzsKKyAgICB4X3BvcyA9IHhfcG9zID4+IDM7ICAvKiByb3VuZCBpdCB0byBmdWxsLXBlbCByZXNvbHV0aW9uICovCisgICAgeV9wb3MgPSB5X3BvcyA+PiAzOworCisgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgIGluZGV4ID0gb2Zmc2V0X2R4ICsgKG9mZnNldF9keSA8PCAxKSArICgoYmxrd2lkdGggPDwgMSkgJiAweDcpOworCisgICAgKCooZUNocm9tYU1DX1NJTURbaW5kZXhdKSkocmVmLCBwaWNwaXRjaCAsIGR4LCBkeSwgcHJlZCwgcGljcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOworICAgIHJldHVybiA7Cit9CisKKworLyogU0lNRCByb3V0aW5lcywgdW5yb2xsIHRoZSBsb29wcyBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24sIGRlY3JlYXNpbmcgbG9vcHMgKHRoaW5ncyB0byBiZSBkb25lKSAqLwordm9pZCBlQ2hyb21hRGlhZ29uYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHJlc3VsdDAsIHJlc3VsdDE7CisgICAgdWludDggdGVtcFsyODhdOworICAgIHVpbnQ4ICpyZWYsICpvdXQ7CisgICAgaW50IGksIGo7CisgICAgaW50IGR4XzggPSA4IC0gZHg7CisgICAgaW50IGR5XzggPSA4IC0gZHk7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgb3V0ID0gdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0ICsgMTsgaSsrKQorICAgIHsKKyAgICAgICAgcmVmID0gcFJlZjsKKyAgICAgICAgcjAgPSByZWZbMF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICByMCB8PSAocmVmWzJdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeF84ICogcjA7CisKKyAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MDsKKworICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMTsKKworICAgICAgICAgICAgcjIgPSByZWZbNF07CisgICAgICAgICAgICByMCA9IHIwID4+IDE2OworICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICAqKGludDMyICopKG91dCArIDE2KSA9IHJlc3VsdDA7CisKKyAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICByMCA9IHIyOworICAgICAgICB9CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIG91dCArPSAoMzIgLSBibGt3aWR0aCk7CisgICAgfQorCisvLyAgcFJlZiAtPSBzcmNQaXRjaCooYmxraGVpZ2h0KzEpOworICAgIHJlZiA9IHRlbXA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCkKKyAgICB7CisgICAgICAgIHIwID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgcjEgPSAqKGludDMyICopKHJlZiArIDE2KTsKKyAgICAgICAgcmVmICs9IDMyOworICAgICAgICBvdXQgPSBwT3V0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGJsa2hlaWdodCA+PiAxKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMCA9IHIyOworCisgICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7CisgICAgICAgICAgICByZXN1bHQxID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisgICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOworICAgICAgICAgICAgcmVmICs9IDMyOworCisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMCA9IHIyOworCisgICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7CisgICAgICAgICAgICByZXN1bHQxID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisgICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOworICAgICAgICAgICAgcmVmICs9IDMyOworICAgICAgICB9CisgICAgICAgIHBPdXQgKz0gNDsKKyAgICAgICAgcmVmID0gdGVtcCArIDQ7IC8qIHNpbmNlIGl0IGNhbiBvbmx5IGl0ZXJhdGUgdHdpY2UgbWF4ICovCisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeSk7CisKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByZXN1bHQwLCByZXN1bHQxOworICAgIHVpbnQ4ICpyZWYsICpvdXQ7CisgICAgaW50IGksIGo7CisgICAgaW50IGR4XzggPSA4IC0gZHg7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgcmVmID0gcFJlZjsKKyAgICAgICAgb3V0ID0gcE91dDsKKworICAgICAgICByMCA9IHJlZlswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwIHw9IChyZWZbMl0gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMCArIDB4MDAwNDAwMDQ7CisKKyAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICByZXN1bHQwID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworCisgICAgICAgICAgICByZXN1bHQxID0gZHhfOCAqIHIxICsgMHgwMDA0MDAwNDsKKworICAgICAgICAgICAgcjIgPSByZWZbNF07CisgICAgICAgICAgICByMCA9IHIwID4+IDE2OworICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR4ICogcjE7CisgICAgICAgICAgICByZXN1bHQxID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworCisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgfQorCisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYVZlcnRpY2FsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcmVzdWx0MCwgcmVzdWx0MTsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OCAqcmVmLCAqb3V0OworICAgIGludCBkeV84ID0gOCAtIGR5OworICAgIC8qIHZlcnRpY2FsIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgeworICAgICAgICByZWYgPSBwUmVmOworICAgICAgICBvdXQgPSBwT3V0OworCisgICAgICAgIHIwID0gcmVmWzBdIHwgKHJlZlsyXSA8PCAxNik7CisgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgIHJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDA0MDAwNDsKKyAgICAgICAgICAgIHIyID0gcmVmWzBdIHwgKHJlZlsyXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR5ICogcjI7CisgICAgICAgICAgICByZXN1bHQwID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjAgPSByMjsKKworICAgICAgICAgICAgcmVzdWx0MSA9IGR5XzggKiByMSArIDB4MDAwNDAwMDQ7CisgICAgICAgICAgICByMyA9IHJlZlsxXSB8IChyZWZbM10gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MSArPSBkeSAqIHIzOworICAgICAgICAgICAgcmVzdWx0MSA+Pj0gMzsKKyAgICAgICAgICAgIHJlc3VsdDEgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworICAgICAgICAgICAgcmVmICs9IHNyY1BpdGNoOworICAgICAgICAgICAgb3V0ICs9IHByZWRQaXRjaDsKKyAgICAgICAgfQorICAgICAgICBwT3V0ICs9IDQ7CisgICAgICAgIHBSZWYgKz0gNDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFEaWFnb25hbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoYmxrd2lkdGgpOworCisgICAgaW50MzIgcjAsIHIxLCB0ZW1wMCwgdGVtcDEsIHJlc3VsdDsKKyAgICBpbnQzMiB0ZW1wWzldOworICAgIGludDMyICpvdXQ7CisgICAgaW50IGksIHJfdGVtcDsKKyAgICBpbnQgZHlfOCA9IDggLSBkeTsKKworICAgIC8qIGhvcml6b250YWwgZmlyc3QgKi8KKyAgICBvdXQgPSB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQgKyAxOyBpKyspCisgICAgeworICAgICAgICByX3RlbXAgPSBwUmVmWzFdOworICAgICAgICB0ZW1wMCA9IChwUmVmWzBdIDw8IDMpICsgZHggKiAocl90ZW1wIC0gcFJlZlswXSk7CisgICAgICAgIHRlbXAxID0gKHJfdGVtcCA8PCAzKSArIGR4ICogKHBSZWZbMl0gLSByX3RlbXApOworICAgICAgICByMCA9IHRlbXAwIHwgKHRlbXAxIDw8IDE2KTsKKyAgICAgICAgKm91dCsrID0gcjA7CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgfQorCisgICAgcFJlZiAtPSBzcmNQaXRjaCAqIChibGtoZWlnaHQgKyAxKTsKKworICAgIG91dCA9IHRlbXA7CisKKyAgICByMCA9ICpvdXQrKzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGR5XzggKiByMCArIDB4MDAyMDAwMjA7CisgICAgICAgIHIxID0gKm91dCsrOworICAgICAgICByZXN1bHQgKz0gZHkgKiByMTsKKyAgICAgICAgcmVzdWx0ID4+PSA2OworICAgICAgICByZXN1bHQgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgKihpbnQxNiAqKXBPdXQgPSAocmVzdWx0ID4+IDgpIHwgKHJlc3VsdCAmIDB4RkYpOworICAgICAgICByMCA9IHIxOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHkpOworICAgICh2b2lkKShibGt3aWR0aCk7CisKKyAgICBpbnQgaSwgdGVtcCwgdGVtcDAsIHRlbXAxOworCisgICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSBwUmVmWzFdOworICAgICAgICB0ZW1wMCA9ICgocFJlZlswXSA8PCAzKSArIGR4ICogKHRlbXAgLSBwUmVmWzBdKSArIDQpID4+IDM7CisgICAgICAgIHRlbXAxID0gKCh0ZW1wIDw8IDMpICsgZHggKiAocFJlZlsyXSAtIHRlbXApICsgNCkgPj4gMzsKKworICAgICAgICAqKGludDE2ICopcE91dCA9IHRlbXAwIHwgKHRlbXAxIDw8IDgpOworICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKworICAgIH0KKyAgICByZXR1cm47Cit9Cit2b2lkIGVDaHJvbWFWZXJ0aWNhbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisgICAgKHZvaWQpKGJsa3dpZHRoKTsKKworICAgIGludDMyIHIwLCByMSwgcmVzdWx0OworICAgIGludCBpOworICAgIGludCBkeV84ID0gOCAtIGR5OworICAgIHIwID0gcFJlZlswXSB8IChwUmVmWzFdIDw8IDE2KTsKKyAgICBwUmVmICs9IHNyY1BpdGNoOworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGR5XzggKiByMCArIDB4MDAwNDAwMDQ7CisgICAgICAgIHIxID0gcFJlZlswXSB8IChwUmVmWzFdIDw8IDE2KTsKKyAgICAgICAgcmVzdWx0ICs9IGR5ICogcjE7CisgICAgICAgIHJlc3VsdCA+Pj0gMzsKKyAgICAgICAgcmVzdWx0ICY9IDB4MDBGRjAwRkY7CisgICAgICAgICooaW50MTYgKilwT3V0ID0gKHJlc3VsdCA+PiA4KSB8IChyZXN1bHQgJiAweEZGKTsKKyAgICAgICAgcjAgPSByMTsKKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hRnVsbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisgICAgKHZvaWQpKGR5KTsKKworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXRfaW4gPSBzcmNQaXRjaCAtIGJsa3dpZHRoOworICAgIGludCBvZmZzZXRfb3V0ID0gcHJlZFBpdGNoIC0gYmxrd2lkdGg7CisgICAgdWludDE2IHRlbXA7CisgICAgdWludDggYnl0ZTsKKworICAgIGlmICgoKHVpbnQzMilwUmVmKSYxKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKnBSZWYrKzsKKyAgICAgICAgICAgICAgICBieXRlID0gKnBSZWYrKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDgpOworICAgICAgICAgICAgICAgICooKHVpbnQxNiopcE91dCkgPSB0ZW1wOyAvKiB3cml0ZSAyIGJ5dGVzICovCisgICAgICAgICAgICAgICAgcE91dCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgcFJlZiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigodWludDE2KilwUmVmKTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTYqKXBPdXQpID0gdGVtcDsKKyAgICAgICAgICAgICAgICBwUmVmICs9IDI7CisgICAgICAgICAgICAgICAgcE91dCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgcFJlZiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUwZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCkBAIC0wLDAgKzEsMTc3NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKyNkZWZpbmUgTUlOX0dPUCAgICAgMSAgIC8qIG1pbmltdW0gc2l6ZSBvZiBHT1AsIDEvMjMvMDEsIG5lZWQgdG8gYmUgdGVzdGVkICovCisKKyNkZWZpbmUgREVGQVVMVF9SRUZfSURYICAgICAwICAvKiBhbHdheXMgZnJvbSB0aGUgZmlyc3QgZnJhbWUgaW4gdGhlIHJlZmxpc3QgKi8KKworI2RlZmluZSBBTExfQ0FORF9FUVVBTCAgMTAgIC8qICBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiA1IHdpbGwgd29yayAqLworCisKKy8qIGZyb20gVE1OIDMuMiAqLworI2RlZmluZSBQUkVGX05VTExfVkVDIDEyOSAgIC8qIHplcm8gdmVjdG9yIGJpYXMgKi8KKyNkZWZpbmUgUFJFRl8xNl9WRUMgMTI5ICAgICAvKiAxTVYgYmlhcyB2ZXJzdXMgNE1WcyovCisjZGVmaW5lIFBSRUZfSU5UUkEgIDMwMjQvLzUxMiAgICAgICAvKiBiaWFzIGZvciBJTlRSQSBjb2RpbmcgKi8KKworY29uc3Qgc3RhdGljIGludCB0YWJfZXhjbHVkZVs5XVs5XSA9ICAvLyBbbGFzdF9sb2NdW2N1cnJfbG9jXQoreworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDF9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMX0sCisgICAgezAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDF9LAorICAgIHswLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxfSwKKyAgICB7MCwgMCwgMSwgMSwgMSwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDB9Cit9OyAvL3RvIGRlY2lkZSB3aGV0aGVyIHRvIGNvbnRpbnVlIG9yIGNvbXB1dGUKKworY29uc3Qgc3RhdGljIGludCByZWZpbmVfbmV4dFs4XVsyXSA9ICAgIC8qIFtjdXJyX2tdW2luY3JlbWVudF0gKi8KK3sKKyAgICB7MCwgMH0sIHsyLCAwfSwgezEsIDF9LCB7MCwgMn0sIHsgLTEsIDF9LCB7IC0yLCAwfSwgeyAtMSwgLTF9LCB7MCwgLTJ9Cit9OworCisjaWZkZWYgX1NBRF9TVEFUCit1aW50MzIgbnVtX01CID0gMDsKK3VpbnQzMiBudW1fY2FuZCA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVEhfSU5URVJfMiAgMTAwICAvKiB0ZW1wb3JhcnkgZm9yIG5vdyAqLworCisvLyNkZWZpbmUgRklYRURfSU5URVJQUkVEX01PREUgIEFWQ19QMTYKKyNkZWZpbmUgRklYRURfUkVGX0lEWCAgIDAKKyNkZWZpbmUgRklYRURfTVZYIDAKKyNkZWZpbmUgRklYRURfTVZZIDAKKworLy8gb25seSB1c2Ugd2hlbiBBVkNfUDggb3IgQVZDX1A4cmVmMAorI2RlZmluZSBGSVhFRF9TVUJNQl9NT0RFICAgIEFWQ180eDQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbml0aWFsaXplIGFycmF5cyBuZWNlc3NhcnkgZm9yIG1vdGlvbiBzZWFyY2ggKi8KK0FWQ0VuY19TdGF0dXMgSW5pdE1vdGlvblNlYXJjaE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIGludCBzZWFyY2hfcmFuZ2UgPSByYXRlQ3RybC0+bXZSYW5nZTsKKyAgICBpbnQgbnVtYmVyX29mX3N1YnBlbF9wb3NpdGlvbnMgPSA0ICogKDIgKiBzZWFyY2hfcmFuZ2UgKyAzKTsKKyAgICBpbnQgbWF4X212X2JpdHMsIG1heF9tdmQ7CisgICAgaW50IHRlbXBfYml0cyA9IDA7CisgICAgdWludDggKm12Yml0czsKKyAgICBpbnQgYml0cywgaW1heCwgaW1pbiwgaTsKKyAgICB1aW50OCogc3VicGVsX3ByZWQgPSAodWludDgqKSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvLyBhbGwgMTYgc3ViLXBlbCBwb3NpdGlvbnMKKworCisgICAgd2hpbGUgKG51bWJlcl9vZl9zdWJwZWxfcG9zaXRpb25zID4gMCkKKyAgICB7CisgICAgICAgIHRlbXBfYml0cysrOworICAgICAgICBudW1iZXJfb2Zfc3VicGVsX3Bvc2l0aW9ucyA+Pj0gMTsKKyAgICB9CisKKyAgICBtYXhfbXZfYml0cyA9IDMgKyAyICogdGVtcF9iaXRzOworICAgIG1heF9tdmQgID0gKDEgPDwgKG1heF9tdl9iaXRzID4+IDEpKSAtIDE7CisKKyAgICBlbmN2aWQtPm12Yml0c19hcnJheSA9ICh1aW50OCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OCkgKiAoMiAqIG1heF9tdmQgKyAxKSwgREVGQVVMVF9BVFRSKTsKKworICAgIGlmIChlbmN2aWQtPm12Yml0c19hcnJheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBtdmJpdHMgPSBlbmN2aWQtPm12Yml0cyAgPSBlbmN2aWQtPm12Yml0c19hcnJheSArIG1heF9tdmQ7CisKKyAgICBtdmJpdHNbMF0gPSAxOworICAgIGZvciAoYml0cyA9IDM7IGJpdHMgPD0gbWF4X212X2JpdHM7IGJpdHMgKz0gMikKKyAgICB7CisgICAgICAgIGltYXggPSAxICAgIDw8IChiaXRzID4+IDEpOworICAgICAgICBpbWluID0gaW1heCA+PiAxOworCisgICAgICAgIGZvciAoaSA9IGltaW47IGkgPCBpbWF4OyBpKyspICAgbXZiaXRzWy1pXSA9IG12Yml0c1tpXSA9IGJpdHM7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBoYWxmLXBlbCBzZWFyY2ggKi8KKyAgICBlbmN2aWQtPmhwZWxfY2FuZFswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMSA7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbM10gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzRdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs1XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbNl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzddID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs4XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworCisgICAgLyogRm9yIHF1YXJ0ZXItcGVsIGludGVycG9sYXRpb24gYXJvdW5kIGJlc3QgaGFsZi1wZWwgcmVzdWx0ICovCisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bMF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzBdWzJdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bM10gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVswXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVsxXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVsxXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMl1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzJdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzBdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVszXVsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbM11bMl0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzNdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNF1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzRdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVswXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzFdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzZdWzFdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNl1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMl0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs3XVszXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAyNTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiBDbGVhbi11cCBtZW1vcnkgKi8KK3ZvaWQgQ2xlYW5Nb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisKKyAgICBpZiAoZW5jdmlkLT5tdmJpdHNfYXJyYXkpCisgICAgeworICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludCkoZW5jdmlkLT5tdmJpdHNfYXJyYXkpKTsKKyAgICAgICAgZW5jdmlkLT5tdmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworYm9vbCBJbnRyYURlY2lzaW9uQUJFKGludCAqbWluX2Nvc3QsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCwgYm9vbCBhdmUpCit7CisgICAgaW50IGo7CisgICAgdWludDggKm91dDsKKyAgICBpbnQgdGVtcCwgU0JFOworICAgIE9zY2xGbG9hdCBBQkU7CisgICAgYm9vbCBpbnRyYSA9IHRydWU7CisKKyAgICBTQkUgPSAwOworICAgIC8qIHRvcCBuZWlnaGJvciAqLworICAgIG91dCA9IGN1ciAtIHBpdGNoOworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgdGVtcCA9IG91dFtqXSAtIGN1cltqXTsKKyAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgfQorCisgICAgLyogbGVmdCBuZWlnaGJvciAqLworICAgIG91dCA9IGN1ciAtIDE7CisgICAgb3V0IC09IHBpdGNoOworICAgIGN1ciAtPSBwaXRjaDsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKG91dCArPSBwaXRjaCkgLSAqKGN1ciArPSBwaXRjaCk7CisgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgIH0KKworICAgIC8qIGNvbXBhcmUgbWluY29zdC8zODQgYW5kIFNCRS82NCAqLworICAgIEFCRSA9IFNCRSAvIDMyLjA7IC8vQUJFID0gU0JFLzY0LjA7IC8vCisgICAgaWYgKEFCRSA+PSAqbWluX2Nvc3QgLyAyNTYuMCkgLy9pZiggQUJFKjAuOCA+PSBtaW5fY29zdC8zODQuMCkgLy8KKyAgICB7CisgICAgICAgIGludHJhID0gZmFsc2U7IC8vIG5vIHBvc3NpYmlsaXR5IG9mIGludHJhLCBqdXN0IHVzZSBpbnRlcgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoYXZlID09IHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9ICgqbWluX2Nvc3QgKyAoaW50KShTQkUgKiA4KSkgPj4gMTsgLy8gcG9zc2liaWxpdHkgb2YgaW50cmEsIGF2ZXJhZ2luZyB0aGUgY29zdAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gKGludCkoU0JFICogOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW50cmE7Cit9CisKKy8qKioqKioqIG1haW4gZnVuY3Rpb24gZm9yIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBmb3IgdGhlIGVudGlyZSBmcmFtZSAqKiovCisvKiBpZiB0dXJucyBvdXQgdG8gYmUgSURSIGZyYW1lLCBzZXQgdmlkZW8tPm5hbF91bml0X3R5cGUgdG8gQVZDX05BTFRZUEVfSURSICovCit2b2lkIEFWQ01vdGlvbkVzdGltYXRpb24oQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDUGljdHVyZURhdGEgKnJlZlBpYyA9IHZpZGVvLT5SZWZQaWNMaXN0MFswXTsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgbWJ3aWR0aCA9IHZpZGVvLT5QaWNXaWR0aEluTWJzOworICAgIGludCBtYmhlaWdodCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1iczsKKyAgICBpbnQgdG90YWxNQiA9IHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgaW50IHBpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOworICAgIEFWQ01WICptb3RfbWJfMTZ4MTYsICptb3QxNngxNiA9IGVuY3ZpZC0+bW90MTZ4MTY7CisgICAgLy8gQVZDTVYgKm1vdF9tYl8xNng4LCAqbW90X21iXzh4MTYsICptb3RfbWJfOHg4LCBldGM7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICB1aW50OCAqaW50cmFTZWFyY2ggPSBlbmN2aWQtPmludHJhU2VhcmNoOworICAgIHVpbnQgRlNfZW4gPSBlbmN2aWQtPmZ1bGxzZWFyY2hfZW5hYmxlOworCisgICAgaW50IE51bUludHJhU2VhcmNoLCBzdGFydF9pLCBudW1Mb29wLCBpbmNyX2k7CisgICAgaW50IG1ibnVtLCBvZmZzZXQ7CisgICAgdWludDggKmN1ciwgKmJlc3RfY2FuZFs1XTsKKyAgICBpbnQgdG90YWxTQUQgPSAwOyAgIC8qIGF2ZXJhZ2UgU0FEIGZvciByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgdHlwZV9wcmVkOworICAgIGludCBhYmVfY29zdDsKKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLyAgLyogMi8yOC8wMSAqLworICAgIGludCBjb2xsZWN0ID0gMDsKKyAgICBIVEZNX1N0YXQgaHRmbV9zdGF0OworICAgIGRvdWJsZSBuZXd2YXJbMTZdOworICAgIGRvdWJsZSBleHBfbGFtZGFbMTVdOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKyAgICBpbnQgaHBfZ3Vlc3MgPSAwOworICAgIHVpbnQzMiBtdl91aW50MzI7CisKKyAgICBvZmZzZXQgPSAwOworCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICAvKiBjYW5ub3QgZG8gSTE2IHByZWRpY3Rpb24gaGVyZSBiZWNhdXNlIGl0IG5lZWRzIGZ1bGwgZGVjb2RpbmcuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbE1COyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbaV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChpbnRyYVNlYXJjaCwgMSwgc2l6ZW9mKHVpbnQ4KSp0b3RhbE1CKTsKKworICAgICAgICBlbmN2aWQtPmZpcnN0SW50cmFSZWZyZXNoTUJJbmR4ID0gMDsgLyogcmVzZXQgdGhpcyAqLworCisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UgICAvLyBQX1NMSUNFCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxNQjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtYmxvY2tbaV0ubWJfaW50cmEgPSAwOworICAgICAgICB9CisgICAgICAgIG1lbXNldChpbnRyYVNlYXJjaCwgMSwgc2l6ZW9mKHVpbnQ4KSp0b3RhbE1CKTsKKyAgICB9CisKKyAgICBpZiAocmVmUGljLT5wYWRkZWQgPT0gMCkKKyAgICB7CisgICAgICAgIEFWQ1BhZGRpbmdFZGdlKHJlZlBpYyk7CisgICAgICAgIHJlZlBpYy0+cGFkZGVkID0gMTsKKyAgICB9CisgICAgLyogUmFuZG9tIElOVFJBIHVwZGF0ZSAqLworICAgIGlmIChyYXRlQ3RybC0+aW50cmFNQlJhdGUpCisgICAgeworICAgICAgICBBVkNSYXN0ZXJJbnRyYVVwZGF0ZShlbmN2aWQsIG1ibG9jaywgdG90YWxNQiwgcmF0ZUN0cmwtPmludHJhTUJSYXRlKTsKKyAgICB9CisKKyAgICBlbmN2aWQtPnNhZF9leHRyYV9pbmZvID0gTlVMTDsKKyNpZmRlZiBIVEZNCisgICAgLyoqKioqIEhZUE9USEVTSVMgVEVTVElORyAqKioqKioqKi8KKyAgICBJbml0SFRGTSh2aWRlbywgJmh0Zm1fc3RhdCwgbmV3dmFyLCAmY29sbGVjdCk7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorCisgICAgaWYgKChyYXRlQ3RybC0+c2NkRW5hYmxlID09IDEpCisgICAgICAgICAgICAmJiAoKHJhdGVDdHJsLT5mcmFtZV9yYXRlIDwgNS4wKSB8fCAodmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0gPiBNSU5fR09QKSkpCisgICAgICAgIC8qIGRvIG5vdCB0cnkgdG8gZGV0ZWN0IGEgbmV3IHNjZW5lIGlmIGxvdyBmcmFtZSByYXRlIGFuZCB0b28gY2xvc2UgdG8gcHJldmlvdXMgSS1mcmFtZSAqLworICAgIHsKKyAgICAgICAgaW5jcl9pID0gMjsKKyAgICAgICAgbnVtTG9vcCA9IDI7CisgICAgICAgIHN0YXJ0X2kgPSAxOworICAgICAgICB0eXBlX3ByZWQgPSAwOyAvKiBmb3IgaW5pdGlhbCBjYW5kaWRhdGUgc2VsZWN0aW9uICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluY3JfaSA9IDE7CisgICAgICAgIG51bUxvb3AgPSAxOworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgdHlwZV9wcmVkID0gMjsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBwYXNzLCBsb29wIHRocnUgaGFsZiB0aGUgbWFjcm9ibG9jayAqLworICAgIC8qIGRldGVybWluZSBzY2VuZSBjaGFuZ2UgKi8KKyAgICAvKiBTZWNvbmQgcGFzcywgZm9yIHRoZSByZXN0IG9mIG1hY3JvYmxvY2tzICovCisgICAgTnVtSW50cmFTZWFyY2ggPSAwOyAvLyB0byBiZSBpbnRyYSBzZWFyY2hlZCBpbiB0aGUgZW5jb2RpbmcgbG9vcC4KKyAgICB3aGlsZSAobnVtTG9vcC0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iaGVpZ2h0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmNyX2kgPiAxKQorICAgICAgICAgICAgICAgIHN0YXJ0X2kgPSAoc3RhcnRfaSA9PSAwID8gMSA6IDApIDsgLyogdG9nZ2xlIDAgYW5kIDEgKi8KKworICAgICAgICAgICAgb2Zmc2V0ID0gcGl0Y2ggKiAoaiA8PCA0KSArIChzdGFydF9pIDw8IDQpOworCisgICAgICAgICAgICBtYm51bSA9IGogKiBtYndpZHRoICsgc3RhcnRfaTsKKworICAgICAgICAgICAgZm9yIChpID0gc3RhcnRfaTsgaSA8IG1id2lkdGg7IGkgKz0gaW5jcl9pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYk51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyTUIgPSBjdXJyTUIgPSBtYmxvY2sgKyBtYm51bTsKKyAgICAgICAgICAgICAgICBtb3RfbWJfMTZ4MTYgPSBtb3QxNngxNiArIG1ibnVtOworCisgICAgICAgICAgICAgICAgY3VyID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm1iX2ludHJhID09IDApIC8qIGZvciBJTlRFUiBtb2RlICovCisgICAgICAgICAgICAgICAgeworI2lmIGRlZmluZWQoSFRGTSkKKyAgICAgICAgICAgICAgICAgICAgSFRGTVByZXBhcmVDdXJNQl9BVkMoZW5jdmlkLCAmaHRmbV9zdGF0LCBjdXIsIHBpdGNoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEFWQ1ByZXBhcmVDdXJNQihlbmN2aWQsIGN1ciwgcGl0Y2gpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKiBmdWxsLXBlbCAxTVYgc2VhcmNoICoqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAgICAgQVZDTUJNb3Rpb25TZWFyY2goZW5jdmlkLCBjdXIsIGJlc3RfY2FuZCwgaSA8PCA0LCBqIDw8IDQsIHR5cGVfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfZW4sICZocF9ndWVzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgYWJlX2Nvc3QgPSBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXSA9IG1vdF9tYl8xNngxNi0+c2FkOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBtYk1vZGUgYW5kIE1WcyAqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19QMTY7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gPSBBVkNfUHJlZF9MMDsKKyAgICAgICAgICAgICAgICAgICAgbXZfdWludDMyID0gKChtb3RfbWJfMTZ4MTYtPnkpIDw8IDE2KSB8ICgobW90X21iXzE2eDE2LT54KSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzMjsgayArPSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm12TDBbaz4+MV0gPSBtdl91aW50MzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgZGVjaXNpb24gd2hldGhlciBpdCBzaG91bGQgYmUgdGVzdGVkIGZvciBpbnRyYSBvciBub3QgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbWJ3aWR0aCAtIDEgJiYgaiAhPSBtYmhlaWdodCAtIDEgJiYgaSAhPSAwICYmIGogIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlID09IEludHJhRGVjaXNpb25BQkUoJmFiZV9jb3N0LCBjdXIsIHBpdGNoLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYVNlYXJjaFttYm51bV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUludHJhU2VhcmNoKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gYWJlX2Nvc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyBib3VuZGFyeSBNQnMsIGFsd2F5cyBkbyBpbnRyYSBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50cmFTZWFyY2grKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IChpbnQpIHJhdGVDdHJsLT5NQURvZk1CW21ibnVtXTsvL21vdF9tYl8xNngxNi0+c2FkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIElOVFJBIHVwZGF0ZSwgdXNlIGZvciBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtb3RfbWJfMTZ4MTZbMF0ueCA9IG1vdF9tYl8xNngxNlswXS55ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBhbGwgb3RoZXIgTVZzIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogbW90X21iXzE2eDgsIG1vdF9tYl84eDE2LCBtb3RfbWJfOHg4LCBldGMuICovCisgICAgICAgICAgICAgICAgICAgIGFiZV9jb3N0ID0gZW5jdmlkLT5taW5fY29zdFttYm51bV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBtYndpZHRoIC0gMSAmJiBqICE9IG1iaGVpZ2h0IC0gMSAmJiBpICE9IDAgJiYgaiAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRyYURlY2lzaW9uQUJFKCZhYmVfY29zdCwgY3VyLCBwaXRjaCwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBhYmVfY29zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IGFiZV9jb3N0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTnVtSW50cmFTZWFyY2grKyA7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbm5vdCBkbyBJMTYgcHJlZGljdGlvbiBoZXJlIGJlY2F1c2UgaXQgbmVlZHMgZnVsbCBkZWNvZGluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgLy8gaW50cmFTZWFyY2hbbWJudW1dID0gMTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1ibnVtICs9IGluY3JfaTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKGluY3JfaSA8PCA0KTsKKworICAgICAgICAgICAgfSAvKiBmb3IgaSAqLworICAgICAgICB9IC8qIGZvciBqICovCisKKyAgICAgICAgLyogc2luY2Ugd2UgY2Fubm90IGRvIGludHJhL2ludGVyIGRlY2lzaW9uIGhlcmUsIHRoZSBTQ0QgaGFzIHRvIGJlCisgICAgICAgIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhIHN1Y2ggYXMgbW90aW9uIHZlY3RvcnMgY29oZXJlbmN5IG9yIHRoZSBTQUQgKi8KKyAgICAgICAgaWYgKGluY3JfaSA+IDEgJiYgbnVtTG9vcCkgLyogc2NlbmUgY2hhbmdlIG9uIGFuZCBmaXJzdCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYoTnVtSW50cmFTZWFyY2ggPiAoKHRvdGFsTUI+PjMpPDwxKSArICh0b3RhbE1CPj4zKSkgLyogNzUlIG9mIDUwJU1CcyAqLworICAgICAgICAgICAgaWYgKE51bUludHJhU2VhcmNoKjk5ID4gKDQ4KnRvdGFsTUIpKSAvKiAyMCUgb2YgNTAlTUJzICovCisgICAgICAgICAgICAgICAgLyogbmVlZCB0byBkbyBtb3JlIGludmVzdGlnYXRpb24gYWJvdXQgdGhpcyB0aHJlc2hvbGQgc2luY2UgdGhlIE51bUludHJhU2VhcmNoCisgICAgICAgICAgICAgICAgb25seSBzaG93IHBvdGVudGlhbCBpbnRyYSBNQnMsIG5vdCB0aGUgYWN0dWFsIG9uZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdlIGNhbiBjaG9vc2UgdG8ganVzdCBlbmNvZGUgSV9TTElDRSB3aXRob3V0IElEUiAqLworICAgICAgICAgICAgICAgIC8vdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9JRFI7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9TTElDRTsKKyAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfSV9BTExfU0xJQ0U7CisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfSV9TTElDRTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoaW50cmFTZWFyY2gsIDEsIHNpemVvZih1aW50OCkqdG90YWxNQik7CisgICAgICAgICAgICAgICAgaSA9IHRvdGFsTUI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1ibG9ja1tpXS5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbaV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+dG90YWxTQUQgPSB0b3RhbFNBRCAqIDI7ICAvKiBTQUQgKi8KKworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqKioqKioqIG5vIHNjZW5lIGNoYW5nZSwgY29udGludWUgbW90aW9uIHNlYXJjaCAqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgdHlwZV9wcmVkKys7IC8qIHNlY29uZCBwYXNzICovCisgICAgfQorCisgICAgcmF0ZUN0cmwtPnRvdGFsU0FEID0gdG90YWxTQUQ7ICAvKiBTQUQgKi8KKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLworICAgIGlmIChjb2xsZWN0KQorICAgIHsKKyAgICAgICAgY29sbGVjdCA9IDA7CisgICAgICAgIFVwZGF0ZUhURk0oZW5jdmlkLCBuZXd2YXIsIGV4cF9sYW1kYSwgJmh0Zm1fc3RhdCk7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgUGFkZGluZ0VkZ2UKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGFkIGVkZ2Ugb2YgYSBWb3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgIEFWQ1BhZGRpbmdFZGdlKEFWQ1BpY3R1cmVEYXRhICpyZWZQaWMpCit7CisgICAgdWludDggKnNyYywgKmRzdDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcGl0Y2gsIHdpZHRoLCBoZWlnaHQ7CisgICAgdWludDMyIHRlbXAxLCB0ZW1wMjsKKworICAgIHdpZHRoID0gcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSByZWZQaWMtPmhlaWdodDsKKyAgICBwaXRjaCA9IHJlZlBpYy0+cGl0Y2g7CisKKyAgICAvKiBwYWQgdG9wICovCisgICAgc3JjID0gcmVmUGljLT5TbDsKKworICAgIHRlbXAxID0gKnNyYzsgLyogdG9wLWxlZnQgY29ybmVyICovCisgICAgdGVtcDIgPSBzcmNbd2lkdGgtMV07IC8qIHRvcC1yaWdodCBjb3JuZXIgKi8KKyAgICB0ZW1wMSB8PSAodGVtcDEgPDwgOCk7CisgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDE2KTsKKyAgICB0ZW1wMiB8PSAodGVtcDIgPDwgOCk7CisgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDE2KTsKKworICAgIGRzdCA9IHNyYyAtIChwaXRjaCA8PCA0KTsKKworICAgICooKHVpbnQzMiopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAqKCh1aW50MzIqKShkc3QgLSAxMikpID0gdGVtcDE7CisgICAgKigodWludDMyKikoZHN0IC0gOCkpID0gdGVtcDE7CisgICAgKigodWludDMyKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgNCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgOCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgMTIpKSA9IHRlbXAyOworCisgICAgZHN0ID0gZHN0IC0gd2lkdGggLSAxNjsKKworICAgIGkgPSAxNTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgbWVtY3B5KGRzdCArIHBpdGNoLCBkc3QsIHBpdGNoKTsKKyAgICAgICAgZHN0ICs9IHBpdGNoOworICAgIH0KKworICAgIC8qIHBhZCBzaWRlcyAqLworICAgIGRzdCArPSAocGl0Y2ggKyAxNik7CisgICAgc3JjID0gZHN0OworICAgIGkgPSBoZWlnaHQ7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRlbXAxID0gKnNyYzsKKyAgICAgICAgdGVtcDIgPSBzcmNbd2lkdGgtMV07CisgICAgICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCA4KTsKKyAgICAgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDE2KTsKKyAgICAgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDgpOworICAgICAgICB0ZW1wMiB8PSAodGVtcDIgPDwgMTYpOworCisgICAgICAgICooKHVpbnQzMiopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gMTIpKSA9IHRlbXAxOworICAgICAgICAqKCh1aW50MzIqKShkc3QgLSA4KSkgPSB0ZW1wMTsKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSB0ZW1wMjsKKyAgICAgICAgKigodWludDMyKikoZHN0ICsgNCkpID0gdGVtcDI7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArIDgpKSA9IHRlbXAyOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKyAxMikpID0gdGVtcDI7CisKKyAgICAgICAgc3JjICs9IHBpdGNoOworICAgICAgICBkc3QgPSBzcmM7CisgICAgfQorCisgICAgLyogcGFkIGJvdHRvbSAqLworICAgIGRzdCAtPSAxNjsKKyAgICBpID0gMTY7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIG1lbWNweShkc3QsIGRzdCAtIHBpdGNoLCBwaXRjaCk7CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisKKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDUmFzdGVySW50cmFVcGRhdGUKKyAgICBEYXRlOiAgICAgICAyLzI2LzAxCisgICAgUHVycG9zZTogICAgVG8gcmFzdGVyLXNjYW4gYXNzaWduIElOVFJBLXVwZGF0ZSAuCisgICAgICAgICAgICAgICAgTiBtYWNyb2Jsb2NrcyBhcmUgdXBkYXRlZCAoYWxzbyB3YXMgcHJvZ3JhbW1hYmxlKS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIEFWQ1Jhc3RlckludHJhVXBkYXRlKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICptYmxvY2ssIGludCB0b3RhbE1CLCBpbnQgbnVtUmVmcmVzaCkKK3sKKyAgICBpbnQgaW5keCwgaTsKKworICAgIGluZHggPSBlbmN2aWQtPmZpcnN0SW50cmFSZWZyZXNoTUJJbmR4OworICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWZyZXNoICYmIGluZHggPCB0b3RhbE1COyBpKyspCisgICAgeworICAgICAgICAobWJsb2NrICsgaW5keCktPm1iX2ludHJhID0gMTsKKyAgICAgICAgZW5jdmlkLT5pbnRyYVNlYXJjaFtpbmR4KytdID0gMTsKKyAgICB9CisKKyAgICAvKiBpZiByZWFkIHRoZSBlbmQgb2YgZnJhbWUsIHJlc2V0IGFuZCBsb29wIGFyb3VuZCAqLworICAgIGlmIChpbmR4ID49IHRvdGFsTUIgLSAxKQorICAgIHsKKyAgICAgICAgaW5keCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbnVtUmVmcmVzaCAmJiBpbmR4IDwgdG90YWxNQikKKyAgICAgICAgeworICAgICAgICAgICAgKG1ibG9jayArIGluZHgpLT5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICBlbmN2aWQtPmludHJhU2VhcmNoW2luZHgrK10gPSAxOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jdmlkLT5maXJzdEludHJhUmVmcmVzaE1CSW5keCA9IGluZHg7IC8qIHVwZGF0ZSB3aXRoIGEgbmV3IHZhbHVlICovCisKKyAgICByZXR1cm4gOworfQorCisKKyNpZmRlZiBIVEZNCit2b2lkIEluaXRIVEZNKFZpZGVvRW5jRGF0YSAqZW5jdmlkLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgZG91YmxlICpuZXd2YXIsIGludCAqY29sbGVjdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IGk7CisgICAgaW50IGx4ID0gdmlkZW8tPmN1cnJQaWMtPndpZHRoOyAvLyBwYWRkaW5nCisgICAgaW50IGx4MiA9IGx4IDw8IDE7CisgICAgaW50IGx4MyA9IGx4MiArIGx4OworICAgIGludCByeCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQgcngyID0gcnggPDwgMTsKKyAgICBpbnQgcngzID0gcngyICsgcng7CisKKyAgICBpbnQgKm9mZnNldCwgKm9mZnNldDI7CisKKyAgICAvKiA0LzExLzAxLCBjb2xsZWN0IGRhdGEgZXZlcnkgMzAgZnJhbWVzLCBkb2Vzbid0IGhhdmUgdG8gYmUgYmFzZSBsYXllciAqLworICAgIGlmICgoKGludCl2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bSkgJSAzMCA9PSAxKQorICAgIHsKKworICAgICAgICAqY29sbGVjdCA9IDE7CisKKyAgICAgICAgaHRmbV9zdGF0LT5jb3VudGJyZWFrID0gMDsKKyAgICAgICAgaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuZXd2YXJbaV0gPSAwLjA7CisgICAgICAgIH0KKy8vICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9QQURESU5HID0gJlNBRF9NQl9QQURESU5HX0hURk1fQ29sbGVjdDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNX0NvbGxlY3Q7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsxXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aDsKKyAgICAgICAgZW5jdmlkLT5zYWRfZXh0cmFfaW5mbyA9ICh2b2lkKikoaHRmbV9zdGF0KTsKKyAgICAgICAgb2Zmc2V0ID0gaHRmbV9zdGF0LT5vZmZzZXRBcnJheTsKKyAgICAgICAgb2Zmc2V0MiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworLy8gICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkdfSFRGTTsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hQX0hURk14aDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJlNBRF9NQl9IUF9IVEZNeWg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSFBfSFRGTXhoeWg7CisgICAgICAgIGVuY3ZpZC0+c2FkX2V4dHJhX2luZm8gPSAodm9pZCopKGVuY3ZpZC0+bnJtbHpfdGgpOworICAgICAgICBvZmZzZXQgPSBlbmN2aWQtPm5ybWx6X3RoICsgMTY7CisgICAgICAgIG9mZnNldDIgPSBlbmN2aWQtPm5ybWx6X3RoICsgMzI7CisgICAgfQorCisgICAgb2Zmc2V0WzBdID0gMDsKKyAgICBvZmZzZXRbMV0gPSBseDIgKyAyOworICAgIG9mZnNldFsyXSA9IDI7CisgICAgb2Zmc2V0WzNdID0gbHgyOworICAgIG9mZnNldFs0XSA9IGx4ICsgMTsKKyAgICBvZmZzZXRbNV0gPSBseDMgKyAzOworICAgIG9mZnNldFs2XSA9IGx4ICsgMzsKKyAgICBvZmZzZXRbN10gPSBseDMgKyAxOworICAgIG9mZnNldFs4XSA9IGx4OworICAgIG9mZnNldFs5XSA9IGx4MyArIDI7CisgICAgb2Zmc2V0WzEwXSA9IGx4MyA7CisgICAgb2Zmc2V0WzExXSA9IGx4ICsgMiA7CisgICAgb2Zmc2V0WzEyXSA9IDE7CisgICAgb2Zmc2V0WzEzXSA9IGx4MiArIDM7CisgICAgb2Zmc2V0WzE0XSA9IGx4MiArIDE7CisgICAgb2Zmc2V0WzE1XSA9IDM7CisKKyAgICBvZmZzZXQyWzBdID0gMDsKKyAgICBvZmZzZXQyWzFdID0gcngyICsgMjsKKyAgICBvZmZzZXQyWzJdID0gMjsKKyAgICBvZmZzZXQyWzNdID0gcngyOworICAgIG9mZnNldDJbNF0gPSByeCArIDE7CisgICAgb2Zmc2V0Mls1XSA9IHJ4MyArIDM7CisgICAgb2Zmc2V0Mls2XSA9IHJ4ICsgMzsKKyAgICBvZmZzZXQyWzddID0gcngzICsgMTsKKyAgICBvZmZzZXQyWzhdID0gcng7CisgICAgb2Zmc2V0Mls5XSA9IHJ4MyArIDI7CisgICAgb2Zmc2V0MlsxMF0gPSByeDMgOworICAgIG9mZnNldDJbMTFdID0gcnggKyAyIDsKKyAgICBvZmZzZXQyWzEyXSA9IDE7CisgICAgb2Zmc2V0MlsxM10gPSByeDIgKyAzOworICAgIG9mZnNldDJbMTRdID0gcngyICsgMTsKKyAgICBvZmZzZXQyWzE1XSA9IDM7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIFVwZGF0ZUhURk0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIGRvdWJsZSAqbmV3dmFyLCBkb3VibGUgKmV4cF9sYW1kYSwgSFRGTV9TdGF0ICpodGZtX3N0YXQpCit7CisgICAgaWYgKGh0Zm1fc3RhdC0+Y291bnRicmVhayA9PSAwKQorICAgICAgICBodGZtX3N0YXQtPmNvdW50YnJlYWsgPSAxOworCisgICAgbmV3dmFyWzBdID0gKGRvdWJsZSkoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpIC8gKGh0Zm1fc3RhdC0+Y291bnRicmVhayAqIDE2Lik7CisKKyAgICBpZiAobmV3dmFyWzBdIDwgMC4wMDEpCisgICAgeworICAgICAgICBuZXd2YXJbMF0gPSAwLjAwMTsgLyogdG8gcHJldmVudCBmbG9hdGluZyBvdmVyZmxvdyAqLworICAgIH0KKyAgICBleHBfbGFtZGFbMF0gPSAgMSAvIChuZXd2YXJbMF0gKiAxLjQxNDIxMzYpOworICAgIGV4cF9sYW1kYVsxXSA9IGV4cF9sYW1kYVswXSAqIDEuNTgyNTsKKyAgICBleHBfbGFtZGFbMl0gPSBleHBfbGFtZGFbMF0gKiAyLjE3NTA7CisgICAgZXhwX2xhbWRhWzNdID0gZXhwX2xhbWRhWzBdICogMy41MDY1OworICAgIGV4cF9sYW1kYVs0XSA9IGV4cF9sYW1kYVswXSAqIDMuMTQzNjsKKyAgICBleHBfbGFtZGFbNV0gPSBleHBfbGFtZGFbMF0gKiAzLjUzMTU7CisgICAgZXhwX2xhbWRhWzZdID0gZXhwX2xhbWRhWzBdICogMy43NDQ5OworICAgIGV4cF9sYW1kYVs3XSA9IGV4cF9sYW1kYVswXSAqIDQuNTg1NDsKKyAgICBleHBfbGFtZGFbOF0gPSBleHBfbGFtZGFbMF0gKiA0LjYxOTE7CisgICAgZXhwX2xhbWRhWzldID0gZXhwX2xhbWRhWzBdICogNS40MDQxOworICAgIGV4cF9sYW1kYVsxMF0gPSBleHBfbGFtZGFbMF0gKiA2LjU5NzQ7CisgICAgZXhwX2xhbWRhWzExXSA9IGV4cF9sYW1kYVswXSAqIDEwLjUzNDE7CisgICAgZXhwX2xhbWRhWzEyXSA9IGV4cF9sYW1kYVswXSAqIDEwLjA3MTk7CisgICAgZXhwX2xhbWRhWzEzXSA9IGV4cF9sYW1kYVswXSAqIDEyLjA1MTY7CisgICAgZXhwX2xhbWRhWzE0XSA9IGV4cF9sYW1kYVswXSAqIDE1LjQ1NTI7CisKKyAgICBDYWxjVGhyZXNob2xkKEhURk1fUGYsIGV4cF9sYW1kYSwgZW5jdmlkLT5ucm1sel90aCk7CisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIENhbGNUaHJlc2hvbGQoZG91YmxlIHBmLCBkb3VibGUgZXhwX2xhbWRhW10sIGludCBucm1sel90aFtdKQoreworICAgIGludCBpOworICAgIGRvdWJsZSB0ZW1wWzE1XTsKKyAgICAvLyAgcHJpbnRmKCJcbkxhbWRhOiAiKTsKKworICAgIC8qIHBhcmFtZXRyaWMgUFJFTU9ERUxsaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCisgICAgeworICAgICAgICAvLyAgICBwcmludGYoIiVnICIsZXhwX2xhbWRhW2ldKTsKKyAgICAgICAgaWYgKHBmIDwgMC41KQorICAgICAgICAgICAgdGVtcFtpXSA9IDEgLyBleHBfbGFtZGFbaV0gKiBNNFZFTkNfTE9HKDIgKiBwZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlbXBbaV0gPSAtMSAvIGV4cF9sYW1kYVtpXSAqIE00VkVOQ19MT0coMiAqICgxIC0gcGYpKTsKKyAgICB9CisKKyAgICBucm1sel90aFsxNV0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSAgICAgICAgLyogc2NhbGUgdXB0byBuby5waXhlbHMgKi8KKyAgICAgICAgbnJtbHpfdGhbaV0gPSAoaW50KSh0ZW1wW2ldICogKChpICsgMSkgPDwgNCkgKyAwLjUpOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCAgICBIVEZNUHJlcGFyZUN1ck1CX0FWQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgdWludDMyICpodGZtTUIgPSAodWludDMyKikoZW5jdmlkLT5jdXJyWU1CKTsKKyAgICB1aW50OCAqcHRyLCBieXRlOworICAgIGludCAqb2Zmc2V0OworICAgIGludCBpOworICAgIHVpbnQzMiB3b3JkOworCisgICAgaWYgKCgoaW50KXZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtKSAlIDMwID09IDEpCisgICAgeworICAgICAgICBvZmZzZXQgPSBodGZtX3N0YXQtPm9mZnNldEFycmF5OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvZmZzZXQgPSBlbmN2aWQtPm5ybWx6X3RoICsgMTY7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBwdHIgPSBjdXIgKyBvZmZzZXRbaV07CisgICAgICAgIHdvcmQgPSBwdHJbMF07CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisjZW5kaWYgLy8gSFRGTQorCit2b2lkICAgIEFWQ1ByZXBhcmVDdXJNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgaW50IHBpdGNoKQoreworICAgIHZvaWQqIHRtcCA9ICh2b2lkKikoZW5jdmlkLT5jdXJyWU1CKTsKKyAgICB1aW50MzIgKmN1cnJZTUIgPSAodWludDMyKikgdG1wOworICAgIGludCBpOworCisgICAgY3VyIC09IHBpdGNoOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICAqY3VycllNQisrID0gKigodWludDMyKikoY3VyICs9IHBpdGNoKSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyA0KSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyA4KSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyAxMikpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNpZmRlZiBGSVhFRF9JTlRFUlBSRURfTU9ERQorCisvKiBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLCB3ZSBtYXkgbm90IGRlY2lkZSB0byBza2lwCithIG1hY3JvYmxvY2sgaGVyZSBqdXN0IHlldC4gKi8KKy8qIFdlIHdpbGwgZmluZCB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yIGFuZCB0aGUgYmVzdCBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2suICovCisvKiBvdXRwdXQgYXJlCisgICAgY3Vyck1CLT5OdW1NYlBhcnQsICBjdXJyTUItPk1iUGFydFdpZHRoLCBjdXJyTUItPk1iUGFydEhlaWdodCwKKyAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtdLCBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW10sIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0LAorICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbXVtdIChMMCBvciBMMSBvciBCaVByZWQpCisgICAgY3Vyck1CLT5SZWZJZHhbXSwgY3Vyck1CLT5yZWZfaWR4X0wwW10sCisgICAgY3Vyck1CLT5tdkwwW10sIGN1cnJNQi0+bXZMMVtdCisgICAgKi8KKworQVZDRW5jX1N0YXR1cyBBVkNNQk1vdGlvblNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFzcykKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IG1iUGFydElkeCwgc3ViTWJQYXJ0SWR4OworICAgIGludDE2ICptdjsKKyAgICBpbnQgaTsKKyAgICBpbnQgU3ViTWJQYXJ0SGVpZ2h0LCBTdWJNYlBhcnRXaWR0aCwgTnVtU3ViTWJQYXJ0OworCisgICAgLyogYXNzaWduIHZhbHVlIHRvIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbXVt4XSxzdWJNYk1vZGVbXSxOdW1TdWJNYlBhcnRbXSxTdWJNYlBhcnRXaWR0aFtdLFN1Yk1iUGFydEhlaWdodFtdICovCisKKyAgICBjdXJyTUItPm1iTW9kZSA9IEZJWEVEX0lOVEVSUFJFRF9NT0RFOworICAgIGN1cnJNQi0+bWJfaW50cmEgPSAwOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QMTYpCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDE7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSAxNjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKKyAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMF0gPSAxNjsKKyAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFswXSA9IDE2OworICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFswXSA9ICAxOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDE2eDgpCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDI7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSAxNjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW2ldID0gMTY7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFtpXSA9IDg7CisgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtpXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4eDE2KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAyOworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtpXSA9IDg7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFtpXSA9IDE2OworICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbaV0gPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSA0OworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfOHg4KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA4OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA4OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChGSVhFRF9TVUJNQl9NT0RFID09IEFWQ184eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1Yk1iUGFydEhlaWdodCA9IDQ7CisgICAgICAgICAgICBTdWJNYlBhcnRXaWR0aCA9IDg7CisgICAgICAgICAgICBOdW1TdWJNYlBhcnQgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEZJWEVEX1NVQk1CX01PREUgPT0gQVZDXzR4OCkKKyAgICAgICAgeworICAgICAgICAgICAgU3ViTWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgICAgIFN1Yk1iUGFydFdpZHRoID0gNDsKKyAgICAgICAgICAgIE51bVN1Yk1iUGFydCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA0OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA0OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+c3ViTWJNb2RlW2ldID0gRklYRURfU1VCTUJfTU9ERTsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0W2ldID0gU3ViTWJQYXJ0SGVpZ2h0OworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtpXSA9IFN1Yk1iUGFydFdpZHRoOworICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbaV0gPSBOdW1TdWJNYlBhcnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBpdCdzIHByb2JhYmx5IGludHJhIG1vZGUgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICA9IEFWQ19QcmVkX0wwOworICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XSA9IEZJWEVEX1JFRl9JRFg7CisgICAgICAgIGN1cnJNQi0+UmVmSWR4W21iUGFydElkeF0gPSB2aWRlby0+UmVmUGljTGlzdDBbRklYRURfUkVGX0lEWF0tPlJlZklkeDsKKworICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IDQ7IHN1Yk1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBtdiA9IChpbnQxNiopKGN1cnJNQi0+bXZMMCArIChtYlBhcnRJZHggPDwgMikgKyBzdWJNYlBhcnRJZHgpOworCisgICAgICAgICAgICAqbXYrKyA9IEZJWEVEX01WWDsKKyAgICAgICAgICAgICptdiA9IEZJWEVEX01WWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY3ZpZC0+bWluX2Nvc3QgPSAwOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisjZWxzZSAvKiBwZXJmb3JtIHRoZSBzZWFyY2ggKi8KKworLyogVGhpcyBvcHRpb24gIzEgc2VhcmNoIGlzIHZlcnkgc2ltaWxhciB0byBQVidzIE1QRUc0IG1vdGlvbiBzZWFyY2ggYWxnb3JpdGhtLgorICBUaGUgc2VhcmNoIGlzIGRvbmUgaW4gaGllcmFyY2hpY2FsIG1hbm5lciBmcm9tIDE2eDE2IE1CIGRvd24gdG8gc21hbGxlciBhbmQgc21hbGxlcgorICBwYXJ0aXRpb24uIEF0IGVhY2ggbGV2ZWwsIGEgZGVjaXNpb24gY2FuIGJlIG1hZGUgdG8gc3RvcCB0aGUgc2VhcmNoIGlmIHRoZSBleHBlY3RlZAorICBwcmVkaWN0aW9uIGdhaW4gaXMgbm90IHdvcnRoIHRoZSBjb21wdXRhdGlvbi4gVGhlIGRlY2lzaW9uIGNhbiBhbHNvIGJlIG1hZGUgYXQgdGhlIGZpbmVzdAorICBsZXZlbCBmb3IgbW9yZSBmdWxsc2VhcmNoLWxpa2UgYmVoYXZpb3Igd2l0aCB0aGUgcHJpY2Ugb2YgaGVhdmllciBjb21wdXRhdGlvbi4gKi8KK3ZvaWQgQVZDTUJNb3Rpb25TZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpiZXN0X2NhbmRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGkwLCBpbnQgajAsIGludCB0eXBlX3ByZWQsIGludCBGU19lbiwgaW50ICpocF9ndWVzcykKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICB1aW50OCAqcmVmLCAqY2FuZCwgKm5jYW5kOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSBlbmN2aWQtPnNhZF9leHRyYV9pbmZvOworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYk51bTsKKyAgICBpbnQgd2lkdGggPSBjdXJyUGljLT53aWR0aDsgLyogNi8xMi8wMSwgbXVzdCBiZSBtdWx0aXBsZSBvZiAxNiAqLworICAgIGludCBoZWlnaHQgPSBjdXJyUGljLT5oZWlnaHQ7CisgICAgQVZDTVYgKm1vdDE2eDE2ID0gZW5jdmlkLT5tb3QxNngxNjsKKyAgICBpbnQgKCpTQURfTWFjcm9ibG9jaykodWludDgqLCB1aW50OCosIGludCwgdm9pZCopID0gZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrOworCisgICAgaW50IHJhbmdlID0gcmF0ZUN0cmwtPm12UmFuZ2U7CisKKyAgICBpbnQgbHggPSBjdXJyUGljLT5waXRjaDsgLyogIHBhZGRpbmcgKi8KKyAgICBpbnQgaSwgaiwgaW1pbiwgam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoOworICAgIGludCBkLCBkbWluLCBkbls5XTsKKyAgICBpbnQgazsKKyAgICBpbnQgbXZ4WzVdLCBtdnlbNV07CisgICAgaW50IG51bV9jYW4sIGNlbnRlcl9hZ2FpbjsKKyAgICBpbnQgbGFzdF9sb2MsIG5ld19sb2MgPSAwOworICAgIGludCBzdGVwLCBtYXhfc3RlcCA9IHJhbmdlID4+IDE7CisgICAgaW50IG5leHQ7CisKKyAgICBpbnQgY212eCwgY212eTsgLyogZXN0aW1hdGVkIHByZWRpY3RlZCBNViAqLworICAgIGludCBsZXZfaWR4OworICAgIGludCBsYW1iZGFfbW90aW9uID0gZW5jdmlkLT5sYW1iZGFfbW90aW9uOworICAgIHVpbnQ4ICptdmJpdHMgPSBlbmN2aWQtPm12Yml0czsKKyAgICBpbnQgbXZzaGlmdCA9IDI7CisgICAgaW50IG12Y29zdDsKKworICAgIGludCBtaW5fc2FkID0gNjU1MzU7CisKKyAgICByZWYgPSB2aWRlby0+UmVmUGljTGlzdDBbREVGQVVMVF9SRUZfSURYXS0+U2w7IC8qIG9yaWdpbiBvZiBhY3R1YWwgZnJhbWUgKi8KKworICAgIC8qIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGVzZSBwYXJhbXMsIG5lY2Vzc2FyeSBmb3IgaW50ZXJwcmVkaWN0aW9uIHBhcnQgKi8KKyAgICBjdXJyTUItPk51bU1iUGFydCA9IDE7CisgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMF0gPSAxNjsKKyAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gMTY7CisgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSAxOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsyXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFszXSA9IERFRkFVTFRfUkVGX0lEWDsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDFbMF0gPSBjdXJyTUItPnJlZl9pZHhfTDFbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDFbMl0gPSBjdXJyTUItPnJlZl9pZHhfTDFbM10gPSBERUZBVUxUX1JFRl9JRFg7CisgICAgY3Vyck1CLT5SZWZJZHhbMF0gPSBjdXJyTUItPlJlZklkeFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5SZWZJZHhbMl0gPSBjdXJyTUItPlJlZklkeFszXSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtERUZBVUxUX1JFRl9JRFhdLT5SZWZJZHg7CisKKyAgICBjdXIgPSBlbmN2aWQtPmN1cnJZTUI7IC8qIHVzZSBzbWFsbGVyIG1lbW9yeSBzcGFjZSBmb3IgY3VycmVudCBNQiAqLworCisgICAgLyogIGZpbmQgbGltaXQgb2YgdGhlIHNlYXJjaCAoYWRqdXN0aW5nIHNlYXJjaCByYW5nZSkqLworICAgIGxldl9pZHggPSBtYXBMZXYySWR4W2N1cnJTUFMtPmxldmVsX2lkY107CisKKyAgICAvKiB3ZSBjYW4gbWFrZSB0aGlzIHBhcnQgZHluYW1pYyBiYXNlZCBvbiBwcmV2aW91cyBzdGF0aXN0aWNzICovCisgICAgaWxvdyA9IGkwIC0gcmFuZ2U7CisgICAgaWYgKGkwIC0gaWxvdyA+IDIwNDcpIC8qIGNsaXAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZCAqLworICAgIHsKKyAgICAgICAgaWxvdyA9IGkwIC0gMjA0NzsKKyAgICB9CisgICAgaWYgKGlsb3cgPCAtMTMpICAvLyBjaGFuZ2UgaXQgZnJvbSAtMTUgdG8gLTEzIGJlY2F1c2Ugb2YgNi10YXAgZmlsdGVyIG5lZWRzIGV4dHJhIDIgbGluZXMuCisgICAgeworICAgICAgICBpbG93ID0gLTEzOworICAgIH0KKworICAgIGloaWdoID0gaTAgKyByYW5nZSAtIDE7CisgICAgaWYgKGloaWdoIC0gaTAgPiAyMDQ3KSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGloaWdoID0gaTAgKyAyMDQ3OworICAgIH0KKyAgICBpZiAoaWhpZ2ggPiB3aWR0aCAtIDMpCisgICAgeworICAgICAgICBpaGlnaCA9IHdpZHRoIC0gMzsgIC8vIGNoYW5nZSBmcm9tIHdpZHRoLTEgdG8gd2lkdGgtMyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgfQorCisgICAgamxvdyA9IGowIC0gcmFuZ2U7CisgICAgaWYgKGowIC0gamxvdyA+IE1heFZtdlJbbGV2X2lkeF0gLSAxKSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGpsb3cgPSBqMCAtIE1heFZtdlJbbGV2X2lkeF0gKyAxOworICAgIH0KKyAgICBpZiAoamxvdyA8IC0xMykgICAgIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgeworICAgICAgICBqbG93ID0gLTEzOworICAgIH0KKworICAgIGpoaWdoID0gajAgKyByYW5nZSAtIDE7CisgICAgaWYgKGpoaWdoIC0gajAgPiBNYXhWbXZSW2xldl9pZHhdIC0gMSkgLyogY2xpcCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkICovCisgICAgeworICAgICAgICBqaGlnaCA9IGowICsgTWF4Vm12UltsZXZfaWR4XSAtIDE7CisgICAgfQorICAgIGlmIChqaGlnaCA+IGhlaWdodCAtIDMpIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgeworICAgICAgICBqaGlnaCA9IGhlaWdodCAtIDM7CisgICAgfQorCisgICAgLyogZmluZCBpbml0aWFsIG1vdGlvbiB2ZWN0b3IgJiBwcmVkaWN0ZWQgTVYqLworICAgIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbihtdngsIG12eSwgJm51bV9jYW4sIGkwID4+IDQsIGowID4+IDQsIGVuY3ZpZCwgdHlwZV9wcmVkLCAmY212eCwgJmNtdnkpOworCisgICAgaW1pbiA9IGkwOworICAgIGptaW4gPSBqMDsgLyogbmVlZGVkIGZvciBmdWxsc2VhcmNoICovCisgICAgbmNhbmQgPSByZWYgKyBpMCArIGowICogbHg7CisKKyAgICAvKiBmb3IgZmlyc3Qgcm93IG9mIE1CLCBmdWxsc2VhcmNoIGNhbiBiZSB1c2VkICovCisgICAgaWYgKEZTX2VuKQorICAgIHsKKyAgICAgICAgKmhwX2d1ZXNzID0gMDsgLyogbm8gZ3Vlc3MgZm9yIGZhc3QgaGFsZi1wZWwgKi8KKworICAgICAgICBkbWluID0gIEFWQ0Z1bGxTZWFyY2goZW5jdmlkLCByZWYsIGN1ciwgJmltaW4sICZqbWluLCBpbG93LCBpaGlnaCwgamxvdywgamhpZ2gsIGNtdngsIGNtdnkpOworCisgICAgICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiAgICAgICBmdWxsc2VhcmNoIHRoZSB0b3Agcm93IHRvIG9ubHkgdXB0byAoMCwzKSBNQiAqLworICAgICAgICAvKiAgICAgICB1cHRvIDMwJSBjb21wbGV4aXR5IHNhdmluZyB3aXRoIHRoZSBzYW1lIGNvbXBsZXhpdHkgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPT0gMCAmJiBqMCA9PSAwICYmIGkwIDw9IDY0ICYmIHR5cGVfcHJlZCAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICAqaHBfZ3Vlc3MgPSAwOyAvKiBubyBndWVzcyBmb3IgZmFzdCBoYWxmLXBlbCAqLworICAgICAgICAgICAgZG1pbiA9ICBBVkNGdWxsU2VhcmNoKGVuY3ZpZCwgcmVmLCBjdXIsICZpbWluLCAmam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKiBpbml0aWFsaXplIGNhbmRpZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgZG1pbiA9IDY1NTM1OworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgYXJlIGVxdWFsICovCisgICAgICAgICAgICBpZiAobnVtX2NhbiA9PSBBTExfQ0FORF9FUVVBTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpID0gaTAgKyBtdnhbMF07CisgICAgICAgICAgICAgICAgaiA9IGowICsgbXZ5WzBdOworCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIGkgLSBpMCwgaiAtIGowLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgICAgICAgICAgZCArPSAgbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7IC8vIGZvciByYXRlIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKiogZXZhbHVhdGUgdW5pcXVlIGNhbmRpZGF0ZXMgKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2NhbjsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkwICsgbXZ4W2tdOworICAgICAgICAgICAgICAgICAgICBqID0gajAgKyBtdnlba107CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgICAgICAgICAgZCArPSAgbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OyAvLyBmb3IgcmF0ZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqIGxvY2FsIHJlZmluZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgIGxhc3RfbG9jID0gbmV3X2xvYyA9IDA7CisgICAgICAgICAgICAvLyAgICAgICAgICBuY2FuZCA9IHJlZiArIGptaW4qbHggKyBpbWluOyAgLyogY2VudGVyIG9mIHRoZSBzZWFyY2ggKi8KKyAgICAgICAgICAgIHN0ZXAgPSAwOworICAgICAgICAgICAgZG5bMF0gPSBkbWluOworICAgICAgICAgICAgd2hpbGUgKCFjZW50ZXJfYWdhaW4gJiYgc3RlcCA8PSBtYXhfc3RlcCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIEFWQ01vdmVOZWlnaGJvclNBRChkbiwgbGFzdF9sb2MpOworCisgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMTsKKyAgICAgICAgICAgICAgICBpID0gaW1pbjsKKyAgICAgICAgICAgICAgICBqID0gam1pbiAtIDE7CisgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAvKiAgc3RhcnRpbmcgZnJvbSBbMCwtMV0gKi8KKyAgICAgICAgICAgICAgICAvKiBzcGlyYWwgY2hlY2sgb25lIHN0ZXAgYXQgYSB0aW1lKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAyOyBrIDw9IDg7IGsgKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFiX2V4Y2x1ZGVbbGFzdF9sb2NdW2tdKSAvKiBleGNsdWRlIGxhc3Qgc3RlcCBjb21wdXRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB7ICAgICAgIC8qIG5vdCBhbHJlYWR5IGNvbXB1dGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5ba10gPSBkOyAvKiBrZWVwIGl0IGZvciBoYWxmIHBlbCB1c2UgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xvYyA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OyAvLyBmb3IgcmF0ZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChrID09IDgpICAvKiBlbmQgc2lkZSBzZWFyY2gqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gLTE7IC8qIHN0YXJ0IGRpYWdvbmFsIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBseCAqIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9sb2MgPSBuZXdfbG9jOworICAgICAgICAgICAgICAgIHN0ZXAgKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICBBVkNNb3ZlTmVpZ2hib3JTQUQoZG4sIGxhc3RfbG9jKTsKKworICAgICAgICAgICAgKmhwX2d1ZXNzID0gQVZDRmluZE1pbihkbik7CisKKyAgICAgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworICAgICAgICB9CisgICAgfQorCisgICAgbW90MTZ4MTZbbWJudW1dLnNhZCA9IGRtaW47CisgICAgbW90MTZ4MTZbbWJudW1dLnggPSAoaW1pbiAtIGkwKSA8PCAyOworICAgIG1vdDE2eDE2W21ibnVtXS55ID0gKGptaW4gLSBqMCkgPDwgMjsKKyAgICBiZXN0X2NhbmRbMF0gPSBuY2FuZDsKKworICAgIGlmIChyYXRlQ3RybC0+c3ViUGVsRW5hYmxlKSAvLyBhbHdheXMgZW5hYmxlIGhhbGYtcGVsIHNlYXJjaAorICAgIHsKKyAgICAgICAgLyogZmluZCBoYWxmLXBlbCByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgbWluX3NhZCA9IEFWQ0ZpbmRIYWxmUGVsTUIoZW5jdmlkLCBjdXIsIG1vdDE2eDE2ICsgbWJudW0sIGJlc3RfY2FuZFswXSwgaTAsIGowLCAqaHBfZ3Vlc3MsIGNtdngsIGNtdnkpOworCisgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworCisKKyAgICAgICAgaWYgKGVuY3ZpZC0+YmVzdF9xcGVsX3BvcyA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmNhbmQgPSBlbmN2aWQtPmhwZWxfY2FuZFtlbmN2aWQtPmJlc3RfaHBlbF9wb3NdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmNhbmQgPSBlbmN2aWQtPnFwZWxfY2FuZFtlbmN2aWQtPmJlc3RfcXBlbF9wb3NdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworICAgIH0KKworICAgIC8qKiBkbyBtb3Rpb24gY29tcCBoZXJlIGZvciBub3cgKi8KKyAgICByZWYgPSBjdXJyUGljLT5TbCArIGkwICsgajAgKiBseDsKKyAgICAvKiBjb3B5IGZyb20gdGhlIGJlc3QgcmVzdWx0IHRvIGN1cnJlbnQgUGljdHVyZSAqLworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZWYrKyA9ICpuY2FuZCsrOworICAgICAgICB9CisgICAgICAgIHJlZiArPSAobHggLSAxNik7CisgICAgICAgIG5jYW5kICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0Z1bGxTZWFyY2gKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGVyZm9ybSBmdWxsLXNlYXJjaCBtb3Rpb24gZXN0aW1hdGlvbiBvdmVyIHRoZSByYW5nZSBvZiBzZWFyY2gKKyAgICAgICAgICAgICAgICByZWdpb24gaW4gYSBzcGlyYWwtb3V0d2FyZCBtYW5uZXIuCisgICAgSW5wdXQvT3V0cHV0OiAgIFZpZGVvRW5jRGF0YSwgY3VycmVudCBWb2wsIHByZXZpb3UgVm9wLCBwb2ludGVyIHRvIHRoZSBsZWZ0IGNvcm5lciBvZgorICAgICAgICAgICAgICAgIGN1cnJlbnQgVk9QLCBjdXJyZW50IGNvb3JkIChhbHNvIG91dHB1dCksIGJvdW5kYXJpZXMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBBVkNGdWxsU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqcHJldiwgdWludDggKmN1ciwKKyAgICAgICAgICAgICAgICAgIGludCAqaW1pbiwgaW50ICpqbWluLCBpbnQgaWxvdywgaW50IGloaWdoLCBpbnQgamxvdywgaW50IGpoaWdoLAorICAgICAgICAgICAgICAgICAgaW50IGNtdngsIGludCBjbXZ5KQoreworICAgIGludCByYW5nZSA9IGVuY3ZpZC0+cmF0ZUN0cmwtPm12UmFuZ2U7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSBlbmN2aWQtPmNvbW1vbi0+Y3VyclBpYzsKKyAgICB1aW50OCAqY2FuZDsKKyAgICBpbnQgaSwgaiwgaywgbDsKKyAgICBpbnQgZCwgZG1pbjsKKyAgICBpbnQgaTAgPSAqaW1pbjsgLyogY3VycmVudCBwb3NpdGlvbiAqLworICAgIGludCBqMCA9ICpqbWluOworICAgIGludCAoKlNBRF9NYWNyb2Jsb2NrKSh1aW50OCosIHVpbnQ4KiwgaW50LCB2b2lkKikgPSBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2s7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IGVuY3ZpZC0+c2FkX2V4dHJhX2luZm87CisgICAgaW50IGx4ID0gY3VyclBpYy0+cGl0Y2g7IC8qIHdpdGggcGFkZGluZyAqLworCisgICAgaW50IG9mZnNldCA9IGkwICsgajAgKiBseDsKKworICAgIGludCBsYW1iZGFfbW90aW9uID0gZW5jdmlkLT5sYW1iZGFfbW90aW9uOworICAgIHVpbnQ4ICptdmJpdHMgPSBlbmN2aWQtPm12Yml0czsKKyAgICBpbnQgbXZzaGlmdCA9IDI7CisgICAgaW50IG12Y29zdDsKKyAgICBpbnQgbWluX3NhZDsKKworICAgIGNhbmQgPSBwcmV2ICsgb2Zmc2V0OworCisgICAgZG1pbiAgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsICg2NTUzNSA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgMCwgMCwgY212eCwgY212eSk7CisgICAgbWluX3NhZCA9IGRtaW47CisgICAgZG1pbiArPSBtdmNvc3Q7CisKKyAgICAvKiBwZXJmb3JtIHNwaXJhbCBzZWFyY2ggKi8KKyAgICBmb3IgKGsgPSAxOyBrIDw9IHJhbmdlOyBrKyspCisgICAgeworCisgICAgICAgIGkgPSBpMCAtIGs7CisgICAgICAgIGogPSBqMCAtIGs7CisKKyAgICAgICAgY2FuZCA9IHByZXYgKyBpICsgaiAqIGx4OworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCA4Kms7IGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgYm91bmRhcnkgY2hlY2tpbmcgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgIGQgKz0gIG12Y29zdDsKKworICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAqaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICpqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobCA8IChrIDw8IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBjYW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKGsgPDwgMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGNhbmQgKz0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKChrIDw8IDIpICsgKGsgPDwgMSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjYW5kLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPnJhdGVDdHJsLT5NQURvZk1CW2VuY3ZpZC0+Y29tbW9uLT5tYk51bV0gPSAobWluX3NhZCAvIDI1Ni4wKTsgLy8gZm9yIHJhdGUgY29udHJvbAorCisgICAgcmV0dXJuIGRtaW47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbgorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBGaWxsIHVwIHRoZSBsaXN0IG9mIGNhbmRpZGF0ZSB1c2luZyBzcGF0aW8tdGVtcG9yYWwgY29ycmVsYXRpb24KKyAgICAgICAgICAgICAgICBhbW9uZyBuZWlnaGJvcmluZyBibG9ja3MuCisgICAgSW5wdXQvT3V0cHV0OiAgIHR5cGVfcHJlZCA9IDA6IGZpcnN0IHBhc3MsIDE6IHNlY29uZCBwYXNzLCBvciBubyBTQ0QKKyAgICBNb2RpZmllZDogICAsIDA5LzIzLzAxLCBnZXQgcmlkIG9mIHJlZHVuZGFudCBjYW5kaWRhdGVzIGJlZm9yZSBwYXNzaW5nIGJhY2suCisgICAgICAgICAgICAgICAgLCAwOS8xMS8wNywgYWRkZWQgcmV0dXJuIGZvciBtb2RpZmllZCBwcmVkaWN0ZWQgTVYsIHRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICBuZWVkZWQgZm9yIGJvdGggZmFzdCBzZWFyY2ggYW5kIGZ1bGxzZWFyY2guCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBBVkNDYW5kaWRhdGVTZWxlY3Rpb24oaW50ICptdngsIGludCAqbXZ5LCBpbnQgKm51bV9jYW4sIGludCBpbWIsIGludCBqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IHR5cGVfcHJlZCwgaW50ICpjbXZ4LCBpbnQgKmNtdnkpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01WICptb3QxNngxNiA9IGVuY3ZpZC0+bW90MTZ4MTY7CisgICAgQVZDTVYgKnBtb3Q7CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1iTnVtOworICAgIGludCBtYndpZHRoID0gdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisgICAgaW50IG1iaGVpZ2h0ID0gdmlkZW8tPlBpY0hlaWdodEluTWJzOworICAgIGludCBpLCBqLCBzYW1lLCBudW0xOworCisgICAgLyogdGhpcyBwYXJ0IGlzIGZvciBwcmVkaWN0ZWQgTVYgKi8KKyAgICBpbnQgcG12QV94ID0gMCwgcG12QV95ID0gMCwgcG12Ql94ID0gMCwgcG12Ql95ID0gMCwgcG12Q194ID0gMCwgcG12Q195ID0gMDsKKyAgICBpbnQgYXZhaWxBID0gMCwgYXZhaWxCID0gMCwgYXZhaWxDID0gMDsKKworICAgICpudW1fY2FuID0gMDsKKworICAgIGlmICh2aWRlby0+UHJldlJlZkZyYW1lTnVtICE9IDApIC8vIHByZXZpb3VzIGZyYW1lIGlzIGFuIElEUiBmcmFtZQorICAgIHsKKyAgICAgICAgLyogU3BhdGlvLVRlbXBvcmFsIENhbmRpZGF0ZSAoZml2ZSBjYW5kaWRhdGVzKSAqLworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qIGZpcnN0IHBhc3MgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bV07IC8qIHNhbWUgY29vcmRpbmF0ZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgaWYgKGltYiA+PSAobWJ3aWR0aCA+PiAxKSAmJiBpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaW1iICsgMSA8IG1id2lkdGgpICAgLypyaWdodCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSttYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoam1iID4gMCkgICAvKnVwcGVyIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW1iID4gMCAmJiBqbWIgPiAwKSAgLyogdXBwZXItbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgICAgLyogc2Vjb25kIHBhc3MgKi8KKyAgICAgICAgICAgIC8qIG9yaWdpbmFsIFNUMSBhbGdvcml0aG0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bV07IC8qIHNhbWUgY29vcmRpbmF0ZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpICAvKnJpZ2h0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSttYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IHByZWRpY3RlZCBNViAqLworICAgICAgICBpZiAoaW1iID4gMCkgICAgLyogZ2V0IE1WIGZyb20gbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxBID0gMTsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICBwbXZBX3ggPSBwbW90LT54OworICAgICAgICAgICAgcG12QV95ID0gcG1vdC0+eTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqbWIgPiAwKSAvKiBnZXQgTVYgZnJvbSB0b3AgKEIpIG5laWdoYm9yIGVpdGhlciBvbiBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgcG12Ql94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgIHBtdkJfeSA9IHBtb3QtPnk7CisKKyAgICAgICAgICAgIGF2YWlsQyA9IDE7CisKKyAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgLyogZ2V0IE1WIGZyb20gdG9wLXJpZ2h0IChDKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoRCkgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBtdkNfeCA9IHBtb3QtPng7CisgICAgICAgICAgICBwbXZDX3kgPSBwbW90LT55OworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSAgLyogb25seSBTcGF0aWFsIENhbmRpZGF0ZSAoZm91ciBjYW5kaWRhdGVzKSovCisgICAgeworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qZmlyc3QgcGFzcyovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbWIgPiAxKSAgLyogbmVpZ2hib3IgdHdvIGJsb2NrcyBhd2F5IHRvIHRoZSBsZWZ0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0yXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYiA+IDAgJiYgam1iID4gMCkgIC8qIHVwcGVyLWxlZnQgbmVpZ2hib3IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGdldCBwcmVkaWN0ZWQgTVYgKi8KKyAgICAgICAgICAgIGlmIChpbWIgPiAxKSAgICAvKiBnZXQgTVYgZnJvbSAybmQgbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEEgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMl07CisgICAgICAgICAgICAgICAgcG12QV94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZBX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iID4gMCAmJiBpbWIgPiAwKSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoQikgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIHBtdkJfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12Ql95ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJ3aWR0aCAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxDID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgcG12Q194ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZDX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNpZmRlZiBTQ0VORV9DSEFOR0VfREVURUNUSU9OCisgICAgICAgIC8qIHNlY29uZCBwYXNzIChTVDIgYWxnb3JpdGhtKSovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGVfcHJlZCA9PSAxKSAvKiAgNC83LzAxICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlciBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAgLypyaWdodCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtKzFdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vI2Vsc2UKKyAgICAgICAgICAgIGVsc2UgLyogb3JpZ2luYWwgU1QxIGFsZ29yaXRobSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlci1sZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbWIgPCBtYmhlaWdodCAtIDEpICAvKnVwcGVyLXJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgcHJlZGljdGVkIE1WICovCisgICAgICAgICAgICBpZiAoaW1iID4gMCkgICAgLyogZ2V0IE1WIGZyb20gbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEEgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgcG12QV94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZBX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iID4gMCkgLyogZ2V0IE1WIGZyb20gdG9wIChCKSBuZWlnaGJvciBlaXRoZXIgb24gY3VycmVudCBvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICBwbXZCX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkJfeSA9IHBtb3QtPnk7CisKKyAgICAgICAgICAgICAgICBhdmFpbEMgPSAxOworCisgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAvKiBnZXQgTVYgZnJvbSB0b3AtcmlnaHQgKEMpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoRCkgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbXZDX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkNfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2VuZGlmCisgICAgfQorCisgICAgLyogIDMvMjMvMDEsIHJlbW92ZSByZWR1bmRhbnQgY2FuZGlkYXRlIChwb3NzaWJsZSBrLW1lYW4pICovCisgICAgbnVtMSA9ICpudW1fY2FuOworICAgICpudW1fY2FuID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtMTsgaSsrKQorICAgIHsKKyAgICAgICAgc2FtZSA9IDA7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoIXNhbWUgJiYgaiA8ICpudW1fY2FuKQorICAgICAgICB7CisjaWYgKENBTkRJREFURV9ESVNUQU5DRT09MCkKKyAgICAgICAgICAgIGlmIChtdnhbaV0gPT0gbXZ4W2pdICYmIG12eVtpXSA9PSBtdnlbal0pCisjZWxzZQorICAgICAgICAgICAgLy8gbW9kaWZpZWQgay1tZWFuLCAgMy8yNC8wMSwgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiAzCisgICAgICAgICAgICBpZiAoQVZDX0FCUyhtdnhbaV0gLSBtdnhbal0pICsgQVZDX0FCUyhtdnlbaV0gLSBtdnlbal0pIDwgQ0FORElEQVRFX0RJU1RBTkNFKQorI2VuZGlmCisgICAgICAgICAgICAgICAgc2FtZSA9IDE7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBtdnhbKm51bV9jYW5dID0gbXZ4W2ldOworICAgICAgICAgICAgbXZ5WypudW1fY2FuXSA9IG12eVtpXTsKKyAgICAgICAgICAgICgqbnVtX2NhbikrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0xID09IDUgJiYgKm51bV9jYW4gPT0gMSkKKyAgICAgICAgKm51bV9jYW4gPSBBTExfQ0FORF9FUVVBTDsgLyogYWxsIGFyZSBlcXVhbCAqLworCisgICAgLyogY2FsY3VsYXRlIHByZWRpY3RlZCBNViAqLworCisgICAgaWYgKGF2YWlsQSAmJiAhKGF2YWlsQiB8fCBhdmFpbEMpKQorICAgIHsKKyAgICAgICAgKmNtdnggPSBwbXZBX3g7CisgICAgICAgICpjbXZ5ID0gcG12QV95OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqY212eCA9IEFWQ19NRURJQU4ocG12QV94LCBwbXZCX3gsIHBtdkNfeCk7CisgICAgICAgICpjbXZ5ID0gQVZDX01FRElBTihwbXZBX3ksIHBtdkJfeSwgcG12Q195KTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRnVuY3Rpb246ICAgQVZDTW92ZU5laWdoYm9yU0FECisgICAgRGF0ZTogICAgICAgMy8yNy8wMQorICAgIFB1cnBvc2U6ICAgIE1vdmUgbmVpZ2hib3JpbmcgU0FEIGFyb3VuZCB3aGVuIGNlbnRlciBoYXMgc2hpZnRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBVkNNb3ZlTmVpZ2hib3JTQUQoaW50IGRuW10sIGludCBuZXdfbG9jKQoreworICAgIGludCB0bXBbOV07CisgICAgdG1wWzBdID0gZG5bMF07CisgICAgdG1wWzFdID0gZG5bMV07CisgICAgdG1wWzJdID0gZG5bMl07CisgICAgdG1wWzNdID0gZG5bM107CisgICAgdG1wWzRdID0gZG5bNF07CisgICAgdG1wWzVdID0gZG5bNV07CisgICAgdG1wWzZdID0gZG5bNl07CisgICAgdG1wWzddID0gZG5bN107CisgICAgdG1wWzhdID0gZG5bOF07CisgICAgZG5bMF0gPSBkblsxXSA9IGRuWzJdID0gZG5bM10gPSBkbls0XSA9IGRuWzVdID0gZG5bNl0gPSBkbls3XSA9IGRuWzhdID0gNjU1MzY7CisKKyAgICBzd2l0Y2ggKG5ld19sb2MpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZG5bNF0gPSB0bXBbMl07CisgICAgICAgICAgICBkbls1XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzNdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls2XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzhdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZG5bNl0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls3XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzJdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbM107CisgICAgICAgICAgICBkbls2XSA9IHRtcFs1XTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzZdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbMF07CisgICAgICAgICAgICBkblsyXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzhdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbMF07CisgICAgICAgICAgICBkblszXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzVdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZG5bMl0gPSB0bXBbOF07CisgICAgICAgICAgICBkblszXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzFdOworICAgICAgICAgICAgZG5bM10gPSB0bXBbMl07CisgICAgICAgICAgICBkbls0XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzZdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZG5bMF0gPSB0bXBbbmV3X2xvY107CisKKyAgICByZXR1cm4gOworfQorCisvKiAgMy8yOC8wMSwgZmluZCBtaW5pbWFsIG9mIGRuWzldICovCisKK2ludCBBVkNGaW5kTWluKGludCBkbltdKQoreworICAgIGludCBtaW4sIGk7CisgICAgaW50IGRtaW47CisKKyAgICBkbWluID0gZG5bMV07CisgICAgbWluID0gMTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgOTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGRuW2ldIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgZG1pbiA9IGRuW2ldOworICAgICAgICAgICAgbWluID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtaW47Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjU1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMCwwICsxLDk4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiByYXRlIGNvbnRyb2wgdmFyaWFibGVzICovCisjZGVmaW5lIFJDX01BWF9RVUFOVCA1MQorI2RlZmluZSBSQ19NSU5fUVVBTlQgMCAgIC8vY2FwIHRvIDEwIHRvIHByZXZlbnQgcmF0ZSBmbHVjdHVhdGlvbiAgICAKKworI2RlZmluZSBNQURfTUlOIDEgLyogaGFuZGxlIHRoZSBjYXNlIG9mIGRldmlzaW9uIGJ5IHplcm8gaW4gUkMgKi8KKworCisvKiBsb2NhbCBmdW5jdGlvbnMgKi8KK2RvdWJsZSBRUDJRc3RlcChpbnQgUVApOworaW50IFFzdGVwMlFQKGRvdWJsZSBRc3RlcCk7CisKK2RvdWJsZSBDb21wdXRlRnJhbWVNQUQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKTsKKwordm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCk7CisKK3ZvaWQgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKTsKKwordm9pZCB1cGRhdGVSQ19Qb3N0UHJvYyhBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKTsKKwordm9pZCBBVkNTYXZlUkRTYW1wbGVzKE11bHRpUGFzcyAqcE1QLCBpbnQgY291bnRlcl9zYW1wbGVzKTsKKwordm9pZCB1cGRhdGVSYXRlQ29udHJvbChBVkNSYXRlQ29udHJvbCAqcmF0ZUNvbnRyb2wsIGludCBuYWxfdHlwZSk7CisKK2ludCBHZXRBdmdGcmFtZVFQKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCkKK3sKKyAgICByZXR1cm4gcmF0ZUN0cmwtPlFjOworfQorCitBVkNFbmNfU3RhdHVzIFJDRGV0ZXJtaW5lRnJhbWVOdW0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgdWludDMyIG1vZFRpbWUsIHVpbnQgKmZyYW1lTnVtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgdWludDMyIG1vZFRpbWVSZWYgPSBlbmN2aWQtPm1vZFRpbWVSZWY7CisgICAgaW50MzIgIGN1cnJGcmFtZU51bSA7CisgICAgaW50ICBmcmFtZUluYzsKKworCisgICAgLyogY2hlY2sgd2l0aCB0aGUgYnVmZmVyIGZ1bGxuZXNzIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpdHMgdG8gZW5jb2RlIHRoaXMgZnJhbWUgKi8KKyAgICAvKiB3ZSBjYW4gdXNlIGEgdGhyZXNob2xkIHRvIGd1YXJhbnRlZSBtaW5pbXVtIHBpY3R1cmUgcXVhbGl0eSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogZm9yIG5vdywgdGhlIGRlZmF1bHQgaXMgdG8gZW5jb2RlIGV2ZXJ5IGZyYW1lLCBUbyBCZSBDaGFuZ2VkICovCisgICAgaWYgKHJhdGVDdHJsLT5maXJzdF9mcmFtZSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiA9IG1vZFRpbWU7CisgICAgICAgIGVuY3ZpZC0+d3JhcE1vZFRpbWUgPSAwOworICAgICAgICBlbmN2aWQtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSA9IDA7CisKKyAgICAgICAgKmZyYW1lTnVtID0gMDsKKworICAgICAgICAvKiBzZXQgZnJhbWUgdHlwZSB0byBJRFItZnJhbWUgKi8KKyAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9JRFI7CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX0lfQUxMX1NMSUNFOworICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19JX1NMSUNFOworCisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG1vZFRpbWUgPCBtb2RUaW1lUmVmKSAvKiBtb2RUaW1lIHdyYXBwZWQgYXJvdW5kICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+d3JhcE1vZFRpbWUgKz0gKCh1aW50MzIpMHhGRkZGRkZGRiAtIG1vZFRpbWVSZWYpICsgMTsKKyAgICAgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiA9IG1vZFRpbWVSZWYgPSAwOworICAgICAgICB9CisgICAgICAgIG1vZFRpbWUgKz0gZW5jdmlkLT53cmFwTW9kVGltZTsgLyogd3JhcE1vZFRpbWUgaXMgbm9uIHplcm8gYWZ0ZXIgd3JhcC1hcm91bmQgKi8KKworICAgICAgICBjdXJyRnJhbWVOdW0gPSAoaW50MzIpKCgobW9kVGltZSAtIG1vZFRpbWVSZWYpICogcmF0ZUN0cmwtPmZyYW1lX3JhdGUgKyAyMDApIC8gMTAwMCk7IC8qIGFkZCBzbWFsbCByb3VuZGluZ3MgKi8KKworICAgICAgICBpZiAoY3VyckZyYW1lTnVtIDw9IChpbnQzMillbmN2aWQtPnByZXZQcm9jRnJhbWVOdW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsgIC8qIHRoaXMgaXMgYSBsYXRlIGZyYW1lIGRvIG5vdCBlbmNvZGUgaXQgKi8KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lSW5jID0gY3VyckZyYW1lTnVtIC0gZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtOworCisgICAgICAgIGlmIChmcmFtZUluYyA8IHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgKyAxKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7ICAvKiBmcmFtZSBza2lwIHJlcXVpcmVkIHRvIG1haW50YWluIHRoZSB0YXJnZXQgYml0IHJhdGUuICovCisgICAgICAgIH0KKworICAgICAgICBSQ1VwZGF0ZUJ1ZmZlcih2aWRlbywgcmF0ZUN0cmwsIGZyYW1lSW5jIC0gcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSk7ICAvKiBpbiBjYXNlIG1vcmUgZnJhbWVzIGRyb3BwZWQgKi8KKworICAgICAgICAqZnJhbWVOdW0gPSBjdXJyRnJhbWVOdW07CisKKyAgICAgICAgLyogVGhpcyBwYXJ0IHdvdWxkIGJlIHNpbWlsYXIgdG8gRGV0ZXJtaW5lVm9wVHlwZSBvZiBtNHZlbmMgKi8KKyAgICAgICAgaWYgKCgqZnJhbWVOdW0gPj0gKHVpbnQpcmF0ZUN0cmwtPmlkclBlcmlvZCAmJiByYXRlQ3RybC0+aWRyUGVyaW9kID4gMCkgfHwgKCpmcmFtZU51bSA+IHZpZGVvLT5NYXhGcmFtZU51bSkpIC8qIGZpcnN0IGZyYW1lIG9yIElEUiovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNldCBmcmFtZSB0eXBlIHRvIElEUi1mcmFtZSAqLworICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5pZHJQZXJpb2QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5tb2RUaW1lUmVmICs9ICh1aW50MzIpKHJhdGVDdHJsLT5pZHJQZXJpb2QgKiAxMDAwIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgICpmcmFtZU51bSAtPSByYXRlQ3RybC0+aWRyUGVyaW9kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiArPSAodWludDMyKSh2aWRlby0+TWF4RnJhbWVOdW0gKiAxMDAwIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgICpmcmFtZU51bSAtPSB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfSURSOworICAgICAgICAgICAgc2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfSV9BTExfU0xJQ0U7CisgICAgICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19JX1NMSUNFOworICAgICAgICAgICAgZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtID0gKmZyYW1lTnVtOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9TTElDRTsKKyAgICAgICAgICAgIHNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX1BfQUxMX1NMSUNFOworICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfUF9TTElDRTsKKyAgICAgICAgICAgIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSA9IGN1cnJGcmFtZU51bTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCit2b2lkIFJDVXBkYXRlQnVmZmVyKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IGZyYW1lSW5jKQoreworICAgIGludCB0bXA7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworCisgICAgT1NDTF9VTlVTRURfQVJHKHZpZGVvKTsKKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGlmIChmcmFtZUluYyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgKiAoZnJhbWVJbmMgLSAxKTsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLT0gdG1wOworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IDEwICogKGZyYW1lSW5jIC0gMSk7CisKKyAgICAgICAgICAgIC8qIENoZWNrIGJ1ZmZlciB1bmRlcmZsb3cgKi8KKyAgICAgICAgICAgIGlmIChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgcmF0ZUN0cmwtPmxvd19ib3VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gcmF0ZUN0cmwtPmxvd19ib3VuZDsgLy8gLXJhdGVDdHJsLT5Ccy8yOworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+bG93X2JvdW5kOworICAgICAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA9IHBNUC0+Y291bnRlcl9CVGRzdCArIChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworQVZDRW5jX1N0YXR1cyBJbml0UmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgZG91YmxlIEwxLCBMMiwgTDMsIGJwcDsKKyAgICBpbnQgcXA7CisgICAgaW50IGksIGo7CisKKyAgICByYXRlQ3RybC0+YmFzaWNVbml0ID0gdmlkZW8tPlBpY1NpemVJbk1iczsKKworICAgIHJhdGVDdHJsLT5NQURvZk1CID0gKGRvdWJsZSopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgKiBzaXplb2YoZG91YmxlKSwgREVGQVVMVF9BVFRSKTsKKworICAgIGlmICghcmF0ZUN0cmwtPk1BRG9mTUIpCisgICAgeworICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgfQorCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUCA9IChNdWx0aVBhc3MqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsIHNpemVvZihNdWx0aVBhc3MpLCBERUZBVUxUX0FUVFIpOworICAgICAgICBpZiAoIXJhdGVDdHJsLT5wTVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5VUF9SQzsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocmF0ZUN0cmwtPnBNUCwgMCwgc2l6ZW9mKE11bHRpUGFzcykpOworICAgICAgICByYXRlQ3RybC0+cE1QLT5lbmNvZGVkX2ZyYW1lcyA9IC0xOyAvKiBmb3JnZXQgYWJvdXQgdGhlIHZlcnkgZmlyc3QgSSBmcmFtZSAqLworCisgICAgICAgIC8qIFJESW5mbyAqKnBSRFNhbXBsZXMgKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcyA9IChSREluZm8gKiopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLCAoMzAgKiBzaXplb2YoUkRJbmZvICopKSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgaWYgKCFyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSA9IChSREluZm8gKilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsICgzMiAqIHNpemVvZihSREluZm8pKSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgICAgIGlmICghcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgICAgbWVtc2V0KCYocmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXVtqXSksIDAsIHNpemVvZihSREluZm8pKTsKKyAgICAgICAgfQorICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlID0gKGludCkocmF0ZUN0cmwtPmZyYW1lX3JhdGUgKiAxLjApOyAvKiAxLjBzIHRpbWUgZnJhbWUqLworICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlID0gQVZDX01BWChyYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlLCA1KTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSA9IEFWQ19NSU4ocmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSwgMzApOworCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lUG9zID0gLTE7CisKKworICAgICAgICByYXRlQ3RybC0+Yml0c1BlckZyYW1lID0gKGludDMyKShyYXRlQ3RybC0+Yml0UmF0ZSAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKworICAgICAgICAvKiBCWCByYXRlIGNvbnRyb2wgKi8KKyAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IDA7IC8qIG11c3QgYmUgaW5pdGlhbGl6ZWQgKi8KKworICAgICAgICByYXRlQ3RybC0+QnMgPSByYXRlQ3RybC0+Y3BiU2l6ZTsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gMDsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IChpbnQpKHJhdGVDdHJsLT5CcyAqIDAuNSk7IC8qIHJhdGVDdHJsLT5CcyAqLworICAgICAgICByYXRlQ3RybC0+ZW5jb2RlZF9mcmFtZXMgPSAwOworCisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggPSByYXRlQ3RybC0+Yml0c1BlckZyYW1lOworCisgICAgICAgIHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtID0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcykgLyAocmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSAvIDEwLjApKSAtIDU7CisgICAgICAgIGlmIChyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSA8IDApIHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtICs9IDU7CisKKyAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcworICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZSBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcyBuZWVkcyB0byBiZSBzZXQgdG8gMS8zICovCisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSAoaW50KShyYXRlQ3RybC0+QnMgLyAzLjAgLSByYXRlQ3RybC0+QnMgLyAyLjApOyAvKiB0aGUgYnVmZmVyIHJhbmdlIGlzIFstQnMvMiwgQnMvMl0gKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+Y291bnRlcl9CVHNyYyA9IChpbnQpKChyYXRlQ3RybC0+QnMgLyAyLjAgLSByYXRlQ3RybC0+QnMgLyAzLjApIC8gKHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgLyAxMC4wKSk7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IChpbnQpKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgKyByYXRlQ3RybC0+cE1QLT5jb3VudGVyX0JUc3JjICogKHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgLyAxMC4wKSk7CisKKyAgICAgICAgcmF0ZUN0cmwtPmxvd19ib3VuZCA9IC1yYXRlQ3RybC0+QnMgLyAyOworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCA9IDA7CisKKyAgICAgICAgLyogU2V0dGluZyB0aGUgYml0cmF0ZSBhbmQgZnJhbWVyYXRlICovCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmJpdHJhdGUgPSByYXRlQ3RybC0+Yml0UmF0ZTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVyYXRlID0gcmF0ZUN0cmwtPmZyYW1lX3JhdGU7CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSA9IHJhdGVDdHJsLT5wTVAtPmJpdHJhdGUgLyByYXRlQ3RybC0+cE1QLT5mcmFtZXJhdGU7CisKKyAgICAgICAgLypjb21wdXRlIHRoZSBpbml0aWFsIFFQKi8KKyAgICAgICAgYnBwID0gMS4wICogcmF0ZUN0cmwtPmJpdFJhdGUgLyAocmF0ZUN0cmwtPmZyYW1lX3JhdGUgKiAodmlkZW8tPlBpY1NpemVJbk1icyA8PCA4KSk7CisgICAgICAgIGlmICh2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMID09IDE3NikKKyAgICAgICAgeworICAgICAgICAgICAgTDEgPSAwLjE7CisgICAgICAgICAgICBMMiA9IDAuMzsKKyAgICAgICAgICAgIEwzID0gMC42OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPT0gMzUyKQorICAgICAgICB7CisgICAgICAgICAgICBMMSA9IDAuMjsKKyAgICAgICAgICAgIEwyID0gMC42OworICAgICAgICAgICAgTDMgPSAxLjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMMSA9IDAuNjsKKyAgICAgICAgICAgIEwyID0gMS40OworICAgICAgICAgICAgTDMgPSAyLjQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmF0ZUN0cmwtPmluaXRRUCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnBwIDw9IEwxKQorICAgICAgICAgICAgICAgIHFwID0gMzU7CisgICAgICAgICAgICBlbHNlIGlmIChicHAgPD0gTDIpCisgICAgICAgICAgICAgICAgcXAgPSAyNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJwcCA8PSBMMykKKyAgICAgICAgICAgICAgICBxcCA9IDIwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFwID0gMTU7CisgICAgICAgICAgICByYXRlQ3RybC0+aW5pdFFQID0gcXA7CisgICAgICAgIH0KKworICAgICAgICByYXRlQ3RybC0+UWMgPSByYXRlQ3RybC0+aW5pdFFQOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKworQ0xFQU5VUF9SQzoKKworICAgIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShhdmNIYW5kbGUpOworICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisKK30KKworCit2b2lkIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIGludCBpOworCisgICAgaWYgKHJhdGVDdHJsLT5NQURvZk1CKQorICAgIHsKKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpKHJhdGVDdHJsLT5NQURvZk1CKSk7CisgICAgfQorCisgICAgaWYgKHJhdGVDdHJsLT5wTVApCisgICAgeworICAgICAgICBpZiAocmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludClyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludClyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludCkocmF0ZUN0cmwtPnBNUCkpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgUkNJbml0R09QKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIC8qIGluIEJYIFJDLCB0aGVyZSdzIG5vIEdPUC1sZXZlbCBSQyAqLworCisgICAgT1NDTF9VTlVTRURfQVJHKGVuY3ZpZCk7CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgUkNJbml0RnJhbWVRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0gPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHJhdGVDdHJsLT5wTVA7CisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBmcmFtZSBsYXllciByYXRlIGNvbnRyb2wgKi8KKyAgICAgICAgaWYgKHJhdGVDdHJsLT5lbmNvZGVkX2ZyYW1lcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPlFjID0gcmF0ZUN0cmwtPmluaXRRUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50aXplcl9NdWx0aXBhc3MoZW5jdmlkLCB2aWRlbywgcmF0ZUN0cmwsIHBNUCk7CisgICAgICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPlFjOworICAgICAgICB9CisKKyAgICAgICAgcmF0ZUN0cmwtPk51bWJlcm9mSGVhZGVyQml0cyA9IDA7CisgICAgICAgIHJhdGVDdHJsLT5OdW1iZXJvZlRleHR1cmVCaXRzID0gMDsKKyAgICAgICAgcmF0ZUN0cmwtPm51bUZyYW1lQml0cyA9IDA7IC8vIHJlc2V0CisKKyAgICAgICAgLyogdXBkYXRlIHBNUC0+ZnJhbWVQb3MgKi8KKyAgICAgICAgaWYgKCsrcE1QLT5mcmFtZVBvcyA9PSBwTVAtPmZyYW1lUmFuZ2UpIHBNUC0+ZnJhbWVQb3MgPSAwOworCisgICAgICAgIGlmIChyYXRlQ3RybC0+VCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSAoaW50KShyYXRlQ3RybC0+ZnJhbWVfcmF0ZSAqIDcuNSArIDAuNSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgKi8KKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IEFWQ19NSU4ocE1QLT5jb3VudGVyX0JUZHN0LCAoaW50KShyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAvIDIgKiAwLjQwKSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgbWF5IGdvIGJleW9uZCBWQlYgYnVmZmVyIGlmIHdlIHNldCB0aGUgYnVmZmVyIHNpemUgc21hbGxlciB0aGFuIDAuNzVzICovCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBBVkNfTUFYKHBNUC0+Y291bnRlcl9CVGRzdCwgKGludCkoKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzKSAqIDAuMzAgLyAocmF0ZUN0cmwtPlRNTl9USCAvIDEwLjApICsgMC41KSk7IC8qIEF0IGxlYXN0IDMwJSBvZiBWQlYgYnVmZmVyIHNpemUvMiAqLworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gQVZDX01JTihwTVAtPmNvdW50ZXJfQlRkc3QsIDIwKTsgLyogTGltaXQgdGhlIHRhcmdldCB0byBiZSBzbWFsbGVyIHRoYW4gM0MgKi8KKworICAgICAgICAgICAgcE1QLT50YXJnZXRfYml0cyA9IHJhdGVDdHJsLT5UID0gcmF0ZUN0cmwtPlRNTl9USCA9IChpbnQpKHJhdGVDdHJsLT5UTU5fVEggKiAoMS4wICsgcE1QLT5jb3VudGVyX0JUZHN0ICogMC4xKSk7CisgICAgICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IHBNUC0+Y291bnRlcl9CVGRzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbGxlY3QgdGhlIG5lY2Vzc2FyeSBkYXRhOiB0YXJnZXQgYml0cywgYWN0dWFsIGJpdHMsIG1hZCBhbmQgUVAgKi8KKyAgICAgICAgcE1QLT50YXJnZXRfYml0cyA9IHJhdGVDdHJsLT5UOworICAgICAgICBwTVAtPlFQICA9IHZpZGVvLT5RUHk7CisKKyAgICAgICAgcE1QLT5tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7IC8vQ29tcHV0ZUZyYW1lTUFEKHZpZGVvLCByYXRlQ3RybCk7CisgICAgICAgIGlmIChwTVAtPm1hZCA8IE1BRF9NSU4pIHBNUC0+bWFkID0gTUFEX01JTjsgLyogTUFEX01JTiBpcyBkZWZpbmVkIGFzIDEgaW4gbXA0ZGVmLmggKi8KKworICAgICAgICBwTVAtPmJpdHJhdGUgPSByYXRlQ3RybC0+Yml0UmF0ZTsgLyogY2FsY3VsYXRlZCBpbiBSQ1ZvcFFQU2V0dGluZyAqLworICAgICAgICBwTVAtPmZyYW1lcmF0ZSA9IHJhdGVDdHJsLT5mcmFtZV9yYXRlOworCisgICAgICAgIC8qIGZpcnN0IHBhc3MgZW5jb2RpbmcgKi8KKyAgICAgICAgcE1QLT5uUmVfUXVhbnRpemVkID0gMDsKKworICAgIH0gLy8gcmNFbmFibGUKKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPmluaXRRUDsKKyAgICB9CisKKy8vICBwcmludGYoIiAlZCAiLHZpZGVvLT5RUHkpOworCisgICAgaWYgKHZpZGVvLT5DdXJyUGljTnVtID09IDAgJiYgZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID0gMDsKKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPSB2aWRlby0+UVB5IC0gMjY7CisgICAgfQorCisgICAgLy8gbmVlZCB0aGlzIGZvciBtb3Rpb24gZXN0aW1hdGlvbgorICAgIGVuY3ZpZC0+bGFtYmRhX21vZGUgPSBRUDJRVUFOVFtBVkNfTUFYKDAsIHZpZGVvLT5RUHktU0hJRlRfUVApXTsKKyAgICBlbmN2aWQtPmxhbWJkYV9tb3Rpb24gPSBMQU1CREFfRkFDVE9SKGVuY3ZpZC0+bGFtYmRhX21vZGUpOworICAgIHJldHVybiA7Cit9CisKKy8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwordm9pZCBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApCit7CisgICAgaW50IHByZXZfYWN0dWFsX2JpdHMgPSAwLCBjdXJyX3RhcmdldCwgLypwb3M9MCwqL2ksIGo7CisgICAgT3NjbEZsb2F0IFFzdGVwLCBwcmV2X1FQID0gMC42MjU7CisKKyAgICBPc2NsRmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKKworICAgIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiAqLworICAgIHRhcmdldEJpdENhbGN1bGF0aW9uKGVuY3ZpZCwgdmlkZW8sIHJhdGVDdHJsLCBwTVApOworCisgICAgaWYgKHJhdGVDdHJsLT5UIDw9IDAgfHwgcmF0ZUN0cmwtPnRvdGFsU0FEID09IDApCisgICAgeworICAgICAgICBpZiAocmF0ZUN0cmwtPlQgPCAwKSAgICByYXRlQ3RybC0+UWMgPSBSQ19NQVhfUVVBTlQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGN1cnJlbnQgZnJhbWUgUVAgZXN0aW1hdGlvbiAqLworICAgIGN1cnJfdGFyZ2V0ID0gcmF0ZUN0cmwtPlQ7CisgICAgY3Vycl9tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgaWYgKGN1cnJfbWFkIDwgTUFEX01JTikgY3Vycl9tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworICAgIGN1cnJfUkQgID0gKE9zY2xGbG9hdCljdXJyX3RhcmdldCAvIGN1cnJfbWFkOworCisgICAgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPT0gLTEpIC8vIHByZXZpb3VzIHdhcyBza2lwcGVkCisgICAgeworICAgICAgICBpID0gcE1QLT5mcmFtZVBvczsKKyAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICBwcmV2X1FQID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLlFQOworICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLmFjdHVhbF9iaXRzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBBbm90aGVyIHZlcnNpb24gb2Ygc2VhcmNoIHRoZSBvcHRpbWFsIHBvaW50ICovCisgICAgICAgIHByZXZfbWFkID0gMC4wOworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBwTVAtPmZyYW1lUmFuZ2UgJiYgcHJldl9tYWQgPCAwLjAwMSkgLyogZmluZCBmaXJzdCBvbmUgd2l0aCBub256ZXJvIHByZXZfbWFkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZDsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgcE1QLT5mcmFtZVJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ktMV1bMF0uYWN0dWFsX2JpdHM7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGkgPCBwTVAtPmZyYW1lUmFuZ2U7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBBVkNfQUJTKHByZXZfbWFkIC0gY3Vycl9tYWQpID4gQVZDX0FCUyhwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkIC0gY3Vycl9tYWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICAgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLmFjdHVhbF9iaXRzOworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X1FQID0gUVAyUXN0ZXAocE1QLT5wUkRTYW1wbGVzW2pdWzBdLlFQKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHBNUC0+c2FtcGxlc1BlckZyYW1lW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEFWQ19BQlMocHJldl9hY3R1YWxfYml0cyAtIGN1cnJfdGFyZ2V0KSA+IEFWQ19BQlMocE1QLT5wUkRTYW1wbGVzW2pdW2ldLmFjdHVhbF9iaXRzIC0gY3Vycl90YXJnZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5hY3R1YWxfYml0czsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9RUCA9IFFQMlFzdGVwKHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5RUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcXVhZHJhdGljIGFwcHJveGltYXRpb24KKyAgICBpZiAocHJldl9tYWQgPiAwLjAwMSkgLy8gb25seSB3aGVuIHByZXZfbWFkIGlzIGdyZWF0ZXIgdGhhbiAwLCBvdGhlcndpc2Uga2VlcCB1c2luZyB0aGUgc2FtZSBRUAorICAgIHsKKyAgICAgICAgcHJldl9SRCA9IChPc2NsRmxvYXQpcHJldl9hY3R1YWxfYml0cyAvIHByZXZfbWFkOworICAgICAgICAvL3JhdGVDdHJsLT5RYyA9IChJbnQpKHByZXZfUVAgKiBzcXJ0KHByZXZfYWN0dWFsX2JpdHMvY3Vycl90YXJnZXQpICsgMC40KTsKKyAgICAgICAgaWYgKHByZXZfUVAgPT0gMC42MjUpIC8vIGFkZGVkIHRoaXMgdG8gYWxsb3cgZ2V0dGluZyBvdXQgb2YgUVAgPSAwIGVhc2lseQorICAgICAgICB7CisgICAgICAgICAgICBRc3RlcCA9IChpbnQpKHByZXZfUkQgLyBjdXJyX1JEICsgMC41KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgcmF0ZUN0cmwtPlFjID0oSW50KShwcmV2X1FQICogTTRWRU5DX1NRUlQocHJldl9SRC9jdXJyX1JEKSArIDAuOSk7CisKKyAgICAgICAgICAgIGlmIChwcmV2X1JEIC8gY3Vycl9SRCA+IDAuNSAmJiBwcmV2X1JEIC8gY3Vycl9SRCA8IDIuMCkKKyAgICAgICAgICAgICAgICBRc3RlcCA9IChpbnQpKHByZXZfUVAgKiAoc3FydChwcmV2X1JEIC8gY3Vycl9SRCkgKyBwcmV2X1JEIC8gY3Vycl9SRCkgLyAyLjAgKyAwLjkpOyAvKiBRdWFkcmF0aWMgYW5kIGxpbmVhciBhcHByb3hpbWF0aW9uICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUXN0ZXAgPSAoaW50KShwcmV2X1FQICogKHNxcnQocHJldl9SRCAvIGN1cnJfUkQpICsgcG93KHByZXZfUkQgLyBjdXJyX1JELCAxLjAgLyAzLjApKSAvIDIuMCArIDAuOSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbG93ZXIgYm91bmQgb24gUWMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb2YgY3Vycl9tYWQKKyAgICAgICAgLy8gV2hlbiBtYWQgaXMgYWxyZWFkeSBsb3csIGxvd2VyIGJvdW5kIG9uIFFjIGRvZXNuJ3QgaGF2ZSB0byBiZSBzbWFsbC4KKyAgICAgICAgLy8gTm90ZSwgdGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgbG93IGNvbXBsZXhpdHkgY2xpcCBlbmNvZGVkIGF0IGhpZ2ggYml0IHJhdGUKKyAgICAgICAgLy8gaXQgZG9lc24ndCBoaXQgdGhlIHRhcmdldCBiaXQgcmF0ZSBkdWUgdG8gdGhpcyBRUCBsb3dlciBib3VuZC4KKyAgICAgICAgLy8vIGlmKChjdXJyX21hZCA8IDgpICYmIChyYXRlQ3RybC0+UWMgPCAxMikpICAgcmF0ZUN0cmwtPlFjID0gMTI7CisgICAgICAgIC8vICBlbHNlICAgIGlmKChjdXJyX21hZCA8IDEyOCkgJiYgKHJhdGVDdHJsLT5RYyA8IDMpKSByYXRlQ3RybC0+UWMgPSAzOworCisgICAgICAgIHJhdGVDdHJsLT5RYyA9IFFzdGVwMlFQKFFzdGVwKTsKKworICAgICAgICBpZiAocmF0ZUN0cmwtPlFjIDwgUkNfTUlOX1FVQU5UKSByYXRlQ3RybC0+UWMgPSBSQ19NSU5fUVVBTlQ7CisgICAgICAgIGlmIChyYXRlQ3RybC0+UWMgPiBSQ19NQVhfUVVBTlQpICAgIHJhdGVDdHJsLT5RYyA9IFJDX01BWF9RVUFOVDsKKyAgICB9CisKKyAgICAvKiBhY3RpdmUgYml0IHJlc291cmNlIHByb3RlY3Rpb24gKi8KKyAgICBhdmVyX1FQID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCA/IDAgOiBwTVAtPnN1bV9RUCAvIChPc2NsRmxvYXQpcE1QLT5lbmNvZGVkX2ZyYW1lcyk7CisgICAgYXZlcmFnZV9tYWQgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA9PSAwID8gMCA6IHBNUC0+c3VtX21hZCAvIChPc2NsRmxvYXQpcE1QLT5lbmNvZGVkX2ZyYW1lcyk7IC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNjb25kIGVuY29kZWQgZnJhbWUqLworICAgIGlmIChwTVAtPmRpZmZfY291bnRlciA9PSAwICYmCisgICAgICAgICAgICAoKE9zY2xGbG9hdClyYXRlQ3RybC0+UWMgPD0gYXZlcl9RUCoxLjEgfHwgY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xKSAmJgorICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIDw9IChwTVAtPmNvdW50ZXJfQlRkc3QgKyAoaW50KShwTVAtPmZyYW1lcmF0ZSoxLjAgKyAwLjUpKSkKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggLT0gKGludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMC4wKTsKKyAgICAgICAgcmF0ZUN0cmwtPlQgPSByYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMrKzsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXItLTsKKyAgICB9CisKK30KKwordm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoZW5jdmlkKTsKKyAgICBPc2NsRmxvYXQgY3Vycl9tYWQ7Ly8sIGF2ZXJhZ2VfbWFkOworICAgIGludCBkaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCwgcHJldl9jb3VudGVyX2RpZmYsIGN1cnJfY291bnRlcl9kaWZmLCBib3VuZDsKKyAgICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgZm9yIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisKKyAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KKyAgICB1cGRhdGVSQ19Qb3N0UHJvYyhyYXRlQ3RybCwgcE1QKTsKKworICAgIC8qIHVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMgYW5kIHBNUC0+Y291bnRlcl9CVGRzdCB0byBhdm9pZCBpbnRlcmdlciBvdmVyZmxvdyAqLworICAgIGlmIChwTVAtPmNvdW50ZXJfQlRzcmMgPiAxMDAwICYmIHBNUC0+Y291bnRlcl9CVGRzdCA+IDEwMDApCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgLT0gMTAwMDsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IDEwMDA7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiB0YXJnZXQgY2FsY3VsYXRpb24gKi8KKyAgICBjdXJyX21hZCA9IChPc2NsRmxvYXQpcmF0ZUN0cmwtPnRvdGFsU0FEIC8gdmlkZW8tPlBpY1NpemVJbk1iczsKKyAgICBpZiAoY3Vycl9tYWQgPCBNQURfTUlOKSBjdXJyX21hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKyAgICBwTVAtPmRpZmZfY291bnRlciA9IDA7CisKKworICAgIC8qMS5jYWxjdWxhdGUgYXZlcmFnZSBtYWQgKi8KKyAgICBwTVAtPnN1bV9tYWQgKz0gY3Vycl9tYWQ7CisgICAgLy9hdmVyYWdlX21hZCA9IChwTVAtPmVuY29kZWRfZnJhbWVzIDwgMSA/IGN1cnJfbWFkIDogcE1QLT5zdW1fbWFkLyhPc2NsRmxvYXQpKHBNUC0+ZW5jb2RlZF9mcmFtZXMrMSkpOyAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzY29uZCBlbmNvZGVkIGZyYW1lKi8KKyAgICAvL3BNUC0+YXZlcl9tYWQgPSBhdmVyYWdlX21hZDsKKyAgICBpZiAocE1QLT5lbmNvZGVkX2ZyYW1lcyA+PSAwKSAvKiBwTVAtPmVuY29kZWRfZnJhbWVzIGlzIHNldCB0byAtMSBpbml0aWFsbHksIHNvIGZvcmdldCBhYm91dCB0aGUgdmVyeSBmaXJzdCBJIGZyYW1lICovCisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lcyArIDEpOworCisgICAgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA+IDAgJiYgcE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ID49IDApCisgICAgICAgIHBNUC0+YXZlcl9tYWRfcHJldiA9IChwTVAtPmF2ZXJfbWFkX3ByZXYgKiBwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ICsgMSk7CisKKyAgICAvKjIuYXZlcmFnZV9tYWQsIG1hZCA9PT4gZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QgKi8KKyAgICBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID09IDApCisgICAgeworICAgICAgICAvKiBvcmlnaW5hbCB2ZXJpc29uICovCisgICAgICAgIGlmIChjdXJyX21hZCA+IHBNUC0+YXZlcl9tYWQqMS4xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkgPiAyKQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKChzcXJ0KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQpKjIrY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkvKDMqMC4xKSArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KShjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xICovCisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKGludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkgKyBwb3coY3Vycl9tYWQvcE1QLT5hdmVyX21hZCwgMS4wLzMuMCkpLygyLjAqMC4xKSArIDAuNCk7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkpICogMTAgKyAwLjUpOworCisgICAgICAgIC8qIGFjdGl2ZWx5IGZpbGwgaW4gdGhlIHBvc3NpYmxlIGdhcCAqLworICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjID09IDAgJiYgZGlmZl9jb3VudGVyX0JUZHN0ID09IDAgJiYKKyAgICAgICAgICAgICAgICBjdXJyX21hZCA8PSBwTVAtPmF2ZXJfbWFkKjEuMSAmJiBwTVAtPmNvdW50ZXJfQlRzcmMgPCBwTVAtPmNvdW50ZXJfQlRkc3QpCisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxOworCisgICAgfQorICAgIGVsc2UgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA+IDApCisgICAgeworICAgICAgICAvKiB0cmFuc2l0aW9uIHRpbWU6IHVzZSBwcmV2aW91cyBhdmVyYWdlIG1hZCAicE1QLT5hdmVyX21hZF9wcmV2IiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGF2ZXJhZ2UgbWFkICJwTVAtPmF2ZXJfbWFkIiAqLworICAgICAgICBpZiAoY3Vycl9tYWQgPiBwTVAtPmF2ZXJfbWFkX3ByZXYqMS4xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vycl9tYWQgLyBwTVAtPmF2ZXJfbWFkX3ByZXYgPiAyKQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoKE00VkVOQ19TUVJUKGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikqMitjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpLygzKjAuMSkgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xICovCisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KSArIHBvdyhjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYsIDEuMC8zLjApKS8oMi4wKjAuMSkgKyAwLjQpOworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoaW50KShzcXJ0KGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWRfcHJldiArIDAuMDAwMSkpICogMTAgKyAwLjUpOworCisgICAgICAgIC8qIGFjdGl2ZWx5IGZpbGwgaW4gdGhlIHBvc3NpYmxlIGdhcCAqLworICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjID09IDAgJiYgZGlmZl9jb3VudGVyX0JUZHN0ID09IDAgJiYKKyAgICAgICAgICAgICAgICBjdXJyX21hZCA8PSBwTVAtPmF2ZXJfbWFkX3ByZXYqMS4xICYmIHBNUC0+Y291bnRlcl9CVHNyYyA8IHBNUC0+Y291bnRlcl9CVGRzdCkKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDE7CisKKyAgICAgICAgaWYgKC0tcE1QLT5vdmVybGFwcGVkX3dpbl9zaXplIDw9IDApICAgIHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA9IDA7CisgICAgfQorCisKKyAgICAvKiBpZiBkaWZmZXJlbmNlIGlzIHRvbyBtdWNoLCBkbyBjbGlwcGluZyAqLworICAgIC8qIEZpcnN0LCBzZXQgdGhlIHVwcGVyIGJvdW5kIGZvciBjdXJyZW50IGJpdCBhbGxvY2F0aW9uIHZhcmlhbmNlOiA4MCUgb2YgYXZhaWxhYmxlIGJ1ZmZlciAqLworICAgIGJvdW5kID0gKGludCkoKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzKSAqIDAuNiAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7IC8qIHJhdGVDdHJsLT5CcyAqLworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVHNyYywgYm91bmQpOworICAgIGRpZmZfY291bnRlcl9CVGRzdCA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVGRzdCwgYm91bmQpOworCisgICAgLyogU2Vjb25kLCBzZXQgYW5vdGhlciB1cHBlciBib3VuZCBmb3IgY3VycmVudCBiaXQgYWxsb2NhdGlvbjogNC01KmJpdHJhdGUvZnJhbWVyYXRlICovCisgICAgYm91bmQgPSA1MDsKKy8vICBpZih2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkKKy8vICBub3QgbmVjZXNzYXJ5ICAgICAgIGJvdW5kID0gMTA7ICAtLSBGb3IgTG93IGRlbGF5ICovCisKKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRzcmMsIGJvdW5kKTsKKyAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRkc3QsIGJvdW5kKTsKKworCisgICAgLyogVGhpcmQsIGNoZWNrIHRoZSBidWZmZXIgKi8KKyAgICBwcmV2X2NvdW50ZXJfZGlmZiA9IHBNUC0+Y291bnRlcl9CVGRzdCAtIHBNUC0+Y291bnRlcl9CVHNyYzsKKyAgICBjdXJyX2NvdW50ZXJfZGlmZiA9IHByZXZfY291bnRlcl9kaWZmICsgKGRpZmZfY291bnRlcl9CVGRzdCAtIGRpZmZfY291bnRlcl9CVHNyYyk7CisKKyAgICBpZiAoQVZDX0FCUyhwcmV2X2NvdW50ZXJfZGlmZikgPj0gcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gfHwgQVZDX0FCUyhjdXJyX2NvdW50ZXJfZGlmZikgPj0gcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0pCisgICAgeyAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKworICAgICAgICBpZiAoY3Vycl9jb3VudGVyX2RpZmYgPiByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAmJiBkaWZmX2NvdW50ZXJfQlRkc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAtIHByZXZfY291bnRlcl9kaWZmKSArIGRpZmZfY291bnRlcl9CVHNyYzsKKyAgICAgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRkc3QgPCAwKSBkaWZmX2NvdW50ZXJfQlRkc3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoY3Vycl9jb3VudGVyX2RpZmYgPCAtcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gJiYgZGlmZl9jb3VudGVyX0JUc3JjKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSBkaWZmX2NvdW50ZXJfQlRkc3QgLSAoLXJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIC0gcHJldl9jb3VudGVyX2RpZmYpOworICAgICAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA8IDApIGRpZmZfY291bnRlcl9CVHNyYyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qMy5kaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCA9PT4gVE1OX1RIICovCisgICAgcmF0ZUN0cmwtPlRNTl9USCA9IChpbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lKTsKKyAgICBwTVAtPmRpZmZfY291bnRlciA9IDA7CisKKyAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCAtPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAqIGRpZmZfY291bnRlcl9CVHNyYyAqIDAuMSk7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gLWRpZmZfY291bnRlcl9CVHNyYzsKKyAgICB9CisgICAgZWxzZSBpZiAoZGlmZl9jb3VudGVyX0JUZHN0KQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCArPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAqIGRpZmZfY291bnRlcl9CVGRzdCAqIDAuMSk7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gZGlmZl9jb3VudGVyX0JUZHN0OworICAgIH0KKworCisgICAgLyo0LnVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLworICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSBkaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgcE1QLT5jb3VudGVyX0JUZHN0ICs9IGRpZmZfY291bnRlcl9CVGRzdDsKKworCisgICAgLyo1LnRhcmdldCBiaXQgY2FsY3VsYXRpb24gKi8KKyAgICByYXRlQ3RybC0+VCA9IHJhdGVDdHJsLT5UTU5fVEggLSByYXRlQ3RybC0+VE1OX1c7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIHVwZGF0ZVJDX1Bvc3RQcm9jKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApCit7CisgICAgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPiAwKSAvKiBza2lwIG5leHQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMCAqIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWU7CisKKyAgICB9CisgICAgZWxzZSBpZiAocmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9PSAtMSkgLyogc2tpcCBjdXJyZW50IGZyYW1lICovCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gcE1QLT5kaWZmX2NvdW50ZXI7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMDsKKworICAgICAgICBwTVAtPnN1bV9tYWQgLT0gcE1QLT5tYWQ7CisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgLSBwTVAtPm1hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lcyAtIDEgKyAwLjAwMDEpOworICAgICAgICBwTVAtPnN1bV9RUCAgLT0gcE1QLT5RUDsKKyAgICAgICAgcE1QLT5lbmNvZGVkX2ZyYW1lcyAtLTsKKyAgICB9CisgICAgLyogc29tZSBzdHVmZiBpbiB1cGRhdGUgVkJWX2Z1bGxuZXNzIHJlbWFpbnMgaGVyZSAqLworICAgIC8vaWYocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA8IC1yYXRlQ3RybC0+QnMvMikgLyogcmF0ZUN0cmwtPkJzICovCisgICAgaWYgKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPCByYXRlQ3RybC0+bG93X2JvdW5kKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IHJhdGVDdHJsLT5sb3dfYm91bmQ7IC8vIC1yYXRlQ3RybC0+QnMvMjsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5sb3dfYm91bmQ7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA9IHBNUC0+Y291bnRlcl9CVGRzdCArIChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgfQorfQorCisKK3ZvaWQgUkNJbml0Q2hyb21hUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IHFfYml0czsKKworICAgIC8qIHdlIGhhdmUgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIEFWQ19DTElQMygwLDUxLHZpZGVvLT5RU3kpICovCisKKyAgICB2aWRlby0+UVB5X2Rpdl82ID0gKGN1cnJNQi0+UVB5ICogNDMpID4+IDg7CisgICAgdmlkZW8tPlFQeV9tb2RfNiA9IGN1cnJNQi0+UVB5IC0gNiAqIHZpZGVvLT5RUHlfZGl2XzY7CisgICAgY3Vyck1CLT5RUGMgPSB2aWRlby0+UVBjID0gbWFwUVBpMlFQY1tBVkNfQ0xJUDMoMCwgNTEsIGN1cnJNQi0+UVB5ICsgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpXTsKKyAgICB2aWRlby0+UVBjX2Rpdl82ID0gKHZpZGVvLT5RUGMgKiA0MykgPj4gODsKKyAgICB2aWRlby0+UVBjX21vZF82ID0gdmlkZW8tPlFQYyAtIDYgKiB2aWRlby0+UVBjX2Rpdl82OworCisgICAgLyogcHJlLWNhbGN1bGF0ZSB0aGlzIHRvIHNhdmUgY29tcHV0YXRpb24gKi8KKyAgICBxX2JpdHMgPSA0ICsgdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBlbmN2aWQtPnFwX2NvbnN0ID0gNjgyIDw8IHFfYml0czsgICAgICAgLy8gaW50cmEKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdCA9IDM0MiA8PCBxX2JpdHM7ICAgICAgIC8vIGludGVyCisgICAgfQorCisgICAgcV9iaXRzID0gNCArIHZpZGVvLT5RUGNfZGl2XzY7CisgICAgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdF9jID0gNjgyIDw8IHFfYml0czsgICAgLy8gaW50cmEKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdF9jID0gMzQyIDw8IHFfYml0czsgICAgLy8gaW50ZXIKKyAgICB9CisKKyAgICBlbmN2aWQtPmxhbWJkYV9tb2RlID0gUVAyUVVBTlRbQVZDX01BWCgwLCBjdXJyTUItPlFQeS1TSElGVF9RUCldOworICAgIGVuY3ZpZC0+bGFtYmRhX21vdGlvbiA9IExBTUJEQV9GQUNUT1IoZW5jdmlkLT5sYW1iZGFfbW9kZSk7CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgUkNJbml0TUJRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gIGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisKKyAgICBjdXJyTUItPlFQeSA9IHZpZGVvLT5RUHk7IC8qIHNldCB0byBwcmV2aW91cyB2YWx1ZSBvciBwaWN0dXJlIGxldmVsICovCisKKyAgICBSQ0luaXRDaHJvbWFRUChlbmN2aWQpOworCit9CisKK3ZvaWQgUkNQb3N0TUIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgbnVtX2hlYWRlcl9iaXRzLCBpbnQgbnVtX3RleHR1cmVfYml0cykKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcodmlkZW8pOworICAgIHJhdGVDdHJsLT5udW1NQkhlYWRlckJpdHMgPSBudW1faGVhZGVyX2JpdHM7CisgICAgcmF0ZUN0cmwtPm51bU1CVGV4dHVyZUJpdHMgPSBudW1fdGV4dHVyZV9iaXRzOworICAgIHJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHMgKz0gcmF0ZUN0cmwtPm51bU1CSGVhZGVyQml0czsKKyAgICByYXRlQ3RybC0+TnVtYmVyb2ZUZXh0dXJlQml0cyArPSByYXRlQ3RybC0+bnVtTUJUZXh0dXJlQml0czsKK30KKwordm9pZCBSQ1Jlc3RvcmVRUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIGN1cnJNQi0+UVB5ID0gdmlkZW8tPlFQeTsgLyogdXNlIHByZXZpb3VzIFFQICovCisgICAgUkNJbml0Q2hyb21hUVAoZW5jdmlkKTsKKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBSQ0NhbGN1bGF0ZU1BRChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCB1aW50OCAqb3JnTCwgaW50IG9yZ1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIHVpbnQzMiBkbWluX2x4OworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRtaW5fbHggPSAoMHhGRkZGIDw8IDE2KSB8IG9yZ1BpdGNoOworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5NQURvZk1CW3ZpZGVvLT5tYk51bV0gPSBBVkNTQURfTWFjcm9ibG9ja19DKG9yZ0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+cHJlZF9pMTZbY3Vyck1CLT5pMTZNb2RlXSwgZG1pbl9seCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGk0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbdmlkZW8tPm1iTnVtXSA9IGVuY3ZpZC0+aTRfc2FkIC8gMjU2LjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBmb3IgSU5URVIsIHdlIGhhdmUgYWxyZWFkeSBzYXZlZCBpdCB3aXRoIHRoZSBNViBzZWFyY2ggKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKworQVZDRW5jX1N0YXR1cyBSQ1VwZGF0ZUZyYW1lKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworICAgIGludCBkaWZmX0JUQ291bnRlcjsKKyAgICBpbnQgbmFsX3R5cGUgPSB2aWRlby0+bmFsX3VuaXRfdHlwZTsKKworICAgIC8qIHVwZGF0ZSB0aGUgY29tcGxleGl0eSB3ZWlnaHQgb2YgSSwgUCwgQiBmcmFtZSAqLworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgcE1QLT5hY3R1YWxfYml0cyA9IHJhdGVDdHJsLT5udW1GcmFtZUJpdHM7CisgICAgICAgIHBNUC0+bWFkID0gKE9zY2xGbG9hdClyYXRlQ3RybC0+dG90YWxTQUQgLyB2aWRlby0+UGljU2l6ZUluTWJzOyAvL0NvbXB1dGVGcmFtZU1BRCh2aWRlbywgcmF0ZUN0cmwpOworCisgICAgICAgIEFWQ1NhdmVSRFNhbXBsZXMocE1QLCAwKTsKKworICAgICAgICBwTVAtPmVuY29kZWRfZnJhbWVzKys7CisKKyAgICAgICAgLyogZm9yIHBNUC0+c2FtcGxlc1BlckZyYW1lICovCisgICAgICAgIHBNUC0+c2FtcGxlc1BlckZyYW1lW3BNUC0+ZnJhbWVQb3NdID0gMDsKKworICAgICAgICBwTVAtPnN1bV9RUCArPSBwTVAtPlFQOworCisgICAgICAgIC8qIHVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLworICAgICAgICAvKiByZS1hbGxvY2F0ZSB0aGUgdGFyZ2V0IGJpdCBhZ2FpbiBhbmQgdGhlbiBzdG9wIGVuY29kaW5nICovCisgICAgICAgIGRpZmZfQlRDb3VudGVyID0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPlRNTl9USCAtIHJhdGVDdHJsLT5UTU5fVyAtIHBNUC0+YWN0dWFsX2JpdHMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1QLT5iaXRyYXRlIC8gKHBNUC0+ZnJhbWVyYXRlICsgMC4wMDAxKSArIDAuMDAwMSkgLyAwLjEpOworICAgICAgICBpZiAoZGlmZl9CVENvdW50ZXIgPj0gMCkKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSBkaWZmX0JUQ291bnRlcjsgLyogcE1QLT5hY3R1YWxfYml0cyBpcyBzbWFsbGVyICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCAtPSBkaWZmX0JUQ291bnRlcjsgLyogcE1QLT5hY3R1YWxfYml0cyBpcyBiaWdnZXIgKi8KKworICAgICAgICByYXRlQ3RybC0+VE1OX1RIIC09IChpbnQpKChPc2NsRmxvYXQpcE1QLT5iaXRyYXRlIC8gKHBNUC0+ZnJhbWVyYXRlICsgMC4wMDAxKSAqIChkaWZmX0JUQ291bnRlciAqIDAuMSkpOworICAgICAgICByYXRlQ3RybC0+VCA9IHBNUC0+dGFyZ2V0X2JpdHMgPSByYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciAtPSBkaWZmX0JUQ291bnRlcjsKKworICAgICAgICByYXRlQ3RybC0+UmMgPSByYXRlQ3RybC0+bnVtRnJhbWVCaXRzOyAgLyogVG90YWwgQml0cyBmb3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICByYXRlQ3RybC0+SGMgPSByYXRlQ3RybC0+TnVtYmVyb2ZIZWFkZXJCaXRzOyAgICAvKiBUb3RhbCBCaXRzIGluIEhlYWRlciBhbmQgTW90aW9uIFZlY3RvciAqLworCisgICAgICAgIC8qIEJYX1JDICovCisgICAgICAgIHVwZGF0ZVJhdGVDb250cm9sKHJhdGVDdHJsLCBuYWxfdHlwZSk7CisgICAgICAgIGlmIChyYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID09IC0xKSAvLyBza2lwIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1NLSVBQRURfUElDVFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJhdGVDdHJsLT5maXJzdF9mcmFtZSA9IDA7ICAvLyByZXNldCBoZXJlIGFmdGVyIHdlIGVuY29kZSB0aGUgZmlyc3QgZnJhbWUuCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEFWQ1NhdmVSRFNhbXBsZXMoTXVsdGlQYXNzICpwTVAsIGludCBjb3VudGVyX3NhbXBsZXMpCit7CisgICAgLyogZm9yIHBNUC0+cFJEU2FtcGxlcyAqLworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLlFQICAgID0gcE1QLT5RUDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5hY3R1YWxfYml0cyA9IHBNUC0+YWN0dWFsX2JpdHM7CisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10ubWFkICAgPSBwTVAtPm1hZDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5SX0QgPSAoT3NjbEZsb2F0KXBNUC0+YWN0dWFsX2JpdHMgLyAocE1QLT5tYWQgKyAwLjAwMDEpOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCB1cGRhdGVSYXRlQ29udHJvbChBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBuYWxfdHlwZSkKK3sKKyAgICBpbnQgIGZyYW1lX2JpdHM7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworCisgICAgLyogQlggcmF0ZSBjb250cm9cbCAqLworICAgIGZyYW1lX2JpdHMgPSAoaW50KShyYXRlQ3RybC0+Yml0UmF0ZSAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKyAgICByYXRlQ3RybC0+VE1OX1cgKz0gKHJhdGVDdHJsLT5SYyAtIHJhdGVDdHJsLT5UTU5fVEgpOworICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgKz0gKHJhdGVDdHJsLT5SYyAtIGZyYW1lX2JpdHMpOyAvL3JhdGVDdHJsLT5ScCk7CisgICAgLy9pZihyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgMCkgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IC0xOworCisgICAgcmF0ZUN0cmwtPmVuY29kZWRfZnJhbWVzKys7CisKKyAgICAvKiBmcmFtZSBkcm9wcGluZyAqLworICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAwOworCisgICAgaWYgKChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID4gcmF0ZUN0cmwtPkJzIC8gMikgJiYgbmFsX3R5cGUgIT0gQVZDX05BTFRZUEVfSURSKSAvKiBza2lwIHRoZSBjdXJyZW50IGZyYW1lICovIC8qIHJhdGVDdHJsLT5CcyAqLworICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XIC09IChyYXRlQ3RybC0+UmMgLSByYXRlQ3RybC0+VE1OX1RIKTsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSByYXRlQ3RybC0+UmM7CisgICAgICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSA+IChyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQpKjAuOTUpIC8qIHNraXAgbmV4dCBmcmFtZSAqLworICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSBmcmFtZV9iaXRzOyAvL3JhdGVDdHJsLT5ScDsKKyAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IDE7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyAtPSAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgICAgICAvKiBCWF8xLCBza2lwIG1vcmUgdGhhbiAxIGZyYW1lcyAgKi8KKyAgICAgICAgLy93aGlsZShyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID4gcmF0ZUN0cmwtPkJzKjAuNDc1KQorICAgICAgICB3aGlsZSAoKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCkgPiAocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSowLjk1KQorICAgICAgICB7CisgICAgICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC09IGZyYW1lX2JpdHM7IC8vcmF0ZUN0cmwtPlJwOworICAgICAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSsrOworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIC09IChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBFTkQgQlhfMSAqLworICAgIH0KK30KKworCitkb3VibGUgQ29tcHV0ZUZyYW1lTUFEKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCkKK3sKKyAgICBkb3VibGUgVG90YWxNQUQ7CisgICAgaW50IGk7CisgICAgVG90YWxNQUQgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpdmlkZW8tPlBpY1NpemVJbk1iczsgaSsrKQorICAgICAgICBUb3RhbE1BRCArPSByYXRlQ3RybC0+TUFEb2ZNQltpXTsKKyAgICBUb3RhbE1BRCAvPSB2aWRlby0+UGljU2l6ZUluTWJzOworICAgIHJldHVybiBUb3RhbE1BRDsKK30KKworCisKKworCisvKiBjb252ZXJ0IGZyb20gUVAgdG8gUXN0ZXAgKi8KK2RvdWJsZSBRUDJRc3RlcChpbnQgUVApCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIFFzdGVwOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgUVAyUVNURVBbNl0gPSB7IDAuNjI1LCAwLjY4NzUsIDAuODEyNSwgMC44NzUsIDEuMCwgMS4xMjUgfTsKKworICAgIFFzdGVwID0gUVAyUVNURVBbUVAgJSA2XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFFQIC8gNik7IGkrKykKKyAgICAgICAgUXN0ZXAgKj0gMjsKKworICAgIHJldHVybiBRc3RlcDsKK30KKworLyogY29udmVydCBmcm9tIHN0ZXAgc2l6ZSB0byBRUCAqLworaW50IFFzdGVwMlFQKGRvdWJsZSBRc3RlcCkKK3sKKyAgICBpbnQgcV9wZXIgPSAwLCBxX3JlbSA9IDA7CisKKyAgICAvLyAgYXNzZXJ0KCBRc3RlcCA+PSBRUDJRc3RlcCgwKSAmJiBRc3RlcCA8PSBRUDJRc3RlcCg1MSkgKTsKKyAgICBpZiAoUXN0ZXAgPCBRUDJRc3RlcCgwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoUXN0ZXAgPiBRUDJRc3RlcCg1MSkpCisgICAgICAgIHJldHVybiA1MTsKKworICAgIHdoaWxlIChRc3RlcCA+IFFQMlFzdGVwKDUpKQorICAgIHsKKyAgICAgICAgUXN0ZXAgLz0gMjsKKyAgICAgICAgcV9wZXIgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoUXN0ZXAgPD0gKDAuNjI1ICsgMC42ODc1KSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuNjI1OworICAgICAgICBxX3JlbSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgwLjY4NzUgKyAwLjgxMjUpIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMC42ODc1OworICAgICAgICBxX3JlbSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgwLjgxMjUgKyAwLjg3NSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAwLjgxMjU7CisgICAgICAgIHFfcmVtID0gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoUXN0ZXAgPD0gKDAuODc1ICsgMS4wKSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuODc1OworICAgICAgICBxX3JlbSA9IDM7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgxLjAgKyAxLjEyNSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAxLjA7CisgICAgICAgIHFfcmVtID0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAxLjEyNTsKKyAgICAgICAgcV9yZW0gPSA1OworICAgIH0KKworICAgIHJldHVybiAocV9wZXIgKiA2ICsgcV9yZW0pOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3Jlc2lkdWFsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yZXNpZHVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlYjkxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yZXNpZHVhbC5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCitBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhUENNKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIGludCB4X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGludCB5X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl95IDw8IDQpOworICAgIGludCBvcmdQaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IG9mZnNldDEgPSB5X3Bvc2l0aW9uICogb3JnUGl0Y2ggKyB4X3Bvc2l0aW9uOworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXQ7CisgICAgdWludDggKnBEc3QsICpwU3JjOworICAgIHVpbnQgY29kZTsKKworICAgIHVlX3Yoc3RyZWFtLCAyNSk7CisKKyAgICBpID0gc3RyZWFtLT5iaXRfbGVmdCAmIDB4NzsKKyAgICBpZiAoaSkgLyogbm90IGJ5dGUtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMCwgaSk7CisgICAgfQorCisgICAgcFNyYyA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQxOworICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2wgKyBvZmZzZXQxOworICAgIG9mZnNldCA9IHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgLSAxNjsKKworICAgIC8qIGF0IHRoaXMgcG9pbnQgYml0c3RyZWFtIGlzIGJ5dGUtYWxpZ25lZCAqLworICAgIGogPSAxNjsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworI2lmIChXT1JEX1NJWkU9PTMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgY29kZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCBjb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBEc3QgKz0gb2Zmc2V0OworICAgICAgICBwU3JjICs9IG9mZnNldDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICBwRHN0ID0gdmlkZW8tPmN1cnJQaWMtPlNjYiArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworICAgIHBTcmMgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisgICAgb2Zmc2V0ID4+PSAxOworCisgICAgaiA9IDg7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyNpZiAoV09SRF9TSVpFPT0zMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSA0OworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIGNvZGUpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDI7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgY29kZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwRHN0ICs9IG9mZnNldDsKKyAgICAgICAgcFNyYyArPSBvZmZzZXQ7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICBwRHN0ID0gdmlkZW8tPmN1cnJQaWMtPlNjciArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworICAgIHBTcmMgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisKKyAgICBqID0gODsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworI2lmIChXT1JEX1NJWkU9PTMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgY29kZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCBjb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBEc3QgKz0gb2Zmc2V0OworICAgICAgICBwU3JjICs9IG9mZnNldDsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworQVZDRW5jX1N0YXR1cyBlbmNfcmVzaWR1YWxfYmxvY2soQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1Jlc2lkdWFsVHlwZSB0eXBlLCBpbnQgY2luZHgsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQikKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgaSwgbWF4TnVtQ29lZmYsIG5DOworICAgIGludCBjZGMgPSAwLCBjYWMgPSAwOworICAgIGludCBUcmFpbGluZ09uZXM7CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICB1aW50IHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnOworICAgIGludCB6ZXJvc0xlZnQ7CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgVG90YWxDb2VmZjsKKyAgICBjb25zdCBzdGF0aWMgaW50IGluY1ZsY1tdID0gezAsIDMsIDYsIDEyLCAyNCwgNDgsIDMyNzY4fTsgIC8vIG1heGltdW0gdmxjID0gNgorICAgIGludCBlc2NhcGUsIG51bVByZWZpeCwgc3VmbWFzaywgc3VmZml4LCBzaGlmdCwgc2lnbiwgdmFsdWUsIGFic3ZhbHVlLCB2bGNudW0sIGxldmVsX3R3b19vcl9oaWdoZXI7CisgICAgaW50IGJpbmR4ID0gYmxrSWR4MmJsa1hZW2NpbmR4Pj4yXVtjaW5keCYzXSA7IC8vIHJhc3RlciBzY2FuIGluZGV4CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEFWQ19MdW1hOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNjsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtjaW5keF07CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bltjaW5keF07CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY3Vyck1CLT5uel9jb2VmZltiaW5keF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfSW50cmExNkRDOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNjsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGRjOworICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5kYzsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjaW5keDsgLyogc3BlY2lhbCBjYXNlICovCisgICAgICAgICAgICBiaW5keCA9IDA7CisgICAgICAgICAgICBjaW5keCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfSW50cmExNkFDOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNTsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtjaW5keF07CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bltjaW5keF07CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY3Vyck1CLT5uel9jb2VmZltiaW5keF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfQ2hyb21hREM6ICAvKiBob3cgdG8gZGlmZmVyZW50aWF0ZSBDYiBmcm9tIENyICovCisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDQ7CisgICAgICAgICAgICBjZGMgPSAxOworICAgICAgICAgICAgaWYgKGNpbmR4ID49IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjICsgNDsKKyAgICAgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYyArIDQ7CisgICAgICAgICAgICAgICAgVG90YWxDb2VmZiA9IGNpbmR4IC0gODsgIC8qIHNwZWNpYWwgY2FzZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYzsKKyAgICAgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYzsKKyAgICAgICAgICAgICAgICBUb3RhbENvZWZmID0gY2luZHg7ICAvKiBzcGVjaWFsIGNhc2UgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ19DaHJvbWFBQzoKKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gMTU7CisgICAgICAgICAgICBjYWMgPSAxOworICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsW2NpbmR4XTsKKyAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuW2NpbmR4XTsKKyAgICAgICAgICAgIGNpbmR4IC09IDE2OworICAgICAgICAgICAgYmluZHggPSAxNiArIGJsa0lkeDJibGtYWVtjaW5keD4+Ml1bY2luZHgmM107CisgICAgICAgICAgICBjaW5keCArPSAxNjsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjdXJyTUItPm56X2NvZWZmW2JpbmR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgIH0KKworCisgICAgLyogZmluZCBUcmFpbGluZ09uZXMgKi8KKyAgICBUcmFpbGluZ09uZXMgPSAwOworICAgIHplcm9zTGVmdCA9IDA7CisgICAgaSA9IFRvdGFsQ29lZmYgLSAxOworICAgIG5DID0gMTsKKyAgICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgICAgemVyb3NMZWZ0ICs9IHJ1bltpXTsKKyAgICAgICAgaWYgKG5DICYmIChsZXZlbFtpXSA9PSAxIHx8IGxldmVsW2ldID09IC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhaWxpbmdPbmVzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuQyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaS0tOworICAgIH0KKyAgICBpZiAoVHJhaWxpbmdPbmVzID4gMykKKyAgICB7CisgICAgICAgIFRyYWlsaW5nT25lcyA9IDM7IC8qIGNsaXAgaXQgKi8KKyAgICB9CisKKyAgICBpZiAoIWNkYykKKyAgICB7CisgICAgICAgIGlmICghY2FjKSAgLyogbm90IGNocm9tYSAqLworICAgICAgICB7CisgICAgICAgICAgICBuQyA9IHByZWRpY3Rfbm56KHZpZGVvLCBiaW5keCAmIDMsIGJpbmR4ID4+IDIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY2hyb21hIGFjIGJ1dCBub3QgY2hyb21hIGRjICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG5DID0gcHJlZGljdF9ubnpfY2hyb21hKHZpZGVvLCBiaW5keCAmIDMsIGJpbmR4ID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhzdHJlYW0sIFRyYWlsaW5nT25lcywgVG90YWxDb2VmZiwgbkMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuQyA9IC0xOyAvKiBDaHJvbWEgREMgbGV2ZWwgKi8KKyAgICAgICAgc3RhdHVzID0gY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKHN0cmVhbSwgVHJhaWxpbmdPbmVzLCBUb3RhbENvZWZmKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIHBhcnQgaXMgZG9uZSBxdWl0ZSBkaWZmZXJlbnRseSBpbiBSZWFkQ29lZjR4NF9DQVZMQygpICovCisgICAgaWYgKFRvdGFsQ29lZmYgPiAwKQorICAgIHsKKworICAgICAgICBpID0gVG90YWxDb2VmZiAtIDE7CisKKyAgICAgICAgaWYgKFRyYWlsaW5nT25lcykgLyoga2VlcCByZWFkaW5nIHRoZSBzaWduIG9mIHRob3NlIHRyYWlsaW5nIG9uZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbkMgPSBUcmFpbGluZ09uZXM7CisgICAgICAgICAgICB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSAobkMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcgPDw9IDE7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcgfD0gKCh1aW50MzIpbGV2ZWxbaS0tXSA+PiAzMSk7IC8qIDAgb3IgcG9zaXRpdmUsIDEgZm9yIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgbkMtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaW5zdGVhZCBvZiB3cml0aW5nIG9uZSBiaXQgYXQgYSB0aW1lLCByZWFkIHRoZSB3aG9sZSB0aGluZyBhdCBvbmNlICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBUcmFpbGluZ09uZXMsIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAxOworICAgICAgICBpZiAoVG90YWxDb2VmZiA+IDMgJiYgVHJhaWxpbmdPbmVzID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFRvdGFsQ29lZmYgPiAxMCAmJiBUcmFpbGluZ09uZXMgPCAzKQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRoZW4gZG8gdGhpcyBUb3RhbENvZWZmLVRyYWlsaW5nT25lcyB0aW1lcyAqLworICAgICAgICBmb3IgKGkgPSBUb3RhbENvZWZmIC0gVHJhaWxpbmdPbmVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gbGV2ZWxbaV07CisgICAgICAgICAgICBhYnN2YWx1ZSA9ICh2YWx1ZSA+PSAwKSA/IHZhbHVlIDogLXZhbHVlOworCisgICAgICAgICAgICBpZiAobGV2ZWxfdHdvX29yX2hpZ2hlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAwKSB2YWx1ZS0tOworICAgICAgICAgICAgICAgIGVsc2UgICAgdmFsdWUrKzsKKyAgICAgICAgICAgICAgICBsZXZlbF90d29fb3JfaGlnaGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbHVlID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAtdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2bGNudW0gPT0gMCkgLy8gVkxDMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCB2YWx1ZSAqIDIgKyBzaWduIC0gMSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgOCArIDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNCArIDEgKyA0LCAoMSA8PCA0KSB8ICgodmFsdWUgLSA4KSA8PCAxKSB8IHNpZ24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNCArIDIgKyAxMiwgKDEgPDwgMTIpIHwgKCh2YWx1ZSAtIDE2KSA8PCAxKSB8IHNpZ24pIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvLyBWTENOCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2hpZnQgPSB2bGNudW0gLSAxOworICAgICAgICAgICAgICAgIGVzY2FwZSA9ICgxNSA8PCBzaGlmdCkgKyAxOworICAgICAgICAgICAgICAgIG51bVByZWZpeCA9ICh2YWx1ZSAtIDEpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIHN1Zm1hc2sgPSB+KCgweGZmZmZmZmZmKSA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gKHZhbHVlIC0gMSkgJiBzdWZtYXNrOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IGVzY2FwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIG51bVByZWZpeCArIHZsY251bSArIDEsICgxIDw8IChzaGlmdCArIDEpKSB8IChzdWZmaXggPDwgMSkgfCBzaWduKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMjgsICgxIDw8IDEyKSB8ICgodmFsdWUgLSBlc2NhcGUpIDw8IDEpIHwgc2lnbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhYnN2YWx1ZSA+IGluY1ZsY1t2bGNudW1dKQorICAgICAgICAgICAgICAgIHZsY251bSsrOworCisgICAgICAgICAgICBpZiAoaSA9PSBUb3RhbENvZWZmIC0gVHJhaWxpbmdPbmVzIC0gMSAmJiBhYnN2YWx1ZSA+IDMpCisgICAgICAgICAgICAgICAgdmxjbnVtID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiBvY2Nhc2lvbmFsbHkgY2hlY2sgdGhlIGJpdHN0cmVhbSAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChUb3RhbENvZWZmIDwgbWF4TnVtQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2RjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlX1RvdGFsWmVyb3Moc3RyZWFtLCB6ZXJvc0xlZnQsIFRvdGFsQ29lZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlX1RvdGFsWmVyb3NDaHJvbWFEQyhzdHJlYW0sIHplcm9zTGVmdCwgVG90YWxDb2VmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvc0xlZnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaSA9IFRvdGFsQ29lZmYgLSAxOworICAgICAgICB3aGlsZSAoaSA+IDApIC8qIGRvbid0IGRvIHRoZSBsYXN0IG9uZSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoemVyb3NMZWZ0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZV9SdW5CZWZvcmUoc3RyZWFtLCBydW5baV0sIHplcm9zTGVmdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IHplcm9zTGVmdCAtIHJ1bltpXTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2FjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkLmNwcApAQCAtMCwwICsxLDI5MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FkX2lubGluZS5oIgorCisjZGVmaW5lIENhY2hlZF9seCAxNzYKKworI2lmZGVmIF9TQURfU1RBVAordWludDMyIG51bV9zYWRfTUIgPSAwOwordWludDMyIG51bV9zYWRfQmxrID0gMDsKK3VpbnQzMiBudW1fc2FkX01CX2NhbGwgPSAwOwordWludDMyIG51bV9zYWRfQmxrX2NhbGwgPSAwOworCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpICAgICAgIG51bV9zYWRfTUJfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfTUIoKSAgICAgICAgICAgIG51bV9zYWRfTUIrKworI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkgICAgICBudW1fc2FkX0Jsa19jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKSAgICAgICAgICAgbnVtX3NhZF9CbGsrKworCisjZWxzZQorCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfTUIoKQorI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKQorCisjZW5kaWYKKworCisvKiBjb25zaXN0IG9mCitpbnQgQVZDU0FEX01hY3JvYmxvY2tfQyh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hURk0odWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCBseCx2b2lkICpleHRyYV9pbmZvKQorKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFNBRF9NYWNyb2Jsb2NrCisgICAgRGF0ZTogICAgICAgMDkvMDcvMjAwMAorICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYuCisgICAgVG8gZG86ICAgICAgVW5pZm9ybSBzdWJzYW1wbGluZyB3aWxsIGJlIGluc2VydGVkIGxhdGVyIQorICAgICAgICAgICAgICAgIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nIHRvIGJlIHVzZWQgbGF0ZXIhCisgICAgQ2hhbmdlczoKKyAgICAxMS83LzAwOiAgICBpbXBsZW1lbnRlZCBNTVgKKyAgICAxLzI0LzAxOiAgICBpbXBsZW1lbnRlZCBTU0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioqKioqKioqKiBDICoqKioqKioqKioqKi8KK2ludCBBVkNTQURfTWFjcm9ibG9ja19DKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludDMyIHgxMDsKKyAgICBpbnQgZG1pbiA9ICh1aW50MzIpZG1pbl9seCA+PiAxNjsKKyAgICBpbnQgbHggPSBkbWluX2x4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICB4MTAgPSBzaW1kX3NhZF9tYihyZWYsIGJsaywgZG1pbiwgbHgpOworCisgICAgcmV0dXJuIHgxMDsKK30KKworI2lmZGVmIEhURk0gICAvKiBIVEZNIHdpdGggdW5pZm9ybSBzdWJzYW1wbGluZyBpbXBsZW1lbnRhdGlvbiAyLzI4LzAxICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0FWQ1NBRF9NQl9IVEZNX0NvbGxlY3QgYW5kIEFWQ1NBRF9NQl9IVEZNCisgICAgRGF0ZTogICAgICAgMy8yLzEKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gYSAxNngxNiBibG9jayB1c2luZworICAgICAgICAgICAgICAgIHVuaWZvcm0gc3Vic2FtcGxpbmcgYW5kIGh5cG90aGVzaXMgdGVzdGluZyBmYXN0IG1hdGNoaW5nCisgICAgICAgICAgICAgICAgZm9yIGVhcmx5IGRyb3BvdXQuIFNBRF9NQl9IUF9IVEZNX0NvbGxlY3QgaXMgdG8gY29sbGVjdAorICAgICAgICAgICAgICAgIHRoZSBzdGF0aXN0aWNzIHRvIGNvbXB1dGUgdGhlIHRocmVzaG9sZHMgdG8gYmUgdXNlZCBpbgorICAgICAgICAgICAgICAgIFNBRF9NQl9IUF9IVEZNLgorICAgIElucHV0L091dHB1dDoKKyAgICBDaGFuZ2VzOgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgQVZDQVZDU0FEX01CX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDE7CisgICAgaW50IGx4NCA9IChkbWluX2x4IDw8IDIpICYgMHgzRkZGQzsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisgICAgaW50IHNhZGRhdGFbMTZdLCB0bXAsIHRtcDI7ICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICB1aW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX2x4ID4+IDIwOworCisgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgTlVNX1NBRF9NQigpOworCisgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHVpbnQzMilzYWQgPiAoKHVpbnQzMilkbWluX2x4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICgqY291bnRicmVhaykrKzsKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hURk0odWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxOworCisgICAgaW50IGk7CisgICAgaW50IHRtcCwgdG1wMjsKKyAgICBpbnQgbHg0ID0gKGRtaW5fbHggPDwgMikgJiAweDNGRkZDOworICAgIGludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICBpbnQgKm5ybWx6X3RoID0gKGludCopIGV4dHJhX2luZm87CisgICAgaW50ICpvZmZzZXRSZWYgPSAoaW50KikgZXh0cmFfaW5mbyArIDMyOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fbHggPj4gMjA7CisKKyAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBOVU1fU0FEX01CKCk7CisKKyAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICBpZiAoKCh1aW50MzIpc2FkIDw9ICgodWludDMyKWRtaW5fbHggPj4gMTYpKSAmJiAoc2FkIDw9IChzYWRzdGFyIC0gKm5ybWx6X3RoKyspKSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisjZW5kaWYgLyogSFRGTSAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMjE5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKQEAgLTAsMCArMSw2MjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBjb250YWlucworaW50IEFWQ0hhbGZQZWwxX1NBRF9NQih1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCBpaCxpbnQgamgpCitpbnQgQVZDSGFsZlBlbDJfU0FEX01CKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgpCitpbnQgQVZDSGFsZlBlbDFfU0FEX0Jsayh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCBpaCxpbnQgamgpCitpbnQgQVZDSGFsZlBlbDJfU0FEX0Jsayh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoKQorCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQyh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hQX0hURk0odWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgcngsaW50IHhoLGludCB5aCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9CbGtfSGFsZlBlbF9DKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IHJ4LGludCB4aCxpbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKKyovCisKKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FkX2hhbGZwZWxfaW5saW5lLmgiCisKKyNpZmRlZiBfU0FEX1NUQVQKK3VpbnQzMiBudW1fc2FkX0hQX01CID0gMDsKK3VpbnQzMiBudW1fc2FkX0hQX0JsayA9IDA7Cit1aW50MzIgbnVtX3NhZF9IUF9NQl9jYWxsID0gMDsKK3VpbnQzMiBudW1fc2FkX0hQX0Jsa19jYWxsID0gMDsKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQl9DQUxMKCkgICAgbnVtX3NhZF9IUF9NQl9jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQigpICAgICAgICAgbnVtX3NhZF9IUF9NQisrCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLX0NBTEwoKSAgIG51bV9zYWRfSFBfQmxrX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0hQX0JMSygpICAgICAgICBudW1fc2FkX0hQX0JsaysrCisjZWxzZQorI2RlZmluZSBOVU1fU0FEX0hQX01CX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0hQX01CKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEtfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLKCkKKyNlbmRpZgorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBTQURfTUJfSGFsZlBlbAorICAgIERhdGU6ICAgICAgIDA5LzE3LzIwMDAKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gdGhlIGhhbGYtcGVsIHJlc29sdXRpb24KKyAgICBJbnB1dC9PdXRwdXQ6ICAgaG1lbSBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgc3RhcnRpbmcKKyAgICAgICAgICAgICAgICBwb2ludCBvZiB0aGUgc2VhcmNoIGluIHRoZSAzM3gzMyBtYXRyaXggc2VhcmNoIHJlZ2lvbgorICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgaW1wbGVtZW50ZWQgTU1YCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ1NBRF9NQl9IYWxmUGVsX0MKKyAgICBEYXRlOiAgICAgICAwNC8zMC8yMDAxCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgMTZ4MTYgYmV0d2VlbiBibGsgYW5kIHJlZiBpbiBoYWxmcGVsCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiwKKyAgICBDaGFuZ2VzOgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogT25lIGNvbXBvbmVudCBpcyBoYWxmLXBlbCAqLworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpraywgKnAxLCAqcDIsICpwMywgKnA0OworLy8gIGludCBzdW1yZWY9MDsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBwMSA9IHJlZjsKKyAgICBwMiA9IHJlZiArIDE7CisgICAgcDMgPSByZWYgKyByeDsKKyAgICBwNCA9IHJlZiArIHJ4ICsgMTsKKyAgICBrayAgPSBibGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKworICAgICAgICBwMSArPSByeDsKKyAgICAgICAgcDMgKz0gcng7CisgICAgICAgIHAyICs9IHJ4OworICAgICAgICBwNCArPSByeDsKKyAgICB9CisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICAodm9pZCkoZXh0cmFfaW5mbyk7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqa2ssICpwMSwgKnAyOworLy8gIGludCBzdW1yZWY9MDsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBwMSA9IHJlZjsKKyAgICBwMiA9IHJlZiArIHJ4OyAvKiBlaXRoZXIgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tIHBpeGVsICovCisgICAga2sgID0gYmxrOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworCisgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgcDEgKz0gcng7CisgICAgICAgIHAyICs9IHJ4OworICAgIH0KKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpraywgKnAxOworICAgIGludCB0ZW1wOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIHAxID0gcmVmOworICAgIGtrICA9IGJsazsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMVtqKzFdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgcDEgKz0gcng7CisgICAgfQorICAgIHJldHVybiBzYWQ7Cit9CisKKyNpZmRlZiBIVEZNICAvKiBIVEZNIHdpdGggdW5pZm9ybSBzdWJzYW1wbGluZyBpbXBsZW1lbnRhdGlvbiwgIDIvMjgvMDEgKi8KKworLy9DaGVjaGVjayBoZXJlCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgIGludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICBpbnQgbWFkc3RhcjsKKyAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgIGludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICBpbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIHAyID0gcDEgKyByeDsKKworICAgICAgICBqID0gNDsvKiA0IGxpbmVzICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXSArIHAyWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxM10gKyBwMlsxM107CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XSArIHAyWzhdOworICAgICAgICAgICAgdG1wMiA9IHAxWzldICsgcDJbOV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XSArIHAyWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdICsgcDJbNV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxXSArIHAyWzFdOworICAgICAgICAgICAgdG1wID0gcDFbMF0gKyBwMlswXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMSwgKnAyOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZGRhdGFbMTZdOyAgICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgaW50IG1hZHN0YXI7CisgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgaW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgIGogPSA0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDJbMTJdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls4XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDJbNF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMTsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgaW50IGRpZm1hZCwgdG1wLCB0bXAyOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICBVSW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKworICAgICAgICBqID0gNDsgLyogNCBsaW5lcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDFbMTNdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs5XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICB0bXAyID0gcDFbMV07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hQX0hURk14aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisKKyAgICAgICAgaiA9IDQ7IC8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdICsgcDJbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXSArIHAyWzEzXTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdICsgcDJbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV0gKyBwMls5XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdICsgcDJbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV0gKyBwMls1XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wMiA9IHAxWzFdICsgcDJbMV07CisgICAgICAgICAgICB0bXAgPSBwMVswXSArIHAyWzBdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSFBfSFRGTXloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgIGogPSA0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDJbMTJdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls4XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDJbNF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IUF9IVEZNeGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICB1aW50OCAqcDE7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworCisgICAgICAgIGogPSA0Oy8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgdG1wMiA9IHAxWzFdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKworI2VuZGlmIC8qIEhURk0gKi8KKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMTY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApAQCAtMCwwICsxLDk2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9TQURfSEFMRlBFTF9JTkxJTkVfSF8KKyNkZWZpbmUgX1NBRF9IQUxGUEVMX0lOTElORV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMV9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gKHRtcDIgPj4gMSkgLSB0bXA7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSAodG1wID4+IDIpIC0gdG1wMjsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMV9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcCwgdG1wMiwgYXNyICMxIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAyLCB0bXAsIGFzciAjMiA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CitfX2FzbV9fIHZvbGF0aWxlKCJyc2JzCSUxLCAlMSwgJTIsIGFzciAjMVxuXHRyc2JtaSAlMSwgJTEsICMwXG5cdGFkZCAgJTAsICUwLCAlMSI6ICI9ciIoc2FkKSwgIj1yIih0bXApOiAiciIodG1wMikpOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKK19fYXNtX18gdm9sYXRpbGUoInJzYnMJJTEsICUyLCAlMSwgYXNyICMyXG5cdHJzYm1pICUxLCAlMSwgIzBcblx0YWRkCSUwLCAlMCwgJTEiOiAiPXIiKHNhZCksICI9ciIodG1wKTogInIiKHRtcDIpKTsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvL19TQURfSEFMRlBFTF9JTkxJTkVfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5Nzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaW5saW5lLmgKQEAgLTAsMCArMSw0ODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9TQURfSU5MSU5FX0hfCisjZGVmaW5lIF9TQURfSU5MSU5FX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gdG1wIC0gdG1wMjsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIHg3ID0gc3JjMiBeIHNyYzE7ICAgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgIGlmICgodWludDMyKXNyYzIgPj0gKHVpbnQzMilzcmMxKQorICAgICAgICB7CisgICAgICAgICAgICBzcmMxID0gc3JjMiAtIHNyYzE7ICAgICAvKiBzdWJzICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzcmMxID0gc3JjMSAtIHNyYzI7CisgICAgICAgIH0KKyAgICAgICAgeDcgPSB4NyBeIHNyYzE7ICAgICAvKiBvbmx5IG9kZCBieXRlcyBuZWVkIHRvIGFkZCBjYXJyeSAqLworICAgICAgICB4NyA9IG1hc2sgJiAoKHVpbnQzMil4NyA+PiAxKTsKKyAgICAgICAgeDcgPSAoeDcgPDwgOCkgLSB4NzsKKyAgICAgICAgc3JjMSA9IHNyYzEgKyAoeDcgPj4gNyk7IC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICBzcmMxID0gc3JjMSBeKHg3ID4+IDcpOyAgIC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbiwgaW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKworICAgICAgICB4OCA9ICh1aW50MzIpcmVmICYgMHgzOworICAgICAgICBpZiAoeDggPT0gMykKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQzOworICAgICAgICBpZiAoeDggPT0gMikKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQyOworICAgICAgICBpZiAoeDggPT0gMSkKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQxOworCisvLyAgeDUgPSAoeDQ8PDgpLXg0OyAvKiB4NSA9IHg0KjI1NTsgKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgeDYgPSAweEZGRkYwMEZGOworCisgICAgICAgIHJlZiAtPSBseDsKKyAgICAgICAgYmxrIC09IDE2OworCisgICAgICAgIHg4ID0gMTY7CisKK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDEwID0gKigodWludDMyKikocmVmICs9IGx4KSk7CisgICAgICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDQpKTsKKyAgICAgICAgeDEyID0gKigodWludDMyKikoYmxrICs9IDE2KSk7CisgICAgICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDQpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDExID0gKigodWludDMyKikocmVmICsgMTIpKTsKKyAgICAgICAgeDEyID0gKigodWludDMyKikoYmxrICsgOCkpOworICAgICAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyAxMikpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIGlmICgoaW50KSgodWludDMyKXgxMCA+PiAxNikgPD0gZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC0teDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBMT09QX1NBRDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4pOworCisgICAgfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcCwgdG1wMiA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBFT1IgICAgIHg3LCBzcmMyLCBzcmMxOyAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgICAgIFNVQlMgICAgc3JjMSwgc3JjMiwgc3JjMTsKKyAgICAgICAgICAgIEVPUiAgICAgeDcsIHg3LCBzcmMxOworICAgICAgICAgICAgQU5EICAgICB4NywgbWFzaywgeDcsIGxzciAjMTsKKyAgICAgICAgICAgIE9SUkNDICAgeDcsIHg3LCAjMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIFJTQiAgICAgeDcsIHg3LCB4NywgbHNsICM4OworICAgICAgICAgICAgQUREICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgIC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICAgICAgRU9SICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgIC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbE4oaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPUiAgICAgIHg3LCBzcmMyLCBzcmMxOyAgICAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgICAgIEFERFMgICAgIHNyYzEsIHNyYzIsIHNyYzE7CisgICAgICAgICAgICBFT1IgICAgICB4NywgeDcsIHNyYzE7ICAgICAgLyogb25seSBvZGQgYnl0ZXMgbmVlZCB0byBhZGQgY2FycnkgKi8KKyAgICAgICAgICAgIEFORFMgICAgIHg3LCBtYXNrLCB4NywgcnJ4OworICAgICAgICAgICAgUlNCICAgICAgeDcsIHg3LCB4NywgbHNsICM4OworICAgICAgICAgICAgU1VCICAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgIC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICAgICAgRU9SICAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyNkZWZpbmUgc3VtX2FjY3VtdWxhdGUgIF9fYXNteyAgICAgIFNCQyAgICAgIHg1LCB4NSwgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8gXAorICAgICAgICBCSUMgICAgICB4MTAsIHg2LCB4MTA7ICAgLyogeDEwICYgMHhGRjAwRkYwMCAqLyBcCisgICAgICAgIEFERCAgICAgIHg0LCB4NCwgeDEwLGxzciAjODsgICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8gXAorICAgICAgICBTQkMgICAgICB4NSwgeDUsIHgxMTsgICAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8gXAorICAgICAgICBCSUMgICAgICB4MTEsIHg2LCB4MTE7ICAgLyogeDExICYgMHhGRjAwRkYwMCAqLyBcCisgICAgICAgIEFERCAgICAgIHg0LCB4NCwgeDExLGxzciAjODsgfSAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworCisjZGVmaW5lIE5VTUJFUiAzCisjZGVmaW5lIFNISUZUIDI0CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDIKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCAxNgorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgxMDAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMQorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDgKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKworICAgIF9faW5saW5lIGludDMyIHNpbWRfc2FkX21iKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluLCBpbnQgbHgpCisgICAgeworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBNT1ZTICAgIHg4LCByZWYsIGxzbCAjMzEgOworICAgICAgICAgICAgQkhJICAgICBTYWRNQk9mZnNldDM7CisgICAgICAgICAgICBCQ1MgICAgIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgICAgIEJNSSAgICAgU2FkTUJPZmZzZXQxOworCisgICAgICAgICAgICBNVk4gICAgIHg2LCAjMHhGRjAwOworICAgICAgICB9CitMT09QX1NBRDA6CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMSA9ICooKGludDMyKikocmVmICsgMTIpKTsKKyAgICAgICAgeDEwID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKyAgICAgICAgeDEyID0gKigoaW50MzIqKShibGsgKyA4KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICAgICAgTERSICAgICB4MTEsIFtyZWYsICM0XTsKKyAgICAgICAgICAgIExEUiAgICAgeDEwLCBbcmVmXSwgbHggOworICAgICAgICAgICAgTERSICAgICB4MTQsIFtibGssICM0XTsKKyAgICAgICAgICAgIExEUiAgICAgeDEyLCBbYmxrXSwgIzE2IDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICAgICAgUlNCUyAgICB4MTEsIGRtaW4sIHgxMCwgbHNyICMxNjsKKyAgICAgICAgICAgIEFERExTUyAgeDgsIHg4LCAjMHgxMDAwMDAwMTsKKyAgICAgICAgICAgIEJMUyAgICAgTE9PUF9TQUQwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisgICAgfQorCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworX19hc21fXyB2b2xhdGlsZSgicnNicwklMSwgJTEsICUyXG5cdHJzYm1pICUxLCAlMSwgIzBcblx0YWRkCSUwLCAlMCwgJTEiOiAiPXIiKHNhZCk6ICJyIih0bXApLCAiciIodG1wMikpOworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCitfX2FzbV9fIHZvbGF0aWxlKCJFT1IJJTEsICUyLCAlMFxuXHRTVUJTICAlMCwgJTIsICUwXG5cdEVPUgklMSwgJTEsICUwXG5cdEFORCAgJTEsICUzLCAlMSwgbHNyICMxXG5cdE9SUkNDCSUxLCAlMSwgIzB4ODAwMDAwMDBcblx0UlNCICAlMSwgJTEsICUxLCBsc2wgIzhcblx0QUREICAlMCwgJTAsICUxLCBhc3IgIzdcblx0RU9SICAlMCwgJTAsICUxLCBhc3IgIzciOiAiPXIiKHNyYzEpLCAiPSZyIih4Nyk6ICJyIihzcmMyKSwgInIiKG1hc2spKTsKKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsTihpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKK19fYXNtX18gdm9sYXRpbGUoIkVPUgklMSwgJTIsICUwXG5cdEFERFMgICUwLCAlMiwgJTBcblx0RU9SICAlMSwgJTEsICUwXG5cdEFORFMgICUxLCAlMywgJTEsIHJyeFxuXHRSU0IgICUxLCAlMSwgJTEsIGxzbCAjOFxuXHRTVUIJJTAsICUwLCAlMSwgYXNyICM3XG5cdEVPUiAgICUwLCAlMCwgJTEsIGFzciAjNyI6ICI9ciIoc3JjMSksICI9JnIiKHg3KTogInIiKHNyYzIpLCAiciIobWFzaykpOworCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBzdW1fYWNjdW11bGF0ZSAgX19hc21fXyB2b2xhdGlsZSgiU0JDICAlMCwgJTAsICUxXG5cdEJJQyAgICUxLCAlNCwgJTFcblx0QUREICAgJTIsICUyLCAlMSwgbHNyICM4XG5cdFNCQyAgICUwLCAlMCwgJTNcblx0QklDICAgJTMsICU0LCAlM1xuXHRBREQgICAlMiwgJTIsICUzLCBsc3IgIzgiOiAiPSZyIiAoeDUpLCAiPSZyIiAoeDEwKSwgIj0mciIgKHg0KSwgIj0mciIgKHgxMSk6ICJyIiAoeDYpKTsKKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MTAwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbiwgaW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgaWYgKHg4ID09IDMpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgaWYgKHg4ID09IDIpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgaWYgKHg4ID09IDEpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MTsKKworICAgICAgICB4OCA9IDE2OworLy8vCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4JJTAsICMweEZGMDAiOiAiPXIiKHg2KSk7CisKK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworICAgICAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMSA9ICooKGludDMyKikocmVmICsgNCkpOworX19hc21fXyB2b2xhdGlsZSgiTERSCSUwLCBbJTFdLCAlMiI6ICI9JnIiKHgxMCksICI9ciIocmVmKTogInIiKGx4KSk7CisgICAgICAgIC8veDEwID0gKigoaW50MzIqKXJlZik7IHJlZis9bHg7CisgICAgICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgNCkpOworX19hc21fXyB2b2xhdGlsZSgiTERSCSUwLCBbJTFdLCAjMTYiOiAiPSZyIih4MTIpLCAiPXIiKGJsaykpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworCisgICAgICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9IGRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLXg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gTE9PUF9TQUQwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluKTsKKyAgICB9CisKKworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfU0FEX0lOTElORV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX21iX29mZnNldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ0YTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApAQCAtMCwwICsxLDMxMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Myh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgLy8gIHg1ID0gKHg0PDw4KSAtIHg0OworICAgIHg0ID0geDUgPSAwOworICAgIHg2ID0gMHhGRkZGMDBGRjsKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHJlZiAtPSBOVU1CRVI7IC8qIGJpYyByZWYsIHJlZiwgIzMgKi8KKyAgICByZWYgLT0gbHg7CisgICAgYmxrIC09IDE2OworICAgIHg4ID0gMTY7CisKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArPSBseCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgNCkpOyAgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgOCkpOyAgICAvKiBMIEsgSiBJICovCisKKyAgICB4MTAgPSAoKHVpbnQzMil4MTAgPj4gU0hJRlQpOyAvKiAwIDAgMCBEICovCisgICAgeDEwID0geDEwIHwgKHgxMSA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogRyBGIEUgRCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDAgMCAwIEggKi8KKyAgICB4MTEgPSB4MTEgfCAoeDEyIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBLIEogSSBIICovCisKKyAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKz0gMTYpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyA0KSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOyAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyAxNikpOyAgIC8qIEwgSyBKIEkgKi8KKworICAgIHgxMCA9ICgodWludDMyKXgxMCA+PiBTSElGVCk7IC8qIG12biB4MTAsIHgxMCwgbHNyICMyNCAgPSAweEZGIDB4RkYgMHhGRiB+RCAqLworICAgIHgxMCA9IHgxMCB8ICh4MTEgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIGJpYyB4MTAsIHgxMCwgeDExLCBsc2wgIzggPSB+RyB+RiB+RSB+RCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDB4RkYgMHhGRiAweEZGIH5IICovCisgICAgeDExID0geDExIHwgKHgxMiA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogfksgfkogfkkgfkggKi8KKworICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArIDgpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyAxMikpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoaW50KSgodWludDMyKXgxMCA+PiAxNikgPD0gZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICB4NCA9IHg1ID0gMDsKKworICAgIF9fYXNteworICAgICAgICBNVk4gICAgICB4NiwgIzB4ZmYwMDAwOworI2lmIChOVU1CRVI9PTMpCitMT09QX1NBRDM6CisjZWxpZiAoTlVNQkVSPT0yKQorTE9PUF9TQUQyOgorI2VsaWYgKE5VTUJFUj09MSkKK0xPT1BfU0FEMToKKyNlbmRpZgorICAgICAgICBCSUMgICAgICByZWYsIHJlZiwgIzM7CisgICAgfQorICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgMTYpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICBfX2FzbXsKKyAgICAgICAgTVZOICAgICAgeDEwLCB4MTAsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMCwgeDEwLCB4MTEsIGxzbCAjKDMyLVNISUZUKTsKKyAgICAgICAgTVZOICAgICAgeDExLCB4MTEsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMSwgeDExLCB4MTIsIGxzbCAjKDMyLVNISUZUKTsKKworICAgICAgICBMRFIgICAgICB4MTIsIFtibGssICM4XTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIF9fYXNteworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICBMRFIgICAgICB4MTEsIFtyZWYsICM0XTsKKyAgICAgICAgTERSICAgICAgeDEyLCBbcmVmLCAjOF07CisgICAgICAgIExEUiAgeDEwLCBbcmVmXSwgbHggOworICAgICAgICBMRFIgIHgxNCwgW2JsaywgIzRdOworCisgICAgICAgIE1WTiAgICAgIHgxMCwgeDEwLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTAsIHgxMCwgeDExLCBsc2wgIygzMi1TSElGVCk7CisgICAgICAgIE1WTiAgICAgIHgxMSwgeDExLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTEsIHgxMSwgeDEyLCBsc2wgIygzMi1TSElGVCk7CisKKyAgICAgICAgTERSICAgICAgeDEyLCBbYmxrXSwgIzE2OworICAgIH0KKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgX19hc217CisgICAgICAgIFJTQlMgICAgIHgxMSwgZG1pbiwgeDEwLCBsc3IgIzE2CisgICAgICAgIEFERExTUyAgIHg4LCB4OCwgI0lOQ19YOAorI2lmIChOVU1CRVI9PTMpCisgICAgICAgIEJMUyAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCitCTFMgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorQkxTICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Myh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICB4NCA9IHg1ID0gMDsKKyAgICB4OCA9IDE2OyAvLzw8PT09PT09PT09PT0qKioqKioqCisKK19fYXNtX18gdm9sYXRpbGUoIk1WTgklMCwgIzB4RkYwMDAwIjogIj1yIih4NikpOworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCitfX2FzbV9fIHZvbGF0aWxlKCJCSUMgICUwLCAlMCwgIzMiOiAiPXIiKHJlZikpOworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgMTYpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisKKyNpZiAoU0hJRlQ9PTgpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjOFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMjRcblx0TVZOICAgJTEsICUxLGxzciAjOFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMjQiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTE2KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzE2XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICMxNlxuXHRNVk4gICAlMSwgJTEsbHNyICMxNlxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMTYiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTI0KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzI0XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICM4XG5cdE1WTiAgICUxLCAlMSxsc3IgIzI0XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICM4IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VuZGlmCisKKyAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDQpKTsKKyAgICB4MTIgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopcmVmKTsgcmVmICs9IGx4OworICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgNCkpOworCisjaWYgKFNISUZUPT04KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzhcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzI0XG5cdE1WTiAgICUxLCAlMSxsc3IgIzhcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzI0IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0xNikKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMxNlxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMTZcblx0TVZOICAgJTEsICUxLGxzciAjMTZcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzE2IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0yNCkKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMyNFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjOFxuXHRNVk4gICAlMSwgJTEsbHNyICMyNFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjOCI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbmRpZgorX19hc21fXyB2b2xhdGlsZSgiTERSICAgJTAsIFslMV0sICMxNiI6ICI9JnIiKHgxMiksICI9ciIoYmxrKSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9ICh1aW50MzIpZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCitnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NsaWNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zbGljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMDY2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zbGljZS5jcHAKQEAgLTAsMCArMSwxMDI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworCitBVkNFbmNfU3RhdHVzIEFWQ0VuY29kZVNsaWNlKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwcHMgPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CIDsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIHVpbnQgc2xpY2VfZ3JvdXBfaWQ7CisgICAgaW50IEN1cnJNYkFkZHIsIHNsaWNlX3R5cGU7CisKKyAgICBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICAvKiBzZXQgdGhlIGZpcnN0IG1iIGluIHNsaWNlICovCisgICAgdmlkZW8tPm1iTnVtID0gQ3Vyck1iQWRkciA9IHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZTsvLyAqICgxK3ZpZGVvLT5NYmFmZkZyYW1lRmxhZyk7CisgICAgc2xpY2VfZ3JvdXBfaWQgPSB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXBbQ3Vyck1iQWRkcl07CisKKyAgICB2aWRlby0+bWJfc2tpcF9ydW4gPSAwOworCisgICAgLyogd2hpbGUgbG9vcCAsIHNlZSBzdWJjbGF1c2UgNy4zLjQgKi8KKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5tYk51bSA9IEN1cnJNYkFkZHI7CisgICAgICAgIGN1cnJNQiA9IHZpZGVvLT5jdXJyTUIgPSAmKHZpZGVvLT5tYmxvY2tbQ3Vyck1iQWRkcl0pOworICAgICAgICBjdXJyTUItPnNsaWNlX2lkID0gdmlkZW8tPnNsaWNlX2lkOyAgLy8gZm9yIGRlYmxvY2tpbmcKKworICAgICAgICB2aWRlby0+bWJfeCA9IEN1cnJNYkFkZHIgJSB2aWRlby0+UGljV2lkdGhJbk1iczsKKyAgICAgICAgdmlkZW8tPm1iX3kgPSBDdXJyTWJBZGRyIC8gdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBRUCBmb3IgdGhpcyBNQiBoZXJlKi8KKyAgICAgICAgLyogY2FsY3VsYXRlIGN1cnJNQi0+UVB5ICovCisgICAgICAgIFJDSW5pdE1CUVAoZW5jdmlkKTsKKworICAgICAgICAvKiBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIG5laWdoYm9yaW5nIG1hY3JvYmxvY2tzICovCisgICAgICAgIEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSh2aWRlbywgQ3Vyck1iQWRkcik7CisKKyAgICAgICAgLyogQXNzdW1pbmcgdGhhdCBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkgaGFzIGJlZW4gY2FsbGVkIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKKyAgICAgICAgLyogdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGFsbCBzdWJzZXF1ZW50IGludHJhIHNlYXJjaCAqLworCisgICAgICAgIGlmICghdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1iQXZhaWxBOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1iQXZhaWxCOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1iQXZhaWxDOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1iQXZhaWxEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYl9pbnRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJfaW50cmEgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJDXS5tYl9pbnRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyRF0ubWJfaW50cmE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBlbmNvZGVfb25lX21hY3JvYmxvY2soKSAqLworICAgICAgICBzdGF0dXMgPSBFbmNvZGVNQihlbmN2aWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdvIHRvIG5leHQgTUIgKi8KKyAgICAgICAgQ3Vyck1iQWRkcisrOworCisgICAgICAgIHdoaWxlICgodWludCl2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXBbQ3Vyck1iQWRkcl0gIT0gc2xpY2VfZ3JvdXBfaWQgJiYKKyAgICAgICAgICAgICAgICAodWludClDdXJyTWJBZGRyIDwgdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgQ3Vyck1iQWRkcisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1aW50KUN1cnJNYkFkZHIgPj0gdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZW5kIG9mIHNsaWNlLCByZXR1cm4sIGJ1dCBiZWZvcmUgdGhhdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIHNsaWNlcworICAgICAgICAgICAgdG8gYmUgZW5jb2RlZC4gKi8KKyAgICAgICAgICAgIGVuY3ZpZC0+Y3VyclNsaWNlR3JvdXArKzsKKyAgICAgICAgICAgIGlmIChlbmN2aWQtPmN1cnJTbGljZUdyb3VwID4gKGludClwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxKSAvKiBubyBtb3JlIHNsaWNlIGdyb3VwICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1BJQ1RVUkVfUkVBRFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZmluZCBmaXJzdF9tYl9udW0gZm9yIHRoZSBuZXh0IHNsaWNlICovCisgICAgICAgICAgICAgICAgQ3Vyck1iQWRkciA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcFtDdXJyTWJBZGRyXSAhPSBlbmN2aWQtPmN1cnJTbGljZUdyb3VwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodWludClDdXJyTWJBZGRyIDwgdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN1cnJNYkFkZHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KUN1cnJNYkFkZHIgPj0gdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19TTElDRV9FTVBUWTsgLyogZXJyb3IsIG9uZSBzbGljZSBncm91cCBoYXMgbm8gTUJzIGluIGl0ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlkZW8tPm1iTnVtID0gQ3Vyck1iQWRkcjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+bWJfc2tpcF9ydW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgc2tpcF9ydW4gKi8KKyAgICAgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCB2aWRlby0+bWJfc2tpcF9ydW4pOworICAgICAgICAgICAgdmlkZW8tPm1iX3NraXBfcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK0FWQ0VuY19TdGF0dXMgRW5jb2RlTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBBVkNGcmFtZUlPICAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBBVkNNYWNyb2Jsb2NrICpNQl9BLCAqTUJfQjsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgdWludDggKmN1ciwgKmN1ckwsICpjdXJDYiwgKmN1ckNyOworICAgIHVpbnQ4ICpvcmdMLCAqb3JnQ2IsICpvcmdDciwgKm9yZzQ7CisgICAgaW50IEN1cnJNYkFkZHIgPSB2aWRlby0+bWJOdW07CisgICAgaW50IHBpY1BpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgeF9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBpbnQgeV9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeSA8PCA0KTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBiOCwgYjQsIGJsa2lkeDsKKyAgICBBVkNSZXNpZHVhbFR5cGUgIHJlc1R5cGU7CisgICAgaW50IHNsaWNlX3R5cGU7CisgICAgaW50IG51bWNvZWZmOyAvKiBvdXRwdXQgZnJvbSByZXNpZHVhbF9ibG9ja19jYXZsYyAqLworICAgIGludCBjb3N0MTYsIGNvc3Q4OworCisgICAgaW50IG51bV9iaXRzLCBzdGFydF9tYl9iaXRzLCBzdGFydF90ZXh0X2JpdHM7CisKKyAgICBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICAvKiBub3csIHBvaW50IHRvIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lICovCisgICAgb2Zmc2V0ID0geV9wb3NpdGlvbiAqIHBpY1BpdGNoICsgeF9wb3NpdGlvbjsKKyAgICBjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7CisgICAgb3JnTCA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQ7CisgICAgb2Zmc2V0ID0gKG9mZnNldCArIHhfcG9zaXRpb24pID4+IDI7CisgICAgY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgY3VyQ3IgPSBjdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisgICAgb3JnQ2IgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0OworICAgIG9yZ0NyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgIGlmIChvcmdQaXRjaCAhPSBwaWNQaXRjaCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHlfcG9zaXRpb24gKiAob3JnUGl0Y2ggLSBwaWNQaXRjaCk7CisgICAgICAgIG9yZ0wgKz0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgPj49IDI7CisgICAgICAgIG9yZ0NiICs9IG9mZnNldDsKKyAgICAgICAgb3JnQ3IgKz0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKioqKioqIGRldGVybWluZSBNQiBwcmVkaWN0aW9uIG1vZGUgKioqKioqKi8KKyAgICBpZiAoZW5jdmlkLT5pbnRyYVNlYXJjaFtDdXJyTWJBZGRyXSkKKyAgICB7CisgICAgICAgIE1CSW50cmFTZWFyY2goZW5jdmlkLCBDdXJyTWJBZGRyLCBjdXJMLCBwaWNQaXRjaCk7CisgICAgfQorICAgIC8qKioqKioqIFRoaXMgcGFydCBzaG91bGQgYmUgZGV0ZXJtaW5lZCBzb21laG93ICoqKioqKioqKioqKioqKi8KKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0lfUENNKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgZG93biBtYl90eXBlIGFuZCBQQ00gZGF0YSAqLworICAgICAgICAvKiBhbmQgY29weSBmcm9tIGN1cnJJbnB1dCB0byBjdXJyUGljICovCisgICAgICAgIHN0YXR1cyA9IEVuY29kZUludHJhUENNKGVuY3ZpZCk7CisKKworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qKioqKiogZm9yIGludHJhIHByZWRpY3Rpb24sIHByZWQgaXMgYWxyZWFkeSBkb25lICoqKioqKiovCisgICAgLyoqKioqKiBmb3IgSTQsIHRoZSByZWNvbiBpcyByZWFkeSBhbmQgWGZybSBjb2VmcyBhcmUgcmVhZHkgdG8gYmUgZW5jb2RlZCAqKioqKi8KKworICAgIC8vUkNDYWxjdWxhdGVNQUQoZW5jdmlkLGN1cnJNQixvcmdMLG9yZ1BpdGNoKTsgLy8gbm8gbmVlZCB0byByZS1jYWxjdWxhdGUgTUFEIGZvciBJbnRyYQorICAgIC8vIG5vdCB1c2VkIHNpbmNlIHRvdGFsU0FEIGlzIHVzZWQgaW5zdGVhZAorCisgICAgLyogY29tcHV0ZSB0aGUgcHJlZGljdGlvbiAqLworICAgIC8qIG91dHB1dCBpcyB2aWRlby0+cHJlZF9ibG9jayAqLworICAgIGlmICghY3Vyck1CLT5tYl9pbnRyYSkKKyAgICB7CisgICAgICAgIEFWQ01CTW90aW9uQ29tcChlbmN2aWQsIHZpZGVvKTsgLyogcGVyZm9ybSBwcmVkaWN0aW9uIGFuZCByZXNpZHVlIGNhbGN1bGF0aW9uICovCisgICAgICAgIC8qIHdlIGNhbiBkbyB0aGUgbG9vcCBoZXJlIGFuZCBjYWxsIGRjdF9sdW1hICovCisgICAgICAgIHZpZGVvLT5wcmVkX3BpdGNoID0gcGljUGl0Y2g7CisgICAgICAgIGN1cnJNQi0+Q0JQID0gMDsKKyAgICAgICAgY29zdDE2ID0gMDsKKyAgICAgICAgY3VyID0gY3VyTDsKKyAgICAgICAgb3JnNCA9IG9yZ0w7CisKKyAgICAgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29zdDggPSAwOworCisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJsa2lkeCA9IGJsa0lkeDJibGtYWVtiOF1bYjRdOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gY3VyOworICAgICAgICAgICAgICAgIG51bWNvZWZmID0gZGN0X2x1bWEoZW5jdmlkLCBibGtpZHgsIGN1ciwgb3JnNCwgJmNvc3Q4KTsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0gPSBudW1jb2VmZjsKKyAgICAgICAgICAgICAgICBpZiAobnVtY29lZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+Y2JwNHg0IHw9ICgxIDw8IGJsa2lkeCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IGI4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYjQmMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSAoKHBpY1BpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgICAgIG9yZzQgKz0gKChvcmdQaXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgb3JnNCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbW92ZSB0aGUgSURDVCBwYXJ0IG91dCBvZiBkY3RfbHVtYSB0byBhY2NvbW1vZGF0ZSB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgIGZvciBjb2VmZl9jb3N0LiAqLworCisgICAgICAgICAgICBpZiAoKGN1cnJNQi0+Q0JQJigxIDw8IGI4KSkgJiYgKGNvc3Q4IDw9IF9MVU1BX0NPRUZGX0NPU1RfKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3N0OCA9IDA7IC8vIHJlc2V0IGl0CisKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCBePSAoMSA8PCBiOCk7CisgICAgICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVswXTsKKworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4XSA9IDA7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHgrMV0gPSAwOworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4KzRdID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeCs1XSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvc3QxNiArPSBjb3N0ODsKKworICAgICAgICAgICAgaWYgKGI4JjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyIC09IDg7CisgICAgICAgICAgICAgICAgb3JnNCAtPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1ciArPSAoOCAtIChwaWNQaXRjaCA8PCAzKSk7CisgICAgICAgICAgICAgICAgb3JnNCArPSAoOCAtIChvcmdQaXRjaCA8PCAzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBhZnRlciB0aGUgd2hvbGUgTUIsIHdlIGRvIGFub3RoZXIgY2hlY2sgZm9yIGNvZWZmX2Nvc3QgKi8KKyAgICAgICAgaWYgKChjdXJyTUItPkNCUCYweEYpICYmIChjb3N0MTYgPD0gX0xVTUFfTUJfQ09FRkZfQ09TVF8pKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPkNCUCA9IDA7ICAvLyByZXNldCBpdCB0byB6ZXJvCisgICAgICAgICAgICBtZW1zZXQoY3Vyck1CLT5uel9jb2VmZiwgMCwgc2l6ZW9mKHVpbnQ4KSoxNik7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgd2UgZG8gSURDVAorICAgICAgICBNQkludGVySWRjdCh2aWRlbywgY3VyTCwgY3Vyck1CLCBwaWNQaXRjaCk7CisKKy8vICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSB2aWRlby0+cHJlZCArIDI1NjsKKyAgICB9CisgICAgZWxzZSAgICAvKiBJbnRyYSBwcmVkaWN0aW9uICovCisgICAgeworICAgICAgICBlbmN2aWQtPm51bUludHJhTUIrKzsKKworICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikgLyogZG8gcHJlZGljdGlvbiBmb3IgdGhlIHdob2xlIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5DQlAgPSAwOworICAgICAgICAgICAgLyogZ2V0IHRoZSBwcmVkaWN0aW9uIGZyb20gZW5jdmlkLT5wcmVkX2kxNiAqLworICAgICAgICAgICAgZGN0X2x1bWFfMTZ4MTYoZW5jdmlkLCBjdXJMLCBvcmdMKTsKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+cHJlZF9ibG9jayA9IGVuY3ZpZC0+cHJlZF9pY1tjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGVdOworICAgIH0KKworICAgIC8qIGNocm9taW5hbmNlICovCisgICAgLyogbm90IG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSByZXN1bHQgaXMgaW4gZW5jdmlkLT5wcmVkX2ljCisgICAgY2hyb21hIGRjdCBtdXN0IGJlIGF3YXJlIHRoYXQgcHJlZGljdGlvbiBibG9jayBjYW4gY29tZSBmcm9tIGVpdGhlciBpbnRyYSBvciBpbnRlci4gKi8KKworICAgIGRjdF9jaHJvbWEoZW5jdmlkLCBjdXJDYiwgb3JnQ2IsIDApOworCisgICAgZGN0X2Nocm9tYShlbmN2aWQsIGN1ckNyLCBvcmdDciwgMSk7CisKKworICAgIC8qIDQuMSBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlcmUsIHZpZGVvLT5tYl9za2lwX3J1bisrICovCisgICAgLyogNC4yIGlmIGNvZGVkLCBjaGVjayBpZiB0aGVyZSBpcyBhIHJ1biBvZiBza2lwcGVkIE1CLCBlbmNvZGVzIGl0LAorICAgICAgICAgICAgc2V0IHZpZGVvLT5RUHlwcmV2ID0gY3Vyck1CLT5RUHk7ICovCisKKyAgICAvKiA1LiB2bGMgZW5jb2RlICovCisKKyAgICAvKiBjaGVjayBmb3Igc2tpcHBlZCBtYWNyb2Jsb2NrLCBJTlRFUiBvbmx5ICovCisgICAgaWYgKCFjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgLyogZGVjaWRlIHdoZXRoZXIgdGhpcyBNQiAoZm9yIGludGVyIE1CKSBzaG91bGQgYmUgc2tpcHBlZCBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdC4gKi8KKyAgICAgICAgaWYgKCFjdXJyTUItPkNCUCAmJiBjdXJyTUItPk51bU1iUGFydCA9PSAxICYmIGN1cnJNQi0+UVB5ID09IHZpZGVvLT5RUHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID09IEFWQ19QcmVkX0wwICYmIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1CX0EgPSAmdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV07CisgICAgICAgICAgICAgICAgTUJfQiA9ICZ2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXTsKKworICAgICAgICAgICAgICAgIGlmICghdmlkZW8tPm1iQXZhaWxBIHx8ICF2aWRlby0+bWJBdmFpbEIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5tdkwwWzBdID09IDApIC8qIGJvdGggbXYgY29tcG9uZW50cyBhcmUgemVyb3MuKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tdmRfbDBbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChNQl9BLT5yZWZfaWR4X0wwWzFdID09IDAgJiYgTUJfQS0+bXZMMFszXSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQl9CLT5yZWZfaWR4X0wwWzJdID09IDAgJiYgTUJfQi0+bXZMMFsxMl0gPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm12TDBbMF0gPT0gMCkgLyogYm90aCBtdiBjb21wb25lbnRzIGFyZSB6ZXJvcy4qLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm12ZF9sMFswXVswXVswXSA9PSAwICYmIHZpZGVvLT5tdmRfbDBbMF1bMF1bMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19TS0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1bisrOworCisgICAgICAgICAgICAgICAgLyogc2V0IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAvKiBub3Qgc3VyZSB3aGV0aGVyIHdlIG5lZWQgdGhlIGZvbGxvd2luZ3MgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSBjdXJyTUItPk1iUGFydEhlaWdodCA9IDE2OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID0gQVZDX1ByZWRfTDA7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSBjdXJyTUItPk51bVN1Yk1iUGFydFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzJdID0gY3Vyck1CLT5OdW1TdWJNYlBhcnRbM10gPSAxOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsyXSA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbM10gPSBjdXJyTUItPk1iUGFydFdpZHRoOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFswXSA9IGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMl0gPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFszXSA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID0gQVZDX0RpcmVjdDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBmb3Igc2tpcHBlZCBNQiwgYWx3YXlzIGxvb2sgYXQgdGhlIGZpcnN0IGVudHJ5IGluIFJlZlBpY0xpc3QgKi8KKyAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFswXSA9IGN1cnJNQi0+UmVmSWR4WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFsyXSA9IGN1cnJNQi0+UmVmSWR4WzNdID0gdmlkZW8tPlJlZlBpY0xpc3QwWzBdLT5SZWZJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmV0dXJuIHlldCwgbmVlZCB0byBkbyBzb21lIGNvcGllcyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIG5vbi1za2lwcGVkIE1CICovCisKKworICAgIC8qKioqKioqKioqKioqIFNUQVJUIEVOVFJPUFkgQ09ESU5HICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGFydF9tYl9iaXRzID0gMzIgKyAoZW5jdmlkLT5iaXRzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIGVuY3ZpZC0+Yml0c3RyZWFtLT5iaXRfbGVmdDsKKworICAgIC8qIGVuY29kZSBtYl90eXBlLCBtYl9wcmVkLCBzdWJfbWJfcHJlZCwgQ0JQICovCisgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UgJiYgY3Vyck1CLT5tYk1vZGUgIT0gQVZDX1NLSVApCisgICAgeworICAgICAgICAvL2lmKCFwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZykgIEFMV0FZUyB0cnVlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCB2aWRlby0+bWJfc2tpcF9ydW4pOworICAgICAgICAgICAgdmlkZW8tPm1iX3NraXBfcnVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iTW9kZSAhPSBBVkNfU0tJUCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEVuY29kZU1CSGVhZGVyKGN1cnJNQiwgZW5jdmlkKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXJ0X3RleHRfYml0cyA9IDMyICsgKGVuY3ZpZC0+Yml0c3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBlbmN2aWQtPmJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICAvKioqKiBub3cgZGVjb2RpbmcgcGFydCAqKioqKioqLworICAgIHJlc1R5cGUgPSBBVkNfTHVtYTsKKworICAgIC8qIERDIHRyYW5zZm9ybSBmb3IgbHVtYSBJMTYgbW9kZSAqLworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgQVZDX0ludHJhMTZEQywgZW5jdmlkLT5udW1jb2VmZGMsIGN1cnJNQik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVzVHlwZSA9IEFWQ19JbnRyYTE2QUM7CisgICAgfQorCisgICAgLyogVkxDIGVuY29kaW5nIGZvciBsdW1hICovCisgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPkNCUCYoMSA8PCBiOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCByZXNUeXBlLCAoYjggPDwgMikgKyBiNCwgY3Vyck1CKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaHJvbWEgKi8KKyAgICBpZiAoY3Vyck1CLT5DQlAgJiAoMyA8PCA0KSkgLyogY2hyb21hIERDIHJlc2lkdWFsIHByZXNlbnQgKi8KKyAgICB7CisgICAgICAgIGZvciAoYjggPSAwOyBiOCA8IDI7IGI4KyspIC8qIGZvciBpQ2JDciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiB2bGMgZW5jb2RlIGxldmVsL3J1biAqLworICAgICAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgQVZDX0Nocm9tYURDLCBlbmN2aWQtPm51bWNvZWZjZGNbYjhdICsgKGI4IDw8IDMpLCBjdXJyTUIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+Q0JQICYgKDIgPDwgNCkpCisgICAgeworICAgICAgICAvKiBBQyBwYXJ0ICovCisgICAgICAgIGZvciAoYjggPSAwOyBiOCA8IDI7IGI4KyspIC8qIGZvciBpQ2JDciAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKSAgLyogZm9yIGVhY2ggYmxvY2sgaW5zaWRlIENiIG9yIENyICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCBBVkNfQ2hyb21hQUMsIDE2ICsgKGI4IDw8IDIpICsgYjQsIGN1cnJNQik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBudW1fYml0cyA9IDMyICsgKGVuY3ZpZC0+Yml0c3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBlbmN2aWQtPmJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICBSQ1Bvc3RNQih2aWRlbywgcmF0ZUN0cmwsIHN0YXJ0X3RleHRfYml0cyAtIHN0YXJ0X21iX2JpdHMsCisgICAgICAgICAgICAgbnVtX2JpdHMgLSBzdGFydF90ZXh0X2JpdHMpOworCisvLyAgbnVtX2JpdHMgLT0gc3RhcnRfbWJfYml0czsKKy8vICBmcHJpbnRmKGZkZWJ1ZywiTUIgIyVkOiAlZCBiaXRzXG4iLEN1cnJNYkFkZHIsbnVtX2JpdHMpOworLy8gIGZjbG9zZShmZGVidWcpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIGNvcHkgdGhlIGNvbnRlbnQgZnJvbSBwcmVkQmxvY2sgYmFjayB0byB0aGUgcmVjb25zdHJ1Y3RlZCBZVVYgZnJhbWUgKi8KK3ZvaWQgQ29weV9NQih1aW50OCAqY3VyTCwgdWludDggKmN1ckNiLCB1aW50OCAqY3VyQ3IsIHVpbnQ4ICpwcmVkQmxvY2ssIGludCBwaWNQaXRjaCkKK3sKKyAgICBpbnQgaiwgb2Zmc2V0OworICAgIHVpbnQzMiAqZHN0LCAqZHN0MiwgKnNyYzsKKworICAgIGRzdCA9ICh1aW50MzIqKWN1ckw7CisgICAgc3JjID0gKHVpbnQzMiopcHJlZEJsb2NrOworCisgICAgb2Zmc2V0ID0gKHBpY1BpdGNoIC0gMTYpID4+IDI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKworICAgICAgICBkc3QgKz0gb2Zmc2V0OworICAgIH0KKworICAgIGRzdCA9ICh1aW50MzIqKWN1ckNiOworICAgIGRzdDIgPSAodWludDMyKiljdXJDcjsKKyAgICBvZmZzZXQgPj49IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QyKysgPSAqc3JjKys7CisgICAgICAgICpkc3QyKysgPSAqc3JjKys7CisKKyAgICAgICAgZHN0ICs9IG9mZnNldDsKKyAgICAgICAgZHN0MiArPSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKKy8qIGVuY29kZSBtYl90eXBlLCBtYl9wcmVkLCBzdWJfbWJfcHJlZCwgQ0JQICovCisvKiBkZWNpZGUgd2hldGhlciB0aGlzIE1CIChmb3IgaW50ZXIgTUIpIHNob3VsZCBiZSBza2lwcGVkICovCitBVkNFbmNfU3RhdHVzIEVuY29kZU1CSGVhZGVyKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICB1aW50IG1iX3R5cGU7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisKKyAgICBpZiAoY3Vyck1CLT5DQlAgPiA0NykgICAvKiBjaHJvbWEgQ0JQIGlzIDExICovCisgICAgeworICAgICAgICBjdXJyTUItPkNCUCAtPSAxNjsgIC8qIHJlbW92ZSB0aGUgNXRoIGJpdCBmcm9tIHRoZSByaWdodCAqLworICAgIH0KKworICAgIG1iX3R5cGUgPSBJbnRlcnByZXRNQlR5cGUoY3Vyck1CLCB2aWRlby0+c2xpY2VfdHlwZSk7CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgbWJfdHlwZSk7CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4IHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgeworICAgICAgICBzdGF0dXMgPSBzdWJfbWJfcHJlZCh2aWRlbywgY3Vyck1CLCBzdHJlYW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBtYl9wcmVkKHZpZGVvLCBjdXJyTUIsIHN0cmVhbSkgOworICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iTW9kZSAhPSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgLyogZGVjb2RlIGNvZGVkX2Jsb2NrX3BhdHRlcm4gKi8KKyAgICAgICAgc3RhdHVzID0gRW5jb2RlQ0JQKGN1cnJNQiwgc3RyZWFtKTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgY3Vyck1CLT5tYl9xcF9kZWx0YSA9IGN1cnJNQi0+UVB5IC0gdmlkZW8tPlFQeXByZXYgKi8KKyAgICBpZiAoY3Vyck1CLT5DQlAgPiAwIHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgeworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgY3Vyck1CLT5RUHkgLSB2aWRlby0+UVB5KTsKKyAgICAgICAgdmlkZW8tPlFQeSA9IGN1cnJNQi0+UVB5OyAvKiA9ICh2aWRlby0+UVB5cHJldiArIGN1cnJNQi0+bWJfcXBfZGVsdGEgKyA1MiklNTI7ICovCisgICAgICAgIC8vIG5vIG5lZWQgdmlkZW8tPlFQYyA9IGN1cnJNQi0+UVBjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5RUHkgIT0gdmlkZW8tPlFQeSkgLy8gY3VycmVudCBRUCBpcyBub3QgdGhlIHNhbWUgYXMgcHJldmlvdXMgUVAKKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVzdG9yZSB0aGVzZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgIFJDUmVzdG9yZVFQKGN1cnJNQiwgdmlkZW8sIGVuY3ZpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIGlucHV0cyBhcmUgbWJNb2RlLCBtYl9pbnRyYSwgaTE2TW9kZSwgQ0JQLCBOdW1NYlBhcnQsIE1iUGFydFdpZHRoLCBNYlBhcnRIZWlnaHQgKi8KK3VpbnQgSW50ZXJwcmV0TUJUeXBlKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHNsaWNlX3R5cGUpCit7CisgICAgaW50IENCUF9jaHJvbTsKKyAgICBpbnQgbWJfdHlwZTsvLyBwYXJ0MSwgcGFydDIsIHBhcnQzOworLy8gIGNvbnN0IHN0YXRpYyBpbnQgTWFwUGFydHMyVHlwZVsyXVszXVszXT17e3s0LDgsMTJ9LHsxMCw2LDE0fSx7MTYsMTgsMjB9fSwKKy8vICB7ezUsOSwxM30sezExLDcsMTV9LHsxNywxOSwyMX19fTsKKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgeworICAgICAgICAgICAgbWJfdHlwZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICAgICAgeworICAgICAgICAgICAgQ0JQX2Nocm9tID0gKGN1cnJNQi0+Q0JQICYgMHgzMCk7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5DQlAmMHhGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9IDB4RjsgIC8qIGVpdGhlciAweDAgb3IgMHhGICovCisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWJfdHlwZSArPSAoQ0JQX2Nocm9tID4+IDIpICsgY3Vyck1CLT5pMTZNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0lfUENNKSAqLworICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlID0gMjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIFAtTUIgKi8vKiBub3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBlbnVtIEFWQ01CTW9kZSBjYW5ub3QgYmUgY2hhbmdlZAorICAgICAgICBzaW5jZSB3ZSB1c2UgaXQgaGVyZS4gKi8KKyAgICAgICAgbWJfdHlwZSA9IGN1cnJNQi0+bWJNb2RlIC0gQVZDX1AxNjsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlICs9IDU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gZm9sbG93aW5nIGNvZGVzIGhhdmUgbm90IGJlZW4gdGVzdGVkIHlldCwgbm90IG5lZWRlZC4KKyAgICAvKiAgZWxzZSBpZihzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfQkRpcmVjdDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdICsgMTsgLy8gMSBvciAyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDI3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnQxID0gY3Vyck1CLT5tYk1vZGUgLSBBVkNfUDE2eDg7CisgICAgICAgICAgICAgICAgcGFydDIgPSBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdOworICAgICAgICAgICAgICAgIHBhcnQzID0gY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVsxXVswXTsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gTWFwUGFydHMyVHlwZVtwYXJ0MV1bcGFydDJdW3BhcnQzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNsaWNlX3R5cGUgPT0gQVZDX1NJX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlKys7CisgICAgICAgIH0KKyAgICAqLworICAgIHJldHVybiAodWludCltYl90eXBlOworfQorCisvL2NvbnN0IHN0YXRpYyBpbnQgbWJQYXJ0MnJhc3RlclszXVs0XSA9IHt7MCwwLDAsMH0sezEsMSwwLDB9LHsxLDAsMSwwfX07CisKKy8qIHNlZSBzdWJjbGF1c2UgNy4zLjUuMSAqLworQVZDRW5jX1N0YXR1cyBtYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBpbnQgbWJQYXJ0SWR4OworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBpbnQgbWF4X3JlZl9pZHg7CisgICAgdWludCBjb2RlOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogcGVyZm9ybSBwcmVkaWN0aW9uIHRvIGdldCB0aGUgYWN0dWFsIGludHJhIDR4NCBwcmVkIG1vZGUgKi8KKyAgICAgICAgICAgIEVuY29kZUludHJhNHg0TW9kZSh2aWRlbywgY3Vyck1CLCBzdHJlYW0pOworICAgICAgICAgICAgLyogb3V0cHV0IHdpbGwgYmUgaW4gY3Vyck1CLT5pNE1vZGVbNF1bNF0gKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFzc3VtZSBhbHJlYWR5IHNldCBmcm9tIE1CUHJlZGljdGlvbigpICovCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdICE9IEFWQ19EaXJlY3QpCisgICAgeworCisgICAgICAgIG1lbXNldChjdXJyTUItPnJlZl9pZHhfTDAsIDAsIHNpemVvZihpbnQxNikqNCk7CisKKyAgICAgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgICAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgICAgICAvKiAgICAgIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDE7CisgICAgICAgICovCisgICAgICAgIC8qIGRlY29kZSByZWYgaW5kZXggZm9yIEwwICovCisgICAgICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgvKihzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMT4wIHx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykgJiYqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF07CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRlX3Yoc3RyZWFtLCBjb2RlLCBtYXhfcmVmX2lkeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgICAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOworICAgICAgICAvKiAgICAgIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSArIDE7CisgICAgICAgICovCisgICAgICAgIC8qIGRlY29kZSByZWYgaW5kZXggZm9yIEwxICovCisgICAgICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgvKihzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMT4wIHx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykgJiYqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wxW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBlbmNvZGUgbXZkX2wwICovCisgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bMF1bMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bMF1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGVuY29kZSBtdmRfbDEgKi8KKyAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVswXVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVswXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgc3ViY2xhdXNlIDcuMy41LjIgKi8KK0FWQ0VuY19TdGF0dXMgc3ViX21iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeDsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgdWludCBtYXhfcmVmX2lkeDsKKyAgICB1aW50IHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKyAgICB1aW50IHN1Yl9tYl90eXBlWzRdOworCisgICAgLyogdGhpcyBzaG91bGQgbW92ZSBzb21ld2hlcmUgZWxzZSB3aGVyZSB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgdGhpcyBjaGVjayAqLworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+cmVmX2lkeF9MMCwgMCwgc2l6ZW9mKGludDE2KSo0KTsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSB2YWx1ZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHZhbGlkICAqLworICAgIC8qIGFzc2lnbiB2YWx1ZXMgdG8gY3Vyck1CLT5zdWJfbWJfdHlwZVtdICovCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgeworICAgICAgICBJbnRlcnByZXRTdWJNQlR5cGVQKGN1cnJNQiwgc3ViX21iX3R5cGUpOworICAgIH0KKyAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZvciBCLXNsaWNlCisgICAgICAgIGVsc2UgaWYoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJwcmV0U3ViTUJUeXBlQihjdXJyTUIsc3ViX21iX3R5cGUpOworICAgICAgICB9Ki8KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc3ViX21iX3R5cGVbbWJQYXJ0SWR4XSk7CisgICAgfQorCisgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7CisgICAgLyogIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKyAxOyAqLworCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIGlmICgoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAwIC8qfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKi8pICYmCisgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgIT0gQVZDX1A4cmVmMCAmJiAvKmN1cnJNQi0+c3ViTWJNb2RlW21iUGFydElkeF0hPUFWQ19CRGlyZWN0OCAmJiovCisgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgfQorICAgICAgICAvKiB1c2VkIGluIGRlYmxvY2tpbmcgKi8KKyAgICAgICAgY3Vyck1CLT5SZWZJZHhbbWJQYXJ0SWR4XSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XV0tPlJlZklkeDsKKyAgICB9CisgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7CisgICAgLyogIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKyAxOyovCisKKyAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC8qKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxPjAgfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKSAmJiovCisgICAgICAgICAgICAgICAgLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wxW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBpZiAoLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBpZiAoLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wxW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIGlucHV0IGlzIG1ibG9jay0+c3ViX21iX3R5cGVbXSAqLwordm9pZCBJbnRlcnByZXRTdWJNQlR5cGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpCit7CisgICAgaW50IGk7CisgICAgLyogc2VlIGVudW0gQVZDTUJUeXBlIGRlY2xhcmF0aW9uICovCisgICAgLypjb25zdCBzdGF0aWMgQVZDU3ViTUJNb2RlIG1hcDJzdWJNYk1vZGVbNF0gPSB7QVZDXzh4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzR4NH07CisgICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydFdpZHRoWzRdID0gezgsOCw0LDR9OworICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbNF0gPSB7OCw0LDgsNH07CisgICAgY29uc3Qgc3RhdGljIGludCBtYXAybnVtU3ViUGFydFs0XSA9IHsxLDIsMiw0fTsqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQgOyBpKyspCisgICAgeworICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IG1ibG9jay0+c3ViTWJNb2RlW2ldIC0gQVZDXzh4ODsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIEludGVycHJldFN1Yk1CVHlwZUIoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSkKK3sKKyAgICBpbnQgaTsKKyAgICAvKiBzZWUgZW51bSBBVkNNQlR5cGUgZGVjbGFyYXRpb24gKi8KKyAgICAvKiAgY29uc3Qgc3RhdGljIEFWQ1N1Yk1CTW9kZSBtYXAyc3ViTWJNb2RlWzEzXSA9IHtBVkNfQkRpcmVjdDgsQVZDXzh4OCxBVkNfOHg4LAorICAgICAgICAgICAgQVZDXzh4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzh4NCxBVkNfNHg4LEFWQ184eDQsQVZDXzR4OCxBVkNfNHg0LEFWQ180eDQsQVZDXzR4NH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRXaWR0aFsxM10gPSB7NCw4LDgsOCw4LDQsOCw0LDgsNCw0LDQsNH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbMTNdID0gezQsOCw4LDgsNCw4LDQsOCw0LDgsNCw0LDR9OworICAgICAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJudW1TdWJQYXJ0WzEzXSA9IHs0LDEsMSwxLDIsMiwyLDIsMiwyLDQsNCw0fTsKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBtYXAycHJlZE1vZGVbMTNdID0gezMsMCwxLDIsMCwwLDEsMSwyLDIsMCwxLDJ9OyovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYmxvY2stPnN1Yk1iTW9kZVtpXSA9PSBBVkNfQkRpcmVjdDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtYmxvY2stPnN1Yk1iTW9kZVtpXSA9PSBBVkNfOHg4KQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IDEgKyBtYmxvY2stPk1CUGFydFByZWRNb2RlW2ldWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1ibG9jay0+c3ViTWJNb2RlW2ldID09IEFWQ180eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gMTAgKyBtYmxvY2stPk1CUGFydFByZWRNb2RlW2ldWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX21iX3R5cGVbaV0gPSA0ICsgKG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbaV1bMF0gPDwgMSkgKyAobWJsb2NrLT5zdWJNYk1vZGVbaV0gLSBBVkNfOHg0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qIHNlZSBzdWJjbGF1c2UgOC4zLjEgKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlSW50cmE0eDRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgaW50IGludHJhNHg0UHJlZE1vZGVBID0gMDsKKyAgICBpbnQgaW50cmE0eDRQcmVkTW9kZUIsIHByZWRJbnRyYTR4NFByZWRNb2RlOworICAgIGludCBjb21wb25lbnQsIFN1YkJsb2NrX2luZHgsIGJsb2NrX3gsIGJsb2NrX3k7CisgICAgaW50IGRjT25seVByZWRpY3Rpb25GbGFnOworICAgIHVpbnQgICAgZmxhZzsKKyAgICBpbnQgICAgIHJlbSA9IDA7CisgICAgaW50ICAgICBtb2RlOworICAgIGludCBiaW5keCA9IDA7CisKKyAgICBmb3IgKGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKSAvKiBwYXJ0aXRpb24gaW5kZXggKi8KKyAgICB7CisgICAgICAgIGJsb2NrX3ggPSAoKGNvbXBvbmVudCAmIDEpIDw8IDEpOworICAgICAgICBibG9ja195ID0gKChjb21wb25lbnQgPj4gMSkgPDwgMSk7CisKKyAgICAgICAgZm9yIChTdWJCbG9ja19pbmR4ID0gMDsgU3ViQmxvY2tfaW5keCA8IDQ7IFN1YkJsb2NrX2luZHgrKykgLyogc3ViLXBhcnRpdGlvbiBpbmRleCAqLworICAgICAgICB7CisgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoYmxvY2tfeCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeSA8PCAyKSArIGJsb2NrX3ggLSAxIF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLmk0TW9kZVsoYmxvY2tfeSA8PCAyKSArIDNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBBVkNfSTRfREM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJsb2NrX3kgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gY3Vyck1CLT5pNE1vZGVbKChibG9ja195LTEpIDw8IDIpICsgYmxvY2tfeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLmk0TW9kZVsoMyA8PCAyKSArIGJsb2NrX3hdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRjT25seVByZWRpY3Rpb25GbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZWRJbnRyYTR4NFByZWRNb2RlID0gQVZDX01JTihpbnRyYTR4NFByZWRNb2RlQSwgaW50cmE0eDRQcmVkTW9kZUIpOworCisgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgIG1vZGUgPSBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF07CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IChBVkNJbnRyYTR4NFByZWRNb2RlKXByZWRJbnRyYTR4NFByZWRNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA8IHByZWRJbnRyYTR4NFByZWRNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbSA9IG1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtID0gbW9kZSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIGZsYWcpOworCisgICAgICAgICAgICBpZiAoIWZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMywgcmVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmluZHgrKzsKKyAgICAgICAgICAgIGJsb2NrX3kgKz0gKFN1YkJsb2NrX2luZHggJiAxKSA7CisgICAgICAgICAgICBibG9ja194ICs9ICgxIC0gMiAqIChTdWJCbG9ja19pbmR4ICYgMSkpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJlNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCkBAIC0wLDAgKzEsMzM2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworLyoqCitTZWUgYWxnb3JpdGhtIGluIHN1YmNsYXVzZSA5LjEsIFRhYmxlIDktMSwgVGFibGUgOS0yLiAqLworQVZDRW5jX1N0YXR1cyB1ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pCit7CisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IFNldEVHQml0c3RyaW5nKGJpdHN0cmVhbSwgY29kZU51bSkpCisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyoqCitTZWUgc3ViY2xhdXNlIDkuMS4xLCBUYWJsZSA5LTMgKi8KK0FWQ0VuY19TdGF0dXMgIHNlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIGludCB2YWx1ZSkKK3sKKyAgICB1aW50IGNvZGVOdW07CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAodmFsdWUgPD0gMCkKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSAtdmFsdWUgKiAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2RlTnVtID0gdmFsdWUgKiAyIC0gMTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KGJpdHN0cmVhbSwgY29kZU51bSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBVkNFbmNfU3RhdHVzIHRlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgdmFsdWUsIHVpbnQgcmFuZ2UpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAocmFuZ2UgPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVlX3YoYml0c3RyZWFtLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChiaXRzdHJlYW0sIDEgLSB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfQorCisvKioKK1NlZSBzdWJjbGF1c2UgOS4xLCBUYWJsZSA5LTEsIDktMi4gKi8KKy8vIGNvbXB1dGUgbGVhZGluZ1plcm9zIGFuZCBpbmZvcmJpdHMKKy8vY29kZU51bSA9ICgxPDxsZWFkaW5nWmVyb3MpLTEraW5mb2JpdHM7CitBVkNFbmNfU3RhdHVzIFNldEVHQml0c3RyaW5nKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgaW50IGxlYWRpbmdaZXJvczsKKyAgICBpbnQgaW5mb2JpdHM7CisKKyAgICBpZiAoIWNvZGVOdW0pCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoYml0c3RyZWFtLCAxKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgbGVhZGluZ1plcm9zIGFuZCBpbmZvYml0cyAqLworICAgIGxlYWRpbmdaZXJvcyA9IDE7CisgICAgd2hpbGUgKCh1aW50KSgxIDw8IGxlYWRpbmdaZXJvcykgPCBjb2RlTnVtICsgMikKKyAgICB7CisgICAgICAgIGxlYWRpbmdaZXJvcysrOworICAgIH0KKyAgICBsZWFkaW5nWmVyb3MtLTsKKyAgICBpbmZvYml0cyA9IGNvZGVOdW0gLSAoMSA8PCBsZWFkaW5nWmVyb3MpICsgMTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIGxlYWRpbmdaZXJvcywgMCk7CisgICAgaW5mb2JpdHMgfD0gKDEgPDwgbGVhZGluZ1plcm9zKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCBsZWFkaW5nWmVyb3MgKyAxLCBpbmZvYml0cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIFRhYmxlIDktNCBhc3NpZ25tZW50IG9mIGNvZGVOdW0gdG8gdmFsdWVzIG9mIGNvZGVkX2Jsb2NrX3BhdHRlcm4uICovCitjb25zdCBzdGF0aWMgdWludDggTWFwQ0JQMmNvZGVbNDhdWzJdID0KK3sKKyAgICB7MywgMH0sIHsyOSwgMn0sIHszMCwgM30sIHsxNywgN30sIHszMSwgNH0sIHsxOCwgOH0sIHszNywgMTd9LCB7OCwgMTN9LCB7MzIsIDV9LCB7MzgsIDE4fSwgezE5LCA5fSwgezksIDE0fSwKKyAgICB7MjAsIDEwfSwgezEwLCAxNX0sIHsxMSwgMTZ9LCB7MiwgMTF9LCB7MTYsIDF9LCB7MzMsIDMyfSwgezM0LCAzM30sIHsyMSwgMzZ9LCB7MzUsIDM0fSwgezIyLCAzN30sIHszOSwgNDR9LCB7NCwgNDB9LAorICAgIHszNiwgMzV9LCB7NDAsIDQ1fSwgezIzLCAzOH0sIHs1LCA0MX0sIHsyNCwgMzl9LCB7NiwgNDJ9LCB7NywgNDN9LCB7MSwgMTl9LCB7NDEsIDZ9LCB7NDIsIDI0fSwgezQzLCAyNX0sIHsyNSwgMjB9LAorICAgIHs0NCwgMjZ9LCB7MjYsIDIxfSwgezQ2LCA0Nn0sIHsxMiwgMjh9LCB7NDUsIDI3fSwgezQ3LCA0N30sIHsyNywgMjJ9LCB7MTMsIDI5fSwgezI4LCAyM30sIHsxNCwgMzB9LCB7MTUsIDMxfSwgezAsIDEyfQorfTsKKworQVZDRW5jX1N0YXR1cyBFbmNvZGVDQlAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGNvZGVOdW07CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IE1hcENCUDJjb2RlW2N1cnJNQi0+Q0JQXVswXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IE1hcENCUDJjb2RlW2N1cnJNQi0+Q0JQXVsxXTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgY29kZU51bSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmLCBpbnQgbkMpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IHRvdENvZWZmVHJhaWxPbmVbM11bNF1bMTddWzJdID0KKyAgICB7CisgICAgICAgIHsgICAvLyAwNzAyCisgICAgICAgICAgICB7ezEsIDF9LCB7NiwgNX0sIHs4LCA3fSwgezksIDd9LCB7MTAsIDd9LCB7MTEsIDd9LCB7MTMsIDE1fSwgezEzLCAxMX0sIHsxMywgOH0sIHsxNCwgMTV9LCB7MTQsIDExfSwgezE1LCAxNX0sIHsxNSwgMTF9LCB7MTYsIDE1fSwgezE2LCAxMX0sIHsxNiwgN30sIHsxNiwgNH19LAorICAgICAgICAgICAge3swLCAwfSwgezIsIDF9LCB7NiwgNH0sIHs4LCA2fSwgezksIDZ9LCB7MTAsIDZ9LCB7MTEsIDZ9LCB7MTMsIDE0fSwgezEzLCAxMH0sIHsxNCwgMTR9LCB7MTQsIDEwfSwgezE1LCAxNH0sIHsxNSwgMTB9LCB7MTUsIDF9LCB7MTYsIDE0fSwgezE2LCAxMH0sIHsxNiwgNn19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MywgMX0sIHs3LCA1fSwgezgsIDV9LCB7OSwgNX0sIHsxMCwgNX0sIHsxMSwgNX0sIHsxMywgMTN9LCB7MTMsIDl9LCB7MTQsIDEzfSwgezE0LCA5fSwgezE1LCAxM30sIHsxNSwgOX0sIHsxNiwgMTN9LCB7MTYsIDl9LCB7MTYsIDV9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NSwgM30sIHs2LCAzfSwgezcsIDR9LCB7OCwgNH0sIHs5LCA0fSwgezEwLCA0fSwgezExLCA0fSwgezEzLCAxMn0sIHsxNCwgMTJ9LCB7MTQsIDh9LCB7MTUsIDEyfSwgezE1LCA4fSwgezE2LCAxMn0sIHsxNiwgOH19LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ezIsIDN9LCB7NiwgMTF9LCB7NiwgN30sIHs3LCA3fSwgezgsIDd9LCB7OCwgNH0sIHs5LCA3fSwgezExLCAxNX0sIHsxMSwgMTF9LCB7MTIsIDE1fSwgezEyLCAxMX0sIHsxMiwgOH0sIHsxMywgMTV9LCB7MTMsIDExfSwgezEzLCA3fSwgezE0LCA5fSwgezE0LCA3fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MiwgMn0sIHs1LCA3fSwgezYsIDEwfSwgezYsIDZ9LCB7NywgNn0sIHs4LCA2fSwgezksIDZ9LCB7MTEsIDE0fSwgezExLCAxMH0sIHsxMiwgMTR9LCB7MTIsIDEwfSwgezEzLCAxNH0sIHsxMywgMTB9LCB7MTQsIDExfSwgezE0LCA4fSwgezE0LCA2fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHszLCAzfSwgezYsIDl9LCB7NiwgNX0sIHs3LCA1fSwgezgsIDV9LCB7OSwgNX0sIHsxMSwgMTN9LCB7MTEsIDl9LCB7MTIsIDEzfSwgezEyLCA5fSwgezEzLCAxM30sIHsxMywgOX0sIHsxMywgNn0sIHsxNCwgMTB9LCB7MTQsIDV9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NCwgNX0sIHs0LCA0fSwgezUsIDZ9LCB7NiwgOH0sIHs2LCA0fSwgezcsIDR9LCB7OSwgNH0sIHsxMSwgMTJ9LCB7MTEsIDh9LCB7MTIsIDEyfSwgezEzLCAxMn0sIHsxMywgOH0sIHsxMywgMX0sIHsxNCwgNH19LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ezQsIDE1fSwgezYsIDE1fSwgezYsIDExfSwgezYsIDh9LCB7NywgMTV9LCB7NywgMTF9LCB7NywgOX0sIHs3LCA4fSwgezgsIDE1fSwgezgsIDExfSwgezksIDE1fSwgezksIDExfSwgezksIDh9LCB7MTAsIDEzfSwgezEwLCA5fSwgezEwLCA1fSwgezEwLCAxfX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7NCwgMTR9LCB7NSwgMTV9LCB7NSwgMTJ9LCB7NSwgMTB9LCB7NSwgOH0sIHs2LCAxNH0sIHs2LCAxMH0sIHs3LCAxNH0sIHs4LCAxNH0sIHs4LCAxMH0sIHs5LCAxNH0sIHs5LCAxMH0sIHs5LCA3fSwgezEwLCAxMn0sIHsxMCwgOH0sIHsxMCwgNH19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7NCwgMTN9LCB7NSwgMTR9LCB7NSwgMTF9LCB7NSwgOX0sIHs2LCAxM30sIHs2LCA5fSwgezcsIDEzfSwgezcsIDEwfSwgezgsIDEzfSwgezgsIDl9LCB7OSwgMTN9LCB7OSwgOX0sIHsxMCwgMTF9LCB7MTAsIDd9LCB7MTAsIDN9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NCwgMTJ9LCB7NCwgMTF9LCB7NCwgMTB9LCB7NCwgOX0sIHs0LCA4fSwgezUsIDEzfSwgezYsIDEyfSwgezcsIDEyfSwgezgsIDEyfSwgezgsIDh9LCB7OSwgMTJ9LCB7MTAsIDEwfSwgezEwLCA2fSwgezEwLCAyfX0KKyAgICAgICAgfQorICAgIH07CisKKworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgdWludCBjb2RlLCBsZW47CisgICAgaW50IHZsY251bTsKKworICAgIGlmIChUcmFpbGluZ09uZXMgPiAzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19UUkFJTElOR09ORVNfRkFJTDsKKyAgICB9CisKKyAgICBpZiAobkMgPj0gOCkKKyAgICB7CisgICAgICAgIGlmIChUb3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKChUb3RhbENvZWZmIC0gMSkgPDwgMikgfCAoVHJhaWxpbmdPbmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDYsIGNvZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAobkMgPCAyKQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5DIDwgNCkKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDI7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSB0b3RDb2VmZlRyYWlsT25lW3ZsY251bV1bVHJhaWxpbmdPbmVzXVtUb3RhbENvZWZmXVswXTsKKyAgICAgICAgY29kZSA9IHRvdENvZWZmVHJhaWxPbmVbdmxjbnVtXVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzFdOworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgVHJhaWxpbmdPbmVzLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggdG90Q29lZmZUcmFpbE9uZUNocm9tWzRdWzVdWzJdID0KKyAgICB7CisgICAgICAgIHsgezIsIDF9LCB7NiwgN30sIHs2LCA0fSwgezYsIDN9LCB7NiwgMn19LAorICAgICAgICB7IHswLCAwfSwgezEsIDF9LCB7NiwgNn0sIHs3LCAzfSwgezgsIDN9fSwKKyAgICAgICAgeyB7MCwgMH0sIHswLCAwfSwgezMsIDF9LCB7NywgMn0sIHs4LCAyfX0sCisgICAgICAgIHsgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezYsIDV9LCB7NywgMH19LAorICAgIH07CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIHVpbnQgY29kZSwgbGVuOworCisgICAgbGVuID0gdG90Q29lZmZUcmFpbE9uZUNocm9tW1RyYWlsaW5nT25lc11bVG90YWxDb2VmZl1bMF07CisgICAgY29kZSA9IHRvdENvZWZmVHJhaWxPbmVDaHJvbVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzFdOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS03IGFuZCA5LTggKi8KK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxaZXJvcyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggbGVuVG90YWxaZXJvc1sxNV1bMTZdID0KKyAgICB7CisgICAgICAgIHsgMSwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgOX0sCisgICAgICAgIHsgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNn0sCisgICAgICAgIHsgNCwgMywgMywgMywgNCwgNCwgMywgMywgNCwgNSwgNSwgNiwgNSwgNn0sCisgICAgICAgIHsgNSwgMywgNCwgNCwgMywgMywgMywgNCwgMywgNCwgNSwgNSwgNX0sCisgICAgICAgIHsgNCwgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNCwgNX0sCisgICAgICAgIHsgNiwgNSwgMywgMywgMywgMywgMywgMywgNCwgMywgNn0sCisgICAgICAgIHsgNiwgNSwgMywgMywgMywgMiwgMywgNCwgMywgNn0sCisgICAgICAgIHsgNiwgNCwgNSwgMywgMiwgMiwgMywgMywgNn0sCisgICAgICAgIHsgNiwgNiwgNCwgMiwgMiwgMywgMiwgNX0sCisgICAgICAgIHsgNSwgNSwgMywgMiwgMiwgMiwgNH0sCisgICAgICAgIHsgNCwgNCwgMywgMywgMSwgM30sCisgICAgICAgIHsgNCwgNCwgMiwgMSwgM30sCisgICAgICAgIHsgMywgMywgMSwgMn0sCisgICAgICAgIHsgMiwgMiwgMX0sCisgICAgICAgIHsgMSwgMX0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RUb3RhbFplcm9zWzE1XVsxNl0gPQorICAgIHsKKyAgICAgICAgezEsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDF9LAorICAgICAgICB7NywgNiwgNSwgNCwgMywgNSwgNCwgMywgMiwgMywgMiwgMywgMiwgMSwgMH0sCisgICAgICAgIHs1LCA3LCA2LCA1LCA0LCAzLCA0LCAzLCAyLCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezMsIDcsIDUsIDQsIDYsIDUsIDQsIDMsIDMsIDIsIDIsIDEsIDB9LAorICAgICAgICB7NSwgNCwgMywgNywgNiwgNSwgNCwgMywgMiwgMSwgMSwgMH0sCisgICAgICAgIHsxLCAxLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezEsIDEsIDUsIDQsIDMsIDMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MSwgMSwgMSwgMywgMywgMiwgMiwgMSwgMH0sCisgICAgICAgIHsxLCAwLCAxLCAzLCAyLCAxLCAxLCAxLCB9LAorICAgICAgICB7MSwgMCwgMSwgMywgMiwgMSwgMSwgfSwKKyAgICAgICAgezAsIDEsIDEsIDIsIDEsIDN9LAorICAgICAgICB7MCwgMSwgMSwgMSwgMX0sCisgICAgICAgIHswLCAxLCAxLCAxfSwKKyAgICAgICAgezAsIDEsIDF9LAorICAgICAgICB7MCwgMX0sCisgICAgfTsKKyAgICBpbnQgbGVuLCBjb2RlOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgbGVuID0gbGVuVG90YWxaZXJvc1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKyAgICBjb2RlID0gY29kVG90YWxaZXJvc1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS05ICovCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3NDaHJvbWFEQyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggbGVuVG90YWxaZXJvc0Nocm9tYURDWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMSwgMiwgMywgMywgfSwKKyAgICAgICAgeyAxLCAyLCAyLCAwLCB9LAorICAgICAgICB7IDEsIDEsIDAsIDAsIH0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RUb3RhbFplcm9zQ2hyb21hRENbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAxLCAxLCAxLCAwLCB9LAorICAgICAgICB7IDEsIDEsIDAsIDAsIH0sCisgICAgICAgIHsgMSwgMCwgMCwgMCwgfSwKKyAgICB9OworCisgICAgaW50IGxlbiwgY29kZTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGxlbiA9IGxlblRvdGFsWmVyb3NDaHJvbWFEQ1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKyAgICBjb2RlID0gY29kVG90YWxaZXJvc0Nocm9tYURDW1RvdGFsQ29lZmYtMV1bdG90YWxfemVyb3NdOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBUYWJsZSA5LTEwICovCitBVkNFbmNfU3RhdHVzIGNlX1J1bkJlZm9yZShBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHJ1bl9iZWZvcmUsIGludCB6ZXJvc0xlZnQpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGxlblJ1bkJlZm9yZVs3XVsxNl0gPQorICAgIHsKKyAgICAgICAgezEsIDF9LAorICAgICAgICB7MSwgMiwgMn0sCisgICAgICAgIHsyLCAyLCAyLCAyfSwKKyAgICAgICAgezIsIDIsIDIsIDMsIDN9LAorICAgICAgICB7MiwgMiwgMywgMywgMywgM30sCisgICAgICAgIHsyLCAzLCAzLCAzLCAzLCAzLCAzfSwKKyAgICAgICAgezMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RSdW5CZWZvcmVbN11bMTZdID0KKyAgICB7CisgICAgICAgIHsxLCAwfSwKKyAgICAgICAgezEsIDEsIDB9LAorICAgICAgICB7MywgMiwgMSwgMH0sCisgICAgICAgIHszLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezMsIDIsIDMsIDIsIDEsIDB9LAorICAgICAgICB7MywgMCwgMSwgMywgMiwgNSwgNH0sCisgICAgICAgIHs3LCA2LCA1LCA0LCAzLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB9OworCisgICAgaW50IGxlbiwgY29kZTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmICh6ZXJvc0xlZnQgPD0gNikKKyAgICB7CisgICAgICAgIGxlbiA9IGxlblJ1bkJlZm9yZVt6ZXJvc0xlZnQtMV1bcnVuX2JlZm9yZV07CisgICAgICAgIGNvZGUgPSBjb2RSdW5CZWZvcmVbemVyb3NMZWZ0LTFdW3J1bl9iZWZvcmVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZW4gPSBsZW5SdW5CZWZvcmVbNl1bcnVuX2JlZm9yZV07CisgICAgICAgIGNvZGUgPSBjb2RSdW5CZWZvcmVbNl1bcnVuX2JlZm9yZV07CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworCisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZiMmFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9TUkNfRklMRVMgOj0gY21uTWVtb3J5LmMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKKworaWZlcSAoJChWT1RUKSwgdjUpCitMT0NBTF9DRkxBR1MgKz0gLURBUk0gLURBU01fT1BUCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNUUKK2VuZGlmCisKK2lmZXEgKCQoVk9UVCksIHY3KQorTE9DQUxfQ0ZMQUdTICs9IC1EQVJNIC1EQVJNVjcgLURBU01fT1BUCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNUUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawpAQCAtMCwwICsxLDI0IEBACisjIA0KKyMgVGhpcyBjb25maWd1cmUgZmlsZSBpcyBqdXN0IGZvciBMaW51eCBwcm9qZWN0cyBhZ2FpbnN0IEFuZHJvaWQNCisjDQorDQorVk9QUkogOj0gDQorVk9OSiA6PQ0KKw0KKyMgV0FSTklORzoNCisjIFVzaW5nIHY3IGJyZWFrcyBnZW5lcmljIGJ1aWxkDQoraWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQ0KK1ZPVFQgOj0gdjUNCitlbHNlDQorVk9UVCA6PSBwYw0KK2VuZGlmDQorDQorIyBEbyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgb24gQVJDSF9BUk1fSEFWRV9BUk1WN0E/IC0gcHJvYmFibHkgbm90DQoraWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpDQorVk9UVCA6PSB2Nw0KK2VuZGlmDQorDQorVk9URVNUIDo9IDANCisNCitWT19DRkxBR1M6PS1ETElOVVggDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3MjY0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKQEAgLTAsMCArMSw3MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY21uTWVtb3J5LmMNCisNCisJQ29udGVudDoJc2FtcGxlIGNvZGUgZm9yIG1lbW9yeSBvcGVyYXRvciBpbXBsZW1lbnRhdGlvbg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgImNtbk1lbW9yeS5oIg0KKw0KKyNpbmNsdWRlIDxtYWxsb2MuaD4NCisjaWYgZGVmaW5lZCBMSU5VWA0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjZW5kaWYNCisNCisvL1ZPX01FTV9PUEVSQVRPUgkJZ19tZW1PUDsNCisNCitWT19VMzIgY21uTWVtQWxsb2MgKFZPX1MzMiB1SUQsICBWT19NRU1fSU5GTyAqIHBNZW1JbmZvKQ0KK3sNCisJaWYgKCFwTWVtSW5mbykNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorDQorCXBNZW1JbmZvLT5WQnVmZmVyID0gbWFsbG9jIChwTWVtSW5mby0+U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIgY21uTWVtRnJlZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBNZW0pDQorew0KKwlmcmVlIChwTWVtKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1UzMgljbW5NZW1TZXQgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZiwgVk9fVTggdVZhbHVlLCBWT19VMzIgdVNpemUpDQorew0KKwltZW1zZXQgKHBCdWZmLCB1VmFsdWUsIHVTaXplKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1UzMgljbW5NZW1Db3B5IChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpDQorew0KKwltZW1jcHkgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtQ2hlY2sgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyLCBWT19VMzIgdVNpemUpDQorew0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fUzMyIGNtbk1lbUNvbXBhcmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyMSwgVk9fUFRSIHBCdWZmZXIyLCBWT19VMzIgdVNpemUpDQorew0KKwlyZXR1cm4gbWVtY21wKHBCdWZmZXIxLCBwQnVmZmVyMiwgdVNpemUpOw0KK30NCisNCitWT19VMzIJY21uTWVtTW92ZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtbW92ZSAocERlc3QsIHBTb3VyY2UsIHVTaXplKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS9jbW5NZW1vcnkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS9jbW5NZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE1NjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL2Ntbk1lbW9yeS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQljbW5NZW1vcnkuaA0KKw0KKwlDb250ZW50OgltZW1vcnkgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24gaGVhZGVyIGZpbGUNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX19jbW5NZW1vcnlfSF9fDQorI2RlZmluZSBfX2Ntbk1lbW9yeV9IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjaW5jbHVkZSA8dm9NZW0uaD4NCisNCisvL2V4dGVybiBWT19NRU1fT1BFUkFUT1IJZ19tZW1PUDsNCisNCisvKioNCisgKiBBbGxvY2F0ZSBtZW1vcnkNCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHVTaXplIFtpbl0gc2l6ZSBvZiBtZW1vcnkNCisgKiBccmV0dXJuIHZhbHVlIGlzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFkZHJlc3MuIE5VTEwgaXMgZmFpbGVkLg0KKyAqLw0KK1ZPX1UzMgljbW5NZW1BbGxvYyAoVk9fUzMyIHVJRCwgIFZPX01FTV9JTkZPICogcE1lbUluZm8pOw0KKw0KKy8qKg0KKyAqIEZyZWUgdXAgbWVtb3J5DQorICogXHBhcmFtIHVJRCBbaW5dIG1vZHVsZSBJRA0KKyAqIFxwYXJhbSBwTWVtIFtpbl0gYWRkcmVzcyBvZiBtZW1vcnkNCisgKiBccmV0dXJuIHZhbHVlIDAsIGlmIHN1Y2NlZWRlZC4NCisgKi8NCitWT19VMzIJY21uTWVtRnJlZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIpOw0KKw0KKy8qKg0KKyAqIG1lbW9yeSBzZXQgZnVuY3Rpb24NCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHBCdWZmIFtpbi9vdXRdIGFkZHJlc3Mgb2YgbWVtb3J5DQorICogXHBhcmFtIHVWYWx1ZSBbaW5dIHRoZSB2YWx1ZSB0byBiZSBzZXQNCisgKiBccGFyYW0gdVNpemUgW2luXSB0aGUgc2l6ZSB0byBiZSBzZXQNCisgKiBccmV0dXJuIHZhbHVlIDAsIGlmIHN1Y2NlZWRlZC4NCisgKi8NCitWT19VMzIJY21uTWVtU2V0IChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYsIFZPX1U4IHVWYWx1ZSwgVk9fVTMyIHVTaXplKTsNCisNCisvKioNCisgKiBtZW1vcnkgY29weSBmdW5jdGlvbg0KKyAqIFxwYXJhbSB1SUQgW2luXSBtb2R1bGUgSUQNCisgKiBccGFyYW0gcERlc3QgW2luL291dF0gYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBtZW1vcnkNCisgKiBccGFyYW0gcFNvdXJjZSBbaW5dIGFkZHJlc3Mgb2Ygc291cmNlIG1lbW9yeQ0KKyAqIFxwYXJhbSB1U2l6ZSBbaW5dIHRoZSBzaXplIHRvIGJlIGNvcGllZA0KKyAqIFxyZXR1cm4gdmFsdWUgMCwgaWYgc3VjY2VlZGVkLg0KKyAqLw0KK1ZPX1UzMgljbW5NZW1Db3B5IChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpOw0KKw0KKy8qKg0KKyAqIG1lbW9yeSBjaGVjayBmdW5jdGlvbg0KKyAqIFxwYXJhbSB1SUQgW2luXSBtb2R1bGUgSUQNCisgKiBccGFyYW0gcEJ1ZmYgW2luXSBhZGRyZXNzIG9mIGJ1ZmZlciB0byBiZSBjaGVja2VkDQorICogXHBhcmFtIHVTaXplIFtpbl0gdGhlIHNpemUgdG8gYmUgY2hlY2tlZA0KKyAqIFxyZXR1cm4gdmFsdWUgMCwgaWYgc3VjY2VlZGVkLg0KKyAqLw0KK1ZPX1UzMgljbW5NZW1DaGVjayAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIsIFZPX1UzMiB1U2l6ZSk7DQorDQorLyoqDQorICogbWVtb3J5IGNvbXBhcmUgZnVuY3Rpb24NCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHBCdWZmZXIxIFtpbl0gYWRkcmVzcyBvZiBidWZmZXIgMSB0byBiZSBjb21wYXJlZA0KKyAqIFxwYXJhbSBwQnVmZmVyMiBbaW5dIGFkZHJlc3Mgb2YgYnVmZmVyIDIgdG8gYmUgY29tcGFyZWQNCisgKiBccGFyYW0gdVNpemUgW2luXSB0aGUgc2l6ZSB0byBiZSBjb21wYXJlZA0KKyAqIFxyZXR1cm4gdmFsdWU6IHNhbWUgYXMgc3RhbmRhcmQgQyBydW4tdGltZSBtZW1jbXAoKSBmdW5jdGlvbi4NCisgKi8NCitWT19TMzIJY21uTWVtQ29tcGFyZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIxLCBWT19QVFIgcEJ1ZmZlcjIsIFZPX1UzMiB1U2l6ZSk7DQorDQorLyoqDQorICogbWVtb3J5IG1vdmUgZnVuY3Rpb24NCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHBEZXN0IFtpbi9vdXRdIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gbWVtb3J5DQorICogXHBhcmFtIHBTb3VyY2UgW2luXSBhZGRyZXNzIG9mIHNvdXJjZSBtZW1vcnkNCisgKiBccGFyYW0gdVNpemUgW2luXSB0aGUgc2l6ZSB0byBiZSBtb3ZlZA0KKyAqIFxyZXR1cm4gdmFsdWUgMCwgaWYgc3VjY2VlZGVkLg0KKyAqLw0KK1ZPX1UzMgljbW5NZW1Nb3ZlIChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpOw0KKw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjZW5kaWYgLy8gX19jbW5NZW1vcnlfSF9fDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQUFDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BQUMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFlZDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQUFDLmgKQEAgLTAsMCArMSw3NCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdm9BQUMuaA0KKw0KKwlDb250ZW50OglBQUMgY29kZWMgQVBJcyAmIGRhdGEgdHlwZXMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX192b0FBQ19IX18NCisjZGVmaW5lIF9fdm9BQUNfSF9fDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2luY2x1ZGUgInZvQXVkaW8uaCINCisNCisvKiENCisgKiB0aGUgZnJhbWUgdHlwZSB0aGF0IHRoZSBkZWNvZGVyIHN1cHBvcnRzDQorICovDQordHlwZWRlZiBlbnVtIHsNCisJVk9BQUNfUkFXREFUQQkJCT0gMCwJLyohPGNvbnRhaW5zIG9ubHkgcmF3IGFhYyBkYXRhIGluIGEgZnJhbWUqLw0KKwlWT0FBQ19BRFRTCQkJCT0gMSwJLyohPGNvbnRhaW5zIEFEVFMgaGVhZGVyICsgcmF3IEFBQyBkYXRhIGluIGEgZnJhbWUqLw0KKwlWT0FBQ19GVF9NQVgJCQk9IFZPX01BWF9FTlVNX1ZBTFVFDQorfSBWT0FBQ0ZSQU1FVFlQRTsNCisNCisvKiENCisgKiB0aGUgc3RydWN0dXJlIGZvciBBQUMgZW5jb2RlciBpbnB1dCBwYXJhbWV0ZXINCisgKi8NCit0eXBlZGVmICBzdHJ1Y3Qgew0KKyAgaW50CSAgc2FtcGxlUmF0ZTsgICAgICAgICAgLyohIGF1ZGlvIGZpbGUgc2FtcGxlIHJhdGUgKi8NCisgIGludAkgIGJpdFJhdGU7ICAgICAgICAgICAgIC8qISBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovDQorICBzaG9ydCAgIG5DaGFubmVsczsJCSAgIC8qISBudW1iZXIgb2YgY2hhbm5lbHMgb24gaW5wdXQgKDEsMikgKi8NCisgIHNob3J0ICAgYWR0c1VzZWQ7CQkJICAgLyohIHdoZXRoZXIgd3JpdGUgYWR0cyBoZWFkZXIgKi8NCit9IEFBQ0VOQ19QQVJBTTsNCisNCisvKiBBQUMgUGFyYW0gSUQgKi8NCisjZGVmaW5lIFZPX1BJRF9BQUNfTWRvdWxlCQkJCTB4NDIyMTEwMDANCisjZGVmaW5lIFZPX1BJRF9BQUNfRU5DUEFSQU0JCQkJVk9fUElEX0FBQ19NZG91bGUgfCAweDAwNDAgIC8qITwgZ2V0L3NldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXIsIHRoZSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIEFBQ0VOQ19QQVJBTSAqLw0KKw0KKy8qIEFBQyBkZWNvZGVyIGVycm9yIElEICovDQorI2RlZmluZSBWT19FUlJfQUFDX01kb3VsZQkJCQkweDgyMjEwMDAwDQorI2RlZmluZSBWT19FUlJfQUFDX1VOU0ZJTEVGT1JNQVQJCShWT19FUlJfQUFDX01kb3VsZSB8IDB4RjAwMSkNCisjZGVmaW5lIFZPX0VSUl9BQUNfVU5TUFJPRklMRQkJCShWT19FUlJfQUFDX01kb3VsZSB8IDB4RjAwMikNCisNCisvKioNCisgKiBHZXQgYXVkaW8gZW5jb2RlciBBUEkgaW50ZXJmYWNlDQorICogXHBhcmFtIHBFbmNIYW5kbGUgW291dF0gUmV0dXJuIHRoZSBBQUMgRW5jb2RlciBoYW5kbGUuDQorICogXHJldHZhbCBWT19FUlJfT0sgU3VjY2VlZGVkLg0KKyAqLw0KK1ZPX1MzMiBWT19BUEkgdm9HZXRBQUNFbmNBUEkgKFZPX0FVRElPX0NPREVDQVBJICogcEVuY0hhbmRsZSk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNlbmRpZiAvLyBfX3ZvQUFDX0hfXw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0FNUldCLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BTVJXQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BTVJXQi5oCkBAIC0wLDAgKzEsODcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXZvQU1SV0IuaA0KKw0KKwlDb250ZW50OglBTVItV0IgY29kZWMgQVBJcyAmIGRhdGEgdHlwZXMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpZm5kZWYgIF9fVk9BTVJXQl9IX18NCisjZGVmaW5lICBfX1ZPQU1SV0JfSF9fDQorDQorI2luY2x1ZGUgICJ2b0F1ZGlvLmgiDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorI3ByYWdtYSBwYWNrKHB1c2gsIDQpDQorDQorLyohKiB0aGUgYml0IHJhdGUgdGhlIGNvZGVjIHN1cHBvcnRzKi8NCit0eXBlZGVmIGVudW0geyANCisJVk9BTVJXQl9NRE5PTkUJCT0gLTEsCS8qITwgSW52YWxpZCBtb2RlICovDQorCVZPQU1SV0JfTUQ2NgkJPSAwLAkvKiE8IDYuNjBrYnBzICAgKi8NCisJVk9BTVJXQl9NRDg4NQkJPSAxLCAgICAvKiE8IDguODVrYnBzICAgKi8gICAgICAgDQorCVZPQU1SV0JfTUQxMjY1CQk9IDIsCS8qITwgMTIuNjVrYnBzICAqLw0KKwlWT0FNUldCX01EMTQyNQkJPSAzLAkvKiE8IDE0LjI1a2JwcyAgKi8NCisJVk9BTVJXQl9NRDE1ODUJCT0gNCwJLyohPCAxNS44NWJwcyAgICovDQorCVZPQU1SV0JfTUQxODI1CQk9IDUsCS8qITwgMTguMjVicHMgICAqLw0KKwlWT0FNUldCX01EMTk4NQkJPSA2LAkvKiE8IDE5Ljg1a2JwcyAgKi8NCisJVk9BTVJXQl9NRDIzMDUJCT0gNywgICAgLyohPCAyMy4wNWticHMgICovDQorCVZPQU1SV0JfTUQyMzg1ICAgICAgICAgID0gOCwgICAgLyohPCAyMy44NWticHM+ICovCQ0KKwlWT0FNUldCX05fTU9ERVMgCT0gOSwJLyohPCBJbnZhbGlkIG1vZGUgKi8NCisJVk9BTVJXQl9NT0RFX01BWCAgICA9IFZPX01BWF9FTlVNX1ZBTFVFDQorCQ0KK31WT0FNUldCTU9ERTsNCisNCisvKiEqIHRoZSBmcmFtZSBmb3JtYXQgdGhlIGNvZGVjIHN1cHBvcnRzKi8NCit0eXBlZGVmIGVudW0gew0KKwlWT0FNUldCX0RFRkFVTFQgIAk9IDAsCS8qITwgdGhlIGZyYW1lIHR5cGUgaXMgdGhlIGhlYWRlciAoZGVmaW5lZCBpbiBSRkMzMjY3KSArIHJhd2RhdGEqLw0KKwkvKk9uZSB3b3JkICgyLWJ5dGUpIGZvciBzeW5jIHdvcmQgKDB4NmIyMSkqLw0KKwkvKk9uZSB3b3JkICgyLWJ5dGUpIGZvciBmcmFtZSBsZW5ndGggTi4qLw0KKwkvKk4gd29yZHMgKDItYnl0ZSkgY29udGFpbmluZyBOIGJpdHMgKGJpdCAwID0gMHgwMDdmLCBiaXQgMSA9IDB4MDA4MSkuKi8NCisJVk9BTVJXQl9JVFUgICAgICAgICA9IDEsIA0KKwkvKk9uZSB3b3JkICgyLWJ5dGUpIGZvciBzeW5jIHdvcmQgKDB4NmIyMSkuKi8NCisJLypPbmUgd29yZCAoMi1ieXRlKSB0byBpbmRpY2F0ZSB0aGUgZnJhbWUgdHlwZS4qLwkNCisJLypPbmUgd29yZCAoMi1ieXRlKSB0byBpbmRpY2F0ZSB0aGUgbW9kZS4qLw0KKwkvKk4gd29yZHMgICgyLWJ5dGUpIGNvbnRhaW5pbmcgTiBiaXRzIChiaXQgMCA9IDB4ZmY4MSwgYml0IDEgPSAweDAwN2YpLiovDQorCVZPQU1SV0JfUkZDMzI2NwkJPSAyLAkvKiBzZWUgUkZDIDMyNjcgKi8gIA0KKyAgICBWT0FNUldCX1RNQVggICAgICAgID0gVk9fTUFYX0VOVU1fVkFMVUUJDQorfVZPQU1SV0JGUkFNRVRZUEU7DQorDQorDQorI2RlZmluZSAgICBWT19QSURfQU1SV0JfTW9kdWxlCQkJCQkJCTB4NDIyNjEwMDAgDQorI2RlZmluZSAgICBWT19QSURfQU1SV0JfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9fUElEX0FNUldCX01vZHVsZSB8IDB4MDAwMikNCisjZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgIChWT19QSURfQU1SV0JfTW9kdWxlIHwgMHgwMDAzKQ0KKyNkZWZpbmUgICAgVk9fUElEX0FNUldCX1NBTVBMRVJBVEUgICAgICAgICAgICAgICAgICAgICAgKFZPX1BJRF9BTVJXQl9Nb2R1bGUgfCAweDAwMDQpDQorI2RlZmluZSAgICBWT19QSURfQU1SV0JfRlJBTUVUWVBFICAgICAgICAgICAgICAgICAgICAgICAoVk9fUElEX0FNUldCX01vZHVsZSB8IDB4MDAwNSkNCisjZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT19QSURfQU1SV0JfTW9kdWxlIHwgMHgwMDA2KQ0KKyNkZWZpbmUgICAgVk9fUElEX0FNUldCX0RUWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPX1BJRF9BTVJXQl9Nb2R1bGUgfCAweDAwMDcpDQorDQorLyoqDQorICogR2V0IGF1ZGlvIGNvZGVjIEFQSSBpbnRlcmZhY2UNCisgKiBccGFyYW0gcEVuY0hhbmRsZSBbb3V0XSBSZXR1cm4gdGhlIEFNUldCIEVuY29kZXIgaGFuZGxlLg0KKyAqIFxyZXR2YWwgVk9fRVJSX09LIFN1Y2NlZWRlZC4NCisgKi8NCitWT19TMzIgVk9fQVBJIHZvR2V0QU1SV0JFbmNBUEkoVk9fQVVESU9fQ09ERUNBUEkgKnBFbmNIYW5kbGUpOw0KKw0KKw0KKyNwcmFnbWEgcGFjayhwb3ApDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfSAvKiBleHRlcm4gIkMiICovDQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorDQorI2VuZGlmICAgLy9fX1ZPQU1SV0JfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQXVkaW8uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjOWRmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0F1ZGlvLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXZvQXVkaW8uaA0KKw0KKwlDb250ZW50OglBdWRpbyB0eXBlcyBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fdm9BdWRpb19IX18NCisjZGVmaW5lIF9fdm9BdWRpb19IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjaW5jbHVkZSAidm9JbmRleC5oIg0KKyNpbmNsdWRlICJ2b01lbS5oIg0KKw0KKyNkZWZpbmUJVk9fUElEX0FVRElPX0JBU0UJCQkgMHg0MjAwMDAwMAkJCQkJCQkvKiE8IFRoZSBiYXNlIHBhcmFtIElEIGZvciBBVURJTyBjb2RlYyAqLw0KKyNkZWZpbmUJVk9fUElEX0FVRElPX0ZPUk1BVAkJCShWT19QSURfQVVESU9fQkFTRSB8IDBYMDAwMSkJCS8qITwgVGhlIGZvcm1hdCBkYXRhIG9mIGF1ZGlvIGluIHRyYWNrICovDQorI2RlZmluZQlWT19QSURfQVVESU9fU0FNUExFUkVBVEUJKFZPX1BJRF9BVURJT19CQVNFIHwgMFgwMDAyKQkJLyohPCBUaGUgc2FtcGxlIHJhdGUgb2YgYXVkaW8gICovDQorI2RlZmluZQlWT19QSURfQVVESU9fQ0hBTk5FTFMJCShWT19QSURfQVVESU9fQkFTRSB8IDBYMDAwMykJCS8qITwgVGhlIGNoYW5uZWwgb2YgYXVkaW8gKi8NCisjZGVmaW5lCVZPX1BJRF9BVURJT19CSVRSQVRFCQkoVk9fUElEX0FVRElPX0JBU0UgfCAwWDAwMDQpCQkvKiE8IFRoZSBiaXQgcmF0ZSBvZiBhdWRpbyAqLw0KKyNkZWZpbmUgVk9fUElEX0FVRElPX0NIQU5ORUxNT0RFCShWT19QSURfQVVESU9fQkFTRSB8IDBYMDAwNSkJCS8qITwgVGhlIGNoYW5uZWwgbW9kZSBvZiBhdWRpbyAqLw0KKw0KKyNkZWZpbmUJVk9fRVJSX0FVRElPX0JBU0UJCQkweDgyMDAwMDAwDQorI2RlZmluZSBWT19FUlJfQVVESU9fVU5TQ0hBTk5FTAkJVk9fRVJSX0FVRElPX0JBU0UgfCAweDAwMDENCisjZGVmaW5lIFZPX0VSUl9BVURJT19VTlNTQU1QTEVSQVRFCVZPX0VSUl9BVURJT19CQVNFIHwgMHgwMDAyDQorI2RlZmluZSBWT19FUlJfQVVESU9fVU5TRkVBVFVSRQkJVk9fRVJSX0FVRElPX0JBU0UgfCAweDAwMDMNCisNCisNCisvKioNCisgKkVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSBhdWRpbyBjb2RpbmcgZm9ybWF0cy4NCisgKi8NCit0eXBlZGVmIGVudW0gVk9fQVVESU9fQ09ESU5HVFlQRSB7DQorCVZPX0FVRElPX0NvZGluZ1VudXNlZCA9IDAsICAvKio8IFBsYWNlaG9sZGVyIHZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAgKi8NCisJVk9fQVVESU9fQ29kaW5nUENNLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUENNIGNvZGluZyAqLw0KKwlWT19BVURJT19Db2RpbmdBRFBDTSwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBRFBDTSBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nQU1STkIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQU1SIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdBTVJXQiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBTVIgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ0FNUldCUCwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFNUiBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nUUNFTFAxMywgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgMTNrYnBzIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdFVlJDLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBFVlJDIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdBQUMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBQUMgZW5jb2RlZCBkYXRhLCAweEExMDYgLSBJU08vTVBFRy00IEFBQywgMHhGRiAtIEFBQyAqLw0KKwlWT19BVURJT19Db2RpbmdBQzMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBQzMgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ0ZMQUMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEZMQUMgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ01QMSwJCQkvKio8IEFueSB2YXJpYW50IG9mIE1QMSBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nTVAzLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTVAzIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdPR0csICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBPR0cgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ1dNQSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFdNQSBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nUkEsICAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUkEgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ01JREksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1JREkgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ0RSQSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIGRyYSBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nRzcyOSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgZHJhIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdfTUFYCQk9IFZPX01BWF9FTlVNX1ZBTFVFDQorfSBWT19BVURJT19DT0RJTkdUWVBFOw0KKw0KKy8qIQ0KKyogdGhlIGNoYW5uZWwgdHlwZSB2YWx1ZQ0KKyovDQordHlwZWRlZiBlbnVtIHsNCisJVk9fQ0hBTk5FTF9DRU5URVIJCQkJPSAxLAkvKiE8Y2VudGVyIGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0ZST05UX0xFRlQJCQk9IDE8PDEsCS8qITxmcm9udCBsZWZ0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0ZST05UX1JJR0hUCQkJPSAxPDwyLAkvKiE8ZnJvbnQgcmlnaHQgY2hhbm5lbCovDQorCVZPX0NIQU5ORUxfU0lERV9MRUZUICAJCQk9IDE8PDMsIC8qITxzaWRlIGxlZnQgY2hhbm5lbCovDQorCVZPX0NIQU5ORUxfU0lERV9SSUdIVAkJCT0gMTw8NCwgLyohPHNpZGUgcmlnaHQgY2hhbm5lbCovDQorCVZPX0NIQU5ORUxfQkFDS19MRUZUCQkJPSAxPDw1LAkvKiE8YmFjayBsZWZ0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0JBQ0tfUklHSFQJCQk9IDE8PDYsCS8qITxiYWNrIHJpZ2h0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0JBQ0tfQ0VOVEVSCQkJPSAxPDw3LAkvKiE8YmFjayBjZW50ZXIgY2hhbm5lbCovDQorCVZPX0NIQU5ORUxfTEZFX0JBU1MJCQkJPSAxPDw4LAkvKiE8bG93LWZyZXF1ZW5jeSBlZmZlY3RzIGJhc3MgY2hhbm5lbCovDQorCVZPX0NIQU5ORUxfQUxMCQkJCQk9IDB4ZmZmZiwvKiE8W2RlZmF1bHRdIGluY2x1ZGUgYWxsIGNoYW5uZWxzICovDQorCVZPX0NIQU5ORUxfTUFYCQkJCQk9IFZPX01BWF9FTlVNX1ZBTFVFDQorfSBWT19BVURJT19DSEFOTkVMVFlQRTsNCisNCisvKioNCisgKiBHZW5lcmFsIGF1ZGlvIGZvcm1hdCBpbmZvDQorICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorCVZPX1MzMglTYW1wbGVSYXRlOyAgLyohPCBTYW1wbGUgcmF0ZSAqLw0KKwlWT19TMzIJQ2hhbm5lbHM7ICAgIC8qITwgQ2hhbm5lbCBjb3VudCAqLw0KKwlWT19TMzIJU2FtcGxlQml0czsgIC8qITwgQml0cyBwZXIgc2FtcGxlICovDQorfSBWT19BVURJT19GT1JNQVQ7DQorDQorLyoqDQorICogR2VuZXJhbCBhdWRpbyBvdXRwdXQgaW5mbw0KKyAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKwlWT19BVURJT19GT1JNQVQJRm9ybWF0OwkJCS8qITwgU2FtcGxlIHJhdGUgKi8NCisJVk9fVTMyCQkJSW5wdXRVc2VkOwkJLyohPCBDaGFubmVsIGNvdW50ICovDQorCVZPX1UzMgkJCVJlc2V2ZXI7CQkvKiE8IFJlc2V2ZXJlZCAqLw0KK30gVk9fQVVESU9fT1VUUFVUSU5GTzsNCisNCisvKioNCisgKiBHZW5lcmFsIGF1ZGlvIGNvZGVjIGZ1bmN0aW9uIHNldA0KKyAqLw0KK3R5cGVkZWYgc3RydWN0IFZPX0FVRElPX0NPREVDQVBJDQorew0KKwkvKioNCisJICogSW5pdCB0aGUgYXVkaW8gY29kZWMgbW9kdWxlIGFuZCByZXR1cm4gY29kZWMgaGFuZGxlDQorCSAqIFxwYXJhbSBwaENvZGVjIFtPVVRdIFJldHVybiB0aGUgdmlkZW8gY29kZWMgaGFuZGxlDQorCSAqIFxwYXJhbSB2VHlwZQlbSU5dIFRoZSBjb2RlYyB0eXBlIGlmIHRoZSBtb2R1bGUgc3VwcG9ydCBtdWx0aSBjb2RlYy4NCisJICogXHBhcmFtIHBVc2VyRGF0YQlbSU5dIFRoZSBpbml0IHBhcmFtLiBJdCBpcyBlaXRoZXIgYSBtZW1vcnkgb3BlcmF0b3Igb3IgYW4gYWxsb2NhdGVkIG1lbW9yeQ0KKwkgKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisJICovDQorCVZPX1UzMiAoVk9fQVBJICogSW5pdCkgKFZPX0hBTkRMRSAqIHBoQ29kZWMsIFZPX0FVRElPX0NPRElOR1RZUEUgdlR5cGUsIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgKiBwVXNlckRhdGEgKTsNCisNCisJLyoqDQorCSAqIFNldCBpbnB1dCBhdWRpbyBkYXRhLg0KKwkgKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBjb2RlYyBoYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisJICogXHBhcmFtIHBJbnB1dCBbSU5dIFRoZSBpbnB1dCBidWZmZXIgcGFyYW0uDQorCSAqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKwkgKi8NCisJVk9fVTMyIChWT19BUEkgKiBTZXRJbnB1dERhdGEpIChWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBJbnB1dCk7DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIG91dHV0IGF1ZGlvIGRhdGENCisJICogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorCSAqIFxwYXJhbSBwT3V0QnVmZmVyIFtPVVRdIFRoZSBvdXRwdXQgYXVkaW8gZGF0YQ0KKwkgKiBccGFyYW0gcE91dEluZm8gW09VVF0gVGhlIGNvZGVjIGZpbGxzIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGlucHV0IGRhdGEgc2l6ZSB1c2VkIGluIGN1cnJlbnQgY2FsbC4NCisJICoJCQkJCQkgcE91dEluZm8tPklucHV0VXNlZCBpcyB0b3RhbCB1c2VkIGlucHV0IGRhdGEgc2l6ZSBpbiBieXRlLg0KKwkgKiBccmV0dmFsICBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorCSAqCQkJVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTC4gVGhlIGlucHV0IHdhcyBmaW5pc2hlZCBvciB0aGUgaW5wdXQgZGF0YSB3YXMgbm90IGVub3VnaHQuIENvbnRpbnVlIHRvIGlucHV0IA0KKwkgKgkJCQkJCQkJCQlkYXRhIGJlZm9yZSBuZXh0IGNhbGwuDQorCSAqLw0KKwlWT19VMzIgKFZPX0FQSSAqIEdldE91dHB1dERhdGEpIChWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBPdXRCdWZmZXIsIFZPX0FVRElPX09VVFBVVElORk8gKiBwT3V0SW5mbyk7DQorDQorCS8qKg0KKwkgKiBTZXQgdGhlIHBhcmFtZXRlciBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbSBJRC4NCisJICogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorCSAqIFxwYXJhbSB1UGFyYW1JRCBbSU5dIFRoZSBwYXJhbSBJRC4NCisJICogXHBhcmFtIHBEYXRhIFtJTl0gVGhlIHBhcmFtIHZhbHVlLg0KKwkgKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisJICovDQorCVZPX1UzMiAoVk9fQVBJICogU2V0UGFyYW0pIChWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSk7DQorDQorCS8qKg0KKwkgKiBHZXQgdGhlIHBhcmFtZXRlciBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbSBJRC4NCisJICogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorCSAqIFxwYXJhbSB1UGFyYW1JRCBbSU5dIFRoZSBwYXJhbSBJRC4NCisJICogXHBhcmFtIHBEYXRhIFtJTl0gVGhlIHBhcmFtIHZhbHVlLg0KKwkgKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisJICovDQorCVZPX1UzMiAoVk9fQVBJICogR2V0UGFyYW0pIChWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSk7DQorDQorCS8qKg0KKwkgKiBVbmluaXQgdGhlIENvZGVjLg0KKwkgKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBjb2RlYyBoYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisJICogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorCSAqLw0KKwlWT19VMzIgKFZPX0FQSSAqIFVuaW5pdCkgKFZPX0hBTkRMRSBoQ29kZWMpOw0KK30gVk9fQVVESU9fQ09ERUNBUEk7DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNlbmRpZiAvLyBfX3ZvQXVkaW9fSF9fDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvSW5kZXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0luZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxYTBkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0luZGV4LmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXZvSW5kZXguaA0KKw0KKwlDb250ZW50Ogltb2R1bGUgYW5kIElEIGRlZmluaXRpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX192b0luZGV4X0hfXw0KKyNkZWZpbmUgX192b0luZGV4X0hfXw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNpbmNsdWRlICJ2b1R5cGUuaCINCisNCisvKiBEZWZpbmUgdGhlIG1vZHVsZSBJRCAqLw0KKyNkZWZpbmUgX01BS0VfU09VUkNFX0lEKGlkLCBuYW1lKSBcDQorVk9fSU5ERVhfU1JDXyMjbmFtZSA9IF9WT19JTkRFWF9TT1VSQ0UgfCBpZCwNCisNCisjZGVmaW5lIF9NQUtFX0NPREVDX0lEKGlkLCBuYW1lKSBcDQorVk9fSU5ERVhfREVDXyMjbmFtZSA9IF9WT19JTkRFWF9ERUMgfCBpZCwgXA0KK1ZPX0lOREVYX0VOQ18jI25hbWUgPSBfVk9fSU5ERVhfRU5DIHwgaWQsDQorDQorI2RlZmluZSBfTUFLRV9FRkZFQ1RfSUQoaWQsIG5hbWUpIFwNCitWT19JTkRFWF9FRlRfIyNuYW1lID0gX1ZPX0lOREVYX0VGRkVDVCB8IGlkLA0KKw0KKyNkZWZpbmUgX01BS0VfU0lOS19JRChpZCwgbmFtZSkgXA0KK1ZPX0lOREVYX1NOS18jI25hbWUgPSBfVk9fSU5ERVhfU0lOSyB8IGlkLA0KKw0KKyNkZWZpbmUgX01BS0VfRklMVEVSX0lEKGlkLCBuYW1lKSBcDQorVk9fSU5ERVhfRkxUXyMjbmFtZSA9IF9WT19JTkRFWF9GSUxURVIgfCBpZCwNCisNCisjZGVmaW5lIF9NQUtFX09NWF9JRChpZCwgbmFtZSkgXA0KK1ZPX0lOREVYX09NWF8jI25hbWUgPSBfVk9fSU5ERVhfT01YIHwgaWQsDQorDQorI2RlZmluZSBfTUFLRV9NRldfSUQoaWQsIG5hbWUpIFwNCitWT19JTkRFWF9NRldfIyNuYW1lID0gX1ZPX0lOREVYX01GVyB8IGlkLA0KKw0KK2VudW0NCit7DQorCV9WT19JTkRFWF9TT1VSQ0UJCT0gMHgwMTAwMDAwMCwNCisJX1ZPX0lOREVYX0RFQwkJCT0gMHgwMjAwMDAwMCwNCisJX1ZPX0lOREVYX0VOQwkJCT0gMHgwMzAwMDAwMCwNCisJX1ZPX0lOREVYX0VGRkVDVAkJPSAweDA0MDAwMDAwLA0KKwlfVk9fSU5ERVhfU0lOSwkJCT0gMHgwNTAwMDAwMCwNCisJX1ZPX0lOREVYX0ZJTFRFUgkJPSAweDA2MDAwMDAwLA0KKwlfVk9fSU5ERVhfT01YCQkJPSAweDA3MDAwMDAwLA0KKwlfVk9fSU5ERVhfTUZXCQkJPSAweDA4MDAwMDAwLA0KKw0KKwkvLyBkZWZpbmUgZmlsZSBwYXJzZXIgbW9kdWxlcw0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MDEwMDAwLCBNUDQpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgwMjAwMDAsIEFWSSkNCisJX01BS0VfU09VUkNFX0lEICgweDAzMDAwMCwgQVNGKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MDQwMDAwLCBSRUFMKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MDUwMDAwLCBBVURJTykNCisJX01BS0VfU09VUkNFX0lEICgweDA2MDAwMCwgRkxBU0gpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgwNzAwMDAsIE9HRykNCisJX01BS0VfU09VUkNFX0lEICgweDA4MDAwMCwgTUtWKQ0KKw0KKwkvLyBkZWZpbmUgbmV0d29yayBzb3VyY2UgbW9kdWxlcw0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MTEwMDAwLCBSVFNQKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MTIwMDAwLCBIVFRQKQ0KKw0KKwkvLyBkZWZpbmUgQ01NQiBzb3VyY2UgbW9kdWxlcw0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MjAwMDAwLCBDTU1CKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MjEwMDAwLCBDTU1CX0lOTk8pDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgyMjAwMDAsIENNTUJfVEVMRSkNCisJX01BS0VfU09VUkNFX0lEICgweDIzMDAwMCwgQ01NQl9TSUFOTykNCisNCisJLy8gZGVmaW5lIERWQlQgc291cmNlIG1vZHVsZXMNCisJX01BS0VfU09VUkNFX0lEICgweDMwMDAwMCwgRFZCVCkNCisJX01BS0VfU09VUkNFX0lEICgweDMxMDAwMCwgRFZCVF9ESUJDT00pDQorDQorCS8vIGRlZmluZSBvdGhlciBzb3VyY2UgbW9kdWxlcw0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4NDAwMDAwLCBJRDMpDQorDQorCS8vIGRlZmluZSB2aWRlbyBjb2RlYyBtb2R1bGVzDQorCV9NQUtFX0NPREVDX0lEICgweDAxMDAwMCwgSDI2NCkNCisJX01BS0VfQ09ERUNfSUQgKDB4MDIwMDAwLCBNUEVHNCkNCisJX01BS0VfQ09ERUNfSUQgKDB4MDMwMDAwLCBIMjYzKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwNDAwMDAsIFMyNjMpDQorCV9NQUtFX0NPREVDX0lEICgweDA1MDAwMCwgUlYpDQorCV9NQUtFX0NPREVDX0lEICgweDA2MDAwMCwgV01WKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwNzAwMDAsIERJVlgzKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwODAwMDAsIE1KUEVHKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwOTAwMDAsIE1QRUcyKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwQTAwMDAsIFZQNikNCisNCisJLy8gZGVmaW5lIGF1ZGlvIGNvZGVjIG1vZHVsZXMNCisJX01BS0VfQ09ERUNfSUQgKDB4MjEwMDAwLCBBQUMpDQorCV9NQUtFX0NPREVDX0lEICgweDIyMDAwMCwgTVAzKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyMzAwMDAsIFdNQSkNCisJX01BS0VfQ09ERUNfSUQgKDB4MjQwMDAwLCBSQSkNCisJX01BS0VfQ09ERUNfSUQgKDB4MjUwMDAwLCBBTVJOQikNCisJX01BS0VfQ09ERUNfSUQgKDB4MjYwMDAwLCBBTVJXQikNCisJX01BS0VfQ09ERUNfSUQgKDB4MjcwMDAwLCBBTVJXQlApDQorCV9NQUtFX0NPREVDX0lEICgweDI4MDAwMCwgUUNFTFApDQorCV9NQUtFX0NPREVDX0lEICgweDI5MDAwMCwgRVZSQykNCisJX01BS0VfQ09ERUNfSUQgKDB4MkEwMDAwLCBBRFBDTSkNCisJX01BS0VfQ09ERUNfSUQgKDB4MkIwMDAwLCBNSURJKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyQzAwMDAsIEFDMykNCisJX01BS0VfQ09ERUNfSUQgKDB4MkQwMDAwLCBGTEFDKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyRTAwMDAsIERSQSkNCisJX01BS0VfQ09ERUNfSUQgKDB4MkYwMDAwLCBPR0cpDQorCV9NQUtFX0NPREVDX0lEICgweDMwMDAwMCwgRzcyOSkNCisNCisJLy8gZGVmaW5lIGltYWdlIGNvZGVjIG1vZHVsZXMNCisJX01BS0VfQ09ERUNfSUQgKDB4NDEwMDAwLCBKUEVHKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHg0MjAwMDAsIEdJRikNCisJX01BS0VfQ09ERUNfSUQgKDB4NDMwMDAwLCBQTkcpDQorCV9NQUtFX0NPREVDX0lEICgweDQ0MDAwMCwgVElGKQ0KKw0KKwkvLyBkZWZpbmUgZWZmZWN0IG1vZHVsZXMNCisJX01BS0VfRUZGRUNUX0lEICgweDAxMDAwMCwgRVEpDQorDQorCS8vIGRlZmluZSBzaW5rIG1vZHVsZXMNCisJX01BS0VfU0lOS19JRCAoMHgwMTAwMDAsIFZJREVPKQ0KKwlfTUFLRV9TSU5LX0lEICgweDAyMDAwMCwgQVVESU8pDQorCV9NQUtFX1NJTktfSUQgKDB4MDMwMDAwLCBDQ1JSUikNCisJX01BS0VfU0lOS19JRCAoMHgwNDAwMDAsIENDUlJWKQ0KKw0KKwlfTUFLRV9TSU5LX0lEICgweDExMDAwMCwgTVA0KQ0KKwlfTUFLRV9TSU5LX0lEICgweDEyMDAwMCwgQVZJKQ0KKwlfTUFLRV9TSU5LX0lEICgweDEzMDAwMCwgQUZXKQ0KKw0KKwkvLyBkZWZpbmUgbWVkaWEgZnJhbWUgbW9kdWxlIElEDQorCV9NQUtFX01GV19JRCAoMHgwMTAwMDAsIFZPTU1QTEFZKQ0KKwlfTUFLRV9NRldfSUQgKDB4MDIwMDAwLCBWT01NUkVDKQ0KKwlfTUFLRV9NRldfSUQgKDB4MDMwMDAwLCBWT01FKQ0KK307DQorDQorDQorLyogZGVmaW5lIHRoZSBlcnJvciBJRCAqLw0KKyNkZWZpbmUgVk9fRVJSX05PTkUJCQkJCQkweDAwMDAwMDAwDQorI2RlZmluZSBWT19FUlJfRklOSVNICQkJCQkweDAwMDAwMDAxDQorI2RlZmluZSBWT19FUlJfQkFTRQkJCQkJCTBYODAwMDAwMDANCisjZGVmaW5lIFZPX0VSUl9GQUlMRUQJCQkJCTB4ODAwMDAwMDENCisjZGVmaW5lIFZPX0VSUl9PVVRPRl9NRU1PUlkJCQkJMHg4MDAwMDAwMg0KKyNkZWZpbmUgVk9fRVJSX05PVF9JTVBMRU1FTlQJCQkweDgwMDAwMDAzDQorI2RlZmluZSBWT19FUlJfSU5WQUxJRF9BUkcJCQkJMHg4MDAwMDAwNA0KKyNkZWZpbmUgVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTAkJMHg4MDAwMDAwNQ0KKyNkZWZpbmUgVk9fRVJSX09VVFBVVF9CVUZGRVJfU01BTEwJCTB4ODAwMDAwMDYNCisjZGVmaW5lIFZPX0VSUl9XUk9OR19TVEFUVVMJCQkJMHg4MDAwMDAwNw0KKyNkZWZpbmUgVk9fRVJSX1dST05HX1BBUkFNX0lECQkJMHg4MDAwMDAwOA0KKyNkZWZpbmUgVk9fRVJSX0xJQ0VOU0VfRVJST1IJCQkweDgwMDAwMDA5DQorDQorLyogeHh4IGlzIHRoZSBtb2R1bGUgSUQNCisjZGVmaW5lIFZPX0VSUl9GQUlMRUQJCQkJCTB4OHh4eDAwMDENCisjZGVmaW5lIFZPX0VSUl9PVVRPRl9NRU1PUlkJCQkJMHg4eHh4MDAwMg0KKyNkZWZpbmUgVk9fRVJSX05PVF9JTVBMRU1FTlQJCQkweDh4eHgwMDAzDQorI2RlZmluZSBWT19FUlJfSU5WQUxJRF9BUkcJCQkJMHg4eHh4MDAwNA0KKyNkZWZpbmUgVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTAkJMHg4eHh4MDAwNQ0KKyNkZWZpbmUgVk9fRVJSX09VVFBVVF9CVUZGRVJfU01BTEwJCTB4OHh4eDAwMDYNCisjZGVmaW5lIFZPX0VSUl9XUk9OR19TVEFUVVMJCQkJMHg4eHh4MDAwNw0KKyNkZWZpbmUgVk9fRVJSX1dST05HX1BBUkFNX0lECQkJMHg4eHh4MDAwOA0KKyNkZWZpbmUgVk9fRVJSX0xJQ0VOU0VfRVJST1IJCQkweDh4eHgwMDA5DQorLy8gTW9kdWxlIG93biBlcnJvciBJRA0KKyNkZWZpbmUgVk9fRVJSX01vZHVsZQkJCQkJMHg4eHh4MFgwMA0KKyovDQorIA0KKyNkZWZpbmUJVk9fUElEX0NPTU1PTl9CQVNFCQkJCSAweDQwMDAwMDAwCQkJCQkJLyohPCBUaGUgYmFzZSBvZiBjb21tb24gcGFyYW0gSUQgKi8NCisjZGVmaW5lCVZPX1BJRF9DT01NT05fUVVFUllNRU0JCQkoVk9fUElEX0NPTU1PTl9CQVNFIHwgMFgwMDAxKQkvKiE8IFF1ZXJ5IHRoZSBtZW1vcnkgbmVlZGVkOyBSZXNlcnZlZC4gKi8NCisjZGVmaW5lCVZPX1BJRF9DT01NT05fSU5QVVRUWVBFCQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwMikJLyohPCBTZXQgb3IgZ2V0IHRoZSBpbnB1dCBidWZmZXIgdHlwZS4gVk9fSU5QVVRfVFlQRSAqLw0KKyNkZWZpbmUJVk9fUElEX0NPTU1PTl9IQVNSRVNPVVJDRQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwMykJLyohPCBRdWVyeSBpdCBoYXMgcmVzb3VyY2UgdG8gYmUgdXNlZC4gVk9fVTMyICosIDEgaGF2ZSwgMCBObyAqLw0KKyNkZWZpbmUJVk9fUElEX0NPTU1PTl9IRUFEREFUQQkJCShWT19QSURfQ09NTU9OX0JBU0UgfCAwWDAwMDQpCS8qITwgRGVjb2RlciB0cmFjayBoZWFkZXIgZGF0YS4gVk9fQ09ERUNCVUZGRVIgKiAqLw0KKyNkZWZpbmUJVk9fUElEX0NPTU1PTl9GTFVTSAkJCQkoVk9fUElEX0NPTU1PTl9CQVNFIHwgMFgwMDA1KQkvKiE8IEZsdXNoIHRoZSBjb2RlYyBidWZmZXIuIFZPX1UzMiAqLCAxIEZsdXNoLCAwIE5vICogKi8NCisNCisvKg0KKy8vIE1vZHVsZSBQYXJhbSBJRA0KKyNkZWZpbmUgVk9fSURfTWRvdWxlCQkJCQkweDB4eHgxMDAwDQorKi8NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2VuZGlmIC8vIF9fdm9JbmRleF9IX18NCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9NZW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b01lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmI2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9NZW0uaApAQCAtMCwwICsxLDY1IEBACisvKgorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJRmlsZToJCXZvTWVtLmgKKworCUNvbnRlbnQ6CW1lbW9yeSBmdW5jdGlvbnMgJiBkYXRhIHN0cnVjdHVyZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX3ZvTWVtX0hfXworI2RlZmluZSBfX3ZvTWVtX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJ2b0luZGV4LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisJVk9fUzMyCQkJCVNpemU7CQkJCS8qITwgQnVmZmVyIHN0cmlkZSAqLworCVZPX1MzMgkJCQlGbGFnOworCVZPX1BUUgkJCQlWQnVmZmVyOwkJCS8qITwgdXNlciBkYXRhIHBvaW50ZXIgKi8KKwlWT19QVFIJCQkJUEJ1ZmZlcjsJCQkvKiE8IHVzZXIgZGF0YSBwb2ludGVyICovCit9CitWT19NRU1fSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgVk9fTUVNX09QRVJBVE9SCit7CisJVk9fVTMyIChWT19BUEkgKiBBbGxvYykgKFZPX1MzMiB1SUQsIFZPX01FTV9JTkZPICogcE1lbUluZm8pOworCVZPX1UzMiAoVk9fQVBJICogRnJlZSkgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZik7CisJVk9fVTMyIChWT19BUEkgKiBTZXQpIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYsIFZPX1U4IHVWYWx1ZSwgVk9fVTMyIHVTaXplKTsKKwlWT19VMzIgKFZPX0FQSSAqIENvcHkpIChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpOworCVZPX1UzMiAoVk9fQVBJICogQ2hlY2spIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlciwgVk9fVTMyIHVTaXplKTsKKwlWT19TMzIgKFZPX0FQSSAqIENvbXBhcmUpIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlcjEsIFZPX1BUUiBwQnVmZmVyMiwgVk9fVTMyIHVTaXplKTsKKwlWT19VMzIgKFZPX0FQSSAqIE1vdmUpIChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpOworfSBWT19NRU1fT1BFUkFUT1I7CisKKyNkZWZpbmUgdm9NZW1BbGxvYyhwQnVmZiwgcE1lbU9QLCBJRCwgblNpemUpIFwKK3sgXAorCVZPX01FTV9JTkZPIHZvTWVtSW5mbzsgXAorCXZvTWVtSW5mby5TaXplPW5TaXplOyBcCisJcE1lbU9QLT5BbGxvYyhJRCwgJnZvTWVtSW5mbyk7IFwKKwlwQnVmZj0oVk9fUEJZVEUpdm9NZW1JbmZvLlZCdWZmZXI7IFwKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLy8gX192b01lbV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY5MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvVHlwZS5oCkBAIC0wLDAgKzEsMjIxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl2b1R5cGUuaA0KKw0KKwlDb250ZW50OglkYXRhIHR5cGUgZGVmaW5pdGlvbg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2lmbmRlZiBfX3ZvVHlwZV9IX18NCisjZGVmaW5lIF9fdm9UeXBlX0hfXw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNpZmRlZiBfV0lOMzINCisjCWRlZmluZSBWT19BUEkgX19jZGVjbA0KKyMJZGVmaW5lIFZPX0NCSSBfX3N0ZGNhbGwNCisjZWxzZQ0KKyMJZGVmaW5lIFZPX0FQSQ0KKyMJZGVmaW5lIFZPX0NCSQ0KKyNlbmRpZiAvL19XSU4zMg0KKw0KKy8qKiBWT19JTiBpcyB1c2VkIHRvIGlkZW50aWZ5IGlucHV0cyB0byBhbiBWTyBmdW5jdGlvbi4gIFRoaXMgZGVzaWduYXRpb24NCisgICAgd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgcGFyYW1ldGVyDQorICAgIHRoYXQgaXMgdXNlZCBhcyBhbiBvdXRwdXQuICovDQorI2lmbmRlZiBWT19JTg0KKyNkZWZpbmUgVk9fSU4NCisjZW5kaWYNCisNCisvKiogVk9fT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgb3V0cHV0cyBmcm9tIGFuIFZPIGZ1bmN0aW9uLiAgVGhpcw0KKyAgICBkZXNpZ25hdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMNCisgICAgdG8gYSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0LiAqLw0KKyNpZm5kZWYgVk9fT1VUDQorI2RlZmluZSBWT19PVVQNCisjZW5kaWYNCisNCisvKiogVk9fSU5PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIGVpdGhlciBpbnB1dHMgb3INCisgICAgb3V0cHV0cyBmcm9tIGFuIFZPIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwNCisgICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdA0KKyAgICBpcyB1c2VkIGJvdGggYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dC4gKi8NCisjaWZuZGVmIFZPX0lOT1VUDQorI2RlZmluZSBWT19JTk9VVA0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgVk9fTUFYX0VOVU1fVkFMVUUJMFg3RkZGRkZGRg0KKw0KKy8qKiBWT19WT0lEICovDQordHlwZWRlZiB2b2lkIFZPX1ZPSUQ7DQorDQorLyoqIFZPX1U4IGlzIGFuIDggYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovDQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZPX1U4Ow0KKw0KKy8qKiBWT19CWVRFIGlzIGFuIDggYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovDQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZPX0JZVEU7DQorDQorLyoqIFZPX1M4IGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLw0KK3R5cGVkZWYgc2lnbmVkIGNoYXIgVk9fUzg7DQorDQorLyoqIFZPX0NIQVIgaXMgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovDQordHlwZWRlZiBjaGFyIFZPX0NIQVI7DQorDQorLyoqIFZPX1UxNiBpcyBhIDE2IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFZPX1UxNjsNCisNCisvKiogVk9fV0NIQVIgaXMgYSAxNiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovDQorI2lmIGRlZmluZWQgX1dJTjMyDQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBWT19XQ0hBUjsNCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0KiBWT19QV0NIQVI7DQorI2VsaWYgZGVmaW5lZCBMSU5VWA0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBWT19XQ0hBUjsNCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIqIFZPX1BXQ0hBUjsNCisjZW5kaWYNCisNCisvKiogVk9fUzE2IGlzIGEgMTYgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBWT19TMTY7DQorDQorLyoqIFZPX1UzMiBpcyBhIDMyIGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVk9fVTMyOw0KKw0KKy8qKiBWT19TMzIgaXMgYSAzMiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLw0KK3R5cGVkZWYgc2lnbmVkIGxvbmcgVk9fUzMyOw0KKw0KKy8qIFVzZXJzIHdpdGggY29tcGlsZXJzIHRoYXQgY2Fubm90IGFjY2VwdCB0aGUgImxvbmcgbG9uZyIgZGVzaWduYXRpb24gc2hvdWxkDQorICAgZGVmaW5lIHRoZSBWT19TS0lQNjRCSVQgbWFjcm8uICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG1heSBjYXVzZQ0KKyAgIHNvbWUgY29tcG9uZW50cyB0byBmYWlsIHRvIGNvbXBpbGUgaWYgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbiB0byByZXF1aXJlDQorICAgNjQgYml0IGludGVncmFsIHR5cGVzLiAgSG93ZXZlciwgdGhlc2UgY29tcG9uZW50cyB3b3VsZCBOT1QgY29tcGlsZSBhbnl3YXkNCisgICBzaW5jZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgd2F5IHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4uDQorKi8NCisjaWZuZGVmIFZPX1NLSVA2NEJJVA0KKyNpZmRlZiBfV0lOMzINCisvKiogVk9fVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLw0KK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgVk9fVTY0Ow0KKy8qKiBWT19TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLw0KK3R5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgVk9fUzY0Ow0KKyNlbHNlIC8vIFdJTjMyDQorLyoqIFZPX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBWT19VNjQ7DQorLyoqIFZPX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovDQordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIFZPX1M2NDsNCisjZW5kaWYgLy8gV0lOMzINCisjZW5kaWYgLy8gVk9fU0tJUDY0QklUDQorDQorLyoqIFRoZSBWT19CT09MIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0cnVlIG9yIGEgZmFsc2UNCisgICAgdmFsdWUgd2hlbiBwYXNzaW5nIHBhcmFtZXRlcnMgdG8gYW5kIGZyb20gdGhlIFZPIGNvcmUgYW5kIGNvbXBvbmVudHMuICBUaGUNCisgICAgVk9fQk9PTCBpcyBhIDMyIGJpdCBxdWFudGl0eSBhbmQgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCB3b3JkIGJvdW5kYXJ5Lg0KKyAqLw0KK3R5cGVkZWYgZW51bSBWT19CT09MIHsNCisgICAgVk9fRkFMU0UgPSAwLA0KKyAgICBWT19UUlVFID0gIVZPX0ZBTFNFLA0KKwlWT19CT09MX01BWCA9IFZPX01BWF9FTlVNX1ZBTFVFDQorfSBWT19CT09MOw0KKw0KKy8qKiBUaGUgVk9fUFRSIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIHBvaW50ZXJzIGJldHdlZW4gdGhlIFZPDQorICAgIGFwcGxpY2F0aW9ucyBhbmQgdGhlIFZPIENvcmUgYW5kIGNvbXBvbmVudHMuICBUaGlzIGlzIGEgMzIgYml0IHBvaW50ZXIgYW5kDQorICAgIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgYm91bmRhcnkuDQorICovDQordHlwZWRlZiB2b2lkKiBWT19QVFI7DQorDQorLyoqIFRoZSBWT19IQU5ETEUgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgcG9pbnRlcnMgYmV0d2VlbiB0aGUgVk8NCisgICAgYXBwbGljYXRpb25zIGFuZCB0aGUgVk8gQ29yZSBhbmQgY29tcG9uZW50cy4gIFRoaXMgaXMgYSAzMiBiaXQgcG9pbnRlciBhbmQNCisgICAgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4NCisgKi8NCit0eXBlZGVmIHZvaWQqIFZPX0hBTkRMRTsNCisNCisvKiogVGhlIFZPX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4NCisgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29yZSBhbmQgY29tcG9uZW50LiAgVGhlIFZPX1NUUklORyB0eXBlIGlzIGEgMzINCisgICAgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQgYWxpZ25lZCBhbmQNCisgICAgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuDQorICovDQordHlwZWRlZiBjaGFyKiBWT19QQ0hBUjsNCisNCisvKiogVGhlIFZPX1BCWVRFIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIGFycmF5cyBvZiBieXRlcyBzdWNoIGFzDQorICAgIGJ1ZmZlcnMgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgYW5kIGNvcmUuICBUaGUgVk9fUEJZVEUNCisgICAgdHlwZSBpcyBhIDMyIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkDQorICAgIGFsaWduZWQgYW5kIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLg0KKyAqLw0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciogVk9fUEJZVEU7DQorDQorLyoqIFRoZSBWT19QVENIQVIgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgYXJyYXlzIG9mIHdjaGFyIHN1Y2ggYXMNCisgICAgdW5pY29kZSBjaGFyIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIFZPX1BUQ0hBUg0KKyAgICB0eXBlIGlzIGEgMzIgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQNCisgICAgYWxpZ25lZCBhbmQgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuDQorICovDQorLyoNCisjaWYgIWRlZmluZWQgTElOVVgNCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0KiBWT19QVENIQVI7DQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCogVk9fVENIQVI7DQorI2Vsc2UNCit0eXBlZGVmIGNoYXIqIFZPX1BUQ0hBUjsNCit0eXBlZGVmIGNoYXIgVk9fVENIQVI7DQorI2VuZGlmDQorKi8NCisNCisjaWZuZGVmIE5VTEwNCisjaWZkZWYgX19jcGx1c3BsdXMNCisjZGVmaW5lIE5VTEwgICAgMA0KKyNlbHNlDQorI2RlZmluZSBOVUxMICAgICgodm9pZCAqKTApDQorI2VuZGlmDQorI2VuZGlmDQorDQorLyoqDQorICogSW5wdXQgc3RyZWFtIGZvcm1hdCwgRnJhbWUgb3IgU3RyZWFtLi4NCisgKi8NCit0eXBlZGVmIGVudW0gew0KKyAgICBWT19JTlBVVF9GUkFNRQk9IDEsCS8qITwgSW5wdXQgY29udGFpbnMgY29tcGxldGVseSBmcmFtZShzKSBkYXRhLiAqLw0KKyAgICBWT19JTlBVVF9TVFJFQU0sCQkvKiE8IElucHV0IGlzIHN0cmVhbSBkYXRhLiAqLw0KKwlWT19JTlBVVF9TVFJFQU1fTUFYID0gVk9fTUFYX0VOVU1fVkFMVUUNCit9IFZPX0lOUFVUX1RZUEU7DQorDQorDQorLyoqDQorICogR2VuZXJhbCBkYXRhIGJ1ZmZlciwgdXNlZCBhcyBpbnB1dCBvciBvdXRwdXQuDQorICovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlWT19QQllURQlCdWZmZXI7CQkvKiE8IEJ1ZmZlciBwb2ludGVyICovDQorCVZPX1UzMgkJTGVuZ3RoOwkJLyohPCBCdWZmZXIgc2l6ZSBpbiBieXRlICovDQorCVZPX1M2NAkJVGltZTsJCS8qITwgVGhlIHRpbWUgb2YgdGhlIGJ1ZmZlciAqLw0KK30gVk9fQ09ERUNCVUZGRVI7DQorDQorDQorLyoqDQorICogVGhlIGluaXQgbWVtZGF0YSBmbGFnLg0KKyAqLw0KK3R5cGVkZWYgZW51bXsNCisJVk9fSU1GX1VTRVJNRU1PUEVSQVRPUgkJPTAsCS8qITwgbWVtRGF0YSBpcyAgdGhlIHBvaW50ZXIgb2YgbWVtb3BlcmF0b3IgZnVuY3Rpb24qLw0KKwlWT19JTUZfUFJFQUxMT0NBVEVEQlVGRkVSCT0xLAkvKiE8IG1lbURhdGEgaXMgIHByZWFsbG9jYXRlZCBtZW1vcnkqLw0KKwlWT19JTUZfTUFYID0gVk9fTUFYX0VOVU1fVkFMVUUNCit9Vk9fSU5JVF9NRU1fRmxBRzsNCisNCisNCisvKioNCisgKiBUaGUgaW5pdCBtZW1vcnkgc3RydWN0dXJlLi4NCisgKi8NCit0eXBlZGVmIHN0cnVjdHsNCisJVk9fSU5JVF9NRU1fRmxBRwkJCW1lbWZsYWc7CS8qITxtZW1vcnkgZmxhZyAgKi8NCisJVk9fUFRSCQkJCQkJbWVtRGF0YTsJLyohPGEgcG9pbnRlciB0byBWT19NRU1fT1BFUkFUT1Igb3IgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyICAqLw0KKwlWT19VMzIJCQkJCQlyZXNlcnZlZDE7CS8qITxyZXNlcnZlZCAgKi8NCisJVk9fVTMyCQkJCQkJcmVzZXJ2ZWQyOwkvKiE8cmVzZXJ2ZWQgKi8NCit9Vk9fQ09ERUNfSU5JVF9VU0VSREFUQTsNCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2VuZGlmIC8vIF9fdm9UeXBlX0hfXw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDMxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI5ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBHNzExRGVjb2Rlci5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0c3MTFEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9HNzExRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxNGU0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9HNzExRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkc3MTFEZWNvZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRzcxMURlY29kZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgPSAxNjM4NDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitHNzExRGVjb2Rlcjo6RzcxMURlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgeworfQorCitHNzExRGVjb2Rlcjo6fkc3MTFEZWNvZGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBHNzExRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBtSXNNTGF3ID0gZmFsc2U7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVykpIHsKKyAgICAgICAgbUlzTUxhdyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigKKyAgICAgICAgICAgIG5ldyBNZWRpYUJ1ZmZlcihrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpKSk7CisKKyAgICBtU291cmNlLT5zdGFydCgpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHNzExRGVjb2Rlcjo6c3RvcCgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7CisKKyAgICBtU291cmNlLT5zdG9wKCk7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gRzcxMURlY29kZXI6OmdldEZvcm1hdCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKworICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRzcxMURlY29kZXIiKTsKKworICAgIHJldHVybiBtZXRhOworfQorCitzdGF0dXNfdCBHNzExRGVjb2Rlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgc3RhdHVzX3QgZXJyOworCisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWVrVGltZVVzID0gLTE7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXIgKmluQnVmZmVyOworICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmluQnVmZmVyLCBvcHRpb25zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpID4ga01heE51bVNhbXBsZXNQZXJGcmFtZSkgeworICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICBpbkJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBpbkJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGluQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICBjb25zdCB1aW50OF90ICppbnB1dFB0ciA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopaW5CdWZmZXItPmRhdGEoKSArIGluQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIE1lZGlhQnVmZmVyICpvdXRCdWZmZXI7CisgICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0QnVmZmVyKSwgT0spOworCisgICAgaWYgKG1Jc01MYXcpIHsKKyAgICAgICAgRGVjb2RlTUxhdygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90ICo+KG91dEJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBpbnB1dFB0ciwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEZWNvZGVBTGF3KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDE2X3QgKj4ob3V0QnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGlucHV0UHRyLCBpbkJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIH0KKworICAgIC8vIEVhY2ggOC1iaXQgYnl0ZSBpcyBjb252ZXJ0ZWQgaW50byBhIDE2LWJpdCBzYW1wbGUuCisgICAgb3V0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpICogMik7CisKKyAgICBvdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgIGluQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgaW5CdWZmZXIgPSBOVUxMOworCisgICAgKm91dCA9IG91dEJ1ZmZlcjsKKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIEc3MTFEZWNvZGVyOjpEZWNvZGVBTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZS0tID4gMCkgeworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICAgIGl4ICY9IDB4N2Y7CisKKyAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKKyAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICAgIGlmIChpZXhwID4gMCkgeworICAgICAgICAgICAgbWFudCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7CisKKyAgICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEc3MTFEZWNvZGVyOjpEZWNvZGVNTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZS0tID4gMCkgeworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7CisgICAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworCisgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawppbmRleCA0MDNkYTU4Li4yZDliY2M2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCkBAIC00Myw3ICs0Myw3IEBACiAJJChMT0NBTF9QQVRIKS9zcmMgXAogCSQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL000dkgyNjNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCmluZGV4IDgzNTBmN2EuLjBmMDhmNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCkBAIC0zNyw3ICszNyw4IEBACiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtSGFuZGxlKG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzKSwKICAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApIHsKKyAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbVRhcmdldFRpbWVVcygtMSkgewogCiAgICAgTE9HVigiTTR2SDI2M0RlY29kZXIiKTsKICAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKQEAgLTE0Niw2ICsxNDcsNyBAQAogICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbVRhcmdldFRpbWVVcyA9IC0xOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE3NSw4ICsxNzcsMTEgQEAKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKKyAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIHNlZWtpbmcgPSB0cnVlOwogICAgICAgICBDSEVDS19FUShQVlJlc2V0VmlkZW9EZWNvZGVyKG1IYW5kbGUpLCBQVl9UUlVFKTsKICAgICB9CiAKQEAgLTE4Niw2ICsxOTEsMTYgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoc2Vla2luZykgeworICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVVczsKKyAgICAgICAgaWYgKGlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQorICAgICAgICAgICAgICAgICYmIHRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gdGFyZ2V0VGltZVVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICB9CisgICAgfQorCiAgICAgdWludDhfdCAqYml0c3RyZWFtID0KICAgICAgICAgKHVpbnQ4X3QgKikgaW5wdXRCdWZmZXItPmRhdGEoKSArIGlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIApAQCAtMjIxLDE3ICsyMzYsNDAgQEAKICAgICAgICAgcmV0dXJuIElORk9fRk9STUFUX0NIQU5HRUQ7CiAgICAgfQogCi0gICAgKm91dCA9IG1GcmFtZXNbbU51bVNhbXBsZXNPdXRwdXQgJiAweDAxXTsKLSAgICAoKm91dCktPmFkZF9yZWYoKTsKLQogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAKLSAgICArK21OdW1TYW1wbGVzT3V0cHV0OwogICAgIGlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgaW5wdXRCdWZmZXIgPSBOVUxMOwogCisgICAgYm9vbCBza2lwRnJhbWUgPSBmYWxzZTsKKworICAgIGlmIChtVGFyZ2V0VGltZVVzID49IDApIHsKKyAgICAgICAgQ0hFQ0sodGltZVVzIDw9IG1UYXJnZXRUaW1lVXMpOworCisgICAgICAgIGlmICh0aW1lVXMgPCBtVGFyZ2V0VGltZVVzKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgZnJhbWUgd2l0aCB0aGUgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBhbmQgd2Ugd29uJ3QgcmV0dXJuIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgICAgICAgIHNraXBGcmFtZSA9IHRydWU7CisKKyAgICAgICAgICAgIExPR1YoInNraXBwaW5nIGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigiZm91bmQgdGFyZ2V0IGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2tpcEZyYW1lKSB7CisgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm91dCA9IG1GcmFtZXNbbU51bVNhbXBsZXNPdXRwdXQgJiAweDAxXTsKKyAgICAgICAgKCpvdXQpLT5hZGRfcmVmKCk7CisgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIH0KKworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzMxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIE00dkgyNjNFbmNvZGVyLmNwcCBcCisgICAgc3JjL2JpdHN0cmVhbV9pby5jcHAgXAorICAgIHNyYy9jb21iaW5lZF9lbmNvZGUuY3BwIFwKKyAgICBzcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCBcCisgICAgc3JjL2RjdC5jcHAgXAorICAgIHNyYy9maW5kaGFsZnBlbC5jcHAgXAorICAgIHNyYy9mYXN0Y29kZW1iLmNwcCBcCisgICAgc3JjL2Zhc3RpZGN0LmNwcCBcCisgICAgc3JjL2Zhc3RxdWFudC5jcHAgXAorICAgIHNyYy9tZV91dGlscy5jcHAgXAorICAgIHNyYy9tcDRlbmNfYXBpLmNwcCBcCisgICAgc3JjL3JhdGVfY29udHJvbC5jcHAgXAorICAgIHNyYy9tb3Rpb25fZXN0LmNwcCBcCisgICAgc3JjL21vdGlvbl9jb21wLmNwcCBcCisgICAgc3JjL3NhZC5jcHAgXAorICAgIHNyYy9zYWRfaGFsZnBlbC5jcHAgXAorICAgIHNyYy92bGNfZW5jb2RlLmNwcCBcCisgICAgc3JjL3ZvcC5jcHAKKworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYworCitMT0NBTF9DRkxBR1MgOj0gXAorICAgIC1EQlhfUkMgXAorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NNHZIMjYzRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL000dkgyNjNFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDExMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NNHZIMjYzRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk00dkgyNjNFbmNvZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTTR2SDI2M0VuY29kZXIuaCIKKworI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW5saW5lIHN0YXRpYyB2b2lkIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmlueXV2LCB1aW50OF90KiBvdXR5dXYsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisKKyAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgdWludDMyX3QgKm91dHkgPSAodWludDMyX3QgKikgIG91dHl1djsKKyAgICB1aW50MTZfdCAqb3V0Y2IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplKTsKKyAgICB1aW50MTZfdCAqb3V0Y3IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKKworICAgIC8qIFkgY29weWluZyAqLworICAgIG1lbWNweShvdXR5LCBpbnl1diwgb3V0WXNpemUpOworCisgICAgLyogVSAmIFYgY29weWluZyAqLworICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOworICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOworCisgICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKKyAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7CisgICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOworICAgICAgICB9CisgICAgfQorfQorCitNNHZIMjYzRW5jb2Rlcjo6TTR2SDI2M0VuY29kZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lcygtMSksCisgICAgICBtTmV4dE1vZFRpbWVVcygwKSwKKyAgICAgIG1QcmV2VGltZXN0YW1wVXMoLTEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAorICAgICAgbUlucHV0RnJhbWVEYXRhKE5VTEwpLAorICAgICAgbUdyb3VwKE5VTEwpIHsKKworICAgIExPR1YoIkNvbnN0cnVjdCBzb2Z0d2FyZSBNNHZIMjYzRW5jb2RlciIpOworCisgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9FbmNDb250cm9scykpOworCisgICAgbUluaXRDaGVjayA9IGluaXRDaGVjayhtZXRhKTsKK30KKworTTR2SDI2M0VuY29kZXI6On5NNHZIMjYzRW5jb2RlcigpIHsKKyAgICBMT0dWKCJEZXN0cnVjdCBzb2Z0d2FyZSBNNHZIMjYzRW5jb2RlciIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorCisgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgZGVsZXRlIG1IYW5kbGU7Cit9CisKK3N0YXR1c190IE00dkgyNjNFbmNvZGVyOjppbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgTE9HVigiaW5pdENoZWNrIik7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1WaWRlb1dpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtVmlkZW9IZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtVmlkZW9GcmFtZVJhdGUpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZtVmlkZW9CaXRSYXRlKSk7CisKKyAgICAvLyBYWFg6IEFkZCBtb3JlIGNvbG9yIGZvcm1hdCBzdXBwb3J0CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJm1WaWRlb0NvbG9yRm9ybWF0KSk7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgICAgICBMT0dFKCJDb2xvciBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCIsIG1WaWRlb0NvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsb2NhdGUgc3BhcmUgYnVmZmVyIG9ubHkgd2hlbiBjb2xvciBjb252ZXJzaW9uIGlzIG5lZWRlZC4KKyAgICAgICAgLy8gQXNzdW1lIHRoZSBjb2xvciBmb3JtYXQgaXMgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIuCisgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9CisgICAgICAgICAgICAodWludDhfdCAqKSBtYWxsb2MoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyApID4+IDEpOworICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEpOworICAgIH0KKworICAgIC8vIFhYWDogUmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24KKyAgICBpZiAobVZpZGVvV2lkdGggJSAxNiAhPSAwIHx8IG1WaWRlb0hlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgTE9HRSgiVmlkZW8gZnJhbWUgc2l6ZSAlZHglZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYiLAorICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcyA9IG5ldyB0YWd2aWRlb0VuY09wdGlvbnM7CisgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICBpZiAoIVBWR2V0RGVmYXVsdEVuY09wdGlvbihtRW5jUGFyYW1zLCAwKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIE5lZWQgdG8ga25vdyB3aGljaCByb2xlIHRoZSBlbmNvZGVyIGlzIGluLgorICAgIC8vIFhYWDogU2V0IHRoZSBtb2RlIHByb3BlciBmb3Igb3RoZXIgdHlwZXMgb2YgYXBwbGljYXRpb25zCisgICAgLy8gICAgICBsaWtlIHN0cmVhbWluZyBvciB2aWRlbyBjb25mZXJlbmNlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgfHwKKyAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKTsKKyAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkpIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IEgyNjNfTU9ERTsKKyAgICB9CisgICAgbUVuY1BhcmFtcy0+ZW5jV2lkdGhbMF0gPSBtVmlkZW9XaWR0aDsKKyAgICBtRW5jUGFyYW1zLT5lbmNIZWlnaHRbMF0gPSBtVmlkZW9IZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbVZpZGVvRnJhbWVSYXRlOworICAgIG1FbmNQYXJhbXMtPnJjVHlwZSA9IFZCUl8xOworICAgIG1FbmNQYXJhbXMtPnZidkRlbGF5ID0gKGZsb2F0KTUuMDsKKworICAgIC8vIFNldCBwcm9maWxlIGFuZCBsZXZlbAorICAgIC8vIElmIHByb2ZpbGUgYW5kIGxldmVsIHNldHRpbmcgaXMgbm90IGNvcnJlY3QsIGZhaWx1cmUKKyAgICAvLyBpcyByZXBvcnRlZCB3aGVuIHRoZSBlbmNvZGVyIGlzIGluaXRpYWxpemVkLgorICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIGludDMyX3QgcHJvZmlsZUxldmVsOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZwcm9maWxlTGV2ZWwpKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSAoUHJvZmlsZUxldmVsVHlwZSlwcm9maWxlTGV2ZWw7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+cGFja2V0U2l6ZSA9IDMyOworICAgIG1FbmNQYXJhbXMtPnJ2bGNFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+bnVtTGF5ZXJzID0gMTsKKyAgICBtRW5jUGFyYW1zLT50aW1lSW5jUmVzID0gMTAwMDsKKyAgICBtRW5jUGFyYW1zLT50aWNrUGVyU3JjID0gbUVuY1BhcmFtcy0+dGltZUluY1JlcyAvIG1WaWRlb0ZyYW1lUmF0ZTsKKworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtVmlkZW9CaXRSYXRlOworICAgIG1FbmNQYXJhbXMtPmlRdWFudFswXSA9IDE1OworICAgIG1FbmNQYXJhbXMtPnBRdWFudFswXSA9IDEyOworICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CisgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBpbnQzMl90IGlGcmFtZXNJbnRlcnZhbFNlYzsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgJmlGcmFtZXNJbnRlcnZhbFNlYykpOworICAgIGlmIChpRnJhbWVzSW50ZXJ2YWxTZWMgPCAwKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmludHJhUGVyaW9kID0gLTE7CisgICAgfSBlbHNlIGlmIChpRnJhbWVzSW50ZXJ2YWxTZWMgPT0gMCkgeworICAgICAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IDE7ICAvLyBBbGwgSSBmcmFtZXMKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9CisgICAgICAgICAgICAoaUZyYW1lc0ludGVydmFsU2VjICogbVZpZGVvRnJhbWVSYXRlKTsKKyAgICB9CisKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgbVZpZGVvV2lkdGgpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIG1WaWRlb0hlaWdodCk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaWRlb0JpdFJhdGUpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmlkZW9GcmFtZVJhdGUpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgbVZpZGVvQ29sb3JGb3JtYXQpOworCisgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOworICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJNNHZIMjYzRW5jb2RlciIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTTR2SDI2M0VuY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBMT0dWKCJzdGFydCIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIobUhhbmRsZSwgbUVuY1BhcmFtcykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICBpbnQzMl90IG1heFNpemU7CisgICAgaWYgKCFQVkdldE1heFZpZGVvRnJhbWVTaXplKG1IYW5kbGUsICZtYXhTaXplKSkgeworICAgICAgICBtYXhTaXplID0gMjU2ICogMTAyNDsgIC8vIE1hZ2ljICMKKyAgICB9CisgICAgTE9HVigiTWF4IG91dHB1dCBidWZmZXIgc2l6ZTogJWQiLCBtYXhTaXplKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1heFNpemUpKTsKKworICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7ICAvLyAxc3QgZnJhbWUgY29udGFpbnMgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTTR2SDI2M0VuY29kZXI6OnN0b3AoKSB7CisgICAgTE9HVigic3RvcCIpOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUdyb3VwKSB7CisgICAgICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgICAgIG1Hcm91cCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSkgeworICAgICAgICBkZWxldGUgbUlucHV0RnJhbWVEYXRhOworICAgICAgICBtSW5wdXRGcmFtZURhdGEgPSBOVUxMOworICAgIH0KKworICAgIENIRUNLKFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKSk7CisKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IE00dkgyNjNFbmNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgTE9HVigiZ2V0Rm9ybWF0Iik7CisgICAgcmV0dXJuIG1Gb3JtYXQ7Cit9CisKK3N0YXR1c190IE00dkgyNjNFbmNvZGVyOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgICpvdXQgPSBOVUxMOworCisgICAgTWVkaWFCdWZmZXIgKm91dHB1dEJ1ZmZlcjsKKyAgICBDSEVDS19FUShPSywgbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0cHV0QnVmZmVyKSk7CisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKikgb3V0cHV0QnVmZmVyLT5kYXRhKCk7CisgICAgaW50MzJfdCBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyLT5zaXplKCk7CisKKyAgICAvLyBPdXRwdXQgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIGlmICghUFZHZXRWb2xIZWFkZXIobUhhbmRsZSwgb3V0UHRyLCAmZGF0YUxlbmd0aCwgMCkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiT3V0cHV0IFZPTCBoZWFkZXI6ICVkIGJ5dGVzIiwgZGF0YUxlbmd0aCk7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAxKTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgZGF0YUxlbmd0aCk7CisgICAgICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7CisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gUmVhZHkgZm9yIGFjY2VwdGluZyBhbiBpbnB1dCB2aWRlbyBmcmFtZQorICAgIGlmIChPSyAhPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsIG9wdGlvbnMpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gZGF0YSBzb3VyY2UiKTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXItPnNpemUoKSAtICgobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxKSAhPSAwKSB7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICAvLyBXaGVuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGlzIHRoZSBzYW1lIGFzIHRoYXQKKyAgICAvLyBvZiB0aGUgcHJldmlvdXMgc2FtcGxlLCBlbmNvZGluZyBvZiB0aGUgY3VycmVudCBzYW1wbGUgaXMKKyAgICAvLyBieXBhc3NlZCwgYW5kIHRoZSBvdXRwdXQgbGVuZ3RoIG9mIHRoZSBzYW1wbGUgaXMgc2V0IHRvIDAKKyAgICBpZiAobU51bUlucHV0RnJhbWVzID49IDEgJiYKKyAgICAgICAgKG1OZXh0TW9kVGltZVVzID4gdGltZVVzIHx8IG1QcmV2VGltZXN0YW1wVXMgPT0gdGltZVVzKSkgeworICAgICAgICAvLyBGcmFtZSBhcnJpdmVzIHRvbyBsYXRlCisgICAgICAgIG91dHB1dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIDApOworICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIERvbid0IGFjY2VwdCBvdXQtb2Ytb3JkZXIgc2FtcGxlcworICAgIENIRUNLKG1QcmV2VGltZXN0YW1wVXMgPCB0aW1lVXMpOworICAgIG1QcmV2VGltZXN0YW1wVXMgPSB0aW1lVXM7CisKKyAgICAvLyBDb2xvciBjb252ZXJ0IHRvIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgaWYgbmVjZXNzYXJ5CisgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgdWludDhfdCAqaW5QdHIgPSAodWludDhfdCAqKSBtSW5wdXRCdWZmZXItPmRhdGEoKTsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEpOworICAgICAgICBDSEVDSyhtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgICAgICBpblB0ciwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgaW5QdHIgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgfQorICAgIENIRUNLKGluUHRyICE9IE5VTEwpOworCisgICAgLy8gUmVhZHkgZm9yIGVuY29kaW5nIGEgdmlkZW8gZnJhbWUKKyAgICBWaWRlb0VuY0ZyYW1lSU8gdmluLCB2b3V0OworICAgIHZpbi5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCArIDE1KSA+PiA0KSA8PCA0OworICAgIHZpbi5waXRjaCAgPSAoKG1WaWRlb1dpZHRoICArIDE1KSA+PiA0KSA8PCA0OworICAgIHZpbi50aW1lc3RhbXAgPSAodGltZVVzICsgNTAwKSAvIDEwMDA7IC8vIGluIG1zCisgICAgdmluLnlDaGFuID0gaW5QdHI7CisgICAgdmluLnVDaGFuID0gdmluLnlDaGFuICsgdmluLmhlaWdodCAqIHZpbi5waXRjaDsKKyAgICB2aW4udkNoYW4gPSB2aW4udUNoYW4gKyAoKHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2gpID4+IDIpOworICAgIHVuc2lnbmVkIGxvbmcgbW9kVGltZU1zID0gMDsKKyAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICBpZiAoIVBWRW5jb2RlVmlkZW9GcmFtZShtSGFuZGxlLCAmdmluLCAmdm91dCwKKyAgICAgICAgICAgICZtb2RUaW1lTXMsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZuTGF5ZXIpIHx8CisgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW5rIHRyYWNrIGF0IGZyYW1lICVsbGQiLAorICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzKTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgQ0hFQ0tfRVEoTlVMTCwgUFZHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKyAgICBpZiAoaGludFRyYWNrLkNvZGVUeXBlID09IDApIHsgIC8vIEktZnJhbWUgc2VydmVzIGFzIHN5bmMgZnJhbWUKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICB9CisKKyAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICBtTmV4dE1vZFRpbWVVcyA9IG1vZFRpbWVNcyAqIDEwMDBMTDsKKyAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCBkYXRhTGVuZ3RoKTsKKyAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE00dkgyNjNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvY3ZlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU1NGRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaApAQCAtMCwwICsxLDQzNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRmlsZTogY3ZlaS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiogQGludHJvZHVjdGlvbiAgIENvbW1vbiBWaWRlbyBFbmNvZGVyIEludGVyZmFjZSAoQ1ZFSSkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieQorICAgIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gY3JlYXRlIGEgbXVsdGltZWRpYSBhcHBsaWNhdGlvbiB3aXRoIHZpZGVvCisgICAgZW5jb2RpbmcgZmVhdHVyZS4gQ1ZFSSBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgbmV3IHZpZGVvIGVuY29kZXIgYWxnb3JpdGhtcyBvcgorICAgIG1vZHVsZXMgY2FuIGJlIHBsdWdnZWQgaW4gc2VhbWxlc3NseSB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uIEluIG90aGVyIHdvcmRzLAorICAgIGFueSBjaGFuZ2VzIHRvIHRoZSBDVkVJIGxpYnJhcnkgYXJlIHRyYW5zcGFyZW50IHRvIHRoZSB1c2Vycy4gVXNlcnMgY2FuIHN0aWxsCisgICAgdXNlIHRoZSBzYW1lIHNldCBvZiBBUElzIGZvciBuZXcgZW5jb2RpbmcgdG9vbHMuCisKKyAgICBAcmVxdWlyZW1lbnQgICAgQ1ZFSSB3aWxsIHRha2UgYW4gaW5wdXQgZnJhbWUgaW4gb25lIG9mIHNldmVyYWwgZm9ybWF0IHN1cHBvcnRlZAorICAgIGJ5IFBWIGFuZCBlbmNvZGUgaXQgdG8gYW4gTVBFRzQgYml0c3RyZWFtLiBJdCB3aWxsIGFsc28gcmV0dXJuIGEgcmVjb25zdHJ1Y3RlZAorICAgIGltYWdlIGluIFlVViA0OjI6MCBmb3JtYXQuIEN1cnJlbnRseSB0aGUgaW5wdXQgZm9ybWF0IHN1cHBvcnRlZCBhcmUgWVVWIDQ6MjowLAorICAgIFJHQjI0IGFuZCBVWVZZIDQ6MjoyLgorCisgICAgQ1ZFSSBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgaXQgaXMgc2ltcGxlIHRvIHVzZS4gSXQgc2hvdWxkIGhpZGVzIGltcGxlbWVudGF0aW9uCisgICAgZGVwZW5kZW5jeSAgZnJvbSB0aGUgdXNlcnMuIEluIHRoaXMgdmVyc2lvbiwgd2UgZGVjaWRlZCB0aGF0IHRoZSBvcGVyYXRpb24gd2lsbAorICAgIGJlIHN5bmNocm9ub3VzLCBpLmUuLCB0aGUgZW5jb2Rpbmcgd2lsbCBiZSBhIGJsb2NrZWQgY2FsbC4gQXN5bmNocm9ub3VzIG9wZXJhdGlvbgorICAgIHdpbGwgYmUgaW4gdGhlIGxldmVsIGFib3ZlIENWRUksIGkuZS4sIGluIEF1dGhvciBFbmdpbmUgVmlkZW8gTW9kdWxlIHdoaWNoIHdpbGwKKyAgICB0YWtlIGNhcmUgb2YgY2FwdHVyaW5nIGRldmljZSBhcyB3ZWxsLgorCisgICAgQGJyaWVmICBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgdG8gaW50ZXJmYWNlIHdpdGggY29kZWNzLiBUaGVpciBuYW1lcworICAgIGFyZSBDUFZ4eHhWaWRlb0VuY29kZXIgd2hlcmUgeHh4IGlzIGNvZGVjIHNwZWNpZmljIHN1Y2ggYXMgTVBFRzQsIEgyNjMsIEgyNkwsCisgICAgZXRjLiBBbGwgb2YgdGhlbSBhcmUgc3ViY2xhc3NlcyBvZiBDUFZDb21tb25WaWRlb0VuY29kZXIuCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NWRUlfSAorI2RlZmluZSBfX0NWRUlfSAorCisjaW5jbHVkZSAib3NjbF9zY2hlZHVsZXJfYW8uaCIKKyNpbmNsdWRlICJvc2NsX2Jhc2UuaCIKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiIC8qIGZvciBNUDRIaW50VHJhY2sgKi8KKworI2RlZmluZSBNQVhfTEFZRVIgMgorCisvKiogR2VuZXJhbCByZXR1cm5lZCB2YWx1ZXMuICovCitlbnVtIFRDVkVJX1JFVFZBTAoreworICAgIEVDVkVJX1NVQ0NFU1MsCisgICAgRUNWRUlfRkFJTCwKKyAgICBFQ1ZFSV9GTFVTSCwKKyAgICBFQ1ZFSV9NT1JFX09VVFBVVAorfSA7CisKKy8qKiBSZXR1cm5lZCBldmVudHMgd2l0aCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uICovCitlbnVtIFRDVkVJX0VWRU5UCit7CisgICAgLyoqIENhbGxlZCB3aGVuIGEgcGFja2V0IG9yIGEgZnJhbWUgb2Ygb3V0cHV0IGJpdHN0cmVhbSBpcyByZWFkeS4gKi8KKyAgICBFQ1ZFSV9CVUZGRVJfUkVBRFksCisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgcGFja2V0IG9mIGEgZnJhbWUgb2Ygb3V0cHV0IGJpdHN0cmVhbSBpcyByZWFkeS4gKi8KKyAgICBFQ1ZFSV9GUkFNRV9ET05FLAorCisgICAgLyoqIENhbGxlZCB3aGVuIG5vIGJ1ZmZlcnMgaXMgYXZhaWxhYmxlIGZvciBvdXRwdXQgYml0c3RyZWFtLiBBIGJ1ZmZlciBjYW4gYmUgYWRkZWQgdGhydSBBZGRCdWZmZXIgQVBJLiAqLworICAgIEVDVkVJX05PX0JVRkZFUlMsCisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgZW5jb2Rpbmcgb3BlcmF0aW9uLiAqLworICAgIEVDVkVJX0VSUk9SCit9OworCisvKiogQ29udGFpbnMgc3VwcG9ydGVkIGlucHV0IGZvcm1hdCAqLworZW51bSBUUFZWaWRlb0Zvcm1hdAoreworICAgIEVDVkVJX1JHQjI0LAorICAgIEVDVkVJX1JHQjEyLAorICAgIEVDVkVJX1lVVjQyMCwKKyAgICBFQ1ZFSV9VWVZZLAorICAgIEVDVkVJX1lVVjQyMFNFTUlQTEFOQVIKK307CisKKy8qKiBUeXBlIG9mIGNvbnRlbnRzIGZvciBvcHRpbWFsIGVuY29kaW5nIG1vZGUuICovCitlbnVtIFRQVkNvbnRlbnRUeXBlCit7CisgICAgLyoqIENvbnRlbnQgaXMgdG8gYmUgc3RyZWFtZWQgaW4gcmVhbC10aW1lLiAqLworICAgIEVDVkVJX1NUUkVBTUlORywKKworICAgIC8qKiBDb250ZW50IGlzIHRvIGJlIGRvd25sb2FkZWQgYW5kIHBsYXliYWNrZWQgbGF0ZXIuKi8KKyAgICBFQ1ZFSV9ET1dOTE9BRCwKKworICAgIC8qKiBDb250ZW50IGlzIHRvIGJlIDNncHAgYmFzZWxpbmUgY29tcGxpYW50LiAqLworICAgIEVDVkVJX0gyNjMKK307CisKKy8qKiBSYXRlIGNvbnRyb2wgdHlwZS4gKi8KK2VudW0gVE1QNFJhdGVDb250cm9sVHlwZQoreworICAgIC8qKiBDb25zdGFudCBxdWFsaXR5LCB2YXJpYWJsZSBiaXQgcmF0ZSwgZml4ZWQgcXVhbnRpemF0aW9uIGxldmVsLiAqLworICAgIEVDT05TVEFOVF9RLAorCisgICAgLyoqIFNob3J0LXRlcm0gY29uc3RhbnQgYml0IHJhdGUgY29udHJvbC4gKi8KKyAgICBFQ0JSXzEsCisKKyAgICAvKiogTG9uZy10ZXJtIGNvbnN0YW50IGJpdCByYXRlIGNvbnRyb2wuICovCisgICAgRVZCUl8xCit9OworCisvKiogVGFyZ2V0ZWQgcHJvZmlsZSBhbmQgbGV2ZWwgdG8gZW5jb2RlLiAqLworZW51bSBUUFZNNFZQcm9maWxlTGV2ZWwKK3sKKyAgICAvKiBOb24tc2NhbGFibGUgcHJvZmlsZSAqLworICAgIEVDVkVJX1NJTVBMRV9MRVZFTDAgPSAwLAorICAgIEVDVkVJX1NJTVBMRV9MRVZFTDEsCisgICAgRUNWRUlfU0lNUExFX0xFVkVMMiwKKyAgICBFQ1ZFSV9TSU1QTEVfTEVWRUwzLAorICAgIEVDVkVJX0NPUkVfTEVWRUwxLAorICAgIEVDVkVJX0NPUkVfTEVWRUwyLAorCisgICAgLyogU2NhbGFibGUgcHJvZmlsZSAqLworICAgIEVDVkVJX1NJTVBMRV9TQ0FMQUJMRV9MRVZFTDAgPSA2LAorICAgIEVDVkVJX1NJTVBMRV9TQ0FMQUJMRV9MRVZFTDEsCisgICAgRUNWRUlfU0lNUExFX1NDQUxBQkxFX0xFVkVMMiwKKworICAgIEVDVkVJX0NPUkVfU0NBTEFCTEVfTEVWRUwxID0gMTAsCisgICAgRUNWRUlfQ09SRV9TQ0FMQUJMRV9MRVZFTDIsCisgICAgRUNWRUlfQ09SRV9TQ0FMQUJMRV9MRVZFTDMKK307CisKKy8qKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBlbmNvZGVyIHNldHRpbmdzLiAqLworc3RydWN0IFRQVlZpZGVvRW5jb2RlUGFyYW0KK3sKKyAgICAvKiogU3BlY2lmaWVzIGFuICBJRCB0aGF0IHdpbGwgYmUgdXNlZCB0byBzcGVjaWZ5IHRoaXMgZW5jb2RlciB3aGlsZSByZXR1cm5pbmcKKyAgICB0aGUgYml0c3RyZWFtIGluIGFzeW5jaHJvbm91cyBtb2RlLiAqLworICAgIHVpbnQzMiAgICAgICAgICAgICAgaUVuY29kZUlEOworCisgICAgLyoqIFNwZWNpZmllcyB3aGV0aGVyIGJhc2Ugb25seSAoaU51bUxheWVyID0gMSkgb3IgYmFzZSArIGVuaGFuY2VtZW50IGxheWVyCisgICAgKGlOdW1MYXllciA9MiApIGlzIHRvIGJlIHVzZWQuICovCisgICAgaW50MzIgICAgICAgICAgICAgICBpTnVtTGF5ZXI7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIGVuY29kZWQgZnJhbWVzLiBJRnJhbWVXaWR0aFswXSBpcyBmb3IKKyAgICBiYXNlIGxheWVyIGFuZCBpRnJhbWVXaWR0aFsxXSBpcyBmb3IgZW5oYW5jZWQgbGF5ZXIuICovCisgICAgaW50ICAgICAgICAgICAgICAgICBpRnJhbWVXaWR0aFtNQVhfTEFZRVJdOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgZW5jb2RlZCBmcmFtZXMuIElGcmFtZUhlaWdodFswXSBpcyBmb3IKKyAgICBiYXNlIGxheWVyIGFuZCBpRnJhbWVIZWlnaHRbMV0gaXMgZm9yIGVuaGFuY2VkIGxheWVyLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaUZyYW1lSGVpZ2h0W01BWF9MQVlFUl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBjdW11bGF0aXZlIGJpdCByYXRlIGluIGJpdCBwZXIgc2Vjb25kLiBJQml0UmF0ZVswXSBpcyBmb3IgYmFzZQorICAgIGxheWVyIGFuZCBpQml0UmF0ZVsxXSBpcyBmb3IgYmFzZStlbmhhbmNlZCBsYXllci4qLworICAgIGludCAgICAgICAgICAgICAgICAgaUJpdFJhdGVbTUFYX0xBWUVSXTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGN1bXVsYXRpdmUgZnJhbWUgcmF0ZSBpbiBmcmFtZSBwZXIgc2Vjb25kLiBJRnJhbWVSYXRlWzBdIGlzIGZvcgorICAgIGJhc2UgbGF5ZXIgYW5kIGlGcmFtZVJhdGVbMV0gaXMgZm9yIGJhc2UrZW5oYW5jZWQgbGF5ZXIuICovCisgICAgZmxvYXQgICAgICAgICAgICAgICBpRnJhbWVSYXRlW01BWF9MQVlFUl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHF1YWxpdHkgZmFjdG9yIG9uIHRoZSBzY2FsZSBvZiAxIHRvIDEwLiBJdCB0cmFkZXMgb2ZmCisgICAgdGhlIHBpY3R1cmUgcXVhbGl0eSB3aXRoIHRoZSBmcmFtZSByYXRlLiBIaWdoZXIgZnJhbWUgcXVhbGl0eSBtZWFucyBsb3dlciBmcmFtZSByYXRlLgorICAgIExvd2VyIGZyYW1lIHF1YWxpdHkgZm9yIGhpZ2hlciBmcmFtZSByYXRlLiovCisgICAgaW50MzIgICAgICAgICAgICAgICBpRnJhbWVRdWFsaXR5OworCisgICAgLyoqIEVuYWJsZSB0aGUgdXNlIG9mIGlGcmFtZVF1YWxpdHkgdG8gZGV0ZXJtaW5lIHRoZSBmcmFtZSByYXRlLiBJZiBpdCBpcyBmYWxzZSwKKyAgICB0aGUgZW5jb2RlciB3aWxsIHRyeSB0byBtZWV0IHRoZSBzcGVjaWZpZWQgZnJhbWUgcmF0ZSByZWdhcmRsZXNzIG9mIHRoZSBmcmFtZSBxdWFsaXR5LiovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpRW5hYmxlRnJhbWVRdWFsaXR5OworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgUC1mcmFtZXMgYmV0d2VlbiAyIElOVFJBIGZyYW1lcy4gQW4gSU5UUkEgbW9kZSBpcworICAgIGZvcmNlZCB0byBhIGZyYW1lIG9uY2UgdGhpcyBpbnRlcnZhbCBpcyByZWFjaGVkLiBXaGVuIHRoZXJlIGlzIG9ubHkgb25lIEktZnJhbWUgaXMgcHJlc2VudAorICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsaXAsIGlJRnJhbWVJbnRlcnZhbCBzaG91bGQgYmUgc2V0IHRvIC0xLiAqLworICAgIGludDMyICAgICAgICAgICAgICAgaUlGcmFtZUludGVydmFsOworCisgICAgLyoqIEFjY29yZGluZyB0byBpSUZyYW1lSW50ZXJ2YWwgc2V0dGluZywgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludHJhIE1CIHBlciBmcmFtZSBpcworICAgIG9wdGltYWxseSBjYWxjdWxhdGVkIGZvciBlcnJvciByZXNpbGllbmN5LiBIb3dldmVyLCB3aGVuIGlJRnJhbWVJbnRlcnZhbCBpcyBzZXQgdG8gLTEsCisgICAgaU51bUludHJhTUJSZWZyZXNoIG11c3QgYmUgc3BlY2lmaWVkIHRvIGd1YXJhbnRlZSB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50cmEKKyAgICBtYWNyb2Jsb2NrcyBwZXIgZnJhbWUuKi8KKyAgICB1aW50MzIgICAgICAgICAgICAgIGlOdW1JbnRyYU1CUmVmcmVzaDsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIFZCViBidWZmZXIgc2l6ZSB3aGljaCBkZXRlcm1pbmVzIHRoZSBlbmQtdG8tZW5kIGRlbGF5IGJldHdlZW4gdGhlCisgICAgZW5jb2RlciBhbmQgdGhlIGRlY29kZXIuICBUaGUgc2l6ZSBpcyBpbiB1bml0IG9mIHNlY29uZHMuIEZvciBkb3dubG9hZCBhcHBsaWNhdGlvbiwKKyAgICB0aGUgYnVmZmVyIHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBzdHJlYW1pbmcgYXBwbGljYXRpb24uIEZvciAyLXdheSBhcHBsaWNhdGlvbiwKKyAgICB0aGlzIGJ1ZmZlciBzaGFsbCBiZSBrZXB0IG1pbmltYWwuIEZvciBhIHNwZWNpYWwgY2FzZSwgaW4gVkJSIG1vZGUsIGlCdWZmZXJEZWxheSB3aWxsCisgICAgYmUgc2V0IHRvIC0xIHRvIGFsbG93IGJ1ZmZlciB1bmRlcmZsb3cuICovCisgICAgZmxvYXQgICAgICAgICAgICAgICBpQnVmZmVyRGVsYXk7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBhY2Nlc3Mgd2hldGhlciBpdCBpcyBzdHJlYW1pbmcsIENWRUlfU1RSRUFNSU5HCisgICAgKGRhdGEgcGFydGl0aW9uaW5nIG1vZGUpIG9yIGRvd25sb2FkLCBDVkVJX0RPV05MT0FEIChjb21iaW5lZCBtb2RlKS4qLworICAgIFRQVkNvbnRlbnRUeXBlICAgICAgaUNvbnRlbnRUeXBlOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBhbW9uZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudCBRLAorICAgIENCUiBhbmQgVkJSLiAgVGhlIHN0cnVjdHVyZSBUTVA0UmF0ZUNvbnRyb2xUeXBlIGlzIGRlZmluZWQgYmVsb3cuKi8KKyAgICBUTVA0UmF0ZUNvbnRyb2xUeXBlIGlSYXRlQ29udHJvbFR5cGU7CisKKyAgICAvKiogU3BlY2lmaWVzIGhpZ2ggcXVhbGl0eSBidXQgYWxzbyBoaWdoIGNvbXBsZXhpdHkgbW9kZSBmb3IgcmF0ZSBjb250cm9sLiAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgaVJET3B0aW1hbDsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGZpcnN0IEktZnJhbWUuIElmIGNvbnN0YW50IFEKKyAgICByYXRlIGNvbnRyb2wgaXMgdXNlZCwgdGhpcyBRUCB3aWxsIGJlIHVzZWQgZm9yIGFsbCB0aGUgSS1mcmFtZXMuIFRoaXMgbnVtYmVyIG11c3QgYmUKKyAgICBzZXQgYmV0d2VlbiAxIGFuZCAzMSwgb3RoZXJ3aXNlLCBJbml0aWFsaXplKCkgd2lsbCBmYWlsLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaUlxdWFudFsyXTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGZpcnN0IFAtZnJhbWUuIElmIGNvbnN0YW50IFEKKyAgICByYXRlIGNvbnRyb2wgaXMgdXNlZCwgdGhpcyBRUCB3aWxsIGJlIHVzZWQgZm9yIGFsbCB0aGUgUC1mcmFtZXMuIFRoaXMgbnVtYmVyIG11c3QgYmUKKyAgICBzZXQgYmV0d2VlbiAxIGFuZCAzMSwgb3RoZXJ3aXNlLCBJbml0aWFsaXplKCkgd2lsbCBmYWlsLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaVBxdWFudFsyXTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGZpcnN0IEItZnJhbWUuIElmIGNvbnN0YW50IFEKKyAgICByYXRlIGNvbnRyb2wgaXMgdXNlZCwgdGhpcyBRUCB3aWxsIGJlIHVzZWQgZm9yIGFsbCB0aGUgQi1mcmFtZXMuIFRoaXMgbnVtYmVyIG11c3QgYmUKKyAgICBzZXQgYmV0d2VlbiAxIGFuZCAzMSwgb3RoZXJ3aXNlLCBJbml0aWFsaXplKCkgd2lsbCBmYWlsLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaUJxdWFudFsyXTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIHNlYXJjaCByYW5nZSBpbiBwaXhlbCB1bml0IGZvciBtb3Rpb24gdmVjdG9yLiBUaGUgcmFuZ2Ugb2YgdGhlCisgICAgbW90aW9uIHZlY3RvciB3aWxsIGJlIG9mIGRpbWVuc2lvbiBbLWlTZWFyY2hSYW5nZS41LCAraVNlYXJjaFJhbmdlLjBdLiAqLworICAgIGludDMyICAgICAgICAgICAgICAgaVNlYXJjaFJhbmdlOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgdXNlIG9mIDh4OCBtb3Rpb24gdmVjdG9ycy4gKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGlNVjh4ODsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIHVzZSBvZiBoYWxmLXBlbCBtb3Rpb24gdmVjdG9ycy4gKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGlNVkhhbGZQZWw7CisKKyAgICAvKiogU3BlY2lmaWVzIGF1dG9tYXRpYyBzY2VuZSBkZXRlY3Rpb24gd2hlcmUgSS1mcmFtZSB3aWxsIGJlIHVzZWQgdGhlIHRoZSBmaXJzdCBmcmFtZQorICAgIGluIGEgbmV3IHNjZW5lLiAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgaVNjZW5lRGV0ZWN0aW9uOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMgd2hpY2ggcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gdHdvIHJlc3luYyBtYXJrZXJzLgorICAgIEZvciBFQ1ZFSV9ET1dOTE9BRCBhbmQgRUNWRUlfSDI2MywgaWYgaVBhY2tldFNpemUgaXMgc2V0IHRvIDAsIHRoZXJlIHdpbGwgYmUgbm8gcmVzeW5jIG1hcmtlcnMgaW4gdGhlIGJpdHN0cmVhbS4KKyAgICBGb3IgRUNWRUlfU1RSRUFNSU5HIGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldCB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLiovCisgICAgdWludDMyICAgICAgICAgICAgICBpUGFja2V0U2l6ZTsKKworICAgIC8qKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgY3VycmVudCBmcmFtZSBza2lwcGluZyBkZWNpc2lvbiBpcyBhbGxvd2VkIGFmdGVyIGVuY29kaW5nCisgICAgdGhlIGN1cnJlbnQgZnJhbWUuIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBvZiB3aGF0IGhhcyBiZWVuIGNvZGVkIGZvciB0aGUgY3VycmVudCBmcmFtZSwKKyAgICBpTm9DdXJyZW50U2tpcCBoYXMgdG8gYmUgb24uICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpTm9DdXJyZW50U2tpcDsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhhdCBubyBmcmFtZSBza2lwcGluZyBpcyBhbGxvd2VkLiBGcmFtZSBza2lwcGluZyBpcyBhIHRvb2wgdXNlZCB0bworICAgIGNvbnRyb2wgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgc3BlbnQgdG8gbWVldCB0aGUgdGFyZ2V0IGJpdCByYXRlLiAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgaU5vRnJhbWVTa2lwOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgaW4gbWlsbGlzZWNvbmQuKi8KKyAgICBpbnQzMiAgICAgICAgICAgICAgIGlDbGlwRHVyYXRpb247CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBwcm9maWxlIGFuZCBsZXZlbCB1c2VkIHRvIGVuY29kZSB0aGUgYml0c3RyZWFtLiBXaGVuIHByZXNlbnQsCisgICAgb3RoZXIgc2V0dGluZ3Mgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHJhbmdlIGFsbG93YWJsZSBieSB0aGlzIHRhcmdldCBwcm9maWxlCisgICAgYW5kIGxldmVsLiBGYWlsIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBJbml0aWFsaXplIGNhbGwuICovCisgICAgVFBWTTRWUHJvZmlsZUxldmVsICBpUHJvZmlsZUxldmVsOworCisgICAgLyoqIFNwZWNpZmllcyBGU0kgQnVmZmVyIGlucHV0ICovCisgICAgdWludDgqICAgICAgICAgICAgICBpRlNJQnVmZjsKKworICAgIC8qKiBTcGVjaWZpZXMgRlNJIEJ1ZmZlciBMZW5ndGggKi8KKyAgICBpbnQgICAgICAgICAgICAgaUZTSUJ1ZmZMZW5ndGg7CisKKworfTsKKworCisvKiogU3RydWN0dXJlIGZvciBpbnB1dCBmb3JtYXQgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBUUFZWaWRlb0lucHV0Rm9ybWF0Cit7CisgICAgLyoqIENvbnRhaW5zIHRoZSB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIGlucHV0IGZyYW1lLiAqLworICAgIGludDMyICAgICAgICAgICBpRnJhbWVXaWR0aDsKKworICAgIC8qKiBDb250YWlucyB0aGUgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgaW5wdXQgZnJhbWUuICovCisgICAgaW50MzIgICAgICAgICAgIGlGcmFtZUhlaWdodDsKKworICAgIC8qKiBDb250YWlucyB0aGUgaW5wdXQgZnJhbWUgcmF0ZSBpbiB0aGUgdW5pdCBvZiBmcmFtZSBwZXIgc2Vjb25kLiAqLworICAgIGZsb2F0ICAgICAgICAgICBpRnJhbWVSYXRlOworCisgICAgLyoqIENvbnRhaW5zIEZyYW1lIE9yaWVudGF0aW9uLiBVc2VkIGZvciBSR0IgaW5wdXQuIDEgbWVhbnMgQm90dG9tX1VQIFJHQiwgMCBtZWFucyBUb3BfRG93biBSR0IsIC0xIGZvciB2aWRlbyBmb3JtYXRzIG90aGVyIHRoYW4gUkdCKi8KKyAgICBpbnQgICAgICAgICAgICAgaUZyYW1lT3JpZW50YXRpb247CisKKyAgICAvKiogQ29udGFpbnMgdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgdmlkZW8sIGUuZy4sIFlVViA0OjI6MCwgVVlWWSwgUkdCMjQsIGV0Yy4gKi8KKyAgICBUUFZWaWRlb0Zvcm1hdCAgaVZpZGVvRm9ybWF0OworfTsKKworCisvKiogQ29udGFpbnMgdGhlIGlucHV0IGRhdGEgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBUUFZWaWRlb0lucHV0RGF0YQoreworICAgIC8qKiBQb2ludGVyIHRvIGFuIGlucHV0IGZyYW1lIGJ1ZmZlciBpbiBpbnB1dCBzb3VyY2UgZm9ybWF0LiovCisgICAgdWludDggICAgICAgKmlTb3VyY2U7CisKKyAgICAvKiogVGhlIGNvcnJlc3BvbmRpbmcgdGltZSBzdGFtcCBvZiB0aGUgaW5wdXQgZnJhbWUuICovCisgICAgdWludDMyICAgICAgaVRpbWVTdGFtcDsKK307CisKKy8qKiBDb250YWlucyB0aGUgb3V0cHV0IGRhdGEgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBUUFZWaWRlb091dHB1dERhdGEKK3sKKyAgICAvKiogUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBidWZmZXIgaW4gWVVWIDQ6MjowIGRvbWFpbi4gKi8KKyAgICB1aW50OCAgICAgICAgICAgKmlGcmFtZTsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIGxheWVyIGVuY29kZWQsIDAgZm9yIGJhc2UsIDEgZm9yIGVuaGFuY2VkLiAqLworICAgIGludDMyICAgICAgICAgICBpTGF5ZXJOdW1iZXI7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgZW5jb2RlZCBiaXRzdHJlYW0gYnVmZmVyLiAqLworICAgIHVpbnQ4ICAgICAgICAgICAqaUJpdFN0cmVhbTsKKworICAgIC8qKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBpQlN0cmVhbS4gKi8KKyAgICBpbnQzMiAgICAgICAgICAgaUJpdFN0cmVhbVNpemU7CisKKyAgICAvKiogVGhlIHRpbWUgc3RhbXAgb2YgdGhlIGVuY29kZWQgZnJhbWUgYWNjb3JkaW5nIHRvIHRoZSBiaXRzdHJlYW0uICovCisgICAgdWludDMyICAgICAgICAgIGlWaWRlb1RpbWVTdGFtcDsKKworICAgIC8qKiBUaGUgdGltZSBzdGFtcCBvZiB0aGUgZW5jb2RlZCBmcmFtZSBhcyBnaXZlbiBiZWZvcmUgdGhlIGVuY29kaW5nLiAqLworICAgIHVpbnQzMiAgICAgICAgICBpRXh0ZXJuYWxUaW1lU3RhbXA7CisKKyAgICAvKiogVGhlIGhpbnQgdHJhY2sgaW5mb3JtYXRpb24uICovCisgICAgTVA0SGludFRyYWNrICAgIGlIaW50VHJhY2s7Cit9OworCisvKiogQW4gb2JzZXJ2ZXIgY2xhc3MgZm9yIGNhbGxiYWNrcyB0byByZXBvcnQgdGhlIHN0YXR1cyBvZiB0aGUgQ1ZFSSAqLworY2xhc3MgTVBWQ1ZFSU9ic2VydmVyCit7CisgICAgcHVibGljOgorICAgICAgICAvKiogVGhlIGNhbGxiYWNrIGZ1bnRpb24gd2l0aCBhRXZlbnQgYmVpbmcgb25lIG9mIFRDVkVJRXZlbnQgZW51bWVyYXRpb24uICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVQVkNWRUlFdmVudAorICAgICAgICAodWludDMyIGFJZCwgdWludDMyIGFFdmVudCwgdWludDMyIGFQYXJhbTEgPSAwKSA9IDA7CisgICAgICAgIHZpcnR1YWwgfk1QVkNWRUlPYnNlcnZlcigpIHt9Cit9OworCisvKiogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgY29kZWMgc3BlY2lmaWMgaW50ZXJmYWNlIGNsYXNzLgorVGhlIHVzZXJzIG11c3QgbWFpbnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNvZGVjIHNwZWNpZmljIGNsYXNzIHRocm91Z2hvdXQKK3RoZSBlbmNvZGluZyBzZXNzaW9uLgorKi8KK2NsYXNzIENvbW1vblZpZGVvRW5jb2RlciA6IHB1YmxpYyBPc2NsVGltZXJPYmplY3QKK3sKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQ1ZFSSBjbGFzcy4gKi8KKyAgICAgICAgQ29tbW9uVmlkZW9FbmNvZGVyKCkgOiBPc2NsVGltZXJPYmplY3QoT3NjbEFjdGl2ZU9iamVjdDo6RVByaW9yaXR5Tm9taW5hbCwgIlBWRW5jb2RlciIpIHt9OworCisgICAgICAgIC8qKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0byBzZXQgdGhlIGlucHV0IHZpZGVvIGZvcm1hdCBhbmQgdGhlCisgICAgICAgIGVuY29kaW5nIHBhcmFtZXRlcnMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBDVkVJX0VSUk9SIGlmIHRoZXJlIGlzCisgICAgICAgIGFueSBlcnJvcnMuIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgQ1ZFSV9TVUNDRVNTLiovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBJbml0aWFsaXplKFRQVlZpZGVvSW5wdXRGb3JtYXQgKmFWaWRJbkZvcm1hdCwgVFBWVmlkZW9FbmNvZGVQYXJhbSAqYUVuY1BhcmFtKSA9IDA7CisKKyAgICAgICAgLyoqIFNldCB0aGUgb2JzZXJ2ZXIgZm9yIGFzeW5jaHJvbm91cyBlbmNvZGluZyBtb2RlLiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgU2V0T2JzZXJ2ZXIoTVBWQ1ZFSU9ic2VydmVyICphT2JzZXJ2ZXIpID0gMDsKKworICAgICAgICAvKiogQWRkIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZSBvZiBvdXRwdXQgYnVmZmVycyBmb3Igb3V0cHV0IGJpdHN0cmVhbSBpbgorICAgICAgICBhc3luY2hyb25vdXMgZW5jb2RpbmcgbW9kZS4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIEFkZEJ1ZmZlcihUUFZWaWRlb091dHB1dERhdGEgKmFWaWRPdXQpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiBzZW5kcyBpbiBhbiBpbnB1dCB2aWRlbyBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgc291cmNlCisgICAgICAgIGZyYW1lIGFuZCB0aGUgYXNzb2NpYXRlZCB0aW1lc3RhbXAuIFRoZSBlbmNvZGVkIGJpdHN0cmVhbSB3aWxsIGJlIHJldHVybmVkIGJ5CisgICAgICAgIG9ic2VydmVyIGNhbGxiYWNrLgorICAgICAgICBUaGUgYWJvdmUgMyBBUElzIG9ubHkgcmVwbGFjZSBFbmNvZGVGcmFtZSgpIEFQSS4gT3RoZXIgQVBJcyBzdWNoIGFzIGluaXRpYWxpemF0aW9uCisgICAgICAgIGFuZCB1cGRhdGUgcGFyYW1ldGVycyByZW1haW4gdGhlIHNhbWUuICovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBFbmNvZGUoVFBWVmlkZW9JbnB1dERhdGEgKmFWaWRJbikgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gVkJWIGJ1ZmZlciBzaXplIHN1Y2ggdGhhdCB0aGUKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNhbiBhbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGd1YXJhbnRlZXMgdG8gZml0IG9uZSBmcmFtZS4qLworICAgICAgICB2aXJ0dWFsICBpbnQzMiBHZXRCdWZmZXJTaXplKCkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZPTCBoZWFkZXIgcGFydCAoc3RhcnRpbmcgZnJvbSB0aGUgVk9TIGhlYWRlcikKKyAgICAgICAgb2YgdGhlIGVuY29kZWQgYml0c3RyZWFtLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIEluaXRpYWxpemUuCisgICAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgbWVtb3J5ICh2b2xIZWFkZXIpIGFsbG9jYXRlZCBieSB0aGUgdXNlcnMuKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIEdldFZvbEhlYWRlcih1aW50OCAqdm9sSGVhZGVyLCBpbnQzMiAqc2l6ZSwgaW50MzIgbGF5ZXIpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiBzZW5kcyBpbiBhbiBpbnB1dCB2aWRlbyBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgc291cmNlCisgICAgICAgIGZyYW1lIGFuZCB0aGUgYXNzb2NpYXRlZCB0aW1lc3RhbXAuIEl0IHJldHVybnMgYW4gb3V0cHV0IHZpZGVvIGRhdGEgc3RydWN0dXJlCisgICAgICAgIGNvbnRhaW5pbmcgY29kZWQgYml0IHN0cmVhbSwgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbiBZVVYgNDoyOjAgKGNhbiBiZSBjaGFuZ2VkCisgICAgICAgIHRvIHNvdXJjZSBmb3JtYXQpIGFuZCB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29kZWQgZnJhbWUuCisgICAgICAgIFRoZSBpbnB1dCB0aW1lc3RhbXAgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBvdXRwdXQgdGltZXN0YW1wLiBVc2VyIGNhbiBzZW5kCisgICAgICAgIGFuIGlucHV0IHN0cnVjdHVyZSBpbiB3aXRob3V0IGdldHRpbmcgYW55IGVuY29kZWQgZGF0YSBiYWNrIG9yIGdldHRpbmcgYW4gZW5jb2RlZAorICAgICAgICBmcmFtZSBpbiB0aGUgcGFzdC4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIEVDVkVJX0VSUk9SIGlmIHRoZXJlIGlzIGFueSBlcnJvcnMuCisgICAgICAgIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgRUNWRUlfU1VDQ0VTUy4KKyAgICAgICAgSW4gY2FzZSBvZiBPdmVycnVuIEJ1ZmZlciB1c2FnZSwgaXQgaXMgcG9zc2libGUgdGhhdCByZXR1cm4gdmFsdWUgaXMgRUNWRUlfTU9SRV9PVVRQVVQKKyAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgZnJhbWUgY2Fubm90IGZpdCBpbiB0aGUgY3VycmVudCBidWZmZXIqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgRW5jb2RlRnJhbWUoVFBWVmlkZW9JbnB1dERhdGEgICphVmlkSW4sIFRQVlZpZGVvT3V0cHV0RGF0YSAqYVZpZE91dCwgaW50ICphUmVtYWluaW5nQnl0ZXMKKyNpZmRlZiBQVkFVVEhPUl9QUk9GSUxJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqYVBhcmFtMSA9IDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gMDsKKworICAgICAgICAvKiogQmVmb3JlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGUgZW5jb2RpbmcgcHJvY2VzcywgdGhlIHVzZXJzIGhhdmUgdG8gcXVlcnkKKyAgICAgICAgd2hldGhlciB0aGVyZSBhcmUgYW55IGVuY29kZWQgZnJhbWUgcGVuZGluZyBpbnNpZGUgdGhlIENWRUkuIFRoZSByZXR1cm5lZCB2YWx1ZQorICAgICAgICB3aWxsIGluZGljYXRlIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHRvIGJlIGZsdXNoZWQgKEVDVkVJX0ZMVVNIKS4KKyAgICAgICAgRmx1c2hPdXRwdXQgaGFzIHRvIGJlIGNhbGxlZCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMsIGkuZS4sIGl0IHJldHVybnMKKyAgICAgICAgRUNWRUlfU1VDQ0VTUy4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGR1cmluZyB0aGUgZW5jb2Rpbmcgb3BlcmF0aW9uIGlmCisgICAgICAgIHRoZXJlIGlzIG5vIGlucHV0IGZyYW1lIGFuZCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgd2FudCB0byB3YXN0ZSB0aGUgdGltZQorICAgICAgICB3YWl0aW5nIGZvciBpbnB1dCBmcmFtZS4gSXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBlbmNvZGVkIGZyYW1lCisgICAgICAgIG91dCBvZiB0aGUgbWVtb3J5LiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgRmx1c2hPdXRwdXQoVFBWVmlkZW9PdXRwdXREYXRhICphVmlkT3V0KSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gY2xlYW51cCB0aGUgQ1ZFSSBhbGxvY2F0ZWQgcmVzb3VyY2VzLiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgVGVybWluYXRlKCkgPSAwOworCisgICAgICAgIC8qKlRoaXMgZnVuY3Rpb24gZHluYW1pY2FsbHkgY2hhbmdlcyB0aGUgdGFyZ2V0IGJpdCByYXRlIG9mIHRoZSBlbmNvZGVyCisgICAgICAgIHdoaWxlIGVuY29kaW5nLiBhQml0UmF0ZVtuXSBpcyB0aGUgbmV3IGFjY3VtdWxhdGUgdGFyZ2V0IGJpdCByYXRlIG9mIGxheWVyIG4uCisgICAgICAgIFN1Y2Nlc3NmdWwgdXBkYXRlIGlzIHJldHVybmVkIHdpdGggRUNWRUlfU1VDQ0VTUy4qLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgVXBkYXRlQml0UmF0ZShpbnQzMiBhTnVtTGF5ZXIsIGludDMyICphQml0UmF0ZSkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGNoYW5nZXMgdGhlIHRhcmdldCBmcmFtZSByYXRlIG9mIHRoZSBlbmNvZGVyCisgICAgICAgIHdoaWxlIGVuY29kaW5nLiBhRnJhbWVSYXRlW25dIGlzIHRoZSBuZXcgYWNjdW11bGF0ZSB0YXJnZXQgZnJhbWUgcmF0ZSBvZgorICAgICAgICBsYXllciBuLiBTdWNjZXNzZnVsIHVwZGF0ZSBpcyByZXR1cm5lZCB3aXRoIEVDVkVJX1NVQ0NFU1MuICovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBVcGRhdGVGcmFtZVJhdGUoaW50MzIgYU51bUxheWVyLCBmbG9hdCAqYUZyYW1lUmF0ZSkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGNoYW5nZXMgdGhlIEktVm9wIHVwZGF0ZSBpbnRlcnZhbCB3aGlsZQorICAgICAgICBlbmNvZGluZyB0byBhIG5ldyB2YWx1ZSwgYUlGcmFtZUludGVydmFsLiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgVXBkYXRlSUZyYW1lSW50ZXJ2YWwoaW50MzIgYUlGcmFtZUludGVydmFsKSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFuIEktVm9wIG1vZGUgdG8gdGhlIG5leHQgZnJhbWUgdG8gYmUgZW5jb2RlZC4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIElGcmFtZVJlcXVlc3QoKSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgd2lkdGggb2YgYSBzcGVjaWZpYyBsYXllcgorICAgICAgICAobm90IG5lY2Vzc2FyaWx5IG11bHRpcGxlIG9mIDE2KS4gKi8KKyAgICAgICAgdmlydHVhbCAgaW50MzIgR2V0RW5jb2RlV2lkdGgoaW50MzIgYUxheWVyKSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5wdXQgaGVpZ2h0IG9mIGEgc3BlY2lmaWMgbGF5ZXIKKyAgICAgICAgKG5vdCBuZWNlc3NhcmlseSBtdWx0aXBsZSBvZiAxNikuICovCisgICAgICAgIHZpcnR1YWwgIGludDMyIEdldEVuY29kZUhlaWdodChpbnQzMiBhTGF5ZXIpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0YXJnZXQgZW5jb2RlZCBmcmFtZSByYXRlIG9mIGEgc3BlY2lmaWMgbGF5ZXIuICovCisgICAgICAgIHZpcnR1YWwgIGZsb2F0IEdldEVuY29kZUZyYW1lUmF0ZShpbnQzMiBhTGF5ZXIpID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdm9pZCBSdW4odm9pZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRG9DYW5jZWwodm9pZCkgPSAwOworICAgICAgICAvKiBpbnRlcm5hbCBlbnVtICovCisgICAgICAgIGVudW0gVENWRUlTdGF0ZQorICAgICAgICB7CisgICAgICAgICAgICBFSWRsZSwKKyAgICAgICAgICAgIEVFbmNvZGUKKyAgICAgICAgfTsKKworICAgICAgICBUQ1ZFSVN0YXRlICBpU3RhdGU7CisgICAgICAgIHVpbnQzMiAgICAgIGlJZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0ZmQ4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9NUDRFTkNfQVBJX0hfCisjZGVmaW5lIF9NUDRFTkNfQVBJX0hfCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBfUFZfVFlQRVNfCisjZGVmaW5lIF9QVl9UWVBFU18KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVQ2hhcjsKK3R5cGVkZWYgY2hhciBDaGFyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKK3R5cGVkZWYgaW50IEludDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNob3J0OwordHlwZWRlZiBzaG9ydCBTaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxvbmc7CisKKyNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgMAorI2RlZmluZSBQVl9DT0RFQ19TVE9QICAxCisjZW5kaWYKKworI2RlZmluZSBQVl9UUlVFICAxCisjZGVmaW5lIFBWX0ZBTFNFIDAKKwordHlwZWRlZiBlbnVtCit7CisgICAgU0hPUlRfSEVBREVSLAorICAgIFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVMsCisgICAgSDI2M19NT0RFLAorICAgIEgyNjNfTU9ERV9XSVRIX0VSUl9SRVMsCisgICAgREFUQV9QQVJUSVRJT05JTkdfTU9ERSwKKyAgICBDT01CSU5FX01PREVfTk9fRVJSX1JFUywKKyAgICBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTCisKK30gTVA0RW5jb2RpbmdNb2RlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBDT05TVEFOVF9RLAorICAgIENCUl8xLAorICAgIFZCUl8xLAorICAgIENCUl8yLAorICAgIFZCUl8yLAorICAgIENCUl9MT1dERUxBWQorfSBNUDRSYXRlQ29udHJvbFR5cGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIFBBU1MxLAorICAgIFBBU1MyCit9IFBhc3NOdW07CisKK3R5cGVkZWYgZW51bQoreworICAgIFBWX09GRiwKKyAgICBQVl9PTgorfSBQYXJhbUVuY01vZGU7CisKKworLyoge1NQTDAsIFNQTDEsIFNQTDIsIFNQTDMsIENQTDEsIENQTDIsIENQTDIsIENQTDJ9ICwgU1BMMDogU2ltcGxlIFByb2ZpbGVATGV2ZWwwICwgQ1BMMTogQ29yZSBQcm9maWxlQExldmVsMSAqLworLyoge1NTUEwwLCBTU1BMMSwgU1NQTDIsIFNTUEwyLCBDU1BMMSwgQ1NQTDIsIENTUEwzLCBDU1BMM30gLCBTU1BMMDogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGVATGV2ZWwwLCBDUEwxOiBDb3JlIFNjYWxhYmxlIFByb2ZpbGVATGV2ZWwxICovCisKK3R5cGVkZWYgZW51bQoreworICAgIC8qIE5vbi1zY2FsYWJsZSBwcm9maWxlICovCisgICAgU0lNUExFX1BST0ZJTEVfTEVWRUwwID0gMCwKKyAgICBTSU1QTEVfUFJPRklMRV9MRVZFTDEsCisgICAgU0lNUExFX1BST0ZJTEVfTEVWRUwyLAorICAgIFNJTVBMRV9QUk9GSUxFX0xFVkVMMywKKyAgICBDT1JFX1BST0ZJTEVfTEVWRUwxLAorICAgIENPUkVfUFJPRklMRV9MRVZFTDIsCisKKyAgICAvKiBTY2FsYWJsZSBwcm9maWxlICovCisgICAgU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwwID0gNiwKKyAgICBTSU1QTEVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDEsCisgICAgU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwyLAorCisgICAgQ09SRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMSA9IDEwLAorICAgIENPUkVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDIsCisgICAgQ09SRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMworCit9IFByb2ZpbGVMZXZlbFR5cGU7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTVA0SGludFRyYWNrCit7CisgICAgVUNoYXIgICBNVEI7CisgICAgVUNoYXIgICBMYXllcklEOworICAgIFVDaGFyICAgQ29kZVR5cGU7CisgICAgVUNoYXIgICBSZWZTZWxDb2RlOworfSBNUDRIaW50VHJhY2s7CisKK3R5cGVkZWYgc3RydWN0IHRhZ3ZpZGVvRW5jQ29udHJvbHMKK3sKKyAgICB2b2lkICAgICAgICAgICAgKnZpZGVvRW5jb2RlckRhdGE7CisgICAgSW50ICAgICAgICAgICAgIHZpZGVvRW5jb2RlckluaXQ7Cit9IFZpZGVvRW5jQ29udHJvbHM7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFndmlkZW9FbmNGcmFtZUlPCit7CisgICAgVUNoYXIgICAqeUNoYW47IC8qIHBvaW50ZXIgdG8gWSAqLworICAgIFVDaGFyICAgKnVDaGFuOyAvKiBwb2ludGVyIHRvIFUgKi8KKyAgICBVQ2hhciAgICp2Q2hhbjsgLyogcG9pbnRlciB0byBWICovCisgICAgSW50ICAgICBoZWlnaHQ7IC8qIGhlaWdodCBmb3IgWSAqLworICAgIEludCAgICAgcGl0Y2g7ICAvKiBzdHJpZGUgIGZvciBZICovCisgICAgVUxvbmcgICB0aW1lc3RhbXA7IC8qIG1vZHVsbyB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmQqLworCit9ICAgVmlkZW9FbmNGcmFtZUlPICA7CisKKy8qKgorQGJyaWVmICBFbmNvZGluZyBvcHRpb25zIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgdGFndmlkZW9FbmNPcHRpb25zCit7CisgICAgLyoqIEBicmllZiBTZXRzIHRoZSBlbmNvZGluZyBtb2RlLCBkZWZpbmVkIGJ5IHRoZSBhYm92ZSBlbnVtYXJhdGlvbi4gSWYgdGhlcmUgYXJlIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBlbmNvZGluZyBtb2RlCisgICAgKiAgIGFuZCBzdWJzZXF1ZW50IGVuY29kaW5nIG9wdGlvbnMsIGVuY29kaW5nIG1vZGUgdGFrZSBwcmVjZWRlbnQgb3ZlciBlbmNvZGluZyBvcHRpb25zLiAqLworICAgIE1QNEVuY29kaW5nTW9kZSAgICAgZW5jTW9kZTsKKworICAgIC8qKiBAYnJpZWYgU2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwYWNrZXQsIG9ubHkgdXNlZCBpbiBEQVRBX1BBUlRJVElPTklOR19NT0RFIG9yIENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVMgbW9kZS4KKyAgICAqICAgICAgICAgICBUaGUgcmVzeW5jIG1hcmtlciB3aWxsIGJlIGluc2VydGVkIGFzIG9mdGVuIGFzIHRoZSBzaXplIG9mIHRoZSBwYWNrZXQuKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIHBhY2tldFNpemU7CisKKyAgICAvKiogQGJyaWVmIFNlbGVjdHMgTVBFRy00L0guMjYzIHByb2ZpbGUgYW5kIGxldmVsLCBpZiBzcGVjaWZpZWQgb3RoZXIgZW5jb2Rpbmcgb3B0aW9ucyBtdXN0IGNvbmZvcm0gd2l0aCBpdC4gKi8KKyAgICBQcm9maWxlTGV2ZWxUeXBlICAgIHByb2ZpbGVfbGV2ZWw7CisKKyAgICAvKiogQGJyaWVmIEVuYWJsZXMgcmV2ZXJzaWJsZSB2YXJpYWJsZSBsZW5ndGggY29kZSAoUlZMQykgbW9kZS4gTm9ybWFsbHkgaXQgaXMgc2V0IHRvIFBWX09GRi4qLworICAgIFBhcmFtRW5jTW9kZSAgICAgICAgcnZsY0VuYWJsZTsKKworICAgIC8qKiBAYnJpZWYgU2V0IHRoZSBmcmVxdWVuY3kgb2YgR09CIGhlYWRlciBpbnRlcnZhbCAqLworICAgIEludCAgICAgICAgICAgICAgICAgZ29iSGVhZGVySW50ZXJ2YWw7CisKKyAgICAvKiogQGJyaWVmIFNldHMgdGhlIG51bWJlciBvZiBiaXRzdHJlYW0gbGF5ZXJzOiAxIGlzIGJhc2Ugb25seTogMiBpcyBiYXNlICsgZW5oYW5jZW1lbnQgKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIG51bUxheWVyczsKKworICAgIC8qKiBAYnJpZWYgU2V0cyB0aGUgbnVtYmVyIG9mIHRpY2tzIHBlciBzZWNvbmQgdXNlZCBmb3IgdGltaW5nIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gTVBFRzQgYml0c3RyZWFtLiovCisgICAgSW50ICAgICAgICAgICAgICAgICB0aW1lSW5jUmVzOworCisgICAgLyoqIEBicmllZiBTZXRzIHRoZSBudW1iZXIgb2YgdGlja3MgaW4gdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiBiZXR3ZWVuIDIgc291cmNlIGZyYW1lcyAoZXF1aXZhbGVudCB0byBzb3VyY2UgZnJhbWUgcmF0ZSkuICovCisgICAgSW50ICAgICAgICAgICAgICAgICB0aWNrUGVyU3JjOworCisgICAgLyoqIEBicmllZiBTcGVjaWZpZXMgZW5jb2RlZCBoZWlnaHRzIGluIHBpeGVscywgaGVpZ2h0W25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIncyBoZWlnaHQuICovCisgICAgSW50ICAgICAgICAgICAgICAgICBlbmNIZWlnaHRbMl07CisKKyAgICAvKiogQGJyaWVmIFNwZWNpZmllcyBlbmNvZGVkIHdpZHRocyBpbiBwaXhlbHMsIHdpZHRoW25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIncyB3aWR0aC4qLworICAgIEludCAgICAgICAgICAgICAgICAgZW5jV2lkdGhbMl07CisKKyAgICAvKiogQGJyaWVmIFNwZWNpZmllcyB0YXJnZXQgZnJhbWUgcmF0ZXMgaW4gZnJhbWVzIHBlciBzZWNvbmQsIGZyYW1lUmF0ZVtuXSByZXByZXNlbnRzIHRoZSBuLXRoIGxheWVyJ3MgdGFyZ2V0IGZyYW1lIHJhdGUuKi8KKyAgICBmbG9hdCAgICAgICAgICAgICAgIGVuY0ZyYW1lUmF0ZVsyXTsKKworICAgIC8qKiBAYnJpZWYgU3BlY2lmaWVzIHRhcmdldCBiaXQgcmF0ZXMgaW4gYml0cyBwZXIgc2Vjb25kIHVuaXQsIGJpdFJhdGVbbl0gcmVwcmVzZW50cyB0aGUgbi10aCBsYXllcidzIHRhcmdldCBiaXQgcmF0ZS4gKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIGJpdFJhdGVbMl07CisKKyAgICAvKiogQGJyaWVmIFNwZWNpZmllcyBkZWZhdWx0IHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGZvciBJLVZvcC4gSXF1YW50W25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIgZGVmYXVsdCBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiBUaGUgZGVmYXVsdCBpcyBJcXVhbnRbMF09MTIuKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIGlRdWFudFsyXTsKKworICAgIC8qKiBAYnJpZWYgU3BlY2lmaWVzIGRlZmF1bHQgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgZm9yIFAtVm9wLiBQcXVhbnRbbl0gcmVwcmVzZW50cyB0aGUgbi10aCBsYXllciBkZWZhdWx0IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIFRoZSBkZWZhdWx0IGlzIFBxdWFudFswXT0xMC4qLworICAgIEludCAgICAgICAgICAgICAgICAgcFF1YW50WzJdOworCisgICAgLyoqIEBicmllZiAgc3BlY2lmaWVzIHF1YW50aXphdGlvbiBtb2RlIChIMjYzIG1vZGUgb3IgTVBFRyBtb2RlKSBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlIGxheWVyIChpZiBhbnkpLgorICAgICogICAgICAgICAgIEluIFNpbXBsZSBhbmQgU2ltcGxlIFNjYWxhYmxlIHByb2ZpbGUsIHdlIHVzZSBvbmx5IEgyNjMgbW9kZS4qLworICAgIEludCAgICAgICAgICAgICAgICAgcXVhbnRUeXBlWzJdOworCisgICAgLyoqIEBicmllZiBTZXRzIHJhdGUgY29udHJvbCBhbGdvcml0aG0sIG9uZSBvZiAoQ09OU1RBTlRfUSwgQ0JSXzEsIG9yIFZCUl8xKS4KKyAgICAqICAgICAgICAgICBDT05TVEFOVF9RIHVzZXMgdGhlIGRlZmF1bHQgcXVhbnRpemF0aW9uIHZhbHVlcyB0byBlbmNvZGUgdGhlIHNlcXVlbmNlLgorICAgICogICAgICAgICAgIENCUl8xIChjb25zdGFudCBiaXQgcmF0ZSkgY29udHJvbHMgdGhlIG91dHB1dCBhdCBhIGRlc2lyZWQgYml0IHJhdGUKKyAgICAqICAgICAgICAgICBWQlJfMSAodmFyaWFibGUgYml0IHJhdGUpIGdpdmVzIGJldHRlciBwaWN0dXJlIHF1YWxpdHkgYXQgdGhlIGV4cGVuc2Ugb2YgYml0IHJhdGUgZmx1Y3R1YXRpb24KKyAgICAqICAgICAgICAgICBOb3RlOiAgIHR5cGU9Q09OU1RBTlRfUSBwcm9kdWNlcyBzZXF1ZW5jZXMgd2l0aCBhcmJpdHJhcnkgYml0IHJhdGUuCisgICAgKiAgICAgICAgICAgICAgICAgICB0eXBlPUNCUl8xIHByb2R1Y2VzIHNlcXVlbmNlcyBzdWl0YWJsZSBmb3Igc3RyZWFtaW5nLgorICAgICogICAgICAgICAgICAgICAgICAgdHlwZT1WQlJfMSBwcm9kdWNlcyBzZXF1ZW5jZXMgc3VpdGFibGUgZm9yIGRvd25sb2FkLiAqLworICAgIE1QNFJhdGVDb250cm9sVHlwZSAgcmNUeXBlOworCisgICAgLyoqIEBicmllZiAgU2V0cyB0aGUgVkJWIGJ1ZmZlciBzaXplIChpbiB0aGUgdW5pdCBvZiBzZWNvbmQgZGVsYXkpIHVzZWQgdG8gcHJldmVudCBidWZmZXIgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdworICAgICogICAgICAgICAgIG9uIHRoZSBkZWNvZGVyIHNpZGUuIFRoaXMgZnVuY3Rpb24gaXMgcmVkdW5kYW50IHRvIFBWU2V0VkJWU2l6ZS4gRWl0aGVyIG9uZSBvZiB0aGVtIGlzIHVzZWQgYXQgYSB0aW1lLiAqLworICAgIGZsb2F0ICAgICAgICAgICAgICAgdmJ2RGVsYXk7CisKKyAgICAvKiogQGJyaWVmICBTcGVjaWZpZXMgd2hldGhlciBmcmFtZSBza2lwcGluZyBpcyBwZXJtaXR0ZWQgb3Igbm90LiBXaGVuIHJhdGUgY29udHJvbCB0eXBlIGlzIHNldCB0byBDT05TVEFOVF9RCisgICAgKiAgICAgICAgICAgZnJhbWUgc2tpcHBpbmcgaXMgYXV0b21hdGljYWxseSBiYW5uZWQuICBJbiBDQlJfMSBhbmQgVkJSXzEgcmF0ZSBjb250cm9sLCBmcmFtZSBza2lwcGluZyBpcyBhbGxvd2VkIGJ5IGRlZmF1bHQuCisgICAgKiAgICAgICAgICAgSG93ZXZlciwgdXNlcnMgY2FuIGZvcmNlIG5vIGZyYW1lIHNraXBwaW5nIHdpdGggdGhpcyBmbGFnLCBidXQgYnVmZmVyIGNvbnN0cmFpbnQgbWF5IGJlIHZpb2xhdGVkLiovCisgICAgUGFyYW1FbmNNb2RlICAgICAgICBub0ZyYW1lU2tpcHBlZDsKKworICAgIC8qKiBAYnJpZWYgU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgUC1mcmFtZXMgYmV0d2VlbiB0d28gSS1mcmFtZXMuIEktZnJhbWUgbW9kZSBpcyBwZXJpb2RpY2FsbHkgZm9yY2VkCisgICAgKiAgICAgICAgICAgaWYgbm8gSS1mcmFtZSBpcyBlbmNvZGVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgcGVyaW9kIHRvIGFkZCBlcnJvciByZXNpbGllbmN5IGFuZCBoZWxwIHJlc3luY2hyb25pemUgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgKiAgICAgICAgICAgSWYgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiBjYW4gYWRkIGFkZGl0aW9uYWwgSS1mcmFtZSBpZiBuZXcgc2NlbmVzIGFyZSBkZXRlY3RlZC4KKyAgICAqICAgICAgICAgICBpbnRyYVBlcmlvZCBpcyB0aGUgSSBmcmFtZSBpbnRlcnZhbCBpbiB0ZXJtcyBvZiBzZWNvbmQuCisgICAgKiAgICAgICAgICAgaW50cmFQZXJpb2QgPTAgaW5kaWNhdGVzIEktZnJhbWUgZW5jb2Rpbmcgb25seTsKKyAgICAqICAgICAgICAgICBpbnRyYVBlcmlvZCA9IC0xICBpbmRpY2F0ZXMgSS1mcmFtZSBmb2xsb3dlZCBieSBhbGwgUC1mcmFtZXM7IChkZWZhdWx0KQorICAgICogICAgICAgICAgIGludHJhUGVyaW9kID0gTiwgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgUC1mcmFtZXMgYmV0d2VlbiAyIEktZnJhbWVzLiovCisgICAgSW50ICAgICAgICAgICAgICAgICBpbnRyYVBlcmlvZDsKKworCisgICAgLyoqIEBicmllZiAgU3BlY2lmaWVzIHRoZSBudW1iZXIgSW50cmEgTUJzIHRvIGJlIHJlZnJlc2hlZCBpbiBhIFAtZnJhbWUuICovCisgICAgSW50ICAgICAgICAgICAgICAgICBudW1JbnRyYU1COworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gKFNDRCkgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAqICAgICAgICAgICBXaXRoIFNDRCBlbmFibGUsIHdoZW4gYSBuZXcgc2NlbmUgaXMgZGV0ZWN0ZWQsIEktVm9wIG1vZGUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZmlyc3QgZnJhbWUgb2YKKyAgICAqICAgICAgICAgICB0aGUgbmV3IHNjZW5lIHJlc3VsdGluZyBpbiBiZXR0ZXIgcGljdHVyZSBxdWFsaXR5LiBBbiBpbnNlcnRpb24gb2YgYW4gSS1WT1AgcmVzZXRzIHRoZSBpbnRyYVBlcmlvZAorICAgICogICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgSW50cmFQZXJpb2RBUEkoKS4qLworICAgIFBhcmFtRW5jTW9kZSAgICAgICAgc2NlbmVEZXRlY3Q7CisKKyAgICAvKiogQGJyaWVmICBTcGVjaWZpZXMgdGhlIHNlYXJjaCByYW5nZSBvZiBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2guICBMYXJnZXIgdmFsdWUgaW1wbGllcworICAgICogICAgICAgICAgIGxhcmdlciBzZWFyY2ggcmFuZ2UsIGJldHRlciBtb3Rpb24gdmVjdG9yIG1hdGNoLCBidXQgbW9yZSBjb21wbGV4aXR5LgorICAgICogICAgICAgICAgIElmIHNlYXJjaFJhbmdlPW4sIHRoZSBtb3Rpb24gdmVjdG9yIHNlYXJjaCBpcyBpbiB0aGUgcmFuZ2Ugb2YgWy1uLG4tMV0gcGl4ZWxzLgorICAgICogICAgICAgICAgIElmIGhhbGYtcGVsICBtb2RlIGlzIG9uLCB0aGUgcmFuZ2UgaXMgWy1uLCAobi0xKSsxLzJdIHBpeGVscy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTYuKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIHNlYXJjaFJhbmdlOworCisgICAgLyoqIEBicmllZiAgVHVybnMgb24vb2ZmIDh4OCBibG9jayBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgY29tcGVuc2F0aW9uLgorICAgICogICAgICAgICAgIElmIG9uLCBmb3VyIG1vdGlvbiB2ZWN0b3JzIG1heSBiZSB1c2VkIGZvciBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgY29tcGVuc2F0aW9uIG9mIGEgbWFjcm9ibG9jaywKKyAgICAqICAgICAgICAgICBvdGhlcndpc2Ugb25lIG1vdGlvbiB2ZWN0b3IgcGVyIG1hY3JvYmxvY2sgaXMgdXNlZC4gV2hlbiB0aGUgOHg4IE1WIGlzIG9mZiwgdGhlIHRvdGFsIGVuY29kaW5nIGNvbXBsZXhpdHkKKyAgICAqICAgICAgICAgICBpcyBsZXNzIGJ1dCB0aGUgaW1hZ2UgcXVhbGl0eSBpcyBhbHNvIHdvcnNlLiBUaGVyZWZvcmUsIGl0IGNhbiBiZSB1c2VkIGluIGNvbXBsZXhpdHkgbGltaXRlZCBlbnZpcm9ubWVudC4qLworICAgIFBhcmFtRW5jTW9kZSAgICAgICAgbXY4eDhFbmFibGU7CisKKworICAgIC8qKiBAYnJpZWYgU2V0IHRoZSB0aHJlc2hvbGQgZm9yIHVzaW5nIGludHJhIERDIFZMQy4KKyAgICAqICAgICAgICAgICBWYWx1ZSBtdXN0IHJhbmdlIGZyb20gMC03LiovCisgICAgSW50ICAgICAgICAgICAgICAgICBpbnRyYURDVmxjVGg7CisKKyAgICAvKiogQGJyaWVmIFRoaXMgZmxhZyB0dXJucyBvbiB0aGUgdXNlIG9mIEFDIHByZWRpY3Rpb24gKi8KKyAgICBCb29sICAgICAgICAgICAgICAgIHVzZUFDUHJlZDsKKworfSBWaWRlb0VuY09wdGlvbnM7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKworICAgIC8qIEFQSSdzICovCisgICAgLyogQWx3YXlzIHN0YXJ0IHdpdGggdGhpcyBvbmUgISEqLworICAgIC8qKgorICAgICogICBAYnJpZWYgIEdldHMgZGVmYXVsdCBlbmNvZGluZyBvcHRpb25zLiBUaGlzIHdheSB1c2VycyBvbmx5IGhhdmUgdG8gc2V0IHJlbGV2YW50IGVuY29kaW5nIG9wdGlvbnMgYW5kIGxlYXZlIHRoZSBvbmUKKyAgICAqICAgICAgICAgICB0aGV5IGFyZSB1bnN1cmUgb2YuCisgICAgKiAgIEBlbmNPcHRpb24gIFBvaW50ZXIgdG8gVmlkZW9FbmNPcHRpb24gc3RydWN0dXJlLgorICAgICogICBAZW5jVXNlQ2FzZSBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIHNldCBvZiBkZWZhdWx0IGVuY29kaW5nIG9wdGlvbnMsIGZvciBleGFtcGxlLCBkaWZmZXJlbnQgZW5jb2Rpbmcgb3B0aW9ucworICAgICogICAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gc3RyZWFtaW5nIHVzZS1jYXNlIGFzIGNvbXBhcmVkIHRvIGRvd25sb2FkIHVzZS1jYXNlLiBJdCBjYW4gYmUgcHJvamVjdCBkZXBlbmRlbnQgdG9vLgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCBQVkdldERlZmF1bHRFbmNPcHRpb24oVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24sIEludCBlbmNVc2VDYXNlKTsKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFZlcmlmaWVzIHRoZSBjb25zaXN0ZW5jeSBvZiBlbmNvZGluZyBwYXJhbWV0ZXJzLCBhbGxvY2F0ZXMgbWVtb3J5IG5lZWRlZCBhbmQgc2V0IG5lY2Vzc2FyeSBpbnRlcm5hbCB2YXJpYWJsZXMuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkluaXRWaWRlb0VuY29kZXIoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24pOworCisgICAgLyogYWNxdWlyaW5nIGVuY29kZXIgaW5mbyBBUElzICovCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFZPTCBoZWFkZXIuIEl0IGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFtZSBpcyBlbmNvZGVkLiAgSWYgc28sCisgICAgKiAgICAgICAgICAgdGhlbiB0aGUgVk9MIEhlYWRlciBpcyBwYXNzZWQgYmFjayB0byB0aGUgYXBwbGljYXRpb24uIFRoZW4gYWxsIGZyYW1lcyB0aGF0IGFyZSBlbmNvZGVkIGRvIG5vdCBjb250YWluIHRoZSBWT0wgSGVhZGVyLgorICAgICogICAgICAgICAgIElmIHlvdSBkbyBub3QgY2FsbCB0aGUgQVBJIHRoZW4gdGhlIFZPTCBIZWFkZXIgaXMgcGFzc2VkIHdpdGhpbiB0aGUgZmlyc3QgZnJhbWUgdGhhdCBpcyBlbmNvZGVkLgorICAgICogICAgICAgICAgIFRoZSBiZWhhdmlvciBpcyB1bmtub3duIGlmIGl0IGlzIGNhbGxlZCBhZnRlciB0aGUgZmlyc3QgZnJhbWUgaXMgZW5jb2RlZC4gSXQgaXMgbWFpbmx5IHVzZWQgZm9yIE1QNCBmaWxlIGZvcm1hdCBhdXRob3JpbmcuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcy4KKyAgICAqICAgQHBhcmFtICB2b2xIZWFkZXIgaXMgdGhlIEJ1ZmZlciBmb3IgVk9MIGhlYWRlci4KKyAgICAqICAgQHBhcmFtICBzaXplIGlzIHRoZSBzaXplIG9mIFZPTCBoZWFkZXIgaW4gYnl0ZXMuCisgICAgKiAgIEBwYXJhbSAgbGF5ZXIgaXMgdGhlIGxheWVyIG9mIHRoZSByZXF1ZXN0ZWQgVk9MIGhlYWRlci4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucy4KKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWR2V0Vm9sSGVhZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFVDaGFyICp2b2xIZWFkZXIsIEludCAqc2l6ZSwgSW50IGxheWVyKTsKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW4gSC4yNjMgY29kaW5nIHdoZW4gdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHNldAorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMuCisgICAgKiAgIEBwYXJhbSAgcHJvZmlsZUlEIGlzIHRoZSBwb2ludGVyIG9mIHRoZSBwcm9maWxlIElELiBSaWdodCBub3cgd2Ugb25seSBzdXBwb3J0IHByb2ZpbGUgMAorICAgICogICBAcGFyYW0gIGxldmVsSUQgaXMgdGhlIHBvaW50ZXIgb2YgdGhlIGxldmVsIElEIHRoYXQgY291bGQgYmUgMTAtNzAuCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMuCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldEgyNjNQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVJRCwgSW50ICpsZXZlbElEKTsKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgb2YgTVBFRzQgd2hlbiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgc2V0CisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcy4KKyAgICAqICAgQHBhcmFtICBwcm9maWxlX2xldmVsIGlzIHRoZSBwb2ludGVyIG9mIHRoZSBwcm9maWxlIGVudW1lcmF0aW9uCisgICAgKiAgIEBwYXJhbSAgbkxheWVyIGlzIHRoZSBpbmRleCBvZiB0aGUgbGF5ZXIgb2YgaW50ZXJlc3QKKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucy4KKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWR2V0TVBFRzRQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVfbGV2ZWwsIEludCBuTGF5ZXIpOworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIG1heGltdW0gZnJhbWUgc2l6ZSBpbiBieXRlcworICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBtYXhWaWRlb0ZyYW1lU2l6ZSBpcyB0aGUgcG9pbnRlciBvZiB0aGUgbWF4aW11bSBmcmFtZSBzaXplCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWR2V0TWF4VmlkZW9GcmFtZVNpemUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICptYXhWaWRlb0ZyYW1lU2l6ZSk7CisKKyNpZm5kZWYgTElNSVRFRF9BUEkKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgKGluIGJ5dGVzKSBhbGxvY2F0ZWQgYnkgdGhlIGVuY29kZXIgbGlicmFyeS4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBJbnQgICAgIFBWR2V0RW5jTWVtb3J5VXNhZ2UoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCk7CisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgUFZBdXRob3IgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBWQlYgYnVmZmVyLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBWQlZTaXplIGlzIHRoZSBwb2ludGVyIG9mIFRoZSBzaXplIG9mIHRoZSBWQlYgYnVmZmVyIGluIGJ5dGVzLgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldFZCVlNpemUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpWQlZTaXplKTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgZnJhbWUgaW4gWVVWIDQ6MjowIGZvcm1hdCBmcm9tIHRoZSAqdmlkZW9faW4gaW5wdXQgZnJhbWUgYW5kIHB1dCB0aGUgcmVzdWx0IGluIFlVVgorICAgICogICAgICAgICAgIGZvciByZWNvbnN0cnVjdGVkIGZyYW1lIGFuZCBic3RyZWFtIGZvciBNUEVHNCBiaXRzdHJlYW0uIFRoZSBhcHBsaWNhdGlvbiBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yCisgICAgKiAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlci5UaGUgc2l6ZSBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIG1lbW9yeSBhbmQgdGhlIHJldHVybmVkIG91dHB1dCBidWZmZXIgYXJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICAqICAgICAgICAgICBzaXplIGZpZWxkLiBUaGUgZW5jb2RlZCBsYXllciBpcyBzcGVjaWZpZWQgYnkgdGhlIG5MYXllciBmaWVsZC4gSWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGVuY29kZWQsIHNpemU9MCBhbmQgbkxheWVyPS0xLgorICAgICogICAgICAgICAgIE5vdGU6IElmIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIHRvIGZpdCBhIGJpdHN0cmVhbSBvZiBhIGZyYW1lLCB0aGVuIHRob3NlIGV4dHJhIGJpdHMgd2lsbCBiZSBsZWZ0IG91dAorICAgICogICAgICAgICAgICAgICAgIHdoaWNoIGNhbiBjYXVzZSBzeW50YWN0aWMgZXJyb3IgYXQgdGhlIGRlY29kZXIgc2lkZS4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgdmlkX2luIGlzIHRoZSBwb2ludGVyIHRvIFZpZGVvRW5jRnJhbWVJTyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgWVVWIGlucHV0IGRhdGEKKyAgICAqICAgQHBhcmFtICB2aWRfb3V0IGlzIHRoZSBwb2ludGVyIHRvIFZpZGVvRW5jRnJhbWVJTyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcmVjb25zdHJ1Y3RlZCBZVVYgb3V0cHV0IGRhdGEgYWZ0ZXIgZW5jb2RpbmcKKyAgICAqICAgQHBhcmFtICBuZXh0TW9kVGltZSBpcyB0aGUgdGltZXN0YW1wIGVuY29kZXIgZXhwZWN0cyBmcm9tIHRoZSBuZXh0IGlucHV0CisgICAgKiAgIEBwYXJhbSAgYnN0cmVhbSBpcyB0aGUgcG9pbnRlciB0byBNUEVHNCBiaXRzdHJlYW0gYnVmZmVyCisgICAgKiAgIEBwYXJhbSAgc2l6ZSBpcyB0aGUgc2l6ZSBvZiBiaXRzdHJlYW0gYnVmZmVyIGFsbG9jYXRlZCAoaW5wdXQpIGFuZCBzaXplIG9mIHRoZSBlbmNvZGVkIGJpdHN0cmVhbSAob3V0cHV0KS4KKyAgICAqICAgQHBhcmFtICBuTGF5ZXIgaXMgdGhlIGxheWVyIG9mIHRoZSBlbmNvZGVkIGZyYW1lIGVpdGhlciAwIGZvciBiYXNlIG9yIDEgZm9yIGVuaGFuY2VtZW50IGxheWVyLiBUaGUgdmFsdWUgLTEgaW5kaWNhdGVzIHNraXBwZWQgZnJhbWUgZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICAqICAgQHJldHVybiB0cnVlIG5ld2ZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZFbmNvZGVWaWRlb0ZyYW1lKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX2luLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsCisgICAgICAgICAgICBVTG9uZyAqbmV4dE1vZFRpbWUsIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsIEludCAqbkxheWVyKTsKKworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHF1ZXJ5IG92ZXJydW4gYnVmZmVyLiBJdCBpcyB1c2VkIHdoZW4gUFZFbmNvZGVWaWRlb0ZyYW1lLnJldHVybnMgc2l6ZSB0aGF0IGlzCisgICAgKiAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IHNpemUuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIG92ZXJydW4gYnVmZmVyLiBOVUxMIGlmIG92ZXJydW4gYnVmZmVyIGlzIG5vdCB1c2VkLgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIFVDaGFyKiBQVkdldE92ZXJydW5CdWZmZXIoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCk7CisKKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFICAgLyogVGhpcyBzZXQgb2YgQVBJcyBhcmUgbm90IHdvcmtpbmcuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBwYXJ0aWFsbHkgCisgICAgcmVwbGFjZWQgYnkgdGhlIGludHJvZHVjdGlvbiBvZiBvdmVycnVuIGJ1ZmZlci4gKi8KKworICAgIC8qIHNsaWNlLWJhc2VkIGNvZGluZyAqLworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaW5wdXQgWVVWIGZyYW1lIGFuZCB0aW1lc3RhbXAgdG8gYmUgZW5jb2RlZCBieSB0aGUgc2xpY2UtYmFzZWQgZW5jb2RpbmcgZnVuY3Rpb24gUFZFbmNvZGVTbGljZSgpLgorICAgICogICAgICAgICAgIEl0IGFsc28gcmV0dXJuIHRoZSBtZW1vcnkgYWRkcmVzcyB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSB3aWxsIGJlIGNvcGllZCB0byAoaW4gYWR2YW5jZSkgYW5kIHRoZSBjb2RlZCBsYXllciBudW1iZXIuCisgICAgKiAgICAgICAgICAgVGhlIGVuY29kZXIgbGlicmFyeSBwcm9jZXNzZXMgdGhlIHRpbWVzdGFtcCBhbmQgZGV0ZXJtaW5lIGlmIHRoaXMgZnJhbWUgaXMgdG8gYmUgZW5jb2RlZCBvciBub3QuIElmIHRoZSBjdXJyZW50IGZyYW1lCisgICAgKiAgICAgICAgICAgaXMgbm90IGVuY29kZWQsIG5MYXllcj0tMS4gRm9yIGZyYW1lLWJhc2VkIG1vdGlvbiBlc3RpbWF0aW9uLCB0aGUgbW90aW9uIGVzdGltYXRpb24gb2YgdGhlIGVudGlyZSBmcmFtZSBpcyBhbHNvIHBlcmZvcm1lZAorICAgICogICAgICAgICAgIGluIHRoaXMgZnVuY3Rpb24uIEZvciBNQi1iYXNlZCBtb3Rpb24gZXN0aW1hdGlvbiwgdGhlIG1vdGlvbiB2ZWN0b3IgaXMgc2VhcmNoZWQgd2hpbGUgY29kaW5nIGVhY2ggTUIgaW4gUFZFbmNvZGVTbGljZSgpLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICB2aWRfaW4gaXMgdGhlIHBvaW50ZXIgdG8gVmlkZW9FbmNGcmFtZUlPIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBZVVYgaW5wdXQgZGF0YQorICAgICogICBAcGFyYW0gIG5leHRNb2RUaW1lIGlzIHRoZSB0aW1lc3RhbXAgZW5jb2RlciBleHBlY3RzIGZyb20gdGhlIG5leHQgaW5wdXQgaWYgdGhpcyBpbnB1dCBpcyByZWplY3RlZCBhbmQgbkxheWVyIGlzIHNldCB0byAtMS4KKyAgICAqICAgQHBhcmFtICBuTGF5ZXIgaXMgdGhlIGxheWVyIG9mIHRoZSBlbmNvZGVkIGZyYW1lIGVpdGhlciAwIGZvciBiYXNlIG9yIDEgZm9yIGVuaGFuY2VtZW50IGxheWVyLiBUaGUgdmFsdWUgLTEgaW5kaWNhdGVzIHNraXBwZWQgZnJhbWUgZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdy4KKyAgICAqICAgQHJldHVybiB0cnVlIG5ld2ZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZFbmNvZGVGcmFtZVNldChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9pbiwgVUxvbmcgKm5leHRNb2RUaW1lLCBJbnQgKm5MYXllcik7CisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgR09CIChzaG9ydCBoZWFkZXIgbW9kZSkgb3IgYSBwYWNrZXQgKGRhdGEgcGFydGl0aW9uaW5nIG1vZGUgb3IgY29tYmluZWQgbW9kZSB3aXRoIHJlc3luYyBtYXJrZXIpCisgICAgKiAgICAgICAgICAgYW5kIG91dHB1dCB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBhbmQgTVBFRzQgYml0c3RyZWFtLiBUaGUgYXBwbGljYXRpb24gaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYml0c3RyZWFtIGJ1ZmZlci4KKyAgICAqICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIG1lbW9yeSBhbmQgdGhlIHJldHVybmVkIG91dHB1dCBidWZmZXIgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2l6ZSBmaWVsZC4gIElmIHRoZSBidWZmZXIgc2l6ZSBpcworICAgICogICAgICAgICAgIHNtYWxsZXIgdGhhbiB0aGUgcmVxdWVzdGVkIHBhY2tldCBzaXplLCB1c2VyIGhhcyB0byBjYWxsIFBWRW5jb2RlU2xpY2UgYWdhaW4gdG8gZ2V0IHRoZSByZXN0IG9mIHRoYXQgcGVuZGluZyBwYWNrZXQgYmVmb3JlIG1vdmluZworICAgICogICAgICAgICAgIG9uIHRvIHRoZSBuZXh0IHBhY2tldC4gRm9yIHRoZSBjb21iaW5lZCBtb2RlIHdpdGhvdXQgcmVzeW5jIG1hcmtlciwgdGhlIGZ1bmN0aW9uIHJldHVybnMgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwuCisgICAgKiAgICAgICAgICAgVGhlIGVuZC1vZi1mcmFtZSBmbGFnICBpbmRpY2F0ZXMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGZyYW1lIGVuY29kaW5nLiAgTmV4dCBmcmFtZSBtdXN0IGJlIHNlbnQgaW4gd2l0aCBQVkVuY29kZUZyYW1lU2V0KCkuCisgICAgKiAgICAgICAgICAgQXQgdGhlIGVuZC1vZi1mcmFtZSwgdGhlIG5leHQgdmlkZW8gaW5wdXQgYWRkcmVzcyBhbmQgdGhlIG5leHQgdmlkZW8gbW9kdWxvIHRpbWVzdGFtcCB3aWxsIGJlIHNldC4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgYnN0cmVhbSBpcyB0aGUgcG9pbnRlciB0byBNUEVHNCBiaXRzdHJlYW0gYnVmZmVyLgorICAgICogICBAcGFyYW0gIHNpemUgaXMgdGhlIHNpemUgb2YgYml0c3RyZWFtIGJ1ZmZlciBhbGxvY2F0ZWQgKGlucHV0KSBhbmQgc2l6ZSBvZiB0aGUgZW5jb2RlZCBiaXRzdHJlYW0gKG91dHB1dCkuCisgICAgKiAgIEBwYXJhbSAgZW5kb2ZGcmFtZSBpcyBhIGZsYWcgaW5kaWNhdGluZyB0aGUgZW5kLW9mLWZyYW1lLCAnMScuIE90aGVyd2lzZSwgJzAnLiAgV2hlbiBQVlNldE5vQ3VycmVudEZyYW1lU2tpcCBpcyBPRkYsCisgICAgKiAgICAgICAgICAgZW5kLW9mLWZyYW1lICctMScgaW5kaWNhdGVzIGN1cnJlbnQgZnJhbWUgYml0c3RyZWFtIG11c3QgYmUgZGlzcmVnYXJkZWQuCisgICAgKiAgIEBwYXJhbSAgdmlkX291dCBpcyB0aGUgcG9pbnRlciB0byBWaWRlb0VuY0ZyYW1lSU8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHJlY29uc3RydWN0ZWQgWVVWIG91dHB1dCBkYXRhIGFmdGVyIGVuY29kaW5nCisgICAgKiAgIEBwYXJhbSAgbmV4dE1vZFRpbWUgaXMgdGhlIHRpbWVzdGFtcCBlbmNvZGVyIGV4cGVjdHMgZnJvbSB0aGUgbmV4dCBpbnB1dAorICAgICogICBAcmV0dXJuIHRydWUgbmV3Zm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkVuY29kZVNsaWNlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgKmVuZG9mRnJhbWUsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX291dCwgVUxvbmcgKm5leHRNb2RUaW1lKTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIE1QNCBmaWxlIGZvcm1hdCBoaW50IHRyYWNrIGluZm9ybWF0aW9uLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBpbmZvIGlzIHRoZSBzdHJ1Y3R1cmUgZm9yIE1QNCBoaW50IHRyYWNrIGluZm9ybWF0aW9uCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWR2V0SGludFRyYWNrKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIE1QNEhpbnRUcmFjayAqaW5mbyk7CisKKyNpZm5kZWYgTElNSVRFRF9BUEkKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICB1cGRhdGVzIHRhcmdldCBmcmFtZSByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlIGxheWVyIChpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBmcmFtZVJhdGUgaXMgdGhlIHBvaW50ZXJzIHRvIGFycmF5IG9mIHRhcmdldCBmcmFtZSByYXRlcyBpbiBmcmFtZXMgcGVyIHNlY29uZCwKKyAgICAqICAgICAgICAgICBmcmFtZVJhdGVbbl0gcmVwcmVzZW50cyB0aGUgbi10aCBsYXllcidzIHRhcmdldCBmcmFtZSByYXRlLgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVlVwZGF0ZUVuY0ZyYW1lUmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBmbG9hdCAqZnJhbWVSYXRlKTsgLyogZm9yIDItd2F5ICovCisKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIHVwZGF0ZXMgdGFyZ2V0IGJpdCByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlIGxheWVyIChpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBiaXRSYXRlIGlzIHRoZSBwb2ludGVycyB0byBhcnJheSBvZiB0YXJnZXQgYml0IHJhdGVzIGluIGJpdHMgcGVyIHNlY29uZCB1bml0LAorICAgICogICAgICAgICAgIGJpdFJhdGVbbl0gcmVwcmVzZW50cyB0aGUgbi10aCBsYXllcidzIHRhcmdldCBiaXQgcmF0ZS4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZVcGRhdGVCaXRSYXRlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqYml0UmF0ZSk7ICAgICAgICAgICAvKiBmb3IgMi13YXkgKi8KKworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgdXBkYXRlcyB0aGUgSU5UUkEgZnJhbWUgcmVmcmVzaCBpbnRlcnZhbCB3aGlsZSBlbmNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZy4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgYUlGcmFtZVBlcmlvZCBpcyBhIG5ldyB2YWx1ZSBvZiBJTlRSQSBmcmFtZSBpbnRlcnZhbCBpbiB0aGUgdW5pdCBvZiBudW1iZXIgb2YgY29kZWQgZnJhbWVzLgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWVXBkYXRlSUZyYW1lSW50ZXJ2YWwoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50IGFJRnJhbWVQZXJpb2QpOy8qIGZvciAyLXdheSAqLworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgc3BlY2lmaWVzIHRoZSBudW1iZXIgSW50cmEgTUJzIHRvIGJlIHJlZnJlc2hlZAorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHBhcmFtICBudW1NQiBpcyB0aGUgbnVtYmVyIG9mIEludHJhIE1CcyB0byBiZSByZWZyZXNoZWQKKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZVcGRhdGVOdW1JbnRyYU1CUmVmcmVzaChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgbnVtTUIpOyAgLyogZm9yIDItd2F5ICovCisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB1c2VycyB3YW50IHRoZSBuZXh0IGJhc2UgZnJhbWUgdG8gYmUgZW5jb2RlZCBhcyBhbiBJLVZvcC4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWSUZyYW1lUmVxdWVzdChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIDItd2F5ICovCisKKyNlbmRpZiAvLyBMSU1JVEVEX0FQSQorCisgICAgLyogZmluaXNoaW5nIGVuY29kZXIgKi8KKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGZyZWVzIHVwIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgZW5jb2RlciBsaWJyYXJ5LgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9NUDRFTkNfQVBJX0hfICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGM0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCkBAIC0wLDAgKzEsODU5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogRGF0ZTogOC8wMi8wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENoYW5nZSB0aGUgYml0c3RyZWFtIHBhcnNpbmcgYWxnb3JpdGhtLiBVc2UgdGVtcG9yYXJ5IHdvcmQgb2YgMiBvciA0IGJ5dGVzICAqLworLyogIGJlZm9yZSB3cml0aW5nIGl0IHRvIHRoZSBiaXRzdHJlYW0gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgYnl0ZUNvdW50IGRvZXNuJ3QgaGF2ZSB0byBiZSBtdWx0aXBsZSBvZiAyIG9yIDQgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBjb25zdCBVQ2hhciBNYXNrWyBdID0KK3sKKyAgICAweDAwLCAweDAxLCAweDAzLCAweDA3LCAweDBGLCAweDFGLCAweDNGLCAweDdGLCAweEZGCit9OworCisjZGVmaW5lIFdPUkRfU0laRSAgIDQgICAvKiBmb3IgMzItYml0IG1hY2hpbmUgKi8KKworLypOb3RlOgorICAgIDEuIFRoZXJlIGlzIGEgcHJvYmxlbSB3aGVuIG91dHB1dCB0aGUgbGFzdCBiaXRzKHdoaWNoIGNhbiBub3QgZm9ybSBhIGJ5dGUgeWV0CisgICAgc28gd2hlbiB5b3Ugb3V0cHV0LCB5b3UgbmVlZCB0byBzdHVmZiB0byBtYWtlIHN1cmUgaXQgaXMgYSBieXRlCisgICAgMi4gIEkgbm93IGhhcmQgY29kZWQgYnl0ZSB0byBiZSA4IGJpdHMqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0U3RyZWFtQ3JlYXRlRW5jKEludCBidWZmZXJTaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IENyZWF0ZSBhIGJpdHN0cmVhbSB0byBob2xkIG9uZSBlbmNvZGVkIHZpZGVvIHBhY2tldCBvciBmcmFtZSAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlclNpemUgIDogICBzaXplIG9mIHRoZSBiaXRzdHJlYW0gYnVmZmVyIGluIGJ5dGVzICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBvaW50ZXIgdG8gdGhlIEJpdHN0cmVhbUVuY1ZpZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworQml0c3RyZWFtRW5jVmlkZW8gKkJpdFN0cmVhbUNyZWF0ZUVuYyhJbnQgYnVmZmVyU2l6ZSkKK3sKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtOworICAgIHN0cmVhbSA9IChCaXRzdHJlYW1FbmNWaWRlbyAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihCaXRzdHJlYW1FbmNWaWRlbykpOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0Moc3RyZWFtLT5idWZmZXJTaXplICogc2l6ZW9mKFVDaGFyKSk7CisgICAgaWYgKHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID09IE5VTEwpCisgICAgeworICAgICAgICBNNFZFTkNfRlJFRShzdHJlYW0pOworICAgICAgICBzdHJlYW0gPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTTRWRU5DX01FTVNFVChzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciwgMCwgc3RyZWFtLT5idWZmZXJTaXplKnNpemVvZihVQ2hhcikpOworICAgIHN0cmVhbS0+d29yZCA9IDA7CisjaWYgV09SRF9TSVpFPT00CisgICAgc3RyZWFtLT5iaXRMZWZ0ID0gMzI7CisjZWxzZQorICAgIHN0cmVhbS0+Yml0TGVmdCA9IDE2OworI2VuZGlmCisgICAgc3RyZWFtLT5ieXRlQ291bnQgPSAwOworCisgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gTlVMTDsKKyAgICBzdHJlYW0tPm9CU2l6ZSA9IDA7CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbUNsb3NlRW5jKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBjbG9zZSBhIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6CisgICAgICAgIHN0cmVhbSAgOiAgIHRoZSBiaXRzdHJlYW0gdG8gYmUgY2xvc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworVm9pZCAgQml0c3RyZWFtQ2xvc2VFbmMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkKK3sKKyAgICBpZiAoc3RyZWFtKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBNNFZFTkNfRlJFRShzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBNNFZFTkNfRlJFRShzdHJlYW0pOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVB1dEJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgVmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBwdXQgTGVuZ3RoICgxLTE2KSBudW1iZXIgb2YgYml0cyB0byB0aGUgc3RyZWFtICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgZm9yIDMyLWJpdCBtYWNoaW5lIHRoaXMgZnVuY3Rpb24gY2FuIGRvIHVwdG8gMzIgYml0IGlucHV0ICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0cmVhbSAgICAgIHRoZSBiaXRzdHJlYW0gd2hlcmUgdGhlIGJpdHMgYXJlIHB1dCBpbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTGVuZ3RoICAgICAgYml0cyBsZW5ndGggKHNob3VsZCBiZWxvbmcgdG8gMSB0byAxNikgICAgICAgICAgICAgICAgICAqLworLyogICAgICBWYWx1ZSAgICAgICB0aG9zZSBiaXRzIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgQml0c3RyZWFtUHV0Qml0cyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBJbnQgTGVuZ3RoLCBVSW50IFZhbHVlKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisKKyAgICBpZiAoc3RyZWFtLT5iaXRMZWZ0ID4gTGVuZ3RoKQorICAgIHsKKyAgICAgICAgc3RyZWFtLT53b3JkIDw8PSBMZW5ndGg7CisgICAgICAgIHN0cmVhbS0+d29yZCB8PSBWYWx1ZTsgIC8qIGFzc3VtaW5nIFZhbHVlIGlzIG5vdCBsYXJnZXIgdGhhbiBMZW5ndGggKi8KKyAgICAgICAgc3RyZWFtLT5iaXRMZWZ0IC09IExlbmd0aDsKKyAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgc3RyZWFtLT53b3JkIDw8PSBzdHJlYW0tPmJpdExlZnQ7CisgICAgICAgIExlbmd0aCAtPSBzdHJlYW0tPmJpdExlZnQ7CisgICAgICAgIHN0cmVhbS0+d29yZCB8PSAoKFVJbnQpVmFsdWUgPj4gTGVuZ3RoKTsKKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TYXZlV29yZChzdHJlYW0pOworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSBnb3QgbmV3IExlbmd0aCBhbmQgVmFsdWUgKi8KKyAgICAgICAgLyogbm90ZSB0aGF0IFZhbHVlIGlzIG5vdCAiY2xlYW4iIGJlY2F1c2Ugb2YgbXNiIGFyZSBub3QgbWFza2VkIG91dCAqLworICAgICAgICBzdHJlYW0tPndvcmQgPSBWYWx1ZTsKKyAgICAgICAgc3RyZWFtLT5iaXRMZWZ0IC09IExlbmd0aDsKKyAgICAgICAgLyogYXNzdW1pbmcgdGhhdCBMZW5ndGggaXMgbm8gbW9yZSB0aGFuIDE2IGJpdHMgKi8KKyAgICAgICAgLyogc3RyZWFtLT5iaXRMZWZ0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVybyBhdCB0aGlzIHBvaW50ICovCisgICAgICAgIC8vaWYoc3RyZWFtLT5iaXRMZWZ0PD0wKQorICAgICAgICAvLyAgZXhpdCgtMSk7CisgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1QdXRHVDE2Qml0cyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBJbnQgTGVuZ3RoLCBVSW50MzIgVmFsdWUpICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHB1dCBMZW5ndGggKDE3LTMyKSBudW1iZXIgb2YgYml0cyB0byAgICAqLworLyogICAgICAgICAgICAgIGZvciAxNi1iaXQgbWFjaGluZSAgdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RyZWFtICAgICAgdGhlIGJpdHN0cmVhbSB3aGVyZSB0aGUgYml0cyBhcmUgcHV0IGluICAgICAgICAgICAgICAgICAqLworLyogICAgICBMZW5ndGggICAgICBiaXRzIGxlbmd0aCAoc2hvdWxkIGJlbG9uZyB0byAxNyB0byAzMikgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFZhbHVlICAgICAgIHRob3NlIGJpdHMgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBCaXRzdHJlYW1QdXRHVDE2Qml0cyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBJbnQgTGVuZ3RoLCBVTG9uZyBWYWx1ZSkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIFVJbnQgdG9wVmFsdWU7CisgICAgSW50IHRvcExlbmd0aDsKKworICAgIHRvcFZhbHVlID0gKFZhbHVlID4+IDE2KTsKKyAgICB0b3BMZW5ndGggPSBMZW5ndGggLSAxNjsKKworICAgIGlmICh0b3BMZW5ndGggPiAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIHRvcExlbmd0aCwgdG9wVmFsdWUpOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAxNiwgKFVJbnQpKFZhbHVlICYgMHhGRkZGKSk7CisKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIExlbmd0aCwgKFVJbnQpVmFsdWUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1TYXZlV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzAzLzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogc2F2ZSB3cml0dGVuIHdvcmQgaW50byB0aGUgYml0c3RyZWFtIGJ1ZmZlci4gICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RyZWFtICAgICAgdGhlIGJpdHN0cmVhbSB3aGVyZSB0aGUgYml0cyBhcmUgcHV0IGluICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogIFBWX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgQml0c3RyZWFtU2F2ZVdvcmQoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkKK3sKKyAgICBVQ2hhciAqcHRyOworICAgIFVJbnQgd29yZDsKKworICAgIC8qIGFzc3VtZSB0aGF0IHN0cmVhbS0+Yml0TGVmdCBpcyBhbHdheXMgemVybyB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICovCisgICAgaWYgKHN0cmVhbS0+Ynl0ZUNvdW50ICsgV09SRF9TSVpFID4gc3RyZWFtLT5idWZmZXJTaXplKQorICAgIHsKKyAgICAgICAgaWYgKFBWX1NVQ0NFU1MgIT0gQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihzdHJlYW0sIFdPUkRfU0laRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS0+Ynl0ZUNvdW50ICs9IFdPUkRfU0laRTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgcHRyID0gc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgKyBzdHJlYW0tPmJ5dGVDb3VudDsKKyAgICB3b3JkID0gc3RyZWFtLT53b3JkOworICAgIHN0cmVhbS0+d29yZCA9IDA7IC8qIGltcG9ydGFudCB0byByZXNldCB0byB6ZXJvICovCisKKyAgICAvKiBOT1RFOiBieXRlQ291bnQgZG9lcyBub3QgaGF2ZSB0byBiZSBtdWx0aXBsZSBvZiAyIG9yIDQgKi8KKyNpZiAoV09SRF9TSVpFID09IDQpCisgICAgKnB0cisrID0gd29yZCA+PiAyNDsKKyAgICAqcHRyKysgPSAweEZGICYgKHdvcmQgPj4gMTYpOworI2VuZGlmCisKKyAgICAqcHRyKysgPSAweEZGICYgKHdvcmQgPj4gOCk7CisgICAgKnB0ciA9IDB4RkYgJiB3b3JkOworCisjaWYgKFdPUkRfU0laRSA9PSA0KQorICAgIHN0cmVhbS0+Ynl0ZUNvdW50ICs9IDQ7CisgICAgc3RyZWFtLT5iaXRMZWZ0ID0gMzI7CisjZWxzZQorICAgIHN0cmVhbS0+Ynl0ZUNvdW50ICs9IDI7CisgICAgc3RyZWFtLT5iaXRMZWZ0ID0gMTY7CisjZW5kaWYKKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtU2F2ZVBhcnRpYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8wMy8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHNhdmUgdW5maW5pc2hlZCB3cml0dGVuIHdvcmQgaW50byB0aGUgYml0c3RyZWFtIGJ1ZmZlci4gICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0cmVhbSAgICAgIHRoZSBiaXRzdHJlYW0gd2hlcmUgdGhlIGJpdHMgYXJlIHB1dCBpbiAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIEludCAqZnJhY3Rpb24pCit7CisgICAgVUNoYXIgKnB0cjsKKyAgICBVSW50IHdvcmQsIHNoaWZ0OworICAgIEludCBudW1ieXRlLCBiaXRsZWZ0LCBiaXR1c2VkOworCisgICAgYml0bGVmdCA9IHN0cmVhbS0+Yml0TGVmdDsKKyAgICBiaXR1c2VkID0gKFdPUkRfU0laRSA8PCAzKSAtIGJpdGxlZnQ7IC8qIG51bWJlciBvZiBiaXRzIHVzZWQgKi8KKyAgICBudW1ieXRlID0gYml0dXNlZCA+PiAzOyAvKiBudW1iZXIgb2YgYnl0ZSBmdWxseSB1c2VkICovCisKKyAgICBpZiAoc3RyZWFtLT5ieXRlQ291bnQgKyBudW1ieXRlID4gc3RyZWFtLT5idWZmZXJTaXplKQorICAgIHsKKyAgICAgICAgaWYgKFBWX1NVQ0NFU1MgIT0gQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihzdHJlYW0sIG51bWJ5dGUpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0tPmJ5dGVDb3VudCArPSBudW1ieXRlOworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdHIgPSBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciArIHN0cmVhbS0+Ynl0ZUNvdW50OworICAgIHdvcmQgPSBzdHJlYW0tPndvcmQ7CisgICAgd29yZCA8PD0gYml0bGVmdDsgICAvKiB3b3JkIGlzIG5vdCBhbGwgY29uc3VtZWQgKi8KKyAgICBiaXRsZWZ0ID0gYml0dXNlZCAtIChudW1ieXRlIDw8IDMpOyAvKiBudW1iZXIgb2YgYml0cyB1c2VkIChmcmFjdGlvbikgKi8KKyAgICBzdHJlYW0tPmJ5dGVDb3VudCArPSBudW1ieXRlOworICAgIGlmIChiaXRsZWZ0KQorICAgIHsKKyAgICAgICAgKmZyYWN0aW9uID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmZyYWN0aW9uID0gMDsKKyAgICB9CisgICAgYml0bGVmdCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXRsZWZ0OworICAgIC8qIHNhdmUgbmV3IHZhbHVlICovCisgICAgc3RyZWFtLT5iaXRMZWZ0ID0gYml0bGVmdDsKKworICAgIHNoaWZ0ID0gKChXT1JEX1NJWkUgLSAxKSA8PCAzKTsKKyAgICB3aGlsZSAobnVtYnl0ZSkKKyAgICB7CisgICAgICAgICpwdHIrKyA9IChVQ2hhcikoKHdvcmQgPj4gc2hpZnQpICYgMHhGRik7CisgICAgICAgIHdvcmQgPDw9IDg7CisgICAgICAgIG51bWJ5dGUtLTsKKyAgICB9CisKKyAgICBpZiAoKmZyYWN0aW9uKQorICAgIHsvLyB0aGlzIGNvdWxkIGxlYWQgdG8gYnVmZmVyIG92ZXJydW4gd2hlbiBwdHIgaXMgYWxyZWFkeSBvdXQgb2YgYm91bmQuCisgICAgICAgIC8vICAqcHRyID0gKFVDaGFyKSgod29yZD4+c2hpZnQpJjB4RkYpOyAvKiBuZWVkIHRvIGRvIGl0IGZvciB0aGUgbGFzdCBmcmFjdGlvbmFsIGJ5dGUgKi8KKyAgICB9CisKKyAgICAvKiBzYXZlIG5ldyB2YWx1ZXMgKi8KKyAgICBzdHJlYW0tPndvcmQgPSB3b3JkID4+IGJpdGxlZnQ7CisKKyAgICAvKiBub3RlIHdlIGRvbid0IHVwZGF0ZSBieXRlQ291bnQsIGJpdExlZnQgYW5kIHdvcmQgKi8KKyAgICAvKiBzbyB0aGF0IGVuY29kZXIgY2FuIGNvbnRpbnVlIFB1dEJpdHMgaWYgdGhleSBkb24ndCAqLworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKSAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBiaXQgc3R1ZmZpbmcgZm9yIG5leHQgc3RhcnQgY29kZSBpbiBzaG9ydCB2aWRlbyBoZWFkZXIgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogIG51bWJlciBvZiBiaXRzIHRvIGJlIHN0dWZmZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitJbnQgQml0c3RyZWFtU2hvcnRIZWFkZXJCeXRlQWxpZ25TdHVmZmluZyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKQoreworICAgIFVJbnQgcmVzdEJpdHM7CisgICAgSW50IGZyYWN0aW9uOworCisgICAgcmVzdEJpdHMgPSAoc3RyZWFtLT5iaXRMZWZ0ICYgMHg3KTsgLyogbW9kdWxvIDggKi8KKworICAgIGlmIChyZXN0Qml0cykgIC8qc2hvcnRfdmlkZW9faGVhZGVyWzBdIGlzIDEgaW4gaDI2MyBiYXNlbGluZSovCisgICAgeworICAgICAgICAvKiBILjI2MyBzdHlsZSBzdHVmZmluZyAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgcmVzdEJpdHMsIDApOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPmJpdExlZnQgIT0gKFdPUkRfU0laRSA8PCAzKSkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKHN0cmVhbSwgJmZyYWN0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdEJpdHM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKSAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IGJpdCBzdHVmZmluZyBmb3IgbmV4dCBzdGFydCBjb2RlIGluIE1QRUctNCAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBudW1iZXIgb2YgYml0cyB0byBiZSBzdHVmZmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0ludCBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pCit7CisKKyAgICBVSW50IHJlc3RCaXRzOworICAgIEludCBmcmFjdGlvbjsKKyAgICAvKiBRdWVzdGlvbjogaW4gTVBFRy00ICwgc2hvcnRfdmlkZW9faGVhZGVyWzBdPT0wID0+IGV2ZW4gYWxyZWFkeSBieXRlIGFsaWduZWQsIHdpbGwgc3RpbGwgc3R1ZmYgOCBiaXRzCisgICAgICAgbmVlZCB0byBjaGVjayB3aXRoICAqLworICAgIC8qaWYgKCEoZ2V0UG9pbnRlckVOQyhpbmRleDEsIGluZGV4MiklOCkgJiYgc2hvcnRfdmlkZW9faGVhZGVyWzBdKSByZXR1cm4gMDsqLworCisgICAgLyogbmVlZCBzdHVmZmluZyBiaXRzLCAqLworICAgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAxLCAwKTsKKworICAgIHJlc3RCaXRzID0gKHN0cmVhbS0+Yml0TGVmdCAmIDB4Nyk7IC8qIG1vZHVsbyA4ICovCisKKyAgICBpZiAocmVzdEJpdHMpICAvKnNob3J0X3ZpZGVvX2hlYWRlclswXSBpcyAxIGluIGgyNjMgYmFzZWxpbmUqLworICAgIHsKKyAgICAgICAgLyogbmVlZCBzdHVmZmluZyBiaXRzLCAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgcmVzdEJpdHMsIE1hc2tbcmVzdEJpdHNdKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtLT5iaXRMZWZ0ICE9IChXT1JEX1NJWkUgPDwgMykpCisgICAgeworICAgICAgICBCaXRzdHJlYW1TYXZlUGFydGlhbChzdHJlYW0sICZmcmFjdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIChyZXN0Qml0cyk7Cit9CisKKy8qZG9lcyBiaXQgc3R1ZmZpbmcgZm9yIG5leHQgcmVzeW5jIG1hcmtlciovCisvKiAgZG9lcyBiaXQgc3R1ZmZpbmcgZm9yIG5leHQgcmVzeW5jIG1hcmtlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDExIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTExIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMTExIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDExMTExIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTExMTExIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMTExMTExIiAgICg4LWJpdCBjb2Rld29yZCkKKyAqLworCisvKkludCBCaXRzdHJlYW1OZXh0UmVzeW5jTWFya2VyRW5jKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pCit7CisgIEludCBjb3VudDsKKyAgQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLDApOworICBjb3VudD04LXN0cmVhbS0+dG90YWxCaXRzICYgODsKKyAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sY291bnQsTWFza1tjb3VudF0pOworICByZXR1cm4gY291bnQ7Cit9Ki8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1BcHBlbmRFbmMoIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMiAgICkgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBBcHBlbmQgdGhlIGludGVybWVkaWF0ZSBiaXRzdHJlYW0gKGJpdHN0cmVhbTIpIHRvIHRoZSBlbmQgb2YgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGJpdHN0cmVhbShiaXRzdHJlYW0xKSAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworUFZfU1RBVFVTIEJpdHN0cmVhbUFwcGVuZEVuYyhCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICBVQ2hhciAqcHRyQlMyLCAqcHRyQlMxOworICAgIFVDaGFyIGJ5dGVCUzIsIGJ5dGVCUzE7CisgICAgSW50ICBudW1ieXRlMjsKKyAgICBJbnQgYml0dXNlZCwgYml0bGVmdCwgb2Zmc2V0LCBmcmFjdGlvbjsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNhdmVQYXJ0aWFsKGJpdHN0cmVhbTEsICZmcmFjdGlvbik7CisgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBvZmZzZXQgPSBmcmFjdGlvbjsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1TYXZlUGFydGlhbChiaXRzdHJlYW0yLCAmZnJhY3Rpb24pOworICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKCFvZmZzZXQpIC8qIGJpdHN0cmVhbTEgaXMgYnl0ZS1hbGlnbmVkICovCisgICAgeworICAgICAgICByZXR1cm4gQml0c3RyZWFtQXBwZW5kUGFja2V0KGJpdHN0cmVhbTEsIGJpdHN0cmVhbTIpOworICAgIH0KKworICAgIG9mZnNldCArPSBmcmFjdGlvbjsKKworICAgIC8qIHNpbmNlIGJpdHN0cmVhbTEgZG9lc24ndCBoYXZlIHRvIGJlIGJ5dGUtYWxpZ25lZCwgd2UgaGF2ZSB0byBwcm9jZXNzIGJ5dGUgYnkgYnl0ZSAqLworICAgIC8qIHdlIHJlYWQgb25lIGJ5dGUgZnJvbSBiaXRzdHJlYW0yIGFuZCB1c2UgQml0c3RyZWFtUHV0Qml0cyB0byBkbyB0aGUgam9iICovCisgICAgaWYgKGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArIGJpdHN0cmVhbTItPmJ5dGVDb3VudCArIG9mZnNldCA+IGJpdHN0cmVhbTEtPmJ1ZmZlclNpemUpCisgICAgeworICAgICAgICBpZiAoUFZfU1VDQ0VTUyAhPSBCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKGJpdHN0cmVhbTEsIGJpdHN0cmVhbTItPmJ5dGVDb3VudCArIG9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArPSAoYml0c3RyZWFtMi0+Ynl0ZUNvdW50ICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgcHRyQlMxID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyICsgYml0c3RyZWFtMS0+Ynl0ZUNvdW50OyAvKiBtb3ZlIHB0ciBiczEqLworICAgIHB0ckJTMiA9IGJpdHN0cmVhbTItPmJpdHN0cmVhbUJ1ZmZlcjsKKworICAgIGJpdHVzZWQgPSAoV09SRF9TSVpFIDw8IDMpIC0gYml0c3RyZWFtMS0+Yml0TGVmdDsgLyogdGhpcyBtdXN0IGJlIGJldHdlZW4gMS03ICovCisgICAgYml0bGVmdCA9IDggLSBiaXR1c2VkOworCisgICAgbnVtYnl0ZTIgPSBiaXRzdHJlYW0yLT5ieXRlQ291bnQ7ICAgLyogbnVtYmVyIG9mIGJ5dGUgdG8gY29weSBmcm9tIGJzMiAqLworICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArPSBudW1ieXRlMjsgIC8qIG5ldyBieXRlQ291bnQgKi8KKworICAgIGJ5dGVCUzEgPSAoKFVDaGFyKSBiaXRzdHJlYW0xLT53b3JkKSA8PCBiaXRsZWZ0OyAgICAvKiBmcmFjdGlvbiBieXRlIGZyb20gYnMxICovCisKKyAgICB3aGlsZSAobnVtYnl0ZTIpCisgICAgeworICAgICAgICBieXRlQlMyID0gKnB0ckJTMisrOworICAgICAgICBieXRlQlMxIHw9IChieXRlQlMyID4+IGJpdHVzZWQpOworICAgICAgICAqcHRyQlMxKysgPSBieXRlQlMxOworICAgICAgICBieXRlQlMxID0gYnl0ZUJTMiA8PCBiaXRsZWZ0OworICAgICAgICBudW1ieXRlMi0tOworICAgIH0KKworICAgIGJpdHN0cmVhbTEtPndvcmQgPSBieXRlQlMxID4+IGJpdGxlZnQ7ICAvKiBiaXRzdHJlYW0tPmJpdExlZnQgcmVtYWlucyB0aGUgc2FtZSAqLworCisgICAgLyogbm93IHNhdmUgYnMyLT53b3JkIGluIGJzMSAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtMSwgKFdPUkRfU0laRSA8PCAzKSAtIGJpdHN0cmVhbTItPmJpdExlZnQsIGJpdHN0cmVhbTItPndvcmQpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1BcHBlbmRQYWNrZXQoIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMiAgICkgICAqLworLyogIERhdGUgICAgIDogMDUvMzEvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBBcHBlbmQgdGhlIGludGVybWVkaWF0ZSBiaXRzdHJlYW0gKGJpdHN0cmVhbTIpIHRvIHRoZSBlbmQgb2YgKi8KKy8qICAgICAgICAgICAgICBvdXRwdXQgYml0c3RyZWFtKGJpdHN0cmVhbTEpIGtub3dpbmcgdGhhdCBiaXRzdHJlYW0xIGlzIGJ5dGUtYWxpZ25lZCovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBCaXRzdHJlYW1BcHBlbmRQYWNrZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKQoreworICAgIFVDaGFyICpwdHJCUzIsICpwdHJCUzE7CisgICAgSW50ICBudW1ieXRlMjsKKworICAgIGlmIChiaXRzdHJlYW0xLT5ieXRlQ291bnQgKyBiaXRzdHJlYW0yLT5ieXRlQ291bnQgID4gYml0c3RyZWFtMS0+YnVmZmVyU2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChQVl9TVUNDRVNTICE9IEJpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoYml0c3RyZWFtMSwgYml0c3RyZWFtMi0+Ynl0ZUNvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICs9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsgLyogbGVnYWN5LCB0byBrZWVwIHRyYWNrIG9mIHRvdGFsIGJ5dGVzICovCisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0ckJTMSA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciArIGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsgLyogbW92ZSBwdHIgYnMxKi8KKyAgICBwdHJCUzIgPSBiaXRzdHJlYW0yLT5iaXRzdHJlYW1CdWZmZXI7CisKKyAgICBudW1ieXRlMiA9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsKKyAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gbnVtYnl0ZTI7IC8qIG5ldyBieXRlQ291bnQgKi8KKworICAgIC8qY29weSBhbGwgdGhlIGJ5dGVzIGluIGJpdHN0cmVhbTIqLworICAgIE00VkVOQ19NRU1DUFkocHRyQlMxLCBwdHJCUzIsIHNpemVvZihVQ2hhcikqbnVtYnl0ZTIpOworCisgICAgYml0c3RyZWFtMS0+d29yZCA9IGJpdHN0cmVhbTItPndvcmQ7ICAvKiBiaXRzdHJlYW0xLT5iaXRMZWZ0IGlzIHRoZSBzYW1lICovCisgICAgYml0c3RyZWFtMS0+Yml0TGVmdCA9IGJpdHN0cmVhbTItPmJpdExlZnQ7CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldCggQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMiAgICkgICAqLworLyogIERhdGUgICAgIDogMDQvMjMvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBBcHBlbmQgdGhlIGludGVybWVkaWF0ZSBiaXRzdHJlYW0gKGJpdHN0cmVhbTIpIHRvIHRoZSBlbmQgb2YgKi8KKy8qICAgICAgICAgICAgICBvdXRwdXQgYml0c3RyZWFtKGJpdHN0cmVhbTEpICwgZm9yIHNsaWNlLWJhc2VkIGNvZGluZyBvbmx5ICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgVUNoYXIgKnB0ckJTMiwgKnB0ckJTMTsKKyAgICBJbnQgIG51bWJ5dGUyOworICAgIEludCAgYnl0ZWxlZnQ7CisKKyAgICBudW1ieXRlMiA9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsKKworICAgIGlmIChiaXRzdHJlYW0xLT5ieXRlQ291bnQgKyBiaXRzdHJlYW0yLT5ieXRlQ291bnQgPiBiaXRzdHJlYW0xLT5idWZmZXJTaXplKQorICAgIHsKKyAgICAgICAgbnVtYnl0ZTIgPSAgYml0c3RyZWFtMS0+YnVmZmVyU2l6ZSAtIGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKKyAgICAgICAgc3RhdHVzID0gIFBWX0VORF9PRl9CVUY7ICAgIC8qIHNpZ25hbCBlbmQgb2YgYnVmZmVyICovCisgICAgfQorCisgICAgcHRyQlMxID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyOyAvKiBtb3ZlIHB0ciBiczEqLworICAgIHB0ckJTMiA9IGJpdHN0cmVhbTItPmJpdHN0cmVhbUJ1ZmZlcjsKKworICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArPSBudW1ieXRlMjsgLyogc2hvdWxkIGJlIGVxdWFsIHRvIGJ1ZmZlclNpemUgKi8KKworICAgIC8qY29weSBhbGwgdGhlIGJ5dGVzIGluIGJpdHN0cmVhbTIqLworICAgIE00VkVOQ19NRU1DUFkocHRyQlMxLCBwdHJCUzIsIHNpemVvZihVQ2hhcikqbnVtYnl0ZTIpOworICAgIGJpdHN0cmVhbTEtPndvcmQgPSAwOworICAgIGJpdHN0cmVhbTEtPmJpdExlZnQgPSAoV09SRF9TSVpFIDw8IDMpOworCisgICAgaWYgKHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGKSAvKiByZS1wb3NpdGlvbiBiaXRzdHJlYW0yICovCisgICAgeworICAgICAgICBieXRlbGVmdCA9IGJpdHN0cmVhbTItPmJ5dGVDb3VudCAtIG51bWJ5dGUyOworCisgICAgICAgIE00VkVOQ19NRU1DUFkocHRyQlMyLCBwdHJCUzIgKyBudW1ieXRlMiwgc2l6ZW9mKFVDaGFyKSpieXRlbGVmdCk7CisKKyAgICAgICAgYml0c3RyZWFtMi0+Ynl0ZUNvdW50ID0gYnl0ZWxlZnQ7CisgICAgICAgIC8qIGJpdHN0cmVhbTItPndvcmQgYW5kIGJpdHN0cmVhbS0+Yml0TGVmdCBhcmUgdW5jaGFuZ2VkLgorICAgICAgICAgICB0aGV5IHNob3VsZCBiZSAwIGFuZCAoV09SRF9TSVpFPDwzKSAqLworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVJlcG9zKCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtLCAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBieXRlQ291bnQsIEludCBiaXRDb3VudCkgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8yOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFJlcG9zaXRpb24gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBjb250ZW50IChjdXJ0YWlsKSAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgICBCaXRzdHJlYW1SZXBvcyhCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtLCBJbnQgYnl0ZUNvdW50LCBJbnQgYml0Q291bnQpCit7CisgICAgVUNoYXIgKnB0ciwgYnl0ZTsKKyAgICBVSW50IHdvcmQ7CisgICAgSW50IGZyYWN0aW9uOworCisgICAgQml0c3RyZWFtU2F2ZVBhcnRpYWwoYml0c3RyZWFtLCAmZnJhY3Rpb24pOworCisgICAgYml0c3RyZWFtLT5ieXRlQ291bnQgPSBieXRlQ291bnQ7CisgICAgcHRyID0gYml0c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgKyBieXRlQ291bnQ7IC8qIGdldCBmcmFjdGlvbiBvZiB0aGUgYnl0ZSAqLworICAgIGlmIChiaXRDb3VudCkKKyAgICB7CisgICAgICAgIGJpdHN0cmVhbS0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXRDb3VudDsgLyogYml0Q291bnQgc2hvdWxkIGJlIDAtMzEgKi8KKyAgICAgICAgd29yZCA9ICpwdHIrKzsKKyAgICAgICAgYnl0ZSA9ICpwdHIrKzsKKyAgICAgICAgd29yZCA9IGJ5dGUgfCAod29yZCA8PCA4KTsKKyNpZiAoV09SRF9TSVpFID09IDQpCisgICAgICAgIGJ5dGUgPSAqcHRyKys7CisgICAgICAgIHdvcmQgPSBieXRlIHwgKHdvcmQgPDwgOCk7CisgICAgICAgIGJ5dGUgPSAqcHRyKys7CisgICAgICAgIHdvcmQgPSBieXRlIHwgKHdvcmQgPDwgOCk7CisjZW5kaWYKKyAgICAgICAgYml0c3RyZWFtLT53b3JkID0gd29yZCA+PiAoYml0c3RyZWFtLT5iaXRMZWZ0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYml0c3RyZWFtLT53b3JkID0gMDsKKyAgICAgICAgYml0c3RyZWFtLT5iaXRMZWZ0ID0gKFdPUkRfU0laRSA8PCAzKTsKKyAgICB9CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1GbHVzaEJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IG51bV9iaXRfbGVmdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMjQvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGbHVzaCBidWZmZXIgZXhjZXB0IHRoZSBsYXN0IG51bV9iaXRfbGVmdCBiaXRzLiAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK1BWX1NUQVRVUyBCaXRzdHJlYW1GbHVzaEJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEludCBudW1fYml0X2xlZnQpCit7CisgICAgSW50IGk7CisgICAgVUNoYXIgKnB0ckRzdCwgKnB0clNyYzsKKyAgICBJbnQgbGVmdG92ZXIsIGJpdHVzZWQ7CisgICAgSW50IG5ld19ieXRlID0gKG51bV9iaXRfbGVmdCA+PiAzKTsKKyAgICBJbnQgbmV3X2JpdCA9IG51bV9iaXRfbGVmdCAtIChuZXdfYnl0ZSA8PCAzKTsgLyogYmV0d2VlbiAwLTcgKi8KKworICAgIHB0clNyYyA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciArIGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKKyAgICBwdHJEc3QgPSBiaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXI7CisKKyAgICBiaXR1c2VkID0gKFdPUkRfU0laRSA8PCAzKSAtIGJpdHN0cmVhbTEtPmJpdExlZnQ7CisKKyAgICBsZWZ0b3ZlciA9IDggLSBiaXR1c2VkOyAvKiBiaXR1c2VkIHNob3VsZCBiZSBiZXR3ZWVuIDAtNyAqLworCisgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ID0gbmV3X2J5dGU7CisgICAgYml0c3RyZWFtMS0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMykgLSBuZXdfYml0OworCisgICAgaWYgKCFiaXR1c2VkKSAvKiBieXRlIGFsaWduZWQgKi8KKyAgICB7CisgICAgICAgIE00VkVOQ19NRU1DUFkocHRyRHN0LCBwdHJTcmMsIG5ld19ieXRlICsgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qY29weSBhbGwgdGhlIGJ5dGVzIGluIGJpdHN0cmVhbTIqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmV3X2J5dGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgKnB0ckRzdCsrID0gKHB0clNyY1swXSA8PCBiaXR1c2VkKSB8IChwdHJTcmNbMV0gPj4gbGVmdG92ZXIpOworICAgICAgICAgICAgcHRyU3JjKys7CisgICAgICAgIH0KKyAgICAgICAgLyogY29weSBmb3IgdGhlIGxhc3QgYnl0ZSBvZiBwdHJTcmMsIGNvcHkgZXh0cmEgYml0cyBkb2Vzbid0IGh1cnQgKi8KKyAgICAgICAgaWYgKG5ld19iaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwdHJEc3QrKyA9IChwdHJTcmNbMF0gPDwgYml0dXNlZCkgfCAocHRyU3JjWzFdID4+IGxlZnRvdmVyKTsKKyAgICAgICAgICAgIHB0clNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZXdfYml0KQorICAgIHsKKyAgICAgICAgcHRyU3JjID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyICsgbmV3X2J5dGU7CisgICAgICAgIGJpdHN0cmVhbTEtPndvcmQgPSAoKnB0clNyYykgPj4gKDggLSBuZXdfYml0KTsKKyAgICB9CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1QcmVwZW5kUGFja2V0KCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMiAgICkgICAqLworLyogIERhdGUgICAgIDogMDQvMjYvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQcmVwZW5kIHRoZSBpbnRlcm1lZGlhdGUgYml0c3RyZWFtIChiaXRzdHJlYW0yKSB0byB0aGUgYmVnaW5uaW5nIG9mICovCisvKiAgICAgICAgICAgICAgb3V0cHV0IGJpdHN0cmVhbShiaXRzdHJlYW0xKSAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgQml0c3RyZWFtUHJlcGVuZFBhY2tldChCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIpCit7CisgICAgVUNoYXIgKnBTcmMsICpwRHN0LCBieXRlOworICAgIEludCAgICAgbW92ZWJ5dGUsIGJpdHVzZWQsIGxlZnRvdmVyLCBpLCBmcmFjdGlvbjsKKworICAgIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKGJpdHN0cmVhbTIsICZmcmFjdGlvbik7IC8qIG1ha2Ugc3VyZSBvbmx5IGZyYWN0aW9uIG9mIGJ5dGUgbGVmdCAqLworICAgIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKGJpdHN0cmVhbTEsICZmcmFjdGlvbik7CisKKyAgICBpZiAoYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICsgYml0c3RyZWFtMi0+Ynl0ZUNvdW50ID49IGJpdHN0cmVhbTEtPmJ1ZmZlclNpemUpCisgICAgeworICAgICAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gYml0c3RyZWFtMi0+Ynl0ZUNvdW50OworICAgICAgICByZXR1cm4gUFZfRU5EX09GX0JVRjsKKyAgICB9CisKKyAgICBtb3ZlYnl0ZSA9IGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKKyAgICBpZiAobW92ZWJ5dGUgPCBiaXRzdHJlYW0yLT5ieXRlQ291bnQpCisgICAgICAgIG1vdmVieXRlID0gYml0c3RyZWFtMi0+Ynl0ZUNvdW50OworICAgIG1vdmVieXRlKys7CisKKyAgICAvKiBzaGlmdCBiaXRzdHJlYW0xIHRvIHRoZSByaWdodCBieSBtb3ZlYnl0ZSAqLworICAgIHBTcmMgPSBiaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXI7CisgICAgcERzdCA9IHBTcmMgKyBtb3ZlYnl0ZTsKKworICAgIE00VkVOQ19NRU1DUFkocERzdCwgcFNyYywgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICsgMSk7CisKKyAgICAvKiBjb3B5IGJpdHN0cmVhbTIgdG8gdGhlIGJlZ2lubmluZyBvZiBiaXRzdHJlYW0xICovCisgICAgTTRWRU5DX01FTUNQWShwU3JjLCBiaXRzdHJlYW0yLT5iaXRzdHJlYW1CdWZmZXIsIGJpdHN0cmVhbTItPmJ5dGVDb3VudCArIDEpOworCisgICAgLyogbm93IHNoaWZ0IGJhY2sgcHJldmlvdXMgYml0c3RyZWFtMSBidWZmZXIgdG8gdGhlIGVuZCAqLworICAgIHBTcmMgPSBwRHN0OworICAgIHBEc3QgPSBiaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXIgKyBiaXRzdHJlYW0yLT5ieXRlQ291bnQ7CisKKyAgICBiaXR1c2VkID0gKFdPUkRfU0laRSA8PCAzKSAtIGJpdHN0cmVhbTItPmJpdExlZnQ7CisgICAgbGVmdG92ZXIgPSA4IC0gYml0dXNlZDsgICAgIC8qIGJpdHVzZWQgc2hvdWxkIGJlIDAtNyAqLworCisgICAgYnl0ZSA9IChiaXRzdHJlYW0yLT53b3JkKSA8PCBsZWZ0b3ZlcjsKKworICAgICpwRHN0KysgPSBieXRlIHwgKHBTcmNbMF0gPj4gYml0dXNlZCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICsgMTsgaSsrKQorICAgIHsKKyAgICAgICAgKnBEc3QrKyA9ICgocFNyY1swXSA8PCBsZWZ0b3ZlcikgfCAocFNyY1sxXSA+PiBiaXR1c2VkKSk7CisgICAgICAgIHBTcmMrKzsKKyAgICB9CisKKyAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gYml0c3RyZWFtMi0+Ynl0ZUNvdW50OworICAgIC8vYml0c3RyZWFtMS0+Yml0Q291bnQgKz0gYml0c3RyZWFtMi0+Yml0Q291bnQ7CisgICAgYml0dXNlZCA9IChXT1JEX1NJWkUgPDwgNCkgLSAoYml0c3RyZWFtMS0+Yml0TGVmdCArIGJpdHN0cmVhbTItPmJpdExlZnQpOworCisgICAgaWYgKGJpdHVzZWQgPj0gOCkKKyAgICB7CisgICAgICAgIGJpdHVzZWQgLT0gODsKKyAgICAgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50Kys7CisgICAgfQorCisgICAgYml0c3RyZWFtMS0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXR1c2VkOworCisgICAgYml0c3RyZWFtMi0+Ynl0ZUNvdW50ID0gYml0c3RyZWFtMi0+d29yZCA9IDA7CisgICAgYml0c3RyZWFtMi0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMyk7CisKKyAgICBwU3JjID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyICsgYml0c3RyZWFtMS0+Ynl0ZUNvdW50OworICAgIGxlZnRvdmVyID0gOCAtIGJpdHVzZWQ7CisgICAgLy8qcFNyYyA9IChwU3JjWzBdPj5sZWZ0b3Zlcik8PGxlZnRvdmVyOyAvKiBtYWtlIHN1cmUgdGhlIHJlc3Qgb2YgYml0cyBhcmUgemVyb3MgKi8KKworICAgIGJpdHN0cmVhbTEtPndvcmQgPSAoVUludCkoKHBTcmNbMF0pID4+IGxlZnRvdmVyKTsKKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorI2VuZGlmICAvKiBOT19TTElDRV9FTkNPREUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbUdldFBvcyggQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMDUvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgdGhlIGJpdCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworSW50IEJpdHN0cmVhbUdldFBvcyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKQoreworCisgICAgcmV0dXJuIHN0cmVhbS0+Ynl0ZUNvdW50KjggKyAoV09SRF9TSVpFIDw8IDMpIC0gc3RyZWFtLT5iaXRMZWZ0OworfQorCit2b2lkIEJpdHN0cmVhbUVuY1Jlc2V0KEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pCit7CisgICAgc3RyZWFtLT5iaXRMZWZ0ID0gKFdPUkRfU0laRSA8PCAzKTsKKyAgICBzdHJlYW0tPndvcmQgPSAwOworICAgIHN0cmVhbS0+Ynl0ZUNvdW50ID0gMDsKKyAgICByZXR1cm4gOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgb3ZlcnJ1biBidWZmZXIsIGFuZCBWaWRlb0VuY0RhdGEgY29udGV4dCBmb3IgY2FsbGJhY2sgdG8gcmVhbGxvY2F0ZQorb3ZlcnJ1biBidWZmZXIuICAqLworVm9pZCAgQml0c3RyZWFtU2V0T3ZlcnJ1bkJ1ZmZlcihCaXRzdHJlYW1FbmNWaWRlbyogc3RyZWFtLCBVQ2hhciogb3ZlcnJ1bkJ1ZmZlciwgSW50IG9CU2l6ZSwgVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBzdHJlYW0tPm92ZXJydW5CdWZmZXIgPSBvdmVycnVuQnVmZmVyOworICAgIHN0cmVhbS0+b0JTaXplID0gb0JTaXplOworICAgIHN0cmVhbS0+dmlkZW8gPSB2aWRlbzsKKworICAgIHJldHVybiA7Cit9CisKKworLyogZGV0ZXJtaW5lIHdoZXRoZXIgb3ZlcnJ1biBidWZmZXIgY2FuIGJlIHVzZWQgb3Igbm90ICovCitQVl9TVEFUVVMgQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihCaXRzdHJlYW1FbmNWaWRlbyogc3RyZWFtLCBJbnQgbnVtRXh0cmFCeXRlcykKK3sKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gc3RyZWFtLT52aWRlbzsKKworICAgIGlmIChzdHJlYW0tPm92ZXJydW5CdWZmZXIgIT0gTlVMTCkgLy8gb3ZlcnJ1bkJ1ZmZlciBpcyBzZXQKKyAgICB7CisgICAgICAgIGlmIChzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciAhPSBzdHJlYW0tPm92ZXJydW5CdWZmZXIpIC8vIG5vdCBhbHJlYWR5IHVzZWQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbS0+Ynl0ZUNvdW50ICsgbnVtRXh0cmFCeXRlcyA+PSBzdHJlYW0tPm9CU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSA9IHN0cmVhbS0+Ynl0ZUNvdW50ICsgbnVtRXh0cmFCeXRlcyArIDEwMDsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSAmPSAofjB4Myk7IC8vIG1ha2UgaXQgbXVsdGlwbGUgb2YgNAorCisgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IG92ZXJydW4gQnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5vdmVycnVuQnVmZmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm92ZXJydW5CdWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aWRlby0+b0JTaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgICAgICAgICAgdmlkZW8tPm92ZXJydW5CdWZmZXIgPSAoVUNoYXIqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBzdHJlYW0tPm9CU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gdmlkZW8tPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGV2ZXJ5dGhpbmcgdG8gb3ZlcnJ1biBidWZmZXIgYW5kIHN0YXJ0IHVzaW5nIGl0LgorICAgICAgICAgICAgbWVtY3B5KHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIsIHN0cmVhbS0+Ynl0ZUNvdW50KTsKKyAgICAgICAgICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5idWZmZXJTaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvLyBvdmVycnVuIGJ1ZmZlciBpcyBhbHJlYWR5IHVzZWQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbS0+Ynl0ZUNvdW50ICsgbnVtRXh0cmFCeXRlcyA+PSBzdHJlYW0tPm9CU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSA9IHN0cmVhbS0+Ynl0ZUNvdW50ICsgbnVtRXh0cmFCeXRlcyArIDEwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IG92ZXJydW4gYnVmZmVyCisgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSAmPSAofjB4Myk7IC8vIG1ha2UgaXQgbXVsdGlwbGUgb2YgNAorICAgICAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICAgICAgdmlkZW8tPm92ZXJydW5CdWZmZXIgPSAoVUNoYXIqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBzdHJlYW0tPm9CU2l6ZSk7CisgICAgICAgICAgICBpZiAodmlkZW8tPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBmcm9tIHRoZSBvbGQgYnVmZmVyIHRvIG5ldyBidWZmZXIKKyAgICAgICAgICAgIG1lbWNweSh2aWRlby0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5vdmVycnVuQnVmZmVyLCBzdHJlYW0tPmJ5dGVDb3VudCk7CisgICAgICAgICAgICAvLyBmcmVlIG9sZCBidWZmZXIKKyAgICAgICAgICAgIE00VkVOQ19GUkVFKHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcik7CisgICAgICAgICAgICAvLyBhc3NpZ24gcG9pbnRlciB0byBuZXcgYnVmZmVyCisgICAgICAgICAgICBzdHJlYW0tPm92ZXJydW5CdWZmZXIgPSB2aWRlby0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5idWZmZXJTaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSAvLyBvdmVycnVuQnVmZmVyIGlzIG5vdCBlbmFibGUuCisgICAgeworICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICB9CisKK30KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNlMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmgKQEAgLTAsMCArMSw1NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX0JJVFNUUkVBTV9JT19IXworI2RlZmluZSBfQklUU1RSRUFNX0lPX0hfCisKKyNkZWZpbmUgQml0c3RyZWFtUHV0MUJpdHMoeCx5KSAgQml0c3RyZWFtUHV0Qml0cyh4LDEseSkKKyNkZWZpbmUgQml0c3RyZWFtUHV0R1Q4Qml0cyh4LHkseikgQml0c3RyZWFtUHV0Qml0cyh4LHkseikKKworI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqQml0U3RyZWFtQ3JlYXRlRW5jKEludCBidWZmZXJTaXplKTsKKyAgICBWb2lkICBCaXRzdHJlYW1DbG9zZUVuYyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtUHV0Qml0cyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBJbnQgTGVuZ3RoLCBVSW50IFZhbHVlKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtUHV0R1QxNkJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwgVUxvbmcgVmFsdWUpOworICAgIFBWX1NUQVRVUyBCaXRzdHJlYW1TYXZlV29yZChCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtU2F2ZVBhcnRpYWwoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50ICpmcmFjdGlvbik7CisgICAgSW50IEJpdHN0cmVhbUdldFBvcyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKTsKKyAgICB2b2lkIEJpdHN0cmVhbUVuY1Jlc2V0KEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pOworCisgICAgSW50IEJpdHN0cmVhbVNob3J0SGVhZGVyQnl0ZUFsaWduU3R1ZmZpbmcoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSk7CisgICAgSW50IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbUFwcGVuZEVuYyhCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIpOworICAgIFBWX1NUQVRVUyBCaXRzdHJlYW1BcHBlbmRQYWNrZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtUmVwb3MoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSwgSW50IGJ5dGVDb3VudCwgSW50IGJpdENvdW50KTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtRmx1c2hCaXRzKEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCBJbnQgbnVtX2JpdF9sZWZ0KTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtUHJlcGVuZFBhY2tldChCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIpOworCisKKyAgICBWb2lkICBCaXRzdHJlYW1TZXRPdmVycnVuQnVmZmVyKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIFVDaGFyICpvdmVycnVuQnVmZmVyLCBJbnQgb0JTaXplLCBWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihCaXRzdHJlYW1FbmNWaWRlbyogc3RyZWFtLCBJbnQgbnVtRXh0cmFCeXRlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9CSVRTVFJFQU1fSU9fSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2NvbWJpbmVkX2VuY29kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjU2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwCkBAIC0wLDAgKzEsNjkzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAiYml0c3RyZWFtX2lvLmgiCisjaW5jbHVkZSAidmxjX2VuY29kZS5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKK1BWX1NUQVRVUyBFbmNvZGVHT0JIZWFkZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IEdPQl9udW1iZXIsIEludCBxdWFudF9zY2FsZSwgSW50IGJzMXN0cmVhbSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlRnJhbWVDb21iaW5lZE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8wMS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIENvbWJpbmVkIG1vZGUuICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwgZWxzZSBQVl9GQUlMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZUZyYW1lQ29tYmluZWRNb2RlKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsgLyogaGFzIHRvIGJlIFZvcCwgZm9yIG11bHRpcGxlIG9mIDE2ICovCisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7IC8qIHdpdGggcGFkZGluZyAqLworICAgIEludCBvZmZzZXQgPSAwOworICAgIEludCBpbmRfeCwgaW5kX3k7CisgICAgSW50IHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAwOworICAgIFVDaGFyICpRUE1CID0gdmlkZW8tPlFQTUI7CisgICAgSW50IFFQOworICAgIEludCBtYm51bSA9IDAsIHNsaWNlX2NvdW50ZXIgPSAwLCBjdXJyX3NsaWNlX2NvdW50ZXIgPSAwOworICAgIEludCBudW1fYml0cywgcGFja2V0X3NpemUgPSBlbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemU7CisgICAgSW50IEdPQl9IZWFkZXJfSW50ZXJ2YWwgPSBlbmNQYXJhbXMtPkdPQl9IZWFkZXJfSW50ZXJ2YWw7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMSA9IHZpZGVvLT5iaXRzdHJlYW0xOworICAgIEludCBudW1IZWFkZXJCaXRzOworICAgIGFwcHJveERDVCBmYXN0RENUZnVuY3Rpb247CisgICAgSW50IG5jb2VmYmxja1s2XSA9IHs2NCwgNjQsIDY0LCA2NCwgNjQsIDY0fTsgLyogZm9yIEZhc3RDb2RlTUIsICA1LzE4LzIwMDEgKi8KKyAgICBQVl9TVEFUVVMoKkNvZGVNQikoVmlkZW9FbmNEYXRhICosIGFwcHJveERDVCAqLCBJbnQsIEludFtdKTsKKyAgICB2b2lkICgqTUJWbGNFbmNvZGUpKFZpZGVvRW5jRGF0YSosIEludFtdLCB2b2lkICopOworICAgIHZvaWQgKCpCbG9ja0NvZGVDb2VmZikoUnVuTGV2ZWxCbG9jayosIEJpdHN0cmVhbUVuY1ZpZGVvKiwgSW50LCBJbnQsIFVDaGFyKTsKKworICAgIC8qIGZvciBIMjYzIEdPQiBjaGFuZ2VzICovCisvL01QNFJhdGVDb250cm9sVHlwZSByY190eXBlID0gZW5jUGFyYW1zLT5SQ19UeXBlOworCisgICAgdmlkZW8tPlFQX3ByZXYgPSBjdXJyVm9wLT5xdWFudGl6ZXI7CisKKyAgICBudW1IZWFkZXJCaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisKKyAgICAvKiBkZXRlcm1pbmUgdHlwZSBvZiBxdWFudGl6YXRpb24gICAqLworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSA9PSAwKQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisgICAgZWxzZQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX01QRUc7CisjZWxzZQorICAgIENvZGVNQiA9ICZDb2RlTUJfSDI2MzsKKyNlbmRpZgorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9ucyB0byBiZSB1c2VkLCBpbiBNQi1sZXZlbCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVDb21iaW5lZF9QX1ZPUDsKKyAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVDb21iaW5lZF9JX1ZPUDsKKyAgICBlbHNlIC8qIEJfVk9QIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAvKiBkZXRlcm1pbmUgd2hpY2ggVkxDIHRhYmxlIHRvIGJlIHVzZWQgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1Nob3J0SGVhZGVyOworI2lmbmRlZiBOT19SVkxDCisgICAgZWxzZSBpZiAoY3VyclZvbC0+dXNlUmV2ZXJzZVZMQykKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfUlZMQzsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfTm9ybWFsOworI2Vsc2UKKyAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcjsKKyNlbmRpZgorCisgICAgLyogZ29iX2ZyYW1lX2lkIGlzIHRoZSBzYW1lIGZvciBkaWZmZXJlbnQgdm9wIHR5cGVzIC0gdGhlIHJlYXNvbiBzaG91bGQgYmUgU0NEICovCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIgJiYgY3VyclZvcC0+Z29iRnJhbWVJRCAhPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSkKKyAgICAgICAgY3VyclZvcC0+Z29iRnJhbWVJRCA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworCisKKyAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKworICAgIGZvciAoaW5kX3kgPSAwOyBpbmRfeSA8IGN1cnJWb2wtPm5NQlBlckNvbDsgaW5kX3krKykgICAgLyogQ29sIE1CIExvb3AgKi8KKyAgICB7CisKKyAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl95ID0gaW5kX3k7IC8qICA1LzI4LzAxICovCisKKyAgICAgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpICAvKiBTaG9ydFZpZGVvSGVhZGVyIE1vZGUgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAoc2xpY2VfY291bnRlciAmJiBHT0JfSGVhZGVyX0ludGVydmFsICYmIChpbmRfeSAlIEdPQl9IZWFkZXJfSW50ZXJ2YWwgPT0gMCkpICAgICAvKiBFbmNvZGUgR09CIEhlYWRlciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFQID0gUVBNQlttYm51bV07ICAgIC8qIEdldCBxdWFudF9zY2FsZSAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoY3VyclZvbC0+c3RyZWFtKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVHT0JIZWFkZXIodmlkZW8sIHNsaWNlX2NvdW50ZXIsIFFQLCAwKTsgIC8vaW5kX3kgICAgIC8qIEVuY29kZSBHT0IgSGVhZGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhjdXJyVm9sLT5zdHJlYW0pOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIGN1cnJfc2xpY2VfY291bnRlciA9IHNsaWNlX2NvdW50ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGluZF94ID0gMDsgaW5kX3ggPCBjdXJyVm9sLT5uTUJQZXJSb3c7IGluZF94KyspICAvKiBSb3cgTUIgTG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3ggPSBpbmRfeDsgLyogIDUvMjgvMDEgKi8KKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgUVAgPSBRUE1CW21ibnVtXTsgICAvKiBhbHdheXMgcmVhZCBuZXcgUVAgKi8KKworICAgICAgICAgICAgaWYgKEdPQl9IZWFkZXJfSW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gY3Vycl9zbGljZV9jb3VudGVyOyAvKiBVcGRhdGUgTUIgc2xpY2UgbnVtYmVyICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBNQiBQcmVkaWN0aW9uOlB1dCBpbnRvIE1DIG1hY3JvYmxvY2ssIHN1YnN0cmFjdCBmcm9tIGN1cnJWb3AsIHB1dCBpbiBwcmVkTUIgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZ2V0TW90aW9uQ29tcGVuc2F0ZWRNQih2aWRlbywgaW5kX3gsIGluZF95LCBvZmZzZXQpOworCisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICAgICAgaWYgKHN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VfY291bnRlcisrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBzbGljZSBjb3VudGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+UVBfcHJldiA9IGN1cnJWb3AtPnF1YW50aXplcjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgbWJudW0sIHZpZGVvLT5RUF9wcmV2LCAwKTsKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgICAgICAgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOworICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBDb2RlX01COiAgRENULCBRLCBRXigtMSksIElEQ1QsIE1vdGlvbiBDb21wICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIHN0YXR1cyA9ICgqQ29kZU1CKSh2aWRlbywgJmZhc3REQ1RmdW5jdGlvbiwgKG9mZnNldCA8PCA1KSArIFFQLCBuY29lZmJsY2spOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgVkxDIEVuY29kZTogVkxDIEVuY29kZSBNQiAgICAgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICgqTUJWbGNFbmNvZGUpKHZpZGVvLCBuY29lZmJsY2ssICh2b2lkKilCbG9ja0NvZGVDb2VmZik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogQXNzZW1ibGUgUGFja2V0czogIEFzc2VtYmxlIHRoZSBNQiBWTEMgY29kZXMgaW50byBQYWNrZXRzICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLyogQXNzZW1ibGVfUGFja2V0KHZpZGVvKSAqLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICAgICAgICAgIGlmICghY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgLyogTm90IGluIFNob3J0VmlkZW9IZWFkZXIgbW9kZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY3VyclZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSkgLyogUkVTWU5DIE1BUktFUiBNT0RFICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBudW1fYml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpIC0gbnVtSGVhZGVyQml0czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9iaXRzID4gcGFja2V0X3NpemUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7IC8qIEJ5dGUgYWxpZ24gUGFja2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIFB1dCBQYWNrZXQgdG8gQnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSBldmVuIGlmIHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGLCB0byBnZXQgdGhlIHN0YXRzICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAvKiBOTyBSRVNZTkMgTUFSS0VSIE1PREUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZEVuYyhjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIEluaXRpYWxpemUgdG8gMCAqLworICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSBldmVuIGlmIHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGLCB0byBnZXQgdGhlIHN0YXRzICovCisKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLyogSDI2M19PTkxZICovCisgICAgICAgICAgICB7ICAgLyogU2hvcnRWaWRlb0hlYWRlciBNb2RlICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kRW5jKGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgIC8qIEluaXRpYWxpemUgdG8gMCAqLworICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIGV2ZW4gaWYgc3RhdHVzID09IFBWX0VORF9PRl9CVUYsIHRvIGdldCB0aGUgc3RhdHMgKi8KKworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYm51bSsrOworICAgICAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgICAgICB9IC8qIEVuZCBvZiBGb3IgaW5kX3ggKi8KKworICAgICAgICBvZmZzZXQgKz0gKGx4IDw8IDQpIC0gd2lkdGg7CisgICAgICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAgLyogU2hvcnRWaWRlb0hlYWRlciA9IDEgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAoR09CX0hlYWRlcl9JbnRlcnZhbCkgIHNsaWNlX2NvdW50ZXIrKzsKKyAgICAgICAgfQorCisgICAgfSAvKiBFbmQgb2YgRm9yIGluZF95ICovCisKKyAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgLyogU2hvcnRWaWRlb0hlYWRlciA9IDEgKi8KKyAgICB7CisKKyAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbVNob3J0SGVhZGVyQnl0ZUFsaWduU3R1ZmZpbmcoY3VyclZvbC0+c3RyZWFtKTsgLyogQnl0ZSBBbGlnbiAqLworICAgIH0KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgZWxzZSAgIC8qIENvbWJpbmVkIE1vZGUqLworICAgIHsKKyAgICAgICAgaWYgKCFjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKSAvKiBSZXN5bmMgTWFya2VycyAqLworICAgICAgICB7CisKKyAgICAgICAgICAgIGlmICghc3RhcnRfcGFja2V0X2hlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOy8qIEJ5dGUgQWxpZ24gICovCisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOyAgIC8qIFB1dCBQYWNrZXQgdG8gQnVmZmVyICovCisgICAgICAgICAgICAgICAgLyogY29udGludWUgZXZlbiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdG8gZ2V0IHRoZSBzdGF0cyAqLworCisgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLyogTm8gUmVzeW5jIE1hcmtlcnMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoY3VyclZvbC0+c3RyZWFtKTsgLyogQnl0ZSBBbGlnbiAqLworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworCisgICAgcmV0dXJuIHN0YXR1czsgLyogaWYgc3RhdHVzID09IFBWX0VORF9PRl9CVUYsIHRoaXMgZnJhbWUgd2lsbCBiZSBwcmUtc2tpcHBlZCAqLworfQorCisjaWZuZGVmIE5PX1NMSUNFX0VOQ09ERQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVTbGljZUNvbWJpbmVkTW9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzE5LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhpc3RvcnkgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgYSBzbGljZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gQ29tYmluZWQgbW9kZSBhbmQgc2F2ZSAgKi8KKy8qICAgICAgICAgICAgICB0aGUgY3VycmVudCBNQiB0byBjb250aW51ZSBuZXh0IHRpbWUgaXQgaXMgY2FsbGVkLiAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsIGVsc2UgUFZfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBFbmNvZGVTbGljZUNvbWJpbmVkTW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVUNoYXIgbW9kZSA9IE1PREVfSU5UUkE7CisgICAgVUNoYXIgKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIEludCBuVG90YWxNQiA9IGN1cnJWb2wtPm5Ub3RhbE1COworICAgIEludCB3aWR0aCA9IGN1cnJWb3AtPndpZHRoOyAvKiBoYXMgdG8gYmUgVm9wLCBmb3IgbXVsdGlwbGUgb2YgMTYgKi8KKyAgICBJbnQgbHggPSBjdXJyVm9wLT5waXRjaDsgLyogLCB3aXRoIHBhZGRpbmcgKi8KKy8vICByYXRlQ29udHJvbCAqcmMgPSBlbmNQYXJhbXMtPnJjW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFVDaGFyICpRUE1CID0gdmlkZW8tPlFQTUI7CisgICAgSW50IFFQOworICAgIEludCBpbmRfeCA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeCwgaW5kX3kgPSB2aWRlby0+b3V0cHV0TUItPm1iX3k7CisgICAgSW50IG9mZnNldCA9IHZpZGVvLT5vZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBnZXQgY3VycmVudCBNQiBsb2NhdGlvbiAqLworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bSwgc2xpY2VfY291bnRlciA9IHZpZGVvLT5zbGljZU5vW21ibnVtXTsgLyogZ2V0IGN1cnJlbnQgTUIgbG9jYXRpb24gKi8KKyAgICBJbnQgZmlyc3RNQiA9IG1ibnVtOworICAgIEludCBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICBJbnQgbnVtX2JpdHMgPSAwOworICAgIEludCBwYWNrZXRfc2l6ZSA9IGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSAtIDE7CisgICAgSW50IHJlc3luY19tYXJrZXIgPSAoKCFjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAmJiAoIWN1cnJWb2wtPlJlc3luY01hcmtlckRpc2FibGUpKTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgSW50IGJ5dGVDb3VudCA9IDAsIGJ5dGVDb3VudDEgPSAwLCBiaXRDb3VudCA9IDA7CisgICAgSW50IG51bUhlYWRlckJpdHMgPSAwOworICAgIGFwcHJveERDVCBmYXN0RENUZnVuY3Rpb247CisgICAgSW50IG5jb2VmYmxja1s2XSA9IHs2NCwgNjQsIDY0LCA2NCwgNjQsIDY0fTsgLyogZm9yIEZhc3RDb2RlTUIsICA1LzE4LzIwMDEgKi8KKyAgICBVQ2hhciBDQlAgPSAwOworICAgIFNob3J0IG91dHB1dE1CWzZdWzY0XTsKKyAgICBJbnQgazsKKyAgICBQVl9TVEFUVVMoKkNvZGVNQikoVmlkZW9FbmNEYXRhICosIGFwcHJveERDVCAqLCBJbnQsIEludFtdKTsKKyAgICB2b2lkICgqTUJWbGNFbmNvZGUpKFZpZGVvRW5jRGF0YSosIEludFtdLCB2b2lkICopOworICAgIHZvaWQgKCpCbG9ja0NvZGVDb2VmZikoUnVuTGV2ZWxCbG9jayosIEJpdHN0cmVhbUVuY1ZpZGVvKiwgSW50LCBJbnQsIFVDaGFyKTsKKworICAgIHZpZGVvLT5RUF9wcmV2ID0gMzE7CisKKyNkZWZpbmUgSDI2M19HT0JfQ0hBTkdFUworCisKKyAgICBpZiAodmlkZW8tPmVuZF9vZl9idWYpIC8qIGxlZnQtb3ZlciBmcm9tIHByZXZpb3VzIHJ1biAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX0VORF9PRl9CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIGlmIChtYm51bSA9PSAwKSAvKiBvbmx5IGRvIHRoaXMgYXQgdGhlIHN0YXJ0IG9mIGEgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIFFQTUJbMF0gPSB2aWRlby0+UVBfcHJldiA9IFFQID0gY3VyclZvcC0+cXVhbnRpemVyOworICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKworICAgICAgICBudW1IZWFkZXJCaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgfQorCisgICAgLyogUmUtYXNzaWduIGZhc3QgZnVuY3Rpb25zIG9uIGV2ZXJ5IHNsaWNlLCBkb24ndCBoYXZlIHRvIHB1dCBpdCBpbiB0aGUgbWVtb3J5ICovCisgICAgUVAgPSBRUE1CW21ibnVtXTsKKyAgICBpZiAobWJudW0gPiAwKSAgIHZpZGVvLT5RUF9wcmV2ID0gUVBNQlttYm51bS0xXTsKKworICAgIC8qIGRldGVybWluZSB0eXBlIG9mIHF1YW50aXphdGlvbiAgICovCisjaWZuZGVmIE5PX01QRUdfUVVBTlQKKyAgICBpZiAoY3VyclZvbC0+cXVhbnRUeXBlID09IDApCisgICAgICAgIENvZGVNQiA9ICZDb2RlTUJfSDI2MzsKKyAgICBlbHNlCisgICAgICAgIENvZGVNQiA9ICZDb2RlTUJfTVBFRzsKKyNlbHNlCisgICAgQ29kZU1CID0gJkNvZGVNQl9IMjYzOworI2VuZGlmCisKKyAgICAvKiBkZXRlcm1pbmUgd2hpY2ggZnVuY3Rpb25zIHRvIGJlIHVzZWQsIGluIE1CLWxldmVsICovCisgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QKQorICAgICAgICBNQlZsY0VuY29kZSA9ICZNQlZsY0VuY29kZUNvbWJpbmVkX1BfVk9QOworICAgIGVsc2UgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBNQlZsY0VuY29kZSA9ICZNQlZsY0VuY29kZUNvbWJpbmVkX0lfVk9QOworICAgIGVsc2UgLyogQl9WT1Agbm90IGltcGxlbWVudGVkIHlldCAqLworICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgIC8qIGRldGVybWluZSB3aGljaCBWTEMgdGFibGUgdG8gYmUgdXNlZCAqLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfU2hvcnRIZWFkZXI7CisjaWZuZGVmIE5PX1JWTEMKKyAgICBlbHNlIGlmIChjdXJyVm9sLT51c2VSZXZlcnNlVkxDKQorICAgICAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9SVkxDOworI2VuZGlmCisgICAgZWxzZQorICAgICAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9Ob3JtYWw7CisjZWxzZQorICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1Nob3J0SGVhZGVyOworI2VuZGlmCisKKyAgICAvKiAgKGdvYl9mcmFtZV9pZCBpcyB0aGUgc2FtZSBmb3IgZGlmZmVyZW50IHZvcCB0eXBlcykgVGhlIHJlYXNvbiBzaG91bGQgYmUgU0NEICovCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIgJiYgY3VyclZvcC0+Z29iRnJhbWVJRCAhPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSkKKyAgICAgICAgY3VyclZvcC0+Z29iRnJhbWVJRCA9IGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworCisKKyAgICBpZiAobWJudW0gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmNvZGUgR09CIEhlYWRlciAqLworICAgICAgICAgICAgYml0Q291bnQgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgIGJ5dGVDb3VudDEgPSBieXRlQ291bnQgPSBiaXRDb3VudCA+PiAzOyAvKiBzYXZlIHRoZSBwb3NpdGlvbiBiZWZvcmUgR09CIGhlYWRlciAqLworICAgICAgICAgICAgYml0Q291bnQgPSBiaXRDb3VudCAmIDB4NzsKKworI2lmZGVmIEgyNjNfR09CX0NIQU5HRVMKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUdPQkhlYWRlcih2aWRlbywgc2xpY2VfY291bnRlciwgUVAsIDEpOyAgLy9pbmRfeSAgICAvKiBFbmNvZGUgR09CIEhlYWRlciAqLworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworI2VuZGlmCisgICAgICAgICAgICBnb3RvIEpVTVBfSU5fU0g7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyclZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBKVU1QX0lOX1NIOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDE7CisgICAgICAgICAgICBnb3RvIEpVTVBfSU47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGluZF95ID0gMDsgaW5kX3kgPCBjdXJyVm9sLT5uTUJQZXJDb2w7IGluZF95KyspICAgIC8qIENvbCBNQiBMb29wICovCisgICAgeworCisgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeSA9IGluZF95OyAvKiAgNS8yOC8wMSwgZG8gbm90IHJlbW92ZSAqLworCisgICAgICAgIGZvciAoaW5kX3ggPSAwOyBpbmRfeCA8IGN1cnJWb2wtPm5NQlBlclJvdzsgaW5kX3grKykgIC8qIFJvdyBNQiBMb29wICovCisgICAgICAgIHsKKworICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl94ID0gaW5kX3g7IC8qICA1LzI4LzAxLCBkbyBub3QgcmVtb3ZlICovCisgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7ICAgICAgLyogVXBkYXRlIE1CIHNsaWNlIG51bWJlciAqLworSlVNUF9JTl9TSDoKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgUHJlZGljdGlvbjpQdXQgaW50byBNQyBtYWNyb2Jsb2NrLCBzdWJzdHJhY3QgZnJvbSBjdXJyVm9wLCBwdXQgaW4gcHJlZE1CICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGdldE1vdGlvbkNvbXBlbnNhdGVkTUIodmlkZW8sIGluZF94LCBpbmRfeSwgb2Zmc2V0KTsKKworSlVNUF9JTjoKKyAgICAgICAgICAgIFFQID0gUVBNQlttYm51bV07ICAgLyogYWx3YXlzIHJlYWQgbmV3IFFQICovCisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICAgICAgaWYgKHN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VfY291bnRlcisrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBzbGljZSBjb3VudGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIqLworICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9wcmV2ID0gY3VyclZvcC0+cXVhbnRpemVyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIFFQICovCisgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgbWJudW0sIHZpZGVvLT5RUF9wcmV2LCAxKTsKKyAgICAgICAgICAgICAgICBudW1IZWFkZXJCaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSkgLSBudW1fYml0czsKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gbnVtSGVhZGVyQml0czsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIGRvbid0IGVuY29kZSB0aGUgZmlyc3QgTUIgaW4gcGFja2V0IGFnYWluICovCisjZW5kaWYgLyogSDI2M19PTkxZICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIENvZGVfTUI6ICBEQ1QsIFEsIFFeKC0xKSwgSURDVCwgTW90aW9uIENvbXAgKi8KKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gKCpDb2RlTUIpKHZpZGVvLCAmZmFzdERDVGZ1bmN0aW9uLCAob2Zmc2V0IDw8IDUpICsgUVAsIG5jb2VmYmxjayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBNQiBWTEMgRW5jb2RlOiBWTEMgRW5jb2RlIE1CICAgICAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLyogc2F2ZSB0aGUgc3RhdGUgYmVmb3JlIFZMQyBlbmNvZGluZyAqLworICAgICAgICAgICAgaWYgKHJlc3luY19tYXJrZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYml0Q291bnQgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgICAgICBieXRlQ291bnQgPSBiaXRDb3VudCA+PiAzOyAvKiBzYXZlIHRoZSBzdGF0ZSBiZWZvcmUgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgICAgICBiaXRDb3VudCA9IGJpdENvdW50ICYgMHg3OworICAgICAgICAgICAgICAgIG1vZGUgPSBNb2RlW21ibnVtXTsKKyAgICAgICAgICAgICAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNNFZFTkNfTUVNQ1BZKG91dHB1dE1CW2tdLCB2aWRlby0+b3V0cHV0TUItPmJsb2NrW2tdLCBzaXplb2YoU2hvcnQpIDw8IDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAoKk1CVmxjRW5jb2RlKSh2aWRlbywgbmNvZWZibGNrLCAodm9pZCopQmxvY2tDb2RlQ29lZmYpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIEFzc2VtYmxlIFBhY2tldHM6ICBBc3NlbWJsZSB0aGUgTUIgVkxDIGNvZGVzIGludG8gUGFja2V0cyAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8qIEFzc2VtYmxlX1BhY2tldCh2aWRlbykgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgICAgICAgICBpZiAoIWN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm90IGluIFNob3J0VmlkZW9IZWFkZXIgbW9kZSBhbmQgUkVTWU5DIE1BUktFUiBNT0RFICovCisKKyAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSA7Ly8tIG51bUhlYWRlckJpdHM7IC8vIGluY2x1ZGUgaGVhZGVyCisKKyAgICAgICAgICAgICAgICAgICAgLyogQXNzZW1ibGUgcGFja2V0IGFuZCByZXR1cm4gd2hlbiBzaXplIHJlYWNoZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9iaXRzID4gcGFja2V0X3NpemUgJiYgbWJudW0gIT0gZmlyc3RNQikKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZXBvcyhiczEsIGJ5dGVDb3VudCwgYml0Q291bnQpOyAvKiByZXdpbmQgb25lIE1CICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7IC8qIEJ5dGUgYWxpZ24gUGFja2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgLyogUHV0IFBhY2tldCB0byBCdWZmZXIgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtIDwgblRvdGFsTUIgfHwgdmlkZW8tPmVuZF9vZl9idWYpIC8qIHJldHVybiBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVbbWJudW1dID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gQ0JQOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVOQ19NRU1DUFkodmlkZW8tPm91dHB1dE1CLT5ibG9ja1trXSwgb3V0cHV0TUJba10sIHNpemVvZihTaG9ydCkgPDwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAvKiBOTyBSRVNZTkMgTUFSS0VSICwgcmV0dXJuIHdoZW4gYnVmZmVyIGlzIGZ1bGwqLworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWJudW0gPCBuVG90YWxNQiAtIDEgJiYgY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQgKyBiczEtPmJ5dGVDb3VudCArIDEgPj0gY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIG1heGltdW0gYnl0ZXMgdG8gZml0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSAtIGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50IC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSAtIChieXRlQ291bnQgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZXBvcyhiczEsIGJ5dGVDb3VudCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1GbHVzaEJpdHMoYnMxLCBudW1fYml0cyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgb24gdG8gbmV4dCBNQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWJudW0rKyA7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3grKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+b3V0cHV0TUItPm1iX3ggPj0gY3VyclZvbC0+bk1CUGVyUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl95Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IChseCA8PCA0KSAtIHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLyogSDI2M19PTkxZICovCisgICAgICAgICAgICBvZmZzZXQgKz0gMTY7CisgICAgICAgICAgICBtYm51bSsrOyAvKiBoYXMgdG8gaW5jcmVtZW50IGJlZm9yZSBTQ0QsIHRvIHByZXNlcnZlIE1vZGVbbWJudW1dICovCisKKyAgICAgICAgfSAvKiBFbmQgb2YgRm9yIGluZF94ICovCisKKyAgICAgICAgb2Zmc2V0ICs9IChseCA8PCA0KSAtIHdpZHRoOworCisgICAgICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAgLyogU2hvcnRWaWRlb0hlYWRlciA9IDEgKi8KKyAgICAgICAgeworI2lmZGVmIEgyNjNfR09CX0NIQU5HRVMKKyAgICAgICAgICAgIHNsaWNlX2NvdW50ZXIrKzsKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vdmlkZW8tPmhlYWRlcl9iaXRzKz1CaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRpbWUgdG8gcGFja2V0aXplICovCisgICAgICAgICAgICBpZiAoY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQgKyBiczEtPmJ5dGVDb3VudCA+IGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGJ5dGVDb3VudDEpIC8qIGEgc2luZ2xlIEdPQiBiaWdnZXIgdGhhbiBwYWNrZXQgc2l6ZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9FTkRfT0ZfQlVGOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIGZvciBzaG9ydF9oZWFkZXIgc2Nvb2NoIGJhY2sgdG8gcHJldmlvdXMgR09CICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBudW1fYml0cyA9ICgoYnMxLT5ieXRlQ291bnQgLSBieXRlQ291bnQpIDw8IDMpOworICAgICAgICAgICAgICAgICAgICAvL251bV9iaXRzID0gKChiczEtPmJ5dGVDb3VudDw8MykgKyBiczEtPmJpdENvdW50KSAtICgoYnl0ZUNvdW50PDwzKSArIGJpdENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMxLCBieXRlQ291bnQsIDApOworICAgICAgICAgICAgICAgICAgICAvL0JpdHN0cmVhbVJlcG9zKGJzMSxieXRlQ291bnQsYml0Q291bnQpOworLy8gICAgICAgICAgICAgICAgICBrID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQ7IC8qIHNhdmUgc3RhdGUgYmVmb3JlIGFwcGVuZGluZyAqLworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUZsdXNoQml0cyhiczEsIG51bV9iaXRzKTsKKy8vICAgICAgICAgICAgICAgICAgaWYobWJudW0gPT0gblRvdGFsTUIgfHwgayArIGJzMS0+Ynl0ZUNvdW50ID49IGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSl7CisgICAgICAgICAgICAgICAgICAgIC8qIGxhc3QgR09CIG9yIGN1cnJlbnQgb25lIHdpdGggbGFyZ2VyIHNpemUgd2lsbCBiZSByZXR1cm5lZCBuZXh0IHJ1biAqLworLy8gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRU5EX09GX0JVRjsKKy8vICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKy8vICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtID09IG5Ub3RhbE1CKSAvKiB0aGVyZSdzIG9uZSBtb3JlIEdPQiB0byBwYWNrZXRpemUgZm9yIHRoZSBuZXh0IHJvdW5kICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0VORF9PRl9CVUY7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobWJudW0gPCBuVG90YWxNQikgLyogcmV0dXJuIGhlcmUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgb24gdG8gbmV4dCBNQiAqLworICAgICAgICAgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3ggPSAwOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3krKzsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobWJudW0gPCBuVG90YWxNQikgLyogZG8gbm90IHdyaXRlIEdPQiBoZWFkZXIgaWYgZW5kIG9mIHZvcCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdENvdW50ID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gYml0Q291bnQgPj4gMzsgIC8qIHNhdmUgdGhlIHBvc2l0aW9uIGJlZm9yZSBHT0IgaGVhZGVyICovCisgICAgICAgICAgICAgICAgYml0Q291bnQgPSBiaXRDb3VudCAmIDB4NzsKKyNpZmRlZiBIMjYzX0dPQl9DSEFOR0VTCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzIC09IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUdPQkhlYWRlcih2aWRlbywgc2xpY2VfY291bnRlciwgUVAsIDEpOyAgICAgICAgIC8qIEVuY29kZSBHT0IgSGVhZGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gLyogRW5kIG9mIEZvciBpbmRfeSAqLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICBpZiAoIWN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpIC8qIENvbWJpbmVkIE1vZGUqLworICAgIHsKKyAgICAgICAgaWYgKCFjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKSAvKiBSZXN5bmMgTWFya2VycyAqLworICAgICAgICB7CisKKyAgICAgICAgICAgIGlmICghc3RhcnRfcGFja2V0X2hlYWRlcikKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7LyogQnl0ZSBBbGlnbiAgKi8KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgICAvKiBQdXQgUGFja2V0IHRvIEJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIE5vIFJlc3luYyBNYXJrZXJzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7IC8qIEJ5dGUgQWxpZ24gKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgLyogSW5pdGlhbGl6ZSB0byAwICovCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9CVUYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworICAgIHsKKyAgICAgICAgaWYgKCFzdGFydF9wYWNrZXRfaGVhZGVyKSAvKiBub3QgeWV0IHBhY2tldGl6ZWQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbVNob3J0SGVhZGVyQnl0ZUFsaWduU3R1ZmZpbmcoYnMxKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICBpZiAobWJudW0gPCBuVG90YWxNQikKKyAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKyAgICB2aWRlby0+b2Zmc2V0ID0gb2Zmc2V0OworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlR09CSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8wNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIENvbWJpbmVkIG1vZGUuICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwgZWxzZSBQVl9GQUlMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgRW5jb2RlR09CSGVhZGVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBHT0JfbnVtYmVyLCBJbnQgcXVhbnRfc2NhbGUsIEludCBiczFzdHJlYW0pCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSA9IChiczFzdHJlYW0gPyB2aWRlby0+Yml0c3RyZWFtMSA6IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnN0cmVhbSk7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDE3LCBHT0JfUkVTWU5DX01BUktFUik7IC8qIGdvYl9yZXN5bmNfbWFya2VyICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIEdPQl9udW1iZXIpOyAgICAgICAgICAgLyogQ3VycmVudCBnb2JfbnVtYmVyICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIHZpZGVvLT5jdXJyVm9wLT5nb2JGcmFtZUlEKTsgLyogZ29iX2ZyYW1lX2lkICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIHF1YW50X3NjYWxlKTsgICAgICAgICAgICAgIC8qIHF1YW50X3NjYWxlICovCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kYXRhcGFydF9lbmNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM4ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisKKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAiYml0c3RyZWFtX2lvLmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlRnJhbWVEYXRhUGFydE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS82LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIGRhdGFwYXJ0aXRpb25pbmcgbW9kZS4gICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwgZWxzZSBQVl9GQUlMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZUZyYW1lRGF0YVBhcnRNb2RlKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsgLyogaGFzIHRvIGJlIFZvcCwgZm9yIG11bHRpcGxlIG9mIDE2ICovCisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7IC8qICB3aXRoIHBhZGRpbmcgKi8KKyAgICBJbnQgb2Zmc2V0ID0gMDsKKyAgICBJbnQgaW5kX3gsIGluZF95OworICAgIEludCBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICBVQ2hhciAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIEludCBRUDsKKyAgICBJbnQgbWJudW0gPSAwLCBzbGljZV9jb3VudGVyID0gMDsKKyAgICBJbnQgbnVtX2JpdHMsIHBhY2tldF9zaXplID0gZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMyID0gdmlkZW8tPmJpdHN0cmVhbTI7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMyA9IHZpZGVvLT5iaXRzdHJlYW0zOworICAgIEludCBudW1IZWFkZXJCaXRzOworICAgIGFwcHJveERDVCBmYXN0RENUZnVuY3Rpb247CisgICAgSW50IG5jb2VmYmxja1s2XSA9IHs2NCwgNjQsIDY0LCA2NCwgNjQsIDY0fTsgLyogZm9yIEZhc3RDb2RlTUIsICA1LzE4LzIwMDEgKi8KKyAgICBQVl9TVEFUVVMoKkNvZGVNQikoVmlkZW9FbmNEYXRhICosIGFwcHJveERDVCAqLCBJbnQsIEludFtdKTsKKyAgICB2b2lkICgqTUJWbGNFbmNvZGUpKFZpZGVvRW5jRGF0YSosIEludFtdLCB2b2lkICopOworICAgIHZvaWQgKCpCbG9ja0NvZGVDb2VmZikoUnVuTGV2ZWxCbG9jayosIEJpdHN0cmVhbUVuY1ZpZGVvKiwgSW50LCBJbnQsIFVDaGFyKTsKKworICAgIHZpZGVvLT5RUF9wcmV2ID0gY3VyclZvcC0+cXVhbnRpemVyOworCisgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBOdW1iZXIgb2YgYml0cyBpbiBWT1AgSGVhZGVyICovCisKKyAgICAvKiBkZXRlcm1pbmUgdHlwZSBvZiBxdWFudGl6YXRpb24gICAqLworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSA9PSAwKQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisgICAgZWxzZQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX01QRUc7CisjZWxzZQorICAgIENvZGVNQiA9ICZDb2RlTUJfSDI2MzsKKyNlbmRpZgorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9ucyB0byBiZSB1c2VkLCBpbiBNQi1sZXZlbCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVEYXRhUGFyX1BfVk9QOworICAgIGVsc2UgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBNQlZsY0VuY29kZSA9ICZNQlZsY0VuY29kZURhdGFQYXJfSV9WT1A7CisgICAgZWxzZSAvKiBCX1ZPUCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIFZMQyB0YWJsZSB0byBiZSB1c2VkICovCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1Nob3J0SGVhZGVyOworI2lmbmRlZiBOT19SVkxDCisgICAgZWxzZSBpZiAoY3VyclZvbC0+dXNlUmV2ZXJzZVZMQykKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfUlZMQzsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfTm9ybWFsOworCisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisKKyAgICBmb3IgKGluZF95ID0gMDsgaW5kX3kgPCBjdXJyVm9sLT5uTUJQZXJDb2w7IGluZF95KyspICAgIC8qIENvbCBNQiBMb29wICovCisgICAgeworCisgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeSA9IGluZF95OyAvKiAgNS8yOC8wMSAqLworCisgICAgICAgIGZvciAoaW5kX3ggPSAwOyBpbmRfeCA8IGN1cnJWb2wtPm5NQlBlclJvdzsgaW5kX3grKykgIC8qIFJvdyBNQiBMb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeCA9IGluZF94OyAvKiAgNS8yOC8wMSAqLworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOyAgICAgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIgKi8KKyAgICAgICAgICAgIFFQID0gUVBNQlttYm51bV07ICAgLyogYWx3YXlzIHJlYWQgbmV3IFFQICovCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgUHJlZGljdGlvbjpQdXQgaW50byBNQyBtYWNyb2Jsb2NrLCBzdWJzdHJhY3QgZnJvbSBjdXJyVm9wLCBwdXQgaW4gcHJlZE1CICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgZ2V0TW90aW9uQ29tcGVuc2F0ZWRNQih2aWRlbywgaW5kX3gsIGluZF95LCBvZmZzZXQpOworCisgICAgICAgICAgICBpZiAoc3RhcnRfcGFja2V0X2hlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZV9jb3VudGVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHNsaWNlIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOyAgLyogVXBkYXRlIE1CIHNsaWNlIG51bWJlciovCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzIC09IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9wcmV2ID0gY3VyclZvcC0+cXVhbnRpemVyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIFFQICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlVmlkZW9QYWNrZXRIZWFkZXIodmlkZW8sIG1ibnVtLCB2aWRlby0+UVBfcHJldiwgMCk7CisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIG51bUhlYWRlckJpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogQ29kZV9NQjogIERDVCwgUSwgUV4oLTEpLCBJRENULCBNb3Rpb24gQ29tcCAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBzdGF0dXMgPSAoKkNvZGVNQikodmlkZW8sICZmYXN0RENUZnVuY3Rpb24sIChvZmZzZXQgPDwgNSkgKyBRUCwgbmNvZWZibGNrKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIE1CIFZMQyBFbmNvZGU6IFZMQyBFbmNvZGUgTUIgICAgICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBNQlZsY0VuY29kZSh2aWRlbywgbmNvZWZibGNrLCAodm9pZCopQmxvY2tDb2RlQ29lZmYpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIEFzc2VtYmxlIFBhY2tldHM6ICBBc3NlbWJsZSB0aGUgTUIgVkxDIGNvZGVzIGludG8gUGFja2V0cyAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8qIElOQ0xVREUgVk9QIEhFQURFUiBJTiBDT1VOVCAqLworCisgICAgICAgICAgICBudW1fYml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpICsgQml0c3RyZWFtR2V0UG9zKGJzMikgKworICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1HZXRQb3MoYnMzKSAtIG51bUhlYWRlckJpdHM7CisKKyAgICAgICAgICAgIC8qIEFzc2VtYmxlX1BhY2tldCh2aWRlbykgKi8KKworICAgICAgICAgICAgaWYgKG51bV9iaXRzID4gcGFja2V0X3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxOSwgRENfTUFSS0VSKTsgICAvKiBBZGQgZGNfbWFya2VyICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhiczEsIDE3LCBNT1RJT05fTUFSS0VSX0NPTUIpOyAvKkFkZCBtb3Rpb25fbWFya2VyKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczIpOyAgIC8qIENvbWJpbmUgYnMxIGFuZCBiczIgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczMpOyAgIC8qIENvbWJpbmUgYnMxIGFuZCBiczMgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIGFsaWduIFBhY2tldCAqLworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgLyogUHV0IFBhY2tldCB0byBCdWZmZXIgKi8KKyAgICAgICAgICAgICAgICAvKiBjb250aW51ZSBldmVuIGlmIHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGLCB0byBnZXQgdGhlIHN0YXRzICovCisKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOyAvKiBJbml0aWFsaXplIHRvIDAgKi8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczIpOworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMyk7CisgICAgICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYm51bSsrOworICAgICAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgICAgICB9IC8qIEVuZCBvZiBGb3IgaW5kX3ggKi8KKworICAgICAgICBvZmZzZXQgKz0gKGx4IDw8IDQpIC0gd2lkdGg7CisgICAgfSAvKiBFbmQgb2YgRm9yIGluZF95ICovCisKKyAgICBpZiAoIXN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgeworICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhiczEsIDE5LCBEQ19NQVJLRVIpOyAgIC8qIEFkZCBkY19tYXJrZXIgKi8KKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSAxOTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTcsIE1PVElPTl9NQVJLRVJfQ09NQik7IC8qIEFkZCBtb3Rpb25fbWFya2VyICovCisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gMTc7CisgICAgICAgIH0KKyAgICAgICAgQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMyKTsKKyAgICAgICAgQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMzKTsKKyAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoYnMxKTsgLyogQnl0ZSBhbGlnbiBQYWNrZXQgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgLyogUHV0IFBhY2tldCB0byBCdWZmZXIgKi8KKyAgICAgICAgLyogY29udGludWUgZXZlbiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdG8gZ2V0IHRoZSBzdGF0cyAqLworICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOyAvKiBJbml0aWFsaXplIHRvIDAgKi8KKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMyKTsKKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOyAvKiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdGhpcyBmcmFtZSB3aWxsIGJlIHByZS1za2lwcGVkICovCit9CisKKyNpZm5kZWYgIE5PX1NMSUNFX0VOQ09ERQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVTbGljZURhdGFQYXJ0TW9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzE5LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhpc3RvcnkgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgYSBzbGljZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gRGF0YVBhciBtb2RlIGFuZCBzYXZlICAgKi8KKy8qICAgICAgICAgICAgICB0aGUgY3VycmVudCBNQiB0byBjb250aW51ZSBuZXh0IHRpbWUgaXQgaXMgY2FsbGVkLiAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsIGVsc2UgUFZfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBFbmNvZGVTbGljZURhdGFQYXJ0TW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVUNoYXIgbW9kZSwgKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIEludCBuVG90YWxNQiA9IGN1cnJWb2wtPm5Ub3RhbE1COworICAgIEludCB3aWR0aCA9IGN1cnJWb3AtPndpZHRoOyAvKiBoYXMgdG8gYmUgVm9wLCBmb3IgbXVsdGlwbGUgb2YgMTYgKi8KKyAgICBJbnQgbHggPSBjdXJyVm9wLT5waXRjaDsgLyogLCB3aXRoIHBhZGluZyAqLworICAgIFVDaGFyICpRUE1CID0gdmlkZW8tPlFQTUI7CisgICAgSW50IFFQOworICAgIEludCBpbmRfeCA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeCwgaW5kX3kgPSB2aWRlby0+b3V0cHV0TUItPm1iX3k7CisgICAgSW50IG9mZnNldCA9IHZpZGVvLT5vZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBnZXQgY3VycmVudCBNQiBsb2NhdGlvbiAqLworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bSwgc2xpY2VfY291bnRlciA9IHZpZGVvLT5zbGljZU5vW21ibnVtXTsgLyogZ2V0IGN1cnJlbnQgTUIgbG9jYXRpb24gKi8KKyAgICBJbnQgZmlyc3RNQiA9IG1ibnVtOworICAgIEludCBzdGFydF9wYWNrZXRfaGVhZGVyID0gKG1ibnVtICE9IDApOworICAgIEludCBudW1fYml0cyA9IDA7CisgICAgSW50IHBhY2tldF9zaXplID0gZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplIC0gMSAtIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCA/IDE5IDogMTcpOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMyID0gdmlkZW8tPmJpdHN0cmVhbTI7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMyA9IHZpZGVvLT5iaXRzdHJlYW0zOworICAgIEludCBiaXRDb3VudDEgPSAwLCBiaXRDb3VudDIgPSAwLCBiaXRDb3VudDMgPSAwLCBieXRlQ291bnQxID0gMCwgYnl0ZUNvdW50MiA9IDAsIGJ5dGVDb3VudDMgPSAwOworICAgIEludCBudW1IZWFkZXJCaXRzID0gMDsKKyAgICBhcHByb3hEQ1QgZmFzdERDVGZ1bmN0aW9uOworICAgIEludCBuY29lZmJsY2tbNl0gPSB7NjQsIDY0LCA2NCwgNjQsIDY0LCA2NH07IC8qIGZvciBGYXN0Q29kZU1CLCAgNS8xOC8yMDAxICovCisgICAgVUNoYXIgQ0JQOworICAgIFNob3J0IG91dHB1dE1CWzZdWzY0XTsKKyAgICBQVl9TVEFUVVMoKkNvZGVNQikoVmlkZW9FbmNEYXRhICosIGFwcHJveERDVCAqLCBJbnQsIEludFtdKTsKKyAgICB2b2lkICgqTUJWbGNFbmNvZGUpKFZpZGVvRW5jRGF0YSosIEludFtdLCB2b2lkICopOworICAgIHZvaWQgKCpCbG9ja0NvZGVDb2VmZikoUnVuTGV2ZWxCbG9jayosIEJpdHN0cmVhbUVuY1ZpZGVvKiwgSW50LCBJbnQsIFVDaGFyKTsKKyAgICBJbnQgazsKKworICAgIHZpZGVvLT5RUF9wcmV2ID0gMzE7CisKKyAgICBpZiAodmlkZW8tPmVuZF9vZl9idWYpIC8qIGxlZnQtb3ZlciBmcm9tIHByZXZpb3VzIHJ1biAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX0VORF9PRl9CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAobWJudW0gPT0gMCkgLyogb25seSBkbyB0aGlzIGF0IHRoZSBzdGFydCBvZiBhIGZyYW1lICovCisgICAgeworICAgICAgICBRUE1CWzBdID0gdmlkZW8tPlFQX3ByZXYgPSBRUCA9IGN1cnJWb3AtPnF1YW50aXplcjsKKyAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisKKyAgICAgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBOdW1iZXIgb2YgYml0cyBpbiBWT1AgSGVhZGVyICovCisKKyAgICB9CisKKworICAgIC8qIFJlLWFzc2lnbiBmYXN0IGZ1bmN0aW9ucyBvbiBldmVyeSBzbGljZSwgZG9uJ3QgaGF2ZSB0byBwdXQgaXQgaW4gdGhlIG1lbW9yeSAqLworICAgIFFQID0gUVBNQlttYm51bV07CisgICAgaWYgKG1ibnVtID4gMCkgICB2aWRlby0+UVBfcHJldiA9IFFQTUJbbWJudW0tMV07CisKKyAgICAvKiBkZXRlcm1pbmUgdHlwZSBvZiBxdWFudGl6YXRpb24gICAqLworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSA9PSAwKQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisgICAgZWxzZQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX01QRUc7CisjZWxzZQorICAgIENvZGVNQiA9ICZDb2RlTUJfSDI2MzsKKyNlbmRpZgorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9ucyB0byBiZSB1c2VkLCBpbiBNQi1sZXZlbCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVEYXRhUGFyX1BfVk9QOworICAgIGVsc2UgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBNQlZsY0VuY29kZSA9ICZNQlZsY0VuY29kZURhdGFQYXJfSV9WT1A7CisgICAgZWxzZSAvKiBCX1ZPUCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIFZMQyB0YWJsZSB0byBiZSB1c2VkICovCisjaWZuZGVmIE5PX1JWTEMKKyAgICBpZiAoY3VyclZvbC0+dXNlUmV2ZXJzZVZMQykKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfUlZMQzsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfTm9ybWFsOworCisgICAgaWYgKG1ibnVtICE9IDApCisgICAgeworICAgICAgICBnb3RvIEpVTVBfSU47CisgICAgfQorCisgICAgZm9yIChpbmRfeSA9IDA7IGluZF95IDwgY3VyclZvbC0+bk1CUGVyQ29sOyBpbmRfeSsrKSAgICAvKiBDb2wgTUIgTG9vcCAqLworICAgIHsKKworICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3kgPSBpbmRfeTsgLyogIDUvMjgvMDEgKi8KKworICAgICAgICBmb3IgKGluZF94ID0gMDsgaW5kX3ggPCBjdXJyVm9sLT5uTUJQZXJSb3c7IGluZF94KyspICAvKiBSb3cgTUIgTG9vcCAqLworICAgICAgICB7CisKKyAgICAgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeCA9IGluZF94OyAvKiAgNS8yOC8wMSAqLworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOyAgICAgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIgKi8KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBNQiBQcmVkaWN0aW9uOlB1dCBpbnRvIE1DIG1hY3JvYmxvY2ssIHN1YnN0cmFjdCBmcm9tIGN1cnJWb3AsIHB1dCBpbiBwcmVkTUIgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZ2V0TW90aW9uQ29tcGVuc2F0ZWRNQih2aWRlbywgaW5kX3gsIGluZF95LCBvZmZzZXQpOworCitKVU1QX0lOOgorCisgICAgICAgICAgICBRUCA9IFFQTUJbbWJudW1dOyAgIC8qIGFsd2F5cyByZWFkIG5ldyBRUCAqLworCisgICAgICAgICAgICBpZiAoc3RhcnRfcGFja2V0X2hlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZV9jb3VudGVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHNsaWNlIGNvdW50ZXIgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOyAgLyogVXBkYXRlIE1CIHNsaWNlIG51bWJlciovCisgICAgICAgICAgICAgICAgdmlkZW8tPlFQX3ByZXYgPSBjdXJyVm9wLT5xdWFudGl6ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgUVAgKi8KKyAgICAgICAgICAgICAgICBudW1fYml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVZpZGVvUGFja2V0SGVhZGVyKHZpZGVvLCBtYm51bSwgdmlkZW8tPlFQX3ByZXYsIDApOworICAgICAgICAgICAgICAgIG51bUhlYWRlckJpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSAtIG51bV9iaXRzOworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBudW1IZWFkZXJCaXRzOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgLyogZG9uJ3QgZW5jb2RlIHRoZSBmaXJzdCBNQiBpbiBwYWNrZXQgYWdhaW4gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogQ29kZV9NQjogIERDVCwgUSwgUV4oLTEpLCBJRENULCBNb3Rpb24gQ29tcCAqLworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9ICgqQ29kZU1CKSh2aWRlbywgJmZhc3REQ1RmdW5jdGlvbiwgKG9mZnNldCA8PCA1KSArIFFQLCBuY29lZmJsY2spOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNNFZFTkNfTUVNQ1BZKG91dHB1dE1CW2tdLCB2aWRlby0+b3V0cHV0TUItPmJsb2NrW2tdLCBzaXplb2YoU2hvcnQpIDw8IDYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIE1CIFZMQyBFbmNvZGU6IFZMQyBFbmNvZGUgTUIgICAgICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKiBzYXZlIHRoZSBzdGF0ZSBiZWZvcmUgVkxDIGVuY29kaW5nICovCisgICAgICAgICAgICBiaXRDb3VudDEgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgIGJpdENvdW50MiA9IEJpdHN0cmVhbUdldFBvcyhiczIpOworICAgICAgICAgICAgYml0Q291bnQzID0gQml0c3RyZWFtR2V0UG9zKGJzMyk7CisgICAgICAgICAgICBieXRlQ291bnQxID0gYml0Q291bnQxID4+IDM7CisgICAgICAgICAgICBieXRlQ291bnQyID0gYml0Q291bnQyID4+IDM7CisgICAgICAgICAgICBieXRlQ291bnQzID0gYml0Q291bnQzID4+IDM7CisgICAgICAgICAgICBiaXRDb3VudDEgJj0gMHg3OworICAgICAgICAgICAgYml0Q291bnQyICY9IDB4NzsKKyAgICAgICAgICAgIGJpdENvdW50MyAmPSAweDc7CisgICAgICAgICAgICBtb2RlID0gTW9kZVttYm51bV07CisgICAgICAgICAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgTUJWbGNFbmNvZGUodmlkZW8sIG5jb2VmYmxjaywgKHZvaWQqKUJsb2NrQ29kZUNvZWZmKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBBc3NlbWJsZSBQYWNrZXRzOiAgQXNzZW1ibGUgdGhlIE1CIFZMQyBjb2RlcyBpbnRvIFBhY2tldHMgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBudW1fYml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpICsgQml0c3RyZWFtR2V0UG9zKGJzMikgKworICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1HZXRQb3MoYnMzKTsvLyAtIG51bUhlYWRlckJpdHM7IC8vaW5jbHVkZSBoZWFkZXIgYml0cworCisgICAgICAgICAgICAvKiBBc3NlbWJsZV9QYWNrZXQodmlkZW8pICovCisgICAgICAgICAgICBpZiAobnVtX2JpdHMgPiBwYWNrZXRfc2l6ZSAmJiBtYm51bSAhPSBmaXJzdE1CKSAgLyogZW5jb2RpbmcgYXQgbGVhc3Qgb25lIG1vcmUgTUIqLworICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMxLCBieXRlQ291bnQxLCBiaXRDb3VudDEpOyAvKiByZXdpbmQgb25lIE1CICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMyLCBieXRlQ291bnQyLCBiaXRDb3VudDIpOyAvKiByZXdpbmQgb25lIE1CICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMzLCBieXRlQ291bnQzLCBiaXRDb3VudDMpOyAvKiByZXdpbmQgb25lIE1CICovCisKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxOSwgRENfTUFSS0VSKTsgICAvKiBBZGQgZGNfbWFya2VyICovCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSAxOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxNywgTU9USU9OX01BUktFUl9DT01CKTsgLypBZGQgbW90aW9uX21hcmtlciovCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSAxNzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczIpOyAgLyogQ29tYmluZSB3aXRoIGJzMiAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZEVuYyhiczEsIGJzMyk7ICAvKiBDb21iaW5lIHdpdGggYnMzICovCisKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIGFsaWduIFBhY2tldCAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMik7CisgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMzKTsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikgLyogaWYgY2Fubm90IGZpdCBhIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAxOworCisgICAgICAgICAgICAgICAgaWYgKG1ibnVtIDwgblRvdGFsTUIgfHwgdmlkZW8tPmVuZF9vZl9idWYpIC8qIHJldHVybiBoZXJlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgTW9kZVttYm51bV0gPSBtb2RlOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gQ0JQOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE00VkVOQ19NRU1DUFkodmlkZW8tPm91dHB1dE1CLT5ibG9ja1trXSwgb3V0cHV0TUJba10sIHNpemVvZihTaG9ydCkgPDwgNik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgICAgICAgICAgbWJudW0rKzsgLyogaGFzIHRvIGluY3JlbWVudCBiZWZvcmUgU0NELCB0byBwcmVzZXJ2ZSBNb2RlW21ibnVtXSAqLworICAgICAgICB9IC8qIEVuZCBvZiBGb3IgaW5kX3ggKi8KKworICAgICAgICBvZmZzZXQgKz0gKGx4IDw8IDQpIC0gd2lkdGg7CisKKyAgICB9IC8qIEVuZCBvZiBGb3IgaW5kX3kgKi8KKworICAgIGlmICghc3RhcnRfcGFja2V0X2hlYWRlcikKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTksIERDX01BUktFUik7ICAgLyogQWRkIGRjX21hcmtlciAqLworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IDE5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxNywgTU9USU9OX01BUktFUl9DT01CKTsgLypBZGQgbW90aW9uX21hcmtlciovCisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gMTc7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczIpOyAgLyogQ29tYmluZSB3aXRoIGJzMiAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczMpOyAgLyogQ29tYmluZSB3aXRoIGJzMyAqLworCisgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7IC8qIEJ5dGUgYWxpZ24gUGFja2V0ICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKworICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczIpOworICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczMpOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgIGlmIChtYm51bSA8IG5Ub3RhbE1CKQorICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOworICAgIHZpZGVvLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIE5PX1NMSUNFX0VOQ09ERSAqLworI2VuZGlmIC8qIEgyNjNfT05MWSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNTBlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCkBAIC0wLDAgKzEsMTI4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgImRjdF9pbmxpbmUuaCIKKworI2RlZmluZSBGRENUX1NISUZUIDEwCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrRENUX0FBTndTdWIKKyAgICAgICAgRGF0ZTogICAgICAgNy8zMS8wMQorICAgICAgICBJbnB1dDoKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0WzY0XSA9PT4gbmV4dCBibG9jaworICAgICAgICBQdXJwb3NlOiAgICBEbyBzdWJ0cmFjdGlvbiBmb3IgemVybyBNViBmaXJzdAorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFZvaWQgQmxvY2tEQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODA1M0E7CisgICAgICAgIEludCBhYnNfc3VtOworICAgICAgICBJbnQgbWFzazsKKyAgICAgICAgSW50IHRtcCwgdG1wMjsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFzc3VtaW5nIHRoZSBibG9jayBpcyB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIHRtcCA9ICooKEludCopIGN1cik7ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICB0bXAyID0gKigoSW50KikgcHJlZCk7IC8qIHByZWRpY3Rpb24gNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gdG1wMiAmIDB4RkY7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazAgPSBrMSAtIChrMCA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gKHRtcDIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsxID0gazIgLSAoazEgPDwgMSk7CisgICAgICAgICAgICBrMiA9ICh0bXAyID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGsyID0gazMgLSAoazIgPDwgMSk7CisgICAgICAgICAgICBrMyA9ICh0bXAyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBrNCA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGszID0gazQgLSAoazMgPDwgMSk7CisgICAgICAgICAgICB0bXAgPSAqKChJbnQqKShjdXIgKyA0KSk7ICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgdG1wMiA9ICooKEludCopKHByZWQgKyA0KSk7CisgICAgICAgICAgICBrNCA9IHRtcDIgJiAweEZGOworICAgICAgICAgICAgazUgPSBtYXNrICYgKHRtcCA8PCAxKTsKKyAgICAgICAgICAgIGs0ID0gazUgLSAoazQgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICh0bXAyID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIGs2ID0gbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNSA9IGs2IC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazYgPSAodG1wMiA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgazcgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNiA9IGs3IC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazcgPSAodG1wMiA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wID0gbWFzayAmICh0bXAgPj4gMjMpOworICAgICAgICAgICAgazcgPSB0bXAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgICAgICBwcmVkICs9IDE2OworCisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICBrMSA9IGswIC0gKGsxIDw8IDEpOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBkc3RbMF0gPSBrMDsKKyAgICAgICAgICAgIGRzdFs0XSA9IGsxOyAvKiBjb2wuIDQgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNzI0KGsxMiwgazIsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazIgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgazMgPSAoazMgPDwgMSkgLSBrMjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFsyXSA9IGsyOyAgICAgICAgLyogY29sLiAyICovCisgICAgICAgICAgICBrMyA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLiA2ICovCisgICAgICAgICAgICBkc3RbNl0gPSBrMzsgLyogY29sLiA2ICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs0ID0gazQgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazQ7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNCA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLjUgKi8KKyAgICAgICAgICAgIGs2ID0gazUgLSAoazYgPDwgMSk7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbNV0gPSBrNDsgICAgLyogY29sLiA1ICovCisgICAgICAgICAgICBrNiA8PD0gMjsgICAgICAgLyogc2NhbGUgdXAgY29sLiA3ICovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsgICAgLyogY29sLiAxICovCisgICAgICAgICAgICBkc3RbN10gPSBrNjsgICAgLyogY29sLiA3ICovCisgICAgICAgICAgICBkc3RbM10gPSBrNzsgICAgLyogY29sLiAzICovCisgICAgICAgICAgICBkc3QgKz0gODsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZHN0IDwgb3V0KTsKKworICAgICAgICBvdXQgLT0gNjQ7CisgICAgICAgIGRzdCA9IG91dCArIDg7CisKKyAgICAgICAgLyogIFZlcnRpY2FsIEJsb2NrIExvb3AgICovCisgICAgICAgIGRvICAvKiBWZXJ0aWNhbCA4eERDVCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGswID0gb3V0WzBdOworICAgICAgICAgICAgazEgPSBvdXRbOF07CisgICAgICAgICAgICBrMiA9IG91dFsxNl07CisgICAgICAgICAgICBrMyA9IG91dFsyNF07CisgICAgICAgICAgICBrNCA9IG91dFszMl07CisgICAgICAgICAgICBrNSA9IG91dFs0MF07CisgICAgICAgICAgICBrNiA9IG91dFs0OF07CisgICAgICAgICAgICBrNyA9IG91dFs1Nl07CisgICAgICAgICAgICAvKiBkZWFkem9uZSB0aHJlc2hvbGRpbmcgZm9yIGNvbHVtbiAqLworCisgICAgICAgICAgICBhYnNfc3VtID0gc3VtX2FicyhrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcpOworCisgICAgICAgICAgICBpZiAoYWJzX3N1bSA8IENvbFRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dFswXSA9IDB4N2ZmZjsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgazEgPSBrMCAtIChrMSA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgb3V0WzMyXSA9IGsxOyAvKiByb3cgNCAqLworICAgICAgICAgICAgb3V0WzBdID0gazA7IC8qIHJvdyAwICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIGszID0gKGszIDw8IDEpIC0gazI7CisgICAgICAgICAgICBrMyA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLiA2ICovCisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbNDhdID0gazM7ICAgLyogcm93IDYgKi8KKyAgICAgICAgICAgIG91dFsxNl0gPSBrMjsgICAvKiByb3cgMiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNCA9IGs0ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs0OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazQgPDw9IDE7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNSAqLworICAgICAgICAgICAgazYgPSBrNSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFsyNF0gPSBrNyA7ICAgIC8qIHJvdyAzICovCisgICAgICAgICAgICBrNiA8PD0gMjsgICAgICAgLyogc2NhbGUgdXAgY29sLiA3ICovCisgICAgICAgICAgICBvdXRbNTZdID0gazYgOyAgIC8qIHJvdyA3ICovCisgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgIC8qIHJvdyAxICovCisgICAgICAgICAgICBvdXRbNDBdID0gazQgOyAgIC8qIHJvdyA1ICovCisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrNHg0RENUX0FBTndTdWIKKyAgICAgICAgRGF0ZTogICAgICAgNy8zMS8wMQorICAgICAgICBJbnB1dDoKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0WzY0XSA9PT4gbmV4dCBibG9jaworICAgICAgICBQdXJwb3NlOiAgICBEbyBzdWJ0cmFjdGlvbiBmb3IgemVybyBNViBmaXJzdCBiZWZvcmUgNHg0IERDVAorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFZvaWQgQmxvY2s0eDREQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODA1M0E7CisgICAgICAgIEludCBtYXNrOworICAgICAgICBJbnQgdG1wLCB0bXAyOworICAgICAgICBJbnQgYWJzX3N1bTsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFzc3VtaW5nIHRoZSBibG9jayBpcyB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIHRtcCA9ICooKEludCopIGN1cik7ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICB0bXAyID0gKigoSW50KikgcHJlZCk7IC8qIHByZWRpY3Rpb24gNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gdG1wMiAmIDB4RkY7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazAgPSBrMSAtIChrMCA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gKHRtcDIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsxID0gazIgLSAoazEgPDwgMSk7CisgICAgICAgICAgICBrMiA9ICh0bXAyID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGsyID0gazMgLSAoazIgPDwgMSk7CisgICAgICAgICAgICBrMyA9ICh0bXAyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBrNCA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGszID0gazQgLSAoazMgPDwgMSk7CisgICAgICAgICAgICB0bXAgPSAqKChJbnQqKShjdXIgKyA0KSk7ICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgdG1wMiA9ICooKEludCopKHByZWQgKyA0KSk7CisgICAgICAgICAgICBrNCA9IHRtcDIgJiAweEZGOworICAgICAgICAgICAgazUgPSBtYXNrICYgKHRtcCA8PCAxKTsKKyAgICAgICAgICAgIGs0ID0gazUgLSAoazQgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICh0bXAyID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIGs2ID0gbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNSA9IGs2IC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazYgPSAodG1wMiA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgazcgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNiA9IGs3IC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazcgPSAodG1wMiA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wID0gbWFzayAmICh0bXAgPj4gMjMpOworICAgICAgICAgICAgazcgPSB0bXAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgICAgICBwcmVkICs9IDE2OworCisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIGRzdFswXSA9IGswOworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE3MjQoazEyLCBrMiwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrMiA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMl0gPSBrMjsgICAgICAgIC8qIGNvbC4gMiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNyA9IGs3IC0gazQ7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsgICAgICAgIC8qIGNvbC4gMSAqLworICAgICAgICAgICAgZHN0WzNdID0gazc7ICAgICAgICAvKiBjb2wuIDMgKi8KKyAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkc3QgPCBvdXQpOworCisgICAgICAgIG91dCAtPSA2NDsKKyAgICAgICAgZHN0ID0gb3V0ICsgNDsKKworICAgICAgICAvKiAgVmVydGljYWwgQmxvY2sgTG9vcCAgKi8KKyAgICAgICAgZG8gIC8qIFZlcnRpY2FsIDh4RENUIGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgazAgPSBvdXRbMF07CisgICAgICAgICAgICBrMSA9IG91dFs4XTsKKyAgICAgICAgICAgIGsyID0gb3V0WzE2XTsKKyAgICAgICAgICAgIGszID0gb3V0WzI0XTsKKyAgICAgICAgICAgIGs0ID0gb3V0WzMyXTsKKyAgICAgICAgICAgIGs1ID0gb3V0WzQwXTsKKyAgICAgICAgICAgIGs2ID0gb3V0WzQ4XTsKKyAgICAgICAgICAgIGs3ID0gb3V0WzU2XTsKKworICAgICAgICAgICAgYWJzX3N1bSA9IHN1bV9hYnMoazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3KTsKKworICAgICAgICAgICAgaWYgKGFic19zdW0gPCBDb2xUaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSAweDdmZmY7CisgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIG91dFswXSA9IGswOyAgIC8qIHJvdyAwICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFsxNl0gPSBrMjsgICAgICAgICAgIC8qIHJvdyAyICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs3ID0gazcgLSBrNCA7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbMjRdID0gazcgOyAgICAgIC8qIHJvdyAzICovCisgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrMngyRENUX0FBTndTdWIKKyAgICAgICAgRGF0ZTogICAgICAgNy8zMS8wMQorICAgICAgICBJbnB1dDoKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0WzY0XSA9PT4gbmV4dCBibG9jaworICAgICAgICBQdXJwb3NlOiAgICBEbyBzdWJ0cmFjdGlvbiBmb3IgemVybyBNViBmaXJzdCBiZWZvcmUgMngyIERDVAorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgICAgVm9pZCBCbG9jazJ4MkRDVF9BQU53U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmVkLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBTaG9ydCAqZHN0OworICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgcm91bmQ7CisgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OworICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDNCMjsKKyAgICAgICAgSW50IG1hc2s7CisgICAgICAgIEludCB0bXAsIHRtcDI7CisgICAgICAgIEludCBhYnNfc3VtOworICAgICAgICBJbnQgQ29sVGg7CisKKyAgICAgICAgZHN0ID0gb3V0ICsgNjQgOworICAgICAgICBDb2xUaCA9ICpkc3Q7CisgICAgICAgIG91dCArPSAxMjg7CisgICAgICAgIHJvdW5kID0gMSA8PCAoRkRDVF9TSElGVCAtIDEpOworCisgICAgICAgIGRvICAvKiBmZGN0X25leHRyb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogYXNzdW1pbmcgdGhlIGJsb2NrIGlzIHdvcmQtYWxpZ25lZCAqLworICAgICAgICAgICAgbWFzayA9IDB4MUZFOworICAgICAgICAgICAgdG1wID0gKigoSW50KikgY3VyKTsgICAgLyogY29udGFpbnMgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIHRtcDIgPSAqKChJbnQqKSBwcmVkKTsgLyogcHJlZGljdGlvbiA0IHBpeGVscyAqLworICAgICAgICAgICAgazAgPSB0bXAyICYgMHhGRjsKKyAgICAgICAgICAgIGsxID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrMCA9IGsxIC0gKGswIDw8IDEpOworICAgICAgICAgICAgazEgPSAodG1wMiA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBrMiA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazEgPSBrMiAtIChrMSA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gKHRtcDIgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIGszID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazIgPSBrMyAtIChrMiA8PCAxKTsKKyAgICAgICAgICAgIGszID0gKHRtcDIgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIGs0ID0gbWFzayAmICh0bXAgPj4gMjMpOworICAgICAgICAgICAgazMgPSBrNCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIHRtcCA9ICooKEludCopKGN1ciArIDQpKTsgICAvKiBhbm90aGVyIDQgcGl4ZWxzICovCisgICAgICAgICAgICB0bXAyID0gKigoSW50KikocHJlZCArIDQpKTsKKyAgICAgICAgICAgIGs0ID0gdG1wMiAmIDB4RkY7CisgICAgICAgICAgICBrNSA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazQgPSBrNSAtIChrNCA8PCAxKTsKKyAgICAgICAgICAgIGs1ID0gKHRtcDIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgazYgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGs1ID0gazYgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrNiA9ICh0bXAyID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBrNyA9IG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGs2ID0gazcgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrNyA9ICh0bXAyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBrNyA9IHRtcCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGN1ciArPSB3aWR0aDsKKyAgICAgICAgICAgIHByZWQgKz0gMTY7CisKKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgZHN0WzBdID0gazA7CisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazEgPSBtbGEzOTIoazQsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazEgPSBtbGE5NDYoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsKKyAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkc3QgPCBvdXQpOworICAgICAgICBvdXQgLT0gNjQ7CisgICAgICAgIGRzdCA9IG91dCArIDI7CisgICAgICAgIC8qICBWZXJ0aWNhbCBCbG9jayBMb29wICAqLworICAgICAgICBkbyAgLyogVmVydGljYWwgOHhEQ1QgbG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICBrMCA9IG91dFswXTsKKyAgICAgICAgICAgIGsxID0gb3V0WzhdOworICAgICAgICAgICAgazIgPSBvdXRbMTZdOworICAgICAgICAgICAgazMgPSBvdXRbMjRdOworICAgICAgICAgICAgazQgPSBvdXRbMzJdOworICAgICAgICAgICAgazUgPSBvdXRbNDBdOworICAgICAgICAgICAgazYgPSBvdXRbNDhdOworICAgICAgICAgICAgazcgPSBvdXRbNTZdOworCisgICAgICAgICAgICBhYnNfc3VtID0gc3VtX2FicyhrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcpOworCisgICAgICAgICAgICBpZiAoYWJzX3N1bSA8IENvbFRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dFswXSA9IDB4N2ZmZjsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgb3V0WzBdID0gazA7ICAgICAgICAvKiByb3cgMCAqLworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGs0LCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGsxID0gbWxhOTQ2KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICBGdW5jdGlvbjogICBCbG9ja0RDVF9BQU5JbnRyYQorICAgICAgICBEYXRlOiAgICAgICA4LzkvMDEKKyAgICAgICAgSW5wdXQ6ICAgICAgcmVjCisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgSW5wdXQgZGlyZWN0bHkgZnJvbSByZWMgZnJhbWUuCisgICAgICAgIE1vZGlmaWVkOgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgVm9pZCBCbG9ja0RDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBTaG9ydCAqZHN0OworICAgICAgICBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgcm91bmQ7CisgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OworICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDUzQTsKKyAgICAgICAgSW50IGFic19zdW07CisgICAgICAgIEludCBtYXNrOworICAgICAgICBJbnQgKmN1ckludCwgdG1wOworICAgICAgICBJbnQgQ29sVGg7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15Mik7CisKKyAgICAgICAgZHN0ID0gb3V0ICsgNjQgOworICAgICAgICBDb2xUaCA9ICpkc3Q7CisgICAgICAgIG91dCArPSAxMjg7CisgICAgICAgIHJvdW5kID0gMSA8PCAoRkRDVF9TSElGVCAtIDEpOworCisgICAgICAgIGRvICAvKiBmZGN0X25leHRyb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbWFzayA9IDB4MUZFOworICAgICAgICAgICAgY3VySW50ID0gKEludCopIGN1cjsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFswXTsgICAgLyogY29udGFpbnMgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFsxXTsgICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgazQgPSAgbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGs2ID0gIG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGs3ID0gIG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGN1ciArPSB3aWR0aDsKKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIGsxID0gazAgLSAoazEgPDwgMSk7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIGRzdFswXSA9IGswOworICAgICAgICAgICAgZHN0WzRdID0gazE7IC8qIGNvbC4gNCAqLworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE3MjQoazEyLCBrMiwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrMiA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICBrMyA9IChrMyA8PCAxKSAtIGsyOworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgZHN0WzJdID0gazI7ICAgICAgICAvKiBjb2wuIDIgKi8KKyAgICAgICAgICAgIGszIDw8PSAxOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuIDYgKi8KKyAgICAgICAgICAgIGRzdFs2XSA9IGszOyAvKiBjb2wuIDYgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazAgPSBrNCAtIGs2OworCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrMCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTU1NChrNCwgazEyLCBrMSk7CisgICAgICAgICAgICBrMSA9IG1sYTEzMzgoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNCA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs1OworICAgICAgICAgICAgazQgPSBrNCArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNDsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs0IDw8PSAxOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuNSAqLworICAgICAgICAgICAgazYgPSBrNSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFs1XSA9IGs0OyAgICAvKiBjb2wuIDUgKi8KKyAgICAgICAgICAgIGs2IDw8PSAyOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuIDcgKi8KKyAgICAgICAgICAgIGRzdFsxXSA9IGs1OyAgICAvKiBjb2wuIDEgKi8KKyAgICAgICAgICAgIGRzdFs3XSA9IGs2OyAgICAvKiBjb2wuIDcgKi8KKyAgICAgICAgICAgIGRzdFszXSA9IGs3OyAgICAvKiBjb2wuIDMgKi8KKyAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkc3QgPCBvdXQpOworCisgICAgICAgIG91dCAtPSA2NDsKKyAgICAgICAgZHN0ID0gb3V0ICsgODsKKworICAgICAgICAvKiAgVmVydGljYWwgQmxvY2sgTG9vcCAgKi8KKyAgICAgICAgZG8gIC8qIFZlcnRpY2FsIDh4RENUIGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgazAgPSBvdXRbMF07CisgICAgICAgICAgICBrMSA9IG91dFs4XTsKKyAgICAgICAgICAgIGsyID0gb3V0WzE2XTsKKyAgICAgICAgICAgIGszID0gb3V0WzI0XTsKKyAgICAgICAgICAgIGs0ID0gb3V0WzMyXTsKKyAgICAgICAgICAgIGs1ID0gb3V0WzQwXTsKKyAgICAgICAgICAgIGs2ID0gb3V0WzQ4XTsKKyAgICAgICAgICAgIGs3ID0gb3V0WzU2XTsKKyAgICAgICAgICAgIC8qIGRlYWR6b25lIHRocmVzaG9sZGluZyBmb3IgY29sdW1uICovCisKKyAgICAgICAgICAgIGFic19zdW0gPSBzdW1fYWJzKGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNyk7CisKKyAgICAgICAgICAgIGlmIChhYnNfc3VtIDwgQ29sVGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0WzBdID0gMHg3ZmZmOworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICBrMSA9IGswIC0gKGsxIDw8IDEpOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBvdXRbMzJdID0gazE7IC8qIHJvdyA0ICovCisgICAgICAgICAgICBvdXRbMF0gPSBrMDsgLyogcm93IDAgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNzI0KGsxMiwgazIsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazIgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgazMgPSAoazMgPDwgMSkgLSBrMjsKKyAgICAgICAgICAgIGszIDw8PSAxOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuIDYgKi8KKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFs0OF0gPSBrMzsgICAvKiByb3cgNiAqLworICAgICAgICAgICAgb3V0WzE2XSA9IGsyOyAgIC8qIHJvdyAyICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs0ID0gazQgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazQ7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNCA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLiA1ICovCisgICAgICAgICAgICBrNiA9IGs1IC0gKGs2IDw8IDEpOworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzI0XSA9IGs3IDsgICAgLyogcm93IDMgKi8KKyAgICAgICAgICAgIGs2IDw8PSAyOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuIDcgKi8KKyAgICAgICAgICAgIG91dFs1Nl0gPSBrNiA7ICAgLyogcm93IDcgKi8KKyAgICAgICAgICAgIG91dFs4XSA9IGs1IDsgICAgLyogcm93IDEgKi8KKyAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KKyAgICAgICAgICAgIG91dCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgRnVuY3Rpb246ICAgQmxvY2s0eDREQ1RfQUFOSW50cmEKKyAgICAgICAgRGF0ZTogICAgICAgOC85LzAxCisgICAgICAgIElucHV0OiAgICAgIHByZXYKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0WzY0XSA9PT4gbmV4dCBibG9jaworICAgICAgICBQdXJwb3NlOiAgICBJbnB1dCBkaXJlY3RseSBmcm9tIHByZXYgZnJhbWUuIG91dHB1dCAyeDIgRENUCisgICAgICAgIE1vZGlmaWVkOgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgVm9pZCBCbG9jazR4NERDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBTaG9ydCAqZHN0OworICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgcm91bmQ7CisgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OworICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDUzQTsKKyAgICAgICAgSW50IG1hc2s7CisgICAgICAgIEludCAqY3VySW50LCB0bXA7CisgICAgICAgIEludCBhYnNfc3VtOworICAgICAgICBJbnQgQ29sVGg7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15Mik7CisKKyAgICAgICAgZHN0ID0gb3V0ICsgNjQgOworICAgICAgICBDb2xUaCA9ICpkc3Q7CisgICAgICAgIG91dCArPSAxMjg7CisgICAgICAgIHJvdW5kID0gMSA8PCAoRkRDVF9TSElGVCAtIDEpOworCisgICAgICAgIGRvICAvKiBmZGN0X25leHRyb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbWFzayA9IDB4MUZFOworICAgICAgICAgICAgY3VySW50ID0gKEludCopIGN1cjsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFswXTsgICAgLyogY29udGFpbnMgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFsxXTsgICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgazQgPSAgbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGs2ID0gIG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGs3ID0gIG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGN1ciArPSB3aWR0aDsKKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgZHN0WzBdID0gazA7CisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFsyXSA9IGsyOyAgICAgICAgLyogY29sLiAyICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs3ID0gazcgLSBrNDsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFsxXSA9IGs1OyAgICAgICAgLyogY29sLiAxICovCisgICAgICAgICAgICBkc3RbM10gPSBrNzsgICAgICAgIC8qIGNvbC4gMyAqLworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGRzdCA8IG91dCk7CisKKyAgICAgICAgb3V0IC09IDY0OworICAgICAgICBkc3QgPSBvdXQgKyA0OworCisgICAgICAgIC8qICBWZXJ0aWNhbCBCbG9jayBMb29wICAqLworICAgICAgICBkbyAgLyogVmVydGljYWwgOHhEQ1QgbG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICBrMCA9IG91dFswXTsKKyAgICAgICAgICAgIGsxID0gb3V0WzhdOworICAgICAgICAgICAgazIgPSBvdXRbMTZdOworICAgICAgICAgICAgazMgPSBvdXRbMjRdOworICAgICAgICAgICAgazQgPSBvdXRbMzJdOworICAgICAgICAgICAgazUgPSBvdXRbNDBdOworICAgICAgICAgICAgazYgPSBvdXRbNDhdOworICAgICAgICAgICAgazcgPSBvdXRbNTZdOworCisgICAgICAgICAgICBhYnNfc3VtID0gc3VtX2FicyhrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcpOworCisgICAgICAgICAgICBpZiAoYWJzX3N1bSA8IENvbFRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dFswXSA9IDB4N2ZmZjsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgb3V0WzBdID0gazA7ICAgLyogcm93IDAgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNzI0KGsxMiwgazIsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazIgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzE2XSA9IGsyOyAgICAgICAgICAgLyogcm93IDIgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazAgPSBrNCAtIGs2OworCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrMCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTU1NChrNCwgazEyLCBrMSk7CisgICAgICAgICAgICBrMSA9IG1sYTEzMzgoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNCA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs1OworICAgICAgICAgICAgazcgPSBrNyAtIGs0IDsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFsyNF0gPSBrNyA7ICAgICAgLyogcm93IDMgKi8KKyAgICAgICAgICAgIG91dFs4XSA9IGs1IDsgICAgICAgLyogcm93IDEgKi8KKyAgICAgICAgICAgIG91dCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgRnVuY3Rpb246ICAgQmxvY2syeDJEQ1RfQUFOSW50cmEKKyAgICAgICAgRGF0ZTogICAgICAgOC85LzAxCisgICAgICAgIElucHV0OiAgICAgIHByZXYKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0WzY0XSA9PT4gbmV4dCBibG9jaworICAgICAgICBQdXJwb3NlOiAgICBJbnB1dCBkaXJlY3RseSBmcm9tIHByZXYgZnJhbWUuIG91dHB1dCAyeDIgRENUCisgICAgICAgIE1vZGlmaWVkOgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgVm9pZCBCbG9jazJ4MkRDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBTaG9ydCAqZHN0OworICAgICAgICByZWdpc3RlciBJbnQgazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3OworICAgICAgICBJbnQgcm91bmQ7CisgICAgICAgIEludCBrMTIgPSAweDAyMkEwMkQ0OworICAgICAgICBJbnQgazE0ID0gMHgwMTg4MDNCMjsKKyAgICAgICAgSW50IG1hc2s7CisgICAgICAgIEludCAqY3VySW50LCB0bXA7CisgICAgICAgIEludCBhYnNfc3VtOworICAgICAgICBJbnQgQ29sVGg7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15Mik7CisKKyAgICAgICAgZHN0ID0gb3V0ICsgNjQgOworICAgICAgICBDb2xUaCA9ICpkc3Q7CisgICAgICAgIG91dCArPSAxMjg7CisgICAgICAgIHJvdW5kID0gMSA8PCAoRkRDVF9TSElGVCAtIDEpOworCisgICAgICAgIGRvICAvKiBmZGN0X25leHRyb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbWFzayA9IDB4MUZFOworICAgICAgICAgICAgY3VySW50ID0gKEludCopIGN1cjsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFswXTsgICAgLyogY29udGFpbnMgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIHRtcCA9IGN1ckludFsxXTsgICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgazQgPSAgbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGs2ID0gIG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGs3ID0gIG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGN1ciArPSB3aWR0aDsKKworICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBkc3RbMF0gPSBrMDsKKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrNCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMSA9IG1sYTk0NihrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFsxXSA9IGs1OworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGRzdCA8IG91dCk7CisgICAgICAgIG91dCAtPSA2NDsKKyAgICAgICAgZHN0ID0gb3V0ICsgMjsKKyAgICAgICAgLyogIFZlcnRpY2FsIEJsb2NrIExvb3AgICovCisgICAgICAgIGRvICAvKiBWZXJ0aWNhbCA4eERDVCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGswID0gb3V0WzBdOworICAgICAgICAgICAgazEgPSBvdXRbOF07CisgICAgICAgICAgICBrMiA9IG91dFsxNl07CisgICAgICAgICAgICBrMyA9IG91dFsyNF07CisgICAgICAgICAgICBrNCA9IG91dFszMl07CisgICAgICAgICAgICBrNSA9IG91dFs0MF07CisgICAgICAgICAgICBrNiA9IG91dFs0OF07CisgICAgICAgICAgICBrNyA9IG91dFs1Nl07CisKKyAgICAgICAgICAgIGFic19zdW0gPSBzdW1fYWJzKGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNyk7CisKKyAgICAgICAgICAgIGlmIChhYnNfc3VtIDwgQ29sVGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0WzBdID0gMHg3ZmZmOworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBvdXRbMF0gPSBrMDsgICAgICAgIC8qIHJvdyAwICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazEgPSBtbGEzOTIoazQsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazEgPSBtbGE5NDYoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICBGdW5jdGlvbjogICBCbG9jazF4MURDVHdTdWIKKyAgICAgICAgRGF0ZTogICAgICAgOC85LzAxCisgICAgICAgIElucHV0OiAgICAgIGJsb2NrCisgICAgICAgIE91dHB1dDogICAgIHkKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSBEQyB2YWx1ZSBvbmx5CisgICAgICAgIE1vZGlmaWVkOgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHZvaWQgQmxvY2sxeDFEQ1R3U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmVkLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBVQ2hhciAqZW5kOworICAgICAgICBJbnQgdGVtcCA9IDA7CisgICAgICAgIEludCBvZmZzZXQyOworCisgICAgICAgIG9mZnNldDIgPSB3aWR0aCAtIDg7CisgICAgICAgIGVuZCA9IHByZWQgKyAoMTYgPDwgMyk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgdGVtcCArPSAoKmN1cisrIC0gKnByZWQrKyk7CisgICAgICAgICAgICB0ZW1wICs9ICgqY3VyKysgLSAqcHJlZCsrKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgdGVtcCArPSAoKmN1cisrIC0gKnByZWQrKyk7CisgICAgICAgICAgICB0ZW1wICs9ICgqY3VyKysgLSAqcHJlZCsrKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgdGVtcCArPSAoKmN1cisrIC0gKnByZWQrKyk7CisgICAgICAgICAgICBjdXIgKz0gb2Zmc2V0MjsKKyAgICAgICAgICAgIHByZWQgKz0gODsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocHJlZCA8IGVuZCkgOworCisgICAgICAgIG91dFsxXSA9IG91dFsyXSA9IG91dFszXSA9IG91dFs0XSA9IG91dFs1XSA9IG91dFs2XSA9IG91dFs3XSA9IDA7CisgICAgICAgIG91dFswXSA9IHRlbXAgPj4gMzsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgRnVuY3Rpb246ICAgQmxvY2sxeDFEQ1RJbnRyYQorICAgICAgICBEYXRlOiAgICAgICA4LzkvMDEKKyAgICAgICAgSW5wdXQ6ICAgICAgcHJldgorICAgICAgICBPdXRwdXQ6ICAgICBvdXQKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSBEQyB2YWx1ZSBvbmx5CisgICAgICAgIE1vZGlmaWVkOgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHZvaWQgQmxvY2sxeDFEQ1RJbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkyLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBVQ2hhciAqZW5kOworICAgICAgICBJbnQgdGVtcCA9IDA7CisgICAgICAgIFVMb25nIHdvcmQ7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15Mik7CisKKyAgICAgICAgZW5kID0gY3VyICsgKHdpZHRoIDw8IDMpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICB3b3JkID0gKigoVUxvbmcqKWN1cik7CisgICAgICAgICAgICB0ZW1wICs9ICh3b3JkID4+IDI0KTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCh3b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICAgICAgdGVtcCArPSAoKHdvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKHdvcmQgJiAweEZGKTsKKworICAgICAgICAgICAgd29yZCA9ICooKFVMb25nKikoY3VyICsgNCkpOworICAgICAgICAgICAgdGVtcCArPSAod29yZCA+PiAyNCk7CisgICAgICAgICAgICB0ZW1wICs9ICgod29yZCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCh3b3JkID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICB0ZW1wICs9ICh3b3JkICYgMHhGRik7CisKKyAgICAgICAgICAgIGN1ciArPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY3VyIDwgZW5kKSA7CisKKyAgICAgICAgb3V0WzFdID0gb3V0WzJdID0gb3V0WzNdID0gb3V0WzRdID0gb3V0WzVdID0gb3V0WzZdID0gb3V0WzddID0gMDsKKyAgICAgICAgb3V0WzBdID0gdGVtcCA+PiAzOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkY2ViNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaApAQCAtMCwwICsxLDE5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX0RDVF9IXworI2RlZmluZSBfRENUX0hfCisKK2NvbnN0IHN0YXRpYyBJbnQgQ29sVGhJbnRlclszMl0gPSB7MCwgMHgxQywgMHg0QywgMHg2QywgMHg5QywgMHhCQywgMHhFQywgMHgxMEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTNDLCAweDE1QywgMHgxOEMsIDB4MUFDLCAweDFEQywgMHgxRkMsIDB4MjJDLCAweDI0QywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyN0MsIDB4MjlDLCAweDJDQywgMHgyRUMsIDB4MzFDLCAweDMzQywgMHgzNkMsIDB4MzhDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNCQywgMHgzREMsIDB4NDBDLCAweDQyQywgMHg0NUMsIDB4NDdDLCAweDRBQywgMHg0Q0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCitjb25zdCBzdGF0aWMgSW50IENvbFRoSW50cmFbMzJdID0gezAsIDB4MUMsIDB4M0MsIDB4NUMsIDB4N0MsIDB4OUMsIDB4QkMsIDB4REMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkMsIDB4MTFDLCAweDEzQywgMHgxNUMsIDB4MTdDLCAweDE5QywgMHgxQkMsIDB4MURDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGQywgMHgyMUMsIDB4MjNDLCAweDI1QywgMHgyN0MsIDB4MjlDLCAweDJCQywgMHgyREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkZDLCAweDMxQywgMHgzM0MsIDB4MzVDLCAweDM3QywgMHgzOUMsIDB4M0JDLCAweDNEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiBJRENUIHBhcnQgKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciBpbWFza1s4XSA9IHsxMjgsIDY0LCAzMiwgMTYsIDgsIDQsIDIsIDF9OworY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFza1s4XSA9IHsweDdmLCAweGJmLCAweGRmLCAweGVmLCAweGY3LCAweGZiLCAweGZkLCAweGZlfTsKKworI2RlZmluZSBXMSAyODQxICAgICAgICAgICAgICAgICAvKiAyMDQ4KnNxcnQoMikqY29zKDEqcGkvMTYpICovCisjZGVmaW5lIFcyIDI2NzYgICAgICAgICAgICAgICAgIC8qIDIwNDgqc3FydCgyKSpjb3MoMipwaS8xNikgKi8KKyNkZWZpbmUgVzMgMjQwOCAgICAgICAgICAgICAgICAgLyogMjA0OCpzcXJ0KDIpKmNvcygzKnBpLzE2KSAqLworI2RlZmluZSBXNSAxNjA5ICAgICAgICAgICAgICAgICAvKiAyMDQ4KnNxcnQoMikqY29zKDUqcGkvMTYpICovCisjZGVmaW5lIFc2IDExMDggICAgICAgICAgICAgICAgIC8qIDIwNDgqc3FydCgyKSpjb3MoNipwaS8xNikgKi8KKyNkZWZpbmUgVzcgNTY1ICAgICAgICAgICAgICAgICAgLyogMjA0OCpzcXJ0KDIpKmNvcyg3KnBpLzE2KSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgLyogUmVkdWNlZCBpbnB1dCBJRENUICovCisgICAgdm9pZCBpZGN0X2NvbDAoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDEoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDIoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDMoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDQoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDB4NDAoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDB4MjAoU2hvcnQgKmJsayk7CisgICAgdm9pZCBpZGN0X2NvbDB4MTAoU2hvcnQgKmJsayk7CisKKyAgICB2b2lkIGlkY3Rfcm93SW50ZXIoU2hvcnQgKnNyY2UsIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzBJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cxSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MkludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzNJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3c0SW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHg0MEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4MjBJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDEwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHhDQ0ludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3Jvd0ludHJhKFNob3J0ICpzcmNlLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cwSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MUludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzJJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3czSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93NEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4NDBJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDIwSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHgxMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4Q0NJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3d6bXYoU2hvcnQgKnNyY2UsIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cxem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cyem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3czem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3c0em12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDQwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDIwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDEwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweENDem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIExvb2stdXAgdGFibGUgbWFwcGluZyB0byBSSURDVCBmcm9tIGJpdG1hcCAqLworI2lmZGVmIFNNQUxMX0RDVAorCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Rjb2xWQ0FbMTZdKShTaG9ydCopID0KK3sKKyAgICAmaWRjdF9jb2wwLCAmaWRjdF9jb2w0LCAmaWRjdF9jb2wzLCAmaWRjdF9jb2w0LAorICAgICZpZGN0X2NvbDIsICZpZGN0X2NvbDQsICZpZGN0X2NvbDMsICZpZGN0X2NvbDQsCisgICAgJmlkY3RfY29sMSwgJmlkY3RfY29sNCwgJmlkY3RfY29sMywgJmlkY3RfY29sNCwKKyAgICAmaWRjdF9jb2wyLCAmaWRjdF9jb2w0LCAmaWRjdF9jb2wzLCAmaWRjdF9jb2w0Cit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0FJbnRlclsxNl0pKFNob3J0KiwgVUNoYXIqLCBJbnQpID0KK3sKKyAgICAmaWRjdF9yb3cwSW50ZXIsICZpZGN0X3JvdzRJbnRlciwgJmlkY3Rfcm93M0ludGVyLCAmaWRjdF9yb3c0SW50ZXIsCisgICAgJmlkY3Rfcm93MkludGVyLCAmaWRjdF9yb3c0SW50ZXIsICZpZGN0X3JvdzNJbnRlciwgJmlkY3Rfcm93NEludGVyLAorICAgICZpZGN0X3JvdzFJbnRlciwgJmlkY3Rfcm93NEludGVyLCAmaWRjdF9yb3czSW50ZXIsICZpZGN0X3JvdzRJbnRlciwKKyAgICAmaWRjdF9yb3cySW50ZXIsICZpZGN0X3JvdzRJbnRlciwgJmlkY3Rfcm93M0ludGVyLCAmaWRjdF9yb3c0SW50ZXIKK307CisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQXptdlsxNl0pKFNob3J0KiwgVUNoYXIqLCBVQ2hhciosIEludCkgPQoreworICAgICZpZGN0X3JvdzB6bXYsICZpZGN0X3JvdzR6bXYsICZpZGN0X3JvdzN6bXYsICZpZGN0X3JvdzR6bXYsCisgICAgJmlkY3Rfcm93MnptdiwgJmlkY3Rfcm93NHptdiwgJmlkY3Rfcm93M3ptdiwgJmlkY3Rfcm93NHptdiwKKyAgICAmaWRjdF9yb3cxem12LCAmaWRjdF9yb3c0em12LCAmaWRjdF9yb3czem12LCAmaWRjdF9yb3c0em12LAorICAgICZpZGN0X3JvdzJ6bXYsICZpZGN0X3JvdzR6bXYsICZpZGN0X3JvdzN6bXYsICZpZGN0X3JvdzR6bXYKK307CisKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBSW50cmFbMTZdKShTaG9ydCosIFVDaGFyKiwgSW50KSA9Cit7CisgICAgJmlkY3Rfcm93MEludHJhLCAmaWRjdF9yb3c0SW50cmEsICZpZGN0X3JvdzNJbnRyYSwgJmlkY3Rfcm93NEludHJhLAorICAgICZpZGN0X3JvdzJJbnRyYSwgJmlkY3Rfcm93NEludHJhLCAmaWRjdF9yb3czSW50cmEsICZpZGN0X3JvdzRJbnRyYSwKKyAgICAmaWRjdF9yb3cxSW50cmEsICZpZGN0X3JvdzRJbnRyYSwgJmlkY3Rfcm93M0ludHJhLCAmaWRjdF9yb3c0SW50cmEsCisgICAgJmlkY3Rfcm93MkludHJhLCAmaWRjdF9yb3c0SW50cmEsICZpZGN0X3JvdzNJbnRyYSwgJmlkY3Rfcm93NEludHJhCit9OworCisjZWxzZSAvKiBTTUFMTF9EQ1QgKi8KKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0Y29sVkNBWzE2XSkoU2hvcnQqKSA9Cit7CisgICAgJmlkY3RfY29sMCwgJmlkY3RfY29sMHgxMCwgJmlkY3RfY29sMHgyMCwgJmlkY3RfY29sNCwKKyAgICAmaWRjdF9jb2wweDQwLCAmaWRjdF9jb2w0LCAmaWRjdF9jb2wzLCAmaWRjdF9jb2w0LAorICAgICZpZGN0X2NvbDEsICZpZGN0X2NvbDQsICZpZGN0X2NvbDMsICZpZGN0X2NvbDQsCisgICAgJmlkY3RfY29sMiwgJmlkY3RfY29sNCwgJmlkY3RfY29sMywgJmlkY3RfY29sNAorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBSW50ZXJbMTZdKShTaG9ydCosIFVDaGFyKiwgSW50KSA9Cit7CisgICAgJmlkY3Rfcm93MEludGVyLCAmaWRjdF9yb3cweDEwSW50ZXIsICZpZGN0X3JvdzB4MjBJbnRlciwgJmlkY3Rfcm93NEludGVyLAorICAgICZpZGN0X3JvdzB4NDBJbnRlciwgJmlkY3Rfcm93NEludGVyLCAmaWRjdF9yb3czSW50ZXIsICZpZGN0X3JvdzRJbnRlciwKKyAgICAmaWRjdF9yb3cxSW50ZXIsICZpZGN0X3JvdzRJbnRlciwgJmlkY3Rfcm93M0ludGVyLCAmaWRjdF9yb3c0SW50ZXIsCisgICAgJmlkY3Rfcm93MkludGVyLCAmaWRjdF9yb3c0SW50ZXIsICZpZGN0X3JvdzNJbnRlciwgJmlkY3Rfcm93NEludGVyCit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0F6bXZbMTZdKShTaG9ydCosIFVDaGFyKiwgVUNoYXIqLCBJbnQpID0KK3sKKyAgICAmaWRjdF9yb3cwem12LCAmaWRjdF9yb3cweDEwem12LCAmaWRjdF9yb3cweDIwem12LCAmaWRjdF9yb3c0em12LAorICAgICZpZGN0X3JvdzB4NDB6bXYsICZpZGN0X3JvdzR6bXYsICZpZGN0X3JvdzN6bXYsICZpZGN0X3JvdzR6bXYsCisgICAgJmlkY3Rfcm93MXptdiwgJmlkY3Rfcm93NHptdiwgJmlkY3Rfcm93M3ptdiwgJmlkY3Rfcm93NHptdiwKKyAgICAmaWRjdF9yb3cyem12LCAmaWRjdF9yb3c0em12LCAmaWRjdF9yb3czem12LCAmaWRjdF9yb3c0em12Cit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0FJbnRyYVsxNl0pKFNob3J0KiwgVUNoYXIqLCBJbnQpID0KK3sKKyAgICAmaWRjdF9yb3cwSW50cmEsICZpZGN0X3JvdzB4MTBJbnRyYSwgJmlkY3Rfcm93MHgyMEludHJhLCAmaWRjdF9yb3c0SW50cmEsCisgICAgJmlkY3Rfcm93MHg0MEludHJhLCAmaWRjdF9yb3c0SW50cmEsICZpZGN0X3JvdzNJbnRyYSwgJmlkY3Rfcm93NEludHJhLAorICAgICZpZGN0X3JvdzFJbnRyYSwgJmlkY3Rfcm93NEludHJhLCAmaWRjdF9yb3czSW50cmEsICZpZGN0X3JvdzRJbnRyYSwKKyAgICAmaWRjdF9yb3cySW50cmEsICZpZGN0X3JvdzRJbnRyYSwgJmlkY3Rfcm93M0ludHJhLCAmaWRjdF9yb3c0SW50cmEKK307CisKKyNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICAvKiBwYXJ0IGluIEFwcFZDQV9kY3QuYyAqLworLy92b2lkIEJsb2NrMXgxRENUem12IChTaG9ydCAqb3V0LFVDaGFyICpwcmV2LFVDaGFyICpjdXIsVUNoYXIgKnJlYyxJbnQgbHgsSW50IGNocm9tYSk7CisgICAgdm9pZCBCbG9jazF4MURDVHdTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZXYsIEludCBwaXRjaF9jaHJvbWEpOworICAgIHZvaWQgQmxvY2sxeDFEQ1RJbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkxLCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICAvKiBUaGlzIHBhcnQgaXMgaW4gZGN0X2Fhbi5jICovCisgICAgVm9pZCBCbG9ja0RDVF9BQU53U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmV2LCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICBWb2lkIEJsb2NrNHg0RENUX0FBTndTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZXYsIEludCBwaXRjaF9jaHJvbWEpOworICAgIFZvaWQgQmxvY2syeDJEQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJldiwgSW50IHBpdGNoX2Nocm9tYSk7CisvL1ZvaWQgQmxvY2tEQ1RfQUFOem12KFNob3J0ICpvdXQsVUNoYXIgKnByZXYsVUNoYXIgKmN1cixVQ2hhciAqcmVjLEludCBDb2xUaCxJbnQgbHgsSW50IGNocm9tYSk7CisvL1ZvaWQgQmxvY2s0eDREQ1RfQUFOem12KFNob3J0ICpvdXQsVUNoYXIgKnByZXYsVUNoYXIgKmN1cixVQ2hhciAqcmVjLEludCBDb2xUaCxJbnQgbHgsSW50IGNocm9tYSk7CisvL1ZvaWQgQmxvY2syeDJEQ1RfQUFOem12KFNob3J0ICpvdXQsVUNoYXIgKnByZXYsVUNoYXIgKmN1cixVQ2hhciAqcmVjLEludCBDb2xUaCxJbnQgbHgsSW50IGNocm9tYSk7CisgICAgVm9pZCBCbG9ja0RDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkxLCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICBWb2lkIEJsb2NrNHg0RENUX0FBTkludHJhKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpkdW1teTEsIEludCBwaXRjaF9jaHJvbWEpOworICAgIFZvaWQgQmxvY2syeDJEQ1RfQUFOSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MSwgSW50IHBpdGNoX2Nocm9tYSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvL19EQ1RfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk1YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oCkBAIC0wLDAgKzEsMzk1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogIEZpbGVuYW1lOiBkY3RfaW5saW5lLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBmb3IgaW4tbGluZSBmdW5jdGlvbnMgdXNlZCBpbiBkY3QuY3BwICAgICAgICAgICAqLworLyogIE1vZGlmaWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0RDVF9JTkxJTkVfSF8KKyNkZWZpbmUgX0RDVF9JTkxJTkVfSF8KKworI2lmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICYmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpCisKK19faW5saW5lIGludDMyIG1sYTcyNChpbnQzMiBvcDEsIGludDMyIG9wMiwgaW50MzIgb3AzKQoreworICAgIGludDMyIG91dDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhvcDEpOworCisgICAgb3V0ID0gb3AyICogNzI0ICsgb3AzOyAvKiBvcDEgaXMgbm90IHVzZWQgaGVyZSAqLworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhMzkyKGludDMyIGswLCBpbnQzMiBrMTQsIGludDMyIHJvdW5kKQoreworICAgIGludDMyIGsxOworCisgICAgT1NDTF9VTlVTRURfQVJHKGsxNCk7CisKKyAgICBrMSA9IGswICogMzkyICsgcm91bmQ7CisKKyAgICByZXR1cm4gazE7Cit9CisKK19faW5saW5lIGludDMyIG1sYTU1NChpbnQzMiBrNCwgaW50MzIgazEyLCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBrMDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhrMTIpOworCisgICAgazAgPSBrNCAqIDU1NCArIGsxOworCisgICAgcmV0dXJuIGswOworfQorCitfX2lubGluZSBpbnQzMiBtbGExMzM4KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIGludDMyIG91dDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhrMTQpOworCisgICAgb3V0ID0gazYgKiAxMzM4ICsgazE7CisKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBtbGE5NDYoaW50MzIgazYsIGludDMyIGsxNCwgaW50MzIgazEpCit7CisgICAgaW50MzIgb3V0OworCisgICAgT1NDTF9VTlVTRURfQVJHKGsxNCk7CisKKyAgICBvdXQgPSBrNiAqIDk0NiArIGsxOworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgc3VtX2FicyhpbnQzMiBrMCwgaW50MzIgazEsIGludDMyIGsyLCBpbnQzMiBrMywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgazQsIGludDMyIGs1LCBpbnQzMiBrNiwgaW50MzIgazcpCit7CisgICAgaW50MzIgY2FycnksIGFic19zdW07CisKKyAgICBjYXJyeSA9IGswID4+IDMxOworICAgIGFic19zdW0gPSAoazAgXiBjYXJyeSk7CisgICAgY2FycnkgPSBrMSA+PiAzMTsKKyAgICBhYnNfc3VtICs9IChrMSBeIGNhcnJ5KSAtIGNhcnJ5OworICAgIGNhcnJ5ID0gazIgPj4gMzE7CisgICAgYWJzX3N1bSArPSAoazIgXiBjYXJyeSkgLSBjYXJyeTsKKyAgICBjYXJyeSA9IGszID4+IDMxOworICAgIGFic19zdW0gKz0gKGszIF4gY2FycnkpIC0gY2Fycnk7CisgICAgY2FycnkgPSBrNCA+PiAzMTsKKyAgICBhYnNfc3VtICs9IChrNCBeIGNhcnJ5KSAtIGNhcnJ5OworICAgIGNhcnJ5ID0gazUgPj4gMzE7CisgICAgYWJzX3N1bSArPSAoazUgXiBjYXJyeSkgLSBjYXJyeTsKKyAgICBjYXJyeSA9IGs2ID4+IDMxOworICAgIGFic19zdW0gKz0gKGs2IF4gY2FycnkpIC0gY2Fycnk7CisgICAgY2FycnkgPSBrNyA+PiAzMTsKKyAgICBhYnNfc3VtICs9IChrNyBeIGNhcnJ5KSAtIGNhcnJ5OworCisgICAgcmV0dXJuIGFic19zdW07Cit9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF81VEUpCisKK19faW5saW5lIGludDMyIG1sYTcyNChpbnQzMiBvcDEsIGludDMyIG9wMiwgaW50MzIgb3AzKQoreworICAgIGludDMyIG91dDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYmIgb3V0LCBvcDEsIG9wMiwgb3AzCisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhMzkyKGludDMyIGswLCBpbnQzMiBrMTQsIGludDMyIHJvdW5kKQoreworICAgIGludDMyIGsxOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtbGFidCBrMSwgazAsIGsxNCwgcm91bmQKKyAgICB9CisKKyAgICByZXR1cm4gazE7Cit9CisKK19faW5saW5lIGludDMyIG1sYTU1NChpbnQzMiBrNCwgaW50MzIgazEyLCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBrMDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYnQgazAsIGs0LCBrMTIsIGsxCisgICAgfQorCisgICAgcmV0dXJuIGswOworfQorCitfX2lubGluZSBpbnQzMiBtbGExMzM4KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIGludDMyIG91dDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYmIgb3V0LCBrNiwgazE0LCBrMQorICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTk0NihpbnQzMiBrNiwgaW50MzIgazE0LCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgc21sYWJiIG91dCwgazYsIGsxNCwgazEKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCisjZWxzZSAvLyBub3QgQVJNNVRFCisKKworX19pbmxpbmUgaW50MzIgbWxhNzI0KGludDMyIG9wMSwgaW50MzIgb3AyLCBpbnQzMiBvcDMpCit7CisgICAgaW50MzIgb3V0OworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGFuZCBvdXQsIG9wMiwgIzB4RkZGRgorICAgICAgICBtbGEgb3V0LCBvcDEsIG91dCwgb3AzCisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhMzkyKGludDMyIGswLCBpbnQzMiBrMTQsIGludDMyIHJvdW5kKQoreworICAgIGludDMyIGsxOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdiBrMSwgazE0LCBhc3IgIzE2CisgICAgICAgIG1sYSBrMSwgazAsIGsxLCByb3VuZAorICAgIH0KKworICAgIHJldHVybiBrMTsKK30KKworX19pbmxpbmUgaW50MzIgbWxhNTU0KGludDMyIGs0LCBpbnQzMiBrMTIsIGludDMyIGsxKQoreworICAgIGludDMyIGswOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdiAgazAsIGsxMiwgYXNyICMxNgorICAgICAgICBtbGEgazAsIGs0LCBrMCwgazEKKyAgICB9CisKKyAgICByZXR1cm4gazA7Cit9CisKK19faW5saW5lIGludDMyIG1sYTEzMzgoaW50MzIgazYsIGludDMyIGsxNCwgaW50MzIgazEpCit7CisgICAgaW50MzIgb3V0OworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGFuZCBvdXQsIGsxNCwgMHhGRkZGCisgICAgICAgIG1sYSBvdXQsIGs2LCBvdXQsIGsxCisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhOTQ2KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIGludDMyIG91dDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBhbmQgb3V0LCBrMTQsIDB4RkZGRgorICAgICAgICBtbGEgb3V0LCBrNiwgb3V0LCBrMQorICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKKyNlbmRpZgorCitfX2lubGluZSBpbnQzMiBzdW1fYWJzKGludDMyIGswLCBpbnQzMiBrMSwgaW50MzIgazIsIGludDMyIGszLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiBrNCwgaW50MzIgazUsIGludDMyIGs2LCBpbnQzMiBrNykKK3sKKyAgICBpbnQzMiBjYXJyeSwgYWJzX3N1bTsKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgZW9yICAgICBjYXJyeSwgazAsIGswLCBhc3IgIzMxIDsKKyAgICAgICAgZW9ycyAgICBhYnNfc3VtLCBrMSwgazEsIGFzciAjMzEgOworICAgICAgICBhZGMgICAgIGFic19zdW0sIGFic19zdW0sIGNhcnJ5IDsKKyAgICAgICAgZW9ycyAgICBjYXJyeSwgIGsyLCBrMiwgYXNyICMzMSA7CisgICAgICAgIGFkYyAgICAgYWJzX3N1bSwgYWJzX3N1bSwgY2FycnkgOworICAgICAgICBlb3JzICAgIGNhcnJ5LCAgazMsIGszLCBhc3IgIzMxIDsKKyAgICAgICAgYWRjICAgICBhYnNfc3VtLCBhYnNfc3VtLCBjYXJyeSA7CisgICAgICAgIGVvcnMgICAgY2FycnksICBrNCwgazQsIGFzciAjMzEgOworICAgICAgICBhZGMgICAgIGFic19zdW0sIGFic19zdW0sIGNhcnJ5IDsKKyAgICAgICAgZW9ycyAgICBjYXJyeSwgIGs1LCBrNSwgYXNyICMzMSA7CisgICAgICAgIGFkYyAgICAgYWJzX3N1bSwgYWJzX3N1bSwgY2FycnkgOworICAgICAgICBlb3JzICAgIGNhcnJ5LCAgazYsIGs2LCBhc3IgIzMxIDsKKyAgICAgICAgYWRjICAgICBhYnNfc3VtLCBhYnNfc3VtLCBjYXJyeSA7CisgICAgICAgIGVvcnMgICAgY2FycnksICBrNywgazcsIGFzciAjMzEgOworICAgICAgICBhZGMgICAgIGFic19zdW0sIGFic19zdW0sIGNhcnJ5IDsKKyAgICB9CisKKyAgICByZXR1cm4gYWJzX3N1bTsKK30KKworI2VsaWYgKCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNCkgKSAgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworX19pbmxpbmUgaW50MzIgbWxhNzI0KGludDMyIG9wMSwgaW50MzIgb3AyLCBpbnQzMiBvcDMpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKW9wMTsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMilvcDI7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpb3AzOworCisgICAgYXNtIHZvbGF0aWxlKCJzbWxhYmIgJTAsICUxLCAlMiwgJTMiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihiYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGNjKSk7CisgICAgcmV0dXJuIG91dDsKK30KKworCitfX2lubGluZSBpbnQzMiBtbGEzOTIoaW50MzIgazAsIGludDMyIGsxNCwgaW50MzIgcm91bmQpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKWswOworICAgIHJlZ2lzdGVyIGludDMyIGJiID0gKGludDMyKWsxNDsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IChpbnQzMilyb3VuZDsKKworICAgIGFzbSB2b2xhdGlsZSgic21sYWJ0ICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjYykpOworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhNTU0KGludDMyIGs0LCBpbnQzMiBrMTIsIGludDMyIGsxKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IChpbnQzMilrNDsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMilrMTI7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpazE7CisKKyAgICBhc20gdm9sYXRpbGUoInNtbGFidCAlMCwgJTEsICUyLCAlMyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihhYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2MpKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTEzMzgoaW50MzIgazYsIGludDMyIGsxNCwgaW50MzIgazEpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKWs2OworICAgIHJlZ2lzdGVyIGludDMyIGJiID0gKGludDMyKWsxNDsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IChpbnQzMilrMTsKKworICAgIGFzbSB2b2xhdGlsZSgic21sYWJiICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjYykpOworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTk0NihpbnQzMiBrNiwgaW50MzIgazE0LCBpbnQzMiBrMSkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSAoaW50MzIpazY7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpazE0OworICAgIHJlZ2lzdGVyIGludDMyIGNjID0gKGludDMyKWsxOworCisgICAgYXNtIHZvbGF0aWxlKCJzbWxhYmIgJTAsICUxLCAlMiwgJTMiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihiYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGNjKSk7CisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgc3VtX2FicyhpbnQzMiBrMCwgaW50MzIgazEsIGludDMyIGsyLCBpbnQzMiBrMywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgazQsIGludDMyIGs1LCBpbnQzMiBrNiwgaW50MzIgazcpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgY2Fycnk7CisgICAgcmVnaXN0ZXIgaW50MzIgYWJzX3N1bTsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IChpbnQzMilrMDsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMilrMTsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IChpbnQzMilrMjsKKyAgICByZWdpc3RlciBpbnQzMiBkZCA9IChpbnQzMilrMzsKKyAgICByZWdpc3RlciBpbnQzMiBlZSA9IChpbnQzMilrNDsKKyAgICByZWdpc3RlciBpbnQzMiBmZiA9IChpbnQzMilrNTsKKyAgICByZWdpc3RlciBpbnQzMiBnZyA9IChpbnQzMilrNjsKKyAgICByZWdpc3RlciBpbnQzMiBoaCA9IChpbnQzMilrNzsKKworICAgIGFzbSB2b2xhdGlsZSgiZW9yICAlMCwgJTIsICUyLCBhc3IgIzMxXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcnMgJTEsICUzLCAlMywgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGMgICUxLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAiZW9ycyAlMCwgJTQsICU0LCBhc3IgIzMxXG5cdCIKKyAgICAgICAgICAgICAgICAgImFkYyAgJTEsICUxLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JzICUwLCAlNSwgJTUsIGFzciAjMzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRjICAlMSwgJTEsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcnMgJTAsICU2LCAlNiwgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGMgICUxLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAiZW9ycyAlMCwgJTcsICU3LCBhc3IgIzMxXG5cdCIKKyAgICAgICAgICAgICAgICAgImFkYyAgJTEsICUxLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JzICUwLCAlOCwgJTgsIGFzciAjMzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRjICAlMSwgJTEsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcnMgJTAsICU5LCAlOSwgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGMgICUxLCAlMSwgJTBcblx0IgorCisgICAgICAgICAgICAgOiAiPSZyIihjYXJyeSksCisgICAgICAgICAgICAgICAgICI9JnIiKGFic19zdW0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihhYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihkZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihnZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGhoKSk7CisKKyAgICByZXR1cm4gYWJzX3N1bTsKK30KKworI2VuZGlmIC8vIERpZmYuIE9TCisKKyNlbmRpZiAvL19EQ1RfSU5MSU5FX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQ0MWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKQEAgLTAsMCArMSw2MjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IENvZGVNQl9IMjYzKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogOC8xNS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQZXJmb3JtIHJlc2lkdWUgY2FsYyAob25seSB6ZXJvIE1WKSwgRENULCBIMjYzIFF1YW50L0RlcXVhbnQsKi8KKy8qICAgICAgICAgICAgICBJRENUIGFuZCBtb3Rpb24gY29tcGVuc2F0aW9uLk1vZGlmaWVkIGZyb20gRmFzdENvZGVNQigpICAgICAqLworLyogIElucHV0ICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZpZGVvICAgICAgIFZpZGVvIGVuY29kZXIgZGF0YSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnVuY3Rpb24gICAgQXBwcm94aW1hdGUgRENUIGZ1bmN0aW9uLCBzY2FsaW5nIGFuZCB0aHJlc2hvbGQgICAgICAgICAqLworLyogICAgICBuY29lZmJsY2sgICBBcnJheSBmb3IgbGFzdCBub256ZXJvIGNvZWZmIGZvciBzcGVlZHVwIGluIFZsY0VuY29kZSAgICovCisvKiAgICAgIFFQICAgICAgQ29tYmluZWQgb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiB0byB0aGUgY3VycmVudCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrICBhbmQgUVAgIGZvciBjdXJyZW50IE1CLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPdXRwdXQgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmlkZW8tPm91dHB1dE1CICAgICBRdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjdXJyVm9wLT55Q2hhbix1Q2hhbix2Q2hhbiAgUmVjb25zdHJ1Y3RlZCBwaXhlbHMgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgMi8yNi8wMQorICAgICAgICAgICAgLW1vZGlmaWVkIHRocmVzaG9sZCBiYXNlZCBvbiBjb3JyZWxhdGlvbiBjb2VmZiAwLjc1IG9ubHkgZm9yIG1vZGUgSC4yNjMKKyAgICAgICAgICAgIC1uY29lZmJsY2tbXSBhcyBpbnB1dCwgIHRvIGtlZXAgcG9zaXRpb24gb2YgbGFzdCBub24temVybyBjb2VmZiovCisvKiAgICAgICAgICAgOC8xMC8wMQorICAgICAgICAgICAgLW1vZGlmaWVkIHRocmVzaG9sZCBiYXNlZCBvbiBjb3JyZWxhdGlvbiBjb2VmZiAwLjUKKyAgICAgICAgICAgIC11c2VkIGNvbHVtbiB0aHJlc2hvbGQgdG8gc3BlZWR1cCBjb2x1bW4gRENULgorICAgICAgICAgICAgLXVzZWQgYml0bWFwIHppZ3phZyB0byBzcGVlZHVwIFJ1bkxldmVsKCkuICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIENvZGVNQl9IMjYzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGFwcHJveERDVCAqZnVuY3Rpb24sIEludCBRUCwgSW50IG5jb2VmYmxja1tdKQoreworICAgIEludCBzYWQsIGssIENCUCwgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgU2hvcnQgKm91dHB1dCwgKmRhdGFCbG9jazsKKyAgICBVQ2hhciBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVttYm51bV07CisgICAgVUNoYXIgKmJpdG1hcGNvbCwgKmJpdG1hcHJvdyA9IHZpZGVvLT5iaXRtYXByb3c7CisgICAgVUludCAgKmJpdG1hcHp6IDsKKyAgICBVQ2hhciBzaG9ydEhlYWRlciA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNob3J0VmlkZW9IZWFkZXI7CisgICAgSW50IGRjX3NjYWxlciA9IDg7CisgICAgSW50IGludHJhID0gKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5UUkFfUSk7CisgICAgc3RydWN0IFFQc3RydWN0IFF1YW50UGFyYW07CisgICAgSW50IGRjdE1vZGUsIERjdFRoMTsKKyAgICBJbnQgQ29sVGg7CisgICAgSW50KCpCbG9ja1F1YW50RGVxdWFudEgyNjMpKFNob3J0ICosIFNob3J0ICosIHN0cnVjdCBRUHN0cnVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhcltdLCBVQ2hhciAqLCBVSW50ICosIEludCwgSW50LCBJbnQsIFVDaGFyKTsKKyAgICBJbnQoKkJsb2NrUXVhbnREZXF1YW50SDI2M0RDKShTaG9ydCAqLCBTaG9ydCAqLCBzdHJ1Y3QgUVBzdHJ1Y3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqLCBVSW50ICosIEludCwgVUNoYXIpOworICAgIHZvaWQgKCpCbG9ja0RDVDF4MSkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKyAgICB2b2lkICgqQmxvY2tEQ1QyeDIpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisgICAgdm9pZCAoKkJsb2NrRENUNHg0KShTaG9ydCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQpOworICAgIHZvaWQgKCpCbG9ja0RDVDh4OCkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKworICAgIC8qIG1vdGlvbiBjb21wLiByZWxhdGVkIHZhci4gKi8KKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWaWRlb0VuY0ZyYW1lSU8gKmlucHV0RnJhbWUgPSB2aWRlby0+aW5wdXQ7CisgICAgSW50IGluZF94ID0gdmlkZW8tPm91dHB1dE1CLT5tYl94OworICAgIEludCBpbmRfeSA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeTsKKyAgICBJbnQgbHggPSBjdXJyVm9wLT5waXRjaDsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsKKyAgICBVQ2hhciAqcmVjLCAqaW5wdXQsICpwcmVkOworICAgIEludCBvZmZzZXQgPSBRUCA+PiA1OyAgLyogUVAgaXMgY29tYmluZWQgb2Zmc2V0IGFuZCBRUCAqLworICAgIEludCBvZmZzZXRjID0gKG9mZnNldCA+PiAyKSArIChpbmRfeCA8PCAyKTsgLyogb2Zmc2V0IGZvciBjaHJvbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIE9TQ0xfVU5VU0VEX0FSRyhmdW5jdGlvbik7CisKKyAgICBvdXRwdXQgPSB2aWRlby0+b3V0cHV0TUItPmJsb2NrWzBdOworICAgIENCUCA9IDA7CisgICAgUVAgPSBRUCAmIDB4MUY7CisvLyAgTTRWRU5DX01FTVNFVChvdXRwdXQsMCwoc2l6ZW9mKFNob3J0KTw8NikqNik7IC8qIHJlc2V0IHF1YW50aXplZCBjb2VmZi4gdG8gemVybyAsIDcvMjQvMDEqLworCisgICAgUXVhbnRQYXJhbS5RUHgyID0gUVAgPDwgMTsKKyAgICBRdWFudFBhcmFtLlFQID0gUVA7CisgICAgUXVhbnRQYXJhbS5RUGRpdjIgPSBRUCA+PiAxOworICAgIFF1YW50UGFyYW0uUVB4MnBsdXMgPSBRdWFudFBhcmFtLlFQeDIgKyBRdWFudFBhcmFtLlFQZGl2MjsKKyAgICBRdWFudFBhcmFtLkFkZGl0aW9uID0gUVAgLSAxICsgKFFQICYgMHgxKTsKKworICAgIGlmIChpbnRyYSkKKyAgICB7CisgICAgICAgIEJsb2NrRENUMXgxID0gJkJsb2NrMXgxRENUSW50cmE7CisgICAgICAgIEJsb2NrRENUMngyID0gJkJsb2NrMngyRENUX0FBTkludHJhOworICAgICAgICBCbG9ja0RDVDR4NCA9ICZCbG9jazR4NERDVF9BQU5JbnRyYTsKKyAgICAgICAgQmxvY2tEQ1Q4eDggPSAmQmxvY2tEQ1RfQUFOSW50cmE7CisgICAgICAgIEJsb2NrUXVhbnREZXF1YW50SDI2MyA9ICZCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRyYTsKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRIMjYzREMgPSAmQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRyYTsKKyAgICAgICAgaWYgKHNob3J0SGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBkY19zY2FsZXIgPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNfc2NhbGVyID0gY2FsX2RjX3NjYWxlckVOQyhRUCwgMSk7IC8qIGx1bWluYW5jZSBibG9ja3MgKi8KKyAgICAgICAgfQorICAgICAgICBEY3RUaDEgPSAoSW50KShkY19zY2FsZXIgKiAzKTsvLyoxLjgyOQorICAgICAgICBDb2xUaCA9IENvbFRoSW50cmFbUVBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCbG9ja0RDVDF4MSA9ICZCbG9jazF4MURDVHdTdWI7CisgICAgICAgIEJsb2NrRENUMngyID0gJkJsb2NrMngyRENUX0FBTndTdWI7CisgICAgICAgIEJsb2NrRENUNHg0ID0gJkJsb2NrNHg0RENUX0FBTndTdWI7CisgICAgICAgIEJsb2NrRENUOHg4ID0gJkJsb2NrRENUX0FBTndTdWI7CisKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRIMjYzID0gJkJsb2NrUXVhbnREZXF1YW50SDI2M0ludGVyOworICAgICAgICBCbG9ja1F1YW50RGVxdWFudEgyNjNEQyA9ICZCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludGVyOworICAgICAgICBDb2xUaCA9IENvbFRoSW50ZXJbUVBdOworICAgICAgICBEY3RUaDEgPSAoSW50KSgxNiAqIFFQKTsgIC8vOSpRUDsKKyAgICB9CisKKyAgICByZWMgPSBjdXJyVm9wLT55Q2hhbiArIG9mZnNldDsKKyAgICBpbnB1dCA9IGlucHV0RnJhbWUtPnlDaGFuICsgb2Zmc2V0OworICAgIGlmIChseCAhPSB3aWR0aCkgaW5wdXQgLT0gKGluZF95IDw8IDkpOyAgLyogbm9uLXBhZGRlZCBvZmZzZXQgKi8KKworICAgIGRhdGFCbG9jayA9IHZpZGVvLT5kYXRhQmxvY2s7CisgICAgcHJlZCA9IHZpZGVvLT5wcmVkaWN0ZWRNQjsKKworICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCisgICAgeworICAgICAgICBDQlAgPDw9IDE7CisgICAgICAgIGJpdG1hcGNvbCA9IHZpZGVvLT5iaXRtYXBjb2xba107CisgICAgICAgIGJpdG1hcHp6ID0gdmlkZW8tPmJpdG1hcHp6W2tdOyAgLyogIDcvMzAvMDEgKi8KKyAgICAgICAgaWYgKGsgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICBzYWQgPSB2aWRlby0+bW90W21ibnVtXVtrKzFdLnNhZDsKKyAgICAgICAgICAgIGlmIChrJjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICAgICAgaW5wdXQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gKCh3aWR0aCA8PCAzKSAtIDgpOworICAgICAgICAgICAgICAgIGlucHV0ICs9IGRjdE1vZGU7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9ICgobHggPDwgMykgLSA4KTsKKyAgICAgICAgICAgICAgICByZWMgKz0gZGN0TW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrID09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjID0gY3VyclZvcC0+dUNoYW4gKyBvZmZzZXRjOworICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXRGcmFtZS0+dUNoYW4gKyBvZmZzZXRjOworICAgICAgICAgICAgICAgIGlmIChseCAhPSB3aWR0aCkgaW5wdXQgLT0gKGluZF95IDw8IDcpOworICAgICAgICAgICAgICAgIGx4ID4+PSAxOworICAgICAgICAgICAgICAgIHdpZHRoID4+PSAxOworICAgICAgICAgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNhZCA9IGdldEJsb2NrU3VtKGlucHV0LCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG9ydEhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjX3NjYWxlciA9IDg7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGNfc2NhbGVyID0gY2FsX2RjX3NjYWxlckVOQyhRUCwgMik7IC8qIGNocm9taW5hbmNlIGJsb2NrcyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIERjdFRoMSA9IChJbnQpKGRjX3NjYWxlciAqIDMpOy8vKjEuODI5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2FkID0gU2FkOHg4KGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjID0gY3VyclZvcC0+dkNoYW4gKyBvZmZzZXRjOworICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXRGcmFtZS0+dkNoYW4gKyBvZmZzZXRjOworICAgICAgICAgICAgICAgIGlmIChseCAhPSB3aWR0aCkgaW5wdXQgLT0gKGluZF95IDw8IDcpOworICAgICAgICAgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNhZCA9IGdldEJsb2NrU3VtKGlucHV0LCB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2FkID0gU2FkOHg4KGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2FkIDwgRGN0VGgxICYmICEoc2hvcnRIZWFkZXIgJiYgaW50cmEpKSAvKiBhbGwtemVybyAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3Igc2hvcnRIZWFkZXIgaW50cmEgYmxvY2ssIERDIHZhbHVlIGNhbm5vdCBiZSB6ZXJvICovCisgICAgICAgICAgICBkY3RNb2RlID0gMDsKKyAgICAgICAgICAgIENCUCB8PSAwOworICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzYWQgPCAxOCpRUC8qKFFQPDw0KSovKSAvKiBEQy1vbmx5ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjdE1vZGUgPSAxOworICAgICAgICAgICAgQmxvY2tEQ1QxeDEoZGF0YUJsb2NrLCBpbnB1dCwgcHJlZCwgd2lkdGgpOworCisgICAgICAgICAgICBDQlAgfD0gKCpCbG9ja1F1YW50RGVxdWFudEgyNjNEQykoZGF0YUJsb2NrLCBvdXRwdXQsICZRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcHJvdyArIGssIGJpdG1hcHp6LCBkY19zY2FsZXIsIHNob3J0SGVhZGVyKTsKKyAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIGRhdGFCbG9ja1s2NF0gPSBDb2xUaDsKKworICAgICAgICAgICAgaWYgKHNhZCA8IDIyKlFQLyooUVA8PDQpKyhRUDw8MSkqLykgIC8qIDJ4MiBEQ1QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gMjsKKyAgICAgICAgICAgICAgICBCbG9ja0RDVDJ4MihkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNhZCA8IChRUCA8PCA1KSkgLyogNHg0IERDVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSA0OworICAgICAgICAgICAgICAgIEJsb2NrRENUNHg0KGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBuY29lZmJsY2tba10gPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogRnVsbC1EQ1QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gODsKKyAgICAgICAgICAgICAgICBCbG9ja0RDVDh4OChkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gNjQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENCUCB8PSAoKkJsb2NrUXVhbnREZXF1YW50SDI2MykoZGF0YUJsb2NrLCBvdXRwdXQsICZRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBjb2wsIGJpdG1hcHJvdyArIGssIGJpdG1hcHp6LCBkY3RNb2RlLCBrLCBkY19zY2FsZXIsIHNob3J0SGVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBCbG9ja0lEQ1RNb3Rpb25Db21wKGRhdGFCbG9jaywgYml0bWFwY29sLCBiaXRtYXByb3dba10sIGRjdE1vZGUsIHJlYywgcHJlZCwgKGx4IDw8IDEpIHwgaW50cmEpOworICAgICAgICBvdXRwdXQgKz0gNjQ7CisgICAgICAgIGlmICghKGsmMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgKz0gODsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgKz0gMTIwOworICAgICAgICB9CisgICAgfQorCisgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9IENCUDsgLyogIDUvMTgvMjAwMSAqLworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisjaWZuZGVmIE5PX01QRUdfUVVBTlQKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQ29kZU1CX01QRUcoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA4LzE1LzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFBlcmZvcm0gcmVzaWR1ZSBjYWxjIChvbmx5IHplcm8gTVYpLCBEQ1QsIE1QRUcgUXVhbnQvRGVxdWFudCwqLworLyogICAgICAgICAgICAgIElEQ1QgYW5kIG1vdGlvbiBjb21wZW5zYXRpb24uTW9kaWZpZWQgZnJvbSBGYXN0Q29kZU1CKCkgICAgICovCisvKiAgSW5wdXQgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmlkZW8gICAgICAgVmlkZW8gZW5jb2RlciBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmdW5jdGlvbiAgICBBcHByb3hpbWF0ZSBEQ1QgZnVuY3Rpb24sIHNjYWxpbmcgYW5kIHRocmVzaG9sZCAgICAgICAgICovCisvKiAgICAgIG5jb2VmYmxjayAgIEFycmF5IGZvciBsYXN0IG5vbnplcm8gY29lZmYgZm9yIHNwZWVkdXAgaW4gVmxjRW5jb2RlICAgKi8KKy8qICAgICAgUVAgICAgICBDb21iaW5lZCBvZmZzZXQgZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSBjdXJyZW50ICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgIGFuZCBRUCAgZm9yIGN1cnJlbnQgTUIuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE91dHB1dCAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2aWRlby0+b3V0cHV0TUIgICAgIFF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGN1cnJWb3AtPnlDaGFuLHVDaGFuLHZDaGFuICBSZWNvbnN0cnVjdGVkIHBpeGVscyAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICBQVl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAyLzI2LzAxCisgICAgICAgICAgICAtbW9kaWZpZWQgdGhyZXNob2xkIGJhc2VkIG9uIGNvcnJlbGF0aW9uIGNvZWZmIDAuNzUgb25seSBmb3IgbW9kZSBILjI2MworICAgICAgICAgICAgLW5jb2VmYmxja1tdIGFzIGlucHV0LCBrZWVwIHBvc2l0aW9uIG9mIGxhc3Qgbm9uLXplcm8gY29lZmYqLworLyogICAgICAgICAgIDgvMTAvMDEKKyAgICAgICAgICAgIC1tb2RpZmllZCB0aHJlc2hvbGQgYmFzZWQgb24gY29ycmVsYXRpb24gY29lZmYgMC41CisgICAgICAgICAgICAtdXNlZCBjb2x1bW4gdGhyZXNob2xkIHRvIHNwZWVkdXAgY29sdW1uIERDVC4KKyAgICAgICAgICAgIC11c2VkIGJpdG1hcCB6aWd6YWcgdG8gc3BlZWR1cCBSdW5MZXZlbCgpLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBDb2RlTUJfTVBFRyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgUVAsIEludCBuY29lZmJsY2tbXSkKK3sKKyAgICBJbnQgc2FkLCBrLCBDQlAsIG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIFNob3J0ICpvdXRwdXQsICpkYXRhQmxvY2s7CisgICAgVUNoYXIgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIFVDaGFyICpiaXRtYXBjb2wsICpiaXRtYXByb3cgPSB2aWRlby0+Yml0bWFwcm93OworICAgIFVJbnQgICpiaXRtYXB6eiA7CisgICAgSW50IGRjX3NjYWxlciA9IDg7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBJbnQgaW50cmEgPSAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKTsKKyAgICBJbnQgKnFtYXQ7CisgICAgSW50IGRjdE1vZGUsIERjdFRoMSwgRGN0VGgyLCBEY3RUaDMsIERjdFRoNDsKKyAgICBJbnQgQ29sVGg7CisKKyAgICBJbnQoKkJsb2NrUXVhbnREZXF1YW50TVBFRykoU2hvcnQgKiwgU2hvcnQgKiwgSW50LCBJbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgW10sIFVDaGFyICosIFVJbnQgKiwgSW50LCAgSW50LCBJbnQpOworICAgIEludCgqQmxvY2tRdWFudERlcXVhbnRNUEVHREMpKFNob3J0ICosIFNob3J0ICosIEludCwgSW50ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgW10sIFVDaGFyICosIFVJbnQgKiwgSW50KTsKKworICAgIHZvaWQgKCpCbG9ja0RDVDF4MSkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKyAgICB2b2lkICgqQmxvY2tEQ1QyeDIpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisgICAgdm9pZCAoKkJsb2NrRENUNHg0KShTaG9ydCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQpOworICAgIHZvaWQgKCpCbG9ja0RDVDh4OCkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKworICAgIC8qIG1vdGlvbiBjb21wLiByZWxhdGVkIHZhci4gKi8KKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWaWRlb0VuY0ZyYW1lSU8gKmlucHV0RnJhbWUgPSB2aWRlby0+aW5wdXQ7CisgICAgSW50IGluZF94ID0gdmlkZW8tPm91dHB1dE1CLT5tYl94OworICAgIEludCBpbmRfeSA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeTsKKyAgICBJbnQgbHggPSBjdXJyVm9wLT5waXRjaDsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsKKyAgICBVQ2hhciAqcmVjLCAqaW5wdXQsICpwcmVkOworICAgIEludCBvZmZzZXQgPSBRUCA+PiA1OworICAgIEludCBvZmZzZXRjID0gKG9mZnNldCA+PiAyKSArIChpbmRfeCA8PCAyKTsgLyogb2Zmc2V0IGZvciBjaHJvbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIE9TQ0xfVU5VU0VEX0FSRyhmdW5jdGlvbik7CisKKyAgICBvdXRwdXQgPSB2aWRlby0+b3V0cHV0TUItPmJsb2NrWzBdOworICAgIENCUCA9IDA7CisgICAgUVAgPSBRUCAmIDB4MUY7CisvLyAgTTRWRU5DX01FTVNFVChvdXRwdXQsMCwoc2l6ZW9mKFNob3J0KTw8NikqNik7IC8qIHJlc2V0IHF1YW50aXplZCBjb2VmZi4gdG8gemVybyAsICA3LzI0LzAxKi8KKworICAgIGlmIChpbnRyYSkKKyAgICB7CisgICAgICAgIEJsb2NrRENUMXgxID0gJkJsb2NrMXgxRENUSW50cmE7CisgICAgICAgIEJsb2NrRENUMngyID0gJkJsb2NrMngyRENUX0FBTkludHJhOworICAgICAgICBCbG9ja0RDVDR4NCA9ICZCbG9jazR4NERDVF9BQU5JbnRyYTsKKyAgICAgICAgQmxvY2tEQ1Q4eDggPSAmQmxvY2tEQ1RfQUFOSW50cmE7CisKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRNUEVHID0gJkJsb2NrUXVhbnREZXF1YW50TVBFR0ludHJhOworICAgICAgICBCbG9ja1F1YW50RGVxdWFudE1QRUdEQyA9ICZCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludHJhOworICAgICAgICBkY19zY2FsZXIgPSBjYWxfZGNfc2NhbGVyRU5DKFFQLCAxKTsgLyogbHVtaW5hbmNlIGJsb2NrcyAqLworICAgICAgICBxbWF0ID0gY3VyclZvbC0+aXFtYXQ7CisgICAgICAgIERjdFRoMSA9IChJbnQpKDMgKiBkY19zY2FsZXIpOy8vMipkY19zY2FsZXIpOworICAgICAgICBEY3RUaDIgPSAoSW50KSgoMS4yNSAqIFFQIC0gMSkgKiBxbWF0WzFdICogMC40NSk7Ly8wLjU2Nyk7Ly8wLjU2Nyk7CisgICAgICAgIERjdFRoMyA9IChJbnQpKCgxLjI1ICogUVAgLSAxKSAqIHFtYXRbMl0gKiAwLjU1KTsvLzEuMTYyKTsgLyogIDgvMi8yMDAxICovCisgICAgICAgIERjdFRoNCA9IChJbnQpKCgxLjI1ICogUVAgLSAxKSAqIHFtYXRbMzJdICogMC44KTsvLzEuNzU4Myk7Ly8wLjc5NDIpOworICAgICAgICBDb2xUaCA9IENvbFRoSW50cmFbUVBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCbG9ja0RDVDF4MSA9ICZCbG9jazF4MURDVHdTdWI7CisgICAgICAgIEJsb2NrRENUMngyID0gJkJsb2NrMngyRENUX0FBTndTdWI7CisgICAgICAgIEJsb2NrRENUNHg0ID0gJkJsb2NrNHg0RENUX0FBTndTdWI7CisgICAgICAgIEJsb2NrRENUOHg4ID0gJkJsb2NrRENUX0FBTndTdWI7CisKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRNUEVHID0gJkJsb2NrUXVhbnREZXF1YW50TVBFR0ludGVyOworICAgICAgICBCbG9ja1F1YW50RGVxdWFudE1QRUdEQyA9ICZCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludGVyOworICAgICAgICBxbWF0ID0gY3VyclZvbC0+bmlxbWF0OworICAgICAgICBEY3RUaDEgPSAoSW50KSgoKFFQIDw8IDEpIC0gMC41KSAqIHFtYXRbMF0gKiAwLjQpOy8vMC4yMjg2KTsvLzAuMzA2Mik7CisgICAgICAgIERjdFRoMiA9IChJbnQpKCgoUVAgPDwgMSkgLSAwLjUpICogcW1hdFsxXSAqIDAuNDUpOy8vMC41NjcpOy8vMC40KTsKKyAgICAgICAgRGN0VGgzID0gKEludCkoKChRUCA8PCAxKSAtIDAuNSkgKiBxbWF0WzJdICogMC41NSk7Ly8xLjE2Mik7IC8qICA4LzIvMjAwMSAqLworICAgICAgICBEY3RUaDQgPSAoSW50KSgoKFFQIDw8IDEpIC0gMC41KSAqIHFtYXRbMzJdICogMC44KTsvLzEuNzU4Myk7Ly8wLjc5NDIpOworICAgICAgICBDb2xUaCA9IENvbFRoSW50ZXJbUVBdOworICAgIH0vLyBnZXQgcW1hdCwgRGN0VGgxLCBEY3RUaDIsIERjdFRoMworCisgICAgcmVjID0gY3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7CisgICAgaW5wdXQgPSBpbnB1dEZyYW1lLT55Q2hhbiArIG9mZnNldDsKKyAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA5KTsgIC8qIG5vbi1wYWRkZWQgb2Zmc2V0ICovCisKKyAgICBkYXRhQmxvY2sgPSB2aWRlby0+ZGF0YUJsb2NrOworICAgIHByZWQgPSB2aWRlby0+cHJlZGljdGVkTUI7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgIHsKKyAgICAgICAgQ0JQIDw8PSAxOworICAgICAgICBiaXRtYXBjb2wgPSB2aWRlby0+Yml0bWFwY29sW2tdOworICAgICAgICBiaXRtYXB6eiA9IHZpZGVvLT5iaXRtYXB6eltrXTsgIC8qICA4LzIvMDEgKi8KKyAgICAgICAgaWYgKGsgPCA0KQorICAgICAgICB7Ly9ZIGJsb2NrCisgICAgICAgICAgICBzYWQgPSB2aWRlby0+bW90W21ibnVtXVtrKzFdLnNhZDsKKyAgICAgICAgICAgIGlmIChrJjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICAgICAgaW5wdXQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gKCh3aWR0aCA8PCAzKSAtIDgpOworICAgICAgICAgICAgICAgIGlucHV0ICs9IGRjdE1vZGU7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9ICgobHggPDwgMykgLSA4KTsKKyAgICAgICAgICAgICAgICByZWMgKz0gZGN0TW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsvLyBVLCBWIGJsb2NrCisgICAgICAgICAgICBpZiAoayA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyA9IGN1cnJWb3AtPnVDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0RnJhbWUtPnVDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA3KTsKKyAgICAgICAgICAgICAgICBseCA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3aWR0aCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkY19zY2FsZXIgPSBjYWxfZGNfc2NhbGVyRU5DKFFQLCAyKTsgLyogbHVtaW5hbmNlIGJsb2NrcyAqLworICAgICAgICAgICAgICAgICAgICBEY3RUaDEgPSBkY19zY2FsZXIgKiAzOworICAgICAgICAgICAgICAgICAgICBzYWQgPSBnZXRCbG9ja1N1bShpbnB1dCwgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNhZCA9IFNhZDh4OChpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyA9IGN1cnJWb3AtPnZDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0RnJhbWUtPnZDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA3KTsKKyAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgICAgIHNhZCA9IGdldEJsb2NrU3VtKGlucHV0LCB3aWR0aCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzYWQgPSBTYWQ4eDgoaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYWQgPCBEY3RUaDEpIC8qIGFsbC16ZXJvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjdE1vZGUgPSAwOworICAgICAgICAgICAgQ0JQIHw9IDA7CisgICAgICAgICAgICBuY29lZmJsY2tba10gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNhZCA8IERjdFRoMikgLyogREMtb25seSAqLworICAgICAgICB7CisgICAgICAgICAgICBkY3RNb2RlID0gMTsKKyAgICAgICAgICAgIEJsb2NrRENUMXgxKGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKworICAgICAgICAgICAgQ0JQIHw9ICgqQmxvY2tRdWFudERlcXVhbnRNUEVHREMpKGRhdGFCbG9jaywgb3V0cHV0LCBRUCwgcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBjb2wsIGJpdG1hcHJvdyArIGssIGJpdG1hcHp6LCBkY19zY2FsZXIpOworICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFCbG9ja1s2NF0gPSBDb2xUaDsKKworICAgICAgICAgICAgaWYgKHNhZCA8IERjdFRoMykgLyogMngyLURDVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSAyOworICAgICAgICAgICAgICAgIEJsb2NrRENUMngyKGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBuY29lZmJsY2tba10gPSA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2FkIDwgRGN0VGg0KSAvKiA0eDQgRENUICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9IDQ7CisgICAgICAgICAgICAgICAgQmxvY2tEQ1Q0eDQoZGF0YUJsb2NrLCBpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBmdWxsLURDVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSA4OworICAgICAgICAgICAgICAgIEJsb2NrRENUOHg4KGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBuY29lZmJsY2tba10gPSA2NDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0JQIHw9ICgqQmxvY2tRdWFudERlcXVhbnRNUEVHKShkYXRhQmxvY2ssIG91dHB1dCwgUVAsIHFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcGNvbCwgYml0bWFwcm93ICsgaywgYml0bWFwenosIGRjdE1vZGUsIGssIGRjX3NjYWxlcik7IC8vCisgICAgICAgIH0KKyAgICAgICAgZGN0TW9kZSA9IDg7IC8qIGZvciBtaXNtYXRjaCBoYW5kbGUgKi8KKyAgICAgICAgQmxvY2tJRENUTW90aW9uQ29tcChkYXRhQmxvY2ssIGJpdG1hcGNvbCwgYml0bWFwcm93W2tdLCBkY3RNb2RlLCByZWMsIHByZWQsIChseCA8PCAxKSB8IChpbnRyYSkpOworCisgICAgICAgIG91dHB1dCArPSA2NDsKKyAgICAgICAgaWYgKCEoayYxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCArPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCArPSAxMjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gQ0JQOyAvKiAgNS8xOC8yMDAxICovCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IGdldEJsb2NrU0FWKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogOC8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgU0FWIGZvciBvbmUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IGJsb2NrWzY0XSBjb250YWluIG9uZSBibG9jayBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogY2FuIGJlIHdyaXR0ZW4gaW4gTU1YIG9yIFNTRSwgIDIvMjIvMjAwMSAqLworSW50IGdldEJsb2NrU0FWKFNob3J0IGJsb2NrW10pCit7CisgICAgSW50IGksIHZhbCwgc2F2ID0gMDsKKworICAgIGkgPSA4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgICAgIHZhbCA9ICpibG9jaysrOworICAgICAgICBpZiAodmFsID4gMCkgICAgc2F2ICs9IHZhbDsKKyAgICAgICAgZWxzZSAgICAgICAgc2F2IC09IHZhbDsKKyAgICAgICAgdmFsID0gKmJsb2NrKys7CisgICAgICAgIGlmICh2YWwgPiAwKSAgICBzYXYgKz0gdmFsOworICAgICAgICBlbHNlICAgICAgICBzYXYgLT0gdmFsOworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgICAgIHZhbCA9ICpibG9jaysrOworICAgICAgICBpZiAodmFsID4gMCkgICAgc2F2ICs9IHZhbDsKKyAgICAgICAgZWxzZSAgICAgICAgc2F2IC09IHZhbDsKKyAgICAgICAgdmFsID0gKmJsb2NrKys7CisgICAgICAgIGlmICh2YWwgPiAwKSAgICBzYXYgKz0gdmFsOworICAgICAgICBlbHNlICAgICAgICBzYXYgLT0gdmFsOworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgICAgIHZhbCA9ICpibG9jaysrOworICAgICAgICBpZiAodmFsID4gMCkgICAgc2F2ICs9IHZhbDsKKyAgICAgICAgZWxzZSAgICAgICAgc2F2IC09IHZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gc2F2OworCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogU2FkOHg4KCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA4LzEwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEZpbmQgU0FEIGJldHdlZW4gcHJldiBibG9jayBhbmQgY3VycmVudCBibG9jayAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogUHJldmlvdXMgYW5kIGN1cnJlbnQgZnJhbWUgYmxvY2sgcG9pbnRlcnMsIGFuZCBmcmFtZSB3aWR0aCAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA4LzE1LzAxLCAgLSBkbyA0IHBpeGVsIGF0IGEgdGltZSAgICBhc3N1bWluZyAzMiBiaXQgcmVnaXN0ZXIgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0ludCBTYWQ4eDgoVUNoYXIgKmN1ciwgVUNoYXIgKnByZXYsIEludCB3aWR0aCkKK3sKKyAgICBVQ2hhciAqZW5kID0gY3VyICsgKHdpZHRoIDw8IDMpOworICAgIEludCBzYWQgPSAwOworICAgIEludCAqY3VySW50ID0gKEludCopIGN1cjsKKyAgICBJbnQgKnByZXZJbnQgPSAoSW50KikgcHJldjsKKyAgICBJbnQgY3VyMSwgY3VyMiwgcHJldjEsIHByZXYyOworICAgIFVJbnQgbWFzaywgc2duX21zayA9IDB4ODA4MDgwODA7CisgICAgSW50ICBzdW0yID0gMCwgc3VtNCA9IDA7CisgICAgSW50ICB0bXA7CisgICAgZG8KKyAgICB7CisgICAgICAgIG1hc2sgICAgPSB+KDB4RkYwMCk7CisgICAgICAgIGN1cjEgICAgPSBjdXJJbnRbMV07ICAgICAgICAvKiBsb2FkIGN1cls0Li43XSAqLworICAgICAgICBjdXIyICAgID0gY3VySW50WzBdOworICAgICAgICBjdXJJbnQgKz0gKHdpZHRoID4+IDIpOyAgICAgLyogbG9hZCBjdXJbMC4uM10gYW5kICs9bHggKi8KKyAgICAgICAgcHJldjEgICA9IHByZXZJbnRbMV07CisgICAgICAgIHByZXYyICAgPSBwcmV2SW50WzBdOworICAgICAgICBwcmV2SW50ICs9IDQ7CisKKyAgICAgICAgdG1wICAgICA9IHByZXYyIF4gY3VyMjsKKyAgICAgICAgY3VyMiAgICA9IHByZXYyIC0gY3VyMjsKKyAgICAgICAgdG1wICAgICA9IHRtcCBeIGN1cjI7ICAgICAgIC8qICheKV4oLSkgbGFzdCBiaXQgaXMgb25lIGlmIGNhcnJ5ICovCisgICAgICAgIHRtcCAgICAgPSBzZ25fbXNrICYgKChVSW50KXRtcCA+PiAxKTsgLyogY2hlY2sgdGhlIHNpZ24gb2YgZWFjaCBieXRlICovCisgICAgICAgIGlmIChjdXIyIDwgMCkgICB0bXAgPSB0bXAgfCAweDgwMDAwMDAwOyAvKiBjb3JjdXJ0IHNpZ24gb2YgZmlyc3QgYnl0ZSAqLworICAgICAgICB0bXAgICAgID0gKHRtcCA8PCA4KSAtIHRtcDsgICAgIC8qIGNhcnJ5IGJvcnJvd2VkIGJ5dGVzIGFyZSBtYXJrZWQgd2l0aCAweDFGRSAqLworICAgICAgICBjdXIyICAgID0gY3VyMiArICh0bXAgPj4gNyk7ICAgICAvKiBuZWdhdGl2ZSBieXRlcyBpcyBhZGRlZCB3aXRoIDB4RkYsIC0xICovCisgICAgICAgIGN1cjIgICAgPSBjdXIyIF4odG1wID4+IDcpOyAvKiB0YWtlIGFic29sdXRlIGJ5IGludmVydGluZyBiaXRzIChFT1IpICovCisKKyAgICAgICAgdG1wICAgICA9IHByZXYxIF4gY3VyMTsKKyAgICAgICAgY3VyMSAgICA9IHByZXYxIC0gY3VyMTsKKyAgICAgICAgdG1wICAgICA9IHRtcCBeIGN1cjE7ICAgICAgIC8qICheKV4oLSkgbGFzdCBiaXQgaXMgb25lIGlmIGNhcnJ5ICovCisgICAgICAgIHRtcCAgICAgPSBzZ25fbXNrICYgKChVSW50KXRtcCA+PiAxKTsgLyogY2hlY2sgdGhlIHNpZ24gb2YgZWFjaCBieXRlICovCisgICAgICAgIGlmIChjdXIxIDwgMCkgICB0bXAgPSB0bXAgfCAweDgwMDAwMDAwOyAvKiBjb3JjdXJ0IHNpZ24gb2YgZmlyc3QgYnl0ZSAqLworICAgICAgICB0bXAgICAgID0gKHRtcCA8PCA4KSAtIHRtcDsgICAgIC8qIGNhcnJ5IGJvcnJvd2VkIGJ5dGVzIGFyZSBtYXJrZWQgd2l0aCAweDFGRSAqLworICAgICAgICBjdXIxICAgID0gY3VyMSArICh0bXAgPj4gNyk7ICAgICAvKiBuZWdhdGl2ZSBieXRlcyBpcyBhZGRlZCB3aXRoIDB4RkYsIC0xICovCisgICAgICAgIGN1cjEgICAgPSBjdXIxIF4odG1wID4+IDcpOyAvKiB0YWtlIGFic29sdXRlIGJ5IGludmVydGluZyBiaXRzIChFT1IpICovCisKKyAgICAgICAgc3VtNCAgICA9IHN1bTQgKyBjdXIxOworICAgICAgICBjdXIxICAgID0gY3VyMSAmIChtYXNrIDw8IDgpOyAgIC8qIG1hc2sgZmlyc3QgYW5kIHRoaXJkIGJ5dGVzICovCisgICAgICAgIHN1bTIgICAgPSBzdW0yICsgKChVSW50KWN1cjEgPj4gOCk7CisgICAgICAgIHN1bTQgICAgPSBzdW00ICsgY3VyMjsKKyAgICAgICAgY3VyMiAgICA9IGN1cjIgJiAobWFzayA8PCA4KTsgICAvKiBtYXNrIGZpcnN0IGFuZCB0aGlyZCBieXRlcyAqLworICAgICAgICBzdW0yICAgID0gc3VtMiArICgoVUludCljdXIyID4+IDgpOworICAgIH0KKyAgICB3aGlsZSAoKFVJbnQpY3VySW50IDwgKFVJbnQpZW5kKTsKKworICAgIGN1cjEgPSBzdW00IC0gKHN1bTIgPDwgOCk7ICAvKiBnZXQgZXZlbi1zdW0gKi8KKyAgICBjdXIxID0gY3VyMSArIHN1bTI7ICAgICAgICAgLyogYWRkIDE2IGJpdCBldmVuLXN1bSBhbmQgb2RkLXN1bSovCisgICAgY3VyMSA9IGN1cjEgKyAoY3VyMSA8PCAxNik7IC8qIGFkZCB1cHBlciBhbmQgbG93ZXIgMTYgYml0IHN1bSAqLworICAgIHNhZCAgPSAoKFVJbnQpY3VyMSA+PiAxNik7ICAvKiB0YWtlIHVwcGVyIDE2IGJpdCAqLworICAgIHJldHVybiBzYWQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogZ2V0QmxvY2tTdW0oICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA4LzEwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEZpbmQgc3VtbWF0aW9uIG9mIHZhbHVlIHdpdGhpbiBhIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogUG9pbnRlciB0byBjdXJyZW50IGJsb2NrIGluIGEgZnJhbWUgYW5kIGZyYW1lIHdpZHRoICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgOC8xNS8wMSwgIC0gU0lNRCA0IHBpeGVscyBhdCBhIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitJbnQgZ2V0QmxvY2tTdW0oVUNoYXIgKmN1ciwgSW50IHdpZHRoKQoreworICAgIEludCBzYWQgPSAwLCBzdW00ID0gMCwgc3VtMiA9IDA7CisgICAgVUNoYXIgKmVuZCA9IGN1ciArICh3aWR0aCA8PCAzKTsKKyAgICBJbnQgKmN1ckludCA9IChJbnQqKWN1cjsKKyAgICBVSW50IG1hc2sgICA9IH4oMHhGRjAwKTsKKyAgICBJbnQgbG9hZDEsIGxvYWQyOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGxvYWQxID0gY3VySW50WzFdOworICAgICAgICBsb2FkMiA9IGN1ckludFswXTsKKyAgICAgICAgY3VySW50ICs9ICh3aWR0aCA+PiAyKTsKKyAgICAgICAgc3VtNCArPSBsb2FkMTsKKyAgICAgICAgbG9hZDEgPSBsb2FkMSAmIChtYXNrIDw8IDgpOyAvKiBldmVuIGJ5dGVzICovCisgICAgICAgIHN1bTIgKz0gKChVSW50KWxvYWQxID4+IDgpOyAvKiBzdW0gZXZlbiBieXRlcywgMTYgYml0ICovCisgICAgICAgIHN1bTQgKz0gbG9hZDI7CisgICAgICAgIGxvYWQyID0gbG9hZDIgJiAobWFzayA8PCA4KTsgLyogZXZlbiBieXRlcyAqLworICAgICAgICBzdW0yICs9ICgoVUludClsb2FkMiA+PiA4KTsgLyogc3VtIGV2ZW4gYnl0ZXMsIDE2IGJpdCAqLworICAgIH0KKyAgICB3aGlsZSAoKFVJbnQpY3VySW50IDwgKFVJbnQpZW5kKTsKKyAgICBsb2FkMSA9IHN1bTQgLSAoc3VtMiA8PCA4KTsgICAgIC8qIGdldCBldmVuLXN1bSAqLworICAgIGxvYWQxID0gbG9hZDEgKyBzdW0yOyAgICAgICAgICAgLyogYWRkIDE2IGJpdCBldmVuLXN1bSBhbmQgb2RkLXN1bSovCisgICAgbG9hZDEgPSBsb2FkMSArIChsb2FkMSA8PCAxNik7ICAvKiBhZGQgdXBwZXIgYW5kIGxvd2VyIDE2IGJpdCBzdW0gKi8KKyAgICBzYWQgID0gKChVSW50KWxvYWQxID4+IDE2KTsgLyogdGFrZSB1cHBlciAxNiBiaXQgKi8KKworICAgIHJldHVybiBzYWQ7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODZhNjZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICovCisvKiAgRmlsZTogRmFzdENvZGVNQi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZXNjcmlwdGlvbjogVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyB1c2VkCisgICAgICAgICAgICBpbiBGYXN0Q29kZU1CKCkgZnVuY3Rpb24uIFdoZW4gaXQgaXMgZGVjaWRlZCB0byB1c2UgRmFzdENvZGVNQgorICAgICAgICAgICAgaW5zdGVhZCBvZiBDb2RlTUIsIGFsbCBvZiB0aGlzIHByb3RvdHlwZXMgc2hvdWxkIGJlIG1pZ3JhdGVkIHRvCisgICAgICAgICAgICBtcDRlbmNfbGliLmguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZWQ6IDgvMTQvMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0X2FwcHJveERDVCAgYXBwcm94RENUOworc3RydWN0IHN0cnVjdF9hcHByb3hEQ1QKK3sKKyAgICBjb25zdCBJbnQgKnNjYWxlOworICAgIEludCgqRENUKShJbnQgYmxvY2tbIF0sIEludCBjb2VmZlsgXSwgYXBwcm94RENUICopOworCisgICAgLy8gVGhyZXNob2xkIHZhbHVlIGZvciBILjI2MyBRdWFudGl6ZXIKKyAgICBJbnQgdGhfYXBwX2FsbFs4XTsKKyAgICBJbnQgdGhfYXBwX29kZFs4XTsKKyAgICBJbnQgdGhfYXBwX2V2ZW5bOF07CisgICAgSW50IHRoX2FwcF9ldmVuMVs4XTsKKyAgICBJbnQgdGhfYXBwX2V2ZW4yWzhdOworfTsKKworc3RydWN0IFFQc3RydWN0Cit7CisgICAgSW50IFFQeDIgOworICAgIEludCBRUDsKKyAgICBJbnQgUVBkaXYyOworICAgIEludCBRUHgycGx1czsKKyAgICBJbnQgQWRkaXRpb247Cit9OworCisvKi0tLS0gRmFzdENvZGVNQi5jIC0tLS0tKi8KK3ZvaWQgaW5pdENvZGVNQihhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgUVApOworUFZfU1RBVFVTIENvZGVNQl9IMjYzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGFwcHJveERDVCAqZnVuY3Rpb24sIEludCBRUCwgSW50IG5jb2VmYmxja1tdLCBJbnQgb2Zmc2V0KTsKK1BWX1NUQVRVUyBDb2RlTUJfTVBFRyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgUVAsIEludCBuY29lZmJsY2tbXSwgSW50IG9mZnNldCk7CitJbnQgZ2V0QmxvY2tTQVYoSW50IGJsb2NrW10pOworSW50IFNhZDh4OChVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKK0ludCBnZXRCbG9ja1N1bShVQ2hhciAqcmVjLCBJbnQgbHgpOworCisvKi0tLS0gQXBwVkNBX2RjdC5jIC0tLS0tKi8KK0ludCAgICAgQXBwVkNBMV9kY3QoSW50IGJsb2NrW10sIEludCBvdXRbIF0sIGFwcHJveERDVCAqZnVuY3Rpb24pOworSW50ICAgICBBcHBWQ0EyX2RjdChJbnQgYmxvY2tbXSwgSW50IG91dFsgXSwgYXBwcm94RENUICpmdW5jdGlvbik7CitJbnQgICAgIEFwcFZDQTNfZGN0KEludCBibG9ja1tdLCBJbnQgb3V0WyBdLCBhcHByb3hEQ1QgKmZ1bmN0aW9uKTsKK0ludCAgICAgQXBwVkNBNF9kY3QoSW50IGJsb2NrW10sIEludCBvdXRbIF0sIGFwcHJveERDVCAqZnVuY3Rpb24pOworSW50ICAgICBBcHBWQ0E1X2RjdChJbnQgYmxvY2tbXSwgSW50IG91dFsgXSwgYXBwcm94RENUICpmdW5jdGlvbik7CisKKy8qLS0tLSBGYXN0UXVhbnQuYyAtLS0tLSovCitJbnQgY2FsX2RjX3NjYWxlckVOQyhJbnQgUVAsIEludCB0eXBlKSA7CitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzSW50ZXIoSW50ICpyY29lZmYsIEludCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgSW50IGNvbXAsIEludCBkdW1teSk7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRyYShJbnQgKnJjb2VmZiwgSW50ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcik7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludGVyKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkdW1teSk7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludHJhKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkY19zY2FsZXIpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHSW50ZXIoSW50ICpyY29lZmYsIEludCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBEY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcik7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudE1QRUdJbnRyYShJbnQgKnJjb2VmZiwgSW50ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IERjdE1vZGUsIEludCBjb21wLCBJbnQgZGNfc2NhbGVyKTsKKworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0RDSW50ZXIoSW50ICpyY29lZmYsIEludCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkdW1teSk7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludHJhKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZGNfc2NhbGVyKTsKKworLyotLS0tIEZhc3RJRENULmMgLS0tLS0qLwordm9pZCBCbG9ja0lEQ1RNb3Rpb25Db21wKEludCAqYmxvY2ssIFVDaGFyICpiaXRtYXBjb2wsIFVDaGFyIGJpdG1hcHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgVUNoYXIgKnJlYywgSW50IGx4LCBJbnQgaW50cmEpOworCisvKi0tLS0gbW90aW9uX2NvbXAuYyAtLS0tLSovCit2b2lkIFB1dFNraXBwZWRCbG9jayhVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNzQyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApAQCAtMCwwICsxLDIwMjAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVZJU0lPTiBISVNUT1JZCisgV2hvOiAgIERhdGU6IEp1bHkvMjAwMQorIERlc2NyaXB0aW9uOiAgIDEuIE9wdGltaXplZCBCbG9ja0lEQ1QgYml0bWFwIGNoZWNraW5nLgorICAgICAgICAgICAgICAgIDIuIFJlYXJyYW5nZWQgZnVuY3Rpb25zLgorICAgICAgICAgICAgICAgIDMuIERvIGNvbHVtbiBJRENUIGZpcnN0LCB0aGVuIHJvdyBJRENULgorICAgICAgICAgICAgICAgIDQuIENvbWJpbmUgbW90aW9uIGNvbXAgYW5kIElEQ1QsIHJlcXVpcmUKKyAgICAgICAgICAgICAgICAgICB0d28gc2V0cyBvZiByb3cgSURDVHMgb25lIGZvciBJTlRSQQorICAgICAgICAgICAgICAgICAgIGFuZCBvbmUgZm9yIElOVEVSLgorICAgICAgICAgICAgICAgIDUuIEFkZCBBQU4gSURDVAorCisgV2hvOiAgIERhdGU6IDgvMTYvMDEKKyAgICAgICAgICAgICAgICAxLiBJbmNyZWFzZSB0aGUgaW5wdXQgcHJlY2lzaW9uIHRvIDggYml0cywgaS5lLiBjaGFuZ2UgUkRDVEJJVFMKKyAgICAgICAgICAgICAgICAgICB0byAxMSwgaGF2ZSB0byBjb21tZW50IG91dCBhbGwgaW4tbGluZSBhc3NlbWJseSBzaW5jZSAxNiBiaXQKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gZG9lc24ndCB3b3JrLiBUcnkgdG8gdXNlIGRpZmZlbnQgcHJlY2lzaW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgMzIgYml0IG11bHQuIGJ1dCBoYXNuJ3QgZmluaXNoZWQuIFR1cm5zIG91dCB0aGF0IHdpdGhvdXQgaW4tbGluZQorICAgICAgICAgICAgICAgICAgICBhc3NlbWJseSB0aGUgcGVyZm9ybWFuY2UgZG9lc24ndCBjaGFuZ2UgbXVjaCAob25seSAxJSkuCisgV2hvOiAgIERhdGU6IDkvMDQvMDUKKyAgICAgICAgICAgICAgICAxLiBSZXBsYWNlIEFBTiBJRENUIHdpdGggQ2hlbidzIElEQ1QgdG8gYWNjb21tb2RhdGUgMTYgYml0IGRhdGEgdHlwZS4KKworKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgImRjdC5oIgorCisjZGVmaW5lIEFERF9DTElQICAgIHsgXAorICAgICAgICAgICAgdG1wID0gKnJlYyArIHRtcDsgXAorICAgICAgICBpZigoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrJih+KHRtcD4+MzEpKTsgXAorICAgICAgICAqcmVjKysgPSB0bXA7ICAgXAorICAgICAgICB9CisKKyNkZWZpbmUgSU5UUkFfQ0xJUCAgeyBcCisgICAgICAgIGlmKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2smKH4odG1wPj4zMSkpOyBcCisgICAgICAgICpyZWMrKyA9IHRtcDsgICBcCisgICAgICAgIH0KKworCisjZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKFVJbnQpeCA+IDB4RkYpe3ggPSAweEZGICYgKH4oeD4+MzEpKTt9CisjZGVmaW5lIEFERF9BTkRfQ0xJUDEoeCkgICAgeCArPSAocHJlZF93b3JkJjB4RkYpOyBDTElQX1JFU1VMVCh4KTsKKyNkZWZpbmUgQUREX0FORF9DTElQMih4KSAgICB4ICs9ICgocHJlZF93b3JkPj44KSYweEZGKTsgQ0xJUF9SRVNVTFQoeCk7CisjZGVmaW5lIEFERF9BTkRfQ0xJUDMoeCkgICAgeCArPSAoKHByZWRfd29yZD4+MTYpJjB4RkYpOyBDTElQX1JFU1VMVCh4KTsKKyNkZWZpbmUgQUREX0FORF9DTElQNCh4KSAgICB4ICs9ICgocHJlZF93b3JkPj4yNCkmMHhGRik7IENMSVBfUkVTVUxUKHgpOworCisKK3ZvaWQgaWRjdF9jb2wwKFNob3J0ICpibGspCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGJsayk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9jb2wxKFNob3J0ICpibGspCit7CisgICAgYmxrWzBdID0gYmxrWzhdID0gYmxrWzE2XSA9IGJsa1syNF0gPSBibGtbMzJdID0gYmxrWzQwXSA9IGJsa1s0OF0gPSBibGtbNTZdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtbMF0gPDwgMzsKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3RfY29sMihTaG9ydCAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDMsIHg1LCB4NzsvLywgeDg7CisKKyAgICB4MSA9IGJsa1s4XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKyAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisKKyAgICB4NyA9IFc3ICogeDE7CisgICAgeDEgPSBXMSAqIHgxOworCisgICAgeDMgPSB4NzsKKyAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKHgwICsgeDcpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4MCArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDAgKyB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4MCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDAgLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKHgwIC0geDMpID4+IDg7CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X2NvbDMoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworCisgICAgeDIgPSBibGtbMTZdOworICAgIHgxID0gYmxrWzhdOworICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OworCisgICAgeDQgPSB4MDsKKyAgICB4NiA9IFc2ICogeDI7CisgICAgeDIgPSBXMiAqIHgyOworICAgIHg4ID0geDAgLSB4MjsKKyAgICB4MCArPSB4MjsKKyAgICB4MiA9IHg4OworICAgIHg4ID0geDQgLSB4NjsKKyAgICB4NCArPSB4NjsKKyAgICB4NiA9IHg4OworCisgICAgeDcgPSBXNyAqIHgxOworICAgIHgxID0gVzEgKiB4MTsKKyAgICB4MyA9IHg3OworICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKKyAgICBibGtbOF0gPSAoeDQgKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKHg2ICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4MiArIHgzKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKHg0IC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICh4NiAtIHg1KSA+PiA4OworICAgIGJsa1szMl0gPSAoeDIgLSB4MykgPj4gODsKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3RfY29sNChTaG9ydCAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgeDIgPSBibGtbMTZdOworICAgIHgxID0gYmxrWzhdOworICAgIHgzID0gYmxrWzI0XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKworICAgIHg0ID0geDA7CisgICAgeDYgPSBXNiAqIHgyOworICAgIHgyID0gVzIgKiB4MjsKKyAgICB4OCA9IHgwIC0geDI7CisgICAgeDAgKz0geDI7CisgICAgeDIgPSB4ODsKKyAgICB4OCA9IHg0IC0geDY7CisgICAgeDQgKz0geDY7CisgICAgeDYgPSB4ODsKKworICAgIHg3ID0gVzcgKiB4MTsKKyAgICB4MSA9IFcxICogeDE7CisgICAgeDUgPSBXMyAqIHgzOworICAgIHgzID0gLVc1ICogeDM7CisgICAgeDggPSB4MSAtIHg1OworICAgIHgxICs9IHg1OworICAgIHg1ID0geDg7CisgICAgeDggPSB4NyAtIHgzOworICAgIHgzICs9IHg3OworICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKKyAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7CisKKworICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4NCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDYgKyB4NSkgPj4gODsKKyAgICBibGtbMjRdID0gKHgyICsgeDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDQgLSB4NykgPj4gODsKKyAgICBibGtbNDBdID0gKHg2IC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4MiAtIHgzKSA+PiA4OworICAgIHJldHVybiA7Cit9CisKKyNpZm5kZWYgU01BTExfRENUCit2b2lkIGlkY3RfY29sMHg0MChTaG9ydCAqYmxrKQoreworICAgIGludDMyIHgxLCB4MywgeDUsIHg3Oy8vLCB4ODsKKworICAgIHgxID0gYmxrWzhdOworICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKworICAgIHg3ID0gVzcgKiB4MTsKKyAgICB4MSA9IFcxICogeDE7CisKKyAgICB4MyA9IHg3OworICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICBibGtbMF0gPSAoMTI4ICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKDEyOCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoMTI4ICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICgxMjggKyB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKDEyOCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoMTI4IC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICgxMjggLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKDEyOCAtIHgzKSA+PiA4OworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X2NvbDB4MjAoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MCwgeDIsIHg0LCB4NjsKKworICAgIHgyID0gYmxrWzE2XTsKKyAgICB4NiA9IFc2ICogeDI7CisgICAgeDIgPSBXMiAqIHgyOworICAgIHgwID0gMTI4ICsgeDI7CisgICAgeDIgPSAxMjggLSB4MjsKKyAgICB4NCA9IDEyOCArIHg2OworICAgIHg2ID0gMTI4IC0geDY7CisKKyAgICBibGtbMF0gPSAoeDApID4+IDg7CisgICAgYmxrWzU2XSA9ICh4MCkgPj4gODsKKyAgICBibGtbOF0gPSAoeDQpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4NCkgPj4gODsKKyAgICBibGtbMTZdID0gKHg2KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDYpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4MikgPj4gODsKKyAgICBibGtbMzJdID0gKHgyKSA+PiA4OworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X2NvbDB4MTAoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MSwgeDMsIHg1LCAgeDc7CisKKyAgICB4MyA9IGJsa1syNF07CisgICAgeDEgPSBXMyAqIHgzOworICAgIHgzID0gVzUgKiB4MzsKKworICAgIHg3ID0gKDE4MSAqICh4MyAtIHgxKSArIDEyOCkgPj4gODsKKyAgICB4NSA9ICgtMTgxICogKHgxICsgeDMpICsgMTI4KSA+PiA4OworCisKKyAgICBibGtbMF0gPSAoMTI4ICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKDEyOCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoMTI4ICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICgxMjggLSB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKDEyOCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoMTI4IC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICgxMjggLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKDEyOCArIHgzKSA+PiA4OworCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmIC8qIFNNQUxMX0RDVCAqLworCit2b2lkIGlkY3RfY29sKFNob3J0ICpibGspCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKworICAgIHgxID0gKGludDMyKWJsa1szMl0gPDwgMTE7CisgICAgeDIgPSBibGtbNDhdOworICAgIHgzID0gYmxrWzE2XTsKKyAgICB4NCA9IGJsa1s4XTsKKyAgICB4NSA9IGJsa1s1Nl07CisgICAgeDYgPSBibGtbNDBdOworICAgIHg3ID0gYmxrWzI0XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKworICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgeDggPSBXNyAqICh4NCArIHg1KTsKKyAgICB4NCA9IHg4ICsgKFcxIC0gVzcpICogeDQ7CisgICAgeDUgPSB4OCAtIChXMSArIFc3KSAqIHg1OworICAgIHg4ID0gVzMgKiAoeDYgKyB4Nyk7CisgICAgeDYgPSB4OCAtIChXMyAtIFc1KSAqIHg2OworICAgIHg3ID0geDggLSAoVzMgKyBXNSkgKiB4NzsKKworICAgIC8qIHNlY29uZCBzdGFnZSAqLworICAgIHg4ID0geDAgKyB4MTsKKyAgICB4MCAtPSB4MTsKKyAgICB4MSA9IFc2ICogKHgzICsgeDIpOworICAgIHgyID0geDEgLSAoVzIgKyBXNikgKiB4MjsKKyAgICB4MyA9IHgxICsgKFcyIC0gVzYpICogeDM7CisgICAgeDEgPSB4NCArIHg2OworICAgIHg0IC09IHg2OworICAgIHg2ID0geDUgKyB4NzsKKyAgICB4NSAtPSB4NzsKKworICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgeDcgPSB4OCArIHgzOworICAgIHg4IC09IHgzOworICAgIHgzID0geDAgKyB4MjsKKyAgICB4MCAtPSB4MjsKKyAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgYmxrWzBdICAgID0gKHg3ICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKHgzICsgeDIpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4MCArIHg0KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDggKyB4NikgPj4gODsKKyAgICBibGtbMzJdID0gKHg4IC0geDYpID4+IDg7CisgICAgYmxrWzQwXSA9ICh4MCAtIHg0KSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDMgLSB4MikgPj4gODsKKyAgICBibGtbNTZdID0gKHg3IC0geDEpID4+IDg7CisKKyAgICByZXR1cm4gOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGF0IGFsbCAqKioqLwordm9pZCBpZGN0X3JvdzBJbnRlcihTaG9ydCAqc3JjZSwgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhzcmNlKTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhyZWMpOworCisgICAgT1NDTF9VTlVTRURfQVJHKGx4KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCBpZGN0X3JvdzFJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50IHRtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdG1wID0gKCooYmxrICs9IDgpICsgMzIpID4+IDY7CisgICAgICAgICpibGsgPSAwOworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9IHRtcCArIChwcmVkX3dvcmQgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgcmVzMiA9IHRtcCArICgocHJlZF93b3JkID4+IDgpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDI0KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cySW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgKyB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKXJlYykgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MCAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwIC0geDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3czSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSB4NzsKKyAgICAgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgICAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKXJlYykgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzRJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDEgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgzID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4NSA9IChXMyAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSAoLSBXNSAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MSAtIHg1OworICAgICAgICB4MSArPSB4NTsKKyAgICAgICAgeDUgPSB4ODsKKyAgICAgICAgeDggPSB4NyAtIHgzOworICAgICAgICB4MyArPSB4NzsKKyAgICAgICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OworICAgICAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKXJlYykgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybiA7Cit9CisKKyNpZm5kZWYgU01BTExfRENUCit2b2lkIGlkY3Rfcm93MHg0MEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MSwgeDIsIHg0LCB4NTsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIGJsayArPSA4OyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7CisgICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoODE5MiArIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKDgxOTIgKyB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICg4MTkyICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoODE5MiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3cweDIwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MiwgeDQsIHg2OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgYmxrICs9IDg7IC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MCA9IDgxOTIgKyB4MjsKKyAgICAgICAgeDIgPSA4MTkyIC0geDI7CisgICAgICAgIHg0ID0gODE5MiArIHg2OworICAgICAgICB4NiA9IDgxOTIgLSB4NjsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDApID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKXJlYykgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDApID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3cweDEwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgxLCB4MywgeDUsIHg3OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MyA9IGJsa1szXTsKKyAgICAgICAgYmxrWzNdID0gMDsKKyAgICAgICAgYmxrICs9IDg7CisKKyAgICAgICAgeDEgPSAoVzMgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHgzID0gKC1XNSAqIHgzICsgNCkgPj4gMzsKKworICAgICAgICB4NyA9ICgtMTgxICogKHgzICsgeDEpICsgMTI4KSA+PiA4OworICAgICAgICB4NSA9ICgxODEgKiAoeDMgLSB4MSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopcmVjKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCisjZW5kaWYgLyogU01BTExfRENUICovCisKK3ZvaWQgaWRjdF9yb3dJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDEgPSAoaW50MzIpYmxrWzEyXSA8PCA4OworICAgICAgICBibGtbMTJdID0gMDsKKyAgICAgICAgeDIgPSBibGtbMTRdOworICAgICAgICBibGtbMTRdID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHg1ID0gYmxrWzE1XTsKKyAgICAgICAgYmxrWzE1XSA9IDA7CisgICAgICAgIHg2ID0gYmxrWzEzXTsKKyAgICAgICAgYmxrWzEzXSA9IDA7CisgICAgICAgIHg3ID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4OCA9IFc3ICogKHg0ICsgeDUpICsgNDsKKyAgICAgICAgeDQgPSAoeDggKyAoVzEgLSBXNykgKiB4NCkgPj4gMzsKKyAgICAgICAgeDUgPSAoeDggLSAoVzEgKyBXNykgKiB4NSkgPj4gMzsKKyAgICAgICAgeDggPSBXMyAqICh4NiArIHg3KSArIDQ7CisgICAgICAgIHg2ID0gKHg4IC0gKFczIC0gVzUpICogeDYpID4+IDM7CisgICAgICAgIHg3ID0gKHg4IC0gKFczICsgVzUpICogeDcpID4+IDM7CisKKyAgICAgICAgLyogc2Vjb25kIHN0YWdlICovCisgICAgICAgIHg4ID0geDAgKyB4MTsKKyAgICAgICAgeDAgLT0geDE7CisgICAgICAgIHgxID0gVzYgKiAoeDMgKyB4MikgKyA0OworICAgICAgICB4MiA9ICh4MSAtIChXMiArIFc2KSAqIHgyKSA+PiAzOworICAgICAgICB4MyA9ICh4MSArIChXMiAtIFc2KSAqIHgzKSA+PiAzOworICAgICAgICB4MSA9IHg0ICsgeDY7CisgICAgICAgIHg0IC09IHg2OworICAgICAgICB4NiA9IHg1ICsgeDc7CisgICAgICAgIHg1IC09IHg3OworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHg3ID0geDggKyB4MzsKKyAgICAgICAgeDggLT0geDM7CisgICAgICAgIHgzID0geDAgKyB4MjsKKyAgICAgICAgeDAgLT0geDI7CisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworCisgICAgICAgIHJlcyA9ICh4NyArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgzICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDAgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4OCArIHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKworICAgICAgICByZXMgPSAoeDggLSB4NikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MCAtIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgzIC0geDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDcgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBpZGN0X3JvdzBJbnRyYShTaG9ydCAqc3JjZSwgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhzcmNlKTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhyZWMpOworCisgICAgT1NDTF9VTlVTRURfQVJHKGx4KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCBpZGN0X3JvdzFJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgdG1wOworICAgIGludCBpID0gODsKKworICAgIHJlYyAtPSBseDsKKyAgICBibGsgLT0gODsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdG1wID0gKCgqKGJsayArPSA4KSArIDMyKSA+PiA2KTsKKyAgICAgICAgKmJsayA9IDA7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcCkKKworICAgICAgICB0bXAgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgdG1wIHw9ICh0bXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IHRtcDsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gdG1wOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cySW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7CisgICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICByZXMgPSAoKHgwICsgeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4MCArIHgyKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDAgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgwICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsKKworICAgICAgICByZXMgPSAoKHgwIC0geDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4MCAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDAgLSB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgwIC0geDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3czSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1sxMF07CisgICAgICAgIGJsa1sxMF0gPSAwOworICAgICAgICB4MSA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOy8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MyA9IHg3OworICAgICAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKKworICAgICAgICByZXMgPSAoKHgwICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4NCArIHg3KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDYgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgyICsgeDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsKKworICAgICAgICByZXMgPSAoKHgyIC0geDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4NiAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDQgLSB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgwIC0geDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7CisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzRJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7IC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgxIC0geDU7CisgICAgICAgIHgxICs9IHg1OworICAgICAgICB4NSA9IHg4OworICAgICAgICB4OCA9IHg3IC0geDM7CisgICAgICAgIHgzICs9IHg3OworICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKKworICAgICAgICByZXMgPSAoKHgwICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4NCArIHg3KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDYgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgyICsgeDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsKKworICAgICAgICByZXMgPSAoKHgyIC0geDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4NiAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDQgLSB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgwIC0geDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2lmbmRlZiBTTUFMTF9EQ1QKK3ZvaWQgaWRjdF9yb3cweDQwSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyICB4MSwgeDIsIHg0LCB4NTsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIGJsayArPSA4OworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcmVzID0gKCg4MTkyICsgeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCg4MTkyICsgeDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKCg4MTkyICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCg4MTkyICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsKKworICAgICAgICByZXMgPSAoKDgxOTIgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKDgxOTIgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKDgxOTIgLSB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKDgxOTIgLSB4NCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsKKworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgyMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDIsIHg0LCB4NjsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzJdOworICAgICAgICBibGtbMl0gPSAwOworICAgICAgICBibGsgKz0gODsKKworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MCA9IDgxOTIgKyB4MjsKKyAgICAgICAgeDIgPSA4MTkyIC0geDI7CisgICAgICAgIHg0ID0gODE5MiArIHg2OworICAgICAgICB4NiA9IDgxOTIgLSB4NjsKKworICAgICAgICByZXMgPSAoKHgwKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKCh4NikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKHgyKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCh4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKHg2KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsKKworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgxMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgzID0gYmxrWzNdOworICAgICAgICBibGtbM10gPSAwIDsKKyAgICAgICAgYmxrICs9IDg7CisKKyAgICAgICAgeDEgPSAoVzMgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHgzID0gKFc1ICogeDMgKyA0KSA+PiAzOworCisgICAgICAgIHg3ID0gKDE4MSAqICh4MyAtIHgxKSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoLTE4MSAqICh4MSArIHgzKSArIDEyOCkgPj4gODsKKworICAgICAgICByZXMgPSAoKDgxOTIgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKDgxOTIgKyB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKDgxOTIgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKDgxOTIgLSB4MykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOworCisgICAgICAgIHJlcyA9ICgoODE5MiArIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoODE5MiAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoODE5MiAtIHg3KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICgoODE5MiAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOworCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmIC8qIFNNQUxMX0RDVCAqLwordm9pZCBpZGN0X3Jvd0ludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICBpbnQgcmVzLCByZXMyOworICAgIHVpbnQzMiBkc3Rfd29yZDsKKworICAgIGJsayAtPSA4OworICAgIHJlYyAtPSBseDsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MSA9IChpbnQzMilibGtbMTJdIDw8IDg7CisgICAgICAgIGJsa1sxMl0gPSAwOworICAgICAgICB4MiA9IGJsa1sxNF07CisgICAgICAgIGJsa1sxNF0gPSAwOworICAgICAgICB4MyA9IGJsa1sxMF07CisgICAgICAgIGJsa1sxMF0gPSAwOworICAgICAgICB4NCA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDUgPSBibGtbMTVdOworICAgICAgICBibGtbMTVdID0gMDsKKyAgICAgICAgeDYgPSBibGtbMTNdOworICAgICAgICBibGtbMTNdID0gMDsKKyAgICAgICAgeDcgPSBibGtbMTFdOworICAgICAgICBibGtbMTFdID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7CisgICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7CisgICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7CisgICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OworICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOworICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOworCisgICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLworICAgICAgICB4OCA9IHgwICsgeDE7CisgICAgICAgIHgwIC09IHgxOworICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKKyAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKKyAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKKyAgICAgICAgeDEgPSB4NCArIHg2OworICAgICAgICB4NCAtPSB4NjsKKyAgICAgICAgeDYgPSB4NSArIHg3OworICAgICAgICB4NSAtPSB4NzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4NyA9IHg4ICsgeDM7CisgICAgICAgIHg4IC09IHgzOworICAgICAgICB4MyA9IHgwICsgeDI7CisgICAgICAgIHgwIC09IHgyOworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcmVzID0gKCh4NyArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDMgKyB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IHJlcyB8IChyZXMyIDw8IDgpOworICAgICAgICByZXMgPSAoKHgwICsgeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4OCArIHg2KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCh4OCAtIHg2KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDAgLSB4NCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IHJlcyB8IChyZXMyIDw8IDgpOworICAgICAgICByZXMgPSAoKHgzIC0geDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4NyAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhdCBhbGwgKioqKi8KK3ZvaWQgaWRjdF9yb3cwem12KFNob3J0ICpzcmNlLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhzcmNlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcocmVjKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcocHJlZCk7CisgICAgT1NDTF9VTlVTRURfQVJHKGx4KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCBpZGN0X3JvdzF6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQgdG1wOworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHByZWQgLT0gMTY7CisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRtcCA9ICgqKGJsayArPSA4KSArIDMyKSA+PiA2OworICAgICAgICAqYmxrID0gMDsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBpZGN0X3JvdzJ6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIHByZWQgLT0gMTY7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxNikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgwICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MCArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93M3ptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIHByZWQgLT0gMTY7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDEgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MyA9IHg3OworICAgICAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzR6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDUgPSAoVzMgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHgzID0gKC0gVzUgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDEgLSB4NTsKKyAgICAgICAgeDEgKz0geDU7CisgICAgICAgIHg1ID0geDg7CisgICAgICAgIHg4ID0geDcgLSB4MzsKKyAgICAgICAgeDMgKz0geDc7CisgICAgICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoMTgxICogKHg1IC0geDgpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTYpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NCArIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg2ICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDIgKyB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MiAtIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg2IC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDQgLSB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MCAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKworI2lmbmRlZiBTTUFMTF9EQ1QKK3ZvaWQgaWRjdF9yb3cweDQwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIHByZWQgLT0gMTY7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgLyogc2hvcnRjdXQgKi8KKyAgICAgICAgeDQgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIGJsayArPSA4OyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7CisgICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgyMHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MiwgeDQsIHg2OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzJdOworICAgICAgICBibGtbMl0gPSAwOworICAgICAgICBibGsgKz0gODsgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisgICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKyAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgwID0gODE5MiArIHgyOworICAgICAgICB4MiA9IDgxOTIgLSB4MjsKKyAgICAgICAgeDQgPSA4MTkyICsgeDY7CisgICAgICAgIHg2ID0gODE5MiAtIHg2OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTYpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDApID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDApID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3cweDEwem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDEsIHgzLCB4NSwgeDc7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIHByZWQgLT0gMTY7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDMgPSBibGtbM107CisgICAgICAgIGJsa1szXSA9IDA7CisgICAgICAgIGJsayArPSA4OworCisgICAgICAgIHgxID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtVzUgKiB4MyArIDQpID4+IDM7CisKKyAgICAgICAgeDcgPSAoLTE4MSAqICh4MyArIHgxKSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoMTgxICogKHgzIC0geDEpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTYpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoODE5MiArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKDgxOTIgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICg4MTkyICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoODE5MiArIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiAtIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybiA7Cit9CisKKyNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KKwordm9pZCBpZGN0X3Jvd3ptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIHByZWQgLT0gMTY7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDEgPSAoaW50MzIpYmxrWzEyXSA8PCA4OworICAgICAgICBibGtbMTJdID0gMDsKKyAgICAgICAgeDIgPSBibGtbMTRdOworICAgICAgICBibGtbMTRdID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHg1ID0gYmxrWzE1XTsKKyAgICAgICAgYmxrWzE1XSA9IDA7CisgICAgICAgIHg2ID0gYmxrWzEzXTsKKyAgICAgICAgYmxrWzEzXSA9IDA7CisgICAgICAgIHg3ID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4OCA9IFc3ICogKHg0ICsgeDUpICsgNDsKKyAgICAgICAgeDQgPSAoeDggKyAoVzEgLSBXNykgKiB4NCkgPj4gMzsKKyAgICAgICAgeDUgPSAoeDggLSAoVzEgKyBXNykgKiB4NSkgPj4gMzsKKyAgICAgICAgeDggPSBXMyAqICh4NiArIHg3KSArIDQ7CisgICAgICAgIHg2ID0gKHg4IC0gKFczIC0gVzUpICogeDYpID4+IDM7CisgICAgICAgIHg3ID0gKHg4IC0gKFczICsgVzUpICogeDcpID4+IDM7CisKKyAgICAgICAgLyogc2Vjb25kIHN0YWdlICovCisgICAgICAgIHg4ID0geDAgKyB4MTsKKyAgICAgICAgeDAgLT0geDE7CisgICAgICAgIHgxID0gVzYgKiAoeDMgKyB4MikgKyA0OworICAgICAgICB4MiA9ICh4MSAtIChXMiArIFc2KSAqIHgyKSA+PiAzOworICAgICAgICB4MyA9ICh4MSArIChXMiAtIFc2KSAqIHgzKSA+PiAzOworICAgICAgICB4MSA9IHg0ICsgeDY7CisgICAgICAgIHg0IC09IHg2OworICAgICAgICB4NiA9IHg1ICsgeDc7CisgICAgICAgIHg1IC09IHg3OworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHg3ID0geDggKyB4MzsKKyAgICAgICAgeDggLT0geDM7CisgICAgICAgIHgzID0geDAgKyB4MjsKKyAgICAgICAgeDAgLT0geDI7CisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKworICAgICAgICByZXMgPSAoeDcgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MyArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDggKyB4NikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisKKyAgICAgICAgcmVzID0gKHg4IC0geDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MyAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHg3IC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgRW5kIEZ1bmN0aW9uOiBpZGN0Y29sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQmxvY2tJRENUTW90aW9uQ29tcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTAvMTYvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBmYXN0IElEQ1Qgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW50KiBjb2VmZl9pbiAgIERlcXVhbnRpemVkIGNvZWZmaWNpZW50CisgICAgICAgIEludCBibG9ja19vdXQgICBvdXRwdXQgSURDVCBjb2VmZmljaWVudAorICAgICAgICBJbnQgbWF4dmFsICAgICAgY2xpcCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgIDcvMzEvMDEsIGFkZCBjaGVja2luZyBmb3IgYWxsLXplcm8gYW5kIERDLW9ubHkgYmxvY2suICAqLworLyogICAgICAgICAgICAgIGRvIDggY29sdW1ucyBhdCBhIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIDgvMi8wMSwgZG8gY29sdW1uIGZpcnN0IHRoZW4gcm93LUlEQ1QuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICA4LzIvMDEsIHJlbW92ZSBjbGlwcGluZyAoaW5jbHVkZWQgaW4gbW90aW9uIGNvbXApLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgOC83LzAxLCBjb21iaW5lIHdpdGggbW90aW9uIGNvbXAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIDgvOC8wMSwgdXNlIEFBTiBJRENUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgOS80LzA1LCB1c2UgQ2hlbidzIElEQ1QgYW5kIDE2IGJpdCBibG9jayAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit2b2lkIEJsb2NrSURDVE1vdGlvbkNvbXAoU2hvcnQgKmJsb2NrLCBVQ2hhciAqYml0bWFwY29sLCBVQ2hhciBiaXRtYXByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHhfaW50cmEpCit7CisgICAgSW50IGk7CisgICAgSW50IHRtcCwgdG1wMjsKKyAgICBVTG9uZyB0bXA0OworICAgIEludCBibWFwOworICAgIFNob3J0ICpwdHIgPSBibG9jazsKKyAgICBVQ2hhciAqZW5kY29sOworICAgIFVJbnQgbWFzayA9IDB4RkY7CisgICAgSW50IGx4ID0gbHhfaW50cmEgPj4gMTsKKyAgICBJbnQgaW50cmEgPSAobHhfaW50cmEgJiAxKTsKKworICAgIC8qICBhbGwtemVybyBibG9jayAqLworICAgIGlmIChkY3RNb2RlID09IDAgfHwgYml0bWFwcm93ID09IDApCisgICAgeworICAgICAgICBpZiAoaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgICooKFVMb25nKilyZWMpID0gKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IDA7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY29weSBmcm9tIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgICooKFVMb25nKilyZWMpID0gKigoVUxvbmcqKXByZWQpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gKigoVUxvbmcqKShwcmVkICs9IDE2KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJlZCArIDQpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAqKChVTG9uZyopKHByZWQgKz0gMTYpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9ICooKFVMb25nKikocHJlZCArPSAxNikpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gKigoVUxvbmcqKShwcmVkICs9IDE2KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJlZCArIDQpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAqKChVTG9uZyopKHByZWQgKz0gMTYpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9ICooKFVMb25nKikocHJlZCArPSAxNikpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gKigoVUxvbmcqKShwcmVkICs9IDE2KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJlZCArIDQpKTsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUZXN0IGZvciBEQyBvbmx5IGJsb2NrICovCisgICAgaWYgKGRjdE1vZGUgPT0gMSB8fCAoYml0bWFwcm93ID09IDB4ODAgJiYgYml0bWFwY29sWzBdID09IDB4ODApKQorICAgIHsKKyAgICAgICAgaSA9ICgoYmxvY2tbMF0gPDwgMykgKyAzMikgPj4gNjsKKyAgICAgICAgYmxvY2tbMF0gPSAwOworICAgICAgICBpZiAoaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoVUludClpID4gbWFzaykgaSA9IG1hc2sgJiAofihpID4+IDMxKSk7CisKKyAgICAgICAgICAgIHRtcCA9IGkgfCAoaSA8PCA4KTsKKyAgICAgICAgICAgIHRtcCB8PSAodG1wIDw8IDE2KTsKKworICAgICAgICAgICAgKigoVUxvbmcqKXJlYykgPSAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDsKKworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuZGNvbCA9IHJlYyArIChseCA8PCAzKTsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wNCA9ICooKFVMb25nKilwcmVkKTsKKyAgICAgICAgICAgICAgICB0bXAyID0gdG1wNCAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wMiArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAyID4gbWFzaykgdG1wMiA9IG1hc2sgJiAofih0bXAyID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wID0gKHRtcDQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wMiB8PSAodG1wIDw8IDgpOworICAgICAgICAgICAgICAgIHRtcCA9ICh0bXA0ID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IGk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0bXAyIHw9ICh0bXAgPDwgMTYpOworICAgICAgICAgICAgICAgIHRtcCA9ICh0bXA0ID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IGk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0bXAyIHw9ICh0bXAgPDwgMjQpOworICAgICAgICAgICAgICAgICooKFVMb25nKilyZWMpID0gdG1wMjsKKworICAgICAgICAgICAgICAgIHRtcDQgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAgICAgdG1wMiA9IHRtcDQgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcDIgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wMiA+IG1hc2spIHRtcDIgPSBtYXNrICYgKH4odG1wMiA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcCA9ICh0bXA0ID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcDIgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAodG1wNCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wMiB8PSAodG1wIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAodG1wNCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wMiB8PSAodG1wIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHRtcDI7CisKKyAgICAgICAgICAgICAgICByZWMgKz0gbHg7CisgICAgICAgICAgICAgICAgcHJlZCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZWMgPCBlbmRjb2wpOworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkY3RNb2RlOyBpKyspCisgICAgeworICAgICAgICBibWFwID0gKEludCliaXRtYXBjb2xbaV07CisgICAgICAgIGlmIChibWFwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGJtYXAmMHhmKSA9PSAwKQorICAgICAgICAgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcD4+NF0pKShwdHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlkY3RfY29sKHB0cik7CisgICAgICAgIH0KKyAgICAgICAgcHRyKys7CisgICAgfQorCisgICAgaWYgKChiaXRtYXByb3cmMHhmKSA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgKCooaWRjdHJvd1ZDQUludHJhWyhJbnQpKGJpdG1hcHJvdz4+NCldKSkoYmxvY2ssIHJlYywgbHgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKihpZGN0cm93VkNBem12WyhJbnQpKGJpdG1hcHJvdz4+NCldKSkoYmxvY2ssIHJlYywgcHJlZCwgbHgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICBpZGN0X3Jvd0ludHJhKGJsb2NrLCByZWMsIGx4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWRjdF9yb3d6bXYoYmxvY2ssIHJlYywgcHJlZCwgbHgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmNlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnQuY3BwCkBAIC0wLDAgKzEsOTY3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJmYXN0cXVhbnRfaW5saW5lLmgiCisKKyNkZWZpbmUgc2l6IDYzCisjZGVmaW5lIExTTCAxOAorCisKK2NvbnN0IHN0YXRpYyBVQ2hhciBpbWFza1s4XSA9IHsxMjgsIDY0LCAzMiwgMTYsIDgsIDQsIDIsIDF9OworI2RlZmluZSBTSUdOMChhKSAgICAgICAgKCAoKGEpPDApID8gLTEgOiAoKChhKT4wKSA/IDEgIDogMCkgKQorCisvKiB2YXJpYWJsZSBiaXQgcHJlY2lzaW9uIHF1YW50aXphdGlvbiBzY2FsZSAqLworLyogdXNlZCB0byBhdm9pZCB1c2luZyAzMi1iaXQgbXVsdGlwbGljYXRpb24gKi8KK2NvbnN0IHN0YXRpYyBTaG9ydCBzY2FsZUFycmF5VlszMl0gPSB7MCwgMTYzODQsIDgxOTIsIDU0NjIsICAvKiAxNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAzMjc3LCAyNzMxLCAyMzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAzNjQxLCAzMjc3LCAyOTc5LCAgLyogMTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjczMSwgMjUyMSwgMjM0MSwgMjE4NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzg1NiwgMzY0MSwgMzQ1MCwgIC8qIDE3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNzcsIDMxMjEsIDI5NzksIDI4NTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NjIsIDUyNDMsIDUwNDIsIDQ4NTUsICAvKiAxOCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjgyLCA0NTIwLCA0MzcwLCA0MjI5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyogc2NhbGUgZm9yIGRjX3NjYWxlciBhbmQgcW1hdCwgbm90ZSwgbm8gdmFsdWUgc21hbGxlciB0aGFuIDggKi8KK2NvbnN0IHN0YXRpYyBTaG9ydCBzY2FsZUFycmF5VjJbNDddID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8qIDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAzNjQxLCAzMjc3LCAyOTc5LCAyNzMxLCAyNTIxLCAyMzQxLCAyMTg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzg1NiwgMzY0MSwgMzQ1MCwgMzI3NywgMzEyMSwgMjk3OSwgMjg1MCwgIC8qIDE2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzMxLCAyNjIyLCAyNTIxLCAyNDI4LCAyMzQxLCAyMjYwLCAyMTg1LCAyMTE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzk3MiwgMzg1NiwgMzc0NSwgMzY0MSwgMzU0MywgMzQ1MCwgMzM2MSwgIC8qIDE3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjc3LCAzMTk3LCAzMTIxLCAzMDQ5LCAyOTc5LCAyOTEzLCAyODUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIEFBTiBzY2FsZSBhbmQgemlnemFnICovCitjb25zdCBzdGF0aWMgU2hvcnQgQUFOU2NhbGVbNjRdID0KK3sKKyAgICAvKiAwICovIDB4MTAwMCwgMHgwQjg5LCAweDBDM0UsIDB4MEQ5QiwgMHgxMDAwLCAweDBBMkUsIDB4MEVDOCwgMHgwRTdGLAorICAgIC8qIDEgKi8gMHgwQjg5LCAweDA4NTEsIDB4MDhENCwgMHgwOUNGLCAweDBCODksIDB4MDc1NywgMHgwQUE4LCAweDBBNzMsCisgICAgLyogMiAqLyAweDBDM0UsIDB4MDhENCwgMHgwOTVGLCAweDBBNkEsIDB4MEMzRSwgMHgwN0NCLCAweDBCNTAsIDB4MEIxOCwKKyAgICAvKiAzICovIDB4MEQ5QiwgMHgwOUNGLCAweDBBNkEsIDB4MEI5MiwgMHgwRDlCLCAweDA4QTgsIDB4MEM5MiwgMHgwQzU0LAorICAgIC8qIDQgKi8gMHgxMDAwLCAweDBCODksIDB4MEMzRSwgMHgwRDlCLCAweDEwMDAsIDB4MEEyRSwgMHgwRUM4LCAweDBFN0YsCisgICAgLyogNSAqLyAweDBBMkUsIDB4MDc1NywgMHgwN0NCLCAweDA4QTgsIDB4MEEyRSwgMHgwNjdBLCAweDA5NjgsIDB4MDkzOSwKKyAgICAvKiA2ICovIDB4MEVDOCwgMHgwQUE4LCAweDBCNTAsIDB4MEM5MiwgMHgwRUM4LCAweDA5NjgsIDB4MERBOCwgMHgwRDY0LAorICAgIC8qIDcgKi8gMHgwRTdGLCAweDBBNzMsIDB4MEIxOCwgMHgwQzU0LCAweDBFN0YsIDB4MDkzOSwgMHgwRDY0LCAweDBEMjMKK307CisKK2NvbnN0IHN0YXRpYyBVU2hvcnQgWlpUYWJbNjRdID0KK3sKKyAgICAvKiAwICovIDB4MCwgMHgyLCAweEEsIDB4QywgMHgxQywgMHgxRSwgMHgzNiwgMHgzOCwKKyAgICAvKiAxICovIDB4NCwgMHg4LCAweEUsIDB4MUEsIDB4MjAsIDB4MzQsIDB4M0EsIDB4NTQsCisgICAgLyogMiAqLyAweDYsIDB4MTAsIDB4MTgsIDB4MjIsIDB4MzIsIDB4M0MsIDB4NTIsIDB4NTYsCisgICAgLyogMyAqLyAweDEyLCAweDE2LCAweDI0LCAweDMwLCAweDNFLCAweDUwLCAweDU4LCAweDZBLAorICAgIC8qIDQgKi8gMHgxNCwgMHgyNiwgMHgyRSwgMHg0MCwgMHg0RSwgMHg1QSwgMHg2OCwgMHg2QywKKyAgICAvKiA1ICovIDB4MjgsIDB4MkMsIDB4NDIsIDB4NEMsIDB4NUMsIDB4NjYsIDB4NkUsIDB4NzgsCisgICAgLyogNiAqLyAweDJBLCAweDQ0LCAweDRBLCAweDVFLCAweDY0LCAweDcwLCAweDc2LCAweDdBLAorICAgIC8qIDcgKi8gMHg0NiwgMHg0OCwgMHg2MCwgMHg2MiwgMHg3MiwgMHg3NCwgMHg3QywgMHg3RQorfTsKKworCisvL1RhbyBuZWVkIHRvIHJlbW92ZSwgd3JpdGUgYW5vdGhlciB2ZXJzaW9uIG9mIGFicworLy8jaW5jbHVkZSA8bWF0aC5oPgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IGNhbF9kY19zY2FsZXJFTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDEvMjUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBjYWxjdWxhdGlvbiBvZiBEQyBxdWFudGl6YXRpb24gc2NhbGUgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICAgICAgICAgaW5jb21pbmcgUSBhbmQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW50IFFwICAgICAgUXVhbnRpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBEQyBTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0ludCBjYWxfZGNfc2NhbGVyRU5DKEludCBRUCwgSW50IHR5cGUpCit7CisKKyAgICBJbnQgZGNfc2NhbGVyOworICAgIGlmICh0eXBlID09IDEpCisgICAgeworICAgICAgICBpZiAoUVAgPiAwICYmIFFQIDwgNSkKKyAgICAgICAgICAgIGRjX3NjYWxlciA9IDg7CisgICAgICAgIGVsc2UgaWYgKFFQID4gNCAmJiBRUCA8IDkpCisgICAgICAgICAgICBkY19zY2FsZXIgPSAyICogUVA7CisgICAgICAgIGVsc2UgaWYgKFFQID4gOCAmJiBRUCA8IDI1KQorICAgICAgICAgICAgZGNfc2NhbGVyID0gUVAgKyA4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBkY19zY2FsZXIgPSAyICogUVAgLSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKFFQID4gMCAmJiBRUCA8IDUpCisgICAgICAgICAgICBkY19zY2FsZXIgPSA4OworICAgICAgICBlbHNlIGlmIChRUCA+IDQgJiYgUVAgPCAyNSkKKyAgICAgICAgICAgIGRjX3NjYWxlciA9IChRUCArIDEzKSAvIDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRjX3NjYWxlciA9IFFQIC0gNjsKKyAgICB9CisgICAgcmV0dXJuIGRjX3NjYWxlcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogQmxja1F1YW50RGVxdWFudEgyNjMKKyBEYXRlOiAgICAgSnVuZSAxNSwgMTk5OQorIFB1cnBvc2U6ICBDb21iaW5lIEJsb2NrUXVhbnRIMjYzIGFuZCBCbG9ja0RlcXVhbnRIMjYzRU5DCisgSW5wdXQ6ICAgY29lZmY9PiBEQ1QgY29lZmZpY2llbnQKKyBPdXRwdXQ6ICBxY29lZmY9PiBxdWFudGl6ZWQgY29lZmZpY2llbnQKKyAgICAgICAgICByY29lZmY9PiByZWNvbnN0cnVjdGVkIGNvZWZmaWNpZW50CisgICAgICAgICAgcmV0dXJuIENCUCBmb3IgdGhpcyBibG9jaworICAgICAgICAgIDQvMi8wMSwgIGNvcnJlY3QgZGNfc2NhbGVyIGZvciBzaG9ydF9oZWFkZXIgbW9kZS4KKyAgICAgICAgICA1LzE0LzAxLAorICAgICAgICAgIGNoYW5nZWQgdGhlIGRpdmlzaW9uIGludG8gTFVUIG11bHRpcGxpY2F0aW9uL3NoaWZ0IGFuZCBvdGhlcgorICAgICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gc3BlZWQgdXAgZmFzdFF1YW50L0RlUXVhbnQgKGNoZWNrIGZvciB6ZXJvIDFzdCwgcm93cSBMVVQsCisgICAgICAgICAgZmFzdCBiaXRtYXByb3cgbWFzayBhbmQgYm9ycm93ZWQgQWRkaXRpb24gbWV0aG9kIGluc3RlYWQgb2YgaWZzIGZyb20gLCApLgorICAgICAgICAgIDYvMjUvMDEsCisgICAgICAgICAgRnVydGhlciBvcHRpbWl6YXRpb24gKH4xMDBLL1FDSUYpLCBuZWVkIG1vcmUgdGVzdGluZy9jb21tZW50IGJlZm9yZSBpbnRlZ3JhdGlvbi4KKworICAgICAgICAgIDcvNC8wMSwgIGJyZWFrIHVwIEludGVyIC8gSW50cmEgZnVuY3Rpb24gYW5kIG1lcmdlIGZvciBkaWZmZXJlbnQgY2FzZXMuCisgICAgICAgICAgNy8yMi8wMSwgIGNvbWJpbmUgQUFOIHNjYWxpbmcgaGVyZSBhbmQgcmVvcmRlcmluZy4KKyAgICAgICAgICA3LzI0LzAxLCAsIHJlb3JkZXIgYWxyZWFkeSBkb25lIGluIEZEQ1QsIHRoZSBpbnB1dCBoZXJlIGlzIGluIHRoZSBuZXh0IGJsb2NrIGFuZAorICAgICAgICAgICAgaXQncyB0aGUKKyAgICAgICAgICAgIHRyYW5zcG9zZSBvZiB0aGUgcmFzdGVyIHNjYW4uIE91dHB1dCB0aGUgc2FtZSBvcmRlciAoZm9yIHByb29mIG9mIGNvbmNlbnB0KS4KKyAgICAgICAgICA4LzEvMDEsICwgY2hhbmdlIEZEQ1QgdG8gZG8gcm93L2NvbHVtbiBGRENUIHdpdGhvdXQgcmVvcmRlcmluZywgaW5wdXQgaXMgc3RpbGwKKyAgICAgICAgICAgIGluIHRoZSBuZXh0IGJsb2NrLiBUaGUgcmVjb25zdHJ1Y3RlZCBEQ1Qgb3V0cHV0IGlzIGN1cnJlbnQgYmxvY2sgaW4gbm9ybWFsCisgICAgICAgICAgICBvcmRlci4gVGhlIHF1YW50aXplZCBvdXRwdXQgaXMgaW4gemlnemFnIHNjYW4gb3JkZXIgZm9yIElOVEVSLCByb3cvY29sdW1uIGZvcgorICAgICAgICAgICAgSU5UUkEuIFVzZSBiaXRtYXB6eiBmb3IgemlnemFnIFJ1bkxldmVsIGZvciBJTlRFUi4gIFRoZSBxdWFudGl6YXRpb24gaXMgZG9uZQorICAgICAgICAgICAgaW4gY29sdW1uL3JvdyBzY2FubmluZyBvcmRlci4KKyAgICAgICAgICA4LzIvMDEsICwgY2hhbmdlIElEQ1QgdG8gZG8gY29sdW1uL3JvdywgY2hhbmdlIGJpdG1hcHJvdy9jb2wgdG8gdGhlIG9wcG9zaXRlLgorICAgICAgICAgIDgvMy8wMSwgLCBhZGQgY2xpcHBpbmcgdG8gdGhlIHJlY29uc3RydWN0ZWQgY29lZmZpY2llbnQgWy0yMDQ3LDIwNDddCisgICAgICAgICAgOS80LzA1LCAsIHJlbW92ZWQgc2NhbGluZyBmb3IgQUFOIElEQ1QsIHVzZSBDaGVuIElEQ1QgaW5zdGVhZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0ludGVyKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGR1bW15LCBVQ2hhciBzaG9ydEhlYWRlcikKK3sKKyAgICBJbnQgaSwgeno7CisgICAgSW50IHRtcCwgY29lZmYsIHFfdmFsdWU7CisgICAgSW50IFFQZGl2MiA9IFF1YW50UGFyYW0tPlFQZGl2MjsKKyAgICBJbnQgUVB4MiA9IFF1YW50UGFyYW0tPlFQeDI7CisgICAgSW50IEFkZGl0aW9uID0gUXVhbnRQYXJhbS0+QWRkaXRpb247CisgICAgSW50IFFQeDJwbHVzID0gUXVhbnRQYXJhbS0+UVB4MnBsdXM7CisgICAgSW50IHJvdW5kID0gMSA8PCAxNTsKKyAgICBJbnQgcV9zY2FsZSA9IHNjYWxlQXJyYXlWW1F1YW50UGFyYW0tPlFQXTsKKyAgICBJbnQgc2hpZnQgPSAxNSArIChRUHgyID4+IDQpOworICAgIEludCAqdGVtcDsKKyAgICBVQ2hhciAqYmNvbHB0ciA9IGJpdG1hcGNvbDsKKyAgICBJbnQgYWNfY2xpcDsgICAgLyogcXVhbnRpemVkIGNvZWZmIGJvdW5kICovCisKKyAgICBPU0NMX1VOVVNFRF9BUkcoY29tcCk7CisgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15KTsKKworCisgICAgaWYgKHNob3J0SGVhZGVyKSBhY19jbGlwID0gMTI2OyAvKiBjbGlwIGJldHdlZW4gWy0xMjcsMTI2XSAoc3RhbmRhcmQgYWxsb3dzIDEyNyEpICovCisgICAgZWxzZSBhY19jbGlwID0gMjA0NzsgIC8qIGNsaXAgYmV0d2VlbiBbLTIwNDgsMjA0N10gKi8KKworICAgIC8qIHJlc2V0IGFsbCBiaXRtYXAgdG8gemVybyAqLworICAgIHRlbXAgPSAoSW50KikgYml0bWFwY29sOworICAgIHRlbXBbMF0gPSB0ZW1wWzFdID0gMDsKKyAgICBiaXRtYXB6elswXSA9IGJpdG1hcHp6WzFdID0gMDsKKyAgICAqYml0bWFwcm93ID0gMDsKKyAgICBRUHgycGx1cyA8PD0gNDsKKyAgICBRUHgycGx1cyAtPSA4OworCisgICAgcmNvZWZmICs9IDY0OyAvKiBhY3R1YWwgZGF0YSBpcyA2NCBpdGVtIGFoZWFkICovCisgICAgLy9lbmQgID0gcmNvZWZmICsgZGN0TW9kZSAtIDE7CisgICAgLy9yY29lZmYtLTsKKyAgICBiY29scHRyLS07CisgICAgaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYmNvbHB0cisrOworICAgICAgICAvL3Jjb2VmZisrOworICAgICAgICAvL2k9MDsKKyAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgIGlmIChjb2VmZiA9PSAweDdmZmYpIC8qIGFsbCB6ZXJvIGNvbHVtbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykgIC8qIHF1YW50aXplIHRvIHplcm8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgaWYgKGkgPCAoZGN0TW9kZSA8PCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoY29lZmYgPiAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykgIC8qIHF1YW50aXplIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIE5PTlpFUk8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKK05PTlpFUk8xOgorICAgICAgICAgICAgICAgIC8qIHNjYWxpbmcgKi8KKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gQUFOU2NhbGVbaV07ICAvKiBsb2FkIHNjYWxlIEFBTiAqLworICAgICAgICAgICAgICAgIHp6ID0gWlpUYWJbaV07ICAvKiB6aWd6YWcgb3JkZXIgKi8KKworICAgICAgICAgICAgICAgIGNvZWZmID0gYWFuX3NjYWxlKHFfdmFsdWUsIGNvZWZmLCByb3VuZCwgUVBkaXYyKTsKKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gY29lZmZfcXVhbnQoY29lZmYsIHFfc2NhbGUsIHNoaWZ0KTsKKworICAgICAgICAgICAgICAgIC8qIGRlcXVhbnRpemF0aW9uICAqLworICAgICAgICAgICAgICAgIGlmIChxX3ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAvL2NvZWZmID0gUFZfTUlOKGFjX2NsaXAsUFZfTUFYKC1hY19jbGlwLTEsIHFfdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmX2NsaXAocV92YWx1ZSwgYWNfY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHFjb2VmZlt6ej4+MV0gPSBxX3ZhbHVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlcXVhbnQgYW5kIGNsaXAKKyAgICAgICAgICAgICAgICAgICAgLy9jb2VmZiA9IFBWX01JTigyMDQ3LFBWX01BWCgtMjA0OCwgcV92YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSAyMDQ3OworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IGNvZWZmX2RlcXVhbnQocV92YWx1ZSwgUVB4MiwgQWRkaXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHJjb2VmZltpLTY0XSA9IGNvZWZmOworCisgICAgICAgICAgICAgICAgICAgICgqYmNvbHB0cikgfD0gaW1hc2tbaT4+M107CisgICAgICAgICAgICAgICAgICAgIGlmICgoenogPj4gMSkgPiAzMSkgYml0bWFwenpbMV0gfD0gKDEgPDwgKDYzIC0gKHp6ID4+IDEpKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIGJpdG1hcHp6WzBdIHw9ICgxIDw8ICgzMSAtICh6eiA+PiAxKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGkgPCAoZGN0TW9kZSA8PCAzKSk7CisKKyAgICAgICAgaSArPSAoMSAtIChkY3RNb2RlIDw8IDMpKTsKKyAgICB9CisgICAgd2hpbGUgKGkgPCBkY3RNb2RlKSA7CisKKyAgICBpID0gZGN0TW9kZTsKKyAgICB0bXAgPSAxIDw8ICg4IC0gaSk7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIGlmIChiaXRtYXBjb2xbaV0pKCpiaXRtYXByb3cpIHw9IHRtcDsKKyAgICAgICAgdG1wIDw8PSAxOworICAgIH0KKworICAgIGlmICgqYml0bWFwcm93KQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIEludCBjb21wLCBJbnQgZGNfc2NhbGVyLCBVQ2hhciBzaG9ydEhlYWRlcikKK3sKKyAgICBJbnQgaTsKKyAgICBJbnQgdG1wLCBjb2VmZiwgcV92YWx1ZTsKKyAgICBJbnQgUVB4MiA9IFF1YW50UGFyYW0tPlFQeDI7CisgICAgSW50IEFkZGl0aW9uID0gUXVhbnRQYXJhbS0+QWRkaXRpb247CisgICAgSW50IFFQeDJwbHVzID0gUXVhbnRQYXJhbS0+UVB4MnBsdXM7CisgICAgSW50IHJvdW5kID0gMSA8PCAxNTsKKyAgICBJbnQgcV9zY2FsZSA9IHNjYWxlQXJyYXlWW1F1YW50UGFyYW0tPlFQXTsKKyAgICBJbnQgc2hpZnQgPSAxNSArIChRUHgyID4+IDQpOworICAgIFVDaGFyICpibWNvbHB0ciA9IGJpdG1hcGNvbDsKKyAgICBJbnQgYWNfY2xpcDsgICAgLyogcXVhbnRpemVkIGNvZWZmIGJvdW5kICovCisKKyAgICBPU0NMX1VOVVNFRF9BUkcoYml0bWFwenopOworICAgIE9TQ0xfVU5VU0VEX0FSRyhjb21wKTsKKworCisgICAgaWYgKHNob3J0SGVhZGVyKSBhY19jbGlwID0gMTI2OyAvKiBjbGlwIGJldHdlZW4gWy0xMjcsMTI2XSAoc3RhbmRhcmQgYWxsb3dzIDEyNyEpICovCisgICAgZWxzZSBhY19jbGlwID0gMjA0NzsgIC8qIGNsaXAgYmV0d2VlbiBbLTIwNDgsMjA0N10gKi8KKworICAgICooKEludCopYml0bWFwY29sKSA9ICooKEludCopKGJpdG1hcGNvbCArIDQpKSA9IDA7CisgICAgKmJpdG1hcHJvdyA9IDA7CisKKyAgICBRUHgycGx1cyA9IFFQeDIgPDwgNDsKKyAgICBRUHgycGx1cyAtPSA4OworCisgICAgcmNvZWZmICs9IDY0OyAvKiBhY3R1YWwgZGF0YSBpcyA2NCBlbGVtZW50IGFoZWFkICovCisgICAgaSA9IDA7CisKKyAgICAvKiBEQyB2YWx1ZSAqLworICAgIGNvZWZmID0gKnJjb2VmZjsKKyAgICAvKiBzY2FsaW5nICovCisgICAgaWYgKGNvZWZmID09IDB4N2ZmZiAmJiAhc2hvcnRIZWFkZXIpIC8qIGFsbCB6ZXJvIGNvbHVtbiAqLworICAgIHsKKyAgICAgICAgYm1jb2xwdHIrKzsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoY29lZmYgPT0gMHg3ZmZmKSAvKiBzaG9ydEhlYWRlciBvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBjb2VmZiA9IDE7IC8qIGNhbid0IGJlIHplcm8gKi8KKyAgICAgICAgICAgIHFjb2VmZlswXSA9IGNvZWZmOworICAgICAgICAgICAgY29lZmYgPSBjb2VmZiAqIGRjX3NjYWxlcjsKKyAgICAgICAgICAgIGNvZWZmID0gUFZfTUFYKC0yMDQ4LCBQVl9NSU4oMjA0NywgY29lZmYpKTsKKyAgICAgICAgICAgIHJjb2VmZlstNjRdID0gY29lZmY7CisgICAgICAgICAgICBiaXRtYXBjb2xbMF0gfD0gMTI4OworICAgICAgICAgICAgYm1jb2xwdHIrKzsKKyAgICAgICAgICAgIC8vcWNvZWZmKys7CisgICAgICAgICAgICAvL3Jjb2VmZisrOworICAgICAgICAgICAgLy9pPTA7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBxX3ZhbHVlID0gcm91bmQgKyAoY29lZmYgPDwgMTIpOworICAgICAgICAgICAgY29lZmYgPSBxX3ZhbHVlID4+IDE2OworICAgICAgICAgICAgaWYgKGNvZWZmID49IDApIGNvZWZmICs9IChkY19zY2FsZXIgPj4gMSkgOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChkY19zY2FsZXIgPj4gMSkgOworICAgICAgICAgICAgcV92YWx1ZSA9IHNjYWxlQXJyYXlWMltkY19zY2FsZXJdOworICAgICAgICAgICAgY29lZmYgPSBjb2VmZiAqIHFfdmFsdWU7CisgICAgICAgICAgICBjb2VmZiA+Pj0gKDE1ICsgKGRjX3NjYWxlciA+PiA0KSk7CisgICAgICAgICAgICBjb2VmZiArPSAoKFVJbnQpY29lZmYgPj4gMzEpOworCisgICAgICAgICAgICBpZiAoc2hvcnRIZWFkZXIpCisgICAgICAgICAgICAgICAgY29lZmYgPSBQVl9NQVgoMSwgUFZfTUlOKDI1NCwgY29lZmYpKTsKKworICAgICAgICAgICAgaWYgKGNvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHFjb2VmZlswXSA9IGNvZWZmOworICAgICAgICAgICAgICAgIGNvZWZmID0gY29lZmYgKiBkY19zY2FsZXI7CisgICAgICAgICAgICAgICAgY29lZmYgPSBQVl9NQVgoLTIwNDgsIFBWX01JTigyMDQ3LCBjb2VmZikpOworICAgICAgICAgICAgICAgIHJjb2VmZlstNjRdID0gY29lZmY7CisgICAgICAgICAgICAgICAgYml0bWFwY29sWzBdIHw9IDEyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBBQyB2YWx1ZXMgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgIGlmIChjb2VmZiA9PSAweDdmZmYpIC8qIGFsbCB6ZXJvIHJvdyAqLworICAgICAgICB7CisgICAgICAgICAgICBibWNvbHB0cisrOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvZWZmID49IC1RUHgycGx1cyAmJiBjb2VmZiA8IFFQeDJwbHVzKSAgLyogcXVhbnRpemUgdG8gemVybyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IGRjdE1vZGUgPDwgMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoY29lZmYgPiAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykgIC8qIHF1YW50aXplIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIE5PTlpFUk8yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKK05PTlpFUk8yOiAgIC8qIHNjYWxpbmcgKi8KKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gQUFOU2NhbGVbaV07IC8qICAwOS8wMi8wNSAqLworCisgICAgICAgICAgICAgICAgLyogc2NhbGUgYWFuICovCisgICAgICAgICAgICAgICAgcV92YWx1ZSA9IHNtbGFiYihxX3ZhbHVlLCBjb2VmZiwgcm91bmQpOworICAgICAgICAgICAgICAgIGNvZWZmID0gcV92YWx1ZSA+PiAxNjsKKyAgICAgICAgICAgICAgICAvKiBxdWFudCAqLworICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBzbXVsYmIocV9zY2FsZSwgY29lZmYpOyAvKm1vdiAgICAgcV92YWx1ZSwgY29lZmYsIGxzbCAjMTQgKi8KKyAgICAgICAgICAgICAgICAvKnNtdWxsIHRtcCwgY29lZmYsIHFfdmFsdWUsIHFfc2NhbGUqLworICAgICAgICAgICAgICAgIHFfdmFsdWUgPj49IHNoaWZ0OworICAgICAgICAgICAgICAgIHFfdmFsdWUgKz0gKChVSW50KXFfdmFsdWUgPj4gMzEpOyAvKiBhZGQgMSBpZiBuZWdhdGl2ZSAqLworCisgICAgICAgICAgICAgICAgaWYgKHFfdmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2NvZWZmID0gUFZfTUlOKGFjX2NsaXAsUFZfTUFYKC1hY19jbGlwLTEsIHFfdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmX2NsaXAocV92YWx1ZSwgYWNfY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHFjb2VmZltpXSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVxdWFudCBhbmQgY2xpcAorICAgICAgICAgICAgICAgICAgICAvL2NvZWZmID0gUFZfTUlOKDIwNDcsUFZfTUFYKC0yMDQ4LCBxX3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IDIwNDc7CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gY29lZmZfZGVxdWFudChxX3ZhbHVlLCBRUHgyLCBBZGRpdGlvbiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmNvZWZmW2ktNjRdID0gY29lZmY7CisKKyAgICAgICAgICAgICAgICAgICAgKCpibWNvbHB0cikgfD0gaW1hc2tbaT4+M107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaSA8IChkY3RNb2RlIDw8IDMpKSA7CisKKyAgICAgICAgLy9xY29lZmYrKzsgLyogbmV4dCBjb2x1bW4gKi8KKyAgICAgICAgYm1jb2xwdHIrKzsKKyAgICAgICAgLy9yY29lZmYrKzsKKyAgICAgICAgaSArPSAoMSAtIChkY3RNb2RlIDw8IDMpKTsgLy9pID0gMDsKKyAgICB9CisgICAgd2hpbGUgKGkgPCBkY3RNb2RlKTsvL3doaWxlKHJjb2VmZiA8IGVuZCkgOworCisgICAgaSA9IGRjdE1vZGU7CisgICAgdG1wID0gMSA8PCAoOCAtIGkpOworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBpZiAoYml0bWFwY29sW2ldKSgqYml0bWFwcm93KSB8PSB0bXA7CisgICAgICAgIHRtcCA8PD0gMTsKKyAgICB9CisKKyAgICBpZiAoKCgqYml0bWFwcm93KSYxMjcpIHx8IChiaXRtYXBjb2xbMF0mMTI3KSkgLyogZXhjbHVkZSBEQyAqLworICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiBCbGNrUXVhbnREZXF1YW50SDI2M0RDCisgRGF0ZTogICAgIDUvMy8yMDAxCisgUHVycG9zZTogICBILjI2MyBxdWFudGl6YXRpb24gbW9kZSwgb25seSBmb3IgREMgY29tcG9uZW50CisgNi8yNS8wMSwKKyAgICAgICAgICBGdXJ0aGVyIG9wdGltaXphdGlvbiAofjEwMEsvUUNJRiksIG5lZWQgbW9yZSB0ZXN0aW5nL2NvbW1lbnQgYmVmb3JlIGludGVncmF0aW9uLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGR1bW15LCBVQ2hhciBzaG9ydEhlYWRlcikKK3sKKyAgICBJbnQgY29lZmYsIHNjYWxlX3E7CisgICAgSW50IENCUCA9IDA7CisgICAgSW50IFFQID0gUXVhbnRQYXJhbS0+UVA7CisgICAgSW50IFFQeDJwbHVzID0gUXVhbnRQYXJhbS0+UVB4MnBsdXM7CisgICAgSW50IEFkZGl0aW9uID0gUXVhbnRQYXJhbS0+QWRkaXRpb247CisgICAgSW50IHNoaWZ0ID0gMTUgKyAoUVAgPj4gMyk7CisgICAgSW50IGFjX2NsaXA7ICAgIC8qIHF1YW50aXplZCBjb2VmZiBib3VuZCAqLworICAgIEludCB0bXA7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZHVtbXkpOworCisgICAgaWYgKHNob3J0SGVhZGVyKSBhY19jbGlwID0gMTI2OyAvKiBjbGlwIGJldHdlZW4gWy0xMjcsMTI2XSAoc3RhbmRhcmQgYWxsb3dzIDEyNyEpICovCisgICAgZWxzZSBhY19jbGlwID0gMjA0NzsgIC8qIGNsaXAgYmV0d2VlbiBbLTIwNDgsMjA0N10gKi8KKworICAgICpiaXRtYXByb3cgPSAwOworICAgIGJpdG1hcHp6WzBdID0gYml0bWFwenpbMV0gPSAwOworICAgIGNvZWZmID0gcmNvZWZmWzBdOworCisgICAgaWYgKGNvZWZmID49IC1RUHgycGx1cyAmJiBjb2VmZiA8IFFQeDJwbHVzKQorICAgIHsKKyAgICAgICAgcmNvZWZmWzBdID0gMDsKKyAgICAgICAgcmV0dXJuIENCUDsvL3Jjb2VmZlswXSA9IDA7IG5vdCBuZWVkZWQgc2luY2UgQ0JQIHdpbGwgYmUgemVybworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzY2FsZV9xID0gc2NhbGVBcnJheVZbUVBdOworCisgICAgICAgIGNvZWZmID0gYWFuX2RjX3NjYWxlKGNvZWZmLCBRUCk7CisKKyAgICAgICAgc2NhbGVfcSA9IGNvZWZmX3F1YW50KGNvZWZmLCBzY2FsZV9xLCBzaGlmdCk7CisKKyAgICAgICAgLy9jb2VmZiA9IFBWX01JTihhY19jbGlwLFBWX01BWCgtYWNfY2xpcC0xLCB0bXApKTsKKyAgICAgICAgc2NhbGVfcSA9IGNvZWZmX2NsaXAoc2NhbGVfcSwgYWNfY2xpcCk7CisKKyAgICAgICAgcWNvZWZmWzBdID0gc2NhbGVfcTsKKworICAgICAgICBRUCA8PD0gMTsKKyAgICAgICAgLy9jb2VmZiA9IFBWX01JTigyMDQ3LFBWX01BWCgtMjA0OCwgdG1wKSk7CisgICAgICAgIHRtcCA9IDIwNDc7CisgICAgICAgIGNvZWZmID0gY29lZmZfZGVxdWFudChzY2FsZV9xLCBRUCwgQWRkaXRpb24sIHRtcCk7CisKKyAgICAgICAgcmNvZWZmWzBdID0gY29lZmY7CisKKyAgICAgICAgKCpiaXRtYXByb3cpID0gMTI4OworICAgICAgICBiaXRtYXB6elswXSA9IChVTG9uZykxIDw8IDMxOworICAgICAgICBDQlAgPSAxOworICAgIH0KKyAgICByZXR1cm4gQ0JQOworfQorCisKK0ludCBCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZGNfc2NhbGVyLCBVQ2hhciBzaG9ydEhlYWRlcikKK3sKKyAgICBJbnQgdG1wLCBjb2VmZjsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhRdWFudFBhcmFtKTsKKworICAgICpiaXRtYXByb3cgPSAwOworICAgIGNvZWZmID0gcmNvZWZmWzBdOworCisgICAgaWYgKGNvZWZmID49IDApIGNvZWZmICs9IChkY19zY2FsZXIgPj4gMSkgOworICAgIGVsc2UgICAgICAgICAgICBjb2VmZiAtPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICB0bXAgPSBzY2FsZUFycmF5VjJbZGNfc2NhbGVyXTsKKyAgICB0bXAgPSBjb2VmZiAqIHRtcDsKKyAgICB0bXAgPj49ICgxNSArIChkY19zY2FsZXIgPj4gNCkpOworICAgIHRtcCArPSAoKFVJbnQpdG1wID4+IDMxKTsKKworICAgIGlmIChzaG9ydEhlYWRlcikKKyAgICAgICAgdG1wID0gUFZfTUFYKDEsIFBWX01JTigyNTQsIHRtcCkpOworCisgICAgaWYgKHRtcCkKKyAgICB7CisgICAgICAgIHFjb2VmZlswXSA9IHRtcDsKKyAgICAgICAgY29lZmYgPSB0bXAgKiBkY19zY2FsZXI7CisgICAgICAgIGNvZWZmID0gUFZfTUFYKC0yMDQ4LCBQVl9NSU4oMjA0NywgY29lZmYpKTsKKyAgICAgICAgcmNvZWZmWzBdID0gY29lZmY7CisgICAgICAgICpiaXRtYXByb3cgPSAxMjg7CisgICAgICAgIGJpdG1hcHp6WzBdID0gKFVMb25nKTEgPDwgMzE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTk9fTVBFR19RVUFOVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246IEJsY2tRdWFudERlcXVhbnRNUEVHCisgRGF0ZTogICAgIEp1bmUgMTUsIDE5OTkKKyBQdXJwb3NlOiAgQ29tYmluZSBCbG9ja1F1YW50TVBFRyBhbmQgQmxvY2tEZXF1YW50TVBFR0VOQworIElucHV0OiAgIGNvZWZmPT4gRENUIGNvZWZmaWNpZW50CisgT3V0cHV0OiAgcWNvZWZmPT4gcXVhbnRpemVkIGNvZWZmaWNpZW50CisgICAgICAgICAgcmNvZWZmPT4gcmVjb25zdHJ1Y3RlZCBjb2VmZmljaWVudAorIE1vZGlmaWVkOiAgNy81LzAxLCBicmVhayB1cCBmdW5jdGlvbiBmb3IgSW50cmEvSW50ZXIKKyAgICAgICAgICA4LzMvMDEsICB1cGRhdGUgd2l0aCBjaGFuZ2VzIGZyb20gSDI2MyBxdWFudCBtb2RlLgorICAgICAgICAgIDgvMy8wMSwgIGFkZCBjbGlwcGluZyB0byB0aGUgcmVjb25zdHJ1Y3RlZCBjb2VmZmljaWVudCBbLTIwNDgsMjA0N10KKyAgICAgICAgICA4LzYvMDEsICBvcHRpbWl6ZSB1c2luZyBtdWx0aXBsaWNhdGl2ZSBsb29rdXAtdGFibGUuCisgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZnVydGhlciBvcHRpbWl6ZWQgdXNpbmcgQVJNIGFzc2VtYmx5LCBlLmcuLAorICAgICAgICAgICAgICAgICAgICAgY2xpcHBpbmcsIDE2LWJpdCBtdWx0LiwgZXRjICEhISEhISEhISEhISEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0ludGVyKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIEludCBjb21wLCBJbnQgZGNfc2NhbGVyKQoreworICAgIEludCBpLCB6ejsKKyAgICBJbnQgdG1wLCBjb2VmZiwgcV92YWx1ZSA9IDA7CisgICAgSW50IHN1bSA9IDA7CisgICAgSW50IHN0ZXBzaXplLCBRUHgyID0gUVAgPDwgMTsKKyAgICBJbnQgQ0JQID0gMDsKKyAgICBJbnQgcm91bmQgPSAxIDw8IDE1OworICAgIEludCBxX3NjYWxlID0gc2NhbGVBcnJheVZbUVBdOworICAgIEludCBzaGlmdCA9IDE1ICsgKFFQID4+IDMpOworICAgIFVDaGFyICpiY29scHRyID0gYml0bWFwY29sOworCisgICAgT1NDTF9VTlVTRURfQVJHKGRjX3NjYWxlcik7CisgICAgT1NDTF9VTlVTRURfQVJHKGNvbXApOworCisKKyAgICAqKChJbnQqKWJpdG1hcGNvbCkgPSAqKChJbnQqKShiaXRtYXBjb2wgKyA0KSkgPSAwOworICAgIGJpdG1hcHp6WzBdID0gYml0bWFwenpbMV0gPSAwOworICAgICpiaXRtYXByb3cgPSAwOworCisgICAgcmNvZWZmICs9IDY0OworICAgIGkgPSAwOworICAgIGJjb2xwdHItLTsKKworICAgIGRvCisgICAgeworICAgICAgICBiY29scHRyKys7CisgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICBpZiAoY29lZmYgPT0gMHg3ZmZmKSAvKiBhbGwgemVybyBjb2x1bW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcV92YWx1ZSA9IEFBTlNjYWxlW2ldOyAgLyogIDA5LzAyLzA1IHNjYWxpbmcgZm9yIEFBTiovCisgICAgICAgICAgICAvKiBhYW4gc2NhbGluZyAqLworICAgICAgICAgICAgcV92YWx1ZSA9IHNtbGFiYihxX3ZhbHVlLCBjb2VmZiwgcm91bmQpOworCisgICAgICAgICAgICBjb2VmZiA9IHFfdmFsdWUgPj4gMTY7CisKKyAgICAgICAgICAgIHN0ZXBzaXplID0gcW1hdFtpXTsKKy8vICAgICAgICAgIGlmKGNvZWZmPjApICAgICBjb2VmZiA9ICgxNipjb2VmZiArIChzdGVwc2l6ZS8yKSkgLyBzdGVwc2l6ZTsKKy8vICAgICAgICAgIGVsc2UgICAgICAgICAgICBjb2VmZiA9ICgxNipjb2VmZiAtIChzdGVwc2l6ZS8yKSkgLyBzdGVwc2l6ZTsKKyAgICAgICAgICAgIGNvZWZmIDw8PSA0OworICAgICAgICAgICAgaWYgKGNvZWZmID49IDApIGNvZWZmICs9IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gKHN0ZXBzaXplID4+IDEpIDsKKyAgICAgICAgICAgIHFfdmFsdWUgPSBzY2FsZUFycmF5VjJbc3RlcHNpemVdOworICAgICAgICAgICAgLyogbXBlZyBxdWFudCB0YWJsZSBzY2FsZSAqLworICAgICAgICAgICAgY29lZmYgPSBzbXVsYmIoY29lZmYsIHFfdmFsdWUpOworCisgICAgICAgICAgICBjb2VmZiA+Pj0gKDE1ICsgKHN0ZXBzaXplID4+IDQpKTsKKyAgICAgICAgICAgIGNvZWZmICs9ICgoVUludCljb2VmZiA+PiAzMSk7CisKKyAgICAgICAgICAgIC8qIFFQIHNjYWxlICovCisgICAgICAgICAgICBpZiAoY29lZmYgPj0gLVFQeDIgJiYgY29lZmYgPCBRUHgyKSAgLyogcXVhbnRpemVkIHRvIHplcm8qLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICBxX3ZhbHVlID0gY29lZmYvKFFQeDIpOworICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9xdWFudChjb2VmZiwgcV9zY2FsZSwgc2hpZnQpOworCisgICAgICAgICAgICAgICAgaWYgKHFfdmFsdWUpICAgICAgICAgICAgICAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgenogPSBaWlRhYltpXTsgIC8qIHppZ3phZyBvcmRlciAqLworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IDIwNDc7CisKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNsaXBfMjA0NyhxX3ZhbHVlLCB0bXApOworCisgICAgICAgICAgICAgICAgICAgIHFjb2VmZlt6ej4+MV0gPSBxX3ZhbHVlOworCisgICAgICAgICAgICAgICAgICAgIC8vcV92YWx1ZT0oKChjb2VmZioyKStTSUdOMChjb2VmZikpKnN0ZXBzaXplKlFQKS8xNjsKKyAgICAgICAgICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgU0lHTjAsIG5vIHplcm8gY29taW5nIGluIHRoaXMge30gKi8KKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmX2RlcXVhbnRfbXBlZyhxX3ZhbHVlLCBzdGVwc2l6ZSwgUVAsIHRtcCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmNvZWZmW2ktNjRdID0gcV92YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcV92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKCpiY29scHRyKSB8PSBpbWFza1tpPj4zXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh6eiA+PiAxKSA+IDMxKSBiaXRtYXB6elsxXSB8PSAoMSA8PCAoNjMgLSAoenogPj4gMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgYml0bWFwenpbMF0gfD0gKDEgPDwgKDMxIC0gKHp6ID4+IDEpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpIDwgKGRjdE1vZGUgPDwgMykpIDsKKworICAgICAgICBpICs9ICgxIC0gKGRjdE1vZGUgPDwgMykpOworICAgIH0KKyAgICB3aGlsZSAoaSA8IGRjdE1vZGUpIDsKKworICAgIGkgPSBkY3RNb2RlOworICAgIHRtcCA9IDEgPDwgKDggLSBpKTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcGNvbFtpXSkoKmJpdG1hcHJvdykgfD0gdG1wOworICAgICAgICB0bXAgPDw9IDE7CisgICAgfQorCisgICAgaWYgKCpiaXRtYXByb3cpCisgICAgICAgIENCUCA9IDE7ICAgLyogY2hlY2sgQ0JQIGJlZm9yZSBtaXNtYXRjaCBjb250cm9sLCAgNy81LzAxICovCisKKyAgICAvKiBNaXNtYXRjaCBjb250cm9sLCAgNS8zLzAxICovCisgICAgaWYgKENCUCkKKyAgICB7CisgICAgICAgIGlmICgoc3VtJjB4MSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmNvZWZmLS07ICAvKiByY29lZmZbNjNdICovCisgICAgICAgICAgICBjb2VmZiA9ICpyY29lZmY7CisgICAgICAgICAgICBjb2VmZiBePSAweDE7CisgICAgICAgICAgICAqcmNvZWZmID0gY29lZmY7CisgICAgICAgICAgICBpZiAoY29lZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYml0bWFwY29sWzddIHw9IDE7CisgICAgICAgICAgICAgICAgKCpiaXRtYXByb3cpIHw9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ0JQOworfQorCitJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIpCit7CisgICAgSW50IGk7CisgICAgSW50IHRtcCwgY29lZmYsIHFfdmFsdWUgPSAwOworICAgIEludCBzdW0gPSAwOworICAgIEludCBzdGVwc2l6ZTsKKyAgICBJbnQgQ0JQID0gMDsKKyAgICBJbnQgcm91bmQgPSAxIDw8IDE1OworICAgIEludCBxX3NjYWxlID0gc2NhbGVBcnJheVZbUVBdOworICAgIEludCBzaGlmdCA9IDE1ICsgKFFQID4+IDMpOworICAgIEludCByb3VuZDIgPSAoMyAqIFFQICsgMikgPj4gMjsKKyAgICBJbnQgUVB4MnBsdXMgPSAoUVAgPDwgMSkgLSByb3VuZDI7CisgICAgVUNoYXIgKmJtY29scHRyID0gYml0bWFwY29sOworCisgICAgT1NDTF9VTlVTRURfQVJHKGJpdG1hcHp6KTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoY29tcCk7CisKKyAgICAqKChJbnQqKWJpdG1hcGNvbCkgPSAqKChJbnQqKShiaXRtYXBjb2wgKyA0KSkgPSAwOworICAgICpiaXRtYXByb3cgPSAwOworCisgICAgcmNvZWZmICs9IDY0OworICAgIGkgPSAwOworCisgICAgLyogREMgdmFsdWUgKi8KKyAgICBjb2VmZiA9ICpyY29lZmY7CisKKyAgICBpZiAoY29lZmYgPT0gMHg3ZmZmKSAvKiBhbGwgemVybyBjb2x1bW4gKi8KKyAgICB7CisgICAgICAgIGJtY29scHRyKys7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcV92YWx1ZSA9IHJvdW5kICsgKGNvZWZmIDw8IDEyKTsKKyAgICAgICAgY29lZmYgPSBxX3ZhbHVlID4+IDE2OworICAgICAgICAvKmlmIChjb2VmZiA+PSAwKSAgIGNvZWZmID0gKGNvZWZmICsgKGRjX3NjYWxlci8yKSkgLyBkY19zY2FsZXI7CisgICAgICAgIGVsc2UgICAgICAgICAgICBjb2VmZiA9IChjb2VmZiAtIChkY19zY2FsZXIvMikpIC8gZGNfc2NhbGVyOyovCisgICAgICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICAgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChkY19zY2FsZXIgPj4gMSkgOworICAgICAgICBxX3ZhbHVlID0gc2NhbGVBcnJheVYyW2RjX3NjYWxlcl07CisKKyAgICAgICAgLyogbXBlZyBxdWFudCB0YWJsZSBzY2FsZSAqLworICAgICAgICBjb2VmZiA9IHNtdWxiYihjb2VmZiwgcV92YWx1ZSk7CisKKyAgICAgICAgY29lZmYgPj49ICgxNSArIChkY19zY2FsZXIgPj4gNCkpOworICAgICAgICBjb2VmZiArPSAoKFVJbnQpY29lZmYgPj4gMzEpOworCisgICAgICAgIGlmIChjb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgY29lZmYgPSBQVl9NQVgoMSwgUFZfTUlOKDI1NCwgY29lZmYpKTsKKyAgICAgICAgICAgIHFjb2VmZlswXSA9IGNvZWZmOworCisgICAgICAgICAgICBjb2VmZiA9IHNtdWxiYihjb2VmZiwgZGNfc2NhbGVyKTsKKworICAgICAgICAgICAgcV92YWx1ZSA9IGNsaXBfMjA0Nyhjb2VmZiwgMjA0Nyk7CisKKyAgICAgICAgICAgIHN1bSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgIHJjb2VmZlstNjRdID0gcV92YWx1ZTsKKworICAgICAgICAgICAgYml0bWFwY29sWzBdIHw9IDEyODsKKyAgICAgICAgfQorICAgICAgICBpICs9IDg7CisgICAgfQorICAgIC8qIEFDIHZhbHVlcyAqLworICAgIGRvCisgICAgeworICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgaWYgKGNvZWZmID09IDB4N2ZmZikgLyogYWxsIHplcm8gcm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGJtY29scHRyKys7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICAvKiBzY2FsaW5nICovCisgICAgICAgICAgICBxX3ZhbHVlID0gQUFOU2NhbGVbaV07IC8qICAwOS8wMi8wNSAqLworCisgICAgICAgICAgICAvKiBxX3ZhbHVlID0gY29lZmYqcV92YWx1ZSArIHJvdW5kICovCisgICAgICAgICAgICBxX3ZhbHVlID0gc21sYWJiKGNvZWZmLCBxX3ZhbHVlLCByb3VuZCk7CisgICAgICAgICAgICBjb2VmZiA9IHFfdmFsdWUgPj4gMTY7CisKKyAgICAgICAgICAgIHN0ZXBzaXplID0gcW1hdFtpXTsKKyAgICAgICAgICAgIC8qaWYoY29lZmY+MCkgICAgICAgY29lZmYgPSAoMTYqY29lZmYgKyAoc3RlcHNpemUvMikpIC8gc3RlcHNpemU7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgY29lZmYgPSAoMTYqY29lZmYgLSAoc3RlcHNpemUvMikpIC8gc3RlcHNpemU7Ki8KKyAgICAgICAgICAgIGNvZWZmIDw8PSA0OworICAgICAgICAgICAgaWYgKGNvZWZmID49IDApIGNvZWZmICs9IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gKHN0ZXBzaXplID4+IDEpIDsKKyAgICAgICAgICAgIHFfdmFsdWUgPSBzY2FsZUFycmF5VjJbc3RlcHNpemVdOworCisgICAgICAgICAgICAvKiBzY2FsZSBtcGVnIHF1YW50ICovCisgICAgICAgICAgICBjb2VmZiA9IHNtdWxiYihjb2VmZiwgcV92YWx1ZSk7CisKKyAgICAgICAgICAgIGNvZWZmID4+PSAoMTUgKyAoc3RlcHNpemUgPj4gNCkpOworICAgICAgICAgICAgY29lZmYgKz0gKChVSW50KWNvZWZmID4+IDMxKTsKKworICAgICAgICAgICAgaWYgKGNvZWZmID49IC1RUHgycGx1cyAmJiBjb2VmZiA8IFFQeDJwbHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3FfdmFsdWUgPSAoIGNvZWZmICsgU0lHTjAoY29lZmYpKigoMypRUCsyKS80KSkvKDIqUVApOworICAgICAgICAgICAgICAgIGlmIChjb2VmZiA+IDApIGNvZWZmICs9IHJvdW5kMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2VmZiA8IDApIGNvZWZmIC09IHJvdW5kMjsKKworICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBzbXVsYmIoY29lZmYsIHFfc2NhbGUpOworICAgICAgICAgICAgICAgIHFfdmFsdWUgPj49IHNoaWZ0OworICAgICAgICAgICAgICAgIHFfdmFsdWUgKz0gKChVSW50KXFfdmFsdWUgPj4gMzEpOworCisgICAgICAgICAgICAgICAgaWYgKHFfdmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSAyMDQ3OworICAgICAgICAgICAgICAgICAgICBxX3ZhbHVlID0gY2xpcF8yMDQ3KHFfdmFsdWUsIHRtcCk7CisKKyAgICAgICAgICAgICAgICAgICAgcWNvZWZmW2ldID0gcV92YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICBzdGVwc2l6ZSA9IHNtdWxiYihzdGVwc2l6ZSwgUVApOworICAgICAgICAgICAgICAgICAgICBxX3ZhbHVlID0gIHNtdWxiYihxX3ZhbHVlLCBzdGVwc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmX2RlcXVhbnRfbXBlZ19pbnRyYShxX3ZhbHVlLCB0bXApOworICAgICAgICAgICAgICAgICAgICAvL3FfdmFsdWUgPSAoY29lZmYqc3RlcHNpemUqUVAqMikvMTY7CisKKyAgICAgICAgICAgICAgICAgICAgcmNvZWZmW2ktNjRdID0gcV92YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcV92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKCpibWNvbHB0cikgfD0gaW1hc2tbaT4+M107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpIDwgKGRjdE1vZGUgPDwgMykpIDsKKworICAgICAgICBibWNvbHB0cisrOworICAgICAgICBpICs9ICgxIC0gKGRjdE1vZGUgPDwgMykpOworICAgIH0KKyAgICB3aGlsZSAoaSA8IGRjdE1vZGUpIDsKKworICAgIGkgPSBkY3RNb2RlOworICAgIHRtcCA9IDEgPDwgKDggLSBpKTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcGNvbFtpXSkoKmJpdG1hcHJvdykgfD0gdG1wOworICAgICAgICB0bXAgPDw9IDE7CisgICAgfQorCisgICAgaWYgKCgoKmJpdG1hcHJvdykgJjEyNykgfHwgKGJpdG1hcGNvbFswXSYxMjcpKQorICAgICAgICBDQlAgPSAxOyAgLyogY2hlY2sgQ0JQIGJlZm9yZSBtaXNtYXRjaCBjb250cm9sLCAgNy81LzAxICovCisKKyAgICAvKiBNaXNtYXRjaCBjb250cm9sLCAgNS8zLzAxICovCisgICAgaWYgKENCUCB8fCBiaXRtYXBjb2xbMF0pCisgICAgeworICAgICAgICBpZiAoKHN1bSYweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjb2VmZi0tOyAgLyogcmNvZWZmWzYzXSAqLworICAgICAgICAgICAgY29lZmYgPSAqcmNvZWZmOworICAgICAgICAgICAgY29lZmYgXj0gMHgxOworICAgICAgICAgICAgKnJjb2VmZiA9IGNvZWZmOworICAgICAgICAgICAgaWYgKGNvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcGNvbFs3XSB8PSAxOworICAgICAgICAgICAgICAgICgqYml0bWFwcm93KSB8PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENCUDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogQmxja1F1YW50RGVxdWFudE1QRUdEQworIERhdGU6ICAgICA1LzMvMjAwMQorIFB1cnBvc2U6ICBNUEVHIFF1YW50L0RlcXVhbnQgZm9yIERDIG9ubHkgYmxvY2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHRENJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkdW1teSkKK3sKKyAgICBJbnQgcV92YWx1ZSwgY29lZmYsIHN0ZXBzaXplOworICAgIEludCBDQlAgPSAwOworICAgIEludCBxX3NjYWxlID0gc2NhbGVBcnJheVZbUVBdOworICAgIEludCBzaGlmdCA9IDE1ICsgKFFQID4+IDMpOworICAgIEludCBRUHgyID0gUVAgPDwgMTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teSk7CisKKyAgICAqKChJbnQqKWJpdG1hcGNvbCkgPSAqKChJbnQqKShiaXRtYXBjb2wgKyA0KSkgPSAwOworICAgICpiaXRtYXByb3cgPSAwOworICAgIGJpdG1hcHp6WzBdID0gYml0bWFwenpbMV0gPSAwOworICAgIGNvZWZmID0gcmNvZWZmWzBdOworICAgIHN0ZXBzaXplID0gcW1hdFswXTsKKworICAgIC8qaWYoY29lZmY+MCkgICAgICAgY29lZmYgPSAoMTYqY29lZmYgKyAoc3RlcHNpemUvMikpIC8gc3RlcHNpemU7CisgICAgZWxzZSAgICAgICAgICAgIGNvZWZmID0gKDE2KmNvZWZmIC0gKHN0ZXBzaXplLzIpKSAvIHN0ZXBzaXplOyovCisgICAgY29lZmYgPDw9IDQ7CisgICAgaWYgKGNvZWZmID49IDApIGNvZWZmICs9IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgcV92YWx1ZSA9IHNjYWxlQXJyYXlWMltzdGVwc2l6ZV07CisKKyAgICBjb2VmZiA9IHNtdWxiYihjb2VmZiwgcV92YWx1ZSk7CisKKyAgICBjb2VmZiA+Pj0gKDE1ICsgKHN0ZXBzaXplID4+IDQpKTsKKyAgICBjb2VmZiArPSAoKFVJbnQpY29lZmYgPj4gMzEpOworCisgICAgaWYgKGNvZWZmID49IC1RUHgyICYmIGNvZWZmIDwgUVB4MikKKyAgICB7CisgICAgICAgIHJjb2VmZlswXSA9IDA7CisgICAgICAgIHJldHVybiBDQlA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisvLyAgICAgIHFfdmFsdWUgPSBjb2VmZi8oUVB4Mik7CisgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9xdWFudChjb2VmZiwgcV9zY2FsZSwgc2hpZnQpOworCisgICAgICAgIGlmIChxX3ZhbHVlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8vUFZfTUlOKDIwNDcsUFZfTUFYKC0yMDQ4LCBxX3ZhbHVlKSk7CisgICAgICAgICAgICBxX3ZhbHVlID0gY2xpcF8yMDQ3KHFfdmFsdWUsIDIwNDcpOworICAgICAgICAgICAgcWNvZWZmWzBdID0gcV92YWx1ZTsKKyAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9kZXF1YW50X21wZWcocV92YWx1ZSwgc3RlcHNpemUsIFFQLCAyMDQ3KTsKKyAgICAgICAgICAgIC8vcV92YWx1ZT0oKChjb2VmZioyKStTSUdOMChjb2VmZikpKnN0ZXBzaXplKlFQKS8xNjsKKyAgICAgICAgICAgIHJjb2VmZlswXSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgIGJpdG1hcGNvbFswXSA9IDEyODsKKyAgICAgICAgICAgICgqYml0bWFwcm93KSA9IDEyODsKKyAgICAgICAgICAgIGJpdG1hcHp6WzBdID0gKFVJbnQpMSA8PCAzMTsKKyAgICAgICAgICAgIENCUCA9IDE7CisKKyAgICAgICAgICAgIC8qIE1pc21hdGNoIGNvbnRyb2wsICA1LzMvMDEgKi8KKyAgICAgICAgICAgIGlmICgocV92YWx1ZSYweDEpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNvZWZmWzYzXSA9IDE7IC8qIGFmdGVyIHNjYWxpbmcgaXQgcmVtYWlucyB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgIGJpdG1hcGNvbFs3XSB8PSAxOworICAgICAgICAgICAgICAgICgqYml0bWFwcm93KSB8PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDQlA7Cit9CisKKworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0RDSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjX3NjYWxlcikKK3sKKyAgICBJbnQgdG1wLCBjb2VmZiwgcV92YWx1ZTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhRUCk7CisgICAgT1NDTF9VTlVTRURfQVJHKHFtYXQpOworCisKKyAgICAqKChJbnQqKWJpdG1hcGNvbCkgPSAqKChJbnQqKShiaXRtYXBjb2wgKyA0KSkgPSAwOworICAgICpiaXRtYXByb3cgPSAwOworICAgIGNvZWZmID0gcmNvZWZmWzBdOworCisgICAgLyppZiAoY29lZmYgPj0gMCkgICB0bXAgPSAoY29lZmYgKyBkY19zY2FsZXIvMikgLyBkY19zY2FsZXI7CisgICAgZWxzZSAgICAgICAgICAgIHRtcCA9IChjb2VmZiAtIGRjX3NjYWxlci8yKSAvIGRjX3NjYWxlcjsqLworICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gKGRjX3NjYWxlciA+PiAxKSA7CisgICAgdG1wID0gc2NhbGVBcnJheVYyW2RjX3NjYWxlcl07CisKKyAgICB0bXAgPSBzbXVsYmIodG1wLCBjb2VmZik7CisgICAgdG1wID4+PSAoMTUgKyAoZGNfc2NhbGVyID4+IDQpKTsKKyAgICB0bXAgKz0gKChVSW50KXRtcCA+PiAzMSk7CisKKyAgICBpZiAodG1wKQorICAgIHsKKyAgICAgICAgY29lZmYgPSBQVl9NQVgoMSwgUFZfTUlOKDI1NCwgdG1wKSk7CisgICAgICAgIHFjb2VmZlswXSA9IGNvZWZmOworCisgICAgICAgIHFfdmFsdWUgPSBzbXVsYmIoY29lZmYsIGRjX3NjYWxlcik7CisgICAgICAgIHFfdmFsdWUgPSBjbGlwXzIwNDcocV92YWx1ZSwgMjA0Nyk7CisgICAgICAgIHJjb2VmZlswXSA9IHFfdmFsdWU7CisgICAgICAgIGJpdG1hcGNvbFswXSA9IDEyODsKKyAgICAgICAgKmJpdG1hcHJvdyA9IDEyODsKKyAgICAgICAgYml0bWFwenpbMF0gPSAoVUludCkxIDw8IDMxOworCisgICAgICAgIC8qIE1pc21hdGNoIGNvbnRyb2wsICA1LzMvMDEgKi8KKyAgICAgICAgaWYgKChxX3ZhbHVlJjB4MSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmNvZWZmWzYzXSA9IDE7IC8qIGFmdGVyIHNjYWxpbmcgaXQgcmVtYWlucyB0aGUgc2FtZSAqLworICAgICAgICAgICAgYml0bWFwY29sWzddIHw9IDE7CisgICAgICAgICAgICAoKmJpdG1hcHJvdykgfD0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQwZWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oCkBAIC0wLDAgKzEsNjI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaWxlbmFtZTogZmFzdHF1YW50X2lubGluZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBmb3IgaW4tbGluZSBmdW5jdGlvbnMgdXNlZCBpbiBkY3QuY3BwICAgICAgICAgICAqLworLyogIE1vZGlmaWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0ZBU1RRVUFOVF9JTkxJTkVfSF8KKyNkZWZpbmUgX0ZBU1RRVUFOVF9JTkxJTkVfSF8KKworI2luY2x1ZGUgIm1wNGRlZi5oIgorCisjaWYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNSkgJiYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNCkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworX19pbmxpbmUgaW50MzIgYWFuX3NjYWxlKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLCBpbnQzMiByb3VuZCwgaW50MzIgUVBkaXYyKQoreworICAgIHFfdmFsdWUgPSBjb2VmZiAqIHFfdmFsdWUgKyByb3VuZDsKKyAgICBjb2VmZiA9IHFfdmFsdWUgPj4gMTY7CisgICAgaWYgKGNvZWZmIDwgMCkgIGNvZWZmICs9IFFQZGl2MjsKKyAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gUVBkaXYyOworCisgICAgcmV0dXJuIGNvZWZmOworfQorCisKK19faW5saW5lIGludDMyIGNvZWZmX3F1YW50KGludDMyIGNvZWZmLCBpbnQzMiBxX3NjYWxlLCBpbnQzMiBzaGlmdCkKK3sKKyAgICBpbnQzMiBxX3ZhbHVlOworCisgICAgcV92YWx1ZSA9IGNvZWZmICogcV9zY2FsZTsgICAgICAvL3FfdmFsdWUgPSAtKCgtKGNvZWZmICsgUVBkaXYyKSpxX3NjYWxlKT4+TFNMKTsKKyAgICBxX3ZhbHVlID4+PSBzaGlmdDsgICAgICAgICAgICAgICAgICAvL3FfdmFsdWUgPSAoKChjb2VmZiAtIFFQZGl2MikqcV9zY2FsZSk+PkxTTCApOworICAgIHFfdmFsdWUgKz0gKChVSW50KXFfdmFsdWUgPj4gMzEpOyAvKiBhZGQgb25lIGlmIG5lZ2F0aXZlICovCisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgIGNvZWZmX2NsaXAoaW50MzIgcV92YWx1ZSwgaW50MzIgYWNfY2xpcCkKK3sKKyAgICBpbnQzMiBjb2VmZiA9IHFfdmFsdWUgKyBhY19jbGlwOworCisgICAgaWYgKChVSW50KWNvZWZmID4gKFVJbnQpKGFjX2NsaXAgPDwgMSkpCisgICAgICAgIHFfdmFsdWUgPSBhY19jbGlwIF4ocV92YWx1ZSA+PiAzMSk7CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudChpbnQzMiBxX3ZhbHVlLCBpbnQzMiBRUHgyLCBpbnQzMiBBZGRpdGlvbiwgaW50MzIgdG1wKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgT1NDTF9VTlVTRURfQVJHKHRtcCk7CisKKyAgICBpZiAocV92YWx1ZSA8IDApCisgICAgeworICAgICAgICBjb2VmZiA9IHFfdmFsdWUgKiBRUHgyIC0gQWRkaXRpb247CisgICAgICAgIGlmIChjb2VmZiA8IC0yMDQ4KQorICAgICAgICAgICAgY29lZmYgPSAtMjA0ODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29lZmYgPSBxX3ZhbHVlICogUVB4MiArIEFkZGl0aW9uOworICAgICAgICBpZiAoY29lZmYgPiAyMDQ3KQorICAgICAgICAgICAgY29lZmYgPSAyMDQ3OworICAgIH0KKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIHNtbGFiYihpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwgaW50MzIgcm91bmQpCit7CisgICAgcV92YWx1ZSA9IGNvZWZmICogcV92YWx1ZSArIHJvdW5kOworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIHNtdWxiYihpbnQzMiBxX3NjYWxlLCBpbnQzMiBjb2VmZikKK3sKKyAgICBpbnQzMiBxX3ZhbHVlOworCisgICAgcV92YWx1ZSA9IGNvZWZmICogcV9zY2FsZTsKKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBhYW5fZGNfc2NhbGUoaW50MzIgY29lZmYsIGludDMyIFFQKQoreworCisgICAgaWYgKGNvZWZmIDwgMCkgIGNvZWZmICs9IChRUCA+PiAxKTsKKyAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gKFFQID4+IDEpOworCisgICAgcmV0dXJuIGNvZWZmOworfQorCitfX2lubGluZSBpbnQzMiBjbGlwXzIwNDcoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyh0bXApOworCisgICAgaWYgKHFfdmFsdWUgPCAtMjA0OCkKKyAgICB7CisgICAgICAgIHFfdmFsdWUgPSAtMjA0ODsKKyAgICB9CisgICAgZWxzZSBpZiAocV92YWx1ZSA+IDIwNDcpCisgICAgeworICAgICAgICBxX3ZhbHVlID0gMjA0NzsKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudF9tcGVnKGludDMyIHFfdmFsdWUsIGludDMyIHN0ZXBzaXplLCBpbnQzMiBRUCwgaW50MzIgdG1wKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgT1NDTF9VTlVTRURfQVJHKHRtcCk7CisKKyAgICBjb2VmZiA9IHFfdmFsdWUgPDwgMTsKKyAgICBzdGVwc2l6ZSAqPSBRUDsKKyAgICBpZiAoY29lZmYgPiAwKQorICAgIHsKKyAgICAgICAgcV92YWx1ZSA9IChjb2VmZiArIDEpICogc3RlcHNpemU7CisgICAgICAgIHFfdmFsdWUgPj49IDQ7CisgICAgICAgIGlmIChxX3ZhbHVlID4gMjA0NykgcV92YWx1ZSA9IDIwNDc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFfdmFsdWUgPSAoY29lZmYgLSAxKSAqIHN0ZXBzaXplOworICAgICAgICBxX3ZhbHVlICs9IDE1OworICAgICAgICBxX3ZhbHVlID4+PSA0OworICAgICAgICBpZiAocV92YWx1ZSA8IC0yMDQ4KSAgICBxX3ZhbHVlID0gLTIwNDg7CisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnRfbXBlZ19pbnRyYShpbnQzMiBxX3ZhbHVlLCBpbnQzMiB0bXApCit7CisgICAgT1NDTF9VTlVTRURfQVJHKHRtcCk7CisKKyAgICBxX3ZhbHVlIDw8PSAxOworICAgIGlmIChxX3ZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHFfdmFsdWUgPj49IDQ7CisgICAgICAgIGlmIChxX3ZhbHVlID4gMjA0NykgcV92YWx1ZSA9IDIwNDc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFfdmFsdWUgKz0gMTU7CisgICAgICAgIHFfdmFsdWUgPj49IDQ7CisgICAgICAgIGlmIChxX3ZhbHVlIDwgLTIwNDgpIHFfdmFsdWUgPSAtMjA0ODsKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisjaWYgZGVmaW5lZChfX1RBUkdFVF9BUkNIXzVURSkKKworX19pbmxpbmUgaW50MzIgYWFuX3NjYWxlKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHJvdW5kLCBpbnQzMiBRUGRpdjIpCit7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtbGFiYiBxX3ZhbHVlLCBjb2VmZiwgcV92YWx1ZSwgcm91bmQKKyAgICAgICAgbW92cyAgICAgICBjb2VmZiwgcV92YWx1ZSwgYXNyICMxNgorICAgICAgICBhZGRsZSAgIGNvZWZmLCBjb2VmZiwgUVBkaXYyCisgICAgICAgIHN1Ymd0ICAgY29lZmYsIGNvZWZmLCBRUGRpdjIKKyAgICB9CisKKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX3F1YW50KGludDMyIGNvZWZmLCBpbnQzMiBxX3NjYWxlLCBpbnQzMiBzaGlmdCkKK3sKKyAgICBpbnQzMiBxX3ZhbHVlOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtdWxiYiAgcV92YWx1ZSwgcV9zY2FsZSwgY29lZmYgICAgLyptb3YgICAgY29lZmYsIGNvZWZmLCBsc2wgIzE0Ki8KKyAgICAgICAgbW92ICAgICBjb2VmZiwgcV92YWx1ZSwgYXNyIHNoaWZ0ICAgLypzbXVsbCB0bXAsIGNvZWZmLCBxX3NjYWxlLCBjb2VmZiovCisgICAgICAgIGFkZCBxX3ZhbHVlLCBjb2VmZiwgY29lZmYsIGxzciAjMzEKKyAgICB9CisKKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50KGludDMyIHFfdmFsdWUsIGludDMyIFFQeDIsIGludDMyIEFkZGl0aW9uLCBpbnQzMiB0bXApCit7CisgICAgaW50MzIgY29lZmY7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgY21wICAgICBxX3ZhbHVlLCAjMAorICAgICAgICBzbXVsYmIgIGNvZWZmLCBxX3ZhbHVlLCBRUHgyCisgICAgICAgIHN1Ymx0ICAgY29lZmYsIGNvZWZmLCBBZGRpdGlvbgorICAgICAgICBhZGRnZSAgIGNvZWZmLCBjb2VmZiwgQWRkaXRpb24KKyAgICAgICAgYWRkICAgICBxX3ZhbHVlLCBjb2VmZiwgdG1wCisgICAgICAgIHN1YnMgICAgcV92YWx1ZSwgcV92YWx1ZSwgIzM4NDAKKyAgICAgICAgc3ViY3NzICBxX3ZhbHVlLCBxX3ZhbHVlLCAjMjU0CisgICAgICAgIGVvcmhpICAgY29lZmYsIHRtcCwgY29lZmYsIGFzciAjMzEKKyAgICB9CisKKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIHNtbGFiYihpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwgaW50MzIgcm91bmQpCit7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtbGFiYiBxX3ZhbHVlLCBjb2VmZiwgcV92YWx1ZSwgcm91bmQKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgc211bGJiKGludDMyIHFfc2NhbGUsIGludDMyIGNvZWZmKQoreworICAgIGludDMyIHFfdmFsdWU7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgc211bGJiICBxX3ZhbHVlLCBxX3NjYWxlLCBjb2VmZgorICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50X21wZWcoaW50MzIgcV92YWx1ZSwgaW50MzIgc3RlcHNpemUsIGludDMyIFFQLCBpbnQzMiB0bXApCit7CisgICAgLyogdG1wIG11c3QgaGF2ZSB2YWx1ZSBvZiAyMDQ3ICovCisgICAgaW50MzIgY29lZmY7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdnMgICAgY29lZmYsIHFfdmFsdWUsIGxzbCAjMQorICAgICAgICBzbXVsYmIgIHN0ZXBzaXplLCBzdGVwc2l6ZSwgUVAKKyAgICAgICAgYWRkZ3QgICBjb2VmZiwgY29lZmYsICMxCisgICAgICAgIHN1Ymx0ICAgY29lZmYsIGNvZWZmLCAjMQorICAgICAgICBzbXVsYmIgIHFfdmFsdWUsIGNvZWZmLCBzdGVwc2l6ZQorICAgICAgICBhZGRsdCAgIHFfdmFsdWUsIHFfdmFsdWUsICMxNQorICAgICAgICBtb3YgICAgIHFfdmFsdWUsIHFfdmFsdWUsIGFzciAjNAorICAgICAgICBhZGQgICAgIGNvZWZmLCBxX3ZhbHVlLCB0bXAKKyAgICAgICAgc3VicyAgICBjb2VmZiwgY29lZmYsICMweGYwMAorICAgICAgICBzdWJjc3MgIGNvZWZmLCBjb2VmZiwgIzB4ZmUKKyAgICAgICAgZW9yaGkgICBxX3ZhbHVlLCB0bXAsIHFfdmFsdWUsIGFzciAjMzEKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworCisjZWxzZSAvLyBub3QgQVJNVjVURQorCitfX2lubGluZSBpbnQzMiBhYW5fc2NhbGUoaW50MzIgcV92YWx1ZSwgaW50MzIgY29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgcm91bmQsIGludDMyIFFQZGl2MikKK3sKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbWxhIHFfdmFsdWUsIGNvZWZmLCBxX3ZhbHVlLCByb3VuZAorICAgICAgICBtb3ZzICAgICAgIGNvZWZmLCBxX3ZhbHVlLCBhc3IgIzE2CisgICAgICAgIGFkZGxlICAgY29lZmYsIGNvZWZmLCBRUGRpdjIKKyAgICAgICAgc3ViZ3QgICBjb2VmZiwgY29lZmYsIFFQZGl2MgorICAgIH0KKworICAgIHJldHVybiBjb2VmZjsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfcXVhbnQoaW50MzIgY29lZmYsIGludDMyIHFfc2NhbGUsIGludDMyIHNoaWZ0KQoreworICAgIGludDMyIHFfdmFsdWU7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbXVsIHFfdmFsdWUsIHFfc2NhbGUsIGNvZWZmICAgIC8qbW92ICAgIGNvZWZmLCBjb2VmZiwgbHNsICMxNCovCisgICAgICAgIG1vdiAgICAgY29lZmYsIHFfdmFsdWUsIGFzciBzaGlmdCAgIC8qc211bGwgdG1wLCBjb2VmZiwgcV9zY2FsZSwgY29lZmYqLworICAgICAgICBhZGQgcV92YWx1ZSwgY29lZmYsIGNvZWZmLCBsc3IgIzMxCisgICAgfQorCisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50KGludDMyIHFfdmFsdWUsIGludDMyIFFQeDIsIGludDMyIEFkZGl0aW9uLCBpbnQzMiB0bXApCit7CisgICAgaW50MzIgY29lZmY7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgY21wICAgICBxX3ZhbHVlLCAjMAorICAgICAgICBtdWwgY29lZmYsIHFfdmFsdWUsIFFQeDIKKyAgICAgICAgc3VibHQgICBjb2VmZiwgY29lZmYsIEFkZGl0aW9uCisgICAgICAgIGFkZGdlICAgY29lZmYsIGNvZWZmLCBBZGRpdGlvbgorICAgICAgICBhZGQgICAgIHFfdmFsdWUsIGNvZWZmLCB0bXAKKyAgICAgICAgc3VicyAgICBxX3ZhbHVlLCBxX3ZhbHVlLCAjMzg0MAorICAgICAgICBzdWJjc3MgIHFfdmFsdWUsIHFfdmFsdWUsICMyNTQKKyAgICAgICAgZW9yaGkgICBjb2VmZiwgdG1wLCBjb2VmZiwgYXNyICMzMQorICAgIH0KKworICAgIHJldHVybiBjb2VmZjsKK30KKworX19pbmxpbmUgaW50MzIgc21sYWJiKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLCBpbnQzMiByb3VuZCkKK3sKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbWxhIHFfdmFsdWUsIGNvZWZmLCBxX3ZhbHVlLCByb3VuZAorICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBzbXVsYmIoaW50MzIgcV9zY2FsZSwgaW50MzIgY29lZmYpCit7CisgICAgaW50MzIgcV92YWx1ZTsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBtdWwgcV92YWx1ZSwgcV9zY2FsZSwgY29lZmYKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50X21wZWcoaW50MzIgcV92YWx1ZSwgaW50MzIgc3RlcHNpemUsIGludDMyIFFQLCBpbnQzMiB0bXApCit7CisgICAgLyogdG1wIG11c3QgaGF2ZSB2YWx1ZSBvZiAyMDQ3ICovCisgICAgaW50MzIgY29lZmY7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdnMgICAgY29lZmYsIHFfdmFsdWUsIGxzbCAjMQorICAgICAgICBtdWwgIHN0ZXBzaXplLCBzdGVwc2l6ZSwgUVAKKyAgICAgICAgYWRkZ3QgICBjb2VmZiwgY29lZmYsICMxCisgICAgICAgIHN1Ymx0ICAgY29lZmYsIGNvZWZmLCAjMQorICAgICAgICBtdWwgcV92YWx1ZSwgY29lZmYsIHN0ZXBzaXplCisgICAgICAgIGFkZGx0ICAgcV92YWx1ZSwgcV92YWx1ZSwgIzE1CisgICAgICAgIG1vdiAgICAgcV92YWx1ZSwgcV92YWx1ZSwgYXNyICM0CisgICAgICAgIGFkZCAgICAgY29lZmYsIHFfdmFsdWUsIHRtcAorICAgICAgICBzdWJzICAgIGNvZWZmLCBjb2VmZiwgIzB4ZjAwCisgICAgICAgIHN1YmNzcyAgY29lZmYsIGNvZWZmLCAjMHhmZQorICAgICAgICBlb3JoaSAgIHFfdmFsdWUsIHRtcCwgcV92YWx1ZSwgYXNyICMzMQorICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCisKKyNlbmRpZgorCitfX2lubGluZSBpbnQzMiAgY29lZmZfY2xpcChpbnQzMiBxX3ZhbHVlLCBpbnQzMiBhY19jbGlwKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGFkZCAgICAgY29lZmYsIHFfdmFsdWUsIGFjX2NsaXAKKyAgICAgICAgc3VicyAgICBjb2VmZiwgY29lZmYsIGFjX2NsaXAsIGxzbCAjMQorICAgICAgICBlb3JoaSAgIHFfdmFsdWUsIGFjX2NsaXAsIHFfdmFsdWUsIGFzciAjMzEKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgYWFuX2RjX3NjYWxlKGludDMyIGNvZWZmLCBpbnQzMiBRUCkKK3sKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBjbXAgICBjb2VmZiwgIzAKKyAgICAgICAgYWRkbGUgICBjb2VmZiwgY29lZmYsIFFQLCBhc3IgIzEKKyAgICAgICAgc3ViZ3QgICBjb2VmZiwgY29lZmYsIFFQLCBhc3IgIzEKKyAgICB9CisKKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIGNsaXBfMjA0NyhpbnQzMiBxX3ZhbHVlLCBpbnQzMiB0bXApCit7CisgICAgLyogdG1wIG11c3QgaGF2ZSB2YWx1ZSBvZiAyMDQ3ICovCisgICAgaW50MzIgY29lZmY7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgYWRkICAgICBjb2VmZiwgcV92YWx1ZSwgdG1wCisgICAgICAgIHN1YnMgICAgY29lZmYsIGNvZWZmLCAjMHhmMDAKKyAgICAgICAgc3ViY3NzICBjb2VmZiwgY29lZmYsICMweGZlCisgICAgICAgIGVvcmhpICAgcV92YWx1ZSwgdG1wLCBxX3ZhbHVlLCBhc3IgIzMxCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnRfbXBlZ19pbnRyYShpbnQzMiBxX3ZhbHVlLCBpbnQzMiB0bXApCit7CisgICAgaW50MzIgY29lZmY7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbW92cyAgICBxX3ZhbHVlLCBxX3ZhbHVlLCBsc2wgIzEKKyAgICAgICAgYWRkbHQgICBxX3ZhbHVlLCBxX3ZhbHVlLCAjMTUKKyAgICAgICAgbW92ICAgICBxX3ZhbHVlLCBxX3ZhbHVlLCBhc3IgIzQKKyAgICAgICAgYWRkICAgICBjb2VmZiwgcV92YWx1ZSwgdG1wCisgICAgICAgIHN1YnMgICAgY29lZmYsIGNvZWZmLCAjMHhmMDAKKyAgICAgICAgc3ViY3NzICBjb2VmZiwgY29lZmYsICMweGZlCisgICAgICAgIGVvcmhpICAgcV92YWx1ZSwgdG1wLCBxX3ZhbHVlLCBhc3IgIzMxCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKKyNlbGlmICggZGVmaW5lZChQVl9BUk1fR0NDX1Y0KSB8fCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworX19pbmxpbmUgaW50MzIgYWFuX3NjYWxlKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHJvdW5kLCBpbnQzMiBRUGRpdjIpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIHF2ID0gcV92YWx1ZTsKKyAgICByZWdpc3RlciBpbnQzMiBjZiA9IGNvZWZmOworICAgIHJlZ2lzdGVyIGludDMyIHJyID0gcm91bmQ7CisgICAgcmVnaXN0ZXIgaW50MzIgcXAgPSBRUGRpdjI7CisKKyAgICBhc20gdm9sYXRpbGUoInNtbGFiYiAlMCwgJTIsICUxLCAlM1xuXHQiCisgICAgICAgICAgICAgICAgICJtb3ZzICUwLCAlMCwgYXNyICMxNlxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRsZSAlMCwgJTAsICU0XG5cdCIKKyAgICAgICAgICAgICAgICAgInN1Ymd0ICUwLCAlMCwgJTQiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIocXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIocXApKTsKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9xdWFudChpbnQzMiBjb2VmZiwgaW50MzIgcV9zY2FsZSwgaW50MzIgc2hpZnQpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIHRlbXAxOworICAgIHJlZ2lzdGVyIGludDMyIGNjID0gY29lZmY7CisgICAgcmVnaXN0ZXIgaW50MzIgcXMgPSBxX3NjYWxlOworICAgIHJlZ2lzdGVyIGludDMyIHNzID0gc2hpZnQ7CisKKyAgICBhc20gdm9sYXRpbGUoInNtdWxiYiAlMCwgJTMsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAlMSwgJTAsIGFzciAlNFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGQgJTAsICUxLCAlMSwgbHNyICMzMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIocXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihzcykpOworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfY2xpcChpbnQzMiBxX3ZhbHVlLCBpbnQzMiBhY19jbGlwKQoreworICAgIHJlZ2lzdGVyIGludDMyIGNvZWZmOworCisgICAgYXNtIHZvbGF0aWxlKCJhZGQgICAlMSwgJTAsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YnMgICUxLCAlMSwgJTIsIGxzbCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JoaSAlMCwgJTIsICUwLCBhc3IgIzMxIgorICAgICAgICAgICAgIDogIityIihxX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIj0mciIoY29lZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYWNfY2xpcCkpOworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnQoaW50MzIgcV92YWx1ZSwgaW50MzIgUVB4MiwgaW50MzIgQWRkaXRpb24sIGludDMyIHRtcCkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgcmVnaXN0ZXIgaW50MzIgcXYgPSBxX3ZhbHVlOworICAgIHJlZ2lzdGVyIGludDMyIHFwID0gUVB4MjsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IEFkZGl0aW9uOworICAgIHJlZ2lzdGVyIGludDMyIHR0ID0gdG1wOworCisgICAgYXNtIHZvbGF0aWxlKCJjbXAgICAgJTIsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgIm11bCAgICAlMCwgJTIsICUzXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1Ymx0ICAlMCwgJTAsICU0XG5cdCIKKyAgICAgICAgICAgICAgICAgImFkZGdlICAlMCwgJTAsICU0XG5cdCIKKyAgICAgICAgICAgICAgICAgImFkZCAgICAlMSwgJTAsICU1XG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YnMgICAlMSwgJTEsICMzODQwXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YmNzcyAlMSwgJTEsICMyNTRcblx0IgorICAgICAgICAgICAgICAgICAiZW9yaGkgICUwLCAlNSwgJTAsIGFzciAjMzEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihxdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIih0dCkpOworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgc21sYWJiKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLCBpbnQzMiByb3VuZCkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSAoaW50MzIpcV92YWx1ZTsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMiljb2VmZjsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IChpbnQzMilyb3VuZDsKKworICAgIGFzbSB2b2xhdGlsZSgic21sYWJiICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjYykpOworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIHNtdWxiYihpbnQzMiBxX3NjYWxlLCBpbnQzMiBjb2VmZikKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSAoaW50MzIpcV9zY2FsZTsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMiljb2VmZjsKKworICAgIGFzbSB2b2xhdGlsZSgic211bGJiICUwLCAlMSwgJTIiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihiYikpOworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIGFhbl9kY19zY2FsZShpbnQzMiBjb2VmZiwgaW50MzIgUVApCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGNjID0gY29lZmY7CisgICAgcmVnaXN0ZXIgaW50MzIgcXAgPSBRUDsKKworICAgIGFzbSB2b2xhdGlsZSgiY21wICUxLCAjMFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRsZSAlMCwgJTEsICUyLCBhc3IgIzFcblx0IgorICAgICAgICAgICAgICAgICAic3ViZ3QgJTAsICUxLCAlMiwgYXNyICMxIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIocXApKTsKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBjbGlwXzIwNDcoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIHJlZ2lzdGVyIGludDMyIGNvZWZmOworICAgIGFzbSB2b2xhdGlsZSgiYWRkICAgICUxLCAlMCwgJTJcblx0IgorICAgICAgICAgICAgICAgICAic3VicyAgICUxLCAlMSwgIzB4RjAwXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YmNzcyAlMSwgJTEsICMweEZFXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcmhpICAlMCwgJTIsICUwLCBhc3IgIzMxIgorICAgICAgICAgICAgIDogIityIihxX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIj0mciIoY29lZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIodG1wKSk7CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudF9tcGVnKGludDMyIHFfdmFsdWUsIGludDMyIHN0ZXBzaXplLCBpbnQzMiBRUCwgaW50MzIgdG1wKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICByZWdpc3RlciBpbnQzMiBxdiA9IHFfdmFsdWU7CisgICAgcmVnaXN0ZXIgaW50MzIgc3MgPSBzdGVwc2l6ZTsKKyAgICByZWdpc3RlciBpbnQzMiBxcCA9IFFQOworICAgIHJlZ2lzdGVyIGludDMyIHR0ID0gdG1wOworCisgICAgYXNtIHZvbGF0aWxlKCJtb3ZzICAgICUxLCAlMiwgbHNsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgIm11bCAgICAgJTAsICUzLCAlNFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRndCAgICUxLCAlMSwgIzFcblx0IgorICAgICAgICAgICAgICAgICAic3VibHQgICAlMSwgJTEsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgIm11bCAgICAgJTAsICUxLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRsdCAgICUwLCAlMCwgIzE1XG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAgICAgJTAsICUwLCBhc3IgIzRcblx0IgorICAgICAgICAgICAgICAgICAiYWRkICAgICAlMSwgJTAsICU1XG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YnMgICAgJTEsICUxLCAjMHhGMDBcblx0IgorICAgICAgICAgICAgICAgICAic3ViY3NzICAlMSwgJTEsICMweEZFXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcmhpICAgJTAsICU1LCAlMCwgYXNyICMzMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHF2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihxcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHR0KSk7CisKKyAgICByZXR1cm4gb3V0OworCit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnRfbXBlZ19pbnRyYShpbnQzMiBxX3ZhbHVlLCBpbnQzMiB0bXApCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIHRlbXAxOworICAgIHJlZ2lzdGVyIGludDMyIHF2ID0gcV92YWx1ZTsKKyAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKworICAgIGFzbSB2b2xhdGlsZSgibW92cyAgICAlMSwgJTIsIGxzbCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRsdCAgICUxLCAlMSwgIzE1XG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAgICAgJTAsICUxLCBhc3IgIzRcblx0IgorICAgICAgICAgICAgICAgICAiYWRkICAgICAlMSwgJTAsICUzXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YnMgICAgJTEsICUxLCAjMHhGMDBcblx0IgorICAgICAgICAgICAgICAgICAic3ViY3NzICAlMSwgJTEsICMweEZFXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcmhpICAgJTAsICUzLCAlMCwgYXNyICMzMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHF2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIodHQpKTsKKyAgICByZXR1cm4gb3V0OworfQorCisKKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisKKyNlbmRpZiAvL19GQVNUUVVBTlRfSU5MSU5FX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOWM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCisvKiAzLzI5LzAxIGZhc3QgaGFsZi1wZWwgc2VhcmNoIGJhc2VkIG9uIG5laWdoYm9yaW5nIGd1ZXNzICovCisvKiB2YWx1ZSByYW5naW5nIGZyb20gMCB0byA0LCBoaWdoIGNvbXBsZXhpdHkgKG1vcmUgYWNjdXJhdGUpIHRvCisgICBsb3cgY29tcGxleGl0eSAobGVzcyBhY2N1cmF0ZSkgKi8KKyNkZWZpbmUgSFBfRElTVEFOQ0VfVEggICAgICAyICAvKiBoYWxmLXBlbCBkaXN0YW5jZSB0aHJlc2hvbGQgKi8KKworI2RlZmluZSBQUkVGXzE2X1ZFQyAxMjkgICAgIC8qIDFNViBiaWFzIHZlcnN1cyA0TVZzKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICB2b2lkIEdlbmVyYXRlU2VhcmNoUmVnaW9uKFVDaGFyICpzZWFyY2hQYWRkaW5nLCBVQ2hhciAqcmVmLCBJbnQgd2lkdGgsIEludCBoZWlnaHQsCisgICAgSW50IGlsb3csIEludCBpaGlnaCwgSW50IGpsb3csIEludCBqaGlnaCk7CisKKyAgICB2b2lkIEludGVycERpYWcoVUNoYXIgKnByZXYsIEludCBseCwgVUNoYXIgKnByZWRfYmxvY2spOworICAgIHZvaWQgSW50ZXJwSG9yeihVQ2hhciAqcHJldiwgSW50IGx4LCBVQ2hhciAqcHJlZF9ibG9jayk7CisgICAgdm9pZCBJbnRlcnBWZXJ0KFVDaGFyICpwcmV2LCBJbnQgbHgsIFVDaGFyICpwcmVkX2Jsb2NrKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworY29uc3Qgc3RhdGljIEludCBkaXN0YW5jZV90YWJbOV1bOV0gPSAgIC8qIFtocF9ndWVzc11ba10gKi8KK3sKKyAgICB7MCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgezEsIDAsIDEsIDIsIDMsIDQsIDMsIDIsIDF9LAorICAgIHsxLCAwLCAwLCAwLCAxLCAyLCAzLCAyLCAxfSwKKyAgICB7MSwgMiwgMSwgMCwgMSwgMiwgMywgNCwgM30sCisgICAgezEsIDIsIDEsIDAsIDAsIDAsIDEsIDIsIDN9LAorICAgIHsxLCA0LCAzLCAyLCAxLCAwLCAxLCAyLCAzfSwKKyAgICB7MSwgMiwgMywgMiwgMSwgMCwgMCwgMCwgMX0sCisgICAgezEsIDIsIDMsIDQsIDMsIDIsIDEsIDAsIDF9LAorICAgIHsxLCAwLCAxLCAyLCAzLCAyLCAxLCAwLCAwfQorfTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEZpbmRIYWxmUGVsTUIKKyAgICBEYXRlOiAgICAgICAxMC83LzIwMDAKKyAgICBQdXJwb3NlOiAgICBGaW5kIGhhbGYgcGVsIHJlc29sdXRpb24gTVYgc3Vycm91bmRpbmcgdGhlIGZ1bGwtcGVsIE1WCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIEZpbmRIYWxmUGVsTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1ciwgTU9UICptb3QsIFVDaGFyICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICBJbnQgeHBvcywgSW50IHlwb3MsIEludCAqeGhtaW4sIEludCAqeWhtaW4sIEludCBocF9ndWVzcykKK3sKKy8vICBocF9tZW0gPSBVTG9uZyAqdmVydEFycmF5OyAvKiAyMHgxNyAqLworLy8gICAgICAgICAgIFVMb25nICpob3J6QXJyYXk7IC8qIDIweDE2ICovCisvLyAgICAgICAgICAgVUxvbmcgKmRpYWdBcnJheTsgLyogMjB4MTcgKi8KKyAgICBJbnQgZG1pbiwgZDsKKworICAgIEludCB4aCwgeWg7CisgICAgSW50IGssIGttaW4gPSAwOworICAgIEludCBpbWluLCBqbWluLCBpbG93LCBqbG93OworICAgIEludCBoMjYzX21vZGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQ7IC8qICAzLzI5LzAxICovCisgICAgSW50IGluX3JhbmdlWzldID0gezAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OyAvKiAgMy8yOS8wMSAqLworICAgIEludCByYW5nZSA9IHZpZGVvLT5lbmNQYXJhbXMtPlNlYXJjaFJhbmdlOworICAgIEludCBseCA9IHZpZGVvLT5jdXJyVm9wLT5waXRjaDsKKyAgICBJbnQgd2lkdGggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7IC8qICBwYWRkaW5nICovCisgICAgSW50IGhlaWdodCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPmhlaWdodDsKKyAgICBJbnQoKipTQURfTUJfSGFsZlBlbCkoVUNoYXIqLCBVQ2hhciosIEludCwgdm9pZCopID0KKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWw7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IHZpZGVvLT5zYWRfZXh0cmFfaW5mbzsKKworICAgIEludCBuZXh0X2hwX3Bvc1s5XVsyXSA9IHt7MCwgMH0sIHsyLCAwfSwgezEsIDF9LCB7MCwgMn0sIHsgLTEsIDF9LCB7IC0yLCAwfSwgeyAtMSwgLTF9LCB7MCwgLTJ9LCB7MCwgLTF9fTsKKyAgICBJbnQgbmV4dF9uY2FuZFs5XSA9IHswLCAxICwgbHgsIGx4LCAwLCAtMSwgLTEsIC1seCwgLWx4fTsKKworICAgIGN1ciA9IHZpZGVvLT5jdXJyWU1COworCisgICAgLyoqKioqKioqKioqKioqKiogY2hlY2sgcmFuZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAzLzI5LzAxICovCisgICAgaW1pbiA9IHhwb3MgKyAobW90WzBdLnggPj4gMSk7CisgICAgam1pbiA9IHlwb3MgKyAobW90WzBdLnkgPj4gMSk7CisgICAgaWxvdyA9IHhwb3MgLSByYW5nZTsKKyAgICBqbG93ID0geXBvcyAtIHJhbmdlOworCisgICAgaWYgKCFoMjYzX21vZGUpCisgICAgeworICAgICAgICBpZiAoaW1pbiA8PSAtMTUgfHwgaW1pbiA9PSBpbG93KQorICAgICAgICAgICAgaW5fcmFuZ2VbMV0gPSBpbl9yYW5nZVs3XSA9IGluX3JhbmdlWzhdID0gMDsKKyAgICAgICAgZWxzZSBpZiAoaW1pbiA+PSB3aWR0aCAtIDEpCisgICAgICAgICAgICBpbl9yYW5nZVszXSA9IGluX3JhbmdlWzRdID0gaW5fcmFuZ2VbNV0gPSAwOworICAgICAgICBpZiAoam1pbiA8PSAtMTUgfHwgam1pbiA9PSBqbG93KQorICAgICAgICAgICAgaW5fcmFuZ2VbMV0gPSBpbl9yYW5nZVsyXSA9IGluX3JhbmdlWzNdID0gMDsKKyAgICAgICAgZWxzZSBpZiAoam1pbiA+PSBoZWlnaHQgLSAxKQorICAgICAgICAgICAgaW5fcmFuZ2VbNV0gPSBpbl9yYW5nZVs2XSA9IGluX3JhbmdlWzddID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGltaW4gPD0gMCB8fCBpbWluID09IGlsb3cpCisgICAgICAgICAgICBpbl9yYW5nZVsxXSA9IGluX3JhbmdlWzddID0gaW5fcmFuZ2VbOF0gPSAwOworICAgICAgICBlbHNlIGlmIChpbWluID49IHdpZHRoIC0gMTYpCisgICAgICAgICAgICBpbl9yYW5nZVszXSA9IGluX3JhbmdlWzRdID0gaW5fcmFuZ2VbNV0gPSAwOworICAgICAgICBpZiAoam1pbiA8PSAwIHx8IGptaW4gPT0gamxvdykKKyAgICAgICAgICAgIGluX3JhbmdlWzFdID0gaW5fcmFuZ2VbMl0gPSBpbl9yYW5nZVszXSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGptaW4gPj0gaGVpZ2h0IC0gMTYpCisgICAgICAgICAgICBpbl9yYW5nZVs1XSA9IGluX3JhbmdlWzZdID0gaW5fcmFuZ2VbN10gPSAwOworICAgIH0KKworICAgIHhobWluWzBdID0gMDsKKyAgICB5aG1pblswXSA9IDA7CisgICAgZG1pbiA9IG1vdFswXS5zYWQ7CisKKyAgICB4aCA9IDA7CisgICAgeWggPSAtMTsKKyAgICBuY2FuZCAtPSBseDsgLyogaW5pdGlhbCBwb3NpdGlvbiAqLworCisgICAgZm9yIChrID0gMjsgayA8PSA4OyBrICs9IDIpCisgICAgeworICAgICAgICBpZiAoZGlzdGFuY2VfdGFiW2hwX2d1ZXNzXVtrXSA8IEhQX0RJU1RBTkNFX1RIKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5fcmFuZ2Vba10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9ICgqKFNBRF9NQl9IYWxmUGVsWygoeWgmMSk8PDEpKyh4aCYxKV0pKShuY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgeGhtaW5bMF0gPSB4aDsKKyAgICAgICAgICAgICAgICAgICAgeWhtaW5bMF0gPSB5aDsKKyAgICAgICAgICAgICAgICAgICAga21pbiA9IGs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gZG1pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIFBWX0FCUyhtb3RbMF0ueCArIHhoKSArIFBWX0FCUyhtb3RbMF0ueSArIHloKSA8IFBWX0FCUyhtb3RbMF0ueCArIHhobWluWzBdKSArIFBWX0FCUyhtb3RbMF0ueSArIHlobWluWzBdKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhobWluWzBdID0geGg7CisgICAgICAgICAgICAgICAgICAgIHlobWluWzBdID0geWg7CisgICAgICAgICAgICAgICAgICAgIGttaW4gPSBrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHhoICs9IG5leHRfaHBfcG9zW2tdWzBdOworICAgICAgICB5aCArPSBuZXh0X2hwX3Bvc1trXVsxXTsKKyAgICAgICAgbmNhbmQgKz0gbmV4dF9uY2FuZFtrXTsKKworICAgICAgICBpZiAoayA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeGhtaW5bMF0gIT0gMCB8fCB5aG1pblswXSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSAtMTsKKyAgICAgICAgICAgICAgICBocF9ndWVzcyA9IGttaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb3RbMF0uc2FkID0gZG1pbjsKKyAgICBtb3RbMF0ueCArPSB4aG1pblswXTsKKyAgICBtb3RbMF0ueSArPSB5aG1pblswXTsKKworICAgIHJldHVybiA7Cit9CisKKyNpZm5kZWYgTk9fSU5URVI0VgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBGaW5kSGFsZlBlbEJsaworICAgIERhdGU6ICAgICAgIDEwLzcvMjAwMAorICAgIFB1cnBvc2U6ICAgIEZpbmQgaGFsZiBwZWwgcmVzb2x1dGlvbiBNViBzdXJyb3VuZGluZyB0aGUgZnVsbC1wZWwgTVYKKyAgICAgICAgICAgICAgICBBbmQgZGVjaWRlIGJldHdlZW4gMU1WIG9yIDRNViBtb2RlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8vLy8gVEhJUyBGVU5DVElPTiBJUyBOT1QgV09SS0lORyEhISBORUVEIFRPIEJFIFJJVklTSVRFRAorCitJbnQgRmluZEhhbGZQZWxCbGsoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1ciwgTU9UICptb3QsIEludCBzYWQxNiwgVUNoYXIgKm5jYW5kOFtdLAorICAgICAgICAgICAgICAgICAgIFVDaGFyICptb2RlLCBJbnQgeHBvcywgSW50IHlwb3MsIEludCAqeGhtaW4sIEludCAqeWhtaW4sIFVDaGFyICpocF9tZW0pCit7CisgICAgSW50IGssIGNvbXA7CisgICAgSW50IHhoLCB5aDsvLywgeGhtaW4sIHlobWluOworICAgIEludCBpbWluLCBqbWluLCBpbG93LCBqbG93OworICAgIEludCBoZWlnaHQ7CisgICAgVUNoYXIgKmNhbmQsICpjdXI4OworICAgIFVDaGFyICpobWVtOy8vWzE3KjE3XTsgLyogaGFsZi1wZWwgbWVtb3J5ICovCisgICAgSW50IGQsIGRtaW4sIHNhZDg7CisgICAgSW50IGx4ID0gdmlkZW8tPmN1cnJWb3AtPnBpdGNoOworICAgIEludCB3aWR0aCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsgLyogLCBwYWRkaW5nICovCisgICAgSW50KCpTQURfQmxrX0hhbGZQZWwpKFVDaGFyKiwgVUNoYXIqLCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgdm9pZCopID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsa19IYWxmUGVsOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSB2aWRlby0+c2FkX2V4dHJhX2luZm87CisgICAgSW50IGluX3JhbmdlWzhdOyAvKiAgMy8yOS8wMSAqLworICAgIEludCByYW5nZSA9IHZpZGVvLT5lbmNQYXJhbXMtPlNlYXJjaFJhbmdlOworICAgIEludCBzd2lkdGg7CisgICAgSW50IG5leHRfaHBfcG9zWzhdWzJdID0ge3sxLCAwfSwgezEsIDB9LCB7MCwgMX0sIHswLCAxfSwgeyAtMSwgMH0sIHsgLTEsIDB9LCB7MCwgLTF9LCB7MCwgLTF9fTsKKworICAgIGhlaWdodCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPmhlaWdodDsKKworICAgIGhtZW0gPSBocF9tZW07CisgICAgc2FkOCA9IDA7CisgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKKyAgICB7CisjaWZkZWYgX1NBRF9TVEFUCisgICAgICAgIG51bV9IUF9CbGsrKzsKKyNlbmRpZgorICAgICAgICAvKioqKioqKioqKioqKioqKiBjaGVjayByYW5nZSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAzLzI5LzAxICovCisgICAgICAgIE00VkVOQ19NRU1TRVQoaW5fcmFuZ2UsIDEsIHNpemVvZihJbnQpIDw8IDMpOworICAgICAgICBpbWluID0geHBvcyArICgoY29tcCAmIDEpIDw8IDMpICsgKG1vdFtjb21wKzFdLnggPj4gMSk7CisgICAgICAgIGptaW4gPSB5cG9zICsgKChjb21wICYgMikgPDwgMikgKyAobW90W2NvbXArMV0ueSA+PiAxKTsKKyAgICAgICAgaWxvdyA9IHhwb3MgKyAoKGNvbXAgJiAxKSA8PCAzKSAtIHJhbmdlOworICAgICAgICBqbG93ID0geXBvcyArICgoY29tcCAmIDIpIDw8IDIpIC0gcmFuZ2U7CisKKyAgICAgICAgaWYgKGltaW4gPD0gLTE1IHx8IGltaW4gPT0gaWxvdykKKyAgICAgICAgICAgIGluX3JhbmdlWzBdID0gaW5fcmFuZ2VbNl0gPSBpbl9yYW5nZVs3XSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGltaW4gPj0gd2lkdGggLSAxKQorICAgICAgICAgICAgaW5fcmFuZ2VbMl0gPSBpbl9yYW5nZVszXSA9IGluX3JhbmdlWzRdID0gMDsKKworICAgICAgICBpZiAoam1pbiA8PSAtMTUgfHwgam1pbiA9PSBqbG93KQorICAgICAgICAgICAgaW5fcmFuZ2VbMF0gPSBpbl9yYW5nZVsxXSA9IGluX3JhbmdlWzJdID0gMDsKKyAgICAgICAgZWxzZSBpZiAoam1pbiA+PSBoZWlnaHQgLSAxKQorICAgICAgICAgICAgaW5fcmFuZ2VbNF0gPSBpbl9yYW5nZVs1XSA9IGluX3JhbmdlWzZdID0gMDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKiBoYWxmLXBlbCBzZWFyY2ggKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGN1cjggPSBjdXIgKyAoKGNvbXAgJiAxKSA8PCAzKSArICgoY29tcCAmIDIpIDw8IDIpICogd2lkdGggOworCisgICAgICAgIC8qIGdlbmVyYXRlIGhhbGYtcGVsIHNlYXJjaCByZWdpb24gKi8KKyAgICAgICAgeworICAgICAgICAgICAgY2FuZCA9IG5jYW5kOFtjb21wKzFdOworICAgICAgICAgICAgc3dpZHRoID0gbHg7CisgICAgICAgIH0KKworICAgICAgICB4aG1pbltjb21wKzFdID0gMDsKKyAgICAgICAgeWhtaW5bY29tcCsxXSA9IDA7CisgICAgICAgIGRtaW4gPSBtb3RbY29tcCsxXS5zYWQ7CisKKyAgICAgICAgeGggPSAtMTsKKyAgICAgICAgeWggPSAtMTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluX3JhbmdlW2tdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9CbGtfSGFsZlBlbCkoY2FuZCwgY3VyOCwgZG1pbiwgbHgsIHN3aWR0aCwgeGgsIHloLCBleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICB4aG1pbltjb21wKzFdID0geGg7CisgICAgICAgICAgICAgICAgICAgIHlobWluW2NvbXArMV0gPSB5aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4aCArPSBuZXh0X2hwX3Bvc1trXVswXTsKKyAgICAgICAgICAgIHloICs9IG5leHRfaHBfcG9zW2tdWzFdOworICAgICAgICB9CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgbW90W2NvbXArMV0ueCArPSB4aG1pbltjb21wKzFdOworICAgICAgICBtb3RbY29tcCsxXS55ICs9IHlobWluW2NvbXArMV07CisgICAgICAgIG1vdFtjb21wKzFdLnNhZCA9IGRtaW47CisgICAgICAgIHNhZDggKz0gZG1pbjsKKworICAgICAgICBpZiAoc2FkOCA+PSBzYWQxNiAtIFBSRUZfMTZfVkVDKQorICAgICAgICB7CisgICAgICAgICAgICAqbW9kZSA9IE1PREVfSU5URVI7CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDw9IDQ7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb3Rba10uc2FkID0gKG1vdFswXS5zYWQgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgIG1vdFtrXS54ID0gbW90WzBdLng7CisgICAgICAgICAgICAgICAgbW90W2tdLnkgPSBtb3RbMF0ueTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYWQ4OworICAgICAgICB9CisKKyAgICAgICAgaG1lbSArPSAoMTAgKiAxMCk7CisgICAgfQorCisgICAgKm1vZGUgPSBNT0RFX0lOVEVSNFY7CisKKyAgICByZXR1cm4gc2FkODsKK30KKyNlbmRpZiAvKiBOT19JTlRFUjRWICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTE4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmV2aXNpb24gSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGF0ZTogMTEvMDQvMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVzY3JpcHRpb246IENyZWF0ZWQgZm9yIGFic3RyYWN0aW5nIG91dCBPU0NMIHN1Y2ggdGhhdCB0aGUgY29kZSBjYW4gYmUgdXNlZCAqLworLyogICAgICAgICAgYnkgYm90aCBWMyBhbmQgVjQgT1NDTCBsaWJyYXJ5LiBUaGlzIGZpbGUgaXMgZm9yIFY0LiAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTTRWRU5DX09TQ0xfSF8KKyNkZWZpbmUgX000VkVOQ19PU0NMX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgTTRWRU5DX01BTExPQyhzaXplKSAgICAgICAgICAgICBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgTTRWRU5DX0ZSRUUocHRyKSAgICAgICAgICAgICAgICBmcmVlKHB0cikKKworI2RlZmluZSBNNFZFTkNfTUVNU0VUKHB0cix2YWwsc2l6ZSkgICAgIG1lbXNldChwdHIsdmFsLHNpemUpCisjZGVmaW5lIE00VkVOQ19NRU1DUFkoZHN0LHNyYyxzaXplKSAgICAgbWVtY3B5KGRzdCxzcmMsc2l6ZSkKKworI2RlZmluZSBNNFZFTkNfTE9HKHgpICAgICAgICAgICAgICAgICAgIGxvZyh4KQorI2RlZmluZSBNNFZFTkNfU1FSVCh4KSAgICAgICAgICAgICAgICAgIHNxcnQoeCkKKyNkZWZpbmUgTTRWRU5DX1BPVyh4LHkpICAgICAgICAgICAgICAgICBwb3coeCx5KQorCisjZGVmaW5lIE00VkVOQ19IQVNfU1lNQklBTl9TVVBQT1JUICBPU0NMX0hBU19TWU1CSUFOX1NVUFBPUlQKKworI2VuZGlmIC8vX000VkVOQ19PU0NMX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYjMxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcApAQCAtMCwwICsxLDM4NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKKyNkZWZpbmUgVk9QX09GRlNFVCAgKChseDw8NCkrMTYpICAvKiBmb3Igb2Zmc2V0IHRvIGltYWdlIGFyZWEgKi8KKyNkZWZpbmUgQ1ZPUF9PRkZTRVQgKChseDw8MikrOCkKKworI2RlZmluZSBQUkVGX0lOVFJBICA1MTIgICAgIC8qIGJpYXMgZm9yIElOVFJBIGNvZGluZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIENob29zZU1vZGUKKyAgICBEYXRlOiAgICAgICAwOS8yMS8yMDAwCisgICAgUHVycG9zZTogICAgQ2hvb3NpbmcgYmV0d2VlbiBJTlRSQSBvciBJTlRFUgorICAgIElucHV0L091dHB1dDogUG9pbnRlciB0byB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIG1hY3JvYmxvY2suCisgICAgTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENob29zZU1vZGVfQyhVQ2hhciAqTW9kZSwgVUNoYXIgKmN1ciwgSW50IGx4LCBJbnQgbWluX1NBRCkKK3sKKyAgICBJbnQgaSwgajsKKyAgICBJbnQgTUJfbWVhbiwgQSwgdG1wLCBUaDsKKyAgICBJbnQgb2Zmc2V0ID0gKGx4ID4+IDIpIC0gNDsKKyAgICBVQ2hhciAqcCA9IGN1cjsKKyAgICBJbnQgKnBpbnQgPSAoSW50ICopIGN1ciwgdGVtcCA9IDA7CisgICAgTUJfbWVhbiA9IDA7CisgICAgQSA9IDA7CisgICAgVGggPSAobWluX1NBRCAtIFBSRUZfSU5UUkEpID4+IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKworICAgICAgICAvKiBPZGQgUm93cyAqLworICAgICAgICB0ZW1wICs9ICgqcGludCsrKSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHRlbXAgKz0gKCpwaW50KyspICYgMHgwMEZGMDBGRjsKKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKykgJiAweDAwRkYwMEZGOworICAgICAgICB0ZW1wICs9ICgqcGludCsrKSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHBpbnQgKz0gb2Zmc2V0OworCisgICAgICAgIC8qIEV2ZW4gUm93cyAqLworICAgICAgICB0ZW1wICs9ICgqcGludCsrID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKyA+PiA4KSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHRlbXAgKz0gKCpwaW50KysgPj4gOCkgJiAweDAwRkYwMEZGOworICAgICAgICB0ZW1wICs9ICgqcGludCsrID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgcGludCArPSBvZmZzZXQ7CisKKyAgICB9CisKKyAgICBNQl9tZWFuID0gKCgodGVtcCAmIDB4MDAwMEZGRkYpKSArICgodGVtcCAmIDB4RkZGRjAwMDApID4+IDE2KSkgPj4gNzsKKworICAgIHAgPSBjdXI7CisgICAgb2Zmc2V0ID0gbHggLSAxNjsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAoaiAmIDEpOworICAgICAgICBwICs9IHRlbXA7CisgICAgICAgIGkgPSA4OworICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAqcCAtIE1CX21lYW47CisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgICBpZiAodG1wID4gMCkgQSArPSB0bXA7CisgICAgICAgICAgICBlbHNlICAgIEEgLT0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEEgPj0gVGgpCisgICAgICAgIHsKKyAgICAgICAgICAgICpNb2RlID0gTU9ERV9JTlRFUjsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgcCArPSAob2Zmc2V0IC0gdGVtcCk7CisgICAgfQorCisgICAgaWYgKEEgPCBUaCkKKyAgICAgICAgKk1vZGUgPSBNT0RFX0lOVFJBOworICAgIGVsc2UKKyAgICAgICAgKk1vZGUgPSBNT0RFX0lOVEVSOworCisgICAgcmV0dXJuIDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEdldEhhbGZQZWxNQlJlZ2lvbgorICAgIERhdGU6ICAgICAgIDA5LzE3LzIwMDAKKyAgICBQdXJwb3NlOiAgICBJbnRlcnBvbGF0ZSB0aGUgc2VhcmNoIHJlZ2lvbiBmb3IgaGFsZi1wZWwgc2VhcmNoCisgICAgSW5wdXQvT3V0cHV0OiAgIENlbnRlciBvZiB0aGUgc2VhcmNoLCBIYWxmLXBlbCBtZW1vcnksIHdpZHRoCisgICAgTm90ZTogICAgICAgcm91bmRpbmcgdHlwZSBzaG91bGQgYmUgcGFyYW1ldGVyaXplZC4KKyAgICAgICAgICAgICAgICBOb3cgZml4ZWQgaXQgdG8gemVybyEhISEhIQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3ZvaWQgR2V0SGFsZlBlbE1CUmVnaW9uX0MoVUNoYXIgKmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgpCit7CisgICAgSW50IGksIGo7CisgICAgVUNoYXIgKnAxLCAqcDIsICpwMywgKnA0OworICAgIFVDaGFyICpobWVtMSA9IGhtZW07CisgICAgVUNoYXIgKmhtZW0yID0gaG1lbTEgKyAzMzsKKyAgICBJbnQgb2Zmc2V0ID0gbHggLSAxNzsKKworICAgIHAxID0gY2FuZCAtIGx4IC0gMTsKKyAgICBwMiA9IGNhbmQgLSBseDsKKyAgICBwMyA9IGNhbmQgLSAxOworICAgIHA0ID0gY2FuZDsKKworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpobWVtMSsrID0gKCgqcDErKykgKyAqcDIgKyAqcDMgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAgICAgKmhtZW0xKysgPSAoKCpwMisrKSArICpwNCArIDEpID4+IDE7CisgICAgICAgICAgICAqaG1lbTIrKyA9ICgoKnAzKyspICsgKnA0ICsgMSkgPj4gMTsKKyAgICAgICAgICAgICpobWVtMisrID0gKnA0Kys7CisgICAgICAgIH0KKyAgICAgICAgLyogIGxhc3QgcGl4ZWwgKi8KKyAgICAgICAgKmhtZW0xKysgPSAoKCpwMSsrKSArICgqcDIrKykgKyAqcDMgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAqaG1lbTIrKyA9ICgoKnAzKyspICsgKCpwNCsrKSArIDEpID4+IDE7CisgICAgICAgIGhtZW0xICs9IDMzOworICAgICAgICBobWVtMiArPSAzMzsKKyAgICAgICAgcDEgKz0gb2Zmc2V0OworICAgICAgICBwMiArPSBvZmZzZXQ7CisgICAgICAgIHAzICs9IG9mZnNldDsKKyAgICAgICAgcDQgKz0gb2Zmc2V0OworICAgIH0KKyAgICAvKiBsYXN0IHJvdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgKmhtZW0xKysgPSAoKCpwMSsrKSArICpwMiArICgqcDMrKykgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAqaG1lbTErKyA9ICgoKnAyKyspICsgKCpwNCsrKSArIDEpID4+IDE7CisKKyAgICB9CisgICAgKmhtZW0xID0gKCpwMSArICpwMiArICpwMyArICpwNCArIDIpID4+IDI7CisKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRnVuY3Rpb246ICAgIEdldEhhbGZQZWxCbGtSZWdpb24KKyAgIERhdGU6ICAgICAgICAwOS8yMC8yMDAwCisgICBQdXJwb3NlOiBJbnRlcnBvbGF0ZSB0aGUgc2VhcmNoIHJlZ2lvbiBmb3IgaGFsZi1wZWwgc2VhcmNoCisgICAgICAgICAgICBpbiA0TVYgbW9kZS4KKyAgIElucHV0L091dHB1dDogICAgQ2VudGVyIG9mIHRoZSBzZWFyY2gsIEhhbGYtcGVsIG1lbW9yeSwgd2lkdGgKKyAgIE5vdGU6ICAgICAgICByb3VuZGluZyB0eXBlIHNob3VsZCBiZSBwYXJhbWV0ZXJpemVkLgorICAgICAgICAgICAgTm93IGZpeGVkIGl0IHRvIHplcm8hISEhISEKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCit2b2lkIEdldEhhbGZQZWxCbGtSZWdpb24oVUNoYXIgKmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgpCit7CisgICAgSW50IGksIGo7CisgICAgVUNoYXIgKnAxLCAqcDIsICpwMywgKnA0OworICAgIFVDaGFyICpobWVtMSA9IGhtZW07CisgICAgVUNoYXIgKmhtZW0yID0gaG1lbTEgKyAxNzsKKyAgICBJbnQgb2Zmc2V0ID0gbHggLSA5OworCisgICAgcDEgPSBjYW5kIC0gbHggLSAxOworICAgIHAyID0gY2FuZCAtIGx4OworICAgIHAzID0gY2FuZCAtIDE7CisgICAgcDQgPSBjYW5kOworCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpobWVtMSsrID0gKCgqcDErKykgKyAqcDIgKyAqcDMgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAgICAgKmhtZW0xKysgPSAoKCpwMisrKSArICpwNCArIDEpID4+IDE7CisgICAgICAgICAgICAqaG1lbTIrKyA9ICgoKnAzKyspICsgKnA0ICsgMSkgPj4gMTsKKyAgICAgICAgICAgICpobWVtMisrID0gKnA0Kys7CisgICAgICAgIH0KKyAgICAgICAgLyogIGxhc3QgcGl4ZWwgKi8KKyAgICAgICAgKmhtZW0xKysgPSAoKCpwMSsrKSArICgqcDIrKykgKyAqcDMgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAqaG1lbTIrKyA9ICgoKnAzKyspICsgKCpwNCsrKSArIDEpID4+IDE7CisgICAgICAgIGhtZW0xICs9IDE3OworICAgICAgICBobWVtMiArPSAxNzsKKyAgICAgICAgcDEgKz0gb2Zmc2V0OworICAgICAgICBwMiArPSBvZmZzZXQ7CisgICAgICAgIHAzICs9IG9mZnNldDsKKyAgICAgICAgcDQgKz0gb2Zmc2V0OworICAgIH0KKyAgICAvKiBsYXN0IHJvdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgICAqaG1lbTErKyA9ICgoKnAxKyspICsgKnAyICsgKCpwMysrKSArICpwNCArIDIpID4+IDI7CisgICAgICAgICpobWVtMSsrID0gKCgqcDIrKykgKyAoKnA0KyspICsgMSkgPj4gMTsKKworICAgIH0KKyAgICAqaG1lbTEgPSAoKnAxICsgKnAyICsgKnAzICsgKnA0ICsgMikgPj4gMjsKKworICAgIHJldHVybiA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBQYWRkaW5nRWRnZQorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBQYWQgZWRnZSBvZiBhIFZvcAorICAgIE1vZGlmaWNhdGlvbjogMDkvMjAvMDUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkICBQYWRkaW5nRWRnZShWb3AgKnJlZlZvcCkKK3sKKyAgICBVQ2hhciAqc3JjLCAqZHN0OworICAgIEludCBpOworICAgIEludCBwaXRjaCwgd2lkdGgsIGhlaWdodDsKKyAgICBVTG9uZyB0ZW1wMSwgdGVtcDI7CisKKyAgICB3aWR0aCA9IHJlZlZvcC0+d2lkdGg7CisgICAgaGVpZ2h0ID0gcmVmVm9wLT5oZWlnaHQ7CisgICAgcGl0Y2ggPSByZWZWb3AtPnBpdGNoOworCisgICAgLyogcGFkIHRvcCAqLworICAgIHNyYyA9IHJlZlZvcC0+eUNoYW47CisKKyAgICB0ZW1wMSA9ICpzcmM7IC8qIHRvcC1sZWZ0IGNvcm5lciAqLworICAgIHRlbXAyID0gc3JjW3dpZHRoLTFdOyAvKiB0b3AtcmlnaHQgY29ybmVyICovCisgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDgpOworICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCAxNik7CisgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDgpOworICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCAxNik7CisKKyAgICBkc3QgPSBzcmMgLSAocGl0Y2ggPDwgNCk7CisKKyAgICAqKChVTG9uZyopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAqKChVTG9uZyopKGRzdCAtIDEyKSkgPSB0ZW1wMTsKKyAgICAqKChVTG9uZyopKGRzdCAtIDgpKSA9IHRlbXAxOworICAgICooKFVMb25nKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICBNNFZFTkNfTUVNQ1BZKGRzdCwgc3JjLCB3aWR0aCk7CisKKyAgICAqKChVTG9uZyopKGRzdCArPSB3aWR0aCkpID0gdGVtcDI7CisgICAgKigoVUxvbmcqKShkc3QgKyA0KSkgPSB0ZW1wMjsKKyAgICAqKChVTG9uZyopKGRzdCArIDgpKSA9IHRlbXAyOworICAgICooKFVMb25nKikoZHN0ICsgMTIpKSA9IHRlbXAyOworCisgICAgZHN0ID0gZHN0IC0gd2lkdGggLSAxNjsKKworICAgIGkgPSAxNTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgTTRWRU5DX01FTUNQWShkc3QgKyBwaXRjaCwgZHN0LCBwaXRjaCk7CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisKKyAgICAvKiBwYWQgc2lkZXMgKi8KKyAgICBkc3QgKz0gKHBpdGNoICsgMTYpOworICAgIHNyYyA9IGRzdDsKKyAgICBpID0gaGVpZ2h0OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB0ZW1wMSA9ICpzcmM7CisgICAgICAgIHRlbXAyID0gc3JjW3dpZHRoLTFdOworICAgICAgICB0ZW1wMSB8PSAodGVtcDEgPDwgOCk7CisgICAgICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCAxNik7CisgICAgICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCA4KTsKKyAgICAgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDE2KTsKKworICAgICAgICAqKChVTG9uZyopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAgICAgKigoVUxvbmcqKShkc3QgLSAxMikpID0gdGVtcDE7CisgICAgICAgICooKFVMb25nKikoZHN0IC0gOCkpID0gdGVtcDE7CisgICAgICAgICooKFVMb25nKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gd2lkdGgpKSA9IHRlbXAyOworICAgICAgICAqKChVTG9uZyopKGRzdCArIDQpKSA9IHRlbXAyOworICAgICAgICAqKChVTG9uZyopKGRzdCArIDgpKSA9IHRlbXAyOworICAgICAgICAqKChVTG9uZyopKGRzdCArIDEyKSkgPSB0ZW1wMjsKKworICAgICAgICBzcmMgKz0gcGl0Y2g7CisgICAgICAgIGRzdCA9IHNyYzsKKyAgICB9CisKKyAgICAvKiBwYWQgYm90dG9tICovCisgICAgZHN0IC09IDE2OworICAgIGkgPSAxNjsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgTTRWRU5DX01FTUNQWShkc3QsIGRzdCAtIHBpdGNoLCBwaXRjaCk7CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisKKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIENvbXB1dGVNQlN1bQorICAgIERhdGU6ICAgICAgIDEwLzI4LzIwMDAKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIHN1bSBvZiBhYnNvbHV0ZSB2YWx1ZSAoU0FWKSBvZiBibG9ja3MgaW4gYSBtYWNyb2Jsb2NrCisgICAgICAgICAgICAgICAgaW4gSU5UUkEgbW9kZSBuZWVkZWQgZm9yIHJhdGUgY29udHJvbC4gVGh1cywgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgIGNvbXB1dGluZyB0aGUgU0FWLCB3ZSBjYW4gY29tcHV0ZSBmaXJzdCBvcmRlciBtb21lbnQgb3IKKyAgICAgICAgICAgICAgICB2YXJpYW5jZSAuCisKKyAgICAxMS8yOC8wMDogICAgYWRkIE1NWAorICAgIDkvMy8wMTogICAgICBkbyBwYXJhbGxlbCBjb21wIGZvciBDIGZ1bmN0aW9uLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENvbXB1dGVNQlN1bV9DKFVDaGFyICpjdXIsIEludCBseCwgTU9UICptb3RfbWIpCit7CisgICAgSW50IGo7CisgICAgSW50ICpjSW50LCAqY0ludDI7CisgICAgSW50IHNhZDEgPSAwLCBzYWQyID0gMCwgc2FkMyA9IDAsIHNhZDQgPSAwOworICAgIEludCB0bXAsIHRtcDIsIG1hc2sgPSAweDAwRkYwMEZGOworCisgICAgY0ludCA9IChJbnQqKWN1cjsgICAvKiBtYWtlIHN1cmUgdGhpcyBpcyB3b3JkLWFsaWduICovCisgICAgY0ludDIgPSAoSW50KikoY3VyICsgKGx4IDw8IDMpKTsKKyAgICBqID0gODsKKyAgICB3aGlsZSAoai0tKQorICAgIHsKKyAgICAgICAgdG1wID0gY0ludFszXTsgIC8qIGxvYWQgNCBwaXhlbHMgYXQgYSB0aW1lICovCisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDIgKz0gdG1wOworICAgICAgICB0bXAgPSBjSW50WzJdOworICAgICAgICB0bXAyID0gdG1wICYgbWFzazsKKyAgICAgICAgdG1wID0gKHRtcCA+PiA4KSAmIG1hc2s7CisgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICBzYWQyICs9IHRtcDsKKyAgICAgICAgdG1wID0gY0ludFsxXTsKKyAgICAgICAgdG1wMiA9IHRtcCAmIG1hc2s7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gOCkgJiBtYXNrOworICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgc2FkMSArPSB0bXA7CisgICAgICAgIHRtcCA9ICpjSW50OworICAgICAgICBjSW50ICs9IChseCA+PiAyKTsKKyAgICAgICAgdG1wMiA9IHRtcCAmIG1hc2s7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gOCkgJiBtYXNrOworICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgc2FkMSArPSB0bXA7CisKKyAgICAgICAgdG1wID0gY0ludDJbM107CisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDQgKz0gdG1wOworICAgICAgICB0bXAgPSBjSW50MlsyXTsKKyAgICAgICAgdG1wMiA9IHRtcCAmIG1hc2s7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gOCkgJiBtYXNrOworICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgc2FkNCArPSB0bXA7CisgICAgICAgIHRtcCA9IGNJbnQyWzFdOworICAgICAgICB0bXAyID0gdG1wICYgbWFzazsKKyAgICAgICAgdG1wID0gKHRtcCA+PiA4KSAmIG1hc2s7CisgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICBzYWQzICs9IHRtcDsKKyAgICAgICAgdG1wID0gKmNJbnQyOworICAgICAgICBjSW50MiArPSAobHggPj4gMik7CisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDMgKz0gdG1wOworICAgIH0KKyAgICBzYWQxICs9IChzYWQxIDw8IDE2KTsKKyAgICBzYWQyICs9IChzYWQyIDw8IDE2KTsKKyAgICBzYWQzICs9IChzYWQzIDw8IDE2KTsKKyAgICBzYWQ0ICs9IChzYWQ0IDw8IDE2KTsKKyAgICBzYWQxID4+PSAxNjsKKyAgICBzYWQyID4+PSAxNjsKKyAgICBzYWQzID4+PSAxNjsKKyAgICBzYWQ0ID4+PSAxNjsKKworICAgIG1vdF9tYlsxXS5zYWQgPSBzYWQxOworICAgIG1vdF9tYlsyXS5zYWQgPSBzYWQyOworICAgIG1vdF9tYlszXS5zYWQgPSBzYWQzOworICAgIG1vdF9tYls0XS5zYWQgPSBzYWQ0OworICAgIG1vdF9tYlswXS5zYWQgPSBzYWQxICsgc2FkMiArIHNhZDMgKyBzYWQ0OworCisgICAgcmV0dXJuIDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWQyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKQEAgLTAsMCArMSwxOTY1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisKKy8vY29uc3Qgc3RhdGljIEludCByb3VuZHRhYjRbXSA9IHswLDEsMSwxfTsKKy8vY29uc3Qgc3RhdGljIEludCByb3VuZHRhYjhbXSA9IHswLDAsMSwxLDEsMSwxLDJ9OworLy9jb25zdCBzdGF0aWMgSW50IHJvdW5kdGFiMTJbXSA9IHswLDAsMCwxLDEsMSwxLDEsMSwxLDIsMn07Citjb25zdCBzdGF0aWMgSW50IHJvdW5kdGFiMTZbXSA9IHswLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyfTsKKworI2RlZmluZSBGT1JXQVJEX01PREUgICAgMQorI2RlZmluZSBCQUNLV0FSRF9NT0RFICAgMgorI2RlZmluZSBCSURJUkVDVElPTl9NT0RFICAgIDMKKyNkZWZpbmUgRElSRUNUX01PREUgICAgICAgICA0CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgLypGdW5jdGlvbiBQcm90b3R5cGUgKi8KKyAgICAvKiBuby1lZGdlIHBhZGRpbmcgKi8KKyAgICBJbnQgRW5jR2V0UHJlZE91dHNpZGUoSW50IHhwb3MsIEludCB5cG9zLCBVQ2hhciAqY19wcmV2LCBVQ2hhciAqcmVjLAorICAgIEludCB3aWR0aCwgSW50IGhlaWdodCwgSW50IHJuZDEpOworCisgICAgdm9pZCBDb3B5X01CX2Zyb21fVm9wKFVDaGFyICpjb21wLCBJbnQgeUNoYW5bXVtOQ09FRkZfQkxPQ0tdLCBJbnQgd2lkdGgpOworICAgIHZvaWQgQ29weV9CX2Zyb21fVm9wKFVDaGFyICpjb21wLCBJbnQgY0NoYW5bXSwgSW50IHdpZHRoKTsKKyAgICB2b2lkIENvcHlfTUJfaW50b19Wb3AoVUNoYXIgKmNvbXAsIEludCB5Q2hhbltdW05DT0VGRl9CTE9DS10sIEludCB3aWR0aCk7CisgICAgdm9pZCBDb3B5X0JfaW50b19Wb3AoVUNoYXIgKmNvbXAsIEludCBjQ2hhbltdLCBJbnQgd2lkdGgpOworICAgIHZvaWQgZ2V0X01CKFVDaGFyICpjX3ByZXYsIFVDaGFyICpjX3ByZXZfdSAgLCBVQ2hhciAqY19wcmV2X3YsCisgICAgICAgICAgICAgICAgU2hvcnQgbWJbNl1bNjRdLCBJbnQgbHgsIEludCBseF91dik7CisKKyAgICBJbnQgR2V0UHJlZEFkdkJ5MHgwKAorICAgICAgICBVQ2hhciAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgVUNoYXIgKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgICAgIEludCBybmQxIC8qIGkgKi8KKyAgICApOworCisgICAgSW50IEdldFByZWRBZHZCeTB4MSgKKyAgICAgICAgVUNoYXIgKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIFVDaGFyICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgSW50IGx4LCAgICAgLyogaSAqLworICAgICAgICBJbnQgcm5kMSAvKiBpICovCisgICAgKTsKKworICAgIEludCBHZXRQcmVkQWR2QnkxeDAoCisgICAgICAgIFVDaGFyICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICBVQ2hhciAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCisgICAgICAgIEludCBseCwgICAgIC8qIGkgKi8KKyAgICAgICAgSW50IHJuZDEgLyogaSAqLworICAgICk7CisKKyAgICBJbnQgR2V0UHJlZEFkdkJ5MXgxKAorICAgICAgICBVQ2hhciAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgVUNoYXIgKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgICAgIEludCBybmQxIC8qIGkgKi8KKyAgICApOworCisgICAgc3RhdGljIEludCgqY29uc3QgR2V0UHJlZEFkdkJUYWJsZVsyXVsyXSkoVUNoYXIqLCBVQ2hhciosIEludCwgSW50KSA9CisgICAgeworICAgICAgICB7JkdldFByZWRBZHZCeTB4MCwgJkdldFByZWRBZHZCeTB4MX0sCisgICAgICAgIHsmR2V0UHJlZEFkdkJ5MXgwLCAmR2V0UHJlZEFkdkJ5MXgxfQorICAgIH07CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IGdldE1vdGlvbkNvbXBlbnNhdGVkTUIoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xNy8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgdGhlIG1vdGlvbiBjb21wZW5zYXRlIGJsb2NrIGludG8gdmlkZW8tPnByZWRpY3Rpb25NQiAgICAgKi8KKy8qICAgICAgICAgICAgICBhbmQgZ2VuZXJhdGUgdmlkZW8tPnByZWRpY3Rpb25FcnJvck1CICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIG1vZGlmaWVkIGZyb20gTUJNb3Rpb25Db21wKCkgZnVuY3Rpb24gaW4gdGhlIGRlY29kZXIgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBnZXRNb3Rpb25Db21wZW5zYXRlZE1CKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBpbmRfeCwgSW50IGluZF95LCBJbnQgb2Zmc2V0KQoreworICAgIFZvcCAqcHJldlZvcCA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wOyAvL3JlZmVyZW5jZSBmcmFtZQorICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bTsgICAgICAgLy9tYiBpbmRleAorICAgIE1PVCAqbW90ID0gdmlkZW8tPm1vdFttYm51bV07CisgICAgSW50IHlwb3MsIHhwb3M7CisgICAgVUNoYXIgKmNfcHJldiwgKmN1X3ByZXYsICpjdl9wcmV2OworICAgIFVDaGFyICpjX3JlYywgKmN1X3JlYywgKmN2X3JlYzsKKyAgICBJbnQgaGVpZ2h0LCBwaXRjaCwgcGl0Y2hfdXYsIGhlaWdodF91djsKKyAgICBJbnQgbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOyAgLyogZ2V0IG1vZGUgKi8KKyAgICBJbnQgZHgsIGR5OworICAgIEludCB4cHJlZCwgeXByZWQ7CisgICAgSW50IHhzdW0sIHlzdW07CisgICAgSW50IHJvdW5kMTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhvZmZzZXQpOworCisgICAgcm91bmQxID0gKEludCkoMSAtIHZpZGVvLT5jdXJyVm9wLT5yb3VuZGluZ1R5cGUpOworCisgICAgcGl0Y2ggID0gY3VyclZvcC0+cGl0Y2g7CisgICAgaGVpZ2h0ID0gY3VyclZvcC0+aGVpZ2h0OworICAgIHBpdGNoX3V2ICA9IHBpdGNoID4+IDE7CisgICAgaGVpZ2h0X3V2ID0gaGVpZ2h0ID4+IDE7CisKKyAgICB5cG9zID0gaW5kX3kgPDwgNCA7CisgICAgeHBvcyA9IGluZF94IDw8IDQgOworCisgICAgY19yZWMgPSB2aWRlby0+cHJlZGljdGVkTUI7CisgICAgY3VfcmVjID0gdmlkZW8tPnByZWRpY3RlZE1CICsgMjU2OworICAgIGN2X3JlYyA9IHZpZGVvLT5wcmVkaWN0ZWRNQiArIDI2NDsKKworICAgIGlmIChtb2RlID09IE1PREVfSU5URVIgfHwgbW9kZSA9PSBNT0RFX0lOVEVSX1EpCisgICAgeworICAgICAgICAvKiBNb3Rpb24gdmVjdG9yIGluIHggZGlyZWN0aW9uICAgICAgICovCisgICAgICAgIGR4ID0gbW90WzBdLng7CisgICAgICAgIGR5ID0gbW90WzBdLnk7CisKKyAgICAgICAgY19wcmV2ICA9IHByZXZWb3AtPnlDaGFuOworCisgICAgICAgIHhwcmVkID0gKHhwb3MgPDwgMSkgKyBkeCA7CisgICAgICAgIHlwcmVkID0gKHlwb3MgPDwgMSkgKyBkeSA7CisKKyAgICAgICAgLyogQ2FsbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGx1bWluYW5jZSBwcmVkaWN0aW9uICovCisgICAgICAgIEVuY1ByZWRpY3Rpb25fSU5URVIoeHByZWQsIHlwcmVkLCBjX3ByZXYsIGNfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoLCByb3VuZDEpOworCisgICAgICAgIGlmICgoZHggJiAzKSA9PSAwKSAgZHggPSBkeCA+PiAxOworICAgICAgICBlbHNlICAgICAgICBkeCA9IChkeCA+PiAxKSB8IDE7CisKKyAgICAgICAgaWYgKChkeSAmIDMpID09IDApICAgICAgZHkgPSBkeSA+PiAxOworICAgICAgICBlbHNlICAgICAgICBkeSA9IChkeSA+PiAxKSB8IDE7CisKKyAgICAgICAgeHByZWQgPSB4cG9zICsgZHg7CisgICAgICAgIHlwcmVkID0geXBvcyArIGR5OworCisgICAgICAgIGN1X3ByZXYgPSBwcmV2Vm9wLT51Q2hhbjsKKyAgICAgICAgY3ZfcHJldiA9IHByZXZWb3AtPnZDaGFuOworCisgICAgICAgIEVuY1ByZWRpY3Rpb25fQ2hyb20oeHByZWQsIHlwcmVkLCBjdV9wcmV2LCBjdl9wcmV2LCBjdV9yZWMsIGN2X3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaF91diwgKGN1cnJWb3AtPndpZHRoKSA+PiAxLCBoZWlnaHRfdXYsIHJvdW5kMSk7CisgICAgfQorI2lmbmRlZiBOT19JTlRFUjRWCisgICAgZWxzZSBpZiAobW9kZSA9PSBNT0RFX0lOVEVSNFYpCisgICAgeworICAgICAgICBjX3ByZXYgID0gcHJldlZvcC0+eUNoYW47CisgICAgICAgIGN1X3ByZXYgPSBwcmV2Vm9wLT51Q2hhbjsKKyAgICAgICAgY3ZfcHJldiA9IHByZXZWb3AtPnZDaGFuOworCisgICAgICAgIEVuY1ByZWRpY3Rpb25fSU5URVI0Vih4cG9zLCB5cG9zLCBtb3QsIGNfcHJldiwgY19yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaCwgcm91bmQxKTsKKworICAgICAgICB4c3VtID0gbW90WzFdLnggKyBtb3RbMl0ueCArIG1vdFszXS54ICsgbW90WzRdLng7CisgICAgICAgIHlzdW0gPSBtb3RbMV0ueSArIG1vdFsyXS55ICsgbW90WzNdLnkgKyBtb3RbNF0ueTsKKworICAgICAgICBkeCA9IFBWX1NJR04oeHN1bSkgKiAocm91bmR0YWIxNlsoUFZfQUJTKHhzdW0pKSAmIDB4Rl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFZfQUJTKHhzdW0pKSA+PiA0KSA8PCAxKSk7CisgICAgICAgIGR5ID0gUFZfU0lHTih5c3VtKSAqIChyb3VuZHRhYjE2WyhQVl9BQlMoeXN1bSkpICYgMHhGXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQVl9BQlMoeXN1bSkpID4+IDQpIDw8IDEpKTsKKworICAgICAgICB5cHJlZCA9IHlwb3MgKyBkeTsKKyAgICAgICAgeHByZWQgPSB4cG9zICsgZHg7CisKKyAgICAgICAgRW5jUHJlZGljdGlvbl9DaHJvbSh4cHJlZCwgeXByZWQsIGN1X3ByZXYsIGN2X3ByZXYsIGN1X3JlYywgY3ZfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoX3V2LCAoY3VyclZvcC0+d2lkdGgpID4+IDEsIGhlaWdodF91diwgcm91bmQxKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgeworICAgICAgICA7Ly9wcmludGYoIkVycm9yLCBNT0RFX1NLSVBQRUQgaXMgbm90IGRlY2lkZWQgeWV0IVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZ1bmN0aW9uOiAgIEVuY1ByZWRpY3Rpb25fSU5URVIKKyAgICBEYXRlOiAgICAgICAwNC8xNy8yMDAxCisgICAgUHVycG9zZTogICAgR2V0IHByZWRpY3RlZCBhcmVhIGZvciBsdW1pbmFuY2UgYW5kIGNvbXBlbnNhdGUgd2l0aCB0aGUgcmVzaWR1ZS4KKyAgICAgICAgICAgICAgICBNb2RpZmllZCBmcm9tIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXIoKSBpbiBkZWNvZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEVuY1ByZWRpY3Rpb25fSU5URVIoCisgICAgSW50IHhwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgSW50IHlwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKmNfcHJldiwgICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjX3JlYywgICAgICAgLyogaSAqLworICAgIEludCBseCwgICAgICAgICAvKiBpICovCisgICAgSW50IHJvdW5kMSAgICAgICAgICAvKiBpICovCispCit7CisgICAgY19wcmV2ICs9ICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkgKiBseCk7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiwgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19wcmV2ICs9IEJfU0laRTsKKyAgICBjX3JlYyArPSBCX1NJWkU7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiwgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19wcmV2ICs9IChseCA8PCAzKSAtIEJfU0laRTsKKyAgICBjX3JlYyArPSAoMTYgPDwgMykgLSBCX1NJWkU7IC8qIHBhZGRpbmcgKi8KKworICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2LCBjX3JlYywgbHgsIHJvdW5kMSk7CisKKyAgICBjX3ByZXYgKz0gQl9TSVpFOworICAgIGNfcmVjICs9IEJfU0laRTsKKworICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2LCBjX3JlYywgbHgsIHJvdW5kMSk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZm5kZWYgTk9fSU5URVI0VgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZ1bmN0aW9uOiAgIEVuY1ByZWRpY3Rpb25fSU5URVI0VgorICAgIERhdGU6ICAgICAgIDA0LzE3LzIwMDEKKyAgICBQdXJwb3NlOiAgICBHZXQgcHJlZGljdGVkIGFyZWEgZm9yIGx1bWluYW5jZSBhbmQgY29tcGVuc2F0ZSB3aXRoIHRoZSByZXNpZHVlLgorICAgICAgICAgICAgICAgIE1vZGlmaWVkIGZyb20gbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2KCkgaW4gZGVjb2Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBFbmNQcmVkaWN0aW9uX0lOVEVSNFYoCisgICAgSW50IHhwb3MsICAgICAgICAgICAvKiBpICovCisgICAgSW50IHlwb3MsICAgICAgICAgICAvKiBpICovCisgICAgTU9UICptb3QsICAgICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKmNfcHJldiwgICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjX3JlYywgICAgICAgICAgIC8qIGkgKi8KKyAgICBJbnQgbHgsICAgICAgICAgLyogaSAqLworICAgIEludCByb3VuZDEgICAgICAgICAgLyogaSAqLworKQoreworICAgIEludCB5cHJlZCwgeHByZWQ7CisKKyAgICB4cHJlZCA9IChJbnQpKCh4cG9zIDw8IDEpICsgbW90WzFdLngpOworICAgIHlwcmVkID0gKEludCkoKHlwb3MgPDwgMSkgKyBtb3RbMV0ueSk7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19yZWMgKz0gQl9TSVpFOworCisgICAgeHByZWQgPSAoSW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgbW90WzJdLngpOworICAgIHlwcmVkID0gKEludCkoKHlwb3MgPDwgMSkgKyBtb3RbMl0ueSk7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19yZWMgKz0gKDE2IDw8IDMpIC0gQl9TSVpFOyAvKiBwYWRkaW5nICovCisKKyAgICB4cHJlZCA9IChJbnQpKCh4cG9zIDw8IDEpICsgbW90WzNdLngpOworICAgIHlwcmVkID0gKEludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIG1vdFszXS55KTsKKworICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3JlYywgbHgsIHJvdW5kMSk7CisKKyAgICBjX3JlYyArPSBCX1NJWkU7CisKKyAgICB4cHJlZCA9IChJbnQpKCgoeHBvcyArIEJfU0laRSkgPDwgMSkgKyBtb3RbNF0ueCk7CisgICAgeXByZWQgPSAoSW50KSgoKHlwb3MgKyBCX1NJWkUpIDw8IDEpICsgbW90WzRdLnkpOworCisgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcmVjLCBseCwgcm91bmQxKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBOT19JTlRFUjRWICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGdW5jdGlvbjogICBFbmNQcmVkaWN0aW9uX0Nocm9tCisgICAgRGF0ZTogICAgICAgMDQvMTcvMjAwMQorICAgIFB1cnBvc2U6ICAgIEdldCBwcmVkaWN0ZWQgYXJlYSBmb3IgY2hyb21pbmFuY2UgYW5kIGNvbXBlbnNhdGUgd2l0aCB0aGUgcmVzaWR1ZS4KKyAgICAgICAgICAgICAgICBNb2RpZmllZCBmcm9tIGNocm9taW5hbmNlX3ByZWQoKSBpbiBkZWNvZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEVuY1ByZWRpY3Rpb25fQ2hyb20oCisgICAgSW50IHhwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgSW50IHlwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKmN1X3ByZXYsICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjdl9wcmV2LCAgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqY3VfcmVjLAorICAgIFVDaGFyICpjdl9yZWMsCisgICAgSW50IGx4LAorICAgIEludCB3aWR0aF91diwgICAgICAgICAgIC8qIGkgKi8KKyAgICBJbnQgaGVpZ2h0X3V2LCAgICAgICAgICAvKiBpICovCisgICAgSW50IHJvdW5kMSAgICAgICAgICAvKiBpICovCispCit7CisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSBiIGJsb2NrIChibG9ja1s0XSkgKi8KKyAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoX3V2IDw8IDEpIC0gKDIqQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgorICAgICAgICAgICAgeXByZWQgPD0gKChoZWlnaHRfdXYgPDwgMSkgLSAoMipCX1NJWkUpKSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSBiIChibG9ja1s0XSkgKi8KKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjdV9wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VfcmVjLCBseCwgcm91bmQxKTsKKworICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIHIgKGJsb2NrWzVdKSAqLworICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGN2X3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdl9yZWMsICBseCwgcm91bmQxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIGIgKGJsb2NrWzRdKSAqLworICAgICAgICBFbmNHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1X3ByZXYsIGN1X3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfdXYsIGhlaWdodF91diwgcm91bmQxKTsKKworICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIHIgKGJsb2NrWzVdKSAqLworICAgICAgICBFbmNHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN2X3ByZXYsIGN2X3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfdXYsIGhlaWdodF91diwgcm91bmQxKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRnVuY3Rpb246ICAgR2V0UHJlZEFkdmFuY2VkQgorICAgIERhdGU6ICAgICAgIDA0LzE3LzIwMDEKKyAgICBQdXJwb3NlOiAgICBHZXQgcHJlZGljdGVkIGFyZWEgKGJsb2NrKSBhbmQgY29tcGVuc2F0ZSB3aXRoIHRoZSByZXNpZHVlLgorICAgICAgICAgICAgICAgIC0gbW9kaWZpZWQgZnJvbSBHZXRQcmVkQWR2YW5jZWRCQWRkIGluIGRlY29kZXIuCisgICAgSW50cHV0L091dHB1dDoKKyAgICBNb2RpZmllZDoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSW50IEdldFByZWRBZHZCeTB4MCgKKyAgICBVQ2hhciAqcHJldiwgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqcmVjLCAgICAgLyogaSAqLworICAgIEludCBseCwgICAgIC8qIGkgKi8KKyAgICBJbnQgcm5kIC8qIGkgKi8KKykKK3sKKyAgICBJbnQgaTsgICAgICAvKiBsb29wIHZhcmlhYmxlICovCisgICAgVUxvbmcgIHByZWRfd29yZCwgd29yZDEsIHdvcmQyOworICAgIEludCB0bXA7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcocm5kKTsKKworICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCisgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KKworICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMHgzOworCisgICAgaWYgKHRtcCA9PSAwKSAgLyogd29yZC1hbGlnbmVkICovCisgICAgeworICAgICAgICByZWMgLT0gMTY7IC8qIHByZXNldCAqLworICAgICAgICBwcmV2IC09IGx4OworCisgICAgICAgIGZvciAoaSA9IDg7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDE2KSkgPSAqKChVTG9uZyopKHByZXYgKz0gbHgpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmV2ICsgNCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh0bXAgPT0gMSkgLyogZmlyc3QgcG9zaXRpb24gKi8KKyAgICB7CisgICAgICAgIHByZXYtLTsgLyogd29yZC1hbGlnbmVkICovCisgICAgICAgIHJlYyAtPSAxNjsgLyogcHJlc2V0ICovCisgICAgICAgIHByZXYgLT0gbHg7CisKKyAgICAgICAgZm9yIChpID0gODsgaSA+IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzLCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyA0KSk7ICAvKiByZWFkIDQgYnl0ZXMsIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICB3b3JkMSA+Pj0gODsgLyogMCBiNCBiMyBiMiAqLworICAgICAgICAgICAgcHJlZF93b3JkID0gd29yZDEgfCAod29yZDIgPDwgMjQpOyAgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDE2KSkgPSBwcmVkX3dvcmQ7CisKKyAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICsgOCkpOyAvKiBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgd29yZDIgPj49IDg7IC8qIDAgYjggYjcgYjYgKi8KKyAgICAgICAgICAgIHByZWRfd29yZCA9IHdvcmQyIHwgKHdvcmQxIDw8IDI0KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gcHJlZF93b3JkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAyKSAvKiBzZWNvbmQgcG9zaXRpb24gKi8KKyAgICB7CisgICAgICAgIHByZXYgLT0gMjsgLyogd29yZDEtYWxpZ25lZCAqLworICAgICAgICByZWMgLT0gMTY7IC8qIHByZXNldCAqLworICAgICAgICBwcmV2IC09IGx4OworCisgICAgICAgIGZvciAoaSA9IDg7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcywgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgNCkpOyAgLyogcmVhZCA0IGJ5dGVzLCBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgd29yZDEgPj49IDE2OyAvKiAwIDAgYjQgYjMgKi8KKyAgICAgICAgICAgIHByZWRfd29yZCA9IHdvcmQxIHwgKHdvcmQyIDw8IDE2KTsgIC8qIGI2IGI1IGI0IGIzICovCisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxNikpID0gcHJlZF93b3JkOworCisgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArIDgpKTsgLyogYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgIHdvcmQyID4+PSAxNjsgLyogMCAwIGI4IGI3ICovCisgICAgICAgICAgICBwcmVkX3dvcmQgPSB3b3JkMiB8ICh3b3JkMSA8PCAxNik7IC8qIGIxMCBiOSBiOCBiNyAqLworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSBwcmVkX3dvcmQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSAvKiB0aGlyZCBwb3NpdGlvbiAqLworICAgIHsKKyAgICAgICAgcHJldiAtPSAzOyAvKiB3b3JkMS1hbGlnbmVkICovCisgICAgICAgIHJlYyAtPSAxNjsgLyogcHJlc2V0ICovCisgICAgICAgIHByZXYgLT0gbHg7CisKKyAgICAgICAgZm9yIChpID0gODsgaSA+IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzLCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyA0KSk7ICAvKiByZWFkIDQgYnl0ZXMsIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICB3b3JkMSA+Pj0gMjQ7IC8qIDAgMCAwIGI0ICovCisgICAgICAgICAgICBwcmVkX3dvcmQgPSB3b3JkMSB8ICh3b3JkMiA8PCA4KTsgICAvKiBiNyBiNiBiNSBiNCAqLworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTYpKSA9IHByZWRfd29yZDsKKworICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKyA4KSk7IC8qIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICB3b3JkMiA+Pj0gMjQ7IC8qIDAgMCAwIGI4ICovCisgICAgICAgICAgICBwcmVkX3dvcmQgPSB3b3JkMiB8ICh3b3JkMSA8PCA4KTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSBwcmVkX3dvcmQ7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ludCBHZXRQcmVkQWR2QnkweDEoCisgICAgVUNoYXIgKnByZXYsICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKnJlYywgICAgIC8qIGkgKi8KKyAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgSW50IHJuZDEgLyogaSAqLworKQoreworICAgIEludCBpOyAgICAgIC8qIGxvb3AgdmFyaWFibGUgKi8KKyAgICBJbnQgb2Zmc2V0OworICAgIFVMb25nIHdvcmQxLCB3b3JkMiwgd29yZDMsIHdvcmQxMjsKKyAgICBJbnQgdG1wOworICAgIFVMb25nIG1hc2s7CisKKyAgICAvKiBpbml0aWFsaXplIG9mZnNldCB0byBhZGp1c3QgcGl4ZWwgY291bnRlciAqLworICAgIC8qICAgIHRoZSBuZXh0IHJvdzsgZnVsbC1wZWwgcmVzb2x1dGlvbiAgICAgICovCisgICAgb2Zmc2V0ID0gbHggLSBCX1NJWkU7IC8qIG9mZnNldCBmb3IgcHJldiAqLworCisgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KKyAgICByZWMgLT0gMTI7IC8qIHByZXNldCAqLworCisgICAgdG1wID0gKFVMb25nKXByZXYgJiAzOworICAgIG1hc2sgPSAyNTQ7CisgICAgbWFzayB8PSAobWFzayA8PCA4KTsKKyAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLworCisgICAgaWYgKHRtcCA9PSAwKSAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICB7CisgICAgICAgIGlmIChybmQxID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKilwcmV2KTsgLyogYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQxID4+IDgpOyAvKiAwIGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCAyNCk7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDIgPj4gOCk7IC8qIDAgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDI0KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQyIHwgd29yZDEyOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgIC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMjsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBybmQxID09IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiNCBiMyBiMiBiMSAqLworCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiA4KTsgLyogMCBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgMjQpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDgpOyAvKiAwIGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAyNCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMiAmIHdvcmQxMjsKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7ICAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IC8qIHJuZDEgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodG1wID09IDEpCisgICAgeworICAgICAgICBwcmV2LS07IC8qIHdvcmQtYWxpZ25lZCAqLworICAgICAgICBpZiAocm5kMSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopcHJldik7IC8qIGIzIGIyIGIxIGIwICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiNyBiNiBiNSBiNCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiA4KTsgLyogMCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxNjsgLyogMCAwIGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCAyNCk7IC8qIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQyIDw8IDE2KTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiMTEgYjEwIGI5IGI4ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDgpOyAvKiAwIGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE2OyAvKiAwIDAgYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDI0KTsgLyogYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiB8PSAod29yZDEgPDwgMTYpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMiZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMjsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBybmQxID0gMCAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopcHJldik7IC8qIGIzIGIyIGIxIGIwICovCisKKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI3IGI2IGI1IGI0ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQxID4+IDgpOyAvKiAwIGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE2OyAvKiAwIDAgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQyIDw8IDI0KTsgLyogYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSB8PSAod29yZDIgPDwgMTYpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMTI7CisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiMTEgYjEwIGI5IGI4ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDgpOyAvKiAwIGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE2OyAvKiAwIDAgYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDI0KTsgLyogYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiB8PSAod29yZDEgPDwgMTYpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgJiB3b3JkMTI7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IC8qIHJuZDEgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodG1wID09IDIpCisgICAgeworICAgICAgICBwcmV2IC09IDI7IC8qIHdvcmQtYWxpZ25lZCAqLworICAgICAgICBpZiAocm5kMSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopcHJldik7IC8qIGIyIGIxIGIwIGJOMSAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjYgYjUgYjQgYjMgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDEgPj4gMTYpOyAvKiAwIDAgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMjQ7IC8qIDAgMCAwIGIyICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCAxNik7IC8qIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQyIDw8IDgpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGIxMCBiOSBiOCBiNyAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMiA+PiAxNik7IC8qIDAgMCBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAyNDsgLyogMCAwIDAgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDE2KTsgLyogYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiB8PSAod29yZDEgPDwgOCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMiB8IHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQyOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBybmQxID09IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMiBiMSBiMCBiTjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI2IGI1IGI0IGIzICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQxID4+IDE2KTsgLyogMCAwIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDI0OyAvKiAwIDAgMCBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgMTYpOyAvKiBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMiA8PCA4KTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiMTAgYjkgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDIgPj4gMTYpOyAvKiAwIDAgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMjQ7IC8qIDAgMCAwIGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAxNik7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgfD0gKHdvcmQxIDw8IDgpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgJiB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMjsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogdG1wID0gMyAqLworICAgIHsKKyAgICAgICAgcHJldiAtPSAzOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMSBiMCBiTjEgYk4yICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiAyNCk7IC8qIDAgMCAwIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCA4KTsgLyogYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDI0KTsgLyogMCAwIDAgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDgpOyAvKiBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDE7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMiB8IHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQyOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopcHJldik7IC8qIGIxIGIwIGJOMSBiTjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQxID4+IDI0KTsgLyogMCAwIDAgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQyIDw8IDgpOyAvKiBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDI7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDIgPj4gMjQpOyAvKiAwIDAgMCBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDEgPDwgOCk7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQyICYgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSW50IEdldFByZWRBZHZCeTF4MCgKKyAgICBVQ2hhciAqcHJldiwgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqcmVjLCAgICAgLyogaSAqLworICAgIEludCBseCwgICAgIC8qIGkgKi8KKyAgICBJbnQgcm5kMSAvKiBpICovCispCit7CisgICAgSW50IGk7ICAgICAgLyogbG9vcCB2YXJpYWJsZSAqLworICAgIEludCBvZmZzZXQ7CisgICAgVUxvbmcgIHdvcmQxLCB3b3JkMiwgd29yZDMsIHdvcmQxMiwgd29yZDIyOworICAgIEludCB0bXA7CisgICAgVUxvbmcgbWFzazsKKworICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCisgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KKyAgICBvZmZzZXQgPSBseCAtIEJfU0laRTsgLyogb2Zmc2V0IGZvciBwcmV2ICovCisKKyAgICAvKiBCcmFuY2ggYmFzZWQgb24gcGl4ZWwgbG9jYXRpb24gKGhhbGYtcGVsIG9yIGZ1bGwtcGVsKSBmb3IgeCBhbmQgeSAqLworICAgIHJlYyAtPSAxMjsgLyogcHJlc2V0ICovCisKKyAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDM7CisgICAgbWFzayA9IDI1NDsKKyAgICBtYXNrIHw9IChtYXNrIDw8IDgpOworICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCisKKyAgICBpZiAodG1wID09IDApIC8qIHdvcmQtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgcHJldiAtPSA0OworICAgICAgICBpZiAocm5kMSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIHJuZDEgPSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7CisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMjsgIC8qIHJuZDEgPSAwOyAqLworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDI7ICAvKiBybmQxID0gMDsgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAxKQorICAgIHsKKyAgICAgICAgcHJldi0tOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKilwcmV2KTsgLyogcmVhZCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEyID4+PSA4OyAvKiAwIGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSA4OworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiB8ICh3b3JkMSA8PCAyNCk7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gd29yZDIyIHwgKHdvcmQyIDw8IDI0KTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxMiB8IHdvcmQyMjsKKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMjIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiArICh3b3JkMjIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTI7CisKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gODsgLyogMCBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSA4OworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgfCAod29yZDEyIDw8IDI0KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCAyNCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcm5kMSA9IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKilwcmV2KTsgLyogcmVhZCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEyID4+PSA4OyAvKiAwIGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSA4OworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiB8ICh3b3JkMSA8PCAyNCk7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gd29yZDIyIHwgKHdvcmQyIDw8IDI0KTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxMiAmIHdvcmQyMjsKKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMjIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiArICh3b3JkMjIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTI7CisKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gODsgLyogMCBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSA4OworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgfCAod29yZDEyIDw8IDI0KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCAyNCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAyKQorICAgIHsKKyAgICAgICAgcHJldiAtPSAyOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKilwcmV2KTsgLyogcmVhZCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAxNjsgLyogMCAwIGI0IGIzICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSAxNjsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgMTYpOyAvKiBiNiBiNSBiNCBiMyAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9IHdvcmQyMiB8ICh3b3JkMiA8PCAxNik7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMTIgfCB3b3JkMjI7CisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgKyAod29yZDIyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDEyOworCisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE2OyAvKiAwIDAgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTY7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSB8ICh3b3JkMTIgPDwgMTYpOyAvKiBiMTAgYjkgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCAxNik7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcm5kMSA9IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKilwcmV2KTsgLyogcmVhZCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAxNjsgLyogMCAwIGI0IGIzICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSAxNjsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgMTYpOyAvKiBiNiBiNSBiNCBiMyAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9IHdvcmQyMiB8ICh3b3JkMiA8PCAxNik7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMTIgJiB3b3JkMjI7CisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgKyAod29yZDIyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDEyOworCisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE2OyAvKiAwIDAgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTY7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSB8ICh3b3JkMTIgPDwgMTYpOyAvKiBiMTAgYjkgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCAxNik7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiB0bXAgPT0gMyAqLworICAgIHsKKyAgICAgICAgcHJldiAtPSAzOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKilwcmV2KTsgLyogcmVhZCBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAyNDsgLyogMCAwIDAgYjQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPj49IDI0OworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiB8ICh3b3JkMSA8PCA4KTsgLyogYjcgYjYgYjUgYjQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSB3b3JkMjIgfCAod29yZDIgPDwgOCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMTIgfCB3b3JkMjI7CisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgKyAod29yZDIyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDEyOworCisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDI0OyAvKiAwIDAgMCBiOCAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAyNDsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxIHwgKHdvcmQxMiA8PCA4KTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgfCAod29yZDIyIDw8IDgpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHJuZDEgPSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMjQ7IC8qIDAgMCAwIGI0ICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSAyNDsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgOCk7IC8qIGI3IGI2IGI1IGI0ICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gd29yZDIyIHwgKHdvcmQyIDw8IDgpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEyICYgd29yZDIyOworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyICsgKHdvcmQyMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxMjsKKworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAyNDsgLyogMCAwIDAgYjggKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMjQ7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSB8ICh3b3JkMTIgPDwgOCk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCA4KTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDI7CisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQxOworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gLyogcm5kICovCisgICAgfSAvKiB0bXAgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJbnQgR2V0UHJlZEFkdkJ5MXgxKAorICAgIFVDaGFyICpwcmV2LCAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpyZWMsICAgICAvKiBpICovCisgICAgSW50IGx4LCAgICAgLyogaSAqLworICAgIEludCBybmQxIC8qIGkgKi8KKykKK3sKKyAgICBJbnQgaTsgICAgICAvKiBsb29wIHZhcmlhYmxlICovCisgICAgSW50IG9mZnNldDsKKyAgICBVTG9uZyAgeDEsIHgyLCB4MW0sIHgybSwgeTEsIHkyLCB5MW0sIHkybTsgLyogbmV3IHdheSAqLworICAgIEludCB0bXA7CisgICAgSW50IHJuZDI7CisgICAgVUxvbmcgbWFzazsKKworICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCisgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KKyAgICBvZmZzZXQgPSBseCAtIEJfU0laRTsgLyogb2Zmc2V0IGZvciBwcmV2ICovCisKKyAgICBybmQyID0gcm5kMSArIDE7CisgICAgcm5kMiB8PSAocm5kMiA8PCA4KTsKKyAgICBybmQyIHw9IChybmQyIDw8IDE2KTsKKworICAgIG1hc2sgPSAweDNGOworICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CisgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4M2YzZjNmM2YgKi8KKworICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKworICAgIHJlYyAtPSA0OyAvKiBwcmVzZXQgKi8KKworICAgIGlmICh0bXAgPT0gMCkgLyogd29yZC1hbGlnbmVkICovCisgICAgeworICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHgxID0gKigoVUxvbmcqKXByZXYpOyAvKiBsb2FkIGEzIGEyIGExIGEwICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGxvYWQgYjMgYjIgYjEgYjAsIGFub3RoZXIgbGluZSAqLworICAgICAgICAgICAgeTEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhNyBhNiBhNSBhNCAqLworICAgICAgICAgICAgeTIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBiNyBiNiBiNSBiNCAqLworCisgICAgICAgICAgICB4MW0gPSAoeDEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHgxID0geDEgXih4MW0gPDwgMik7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeDFtICs9IHgybTsKKyAgICAgICAgICAgIHgxICs9IHgyOworCisgICAgICAgICAgICAvKiB4Mm0sIHgyIGZyZWUgKi8KKyAgICAgICAgICAgIHkxbSA9ICh5MSA+PiAyKSAmIG1hc2s7IC8qIHplcm8gb3V0IGxhc3QgMiBiaXRzICovCisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeTEgPSB5MSBeKHkxbSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB5MW0gKz0geTJtOworICAgICAgICAgICAgeTEgKz0geTI7CisKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGExMSBhMTAgYTkgYTggKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkybSA9ICh5MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeTIgPSB5MiBeKHkybSA8PCAyKTsKKyAgICAgICAgICAgIHgybSArPSB5Mm07CisgICAgICAgICAgICB4MiArPSB5MjsKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworCisgICAgICAgICAgICAvKiBub3cgb3BlcmF0ZSBvbiB4MW0sIHgxLCB5MW0sIHkxLCB4Mm0sIHgyICovCisgICAgICAgICAgICAvKiB4MW0gPSBhMytiMywgYTIrYjIsIGExK2IxLCBhMCtiMCAqLworICAgICAgICAgICAgLyogeTFtID0gYTcrYjcsIGE2K2I2LCBhNStiNSwgYTQrYjQgKi8KKyAgICAgICAgICAgIC8qIHgybSA9IGExMStiMTEsIGExMCtiMTAsIGE5K2I5LCBhOCtiOCAqLworICAgICAgICAgICAgLyogeDEsIHkxLCB4MiAqLworCisgICAgICAgICAgICB5Mm0gPSB4MW0gPj4gODsKKyAgICAgICAgICAgIHkyID0geDEgPj4gODsKKyAgICAgICAgICAgIHkybSB8PSAoeTFtIDw8IDI0KTsgIC8qIGE0K2I0LCBhMytiMywgYTIrYjIsIGExK2IxICovCisgICAgICAgICAgICB5MiB8PSAoeTEgPDwgMjQpOworICAgICAgICAgICAgeDFtICs9IHkybTsgIC8qIGEzK2IzK2E0K2I0LCAuLi4uLiwgYTArYjArYTErYjEgKi8KKyAgICAgICAgICAgIHgxICs9IHkyOworICAgICAgICAgICAgeDEgKz0gcm5kMjsKKyAgICAgICAgICAgIHgxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeDFtICs9ICh4MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHgxbTsgLyogc2F2ZSB4MW0gKi8KKworICAgICAgICAgICAgeTJtID0geTFtID4+IDg7CisgICAgICAgICAgICB5MiA9IHkxID4+IDg7CisgICAgICAgICAgICB5Mm0gfD0gKHgybSA8PCAyNCk7IC8qIGE4K2I4LCBhNytiNywgYTYrYjYsIGE1K2I1ICovCisgICAgICAgICAgICB5MiB8PSAoeDIgPDwgMjQpOworICAgICAgICAgICAgeTFtICs9IHkybTsgIC8qIGE3K2I3K2E4K2I4LCAuLi4uLiwgYTQrYjQrYTUrYjUgKi8KKyAgICAgICAgICAgIHkxICs9IHkyOworICAgICAgICAgICAgeTEgKz0gcm5kMjsKKyAgICAgICAgICAgIHkxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeTFtICs9ICh5MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHkxbTsgLyogc2F2ZSB5MW0gKi8KKworICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh0bXAgPT0gMSkKKyAgICB7CisgICAgICAgIHByZXYtLTsgLyogdG8gd29yZC1hbGlnbmVkICovCisgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgeDEgPSAqKChVTG9uZyopcHJldik7IC8qIGxvYWQgYTMgYTIgYTEgYTAgKi8KKyAgICAgICAgICAgIHgyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogbG9hZCBiMyBiMiBiMSBiMCwgYW5vdGhlciBsaW5lICovCisgICAgICAgICAgICB5MSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGE3IGE2IGE1IGE0ICovCisgICAgICAgICAgICB5MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGI3IGI2IGI1IGI0ICovCisKKyAgICAgICAgICAgIHgxbSA9ICh4MSA+PiAyKSAmIG1hc2s7IC8qIHplcm8gb3V0IGxhc3QgMiBiaXRzICovCisgICAgICAgICAgICB4Mm0gPSAoeDIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeDEgPSB4MSBeKHgxbSA8PCAyKTsKKyAgICAgICAgICAgIHgyID0geDIgXih4Mm0gPDwgMik7CisgICAgICAgICAgICB4MW0gKz0geDJtOworICAgICAgICAgICAgeDEgKz0geDI7CisKKyAgICAgICAgICAgIC8qIHgybSwgeDIgZnJlZSAqLworICAgICAgICAgICAgeTFtID0gKHkxID4+IDIpICYgbWFzazsgLyogemVybyBvdXQgbGFzdCAyIGJpdHMgKi8KKyAgICAgICAgICAgIHkybSA9ICh5MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB5MSA9IHkxIF4oeTFtIDw8IDIpOworICAgICAgICAgICAgeTIgPSB5MiBeKHkybSA8PCAyKTsKKyAgICAgICAgICAgIHkxbSArPSB5Mm07CisgICAgICAgICAgICB5MSArPSB5MjsKKworICAgICAgICAgICAgLyogeTJtLCB5MiBmcmVlICovCisgICAgICAgICAgICAvKiB4Mm0sIHgyIGZyZWUgKi8KKyAgICAgICAgICAgIHgyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYTExIGExMCBhOSBhOCAqLworICAgICAgICAgICAgeTIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBiMTEgYjEwIGI5IGI4ICovCisgICAgICAgICAgICB4Mm0gPSAoeDIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeTJtID0gKHkyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHgyID0geDIgXih4Mm0gPDwgMik7CisgICAgICAgICAgICB5MiA9IHkyIF4oeTJtIDw8IDIpOworICAgICAgICAgICAgeDJtICs9IHkybTsKKyAgICAgICAgICAgIHgyICs9IHkyOworICAgICAgICAgICAgLyogeTJtLCB5MiBmcmVlICovCisKKyAgICAgICAgICAgIC8qIG5vdyBvcGVyYXRlIG9uIHgxbSwgeDEsIHkxbSwgeTEsIHgybSwgeDIgKi8KKyAgICAgICAgICAgIC8qIHgxbSA9IGEzK2IzLCBhMitiMiwgYTErYjEsIGEwK2IwICovCisgICAgICAgICAgICAvKiB5MW0gPSBhNytiNywgYTYrYjYsIGE1K2I1LCBhNCtiNCAqLworICAgICAgICAgICAgLyogeDJtID0gYTExK2IxMSwgYTEwK2IxMCwgYTkrYjksIGE4K2I4ICovCisgICAgICAgICAgICAvKiB4MSwgeTEsIHgyICovCisKKyAgICAgICAgICAgIHgxbSA+Pj0gOCA7CisgICAgICAgICAgICB4MSA+Pj0gODsKKyAgICAgICAgICAgIHgxbSB8PSAoeTFtIDw8IDI0KTsgIC8qIGE0K2I0LCBhMytiMywgYTIrYjIsIGExK2IxICovCisgICAgICAgICAgICB4MSB8PSAoeTEgPDwgMjQpOworICAgICAgICAgICAgeTJtID0gKHkxbSA8PCAxNik7CisgICAgICAgICAgICB5MiA9ICh5MSA8PCAxNik7CisgICAgICAgICAgICB5Mm0gfD0gKHgxbSA+PiA4KTsgLyogYTUrYjUsIGE0K2I0LCBhMytiMywgYTIrYjIgKi8KKyAgICAgICAgICAgIHkyIHw9ICh4MSA+PiA4KTsKKyAgICAgICAgICAgIHgxICs9IHJuZDI7CisgICAgICAgICAgICB4MW0gKz0geTJtOyAgLyogYTQrYjQrYTUrYjUsIC4uLi4uLCBhMStiMSthMitiMiAqLworICAgICAgICAgICAgeDEgKz0geTI7CisgICAgICAgICAgICB4MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSAoeDEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB4MW07IC8qIHNhdmUgeDFtICovCisKKyAgICAgICAgICAgIHkxbSA+Pj0gODsKKyAgICAgICAgICAgIHkxID4+PSA4OworICAgICAgICAgICAgeTFtIHw9ICh4Mm0gPDwgMjQpOyAvKiBhOCtiOCwgYTcrYjcsIGE2K2I2LCBhNStiNSAqLworICAgICAgICAgICAgeTEgfD0gKHgyIDw8IDI0KTsKKyAgICAgICAgICAgIHkybSA9ICh4Mm0gPDwgMTYpOworICAgICAgICAgICAgeTIgPSAoeDIgPDwgMTYpOworICAgICAgICAgICAgeTJtIHw9ICh5MW0gPj4gOCk7IC8qICBhOStiOSwgYTgrYjgsIGE3K2I3LCBhNitiNiwqLworICAgICAgICAgICAgeTIgfD0gKHkxID4+IDgpOworICAgICAgICAgICAgeTEgKz0gcm5kMjsKKyAgICAgICAgICAgIHkxbSArPSB5Mm07ICAvKiBhOCtiOCthOStiOSwgLi4uLi4sIGE1K2I1K2E2K2I2ICovCisgICAgICAgICAgICB5MSArPSB5MjsKKyAgICAgICAgICAgIHkxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeTFtICs9ICh5MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHkxbTsgLyogc2F2ZSB5MW0gKi8KKworICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAodG1wID09IDIpCisgICAgeworICAgICAgICBwcmV2IC09IDI7IC8qIHRvIHdvcmQtYWxpZ25lZCAqLworICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHgxID0gKigoVUxvbmcqKXByZXYpOyAvKiBsb2FkIGEzIGEyIGExIGEwICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGxvYWQgYjMgYjIgYjEgYjAsIGFub3RoZXIgbGluZSAqLworICAgICAgICAgICAgeTEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhNyBhNiBhNSBhNCAqLworICAgICAgICAgICAgeTIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBiNyBiNiBiNSBiNCAqLworCisgICAgICAgICAgICB4MW0gPSAoeDEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHgxID0geDEgXih4MW0gPDwgMik7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeDFtICs9IHgybTsKKyAgICAgICAgICAgIHgxICs9IHgyOworCisgICAgICAgICAgICAvKiB4Mm0sIHgyIGZyZWUgKi8KKyAgICAgICAgICAgIHkxbSA9ICh5MSA+PiAyKSAmIG1hc2s7IC8qIHplcm8gb3V0IGxhc3QgMiBiaXRzICovCisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeTEgPSB5MSBeKHkxbSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB5MW0gKz0geTJtOworICAgICAgICAgICAgeTEgKz0geTI7CisKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGExMSBhMTAgYTkgYTggKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkybSA9ICh5MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeTIgPSB5MiBeKHkybSA8PCAyKTsKKyAgICAgICAgICAgIHgybSArPSB5Mm07CisgICAgICAgICAgICB4MiArPSB5MjsKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworCisgICAgICAgICAgICAvKiBub3cgb3BlcmF0ZSBvbiB4MW0sIHgxLCB5MW0sIHkxLCB4Mm0sIHgyICovCisgICAgICAgICAgICAvKiB4MW0gPSBhMytiMywgYTIrYjIsIGExK2IxLCBhMCtiMCAqLworICAgICAgICAgICAgLyogeTFtID0gYTcrYjcsIGE2K2I2LCBhNStiNSwgYTQrYjQgKi8KKyAgICAgICAgICAgIC8qIHgybSA9IGExMStiMTEsIGExMCtiMTAsIGE5K2I5LCBhOCtiOCAqLworICAgICAgICAgICAgLyogeDEsIHkxLCB4MiAqLworCisgICAgICAgICAgICB4MW0gPj49IDE2IDsKKyAgICAgICAgICAgIHgxID4+PSAxNjsKKyAgICAgICAgICAgIHgxbSB8PSAoeTFtIDw8IDE2KTsgIC8qIGE1K2I1LCBhNCtiNCwgYTMrYjMsIGEyK2IyICovCisgICAgICAgICAgICB4MSB8PSAoeTEgPDwgMTYpOworICAgICAgICAgICAgeTJtID0gKHkxbSA8PCA4KTsKKyAgICAgICAgICAgIHkyID0gKHkxIDw8IDgpOworICAgICAgICAgICAgeTJtIHw9ICh4MW0gPj4gOCk7IC8qIGE2K2I2LCBhNStiNSwgYTQrYjQsIGEzK2IzICovCisgICAgICAgICAgICB5MiB8PSAoeDEgPj4gOCk7CisgICAgICAgICAgICB4MSArPSBybmQyOworICAgICAgICAgICAgeDFtICs9IHkybTsgIC8qIGE1K2I1K2E2K2I2LCAuLi4uLiwgYTIrYjIrYTMrYjMgKi8KKyAgICAgICAgICAgIHgxICs9IHkyOworICAgICAgICAgICAgeDEgJj0gKG1hc2sgPDwgMik7CisgICAgICAgICAgICB4MW0gKz0gKHgxID4+IDIpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0geDFtOyAvKiBzYXZlIHgxbSAqLworCisgICAgICAgICAgICB5MW0gPj49IDE2OworICAgICAgICAgICAgeTEgPj49IDE2OworICAgICAgICAgICAgeTFtIHw9ICh4Mm0gPDwgMTYpOyAvKiBhOStiOSwgYTgrYjgsIGE3K2I3LCBhNitiNiAqLworICAgICAgICAgICAgeTEgfD0gKHgyIDw8IDE2KTsKKyAgICAgICAgICAgIHkybSA9ICh4Mm0gPDwgOCk7CisgICAgICAgICAgICB5MiA9ICh4MiA8PCA4KTsKKyAgICAgICAgICAgIHkybSB8PSAoeTFtID4+IDgpOyAvKiAgYTEwK2IxMCwgYTkrYjksIGE4K2I4LCBhNytiNywqLworICAgICAgICAgICAgeTIgfD0gKHkxID4+IDgpOworICAgICAgICAgICAgeTEgKz0gcm5kMjsKKyAgICAgICAgICAgIHkxbSArPSB5Mm07ICAvKiBhOStiOSthMTArYjEwLCAuLi4uLiwgYTYrYjYrYTcrYjcgKi8KKyAgICAgICAgICAgIHkxICs9IHkyOworICAgICAgICAgICAgeTEgJj0gKG1hc2sgPDwgMik7CisgICAgICAgICAgICB5MW0gKz0gKHkxID4+IDIpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0geTFtOyAvKiBzYXZlIHkxbSAqLworCisgICAgICAgICAgICByZWMgKz0gODsKKyAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIC8qIHRtcCA9PSAzICovCisgICAgeworICAgICAgICBwcmV2IC09IDM7IC8qIHRvIHdvcmQtYWxpZ25lZCAqLworICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHgxID0gKigoVUxvbmcqKXByZXYpOyAvKiBsb2FkIGEzIGEyIGExIGEwICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGxvYWQgYjMgYjIgYjEgYjAsIGFub3RoZXIgbGluZSAqLworICAgICAgICAgICAgeTEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhNyBhNiBhNSBhNCAqLworICAgICAgICAgICAgeTIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBiNyBiNiBiNSBiNCAqLworCisgICAgICAgICAgICB4MW0gPSAoeDEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHgxID0geDEgXih4MW0gPDwgMik7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeDFtICs9IHgybTsKKyAgICAgICAgICAgIHgxICs9IHgyOworCisgICAgICAgICAgICAvKiB4Mm0sIHgyIGZyZWUgKi8KKyAgICAgICAgICAgIHkxbSA9ICh5MSA+PiAyKSAmIG1hc2s7IC8qIHplcm8gb3V0IGxhc3QgMiBiaXRzICovCisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeTEgPSB5MSBeKHkxbSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB5MW0gKz0geTJtOworICAgICAgICAgICAgeTEgKz0geTI7CisKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGExMSBhMTAgYTkgYTggKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkybSA9ICh5MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeTIgPSB5MiBeKHkybSA8PCAyKTsKKyAgICAgICAgICAgIHgybSArPSB5Mm07CisgICAgICAgICAgICB4MiArPSB5MjsKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworCisgICAgICAgICAgICAvKiBub3cgb3BlcmF0ZSBvbiB4MW0sIHgxLCB5MW0sIHkxLCB4Mm0sIHgyICovCisgICAgICAgICAgICAvKiB4MW0gPSBhMytiMywgYTIrYjIsIGExK2IxLCBhMCtiMCAqLworICAgICAgICAgICAgLyogeTFtID0gYTcrYjcsIGE2K2I2LCBhNStiNSwgYTQrYjQgKi8KKyAgICAgICAgICAgIC8qIHgybSA9IGExMStiMTEsIGExMCtiMTAsIGE5K2I5LCBhOCtiOCAqLworICAgICAgICAgICAgLyogeDEsIHkxLCB4MiAqLworCisgICAgICAgICAgICB4MW0gPj49IDI0IDsKKyAgICAgICAgICAgIHgxID4+PSAyNDsKKyAgICAgICAgICAgIHgxbSB8PSAoeTFtIDw8IDgpOyAgLyogYTYrYjYsIGE1K2I1LCBhNCtiNCwgYTMrYjMgKi8KKyAgICAgICAgICAgIHgxIHw9ICh5MSA8PCA4KTsKKworICAgICAgICAgICAgeDFtICs9IHkxbTsgIC8qIGE2K2I2K2E3K2I3LCAuLi4uLiwgYTMrYjMrYTQrYjQgKi8KKyAgICAgICAgICAgIHgxICs9IHkxOworICAgICAgICAgICAgeDEgKz0gcm5kMjsKKyAgICAgICAgICAgIHgxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeDFtICs9ICh4MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHgxbTsgLyogc2F2ZSB4MW0gKi8KKworICAgICAgICAgICAgeTFtID4+PSAyNDsKKyAgICAgICAgICAgIHkxID4+PSAyNDsKKyAgICAgICAgICAgIHkxbSB8PSAoeDJtIDw8IDgpOyAvKiBhMTArYjEwLCBhOStiOSwgYTgrYjgsIGE3K2I3ICovCisgICAgICAgICAgICB5MSB8PSAoeDIgPDwgOCk7CisgICAgICAgICAgICB5MW0gKz0geDJtOyAgLyogYTEwK2IxMCthMTErYjExLCAuLi4uLiwgYTcrYjcrYTgrYjggKi8KKyAgICAgICAgICAgIHkxICs9IHgyOworICAgICAgICAgICAgeTEgKz0gcm5kMjsKKyAgICAgICAgICAgIHkxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeTFtICs9ICh5MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHkxbTsgLyogc2F2ZSB5MW0gKi8KKworICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEVuY0dldFByZWRPdXRzaWRlCisgICAgRGF0ZTogICAgICAgMDQvMTcvMjAwMQorICAgIFB1cnBvc2U6ICAgIC0gbW9kaWZpZWQgZnJvbSBHZXRQcmVkT3V0c2lkZSBpbiB0aGUgZGVjb2Rlci4KKyAgICBNb2RpZmllZDogICAgMDkvMjQvMDUKKyAgICAgICAgICAgICAgICB1c2UgdGhlIGV4aXN0aW5nIG5vbi1pbml0aWFsaXplZCBwYWRkZWQgcmVnaW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLyBub3QgcmVhbGx5IG5lZWRlZCBzaW5jZSBwYWRkaW5nIGlzIGluY2x1ZGVkCisjZGVmaW5lIFBBRF9DT1JORVIgIHsgdGVtcCA9ICpzcmM7IFwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXAgfD0gKHRlbXA8PDgpOyBcCisgICAgICAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKilkc3QpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyB9CisKKyNkZWZpbmUgUEFEX1JPVyAgICAgeyB0ZW1wID0gKigoVUxvbmcqKXNyYyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9ICooKFVMb25nKikoc3JjKzQpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKilkc3QpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wMjsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wMjsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDI7IH0KKworI2RlZmluZSBQQURfQ09MICAgICB7IHRlbXAgPSAqc3JjOyAgIHRlbXAgfD0gKHRlbXA8PDgpOyAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKWRzdCkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICooc3JjKz1seCk7ICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAqKHNyYys9bHgpOyAgICAgdGVtcCB8PSAodGVtcDw8OCk7ICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKihzcmMrPWx4KTsgICAgIHRlbXAgfD0gKHRlbXA8PDgpOyAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICooc3JjKz1seCk7ICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAqKHNyYys9bHgpOyAgICAgdGVtcCB8PSAodGVtcDw8OCk7ICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKihzcmMrPWx4KTsgICAgIHRlbXAgfD0gKHRlbXA8PDgpOyAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICooc3JjKz1seCk7ICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IH0KKworCitJbnQgRW5jR2V0UHJlZE91dHNpZGUoSW50IHhwb3MsIEludCB5cG9zLCBVQ2hhciAqY19wcmV2LCBVQ2hhciAqcmVjLAorICAgICAgICAgICAgICAgICAgICAgIEludCB3aWR0aCwgSW50IGhlaWdodCwgSW50IHJuZDEpCit7CisgICAgSW50IGx4OworICAgIFVDaGFyICpzcmMsICpkc3Q7CisgICAgVUxvbmcgdGVtcCwgdGVtcDI7CisgICAgSW50IHhvZmZzZXQ7CisKKyAgICBseCA9IHdpZHRoICsgMTY7IC8qIG9ubHkgd29ya3MgZm9yIGNocm9tYSAqLworCisgICAgaWYgKHhwb3MgPCAwKQorICAgIHsKKyAgICAgICAgaWYgKHlwb3MgPCAwKSAvKiBwYWQgdG9wLWxlZnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGNvcm5lciAqLworICAgICAgICAgICAgc3JjID0gY19wcmV2OworICAgICAgICAgICAgZHN0ID0gY19wcmV2IC0gKGx4IDw8IDMpIC0gODsKKyAgICAgICAgICAgIFBBRF9DT1JORVIKKworICAgICAgICAgICAgLyogcGFkIHRvcCAqLworICAgICAgICAgICAgZHN0ID0gY19wcmV2IC0gKGx4IDw8IDMpOworICAgICAgICAgICAgUEFEX1JPVworCisgICAgICAgICAgICAvKiBwYWQgbGVmdCAqLworICAgICAgICAgICAgZHN0ID0gY19wcmV2IC0gODsKKyAgICAgICAgICAgIFBBRF9DT0wKKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCh5cG9zID4+IDEpIDwgKGhlaWdodCAtIDgpKSAvKiBwYWQgbGVmdCBvZiBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBwYWQgbGVmdCAqLworICAgICAgICAgICAgc3JjID0gY19wcmV2ICsgKHlwb3MgPj4gMSkgKiBseDsKKyAgICAgICAgICAgIGRzdCA9IHNyYyAtIDg7CisgICAgICAgICAgICBQQURfQ09MCisgICAgICAgICAgICAvKiBwYWQgZXh0cmEgcm93ICovCisgICAgICAgICAgICB0ZW1wID0gKihzcmMgKz0gbHgpOworICAgICAgICAgICAgdGVtcCB8PSAodGVtcCA8PCA4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgMTYpOworICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArIDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHBhZCBib3R0b20tbGVmdCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBwYWQgY29ybmVyICovCisgICAgICAgICAgICBzcmMgPSBjX3ByZXYgKyAoaGVpZ2h0IC0gMSkgKiBseDsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4IC0gODsKKyAgICAgICAgICAgIFBBRF9DT1JORVIKKworICAgICAgICAgICAgLyogcGFkIGJvdHRvbSAqLworICAgICAgICAgICAgZHN0ID0gc3JjICsgbHg7CisgICAgICAgICAgICBQQURfUk9XCisKKyAgICAgICAgICAgIC8qIHBhZCBsZWZ0ICovCisgICAgICAgICAgICBzcmMgLT0gKGx4IDw8IDMpOworICAgICAgICAgICAgc3JjICs9IGx4OworICAgICAgICAgICAgZHN0ID0gc3JjIC0gODsKKyAgICAgICAgICAgIFBBRF9DT0wKKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCh4cG9zID4+IDEpIDwgKHdpZHRoIC0gOCkpCisgICAgeworICAgICAgICBpZiAoeXBvcyA8IDApIC8qIHBhZCB0b3Agb2YgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgeG9mZnNldCA9ICh4cG9zID4+IDEpICYgMHgzOworICAgICAgICAgICAgc3JjID0gY19wcmV2ICsgKHhwb3MgPj4gMSkgLSB4b2Zmc2V0OworICAgICAgICAgICAgZHN0ID0gc3JjIC0gKGx4IDw8IDMpOworICAgICAgICAgICAgUEFEX1JPVworICAgICAgICAgICAgaWYgKHhvZmZzZXQgfHwgKHhwb3MmMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKFVMb25nKikoc3JjICsgOCkpOworICAgICAgICAgICAgICAgIGRzdCA9IHNyYyAtIChseCA8PCAzKSArIDg7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKWRzdCkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwb3MmMV1beHBvcyYxXShjX3ByZXYgKyAoeHBvcyA+PiAxKSArICgoeXBvcyA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWMsIGx4LCBybmQxKTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBwYWQgYm90dG9tIG9mIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHhvZmZzZXQgPSAoeHBvcyA+PiAxKSAmIDB4MzsKKyAgICAgICAgICAgIHNyYyA9IGNfcHJldiArICh4cG9zID4+IDEpIC0geG9mZnNldCArIChoZWlnaHQgLSAxKSAqIGx4OworICAgICAgICAgICAgZHN0ID0gc3JjICsgbHg7CisgICAgICAgICAgICBQQURfUk9XCisgICAgICAgICAgICBpZiAoeG9mZnNldCB8fCAoeHBvcyYxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigoVUxvbmcqKShzcmMgKyA4KSk7CisgICAgICAgICAgICAgICAgZHN0ID0gc3JjICsgbHggKyA4OworICAgICAgICAgICAgICAgICooKFVMb25nKilkc3QpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh5cG9zIDwgMCkgLyogcGFkIHRvcC1yaWdodCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBwYWQgY29ybmVyICovCisgICAgICAgICAgICBzcmMgPSBjX3ByZXYgKyB3aWR0aCAtIDE7CisgICAgICAgICAgICBkc3QgPSBzcmMgLSAobHggPDwgMykgKyAxOworICAgICAgICAgICAgUEFEX0NPUk5FUgorCisgICAgICAgICAgICAvKiBwYWQgdG9wICovCisgICAgICAgICAgICBzcmMgLT0gNzsKKyAgICAgICAgICAgIGRzdCA9IHNyYyAtIChseCA8PCAzKTsKKyAgICAgICAgICAgIFBBRF9ST1cKKworICAgICAgICAgICAgLyogcGFkIGxlZnQgKi8KKyAgICAgICAgICAgIHNyYyArPSA3OworICAgICAgICAgICAgZHN0ID0gc3JjICsgMTsKKyAgICAgICAgICAgIFBBRF9DT0wKKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCh5cG9zID4+IDEpIDwgKGhlaWdodCAtIEJfU0laRSkpIC8qIHBhZCByaWdodCBvZiBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBwYWQgbGVmdCAqLworICAgICAgICAgICAgc3JjID0gY19wcmV2ICsgKHlwb3MgPj4gMSkgKiBseCArIHdpZHRoIC0gMTsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIDE7CisgICAgICAgICAgICBQQURfQ09MCisgICAgICAgICAgICAvKiBwYWQgZXh0cmEgcm93ICovCisgICAgICAgICAgICB0ZW1wID0gKihzcmMgKz0gbHgpOworICAgICAgICAgICAgdGVtcCB8PSAodGVtcCA8PCA4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgMTYpOworICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArIDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHBhZCBib3R0b20tcmlnaHQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGxlZnQgKi8KKyAgICAgICAgICAgIHNyYyA9IGNfcHJldiArIChoZWlnaHQgLSA4KSAqIGx4ICsgd2lkdGggLSAxOworICAgICAgICAgICAgZHN0ID0gc3JjICsgMTsKKyAgICAgICAgICAgIFBBRF9DT0wKKworICAgICAgICAgICAgLyogcGFkIGNvcm5lciAqLworICAgICAgICAgICAgZHN0ID0gc3JjICsgbHggKyAxOworICAgICAgICAgICAgUEFEX0NPUk5FUgorCisgICAgICAgICAgICAvKiBwYWQgYm90dG9tICovCisgICAgICAgICAgICBzcmMgLT0gNzsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4OworICAgICAgICAgICAgUEFEX1JPVworCisgICAgICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwb3MmMV1beHBvcyYxXShjX3ByZXYgKyAoeHBvcyA+PiAxKSArICgoeXBvcyA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWMsIGx4LCBybmQxKTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLworICAgIEZ1bmN0aW9uIDogQ29weV9NQl9mcm9tX1ZvcCgpCisgICAgRGF0ZSAgICAgOiAwNC8xNy8yMDAxCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIENvcHlfTUJfZnJvbV9Wb3AoVUNoYXIgKmNvbXAsIEludCB5Q2hhbltdW05DT0VGRl9CTE9DS10sIEludCBwaXRjaCkKK3sKKyAgICBJbnQgcm93LCBjb2wsIGk7CisgICAgSW50ICpzcmMxLCAqc3JjMjsKKyAgICBJbnQgb2Zmc2V0ID0gcGl0Y2ggLSBNQl9TSVpFOworICAgIFVMb25nIHRlbXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAyKQorICAgIHsKKyAgICAgICAgc3JjMSA9IHlDaGFuW2ldOworICAgICAgICBzcmMyID0geUNoYW5baSsxXTsKKworICAgICAgICByb3cgPSBCX1NJWkU7CisgICAgICAgIHdoaWxlIChyb3ctLSkKKyAgICAgICAgeworICAgICAgICAgICAgY29sID0gQl9TSVpFOworICAgICAgICAgICAgd2hpbGUgKGNvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigoVUxvbmcqKWNvbXApOworICAgICAgICAgICAgICAgICpzcmMxKysgPSAoSW50KSh0ZW1wICYgMHhGRik7CisgICAgICAgICAgICAgICAgKnNyYzErKyA9IChJbnQpKCh0ZW1wID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICAgICAgKnNyYzErKyA9IChJbnQpKCh0ZW1wID4+IDE2KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpzcmMxKysgPSAoSW50KSgodGVtcCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICAgICAgY29sIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2wgPSBCX1NJWkU7CisgICAgICAgICAgICB3aGlsZSAoY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqKChVTG9uZyopY29tcCk7CisgICAgICAgICAgICAgICAgKnNyYzIrKyA9IChJbnQpKHRlbXAgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqc3JjMisrID0gKEludCkoKHRlbXAgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqc3JjMisrID0gKEludCkoKHRlbXAgPj4gMTYpICYgMHhGRik7CisgICAgICAgICAgICAgICAgKnNyYzIrKyA9IChJbnQpKCh0ZW1wID4+IDI0KSAmIDB4RkYpOworICAgICAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgICAgICBjb2wgLT0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXAgKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLworICAgIEZ1bmN0aW9uIDogQ29weV9CX2Zyb21fVm9wKCkKKyAgICBEYXRlICAgICA6IDA0LzE3LzIwMDEKKy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIENvcHlfQl9mcm9tX1ZvcChVQ2hhciAqY29tcCwgSW50IGNDaGFuW10sIEludCBwaXRjaCkKK3sKKyAgICBJbnQgcm93LCBjb2w7CisgICAgSW50IG9mZnNldCA9IHBpdGNoIC0gQl9TSVpFOworICAgIFVMb25nIHRlbXA7CisKKyAgICByb3cgPSBCX1NJWkU7CisgICAgd2hpbGUgKHJvdy0tKQorICAgIHsKKyAgICAgICAgY29sID0gQl9TSVpFOworICAgICAgICB3aGlsZSAoY29sKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKigoVUxvbmcqKWNvbXApOworICAgICAgICAgICAgKmNDaGFuKysgPSAoSW50KSh0ZW1wICYgMHhGRik7CisgICAgICAgICAgICAqY0NoYW4rKyA9IChJbnQpKCh0ZW1wID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICAqY0NoYW4rKyA9IChJbnQpKCh0ZW1wID4+IDE2KSAmIDB4RkYpOworICAgICAgICAgICAgKmNDaGFuKysgPSAoSW50KSgodGVtcCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgIGNvbCAtPSA0OworICAgICAgICB9CisgICAgICAgIGNvbXAgKz0gb2Zmc2V0OworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvCisgICAgRnVuY3Rpb24gOiBDb3B5X01CX2ludG9fVm9wKCkKKyAgICBEYXRlICAgICA6IDA0LzE3LzIwMDEKKyAgICBIaXN0b3J5ICA6IEZyb20gZGVjb2RlcgorLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgQ29weV9NQl9pbnRvX1ZvcChVQ2hhciAqY29tcCwgSW50IHlDaGFuW11bTkNPRUZGX0JMT0NLXSwgSW50IHBpdGNoKQoreworICAgIEludCByb3csIGNvbCwgaTsKKyAgICBJbnQgKnNyYzEsICpzcmMyOworICAgIEludCBvZmZzZXQgPSBwaXRjaCAtIE1CX1NJWkU7CisgICAgVUNoYXIgbWFzayA9IDB4RkY7CisgICAgSW50IHRtcDsKKyAgICBVTG9uZyB0ZW1wOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHNyYzEgPSB5Q2hhbltpXTsKKyAgICAgICAgc3JjMiA9IHlDaGFuW2krMV07CisKKyAgICAgICAgcm93ID0gQl9TSVpFOworICAgICAgICB3aGlsZSAocm93LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbCA9IEJfU0laRTsKKyAgICAgICAgICAgIHdoaWxlIChjb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMxKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCA9IHRtcCA8PCAyNDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzErKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgMTYpOworICAgICAgICAgICAgICAgIHRtcCA9ICgqc3JjMSsrKTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzErKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IHRtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopY29tcCkgPSB0ZW1wOworICAgICAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgICAgICBjb2wgLT0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbCA9IEJfU0laRTsKKyAgICAgICAgICAgIHdoaWxlIChjb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMyKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCA9IHRtcCA8PCAyNDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzIrKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgMTYpOworICAgICAgICAgICAgICAgIHRtcCA9ICgqc3JjMisrKTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzIrKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IHRtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopY29tcCkgPSB0ZW1wOworICAgICAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgICAgICBjb2wgLT0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXAgKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvCisgICAgRnVuY3Rpb24gOiBDb3B5X0JfaW50b19Wb3AoKQorICAgIERhdGUgICAgIDogMDQvMTcvMjAwMQorICAgIEhpc3RvcnkgIDogRnJvbSBkZWNvZGVyCisvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBDb3B5X0JfaW50b19Wb3AoVUNoYXIgKmNvbXAsIEludCBjQ2hhbltdLCBJbnQgcGl0Y2gpCit7CisgICAgSW50IHJvdywgY29sOworICAgIEludCBvZmZzZXQgPSBwaXRjaCAtIEJfU0laRTsKKyAgICBJbnQgdG1wOworICAgIFVDaGFyIG1hc2sgPSAweEZGOworICAgIFVMb25nIHRlbXA7CisKKyAgICByb3cgPSBCX1NJWkU7CisgICAgd2hpbGUgKHJvdy0tKQorICAgIHsKKyAgICAgICAgY29sID0gQl9TSVpFOworICAgICAgICB3aGlsZSAoY29sKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAoKmNDaGFuKyspOworICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgIHRlbXAgPSB0bXAgPDwgMjQ7CisgICAgICAgICAgICB0bXAgPSAoKmNDaGFuKyspOworICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRtcCA8PCAxNik7CisgICAgICAgICAgICB0bXAgPSAoKmNDaGFuKyspOworICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgICAgIHRtcCA9ICgqY0NoYW4rKyk7CisgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgdGVtcCB8PSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopY29tcCkgPSB0ZW1wOworICAgICAgICAgICAgY29tcCArPSA0OworICAgICAgICAgICAgY29sIC09IDQ7CisgICAgICAgIH0KKyAgICAgICAgY29tcCArPSBvZmZzZXQ7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IGdldF9NQiggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTAvMDMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBDb3B5IDQgWSB0byByZWZlcmVuY2UgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordm9pZCBnZXRfTUIoVUNoYXIgKmNfcHJldiwgVUNoYXIgKmNfcHJldl91ICAsIFVDaGFyICpjX3ByZXZfdiwKKyAgICAgICAgICAgIFNob3J0IG1iWzZdWzY0XSwgSW50IGx4LCBJbnQgbHhfdXYpCisKK3sKKyAgICBJbnQgaSwgaiwgY291bnQgPSAwLCBjb3VudDEgPSAwOworICAgIEludCBrMSA9IGx4IC0gTUJfU0laRSwgazIgPSBseF91diAtIEJfU0laRTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBCX1NJWkU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbWJbMF1bY291bnRdID0gKEludCkoKmNfcHJldisrKTsKKyAgICAgICAgICAgIG1iWzRdW2NvdW50XSA9IChJbnQpKCpjX3ByZXZfdSsrKTsKKyAgICAgICAgICAgIG1iWzVdW2NvdW50KytdID0gKEludCkoKmNfcHJldl92KyspOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEJfU0laRTsgaisrKQorICAgICAgICAgICAgbWJbMV1bY291bnQxKytdID0gKEludCkoKmNfcHJldisrKTsKKworICAgICAgICBjX3ByZXYgKz0gazE7CisgICAgICAgIGNfcHJldl91ICs9IGsyOworICAgICAgICBjX3ByZXZfdiArPSBrMjsKKworCisgICAgfQorCisgICAgY291bnQgPSBjb3VudDEgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBCX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBCX1NJWkU7IGorKykKKyAgICAgICAgICAgIG1iWzJdW2NvdW50KytdID0gKEludCkoKmNfcHJldisrKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQl9TSVpFOyBqKyspCisgICAgICAgICAgICBtYlszXVtjb3VudDErK10gPSAoSW50KSgqY19wcmV2KyspOworCisgICAgICAgIGNfcHJldiArPSBrMTsKKyAgICB9Cit9CisKK3ZvaWQgUHV0U2tpcHBlZEJsb2NrKFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpCit7CisgICAgVUNoYXIgKmVuZDsKKyAgICBJbnQgb2Zmc2V0ID0gKGx4IC0gOCkgPj4gMjsKKyAgICBJbnQgKnNyYywgKmRzdDsKKworICAgIGRzdCA9IChJbnQqKXJlYzsKKyAgICBzcmMgPSAoSW50KilwcmV2OworCisgICAgZW5kID0gcHJldiArIChseCA8PCAzKTsKKworICAgIGRvCisgICAgeworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgZHN0ICs9IG9mZnNldDsKKyAgICAgICAgc3JjICs9IG9mZnNldDsKKyAgICB9CisgICAgd2hpbGUgKChVSW50KXNyYyA8IChVSW50KWVuZCk7CisKKyAgICByZXR1cm4gOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdiNzhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKQEAgLTAsMCArMSwxNzQxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKworLy8jZGVmaW5lIFBSSU5UX01WCisjZGVmaW5lIE1JTl9HT1AgMSAgIC8qIG1pbmltdW0gc2l6ZSBvZiBHT1AsICAxLzIzLzAxLCBuZWVkIHRvIGJlIHRlc3RlZCAqLworCisjZGVmaW5lIENBTkRJREFURV9ESVNUQU5DRSAgMCAvKiBkaXN0YW5jZSBjYW5kaWRhdGUgZnJvbSBvbmUgYW5vdGhlciB0byBjb25zaWRlciBhcyBhIGRpc3RpbmN0IG9uZSAqLworLyogc2hvdWxkbid0IGJlIG1vcmUgdGhhbiAzICovCisKKyNkZWZpbmUgWkVST19NVl9QUkVGICAgIDAgLyogMDogYmlhcyAoMCwwKU1WIGJlZm9yZSBmdWxsLXBlbCBzZWFyY2gsIGxvd2VzdCBjb21wbGV4aXR5Ki8KKy8qIDE6IGJpYXMgKDAsMClNViBhZnRlciBmdWxsLXBlbCBzZWFyY2gsIGJlZm9yZSBoYWxmLXBlbCwgaGlnaGVzdCBjb21wICovCisvKiAyOiBiaWFzICgwLDApTVYgYWZ0ZXIgaGFsZi1wZWwsIGhpZ2ggY29tcCwgYmV0dGVyIFBTTlIgKi8KKworI2RlZmluZSBSQVNURVJfUkVGUkVTSCAgLyogaW5zdGVhZCBvZiByYW5kb20gSU5UUkEgcmVmcmVzaCwgZG8gcmFzdGVyIHNjYW4sICAyLzI2LzAxICovCisKKyNpZmRlZiBSQVNURVJfUkVGUkVTSAorI2RlZmluZSBUQVJHRVRfUkVGUkVTSF9QRVJfUkVHSU9OIDQgLyogLCBuby4gTUIgcGVyIGZyYW1lIHRvIGJlIElOVFJBIHJlZnJlc2hlZCAqLworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX1JFRlJFU0hfUEVSX1JFR0lPTiAxIC8qICwgbm8uIE1CIHBlciByZWdpb24gdG8gYmUgSU5UUkEgcmVmcmVzaGVkICovCisjZW5kaWYKKworI2RlZmluZSBBTExfQ0FORF9FUVVBTCAgMTAgIC8qICBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiA1IHdpbGwgd29yayAqLworCisjZGVmaW5lIE51bVBpeGVsTUIgIDI1NiAgICAgLyogIG51bWJlciBvZiBwaXhlbHMgdXNlZCBpbiBTQUQgY2FsY3VsYXRpb24gKi8KKworI2RlZmluZSBERUZfOFg4X1dJTiAzICAgLyogc2VhcmNoIHJlZ2lvbiBmb3IgOHg4IE1WcyBhcm91bmQgdGhlIDE2eDE2IE1WICovCisjZGVmaW5lIE1CX05iICAyNTYKKworI2RlZmluZSBQUkVGX05VTExfVkVDIDEyOSAgIC8qIGZvciB6ZXJvIHZlY3RvciBiaWFzICovCisjZGVmaW5lIFBSRUZfMTZfVkVDIDEyOSAgICAgLyogMU1WIGJpYXMgdmVyc3VzIDRNVnMqLworI2RlZmluZSBQUkVGX0lOVFJBICA1MTIgICAgIC8qIGJpYXMgZm9yIElOVFJBIGNvZGluZyAqLworCitjb25zdCBzdGF0aWMgSW50IHRhYl9leGNsdWRlWzldWzldID0gIC8vIFtsYXN0X2xvY11bY3Vycl9sb2NdCit7CisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMX0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDF9LAorICAgIHswLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMX0sCisgICAgezAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDF9LAorICAgIHswLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMH0KK307IC8vdG8gZGVjaWRlIHdoZXRoZXIgdG8gY29udGludWUgb3IgY29tcHV0ZQorCitjb25zdCBzdGF0aWMgSW50IHJlZmluZV9uZXh0WzhdWzJdID0gICAgLyogW2N1cnJfa11baW5jcmVtZW50XSAqLworeworICAgIHswLCAwfSwgezIsIDB9LCB7MSwgMX0sIHswLCAyfSwgeyAtMSwgMX0sIHsgLTIsIDB9LCB7IC0xLCAtMX0sIHswLCAtMn0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgICB2b2lkIE1CTW90aW9uU2VhcmNoKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyICpjdXIsIFVDaGFyICpiZXN0X2NhbmRbXSwKKyAgICBJbnQgaTAsIEludCBqMCwgSW50IHR5cGVfcHJlZCwgSW50IGZ1bGxzZWFyY2gsIEludCAqaHBfZ3Vlc3MpOworCisgICAgSW50ICBmdWxsc2VhcmNoKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFZvbCAqY3VyclZvbCwgVUNoYXIgKnJlZiwgVUNoYXIgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgSW50ICppbWluLCBJbnQgKmptaW4sIEludCBpbG93LCBJbnQgaWhpZ2gsIEludCBqbG93LCBJbnQgamhpZ2gpOworICAgIEludCBmdWxsc2VhcmNoQmxrKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFZvbCAqY3VyclZvbCwgVUNoYXIgKmNlbnQsIFVDaGFyICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgSW50ICppbWluLCBJbnQgKmptaW4sIEludCBpbG93LCBJbnQgaWhpZ2gsIEludCBqbG93LCBJbnQgamhpZ2gsIEludCByYW5nZSk7CisgICAgdm9pZCBDYW5kaWRhdGVTZWxlY3Rpb24oSW50ICptdngsIEludCAqbXZ5LCBJbnQgKm51bV9jYW4sIEludCBpbWIsIEludCBqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IHR5cGVfcHJlZCk7CisgICAgdm9pZCBSYXN0ZXJJbnRyYVVwZGF0ZShVQ2hhciAqaW50cmFBcnJheSwgVUNoYXIgKk1vZGUsIEludCB0b3RhbE1CLCBJbnQgbnVtUmVmcmVzaCk7CisgICAgdm9pZCBSZXNldEludHJhVXBkYXRlKFVDaGFyICppbnRyYUFycmF5LCBJbnQgdG90YWxNQik7CisgICAgdm9pZCBSZXNldEludHJhVXBkYXRlUmVnaW9uKFVDaGFyICppbnRyYUFycmF5LCBJbnQgc3RhcnRfaSwgSW50IHJ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IHN0YXJ0X2osIEludCByaGVpZ2h0LCBJbnQgbWJ3aWR0aCwgSW50IG1iaGVpZ2h0KTsKKworICAgIHZvaWQgTW92ZU5laWdoYm9yU0FEKEludCBkbltdLCBJbnQgbmV3X2xvYyk7CisgICAgSW50IEZpbmRNaW4oSW50IGRuW10pOworICAgIHZvaWQgUHJlcGFyZUN1ck1CKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyICpjdXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIDIvMjgvMDEsIGZvciBIWVBPVEhFU0lTIFRFU1RJTkcgKi8KKyNpZmRlZiBIVEZNICAgICAvKiBkZWZpbmVkIGluIG1wNGRlZi5oICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIHZvaWQgQ2FsY1RocmVzaG9sZChkb3VibGUgcGYsIGRvdWJsZSBleHBfbGFtZGFbXSwgSW50IG5ybWx6X3RoW10pOworICAgIHZvaWQgICAgSFRGTVByZXBhcmVDdXJNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgVUNoYXIgKmN1cik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNkZWZpbmUgSFRGTV9QZiAgMC4yNSAgIC8qIDMvMi8xLCBwcm9iYWJpbGl0eSBvZiBmYWxzZSBhbGFybSwgY2FuIGJlIHZhcmllZCBmcm9tIDAgdG8gMC41ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyNpZmRlZiBfU0FEX1NUQVQKK1VMb25nIG51bV9NQiA9IDA7CitVTG9uZyBudW1fSFBfTUIgPSAwOworVUxvbmcgbnVtX0JsayA9IDA7CitVTG9uZyBudW1fSFBfQmxrID0gMDsKK1VMb25nIG51bV9jYW5kID0gMDsKK1VMb25nIG51bV9iZXR0ZXJfaHAgPSAwOworVUxvbmcgaV9kaXN0X2Zyb21fZ3Vlc3MgPSAwOworVUxvbmcgal9kaXN0X2Zyb21fZ3Vlc3MgPSAwOworVUxvbmcgbnVtX2hwX25vdF96ZXJvID0gMDsKKyNlbmRpZgorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBNb3Rpb25Fc3RpbWF0aW9uCisgICAgRGF0ZTogICAgICAgMTAvMy8yMDAwCisgICAgUHVycG9zZTogICAgR28gdGhyb3VnaCBhbGwgbWFjcm9ibG9jayBmb3IgbW90aW9uIHNlYXJjaCBhbmQKKyAgICAgICAgICAgICAgICBkZXRlcm1pbmUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbi4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBNb3Rpb25Fc3RpbWF0aW9uKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgVUNoYXIgdXNlXzRtdiA9IHZpZGVvLT5lbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQ7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWaWRlb0VuY0ZyYW1lSU8gKmN1cnJGcmFtZSA9IHZpZGVvLT5pbnB1dDsKKyAgICBJbnQgaSwgaiwgY29tcDsKKyAgICBJbnQgbWJ3aWR0aCA9IGN1cnJWb2wtPm5NQlBlclJvdzsKKyAgICBJbnQgbWJoZWlnaHQgPSBjdXJyVm9sLT5uTUJQZXJDb2w7CisgICAgSW50IHRvdGFsTUIgPSBjdXJyVm9sLT5uVG90YWxNQjsKKyAgICBJbnQgd2lkdGggPSBjdXJyRnJhbWUtPnBpdGNoOworICAgIFVDaGFyICptb2RlX21iLCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7CisgICAgTU9UICptb3RfbWIsICoqbW90ID0gdmlkZW8tPm1vdDsKKyAgICBVQ2hhciAqaW50cmFBcnJheSA9IHZpZGVvLT5pbnRyYUFycmF5OworICAgIEludCBGU19lbiA9IHZpZGVvLT5lbmNQYXJhbXMtPkZ1bGxTZWFyY2hfRW5hYmxlZDsKKyAgICB2b2lkICgqQ29tcHV0ZU1CU3VtKShVQ2hhciAqLCBJbnQsIE1PVCAqKSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkNvbXB1dGVNQlN1bTsKKyAgICB2b2lkICgqQ2hvb3NlTW9kZSkoVUNoYXIqLCBVQ2hhciosIEludCwgSW50KSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkNob29zZU1vZGU7CisKKyAgICBJbnQgbnVtSW50cmEsIHN0YXJ0X2ksIG51bUxvb3AsIGluY3JfaTsKKyAgICBJbnQgbWJudW0sIG9mZnNldDsKKyAgICBVQ2hhciAqY3VyLCAqYmVzdF9jYW5kWzVdOworICAgIEludCBzYWQ4ID0gMCwgc2FkMTYgPSAwOworICAgIEludCB0b3RhbFNBRCA9IDA7ICAgLyogYXZlcmFnZSBTQUQgZm9yIHJhdGUgY29udHJvbCAqLworICAgIEludCBza2lwX2hhbGZwZWxfNG12OworICAgIEludCBmX2NvZGVfcCwgZl9jb2RlX24sIG1heF9tYWcgPSAwLCBtaW5fbWFnID0gMDsKKyAgICBJbnQgdHlwZV9wcmVkOworICAgIEludCB4aFs1XSA9IHswLCAwLCAwLCAwLCAwfTsKKyAgICBJbnQgeWhbNV0gPSB7MCwgMCwgMCwgMCwgMH07IC8qIGhhbGYtcGVsICovCisgICAgVUNoYXIgaHBfbWVtNE1WWzE3KjE3KjRdOworCisjaWZkZWYgSFRGTQorICAgIC8qKioqKiBIWVBPVEhFU0lTIFRFU1RJTkcgKioqKioqKiovICAvKiAyLzI4LzAxICovCisgICAgSW50IGNvbGxlY3QgPSAwOworICAgIEhURk1fU3RhdCBodGZtX3N0YXQ7CisgICAgZG91YmxlIG5ld3ZhclsxNl07CisgICAgZG91YmxlIGV4cF9sYW1kYVsxNV07CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorICAgIEludCBocF9ndWVzcyA9IDA7CisjaWZkZWYgUFJJTlRfTVYKKyAgICBGSUxFICpmcF9kZWJ1ZzsKKyNlbmRpZgorCisvLyAgRklMRSAqZnN0YXQ7CisvLyAgc3RhdGljIGludCBmcmFtZV9udW0gPSAwOworCisgICAgb2Zmc2V0ID0gMDsKKworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgeyAgIC8qIGNvbXB1dGUgdGhlIFNBViAqLworICAgICAgICBtYm51bSA9IDA7CisgICAgICAgIGN1ciA9IGN1cnJGcmFtZS0+eUNoYW47CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iaGVpZ2h0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYndpZHRoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgbW90X21iID0gbW90W21ibnVtXTsKKworICAgICAgICAgICAgICAgICgqQ29tcHV0ZU1CU3VtKShjdXIgKyAoaSA8PCA0KSwgd2lkdGgsIG1vdF9tYik7CisKKyAgICAgICAgICAgICAgICB0b3RhbFNBRCArPSBtb3RfbWJbMF0uc2FkOworCisgICAgICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ciArPSAod2lkdGggPDwgNCk7CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+c3VtTUFEID0gKGZsb2F0KXRvdGFsU0FEIC8gKGZsb2F0KU51bVBpeGVsTUI7CisKKyAgICAgICAgUmVzZXRJbnRyYVVwZGF0ZShpbnRyYUFycmF5LCB0b3RhbE1CKTsKKworICAgICAgICByZXR1cm4gIDsKKyAgICB9CisKKyAgICAvKiAwOS8yMC8wNSAqLworICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AtPnBhZGRlZCA9PSAwICYmICF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgeworICAgICAgICBQYWRkaW5nRWRnZSh2aWRlby0+cHJldkJhc2VWb3ApOworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnBhZGRlZCA9IDE7CisgICAgfQorCisgICAgLyogUmFuZG9tIElOVFJBIHVwZGF0ZSAqLworICAgIC8qICBzdWdnZXN0IHRvIGRvIGl0IGluIENvZGVNQiAqLworICAgIC8qICAyLzIxLzIwMDEgKi8KKyAgICAvL2lmKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSXzEgfHwgdmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfMikKKyAgICBpZiAodmlkZW8tPmN1cnJMYXllciA9PSAwICYmIHZpZGVvLT5lbmNQYXJhbXMtPlJlZnJlc2gpCisgICAgeworICAgICAgICBSYXN0ZXJJbnRyYVVwZGF0ZShpbnRyYUFycmF5LCBNb2RlLCB0b3RhbE1CLCB2aWRlby0+ZW5jUGFyYW1zLT5SZWZyZXNoKTsKKyAgICB9CisKKyAgICB2aWRlby0+c2FkX2V4dHJhX2luZm8gPSBOVUxMOworCisjaWZkZWYgSFRGTQorICAgIC8qKioqKiBIWVBPVEhFU0lTIFRFU1RJTkcgKioqKioqKiovICAvKiAyLzI4LzAxICovCisgICAgSW5pdEhURk0odmlkZW8sICZodGZtX3N0YXQsIG5ld3ZhciwgJmNvbGxlY3QpOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworICAgIGlmICgodmlkZW8tPmVuY1BhcmFtcy0+U2NlbmVDaGFuZ2VfRGV0ID09IDEpIC8qJiYgdmlkZW8tPmN1cnJMYXllcj09MCAqLworICAgICAgICAgICAgJiYgKCh2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXSA8IDUuMCkgfHwgKHZpZGVvLT5udW1Wb3BzSW5HT1AgPiBNSU5fR09QKSkpCisgICAgICAgIC8qIGRvIG5vdCB0cnkgdG8gZGV0ZWN0IGEgbmV3IHNjZW5lIGlmIGxvdyBmcmFtZSByYXRlIGFuZCB0b28gY2xvc2UgdG8gcHJldmlvdXMgSS1mcmFtZSAqLworICAgIHsKKyAgICAgICAgaW5jcl9pID0gMjsKKyAgICAgICAgbnVtTG9vcCA9IDI7CisgICAgICAgIHN0YXJ0X2kgPSAxOworICAgICAgICB0eXBlX3ByZWQgPSAwOyAvKiBmb3IgaW5pdGlhbCBjYW5kaWRhdGUgc2VsZWN0aW9uICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluY3JfaSA9IDE7CisgICAgICAgIG51bUxvb3AgPSAxOworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgdHlwZV9wcmVkID0gMjsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBwYXNzLCBsb29wIHRocnUgaGFsZiB0aGUgbWFjcm9ibG9jayAqLworICAgIC8qIGRldGVybWluZSBzY2VuZSBjaGFuZ2UgKi8KKyAgICAvKiBTZWNvbmQgcGFzcywgZm9yIHRoZSByZXN0IG9mIG1hY3JvYmxvY2tzICovCisgICAgbnVtSW50cmEgPSAwOworICAgIHdoaWxlIChudW1Mb29wLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWJoZWlnaHQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluY3JfaSA+IDEpCisgICAgICAgICAgICAgICAgc3RhcnRfaSA9IChzdGFydF9pID09IDAgPyAxIDogMCkgOyAvKiB0b2dnbGUgMCBhbmQgMSAqLworCisgICAgICAgICAgICBvZmZzZXQgPSB3aWR0aCAqIChqIDw8IDQpICsgKHN0YXJ0X2kgPDwgNCk7CisKKyAgICAgICAgICAgIG1ibnVtID0gaiAqIG1id2lkdGggKyBzdGFydF9pOworCisgICAgICAgICAgICBmb3IgKGkgPSBzdGFydF9pOyBpIDwgbWJ3aWR0aDsgaSArPSBpbmNyX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgbW90X21iID0gbW90W21ibnVtXTsKKyAgICAgICAgICAgICAgICBtb2RlX21iID0gTW9kZSArIG1ibnVtOworCisgICAgICAgICAgICAgICAgY3VyID0gY3VyckZyYW1lLT55Q2hhbiArIG9mZnNldDsKKworCisgICAgICAgICAgICAgICAgaWYgKCptb2RlX21iICE9IE1PREVfSU5UUkEpCisgICAgICAgICAgICAgICAgeworI2lmIGRlZmluZWQoSFRGTSkKKyAgICAgICAgICAgICAgICAgICAgSFRGTVByZXBhcmVDdXJNQih2aWRlbywgJmh0Zm1fc3RhdCwgY3VyKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIFByZXBhcmVDdXJNQih2aWRlbywgY3VyKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAvKioqKioqKiogZnVsbC1wZWwgMU1WIGFuZCA0TVZzIHNlYXJjaCAqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX1NBRF9TVEFUCisgICAgICAgICAgICAgICAgICAgIG51bV9NQisrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIE1CTW90aW9uU2VhcmNoKHZpZGVvLCBjdXIsIGJlc3RfY2FuZCwgaSA8PCA0LCBqIDw8IDQsIHR5cGVfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfZW4sICZocF9ndWVzcyk7CisKKyNpZmRlZiBQUklOVF9NVgorICAgICAgICAgICAgICAgICAgICBmcF9kZWJ1ZyA9IGZvcGVuKCJjOlxcYml0c3RyZWFtXFxtdjFfZGVidWcudHh0IiwgImEiKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9kZWJ1ZywgIiMlZCAoJWQsJWQsJWQpIDogIiwgbWJudW0sIG1vdF9tYlswXS54LCBtb3RfbWJbMF0ueSwgbW90X21iWzBdLnNhZCk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIoJWQsJWQsJWQpIDogKCVkLCVkLCVkKSA6ICglZCwlZCwlZCkgOiAoJWQsJWQsJWQpIDogPT0+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlsxXS54LCBtb3RfbWJbMV0ueSwgbW90X21iWzFdLnNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMl0ueCwgbW90X21iWzJdLnksIG1vdF9tYlsyXS5zYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzNdLngsIG1vdF9tYlszXS55LCBtb3RfbWJbM10uc2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYls0XS54LCBtb3RfbWJbNF0ueSwgbW90X21iWzRdLnNhZCk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9kZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgc2FkMTYgPSBtb3RfbWJbMF0uc2FkOworI2lmZGVmIE5PX0lOVEVSNFYKKyAgICAgICAgICAgICAgICAgICAgc2FkOCA9IHNhZDE2OworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgc2FkOCA9IG1vdF9tYlsxXS5zYWQgKyBtb3RfbWJbMl0uc2FkICsgbW90X21iWzNdLnNhZCArIG1vdF9tYls0XS5zYWQ7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAvKiBjaG9vc2UgYmV0d2VlbiBJTlRSQSBvciBJTlRFUiAqLworICAgICAgICAgICAgICAgICAgICAoKkNob29zZU1vZGUpKG1vZGVfbWIsIGN1ciwgd2lkdGgsICgoc2FkOCA8IHNhZDE2KSA/IHNhZDggOiBzYWQxNikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIElOVFJBIHVwZGF0ZSwgdXNlIGZvciBwcmVkaWN0aW9uIDMvMjMvMDEgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1vdF9tYlswXS54ID0gbW90X21iWzBdLnkgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgqbW9kZV9tYiA9PSBNT0RFX0lOVFJBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtSW50cmErKyA7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBTQVYgZm9yIHJhdGUgY29udHJvbCBhbmQgZmFzdCBEQ1QsIDExLzI4LzAwICovCisgICAgICAgICAgICAgICAgICAgICgqQ29tcHV0ZU1CU3VtKShjdXIsIHdpZHRoLCBtb3RfbWIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIGxlYXZlIG1vdF9tYlswXSBhcyBpdCBpcyBmb3IgZmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgNCBNVnMgdG8gemVyb3MgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb21wID0gMTsgY29tcCA8PSA0OyBjb21wKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYltjb21wXS54ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYltjb21wXS55ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFBSSU5UX01WCisgICAgICAgICAgICAgICAgICAgIGZwX2RlYnVnID0gZm9wZW4oImM6XFxiaXRzdHJlYW1cXG12MV9kZWJ1Zy50eHQiLCAiYSIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2RlYnVnLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwX2RlYnVnKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC8qICptb2RlX21iID0gTU9ERV9JTlRFUjsqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkhhbGZQZWxfRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIF9TQURfU1RBVAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtX0hQX01CKys7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgaGFsZi1wZWwgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICBGaW5kSGFsZlBlbE1CKHZpZGVvLCBjdXIsIG1vdF9tYiwgYmVzdF9jYW5kWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDw8IDQsIGogPDwgNCwgeGgsIHloLCBocF9ndWVzcyk7CisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwX2RlYnVnID0gZm9wZW4oImM6XFxiaXRzdHJlYW1cXG12MV9kZWJ1Zy50eHQiLCAiYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9kZWJ1ZywgIiglZCwlZCksICVkXG4iLCBtb3RfbWJbMF0ueCwgbW90X21iWzBdLnksIG1vdF9tYlswXS5zYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwX2RlYnVnKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9oYWxmcGVsXzRtdiA9ICgoc2FkMTYgLSBtb3RfbWJbMF0uc2FkKSA8PSAoTUJfTmIgPj4gMSkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZDE2ID0gbW90X21iWzBdLnNhZDsKKworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlXzRtdiAmJiAhc2tpcF9oYWxmcGVsXzRtdikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHNvIGRlY2lkZSAxTVYgb3IgNE1WICEhISEhISEhKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWQ4ID0gRmluZEhhbGZQZWxCbGsodmlkZW8sIGN1ciwgbW90X21iLCBzYWQxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9jYW5kLCBtb2RlX21iLCBpIDw8IDQsIGogPDwgNCwgeGgsIHloLCBocF9tZW00TVYpOworCisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcF9kZWJ1ZyA9IGZvcGVuKCJjOlxcYml0c3RyZWFtXFxtdjFfZGVidWcudHh0IiwgImEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2RlYnVnLCAiICglZCwlZCwlZCkgOiAoJWQsJWQsJWQpIDogKCVkLCVkLCVkKSA6ICglZCwlZCwlZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzFdLngsIG1vdF9tYlsxXS55LCBtb3RfbWJbMV0uc2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzJdLngsIG1vdF9tYlsyXS55LCBtb3RfbWJbMl0uc2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzNdLngsIG1vdF9tYlszXS55LCBtb3RfbWJbM10uc2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzRdLngsIG1vdF9tYls0XS55LCBtb3RfbWJbNF0uc2FkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZGVidWcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgLyogSGFsZlBlbF9FbmFibGVkID09MCAgKi8KKyAgICAgICAgICAgICAgICAgICAgeworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKHNhZDE2IDwgc2FkOC1QUkVGXzE2X1ZFQykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYWQxNiAtIFBSRUZfMTZfVkVDID4gc2FkOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kZV9tYiA9IE1PREVfSU5URVI0VjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisjaWYgKFpFUk9fTVZfUFJFRj09MikgICAvKiB1c2UgbW90X21iWzddLnNhZCBhcyBkMCBjb21wdXRlZCBpbiBNQk1vdGlvblNlYXJjaCovCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbN10uc2FkIC0gUFJFRl9OVUxMX1ZFQyA8IHNhZDE2ICYmIG1vdF9tYls3XS5zYWQgLSBQUkVGX05VTExfVkVDIDwgc2FkOCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzBdLnNhZCA9IG1vdF9tYls3XS5zYWQgLSBQUkVGX05VTExfVkVDOworICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzBdLnggPSBtb3RfbWJbMF0ueSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqbW9kZV9tYiA9IE1PREVfSU5URVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoKm1vZGVfbWIgPT0gTU9ERV9JTlRFUikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYlswXS54ID09IDAgJiYgbW90X21iWzBdLnkgPT0gMCkgICAvKiB1c2UgemVybyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMF0uc2FkICs9IFBSRUZfTlVMTF9WRUM7IC8qIGFkZCBiYWNrIHRoZSBiaWFzICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlsxXS5zYWQgPSBtb3RfbWJbMl0uc2FkID0gbW90X21iWzNdLnNhZCA9IG1vdF9tYls0XS5zYWQgPSAobW90X21iWzBdLnNhZCArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMV0ueCA9IG1vdF9tYlsyXS54ID0gbW90X21iWzNdLnggPSBtb3RfbWJbNF0ueCA9IG1vdF9tYlswXS54OworICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzFdLnkgPSBtb3RfbWJbMl0ueSA9IG1vdF9tYlszXS55ID0gbW90X21iWzRdLnkgPSBtb3RfbWJbMF0ueTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZmluZCBtYXhpbXVtIG1hZ25pdHVkZSAqLworICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgYXZlcmFnZSBTQUQgZm9yIHJhdGUgY29udHJvbCwgMTEvMjgvMDAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKm1vZGVfbWIgPT0gTU9ERV9JTlRFUikKKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgZnBfZGVidWcgPSBmb3BlbigiYzpcXGJpdHN0cmVhbVxcbXYxX2RlYnVnLnR4dCIsICJhIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIlZCBNT0RFX0lOVEVSXG4iLCBtYm51bSk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9kZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgdG90YWxTQUQgKz0gbW90X21iWzBdLnNhZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYlswXS54ID4gbWF4X21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tYWcgPSBtb3RfbWJbMF0ueDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYlswXS55ID4gbWF4X21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tYWcgPSBtb3RfbWJbMF0ueTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYlswXS54IDwgbWluX21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9tYWcgPSBtb3RfbWJbMF0ueDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYlswXS55IDwgbWluX21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9tYWcgPSBtb3RfbWJbMF0ueTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKm1vZGVfbWIgPT0gTU9ERV9JTlRFUjRWKQorICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBQUklOVF9NVgorICAgICAgICAgICAgICAgICAgICBmcF9kZWJ1ZyA9IGZvcGVuKCJjOlxcYml0c3RyZWFtXFxtdjFfZGVidWcudHh0IiwgImEiKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9kZWJ1ZywgIiVkIE1PREVfSU5URVI0VlxuIiwgbWJudW0pOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZGVidWcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IHNhZDg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29tcCA9IDE7IGNvbXAgPD0gNDsgY29tcCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90X21iW2NvbXBdLnggPiBtYXhfbWFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tYWcgPSBtb3RfbWJbY29tcF0ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbY29tcF0ueSA+IG1heF9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21hZyA9IG1vdF9tYltjb21wXS55OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYltjb21wXS54IDwgbWluX21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbWFnID0gbW90X21iW2NvbXBdLng7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90X21iW2NvbXBdLnkgPCBtaW5fbWFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9tYWcgPSBtb3RfbWJbY29tcF0ueTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIE1PREVfSU5UUkEgKi8KKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgZnBfZGVidWcgPSBmb3BlbigiYzpcXGJpdHN0cmVhbVxcbXYxX2RlYnVnLnR4dCIsICJhIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIlZCBNT0RFX0lOVFJBXG4iLCBtYm51bSk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9kZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgdG90YWxTQUQgKz0gbW90X21iWzBdLnNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWJudW0gKz0gaW5jcl9pOworICAgICAgICAgICAgICAgIG9mZnNldCArPSAoaW5jcl9pIDw8IDQpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5jcl9pID4gMSAmJiBudW1Mb29wKSAvKiBzY2VuZSBjaGFuZ2Ugb24gYW5kIGZpcnN0IGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLy9pZihudW1JbnRyYSA+ICgodG90YWxNQj4+Myk8PDEpICsgKHRvdGFsTUI+PjMpKSAvKiA3NSUgb2YgNTAlTUJzICovCisgICAgICAgICAgICBpZiAobnVtSW50cmEgPiAoMC4zMCoodG90YWxNQiAvIDIuMCkpKSAvKiAxNSUgb2YgNTAlTUJzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqIHNjZW5lIGNoYW5nZSBkZXRlY3RlZCAqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CisgICAgICAgICAgICAgICAgTTRWRU5DX01FTVNFVChNb2RlLCBNT0RFX0lOVFJBLCBzaXplb2YoVUNoYXIpKnRvdGFsTUIpOyAvKiBzZXQgdGhpcyBmb3IgTUIgbGV2ZWwgY29kaW5nKi8KKyAgICAgICAgICAgICAgICBjdXJyVm9wLT5xdWFudGl6ZXIgPSB2aWRlby0+ZW5jUGFyYW1zLT5Jbml0UXVhbnRJdm9wW3ZpZGVvLT5jdXJyTGF5ZXJdOworCisgICAgICAgICAgICAgICAgLyogY29tcHV0ZSB0aGUgU0FWIGZvciByYXRlIGNvbnRyb2wgJiBmYXN0IERDVCAqLworICAgICAgICAgICAgICAgIHRvdGFsU0FEID0gMDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIG1ibnVtID0gMDsKKyAgICAgICAgICAgICAgICBjdXIgPSBjdXJyRnJhbWUtPnlDaGFuOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iaGVpZ2h0OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJ3aWR0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYiA9IG1vdFttYm51bV07CisKKworICAgICAgICAgICAgICAgICAgICAgICAgKCpDb21wdXRlTUJTdW0pKGN1ciArIChpIDw8IDQpLCB3aWR0aCwgbW90X21iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IG1vdF9tYlswXS5zYWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ibnVtKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3VyICs9ICh3aWR0aCA8PCA0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aWRlby0+c3VtTUFEID0gKGZsb2F0KXRvdGFsU0FEIC8gKGZsb2F0KU51bVBpeGVsTUI7CisgICAgICAgICAgICAgICAgUmVzZXRJbnRyYVVwZGF0ZShpbnRyYUFycmF5LCB0b3RhbE1CKTsKKyAgICAgICAgICAgICAgICAvKiB2aWRlby0+bnVtVm9wc0luR09QPTA7IDMvMTMvMDEgbW92ZSBpdCB0byB2b3AuYyovCisKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKioqKioqKiBubyBzY2VuZSBjaGFuZ2UsIGNvbnRpbnVlIG1vdGlvbiBzZWFyY2ggKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgc3RhcnRfaSA9IDA7CisgICAgICAgIHR5cGVfcHJlZCsrOyAvKiBzZWNvbmQgcGFzcyAqLworICAgIH0KKworICAgIHZpZGVvLT5zdW1NQUQgPSAoZmxvYXQpdG90YWxTQUQgLyAoZmxvYXQpTnVtUGl4ZWxNQjsgICAgLyogYXZnIFNBRCAqLworCisgICAgLyogZmluZCBmX2NvZGUgLCAxMC8yNy8yMDAwICovCisgICAgZl9jb2RlX3AgPSAxOworICAgIHdoaWxlICgobWF4X21hZyA+PiAoNCArIGZfY29kZV9wKSkgPiAwKQorICAgICAgICBmX2NvZGVfcCsrOworCisgICAgZl9jb2RlX24gPSAxOworICAgIG1pbl9tYWcgKj0gLTE7CisgICAgd2hpbGUgKChtaW5fbWFnIC0gMSkgPj4gKDQgKyBmX2NvZGVfbikgPiAwKQorICAgICAgICBmX2NvZGVfbisrOworCisgICAgY3VyclZvcC0+ZmNvZGVGb3J3YXJkID0gKGZfY29kZV9wID4gZl9jb2RlX24gPyBmX2NvZGVfcCA6IGZfY29kZV9uKTsKKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLyAgLyogMi8yOC8wMSAqLworICAgIGlmIChjb2xsZWN0KQorICAgIHsKKyAgICAgICAgY29sbGVjdCA9IDA7CisgICAgICAgIFVwZGF0ZUhURk0odmlkZW8sIG5ld3ZhciwgZXhwX2xhbWRhLCAmaHRmbV9zdGF0KTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIDsKK30KKworCisjaWZkZWYgSFRGTQordm9pZCBJbml0SFRGTShWaWRlb0VuY0RhdGEgKnZpZGVvLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgZG91YmxlICpuZXd2YXIsIEludCAqY29sbGVjdCkKK3sKKyAgICBJbnQgaTsKKyAgICBJbnQgbHggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7IC8vICBwYWRkaW5nCisgICAgSW50IGx4MiA9IGx4IDw8IDE7CisgICAgSW50IGx4MyA9IGx4MiArIGx4OworICAgIEludCByeCA9IHZpZGVvLT5jdXJyVm9wLT5waXRjaDsKKyAgICBJbnQgcngyID0gcnggPDwgMTsKKyAgICBJbnQgcngzID0gcngyICsgcng7CisKKyAgICBJbnQgKm9mZnNldCwgKm9mZnNldDI7CisKKyAgICAvKiA0LzExLzAxLCBjb2xsZWN0IGRhdGEgZXZlcnkgMzAgZnJhbWVzLCBkb2Vzbid0IGhhdmUgdG8gYmUgYmFzZSBsYXllciAqLworICAgIGlmICgoKEludCl2aWRlby0+bnVtVm9wc0luR09QKSAlIDMwID09IDEpCisgICAgeworCisgICAgICAgICpjb2xsZWN0ID0gMTsKKworICAgICAgICBodGZtX3N0YXQtPmNvdW50YnJlYWsgPSAwOworICAgICAgICBodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2ZyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld3ZhcltpXSA9IDAuMDsKKyAgICAgICAgfQorLy8gICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfUEFERElORyA9ICZTQURfTUJfUEFERElOR19IVEZNX0NvbGxlY3Q7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNX0NvbGxlY3Q7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoOworICAgICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWg7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJlNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloOworICAgICAgICB2aWRlby0+c2FkX2V4dHJhX2luZm8gPSAodm9pZCopKGh0Zm1fc3RhdCk7CisgICAgICAgIG9mZnNldCA9IGh0Zm1fc3RhdC0+b2Zmc2V0QXJyYXk7CisgICAgICAgIG9mZnNldDIgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKy8vICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkdfSFRGTTsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2sgPSAmU0FEX01CX0hURk07CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hQX0hURk14aDsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmU0FEX01CX0hQX0hURk15aDsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmU0FEX01CX0hQX0hURk14aHloOworICAgICAgICB2aWRlby0+c2FkX2V4dHJhX2luZm8gPSAodm9pZCopKHZpZGVvLT5ucm1sel90aCk7CisgICAgICAgIG9mZnNldCA9IHZpZGVvLT5ucm1sel90aCArIDE2OworICAgICAgICBvZmZzZXQyID0gdmlkZW8tPm5ybWx6X3RoICsgMzI7CisgICAgfQorCisgICAgb2Zmc2V0WzBdID0gMDsKKyAgICBvZmZzZXRbMV0gPSBseDIgKyAyOworICAgIG9mZnNldFsyXSA9IDI7CisgICAgb2Zmc2V0WzNdID0gbHgyOworICAgIG9mZnNldFs0XSA9IGx4ICsgMTsKKyAgICBvZmZzZXRbNV0gPSBseDMgKyAzOworICAgIG9mZnNldFs2XSA9IGx4ICsgMzsKKyAgICBvZmZzZXRbN10gPSBseDMgKyAxOworICAgIG9mZnNldFs4XSA9IGx4OworICAgIG9mZnNldFs5XSA9IGx4MyArIDI7CisgICAgb2Zmc2V0WzEwXSA9IGx4MyA7CisgICAgb2Zmc2V0WzExXSA9IGx4ICsgMiA7CisgICAgb2Zmc2V0WzEyXSA9IDE7CisgICAgb2Zmc2V0WzEzXSA9IGx4MiArIDM7CisgICAgb2Zmc2V0WzE0XSA9IGx4MiArIDE7CisgICAgb2Zmc2V0WzE1XSA9IDM7CisKKyAgICBvZmZzZXQyWzBdID0gMDsKKyAgICBvZmZzZXQyWzFdID0gcngyICsgMjsKKyAgICBvZmZzZXQyWzJdID0gMjsKKyAgICBvZmZzZXQyWzNdID0gcngyOworICAgIG9mZnNldDJbNF0gPSByeCArIDE7CisgICAgb2Zmc2V0Mls1XSA9IHJ4MyArIDM7CisgICAgb2Zmc2V0Mls2XSA9IHJ4ICsgMzsKKyAgICBvZmZzZXQyWzddID0gcngzICsgMTsKKyAgICBvZmZzZXQyWzhdID0gcng7CisgICAgb2Zmc2V0Mls5XSA9IHJ4MyArIDI7CisgICAgb2Zmc2V0MlsxMF0gPSByeDMgOworICAgIG9mZnNldDJbMTFdID0gcnggKyAyIDsKKyAgICBvZmZzZXQyWzEyXSA9IDE7CisgICAgb2Zmc2V0MlsxM10gPSByeDIgKyAzOworICAgIG9mZnNldDJbMTRdID0gcngyICsgMTsKKyAgICBvZmZzZXQyWzE1XSA9IDM7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIFVwZGF0ZUhURk0oVmlkZW9FbmNEYXRhICp2aWRlbywgZG91YmxlICpuZXd2YXIsIGRvdWJsZSAqZXhwX2xhbWRhLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCkKK3sKKyAgICBpZiAoaHRmbV9zdGF0LT5jb3VudGJyZWFrID09IDApCisgICAgICAgIGh0Zm1fc3RhdC0+Y291bnRicmVhayA9IDE7CisKKyAgICBuZXd2YXJbMF0gPSAoZG91YmxlKShodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2ZykgLyAoaHRmbV9zdGF0LT5jb3VudGJyZWFrICogMTYuKTsKKworICAgIGlmIChuZXd2YXJbMF0gPCAwLjAwMSkKKyAgICB7CisgICAgICAgIG5ld3ZhclswXSA9IDAuMDAxOyAvKiB0byBwcmV2ZW50IGZsb2F0aW5nIG92ZXJmbG93ICovCisgICAgfQorICAgIGV4cF9sYW1kYVswXSA9ICAxIC8gKG5ld3ZhclswXSAqIDEuNDE0MjEzNik7CisgICAgZXhwX2xhbWRhWzFdID0gZXhwX2xhbWRhWzBdICogMS41ODI1OworICAgIGV4cF9sYW1kYVsyXSA9IGV4cF9sYW1kYVswXSAqIDIuMTc1MDsKKyAgICBleHBfbGFtZGFbM10gPSBleHBfbGFtZGFbMF0gKiAzLjUwNjU7CisgICAgZXhwX2xhbWRhWzRdID0gZXhwX2xhbWRhWzBdICogMy4xNDM2OworICAgIGV4cF9sYW1kYVs1XSA9IGV4cF9sYW1kYVswXSAqIDMuNTMxNTsKKyAgICBleHBfbGFtZGFbNl0gPSBleHBfbGFtZGFbMF0gKiAzLjc0NDk7CisgICAgZXhwX2xhbWRhWzddID0gZXhwX2xhbWRhWzBdICogNC41ODU0OworICAgIGV4cF9sYW1kYVs4XSA9IGV4cF9sYW1kYVswXSAqIDQuNjE5MTsKKyAgICBleHBfbGFtZGFbOV0gPSBleHBfbGFtZGFbMF0gKiA1LjQwNDE7CisgICAgZXhwX2xhbWRhWzEwXSA9IGV4cF9sYW1kYVswXSAqIDYuNTk3NDsKKyAgICBleHBfbGFtZGFbMTFdID0gZXhwX2xhbWRhWzBdICogMTAuNTM0MTsKKyAgICBleHBfbGFtZGFbMTJdID0gZXhwX2xhbWRhWzBdICogMTAuMDcxOTsKKyAgICBleHBfbGFtZGFbMTNdID0gZXhwX2xhbWRhWzBdICogMTIuMDUxNjsKKyAgICBleHBfbGFtZGFbMTRdID0gZXhwX2xhbWRhWzBdICogMTUuNDU1MjsKKworICAgIENhbGNUaHJlc2hvbGQoSFRGTV9QZiwgZXhwX2xhbWRhLCB2aWRlby0+bnJtbHpfdGgpOworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBDYWxjVGhyZXNob2xkKGRvdWJsZSBwZiwgZG91YmxlIGV4cF9sYW1kYVtdLCBJbnQgbnJtbHpfdGhbXSkKK3sKKyAgICBJbnQgaTsKKyAgICBkb3VibGUgdGVtcFsxNV07CisgICAgLy8gIHByaW50ZigiXG5MYW1kYTogIik7CisKKyAgICAvKiBwYXJhbWV0cmljIFBSRU1PREVMbGluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIHsKKyAgICAgICAgLy8gICAgcHJpbnRmKCIlZyAiLGV4cF9sYW1kYVtpXSk7CisgICAgICAgIGlmIChwZiA8IDAuNSkKKyAgICAgICAgICAgIHRlbXBbaV0gPSAxIC8gZXhwX2xhbWRhW2ldICogTTRWRU5DX0xPRygyICogcGYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZW1wW2ldID0gLTEgLyBleHBfbGFtZGFbaV0gKiBNNFZFTkNfTE9HKDIgKiAoMSAtIHBmKSk7CisgICAgfQorCisgICAgbnJtbHpfdGhbMTVdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgICAgICAgIC8qIHNjYWxlIHVwdG8gbm8ucGl4ZWxzICovCisgICAgICAgIG5ybWx6X3RoW2ldID0gKEludCkodGVtcFtpXSAqICgoaSArIDEpIDw8IDQpICsgMC41KTsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgICAgSFRGTVByZXBhcmVDdXJNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgVUNoYXIgKmN1cikKK3sKKyAgICB2b2lkKiB0bXAgPSAodm9pZCopKHZpZGVvLT5jdXJyWU1CKTsKKyAgICBVTG9uZyAqaHRmbU1CID0gKFVMb25nKil0bXA7CisgICAgVUNoYXIgKnB0ciwgYnl0ZTsKKyAgICBJbnQgKm9mZnNldDsKKyAgICBJbnQgaTsKKyAgICBVTG9uZyB3b3JkOworICAgIEludCB3aWR0aCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsKKworICAgIGlmICgoKEludCl2aWRlby0+bnVtVm9wc0luR09QKSAlIDMwID09IDEpCisgICAgeworICAgICAgICBvZmZzZXQgPSBodGZtX3N0YXQtPm9mZnNldEFycmF5OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvZmZzZXQgPSB2aWRlby0+bnJtbHpfdGggKyAxNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHB0ciA9IGN1ciArIG9mZnNldFtpXTsKKyAgICAgICAgd29yZCA9IHB0clswXTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHdpZHRoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHdpZHRoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHdpZHRoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKyNlbmRpZgorCit2b2lkICAgIFByZXBhcmVDdXJNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyKQoreworICAgIHZvaWQqIHRtcCA9ICh2b2lkKikodmlkZW8tPmN1cnJZTUIpOworICAgIFVMb25nICpjdXJyWU1CID0gKFVMb25nKil0bXA7CisgICAgSW50IGk7CisgICAgSW50IHdpZHRoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOworCisgICAgY3VyIC09IHdpZHRoOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICAqY3VycllNQisrID0gKigoVUxvbmcqKShjdXIgKz0gd2lkdGgpKTsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKFVMb25nKikoY3VyICsgNCkpOworICAgICAgICAqY3VycllNQisrID0gKigoVUxvbmcqKShjdXIgKyA4KSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKChVTG9uZyopKGN1ciArIDEyKSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIE1CTW90aW9uU2VhcmNoCisgICAgRGF0ZTogICAgICAgMDkvMDYvMjAwMAorICAgIFB1cnBvc2U6ICAgIFBlcmZvcm0gbW90aW9uIGVzdGltYXRpb24gZm9yIGEgbWFjcm9ibG9jay4KKyAgICAgICAgICAgICAgICBGaW5kIDFNViBhbmQgNE1WcyBpbiBoYWxmLXBlbHMgcmVzb2x1dGlvbnMuCisgICAgICAgICAgICAgICAgVXNpbmcgU1QxIGFsZ29yaXRobSBwcm92aWRlZCBieSBDaGFsaWRhYmhvbmdzZSBhbmQgS3VvCisgICAgICAgICAgICAgICAgQ1NWVCBNYXJjaCc5OC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBNQk1vdGlvblNlYXJjaChWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyLCBVQ2hhciAqYmVzdF9jYW5kW10sCisgICAgICAgICAgICAgICAgICAgIEludCBpMCwgSW50IGowLCBJbnQgdHlwZV9wcmVkLCBJbnQgRlNfZW4sIEludCAqaHBfZ3Vlc3MpCit7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBVQ2hhciAqcmVmLCAqY2FuZCwgKm5jYW5kID0gTlVMTCwgKmN1cjg7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IHZpZGVvLT5zYWRfZXh0cmFfaW5mbzsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgSW50IHdpZHRoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiA2LzEyLzAxLCBtdXN0IGJlIG11bHRpcGxlIG9mIDE2ICovCisgICAgSW50IGhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQ7CisgICAgTU9UICoqbW90ID0gdmlkZW8tPm1vdDsKKyAgICBVQ2hhciB1c2VfNG12ID0gdmlkZW8tPmVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZDsKKyAgICBVQ2hhciBoMjYzX21vZGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQ7CisgICAgSW50KCpTQURfTWFjcm9ibG9jaykoVUNoYXIqLCBVQ2hhciosIEludCwgdm9pZCopID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2s7CisgICAgSW50KCpTQURfQmxvY2spKFVDaGFyKiwgVUNoYXIqLCBJbnQsIEludCwgdm9pZCopID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsb2NrOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIEludCByYW5nZSA9IGVuY1BhcmFtcy0+U2VhcmNoUmFuZ2U7CisKKyAgICBJbnQgbHggPSB2aWRlby0+Y3VyclZvcC0+cGl0Y2g7IC8qIHBhZGRpbmcgKi8KKyAgICBJbnQgY29tcDsKKyAgICBJbnQgaSwgaiwgaW1pbiwgam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoLCBpb3JnLCBqb3JnOworICAgIEludCBkLCBkbWluLCBkbls5XTsKKyNpZiAoWkVST19NVl9QUkVGPT0xKSAgIC8qIGNvbXB1dGUgKDAsMCkgTVYgYXQgdGhlIGVuZCAqLworICAgIEludCBkMDsKKyNlbmRpZgorICAgIEludCBrOworICAgIEludCBtdnhbNV0sIG12eVs1XSwgaW1pbjAsIGptaW4wOworICAgIEludCBudW1fY2FuLCBjZW50ZXJfYWdhaW47CisgICAgSW50IGxhc3RfbG9jLCBuZXdfbG9jID0gMDsKKyAgICBJbnQgc3RlcCwgbWF4X3N0ZXAgPSByYW5nZSA+PiAxOworICAgIEludCBuZXh0OworCisgICAgcmVmID0gdmlkZW8tPmZvcndhcmRSZWZWb3AtPnlDaGFuOyAvKiBvcmlnaW4gb2YgYWN0dWFsIGZyYW1lICovCisKKyAgICBjdXIgPSB2aWRlby0+Y3VycllNQjsgLyogdXNlIHNtYWxsZXIgbWVtb3J5IHNwYWNlIGZvciBjdXJyZW50IE1CICovCisKKyAgICAvKiAgZmluZCBsaW1pdCBvZiB0aGUgc2VhcmNoIChhZGp1c3Rpbmcgc2VhcmNoIHJhbmdlKSovCisKKyAgICBpZiAoIWgyNjNfbW9kZSkKKyAgICB7CisgICAgICAgIGlsb3cgPSBpMCAtIHJhbmdlOworICAgICAgICBpZiAoaWxvdyA8IC0xNSkKKyAgICAgICAgICAgIGlsb3cgPSAtMTU7CisgICAgICAgIGloaWdoID0gaTAgKyByYW5nZSAtIDE7CisgICAgICAgIGlmIChpaGlnaCA+IHdpZHRoIC0gMSkKKyAgICAgICAgICAgIGloaWdoID0gd2lkdGggLSAxOworICAgICAgICBqbG93ID0gajAgLSByYW5nZTsKKyAgICAgICAgaWYgKGpsb3cgPCAtMTUpCisgICAgICAgICAgICBqbG93ID0gLTE1OworICAgICAgICBqaGlnaCA9IGowICsgcmFuZ2UgLSAxOworICAgICAgICBpZiAoamhpZ2ggPiBoZWlnaHQgLSAxKQorICAgICAgICAgICAgamhpZ2ggPSBoZWlnaHQgLSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbG93ID0gaTAgLSByYW5nZTsKKyAgICAgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICAgICAgaWxvdyA9IDA7CisgICAgICAgIGloaWdoID0gaTAgKyByYW5nZSAtIDE7CisgICAgICAgIGlmIChpaGlnaCA+IHdpZHRoIC0gMTYpCisgICAgICAgICAgICBpaGlnaCA9IHdpZHRoIC0gMTY7CisgICAgICAgIGpsb3cgPSBqMCAtIHJhbmdlOworICAgICAgICBpZiAoamxvdyA8IDApCisgICAgICAgICAgICBqbG93ID0gMDsKKyAgICAgICAgamhpZ2ggPSBqMCArIHJhbmdlIC0gMTsKKyAgICAgICAgaWYgKGpoaWdoID4gaGVpZ2h0IC0gMTYpCisgICAgICAgICAgICBqaGlnaCA9IGhlaWdodCAtIDE2OworICAgIH0KKworICAgIGltaW4gPSBpMDsKKyAgICBqbWluID0gajA7IC8qIG5lZWRlZCBmb3IgZnVsbHNlYXJjaCAqLworICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKworICAgIC8qIGZvciBmaXJzdCByb3cgb2YgTUIsIGZ1bGxzZWFyY2ggY2FuIGJlIHVzZWQgKi8KKyAgICBpZiAoRlNfZW4pCisgICAgeworICAgICAgICAqaHBfZ3Vlc3MgPSAwOyAvKiBubyBndWVzcyBmb3IgZmFzdCBoYWxmLXBlbCAqLworCisgICAgICAgIGRtaW4gPSAgZnVsbHNlYXJjaCh2aWRlbywgY3VyclZvbCwgcmVmLCBjdXIsICZpbWluLCAmam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoKTsKKworICAgICAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisKKyAgICAgICAgbW90W21ibnVtXVswXS5zYWQgPSBkbWluOworICAgICAgICBtb3RbbWJudW1dWzBdLnggPSAoaW1pbiAtIGkwKSA8PCAxOworICAgICAgICBtb3RbbWJudW1dWzBdLnkgPSAoam1pbiAtIGowKSA8PCAxOworICAgICAgICBpbWluMCA9IGltaW4gPDwgMTsgIC8qIDE2eDE2IE1WIGluIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KKyAgICAgICAgam1pbjAgPSBqbWluIDw8IDE7CisgICAgICAgIGJlc3RfY2FuZFswXSA9IG5jYW5kOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qIDQvNy8wMSwgbW9kaWZpZWQgdGhpcyB0ZXN0aW5nIGZvciBmdWxsc2VhcmNoIHRoZSB0b3Agcm93IHRvIG9ubHkgdXB0byAoMCwzKSBNQiAqLworICAgICAgICAvKiAgICAgICAgICAgIHVwdG8gMzAlIGNvbXBsZXhpdHkgc2F2aW5nIHdpdGggdGhlIHNhbWUgY29tcGxleGl0eSAqLworICAgICAgICBpZiAodmlkZW8tPmZvcndhcmRSZWZWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QICYmIGowID09IDAgJiYgaTAgPD0gNjQgJiYgdHlwZV9wcmVkICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpocF9ndWVzcyA9IDA7IC8qIG5vIGd1ZXNzIGZvciBmYXN0IGhhbGYtcGVsICovCisgICAgICAgICAgICBkbWluID0gIGZ1bGxzZWFyY2godmlkZW8sIGN1cnJWb2wsIHJlZiwgY3VyLCAmaW1pbiwgJmptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCk7CisgICAgICAgICAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKiogaW5pdGlhbGl6ZSBjYW5kaWRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBmaW5kIGluaXRpYWwgbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgQ2FuZGlkYXRlU2VsZWN0aW9uKG12eCwgbXZ5LCAmbnVtX2NhbiwgaTAgPj4gNCwgajAgPj4gNCwgdmlkZW8sIHR5cGVfcHJlZCk7CisKKyAgICAgICAgICAgIGRtaW4gPSA2NTUzNTsKKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIGFyZSBlcXVhbCAqLworICAgICAgICAgICAgaWYgKG51bV9jYW4gPT0gQUxMX0NBTkRfRVFVQUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IGkwICsgbXZ4WzBdOworICAgICAgICAgICAgICAgIGogPSBqMCArIG12eVswXTsKKworICAgICAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhbmQgPSByZWYgKyBpICsgaiAqIGx4OworCisgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKiogZXZhbHVhdGUgdW5pcXVlIGNhbmRpZGF0ZXMgKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2NhbjsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkwICsgbXZ4W2tdOworICAgICAgICAgICAgICAgICAgICBqID0gajAgKyBtdnlba107CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChkID09IGRtaW4pICYmIFBWX0FCUyhtdnhba10pICsgUFZfQUJTKG12eVtrXSkgPCBQVl9BQlMoaTAgLSBpbWluKSArIFBWX0FCUyhqMCAtIGptaW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fY2FuID09IDAgfHwgZG1pbiA9PSA2NTUzNSkgLyogbm8gY2FuZGlkYXRlIHNlbGVjdGVkICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpMCArIGowICogbHg7IC8qIHVzZSAoMCwwKSBNViBhcyBpbml0aWFsIHZhbHVlICovCisgICAgICAgICAgICAgICAgbW90W21ibnVtXVs3XS5zYWQgPSBkbWluID0gKCpTQURfTWFjcm9ibG9jaykobmNhbmQsIGN1ciwgKDY1NTM1IDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyNpZiAoWkVST19NVl9QUkVGPT0xKSAgIC8qIGNvbXB1dGUgKDAsMCkgTVYgYXQgdGhlIGVuZCAqLworICAgICAgICAgICAgICAgIGQwID0gZG1pbjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGltaW4gPSBpMDsKKyAgICAgICAgICAgICAgICBqbWluID0gajA7CisgICAgICAgICAgICB9CisKKyNpZiAoWkVST19NVl9QUkVGPT0wKSAgLyogIENPTVBVVEUgWkVSTyBWRUNUT1IgRklSU1QgISEhISEqLworICAgICAgICAgICAgZG1pbiAtPSBQUkVGX05VTExfVkVDOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqIGxvY2FsIHJlZmluZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgIGxhc3RfbG9jID0gbmV3X2xvYyA9IDA7CisgICAgICAgICAgICAvLyAgICAgICAgICBuY2FuZCA9IHJlZiArIGptaW4qbHggKyBpbWluOyAgLyogY2VudGVyIG9mIHRoZSBzZWFyY2ggKi8KKyAgICAgICAgICAgIHN0ZXAgPSAwOworICAgICAgICAgICAgZG5bMF0gPSBkbWluOworICAgICAgICAgICAgd2hpbGUgKCFjZW50ZXJfYWdhaW4gJiYgc3RlcCA8PSBtYXhfc3RlcCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIE1vdmVOZWlnaGJvclNBRChkbiwgbGFzdF9sb2MpOworCisgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMTsKKyAgICAgICAgICAgICAgICBpID0gaW1pbjsKKyAgICAgICAgICAgICAgICBqID0gam1pbiAtIDE7CisgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAvKiAgc3RhcnRpbmcgZnJvbSBbMCwtMV0gKi8KKyAgICAgICAgICAgICAgICAvKiBzcGlyYWwgY2hlY2sgb25lIHN0ZXAgYXQgYSB0aW1lKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAyOyBrIDw9IDg7IGsgKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFiX2V4Y2x1ZGVbbGFzdF9sb2NdW2tdKSAvKiBleGNsdWRlIGxhc3Qgc3RlcCBjb21wdXRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB7ICAgICAgIC8qIG5vdCBhbHJlYWR5IGNvbXB1dGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuW2tdID0gZDsgLyoga2VlcCBpdCBmb3IgaGFsZiBwZWwgdXNlICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19sb2MgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoZCA9PSBkbWluKSAmJiBQVl9BQlMoaTAgLSBpKSArIFBWX0FCUyhqMCAtIGopIDwgUFZfQUJTKGkwIC0gaW1pbikgKyBQVl9BQlMoajAgLSBqbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbG9jID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gOCkgIC8qIGVuZCBzaWRlIHNlYXJjaCovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAtMTsgLyogc3RhcnQgZGlhZ29uYWwgc2VhcmNoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCAtPSBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IGx4ICogbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0X2xvYyA9IG5ld19sb2M7CisgICAgICAgICAgICAgICAgc3RlcCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgIE1vdmVOZWlnaGJvclNBRChkbiwgbGFzdF9sb2MpOworCisgICAgICAgICAgICAqaHBfZ3Vlc3MgPSBGaW5kTWluKGRuKTsKKworICAgICAgICB9CisKKyNpZiAoWkVST19NVl9QUkVGPT0xKSAgIC8qIGNvbXB1dGUgKDAsMCkgTVYgYXQgdGhlIGVuZCAqLworICAgICAgICBpZiAoZDAgLSBQUkVGX05VTExfVkVDIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpMCArIGowICogbHg7CisgICAgICAgICAgICBkbWluID0gZDA7CisgICAgICAgICAgICBpbWluID0gaTA7CisgICAgICAgICAgICBqbWluID0gajA7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBtb3RbbWJudW1dWzBdLnNhZCA9IGRtaW47CisgICAgICAgIG1vdFttYm51bV1bMF0ueCA9IChpbWluIC0gaTApIDw8IDE7CisgICAgICAgIG1vdFttYm51bV1bMF0ueSA9IChqbWluIC0gajApIDw8IDE7CisgICAgICAgIGltaW4wID0gaW1pbiA8PCAxOyAgLyogMTZ4MTYgTVYgaW4gaGFsZi1wZWwgcmVzb2x1dGlvbiAqLworICAgICAgICBqbWluMCA9IGptaW4gPDwgMTsKKyAgICAgICAgYmVzdF9jYW5kWzBdID0gbmNhbmQ7CisgICAgfQorICAgIC8qIGltaW4gYW5kIGptaW4gaXMgdGhlIGJlc3QgMSBNViAqLworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgLyoqKioqKioqKioqKioqKioqKiogIEZpbmQgNCBtb3Rpb24gdmVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh1c2VfNG12ICYmICFoMjYzX21vZGUpCisgICAgeworI2lmZGVmIF9TQURfU1RBVAorICAgICAgICBudW1fQmxrICs9IDQ7CisjZW5kaWYKKyAgICAgICAgLyogc3RhcnRpbmcgZnJvbSB0aGUgYmVzdCAxTVYgKi8KKyAgICAgICAgLy9vZmZzZXQgPSBpbWluICsgam1pbipseDsKKyAgICAgICAgaW9yZyA9IGkwOworICAgICAgICBqb3JnID0gajA7CisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaTAgPSBpb3JnICsgKChjb21wICYgMSkgPDwgMyk7CisgICAgICAgICAgICBqMCA9IGpvcmcgKyAoKGNvbXAgJiAyKSA8PCAyKTsKKworICAgICAgICAgICAgaW1pbiA9IChpbWluMCA+PiAxKSArICgoY29tcCAmIDEpIDw8IDMpOyAgICAvKiBzdGFydGluZyBwb2ludCBmcm9tIDE2eDE2IE1WICovCisgICAgICAgICAgICBqbWluID0gKGptaW4wID4+IDEpICsgKChjb21wICYgMikgPDwgMik7CisgICAgICAgICAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisKKyAgICAgICAgICAgIGN1cjggPSBjdXIgKyAoKGNvbXAgJiAxKSA8PCAzKSArICgoKGNvbXAgJiAyKSA8PCAyKSA8PCA0KSA7IC8qIDExLzMwLzA1LCBzbWFsbGVyIGNhY2hlICovCisKKyAgICAgICAgICAgIC8qICBmaW5kIGxpbWl0IG9mIHRoZSBzZWFyY2ggKGFkanVzdGluZyBzZWFyY2ggcmFuZ2UpKi8KKyAgICAgICAgICAgIGlsb3cgPSBpMCAtIHJhbmdlOworICAgICAgICAgICAgaWhpZ2ggPSBpMCArIHJhbmdlIC0gMSA7LyogNC85LzAxICovCisgICAgICAgICAgICBpZiAoaWxvdyA8IC0xNSkKKyAgICAgICAgICAgICAgICBpbG93ID0gLTE1OworICAgICAgICAgICAgaWYgKGloaWdoID4gd2lkdGggLSAxKQorICAgICAgICAgICAgICAgIGloaWdoID0gd2lkdGggLSAxOworICAgICAgICAgICAgamxvdyA9IGowIC0gcmFuZ2U7CisgICAgICAgICAgICBqaGlnaCA9IGowICsgcmFuZ2UgLSAxIDsvKiA0LzkvMDEgKi8KKyAgICAgICAgICAgIGlmIChqbG93IDwgLTE1KQorICAgICAgICAgICAgICAgIGpsb3cgPSAtMTU7CisgICAgICAgICAgICBpZiAoamhpZ2ggPiBoZWlnaHQgLSAxKQorICAgICAgICAgICAgICAgIGpoaWdoID0gaGVpZ2h0IC0gMTsKKworICAgICAgICAgICAgU0FEX0Jsb2NrID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsb2NrOworCisgICAgICAgICAgICBpZiAoRlNfZW4pICAvKiBmdWxsc2VhcmNoIGVuYWJsZSwgY2VudGVyIGFyb3VuZCAxNngxNiBNViAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRtaW4gPSAgZnVsbHNlYXJjaEJsayh2aWRlbywgY3VyclZvbCwgbmNhbmQsIGN1cjgsICZpbWluLCAmam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoLCByYW5nZSk7CisgICAgICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworCisgICAgICAgICAgICAgICAgbW90W21ibnVtXVtjb21wKzFdLnNhZCA9IGRtaW47CisgICAgICAgICAgICAgICAgbW90W21ibnVtXVtjb21wKzFdLnggPSAoaW1pbiAtIGkwKSA8PCAxOworICAgICAgICAgICAgICAgIG1vdFttYm51bV1bY29tcCsxXS55ID0gKGptaW4gLSBqMCkgPDwgMTsKKyAgICAgICAgICAgICAgICBiZXN0X2NhbmRbY29tcCsxXSA9IG5jYW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAvKiBubyBmdWxsc2VhcmNoLCBkbyBsb2NhbCBzZWFyY2ggKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBwb2ludCBmcm9tIDE2eDE2ICovCisgICAgICAgICAgICAgICAgZG1pbiA9ICgqU0FEX0Jsb2NrKShuY2FuZCwgY3VyOCwgNjU1MzYsIGx4LCBleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqIGxvY2FsIHJlZmluZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICAgICAgbGFzdF9sb2MgPSAwOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCFjZW50ZXJfYWdhaW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAxOworICAgICAgICAgICAgICAgICAgICBpID0gaW1pbjsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGptaW4gLSAxOworICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKworICAgICAgICAgICAgICAgICAgICAvKiAgc3RhcnRpbmcgZnJvbSBbMCwtMV0gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogc3BpcmFsIGNoZWNrIG9uZSBzdGVwIGF0IGEgdGltZSovCisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDI7IGsgPD0gODsgayArPSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYl9leGNsdWRlW2xhc3RfbG9jXVtrXSkgLyogZXhjbHVkZSBsYXN0IHN0ZXAgY29tcHV0YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgLyogbm90IGFscmVhZHkgY29tcHV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfQmxvY2spKGNhbmQsIGN1cjgsIGRtaW4sIGx4LCBleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbG9jID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoZCA9PSBkbWluKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVl9BQlMoaTAgLSBpKSArIFBWX0FCUyhqMCAtIGopIDwgUFZfQUJTKGkwIC0gaW1pbikgKyBQVl9BQlMoajAgLSBqbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbG9jID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID09IDgpICAvKiBlbmQgc2lkZSBzZWFyY2gqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IC0xOyAvKiBzdGFydCBkaWFnb25hbCBzZWFyY2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPD0gaGVpZ2h0IC0gMSAmJiBqID4gMCkgICBjYW5kIC09IGx4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSByZWZpbmVfbmV4dFtrXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSByZWZpbmVfbmV4dFtrXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IGx4ICogbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdF9sb2MgPSBuZXdfbG9jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb3RbbWJudW1dW2NvbXArMV0uc2FkID0gZG1pbjsKKyAgICAgICAgICAgICAgICBtb3RbbWJudW1dW2NvbXArMV0ueCA9IChpbWluIC0gaTApIDw8IDE7CisgICAgICAgICAgICAgICAgbW90W21ibnVtXVtjb21wKzFdLnkgPSAoam1pbiAtIGowKSA8PCAxOworICAgICAgICAgICAgICAgIGJlc3RfY2FuZFtjb21wKzFdID0gbmNhbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmICAvKiBOT19JTlRFUjRWICovCisgICAgeworICAgICAgICBtb3RbbWJudW1dWzFdLnNhZCA9IG1vdFttYm51bV1bMl0uc2FkID0gbW90W21ibnVtXVszXS5zYWQgPSBtb3RbbWJudW1dWzRdLnNhZCA9IChkbWluICsgMikgPj4gMjsKKyAgICAgICAgbW90W21ibnVtXVsxXS54ID0gbW90W21ibnVtXVsyXS54ID0gbW90W21ibnVtXVszXS54ID0gbW90W21ibnVtXVs0XS54ID0gbW90W21ibnVtXVswXS54OworICAgICAgICBtb3RbbWJudW1dWzFdLnkgPSBtb3RbbWJudW1dWzJdLnkgPSBtb3RbbWJudW1dWzNdLnkgPSBtb3RbbWJudW1dWzRdLnkgPSBtb3RbbWJudW1dWzBdLnk7CisgICAgICAgIGJlc3RfY2FuZFsxXSA9IGJlc3RfY2FuZFsyXSA9IGJlc3RfY2FuZFszXSA9IGJlc3RfY2FuZFs0XSA9IG5jYW5kOworCisgICAgfQorICAgIHJldHVybiA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgZnVsbHNlYXJjaAorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBQZXJmb3JtIGZ1bGwtc2VhcmNoIG1vdGlvbiBlc3RpbWF0aW9uIG92ZXIgdGhlIHJhbmdlIG9mIHNlYXJjaAorICAgICAgICAgICAgICAgIHJlZ2lvbiBpbiBhIHNwaXJhbC1vdXR3YXJkIG1hbm5lci4KKyAgICBJbnB1dC9PdXRwdXQ6ICAgVmlkZW9FbmNEYXRhLCBjdXJyZW50IFZvbCwgcHJldmlvdSBWb3AsIHBvaW50ZXIgdG8gdGhlIGxlZnQgY29ybmVyIG9mCisgICAgICAgICAgICAgICAgY3VycmVudCBWT1AsIGN1cnJlbnQgY29vcmQgKGFsc28gb3V0cHV0KSwgYm91bmRhcmllcy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitJbnQgZnVsbHNlYXJjaChWaWRlb0VuY0RhdGEgKnZpZGVvLCBWb2wgKmN1cnJWb2wsIFVDaGFyICpwcmV2LCBVQ2hhciAqY3VyLAorICAgICAgICAgICAgICAgSW50ICppbWluLCBJbnQgKmptaW4sIEludCBpbG93LCBJbnQgaWhpZ2gsIEludCBqbG93LCBJbnQgamhpZ2gpCit7CisgICAgSW50IHJhbmdlID0gdmlkZW8tPmVuY1BhcmFtcy0+U2VhcmNoUmFuZ2U7CisgICAgVUNoYXIgKmNhbmQ7CisgICAgSW50IGksIGosIGssIGw7CisgICAgSW50IGQsIGRtaW47CisgICAgSW50IGkwID0gKmltaW47IC8qIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBJbnQgajAgPSAqam1pbjsKKyAgICBJbnQoKlNBRF9NYWNyb2Jsb2NrKShVQ2hhciosIFVDaGFyKiwgSW50LCB2b2lkKikgPSB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jazsKKyAgICB2b2lkICpleHRyYV9pbmZvID0gdmlkZW8tPnNhZF9leHRyYV9pbmZvOworLy8gIFVDaGFyIGgyNjNfbW9kZSA9IHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZDsKKyAgICBJbnQgbHggPSB2aWRlby0+Y3VyclZvcC0+cGl0Y2g7IC8qIHdpdGggcGFkZGluZyAqLworCisgICAgSW50IG9mZnNldCA9IGkwICsgajAgKiBseDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhjdXJyVm9sKTsKKworICAgIGNhbmQgPSBwcmV2ICsgb2Zmc2V0OworCisgICAgZG1pbiAgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsICg2NTUzNSA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pIC0gUFJFRl9OVUxMX1ZFQzsKKworICAgIC8qIHBlcmZvcm0gc3BpcmFsIHNlYXJjaCAqLworICAgIGZvciAoayA9IDE7IGsgPD0gcmFuZ2U7IGsrKykKKyAgICB7CisKKyAgICAgICAgaSA9IGkwIC0gazsKKyAgICAgICAgaiA9IGowIC0gazsKKworICAgICAgICBjYW5kID0gcHJldiArIGkgKyBqICogbHg7CisKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IDgqazsgbCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBubyBuZWVkIGZvciBib3VuZGFyeSBjaGVja2luZyBhZ2FpbiAqLworICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCAodm9pZCopZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgKmltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAqam1pbiA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChkID09IGRtaW4pICYmIFBWX0FCUyhpMCAtIGkpICsgUFZfQUJTKGowIC0gaikgPCBQVl9BQlMoaTAgLSAqaW1pbikgKyBQVl9BQlMoajAgLSAqam1pbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgKmltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAqam1pbiA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobCA8IChrIDw8IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBjYW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKGsgPDwgMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGNhbmQgKz0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKChrIDw8IDIpICsgKGsgPDwgMSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjYW5kLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZG1pbjsKK30KKworI2lmbmRlZiBOT19JTlRFUjRWCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBmdWxsc2VhcmNoQmxrCisgICAgRGF0ZTogICAgICAgMDEvOS8yMDAxCisgICAgUHVycG9zZTogICAgUGVyZm9ybSBmdWxsLXNlYXJjaCBtb3Rpb24gZXN0aW1hdGlvbiBvZiBhbiA4eDggYmxvY2sgb3ZlciB0aGUgcmFuZ2UKKyAgICAgICAgICAgICAgICBvZiBzZWFyY2ggcmVnaW9uIGluIGEgc3BpcmFsLW91dHdhcmQgbWFubmVyIGNlbnRlcmVkIGF0IHRoZSAxNngxNiBNVi4KKyAgICBJbnB1dC9PdXRwdXQ6ICAgVmlkZW9FbmNEYXRhLCBNQiBjb29yZGluYXRlLCBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIG9uIHRoZQorICAgICAgICAgICAgICAgIHJlZmVyZW5jZSwgcG9pbnRlciB0byBjb29yIG9mIGN1cnJlbnQgYmxvY2ssIHNlYXJjaCByYW5nZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworSW50IGZ1bGxzZWFyY2hCbGsoVmlkZW9FbmNEYXRhICp2aWRlbywgVm9sICpjdXJyVm9sLCBVQ2hhciAqY2VudCwgVUNoYXIgKmN1ciwKKyAgICAgICAgICAgICAgICAgIEludCAqaW1pbiwgSW50ICpqbWluLCBJbnQgaWxvdywgSW50IGloaWdoLCBJbnQgamxvdywgSW50IGpoaWdoLCBJbnQgcmFuZ2UpCit7CisgICAgVUNoYXIgKmNhbmQsICpyZWY7CisgICAgSW50IGksIGosIGssIGwsIGlzdGFydCwganN0YXJ0OworICAgIEludCBkLCBkbWluOworICAgIEludCBseCA9IHZpZGVvLT5jdXJyVm9wLT5waXRjaDsgLyogd2l0aCBwYWRkaW5nICovCisgICAgSW50KCpTQURfQmxvY2spKFVDaGFyKiwgVUNoYXIqLCBJbnQsIEludCwgdm9pZCopID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsb2NrOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSB2aWRlby0+c2FkX2V4dHJhX2luZm87CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoY3VyclZvbCk7CisKKyAgICAvKiBzdGFydGluZyBwb2ludCBjZW50ZXJlZCBhdCAxNngxNiBNViAqLworICAgIHJlZiA9IGNlbnQ7CisgICAgaXN0YXJ0ID0gKmltaW47CisgICAganN0YXJ0ID0gKmptaW47CisKKyAgICBkbWluID0gKCpTQURfQmxvY2spKHJlZiwgY3VyLCA2NTUzNiwgbHgsICh2b2lkKilleHRyYV9pbmZvKTsKKworICAgIGNhbmQgPSByZWY7CisgICAgLyogcGVyZm9ybSBzcGlyYWwgc2VhcmNoICovCisgICAgZm9yIChrID0gMTsgayA8PSByYW5nZTsgaysrKQorICAgIHsKKworICAgICAgICBpID0gaXN0YXJ0IC0gazsKKyAgICAgICAgaiA9IGpzdGFydCAtIGs7CisgICAgICAgIGNhbmQgLT0gKGx4ICsgMSk7ICAvKiBjYW5kaWRhdGUgcmVnaW9uICovCisKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IDgqazsgbCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBubyBuZWVkIGZvciBib3VuZGFyeSBjaGVja2luZyBhZ2FpbiAqLworICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9CbG9jaykoY2FuZCwgY3VyLCBkbWluLCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworCisgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICppbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgKmptaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoZCA9PSBkbWluKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIFBWX0FCUyhpc3RhcnQgLSBpKSArIFBWX0FCUyhqc3RhcnQgLSBqKSA8IFBWX0FCUyhpc3RhcnQgLSAqaW1pbikgKyBQVl9BQlMoanN0YXJ0IC0gKmptaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICppbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgKmptaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGwgPCAoayA8PCAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgY2FuZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8IChrIDw8IDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBjYW5kICs9IGx4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8ICgoayA8PCAyKSArIChrIDw8IDEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgY2FuZC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgICAgICBjYW5kIC09IGx4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRtaW47Cit9CisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBDYW5kaWRhdGVTZWxlY3Rpb24KKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgRmlsbCB1cCB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgdXNpbmcgc3BhdGlvLXRlbXBvcmFsIGNvcnJlbGF0aW9uCisgICAgICAgICAgICAgICAgYW1vbmcgbmVpZ2hib3JpbmcgYmxvY2tzLgorICAgIElucHV0L091dHB1dDogICB0eXBlX3ByZWQgPSAwOiBmaXJzdCBwYXNzLCAxOiBzZWNvbmQgcGFzcywgb3Igbm8gU0NECisgICAgTW9kaWZpZWQ6ICAgIDA5LzIzLzAxLCBnZXQgcmlkIG9mIHJlZHVuZGFudCBjYW5kaWRhdGVzIGJlZm9yZSBwYXNzaW5nIGJhY2suCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBDYW5kaWRhdGVTZWxlY3Rpb24oSW50ICptdngsIEludCAqbXZ5LCBJbnQgKm51bV9jYW4sIEludCBpbWIsIEludCBqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgdHlwZV9wcmVkKQoreworICAgIE1PVCAqKm1vdCA9IHZpZGVvLT5tb3Q7CisgICAgTU9UICpwbW90OworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEludCBtYndpZHRoID0gY3VyclZvbC0+bk1CUGVyUm93OworICAgIEludCBtYmhlaWdodCA9IGN1cnJWb2wtPm5NQlBlckNvbDsKKyAgICBJbnQgaSwgaiwgc2FtZSwgbnVtMTsKKworICAgICpudW1fY2FuID0gMDsKKworICAgIGlmICh2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgeworICAgICAgICAvKiBTcGF0aW8tVGVtcG9yYWwgQ2FuZGlkYXRlIChmaXZlIGNhbmRpZGF0ZXMpICovCisgICAgICAgIGlmICh0eXBlX3ByZWQgPT0gMCkgLyogZmlyc3QgcGFzcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bV1bMF07IC8qIHNhbWUgY29vcmRpbmF0ZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgaWYgKGltYiA+PSAobWJ3aWR0aCA+PiAxKSAmJiBpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGltYiArIDEgPCBtYndpZHRoKSAgIC8qcmlnaHQgbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bSsxXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bSttYndpZHRoXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoam1iID4gMCkgICAvKnVwcGVyIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aF1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGltYiA+IDAgJiYgam1iID4gMCkgIC8qIHVwcGVyLWxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aC0xXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyogdXBwZXIgcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aCsxXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgICAgLyogc2Vjb25kIHBhc3MgKi8KKyAgICAgICAgICAgIC8qIG9yaWdpbmFsIFNUMSBhbGdvcml0aG0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW1dWzBdOyAvKiBzYW1lIGNvb3JkaW5hdGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKworICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLTFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpICAvKnJpZ2h0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0rMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPCBtYmhlaWdodCAtIDEpICAvKmJvdHRvbSBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtK21id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLyogb25seSBTcGF0aWFsIENhbmRpZGF0ZSAoZm91ciBjYW5kaWRhdGVzKSovCisgICAgeworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qZmlyc3QgcGFzcyovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbWIgPiAxKSAgLyogbmVpZ2hib3IgdHdvIGJsb2NrcyBhd2F5IHRvIHRoZSBsZWZ0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tMl1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbWIgPiAwICYmIGptYiA+IDApICAvKiB1cHBlci1sZWZ0IG5laWdoYm9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aC0xXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyogdXBwZXIgcmlnaHQgbmVpZ2hib3IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS1tYndpZHRoKzFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2lmZGVmIFNDRU5FX0NIQU5HRV9ERVRFQ1RJT04KKyAgICAgICAgLyogc2Vjb25kIHBhc3MgKFNUMiBhbGdvcml0aG0pKi8KKyAgICAgICAgZWxzZSBpZiAodHlwZV9wcmVkID09IDEpIC8qIDQvNy8wMSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlciBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aF1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgIC8qcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtKzFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtK21id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2Vsc2UKKyAgICAgICAgZWxzZSAvKiBvcmlnaW5hbCBTVDEgYWxnb3JpdGhtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS0xXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworCisgICAgICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyLWxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aC0xXVswXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyp1cHBlci1yaWdodCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS1tYndpZHRoKzFdWzBdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2VuZGlmCisgICAgfQorCisgICAgLyogMy8yMy8wMSwgcmVtb3ZlIHJlZHVuZGFudCBjYW5kaWRhdGUgKHBvc3NpYmxlIGstbWVhbikgKi8KKyAgICBudW0xID0gKm51bV9jYW47CisgICAgKm51bV9jYW4gPSAxOworICAgIGZvciAoaSA9IDE7IGkgPCBudW0xOyBpKyspCisgICAgeworICAgICAgICBzYW1lID0gMDsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICghc2FtZSAmJiBqIDwgKm51bV9jYW4pCisgICAgICAgIHsKKyNpZiAoQ0FORElEQVRFX0RJU1RBTkNFPT0wKQorICAgICAgICAgICAgaWYgKG12eFtpXSA9PSBtdnhbal0gJiYgbXZ5W2ldID09IG12eVtqXSkKKyNlbHNlCisgICAgICAgICAgICAvLyBtb2RpZmllZCBrLW1lYW4sIDMvMjQvMDEsIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gMworICAgICAgICAgICAgaWYgKFBWX0FCUyhtdnhbaV0gLSBtdnhbal0pICsgUFZfQUJTKG12eVtpXSAtIG12eVtqXSkgPCBDQU5ESURBVEVfRElTVEFOQ0UpCisjZW5kaWYKKyAgICAgICAgICAgICAgICBzYW1lID0gMTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12eFsqbnVtX2Nhbl0gPSBtdnhbaV07CisgICAgICAgICAgICBtdnlbKm51bV9jYW5dID0gbXZ5W2ldOworICAgICAgICAgICAgKCpudW1fY2FuKSsrOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgX1NBRF9TVEFUCisgICAgbnVtX2NhbmQgKz0gKCpudW1fY2FuKTsKKyNlbmRpZgorCisgICAgaWYgKG51bTEgPT0gNSAmJiAqbnVtX2NhbiA9PSAxKQorICAgICAgICAqbnVtX2NhbiA9IEFMTF9DQU5EX0VRVUFMOyAvKiBhbGwgYXJlIGVxdWFsICovCisKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFJhc3RlckludHJhVXBkYXRlCisgICAgRGF0ZTogICAgICAgMi8yNi8wMQorICAgIFB1cnBvc2U6ICAgIFRvIHJhc3Rlci1zY2FuIGFzc2lnbiBJTlRSQS11cGRhdGUgLgorICAgICAgICAgICAgICAgIE4gbWFjcm9ibG9ja3MgYXJlIHVwZGF0ZWQgKGFsc28gd2FzIHByb2dyYW1tYWJsZSkuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBSYXN0ZXJJbnRyYVVwZGF0ZShVQ2hhciAqaW50cmFBcnJheSwgVUNoYXIgKk1vZGUsIEludCB0b3RhbE1CLCBJbnQgbnVtUmVmcmVzaCkKK3sKKyAgICBJbnQgaW5keCwgaTsKKworICAgIC8qIGZpbmQgdGhlIGxhc3QgcmVmcmVzaCBNQiAqLworICAgIGluZHggPSAwOworICAgIHdoaWxlIChpbnRyYUFycmF5W2luZHhdID09IDEgJiYgaW5keCA8IHRvdGFsTUIpCisgICAgICAgIGluZHgrKzsKKworICAgIC8qIGFkZCBtb3JlICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWZyZXNoICYmIGluZHggPCB0b3RhbE1COyBpKyspCisgICAgeworICAgICAgICBNb2RlW2luZHhdID0gTU9ERV9JTlRSQTsKKyAgICAgICAgaW50cmFBcnJheVtpbmR4KytdID0gMTsKKyAgICB9CisKKyAgICAvKiBpZiByZWFkIHRoZSBlbmQgb2YgZnJhbWUsIHJlc2V0IGFuZCBsb29wIGFyb3VuZCAqLworICAgIGlmIChpbmR4ID49IHRvdGFsTUIgLSAxKQorICAgIHsKKyAgICAgICAgUmVzZXRJbnRyYVVwZGF0ZShpbnRyYUFycmF5LCB0b3RhbE1CKTsKKyAgICAgICAgaW5keCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbnVtUmVmcmVzaCAmJiBpbmR4IDwgdG90YWxNQikKKyAgICAgICAgeworICAgICAgICAgICAgaW50cmFBcnJheVtpbmR4XSA9IDE7CisgICAgICAgICAgICBNb2RlW2luZHgrK10gPSBNT0RFX0lOVFJBOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBSZXNldEludHJhVXBkYXRlCisgICAgRGF0ZTogICAgICAgMTEvMjgvMDAKKyAgICBQdXJwb3NlOiAgICBSZXNldCBhbHJlYWR5IGludHJhIHVwZGF0ZWQgZmxhZ3MgdG8gYWxsIHplcm8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgUmVzZXRJbnRyYVVwZGF0ZShVQ2hhciAqaW50cmFBcnJheSwgSW50IHRvdGFsTUIpCit7CisgICAgTTRWRU5DX01FTVNFVChpbnRyYUFycmF5LCAwLCBzaXplb2YoVUNoYXIpKnRvdGFsTUIpOworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgUmVzZXRJbnRyYVVwZGF0ZVJlZ2lvbgorICAgIERhdGU6ICAgICAgIDEyLzEvMDAKKyAgICBQdXJwb3NlOiAgICBSZXNldCBhbHJlYWR5IGludHJhIHVwZGF0ZWQgZmxhZ3MgaW4gb25lIHJlZ2lvbiB0byBhbGwgemVybworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUmVzZXRJbnRyYVVwZGF0ZVJlZ2lvbihVQ2hhciAqaW50cmFBcnJheSwgSW50IHN0YXJ0X2ksIEludCByd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IHN0YXJ0X2osIEludCByaGVpZ2h0LCBJbnQgbWJ3aWR0aCwgSW50IG1iaGVpZ2h0KQoreworICAgIEludCBpbmR4LCBqOworCisgICAgaWYgKHN0YXJ0X2kgKyByd2lkdGggPj0gbWJ3aWR0aCkKKyAgICAgICAgcndpZHRoID0gbWJ3aWR0aCAtIHN0YXJ0X2k7CisgICAgaWYgKHN0YXJ0X2ogKyByaGVpZ2h0ID49IG1iaGVpZ2h0KQorICAgICAgICByaGVpZ2h0ID0gbWJoZWlnaHQgLSBzdGFydF9qOworCisgICAgZm9yIChqID0gc3RhcnRfajsgaiA8IHN0YXJ0X2ogKyByaGVpZ2h0OyBqKyspCisgICAgeworICAgICAgICBpbmR4ID0gaiAqIG1id2lkdGg7CisgICAgICAgIE00VkVOQ19NRU1TRVQoaW50cmFBcnJheSArIGluZHggKyBzdGFydF9pLCAwLCBzaXplb2YoVUNoYXIpKnJ3aWR0aCk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGdW5jdGlvbjogICBNb3ZlTmVpZ2hib3JTQUQKKyAgICBEYXRlOiAgICAgICAzLzI3LzAxCisgICAgUHVycG9zZTogICAgTW92ZSBuZWlnaGJvcmluZyBTQUQgYXJvdW5kIHdoZW4gY2VudGVyIGhhcyBzaGlmdGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vdmVOZWlnaGJvclNBRChJbnQgZG5bXSwgSW50IG5ld19sb2MpCit7CisgICAgSW50IHRtcFs5XTsKKyAgICB0bXBbMF0gPSBkblswXTsKKyAgICB0bXBbMV0gPSBkblsxXTsKKyAgICB0bXBbMl0gPSBkblsyXTsKKyAgICB0bXBbM10gPSBkblszXTsKKyAgICB0bXBbNF0gPSBkbls0XTsKKyAgICB0bXBbNV0gPSBkbls1XTsKKyAgICB0bXBbNl0gPSBkbls2XTsKKyAgICB0bXBbN10gPSBkbls3XTsKKyAgICB0bXBbOF0gPSBkbls4XTsKKyAgICBkblswXSA9IGRuWzFdID0gZG5bMl0gPSBkblszXSA9IGRuWzRdID0gZG5bNV0gPSBkbls2XSA9IGRuWzddID0gZG5bOF0gPSA2NTUzNjsKKworICAgIHN3aXRjaCAobmV3X2xvYykKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBkbls0XSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbOF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZG5bNF0gPSB0bXBbM107CisgICAgICAgICAgICBkbls1XSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bN10gPSB0bXBbOF07CisgICAgICAgICAgICBkbls4XSA9IHRtcFsxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBkbls2XSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzBdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbMl07CisgICAgICAgICAgICBkblsyXSA9IHRtcFszXTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzVdOworICAgICAgICAgICAgZG5bN10gPSB0bXBbNl07CisgICAgICAgICAgICBkbls4XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBkblsxXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbNl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbOF07CisgICAgICAgICAgICBkblsyXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzNdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bNF0gPSB0bXBbNV07CisgICAgICAgICAgICBkbls4XSA9IHRtcFs3XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBkblsyXSA9IHRtcFs4XTsKKyAgICAgICAgICAgIGRuWzNdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNF0gPSB0bXBbNl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgZG5bMl0gPSB0bXBbMV07CisgICAgICAgICAgICBkblszXSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbNl07CisgICAgICAgICAgICBkbls2XSA9IHRtcFs3XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkblswXSA9IHRtcFtuZXdfbG9jXTsKKworICAgIHJldHVybiA7Cit9CisKKy8qIDMvMjgvMDEsIGZpbmQgbWluaW1hbCBvZiBkbls5XSAqLworCitJbnQgRmluZE1pbihJbnQgZG5bXSkKK3sKKyAgICBJbnQgbWluLCBpOworICAgIEludCBkbWluOworCisgICAgZG1pbiA9IGRuWzFdOworICAgIG1pbiA9IDE7CisgICAgZm9yIChpID0gMjsgaSA8IDk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkbltpXSA8IGRtaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRtaW4gPSBkbltpXTsKKyAgICAgICAgICAgIG1pbiA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWluOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVhM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9QVkRFQ0RFRl9IXworI2RlZmluZSBfUFZERUNERUZfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPiAvLyBmb3IgdWludDhfdCwgZXRjCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFJlZGVmaW5lIHRoZSBpbnQgdHlwZXMKK3R5cGVkZWYgdWludDhfdCB1aW50ODsKK3R5cGVkZWYgdWludDE2X3QgdWludDE2OwordHlwZWRlZiBpbnQxNl90IGludDE2OwordHlwZWRlZiB1aW50MzJfdCB1aW50MzI7Cit0eXBlZGVmIGludDMyX3QgaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OworCisvKioqKioqKioqKiBwbGF0Zm9ybSBkZXBlbmRlbnQgaW4tbGluZSBhc3NlbWJseSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKiBJbnRlbCAqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKiBBUk0gKioqKioqKioqKioqKioqKiovCisvKiBmb3IgZ2VuZXJhbCBBUk0gaW5zdHJ1Y3Rpb24uICNkZWZpbmUgX19BUk0gaGFzIHRvIGJlIGRlZmluZWQgaW4gY29tcGlsZXIgc2V0IHVwLiovCisvKiBmb3IgRFNQIE1VTCAqLworI2lmZGVmIF9fVEFSR0VUX0ZFQVRVUkVfRFNQTVVMCisjZGVmaW5lIF9BUk1fRFNQX01VTAorI2VuZGlmCisKKy8qIGZvciBDb3VudCBMZWFkaW5nIFplcm8gaW5zdHJ1Y3Rpb24gKi8KKyNpZmRlZiBfX1RBUkdFVF9BUkNIXzVUCisjZGVmaW5lIF9BUk1fQ0xaCisjZW5kaWYKKyNpZmRlZiBfX1RBUkdFVF9BUkNIXzVURQorI2RlZmluZSBfQVJNX0NMWgorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUFZfVFlQRVNfCisjZGVmaW5lIF9QVl9UWVBFU18KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVQ2hhcjsKK3R5cGVkZWYgY2hhciBDaGFyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDsKK3R5cGVkZWYgaW50IEludDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNob3J0OwordHlwZWRlZiBzaG9ydCBTaG9ydDsKK3R5cGVkZWYgc2hvcnQgaW50IFNJbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxvbmc7Cit0eXBlZGVmIHZvaWQgVm9pZDsKKworI2RlZmluZSBQVl9DT0RFQ19JTklUICAgICAgIDAKKyNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgICAgICAxCisjZGVmaW5lIFBWX0NPREVDX1JVTk5JTkcgICAgMgorI2RlZmluZSBQVl9DT0RFQ19SRVNFVCAgICAgIDMKKyNlbmRpZgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBQVl9TVUNDRVNTLAorICAgIFBWX0ZBSUwsCisgICAgUFZfRU9TLCAgICAgICAgICAgICAvKiBoaXQgRW5kX09mX1NlcXVlbmNlICAgICAqLworICAgIFBWX01CX1NUVUZGSU5HLCAgICAgLyogaGl0IE1hY3JvYmxvY2tfU3R1ZmZpbmcgKi8KKyAgICBQVl9FTkRfT0ZfVk9QLCAgICAgIC8qIGhpdCBFbmRfb2ZfVmlkZW9fT2JqZWN0X1BsYW5lICovCisgICAgUFZfRU5EX09GX01CLCAgICAgICAvKiBoaXQgRW5kX29mX01hY3JvYmxvY2sgKi8KKyAgICBQVl9FTkRfT0ZfQlVGICAgICAgIC8qIGhpdCBFbmRfb2ZfQml0c3RyZWFtX0J1ZmZlciAqLworfSBQVl9TVEFUVVM7CisKK3R5cGVkZWYgVUNoYXIgUElYRUw7CisvL3R5cGVkZWYgSW50IE1PVDsgICAvKiA6ICJpbnQiIHR5cGUgcnVucyBmYXN0ZXIgb24gUklTQyBtYWNoaW5lICovCisKKyNkZWZpbmUgSFRGTSAgICAgICAgICAgIC8qICAzLzIvMDEsIEh5cG90aGVzaXMgVGVzdCBGYXN0IE1hdGNoaW5nIGZvciBlYXJseSBkcm9wLW91dCovCisvLyNkZWZpbmUgX01PVkVfSU5URVJGQUNFCisKKy8vI2RlZmluZSBSQU5ET01fUkVGU0VMQ09ERQorCisvKiBoYW5kbGUgdGhlIGNhc2Ugb2YgZGV2aXNpb24gYnkgemVybyBpbiBSQyAqLworI2RlZmluZSBNQURfTUlOIDEKKworLyogNC8xMS8wMSwgaWYgU1NFIG9yIE1NWCwgbm8gSFRGTSwgbm8gU0FEX0hQX0ZMWSAqLworCisvKiBDb2RlIHNpemUgcmVkdWN0aW9uIHJlbGF0ZWQgTWFjcm9zICovCisjaWZkZWYgSDI2M19PTkxZCisjaWZuZGVmIE5PX1JWTEMKKyNkZWZpbmUgTk9fUlZMQworI2VuZGlmCisjaWZuZGVmIE5PX01QRUdfUVVBTlQKKyNkZWZpbmUgTk9fTVBFR19RVUFOVAorI2VuZGlmCisjaWZuZGVmIE5PX0lOVEVSNFYKKyNkZWZpbmUgTk9fSU5URVI0VgorI2VuZGlmCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgIDEKKyNkZWZpbmUgRkFMU0UgICAwCisKKyNkZWZpbmUgUFZfQUJTKHgpICAgICAgICgoKHgpPDApPyAtKHgpIDogKHgpKQorI2RlZmluZSBQVl9TSUdOKHgpICAgICAgKCgoeCk8MCk/IC0xIDogMSkKKyNkZWZpbmUgUFZfU0lHTjAoYSkgICAgICgoKGEpPDApPyAtMSA6ICgoKGEpPjApID8gMSA6IDApKQorI2RlZmluZSBQVl9NQVgoYSxiKSAgICAgKChhKT4oYik/IChhKTooYikpCisjZGVmaW5lIFBWX01JTihhLGIpICAgICAoKGEpPChiKT8gKGEpOihiKSkKKworI2RlZmluZSBNT0RFX0lOVFJBICAgICAgMAorI2RlZmluZSBNT0RFX0lOVEVSICAgICAgMQorI2RlZmluZSBNT0RFX0lOVFJBX1EgICAgMgorI2RlZmluZSBNT0RFX0lOVEVSX1EgICAgMworI2RlZmluZSBNT0RFX0lOVEVSNFYgICAgNAorI2RlZmluZSBNT0RFX1NLSVBQRUQgICAgNgorCisjZGVmaW5lIElfVk9QICAgICAgIDAKKyNkZWZpbmUgUF9WT1AgICAgICAgMQorI2RlZmluZSBCX1ZPUCAgICAgICAyCisKKy8qMDkvMDQvMDAgQWRkIE1CIGhlaWdodCBhbmQgd2lkdGggKi8KKyNkZWZpbmUgTUJfV0lEVEggMTYKKyNkZWZpbmUgTUJfSEVJR0hUIDE2CisKKyNkZWZpbmUgVk9QX0JSSUdIVF9XSElURUVOQyAyNTUKKworCisjZGVmaW5lIExVTUlOQU5DRV9EQ19UWVBFICAgMQorI2RlZmluZSBDSFJPTUlOQU5DRV9EQ19UWVBFIDIKKworI2RlZmluZSBFT0JfQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRU9CX0NPREVfTEVOR1RIICAgICAgICAgICAgICAgIDMyCisKKy8qIDExLzMwLzk4ICovCisjZGVmaW5lIEZvdW5kUk0gICAgIDEgICAvKiBSZXN5bmMgTWFya2VyICovCisjZGVmaW5lIEZvdW5kVlNDICAgIDIgICAvKiBWT1BfU1RBUlRfQ09ERS4gKi8KKyNkZWZpbmUgRm91bmRHU0MgICAgMyAgIC8qIEdST1VQX1NUQVJUX0NPREUgKi8KKyNkZWZpbmUgRm91bmRFT0IgICAgNCAgIC8qIEVPQl9DT0RFICovCisKKworLyogMDUvMDgvMjAwMCwgdGhlIGVycm9yIGNvZGUgcmV0dXJuZWQgZnJvbSBCaXRzdHJlYW1TaG93Qml0cygpICovCisjZGVmaW5lIEJJVFNUUkVBTV9FUlJPUl9DT0RFIDB4RkZGRkZGRkYKKworLyogUGFja2V0VmlkZW8gImFic29sdXRpb24gdGltZXN0YW1wIiBvYmplY3QuICAwNi8xMy8yMDAwICovCisjZGVmaW5lIFBWVFNfU1RBUlRfQ09ERSAgICAgICAgIDB4MDFDNAorI2RlZmluZSBQVlRTX1NUQVJUX0NPREVfTEVOR1RIICAzMgorCisvKiBzZXNzaW9uIGxheWVyIGFuZCB2b3AgbGF5ZXIgc3RhcnQgY29kZXMgKi8KKworI2RlZmluZSBTRVNTSU9OX1NUQVJUX0NPREUgIDB4MDFCMAorI2RlZmluZSBTRVNTSU9OX0VORF9DT0RFICAgIDB4MDFCMQorI2RlZmluZSBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUgMHgwMUI1CisKKyNkZWZpbmUgVk9fU1RBUlRfQ09ERSAgICAgICAgICAgMHg4CisjZGVmaW5lIFZPX0hFQURFUl9MRU5HVEggICAgICAgIDMyICAgICAgLyogbGVuZ3RobyBvZiBWTyBoZWFkZXI6IFZPX1NUQVJUX0NPREUgKyAgVk9fSUQgKi8KKworI2RlZmluZSBTT0xfU1RBUlRfQ09ERSAgICAgICAgICAweDAxQkUKKyNkZWZpbmUgU09MX1NUQVJUX0NPREVfTEVOR1RIICAgMzIKKworI2RlZmluZSBWT0xfU1RBUlRfQ09ERSAweDEyCisjZGVmaW5lIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCAyOAorCisjZGVmaW5lIFZPUF9TVEFSVF9DT0RFIDB4MUI2CisjZGVmaW5lIFZPUF9TVEFSVF9DT0RFX0xFTkdUSCAgIDMyCisKKyNkZWZpbmUgR1JPVVBfU1RBUlRfQ09ERSAgICAweDAxQjMKKyNkZWZpbmUgR1JPVVBfU1RBUlRfQ09ERV9MRU5HVEggIDMyCisKKyNkZWZpbmUgVk9QX0lEX0NPREVfTEVOR1RIICAgICAgNQorI2RlZmluZSBWT1BfVEVNUF9SRUZfQ09ERV9MRU5HVEggICAgMTYKKworI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRfQ09ERSAgICAgICAgMHgwMUIyCisjZGVmaW5lIFVTRVJfREFUQV9TVEFSVF9DT0RFX0xFTkdUSCAzMgorCisjZGVmaW5lIFNUQVJUX0NPREVfUFJFRklYICAgICAgIDB4MDEKKyNkZWZpbmUgU1RBUlRfQ09ERV9QUkVGSVhfTEVOR1RIICAgIDI0CisKKyNkZWZpbmUgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSICAgICAgICAgMHgyMAorI2RlZmluZSBTSE9SVF9WSURFT19TVEFSVF9NQVJLRVJfTEVOR1RIICAyMgorI2RlZmluZSBTSE9SVF9WSURFT19FTkRfTUFSS0VSICAgICAgICAgICAgMHgzRgorI2RlZmluZSBHT0JfUkVTWU5DX01BUktFUiAgICAgICAgIDB4MDEKKyNkZWZpbmUgR09CX1JFU1lOQ19NQVJLRVJfTEVOR1RIICAxNworCisvKiBtb3Rpb24gYW5kIHJlc3luYyBtYXJrZXJzIHVzZWQgaW4gZXJyb3IgcmVzaWxpZW50IG1vZGUgICovCisKKyNkZWZpbmUgRENfTUFSS0VSICAgICAgICAgICAgICAgICAgICAgIDQzODI3MworI2RlZmluZSBEQ19NQVJLRVJfTEVOR1RIICAgICAgICAgICAgICAgIDE5CisKKyNkZWZpbmUgTU9USU9OX01BUktFUl9DT01CICAgICAgICAgICAgIDEyNjk3NworI2RlZmluZSBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RIICAgICAgIDE3CisKKyNkZWZpbmUgTU9USU9OX01BUktFUl9TRVAgICAgICAgICAgICAgIDgxOTIxCisjZGVmaW5lIE1PVElPTl9NQVJLRVJfU0VQX0xFTkdUSCAgICAgICAgMTcKKworI2RlZmluZSBSRVNZTkNfTUFSS0VSICAgICAgICAgICAxCisjZGVmaW5lIFJFU1lOQ19NQVJLRVJfTEVOR1RIICAgIDE3CisKKyNkZWZpbmUgU1BSSVRFX05PVF9VU0VEICAgICAwCisjZGVmaW5lIFNUQVRJQ19TUFJJVEUgICAgICAgMQorI2RlZmluZSBPTkxJTkVfU1BSSVRFICAgICAgIDIKKyNkZWZpbmUgR01DX1NQUklURSAgICAgIDMKKworLyogbWFjcm9ibG9jayBhbmQgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNQl9TSVpFIDE2CisjZGVmaW5lIE5DT0VGRl9NQiAoTUJfU0laRSpNQl9TSVpFKQorI2RlZmluZSBCX1NJWkUgOAorI2RlZmluZSBOQ09FRkZfQkxPQ0sgKEJfU0laRSpCX1NJWkUpCisjZGVmaW5lIE5DT0VGRl9ZIE5DT0VGRl9NQgorI2RlZmluZSBOQ09FRkZfVSBOQ09FRkZfQkxPQ0sKKyNkZWZpbmUgTkNPRUZGX1YgTkNPRUZGX0JMT0NLCisKKy8qIG92ZXJydW4gYnVmZmVyIHNpemUgICovCisjZGVmaW5lIERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRSAxMDAwCisKKworLyogVkxDIGRlY29kaW5nIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVkxDX0VSUk9SICAgKC0xKQorI2RlZmluZSBWTENfRVNDQVBFICA3MTY3CisKKyNlbmRpZiAvKiBfUFZERUNERUZfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2ZTNkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCkBAIC0wLDAgKzEsMzI3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW1faW8uaCIKKyNpbmNsdWRlICJyYXRlX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCisKKy8qIEludmVyc2Ugbm9ybWFsIHppZ3phZyAqLworY29uc3Qgc3RhdGljIEludCB6aWd6YWdfaVtOQ09FRkZfQkxPQ0tdID0KK3sKKyAgICAwLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsCisgICAgMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgNCwgNSwKKyAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgICAgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwKKyAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgICAgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAorICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKKyAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKKy8qIElOVFJBICovCitjb25zdCBzdGF0aWMgSW50IG1wZWdfaXFtYXRfZGVmW05DT0VGRl9CTE9DS10gPQorICAgIHsgIDgsIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LAorICAgICAgIDE3LCAxOCwgMTksIDIxLCAyMywgMjUsIDI3LCAyOCwKKyAgICAgICAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsCisgICAgICAgMjEsIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLAorICAgICAgIDIyLCAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwKKyAgICAgICAyMywgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsCisgICAgICAgMjUsIDI2LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLAorICAgICAgIDI3LCAyOCwgMzAsIDMyLCAzNSwgMzgsIDQxLCA0NQorICAgIH07CisKKy8qIElOVEVSICovCitjb25zdCBzdGF0aWMgSW50IG1wZWdfbnFtYXRfZGVmWzY0XSAgPQorICAgIHsgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLAorICAgICAgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorICAgICAgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI3LAorICAgICAgMjAsIDIxLCAyMiwgMjMsIDI1LCAyNiwgMjcsIDI4LAorICAgICAgMjEsIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLAorICAgICAgMjIsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMzAsIDMxLAorICAgICAgMjMsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzEsIDMzCisgICAgfTsKKworLyogUHJvZmlsZXMgYW5kIGxldmVscyAqLworLyogU2ltcGxlIHByb2ZpbGUobGV2ZWwgMC0zKSBhbmQgQ29yZSBwcm9maWxlIChsZXZlbCAxLTIpICovCisvKiB7U1BMMCwgU1BMMSwgU1BMMiwgU1BMMywgQ1BMMSwgQ1BMMiwgQ1BMMiwgQ1BMMn0gLCBTUEwwOiBTaW1wbGUgUHJvZmlsZUBMZXZlbDAsIENQTDE6IENvcmUgUHJvZmlsZUBMZXZlbDEsIHRoZSBsYXN0IHR3byBhcmUgcmVkdW5kYW50IGZvciBlYXN5IHRhYmxlIG1hbmlwdWxhdGlvbiAqLworY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX2NvZGVbOF0gPQoreworICAgIDB4MDgsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MjEsIDB4MjIsIDB4MjIsIDB4MjIKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVs4XSA9Cit7CisgICAgNjQwMDAsIDY0MDAwLCAxMjgwMDAsIDM4NDAwMCwgMzg0MDAwLCAyMDAwMDAwLCAyMDAwMDAwLCAyMDAwMDAwCit9OworCitjb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplWzhdID0KK3sKKyAgICAyMDQ4LCAyMDQ4LCA0MDk2LCA4MTkyLCA0MDk2LCA4MTkyLCA4MTkyLCA4MTkyCit9OworCitjb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1s4XSA9Cit7CisgICAgMTQ4NSwgMTQ4NSwgNTk0MCwgMTE4ODAsIDU5NDAsIDIzNzYwLCAyMzc2MCwgMjM3NjAKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbOF0gPQoreworICAgIDE2Mzg0MCwgMTYzODQwLCA2NTUzNjAsIDY1NTM2MCwgMjYyMTQ0LCAxMzEwNzIwLCAxMzEwNzIwLCAxMzEwNzIwCit9OworCisKKy8qIFNpbXBsZSBzY2FsYWJsZSBwcm9maWxlIChsZXZlbCAwLTIpIGFuZCBDb3JlIHNjYWxhYmxlIHByb2ZpbGUgKGxldmVsIDEtMykgKi8KKy8qIHtTU1BMMCwgU1NQTDEsIFNTUEwyLCBTU1BMMiwgQ1NQTDEsIENTUEwyLCBDU1BMMywgQ1NQTDN9ICwgU1NQTDA6IFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlQExldmVsMCwgQ1NQTDE6IENvcmUgU2NhbGFibGUgUHJvZmlsZUBMZXZlbDEsIHRoZSBmb3VydGggaXMgcmVkdW5kYW50IGZvciBlYXN5IHRhYmxlIG1hbmlwdWxhdGlvbiAqLworCitjb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfY29kZVs4XSA9Cit7CisgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMiwgMHhBMSwgMHhBMiwgMHhBMywgMHhBMworfTsKKworY29uc3Qgc3RhdGljIEludCBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzhdID0KK3sKKyAgICAxMjgwMDAsIDEyODAwMCwgMjU2MDAwLCAyNTYwMDAsIDc2ODAwMCwgMTUwMDAwMCwgNDAwMDAwMCwgNDAwMDAwMAorfTsKKworLyogaW4gYml0cyAqLworY29uc3Qgc3RhdGljIEludCBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVs4XSA9Cit7CisgICAgMjA0OCwgMjA0OCwgNDA5NiwgNDA5NiwgNDA5NiwgNDA5NiwgMTYzODQsIDE2Mzg0Cit9OworCitjb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1s4XSA9Cit7CisgICAgMTQ4NSwgNzQyNSwgMjM3NjAsIDIzNzYwLCAxNDg1MCwgMjk3MDAsIDEyMDk2MCwgMTIwOTYwCit9OworCitjb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzhdID0KK3sKKyAgICAxNjM4NDAsIDY1NTM2MCwgNjU1MzYwLCA2NTUzNjAsIDEwNDg1NzYsIDEzMTA3MjAsIDEzMTA3MjAsIDEzMTA3MjAKK307CisKKworLyogSDI2MyBwcm9maWxlIDAgQCBsZXZlbCAxMC03MCAqLworY29uc3Qgc3RhdGljIEludCAgIGgyNjNMZXZlbFs4XSA9IHswLCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MH07Citjb25zdCBzdGF0aWMgZmxvYXQgckJSX2JvdW5kWzhdID0gezAsIDEsIDIsIDYsIDMyLCA2NCwgMTI4LCAyNTZ9OworY29uc3Qgc3RhdGljIGZsb2F0IG1heF9oMjYzX2ZyYW1lcmF0ZVsyXSA9IHsoZmxvYXQpMzAwMDAgLyAoZmxvYXQpMjAwMiwKKyAgICAgICAgKGZsb2F0KTMwMDAwIC8gKGZsb2F0KTEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY29uc3Qgc3RhdGljIEludCAgIG1heF9oMjYzX3dpZHRoWzJdICA9IHsxNzYsIDM1Mn07Citjb25zdCBzdGF0aWMgSW50ICAgbWF4X2gyNjNfaGVpZ2h0WzJdID0gezE0NCwgMjg4fTsKKworLyogNi8yLzIwMDEsIG5ld2x5IGFkZGVkIGZ1bmN0aW9ucyB0byBtYWtlIFBWRW5jb2RlVm9wIG1vcmUgcmVhZGFibGUuICovCitJbnQgRGV0ZXJtaW5lQ29kaW5nTGF5ZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50ICpuTGF5ZXIsIFVMb25nIG1vZFRpbWUpOwordm9pZCBEZXRlcm1pbmVWb3BUeXBlKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpOworSW50IFVwZGF0ZVNraXBOZXh0RnJhbWUoVmlkZW9FbmNEYXRhICp2aWRlbywgVUxvbmcgKm1vZFRpbWUsIEludCAqc2l6ZSwgUFZfU1RBVFVTIHN0YXR1cyk7CitCb29sIFNldFByb2ZpbGVfQnVmZmVyU2l6ZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBmbG9hdCBkZWxheSwgSW50IGJJbml0aWFsaXplZCk7CisKKyNpZmRlZiBQUklOVF9SQ19JTkZPCitleHRlcm4gRklMRSAqZmFjY3Q7CitleHRlcm4gaW50IHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkOworZXh0ZXJuIGludCBpU3R1ZmZCaXRzOworI2VuZGlmCisKKyNpZmRlZiBQUklOVF9FQworZXh0ZXJuIEZJTEUgKmZlYzsKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXREZWZhdWx0RW5jT3B0aW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMi8xMi8yMDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXREZWZhdWx0RW5jT3B0aW9uKFZpZGVvRW5jT3B0aW9ucyAqZW5jT3B0aW9uLCBJbnQgZW5jVXNlQ2FzZSkKK3sKKyAgICBWaWRlb0VuY09wdGlvbnMgZGVmYXVsdFVzZUNhc2UgPSB7SDI2M19NT0RFLCBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtTSU1QTEVfUFJPRklMRV9MRVZFTDBdID4+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTVBMRV9QUk9GSUxFX0xFVkVMMCwgUFZfT0ZGLCAwLCAxLCAxMDAwLCAzMywgezE0NCwgMTQ0fSwgezE3NiwgMTc2fSwgezE1LCAzMH0sIHs2NDAwMCwgMTI4MDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLCAxMH0sIHsxMiwgMTJ9LCB7MCwgMH0sIENCUl8xLCAwLjAsIFBWX09GRiwgLTEsIDAsIFBWX09GRiwgMTYsIFBWX09GRiwgMCwgUFZfT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgT1NDTF9VTlVTRURfQVJHKGVuY1VzZUNhc2UpOyAvLyB1bnVzZWQgZm9yIG5vdy4gTGF0ZXIgd2UgY2FuIGFkZCBtb3JlIGRlZmF1bHRzIHNldHRpbmcgYW5kIHVzZSB0aGlzCisgICAgLy8gYXJndW1lbnQgdG8gc2VsZWN0IHRoZSByaWdodCBvbmUuCisgICAgLyogaW4gdGhlIGZ1dHVyZSB3ZSBjYW4gY3JlYXRlIG1vcmUgbWVhbmluZ2Z1bCB1c2UtY2FzZXMgKi8KKyAgICBpZiAoZW5jT3B0aW9uID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgfQorCisgICAgTTRWRU5DX01FTUNQWShlbmNPcHRpb24sICZkZWZhdWx0VXNlQ2FzZSwgc2l6ZW9mKFZpZGVvRW5jT3B0aW9ucykpOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZJbml0VmlkZW9FbmNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEluaXRpYWxpemF0aW9uIG9mIE1QNCBFbmNvZGVyIGFuZCBWTyBiaXRzdHJlYW0gICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICA1LzIxLzAxLCBhbGxvY2F0ZSBvbmx5IHlDaGFuIGFuZCBhc3NpZ24gdUNoYW4gJiB2Q2hhbiAgICovCisvKiAgICAgICAgICAgICAgMTIvMTIvMDUsIGFkZCBlbmNvZGluZyBvcHRpb24gYXMgaW5wdXQgYXJndW1lbnQgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCAgICBQVkluaXRWaWRlb0VuY29kZXIoVmlkZW9FbmNDb250cm9scyAqZW5jb2RlckNvbnRyb2wsIFZpZGVvRW5jT3B0aW9ucyAqZW5jT3B0aW9uKQoreworCisgICAgQm9vbCAgICAgICAgc3RhdHVzID0gUFZfVFJVRTsKKyAgICBJbnQgICAgICAgICBuTGF5ZXJzLCBpZHgsIGksIGo7CisgICAgSW50ICAgICAgICAgbWF4ID0gMCwgbWF4X3dpZHRoID0gMCwgbWF4X2hlaWdodCA9IDAsIHBpdGNoLCBvZmZzZXQ7CisgICAgSW50ICAgICAgICAgc2l6ZSA9IDAsIG5Ub3RhbE1CID0gMDsKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvOworICAgIFZvbCAgICAgICAgICpwVm9sOworICAgIFZpZGVvRW5jUGFyYW1zICAqcEVuY1BhcmFtczsKKyAgICBJbnQgICAgICAgICB0ZW1wX3csIHRlbXBfaCwgbWJzUGVyU2VjOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgIHRoaXMgcGFydCB1c2UgdG8gYmUgUFZTZXRFbmNvZGUoKSAqLworICAgIEludCBwcm9maWxlX3RhYmxlX2luZGV4LCAqcHJvZmlsZV9sZXZlbF90YWJsZTsKKyAgICBJbnQgcHJvZmlsZV9sZXZlbCA9IGVuY09wdGlvbi0+cHJvZmlsZV9sZXZlbDsKKyAgICBJbnQgUGFja2V0U2l6ZSA9IGVuY09wdGlvbi0+cGFja2V0U2l6ZSA8PCAzOworICAgIEludCB0aW1lSW5jLCB0aW1lSW5jUmVzOworICAgIGZsb2F0IHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zOworCisgICAgaWYgKGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhKSAvKiB0aGlzIGhhcyBiZWVuIGNhbGxlZCAqLworICAgIHsKKyAgICAgICAgaWYgKGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0KSAvKiBjaGVjayBpZiBQVkluaXRWaWRlb0VuY29kZXIoKSBoYXMgYmVlbiBjYWxsZWQgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihlbmNvZGVyQ29udHJvbCk7CisgICAgICAgICAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBNNFZFTkNfRlJFRShlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YSk7CisgICAgICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhID0gTlVMTDsKKyAgICB9CisgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQgPSAwOyAgIC8qIHJlc2V0IHRoaXMgdmFsdWUgKi8KKworICAgIHZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFZpZGVvRW5jRGF0YSkpOyAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVuY0RhdGEgKi8KKworICAgIGlmICh2aWRlbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLCAwLCBzaXplb2YoVmlkZW9FbmNEYXRhKSk7CisKKyAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YSA9ICh2b2lkICopIHZpZGVvOyAgICAgICAgIC8qIHNldCB1cCBwb2ludGVyIGluIFZpZGVvRW5jRGF0YSBzdHJ1Y3R1cmUgKi8KKworICAgIHZpZGVvLT5lbmNQYXJhbXMgPSAoVmlkZW9FbmNQYXJhbXMgKilNNFZFTkNfTUFMTE9DKHNpemVvZihWaWRlb0VuY1BhcmFtcykpOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5lbmNQYXJhbXMsIDAsIHNpemVvZihWaWRlb0VuY1BhcmFtcykpOworCisgICAgZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBlbmNQYXJhbXMtPm5MYXllcnMgPSBlbmNPcHRpb24tPm51bUxheWVyczsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGlucHV0IHBhY2tldHNpemUgaXMgdmFsaWQgKE5vdGU6IHB1dCBjb2RlIGhlcmUgKGJlZm9yZSBhbnkgbWVtb3J5IGFsbG9jYXRpb24pIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrICovCisgICAgaWYgKChJbnQpcHJvZmlsZV9sZXZlbCA8IChJbnQpKFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMCkpICAvKiBub24tc2NhbGFibGUgcHJvZmlsZSAqLworICAgIHsKKyAgICAgICAgcHJvZmlsZV9sZXZlbF90YWJsZSA9IChJbnQgKilwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZTsKKyAgICAgICAgcHJvZmlsZV90YWJsZV9pbmRleCA9IChJbnQpcHJvZmlsZV9sZXZlbDsKKyAgICAgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllck1heE1ic1BlclNlY1swXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1twcm9maWxlX3RhYmxlX2luZGV4XTsKKworICAgIH0KKyAgICBlbHNlICAgLyogc2NhbGFibGUgcHJvZmlsZSAqLworICAgIHsKKyAgICAgICAgcHJvZmlsZV9sZXZlbF90YWJsZSA9IChJbnQgKilzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZTsKKyAgICAgICAgcHJvZmlsZV90YWJsZV9pbmRleCA9IChJbnQpcHJvZmlsZV9sZXZlbCAtIChJbnQpKFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMCk7CisgICAgICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgPCAyKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW1zLT5MYXllck1heE1ic1BlclNlY1tpXSA9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1twcm9maWxlX3RhYmxlX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogY2Fubm90IGhhdmUgemVybyBzaXplIHBhY2tldCB3aXRoIHRoZXNlIG1vZGVzICovCisgICAgaWYgKFBhY2tldFNpemUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY01vZGUgPT0gREFUQV9QQVJUSVRJT05JTkdfTU9ERSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNNb2RlID09IENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jTW9kZSA9IENPTUJJTkVfTU9ERV9OT19FUlJfUkVTOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuY09wdGlvbi0+Z29iSGVhZGVySW50ZXJ2YWwgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY01vZGUgPT0gSDI2M19NT0RFX1dJVEhfRVJSX1JFUykKKyAgICAgICAgeworICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNNb2RlID0gSDI2M19NT0RFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNPcHRpb24tPmVuY01vZGUgPSBTSE9SVF9IRUFERVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUGFja2V0U2l6ZSA+IHByb2ZpbGVfbGV2ZWxfdGFibGVbcHJvZmlsZV90YWJsZV9pbmRleF0pCisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBJbml0aWFsIERlZmF1bHRzIGZvciBhbGwgTW9kZXMgKi8KKworICAgIGVuY1BhcmFtcy0+U2VxdWVuY2VTdGFydENvZGUgPSAxOworICAgIGVuY1BhcmFtcy0+R09WX0VuYWJsZWQgPSAwOworICAgIGVuY1BhcmFtcy0+Um91bmRpbmdUeXBlID0gMDsKKyAgICBlbmNQYXJhbXMtPkludHJhRENWbGNUaHIgPSBQVl9NQVgoUFZfTUlOKGVuY09wdGlvbi0+aW50cmFEQ1ZsY1RoLCA3KSwgMCk7CisgICAgZW5jUGFyYW1zLT5BQ0RDUHJlZGljdGlvbiA9ICgoZW5jT3B0aW9uLT51c2VBQ1ByZWQgPT0gUFZfT04pID8gVFJVRSA6IEZBTFNFKTsKKyAgICBlbmNQYXJhbXMtPlJDX1R5cGUgPSBlbmNPcHRpb24tPnJjVHlwZTsKKyAgICBlbmNQYXJhbXMtPlJlZnJlc2ggPSBlbmNPcHRpb24tPm51bUludHJhTUI7CisgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMDsgLyogRW5hYmxlIFJlc3luYyBNYXJrZXIgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNPcHRpb24tPm51bUxheWVyczsgaSsrKQorICAgIHsKKyNpZmRlZiBOT19NUEVHX1FVQU5UCisgICAgICAgIGVuY1BhcmFtcy0+UXVhbnRUeXBlW2ldID0gMDsKKyNlbHNlCisgICAgICAgIGVuY1BhcmFtcy0+UXVhbnRUeXBlW2ldID0gZW5jT3B0aW9uLT5xdWFudFR5cGVbaV07ICAgICAgLyogSDI2MyAqLworI2VuZGlmCisgICAgICAgIGlmIChlbmNPcHRpb24tPnBRdWFudFtpXSA+PSAxICYmIGVuY09wdGlvbi0+cFF1YW50W2ldIDw9IDMxKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkluaXRRdWFudFB2b3BbaV0gPSBlbmNPcHRpb24tPnBRdWFudFtpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY09wdGlvbi0+aVF1YW50W2ldID49IDEgJiYgZW5jT3B0aW9uLT5pUXVhbnRbaV0gPD0gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtpXSA9IGVuY09wdGlvbi0+aVF1YW50W2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY1BhcmFtcy0+SGFsZlBlbF9FbmFibGVkID0gMTsKKyAgICBlbmNQYXJhbXMtPlNlYXJjaFJhbmdlID0gZW5jT3B0aW9uLT5zZWFyY2hSYW5nZTsgLyogNC8xNi8yMDAxICovCisgICAgZW5jUGFyYW1zLT5GdWxsU2VhcmNoX0VuYWJsZWQgPSAwOworI2lmZGVmIE5PX0lOVEVSNFYKKyAgICBlbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQgPSAwOworI2Vsc2UKKyAgICBlbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQgPSAwOy8vIGNvbW1lbnQgb3V0IGZvciBub3chISBlbmNPcHRpb24tPm12OHg4RW5hYmxlOworI2VuZGlmCisgICAgZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgPSAwOworICAgIGVuY1BhcmFtcy0+R09CX0hlYWRlcl9JbnRlcnZhbCA9IDA7IC8vIG5lZWQgdG8gYmUgcmVzZXQgdG8gMAorICAgIGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPSBlbmNPcHRpb24tPmludHJhUGVyaW9kOyAgICAvKiBJbnRyYSB1cGRhdGUgcGVyaW9kIHVwZGF0ZSBkZWZhdWx0Ki8KKyAgICBlbmNQYXJhbXMtPlNjZW5lQ2hhbmdlX0RldCA9IGVuY09wdGlvbi0+c2NlbmVEZXRlY3Q7CisgICAgZW5jUGFyYW1zLT5GaW5lRnJhbWVTa2lwX0VuYWJsZWQgPSAwOworICAgIGVuY1BhcmFtcy0+Tm9GcmFtZVNraXBfRW5hYmxlZCA9IGVuY09wdGlvbi0+bm9GcmFtZVNraXBwZWQ7CisgICAgZW5jUGFyYW1zLT5Ob1ByZVNraXBfRW5hYmxlZCA9IGVuY09wdGlvbi0+bm9GcmFtZVNraXBwZWQ7CisgICAgZW5jUGFyYW1zLT5HZXRWb2xIZWFkZXJbMF0gPSAwOworICAgIGVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyWzFdID0gMDsKKyAgICBlbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemUgPSBlbmNPcHRpb24tPnBhY2tldFNpemUgPDwgMzsKKyAgICBlbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IDA7CisgICAgZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0gPSAwOworICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSAoZmxvYXQpMC4wOworICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0gPSAoZmxvYXQpMC4wOworICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gZW5jT3B0aW9uLT52YnZEZWxheTsgIC8qIDJzZWMgVkJWIGJ1ZmZlciBzaXplICovCisKKyAgICBzd2l0Y2ggKGVuY09wdGlvbi0+ZW5jTW9kZSkKKyAgICB7CisKKyAgICAgICAgY2FzZSBTSE9SVF9IRUFERVI6CisgICAgICAgIGNhc2UgU0hPUlRfSEVBREVSX1dJVEhfRVJSX1JFUzoKKworICAgICAgICAgICAgLyogRnJvbSBUYWJsZSA2LTI2ICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPm5MYXllcnMgPSAxOworICAgICAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbMF0gPSAwOyAgICAvKkgyNjMgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDE7IC8qIERpc2FibGUgUmVzeW5jIE1hcmtlciAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nID0gMDsgLyogQ29tYmluZWQgTW9kZSAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsgICAvKiBEaXNhYmxlIFJWTEMgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+Um91bmRpbmdUeXBlID0gMDsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociA9IDc7ICAgLyogdXNlX2ludHJhX2RjX3ZsYyA9IDAgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7CisKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+R09CX0hlYWRlcl9JbnRlcnZhbCA9IGVuY09wdGlvbi0+Z29iSGVhZGVySW50ZXJ2YWw7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA9IDI7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkdPVl9FbmFibGVkID0gMDsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlcyA9IDMwMDAwOyAgICAgICAgLyogdGltZUluY3JlbWVudFJlcyBmb3IgSDI2MyAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIMjYzX01PREU6CisgICAgICAgIGNhc2UgSDI2M19NT0RFX1dJVEhfRVJSX1JFUzoKKworICAgICAgICAgICAgLyogRnJvbSBUYWJsZSA2LTI2ICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPm5MYXllcnMgPSAxOworICAgICAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbMF0gPSAwOyAgICAvKkgyNjMgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDE7IC8qIERpc2FibGUgUmVzeW5jIE1hcmtlciAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nID0gMDsgLyogQ29tYmluZWQgTW9kZSAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsgICAvKiBEaXNhYmxlIFJWTEMgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+Um91bmRpbmdUeXBlID0gMDsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociA9IDc7ICAgLyogdXNlX2ludHJhX2RjX3ZsYyA9IDAgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7CisKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SDI2M19FbmFibGVkID0gMTsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+R09WX0VuYWJsZWQgPSAwOworICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gMzAwMDA7ICAgICAgICAvKiB0aW1lSW5jcmVtZW50UmVzIGZvciBIMjYzICovCisKKyAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBIMjYzX09OTFkKKyAgICAgICAgY2FzZSBEQVRBX1BBUlRJVElPTklOR19NT0RFOgorCisgICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAxOyAgICAgICAgLyogQmFzZSBMYXllciBEYXRhIFBhcnRpdGlvbmluZyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMDsgLyogUmVzeW5jIE1hcmtlciAqLworI2lmZGVmIE5PX1JWTEMKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7CisjZWxzZQorICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gKGVuY09wdGlvbi0+cnZsY0VuYWJsZSA9PSBQVl9PTik7IC8qIFJWTEMgd2hlbiBEYXRhIFBhcnRpdGlvbmluZyAqLworI2VuZGlmCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemUgPSBQYWNrZXRTaXplOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTOgorCisgICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAgICAgICAgLyogQ29tYmluZWQgTW9kZSAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMDsgLyogUmVzeW5jIE1hcmtlciAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsgICAgICAgICAgIC8qIE5vIFJWTEMgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSA9IFBhY2tldFNpemU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTUJJTkVfTU9ERV9OT19FUlJfUkVTOgorCisgICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAgICAgICAgLyogQ29tYmluZWQgTW9kZSAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgICAgICAgICAgLyogTm8gUlZMQyAqLworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIC8qIFNldCB0aGUgY29uc3RyYWludHMgKG1heGltdW0gdmFsdWVzKSBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgLyogTm90ZSB0aGF0IHByb2ZpbGVfdGFibGVfaW5kZXggaXMgYWxyZWFkeSBmaWd1cmVkIG91dCBhYm92ZSAqLworCisgICAgLyogYmFzZSBsYXllciAqLworICAgIGVuY1BhcmFtcy0+cHJvZmlsZV90YWJsZV9pbmRleCAgICA9IHByb2ZpbGVfdGFibGVfaW5kZXg7IC8qIFVzZWQgdG8gbGltaXQgdGhlIHByb2ZpbGUgYW5kIGxldmVsIGluIFNldFByb2ZpbGVfQnVmZmVyU2l6ZSgpICovCisKKyAgICAvKiBjaGVjayB0aW1lSW5jUmVzICovCisgICAgdGltZUluY1JlcyA9IGVuY09wdGlvbi0+dGltZUluY1JlczsKKyAgICB0aW1lSW5jID0gZW5jT3B0aW9uLT50aWNrUGVyU3JjOworCisgICAgaWYgKCh0aW1lSW5jUmVzID49IDEpICYmICh0aW1lSW5jUmVzIDw9IDY1NTM2KSAmJiAodGltZUluYyA8IHRpbWVJbmNSZXMpICYmICh0aW1lSW5jICE9IDApKQorICAgIHsKKyAgICAgICAgaWYgKCFlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gdGltZUluY1JlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlcyA9IDMwMDAwOworLy8gICAgICAgICAgdmlkZW8tPkZyYW1lUmF0ZSA9IDMwMDAwLyhmbG9hdCkxMDAxOyAvKiBmaXggaXQgdG8gMjkuOTcgZnBzICovCisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPkZyYW1lUmF0ZSA9IHRpbWVJbmNSZXMgLyAoKGZsb2F0KXRpbWVJbmMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKworICAgIC8qIGNoZWNrIGZyYW1lIGRpbWVuc2lvbiAqLworICAgIGlmIChlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoZW5jT3B0aW9uLT5lbmNXaWR0aFswXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDk2KSAvKiBzb3VyY2VfZm9ybWF0ID0gMSAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzY6CisgICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDE0NCkgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzUyOgorICAgICAgICAgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFswXSAhPSAyODgpIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNzA0OgorICAgICAgICAgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFswXSAhPSA1NzYpIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0MDg6CisgICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDExNTIpIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBlbmNQYXJhbXMtPkxheWVySGVpZ2h0W2ldID0gZW5jT3B0aW9uLT5lbmNIZWlnaHRbaV07CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpXSA9IGVuY09wdGlvbi0+ZW5jV2lkdGhbaV07CisgICAgfQorCisgICAgLyogY2hlY2sgZnJhbWUgcmF0ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVtpXTsKKyAgICB9CisKKyAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSB8fAorICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdID09IDAuKSAvKiA3LzMxLzAzICovCisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKyAgICAvKiBzZXQgbWF4IGZyYW1lIHJhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworCisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgbWF4aW11bSBmcmFtZXJhdGUgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBnaXZlbiBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgICAgICBuVG90YWxNQiA9ICgoZW5jUGFyYW1zLT5MYXllcldpZHRoW2ldICsgMTUpIC8gMTYpICogKChlbmNQYXJhbXMtPkxheWVySGVpZ2h0W2ldICsgMTUpIC8gMTYpOworCisgICAgICAgIGlmIChuVG90YWxNQiA+IDApCisgICAgICAgICAgICBwcm9maWxlX21heF9mcmFtZXJhdGUgPSAoZmxvYXQpZW5jUGFyYW1zLT5MYXllck1heE1ic1BlclNlY1tpXSAvIChmbG9hdCluVG90YWxNQjsKKworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcm9maWxlX21heF9mcmFtZXJhdGUgPSAoZmxvYXQpMzAuMDsKKworICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlW2ldID0gUFZfTUlOKHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZSwgZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7CisgICAgfQorCisgICAgLyogY2hlY2sgYml0IHJhdGUgKi8KKyAgICAvKiBzZXQgbWF4IGJpdCByYXRlICovCisgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgIHsKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbaV0gPSBlbmNPcHRpb24tPmJpdFJhdGVbaV07CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlW2ldID0gZW5jT3B0aW9uLT5iaXRSYXRlW2ldOworICAgIH0KKyAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmJpdFJhdGVbMF0gPT0gZW5jT3B0aW9uLT5iaXRSYXRlWzFdIHx8CisgICAgICAgICAgICAgICAgZW5jT3B0aW9uLT5iaXRSYXRlWzBdID09IDAgfHwgZW5jT3B0aW9uLT5iaXRSYXRlWzFdID09IDApIC8qIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIC8qIGNoZWNrIHJhdGUgY29udHJvbCBhbmQgdmJ2IGRlbGF5Ki8KKyAgICBlbmNQYXJhbXMtPlJDX1R5cGUgPSBlbmNPcHRpb24tPnJjVHlwZTsKKworICAgIGlmIChlbmNPcHRpb24tPnZidkRlbGF5ID09IDAuMCkgLyogc2V0IHRvIGRlZmF1bHQgKi8KKyAgICB7CisgICAgICAgIHN3aXRjaCAoZW5jT3B0aW9uLT5yY1R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ0JSXzE6CisgICAgICAgICAgICBjYXNlIENCUl8yOgorICAgICAgICAgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gKGZsb2F0KTIuMDsgLyogZGVmYXVsdCAyc2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENCUl9MT1dERUxBWToKKyAgICAgICAgICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IChmbG9hdCkwLjU7IC8qIGRlZmF1bHQgMC41c2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZCUl8xOgorICAgICAgICAgICAgY2FzZSBWQlJfMjoKKyAgICAgICAgICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IChmbG9hdCkxMC4wOyAvKiBkZWZhdWx0IDEwc2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGZvcmNlIHRoaXMgdmFsdWUgKi8KKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gZW5jT3B0aW9uLT52YnZEZWxheTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzZWFyY2ggcmFuZ2UgKi8KKyAgICBpZiAoZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgZW5jT3B0aW9uLT5zZWFyY2hSYW5nZSA+IDE2KQorICAgIHsKKyAgICAgICAgZW5jUGFyYW1zLT5TZWFyY2hSYW5nZSA9IDE2OyAvKiA0LzE2LzIwMDEgKi8KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogY2hlY2tpbmcgZm9yIGNvbmZsaWN0IGJldHdlZW4gb3B0aW9ucyAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl8xIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSXzIgfHwgdmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfTE9XREVMQVkpICAvKiBpZiBDQlIgKi8KKyAgICB7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQgPT0gUFZfT04gfHwKKyAgICAgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Ob1ByZVNraXBfRW5hYmxlZCA9PSBQVl9PTikgLyogZG9uJ3QgYWxsb3cgZnJhbWUgc2tpcCovCisgICAgICAgICAgICBwcmludGYoIldBUk5JTkchISEhIENCUiB3aXRoIE5vRnJhbWVTa2lwXG4iKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EpICAgLyogY29uc3RhbnRfUSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+Tm9GcmFtZVNraXBfRW5hYmxlZCA9IFBWX09OOyAgLyogbm8gZnJhbWUgc2tpcCAqLworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Ob1ByZVNraXBfRW5hYmxlZCA9IFBWX09OOyAgICAvKiBubyBmcmFtZSBza2lwICovCisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgcHJpbnRmKCJUdXJuIG9uIE5vRnJhbWVTa2lwXG4iKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID09IFBWX09OKSAvKiBpZiBubyBmcmFtZSBza2lwICovCisgICAgeworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5GaW5lRnJhbWVTa2lwX0VuYWJsZWQgPSBQVl9PRkY7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgcHJpbnRmKCJOb0ZyYW1lU2tpcCAhISEgbWF5IHZpb2xhdGUgVkJWX0JVRkZFUiBjb25zdHJhaW50LlxuIik7CisgICAgICAgIHByaW50ZigiVHVybiBvZmYgRmluZUZyYW1lU2tpcFxuIik7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBuTGF5ZXJzID0gdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgLyogTnVtYmVyIG9mIExheWVycyB0byBiZSBlbmNvZGVkICovCisKKyAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIHdpZHRoKmhlaWdodCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhlIFZPUHMgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdGVtcF93ID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpZHhdOworICAgICAgICB0ZW1wX2ggPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOworCisgICAgICAgIGlmICgodGVtcF93KnRlbXBfaCkgPiBtYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heCA9IHRlbXBfdyAqIHRlbXBfaDsKKyAgICAgICAgICAgIG1heF93aWR0aCA9ICgodGVtcF93ICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgICAgICBtYXhfaGVpZ2h0ID0gKCh0ZW1wX2ggKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgICAgIG5Ub3RhbE1CID0gKChtYXhfd2lkdGggKiBtYXhfaGVpZ2h0KSA+PiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSB2aWRlbyBzaXplIGFuZCBmcmFtZXJhdGUoTUJzUGVyU2VjKSBhcmUgdmFsZCAqLworICAgICAgICBtYnNQZXJTZWMgPSAoSW50KShuVG90YWxNQiAqIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2lkeF0pOworICAgICAgICBpZiAobWJzUGVyU2VjID4gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaWR4XSkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU2V0IFByb2ZpbGUgYW5kIFZpZGVvIEJ1ZmZlciBTaXplIGZvciBlYWNoIGxheWVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZKSB2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSAwLjU7IC8qIEZvciBDQlJfTE9XREVMQVksIHdlIHNldCAwLjVzZWMgYnVmZmVyICovCisgICAgc3RhdHVzID0gU2V0UHJvZmlsZV9CdWZmZXJTaXplKHZpZGVvLCB2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXksIDEpOworICAgIGlmIChzdGF0dXMgIT0gUFZfVFJVRSkKKyAgICAgICAgZ290byBDTEVBTl9VUDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHZpZGVvID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBjeWNsaWMgcmVmZXJlbmNlIGZvciBwYXNzaW5nIHRocm91Z2ggYm90aCBzdHJ1Y3R1cmVzICovCisgICAgdmlkZW8tPnZpZGVvRW5jQ29udHJvbHMgPSBlbmNvZGVyQ29udHJvbDsKKworICAgIC8vdmlkZW8tPmN1cnJMYXllciA9IDA7IC8qIFNldCBjdXJyZW50IExheWVyIHRvIDAgKi8KKyAgICAvL3ZpZGVvLT5jdXJyRnJhbWVObyA9IDA7IC8qIFNldCBjdXJyZW50IGZyYW1lIE51bWJlciB0byAwICovCisgICAgdmlkZW8tPm5leHRNb2RUaW1lID0gMDsKKyAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAwOyAvKiBTZXRzIHVwIHZlcnkgZmlyc3QgZnJhbWUgdG8gYmUgSS1WT1AhICovCisgICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7IC8qIGNvdW50ZXIgZm9yIFZvcHMgaW4gR29wLCAyLzgvMDEgKi8KKworICAgIC8vdmlkZW8tPmZyYW1lUmF0ZSA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOyAvKiBTZXQgY3VycmVudCBsYXllciBmcmFtZSByYXRlICovCisKKyAgICB2aWRlby0+UVBNQiA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKG5Ub3RhbE1CICogc2l6ZW9mKFVDaGFyKSk7IC8qIE1lbW9yeSBmb3IgTUIgcXVhbnRpemVycyAqLworICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisKKyAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsgLyogTWVtb3J5IGZvciBNQiBNb2RlcyAqLworICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsgICAvKiBNZW1vcnkgZm9yIENCUCAoWSBhbmQgQykgb2YgZWFjaCBNQiAqLworICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIC8qIEFsbG9jYXRpbmcgbW90aW9uIHZlY3RvciBzcGFjZSBhbmQgaW50ZXJwb2xhdGlvbiBtZW1vcnkqLworCisgICAgdmlkZW8tPm1vdCA9IChNT1QgKiopTTRWRU5DX01BTExPQyhzaXplb2YoTU9UICopICogblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+bW90ID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5Ub3RhbE1COyBpZHgrKykKKyAgICB7CisgICAgICAgIHZpZGVvLT5tb3RbaWR4XSA9IChNT1QgKilNNFZFTkNfTUFMTE9DKHNpemVvZihNT1QpICogOCk7CisgICAgICAgIGlmICh2aWRlby0+bW90W2lkeF0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpZGVvLT5pbnRyYUFycmF5ID0gKFVDaGFyICopTTRWRU5DX01BTExPQyhzaXplb2YoVUNoYXIpICogblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+aW50cmFBcnJheSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgdmlkZW8tPnNsaWNlTm8gPSAoVUNoYXIgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQik7IC8qIE1lbW9yeSBmb3IgU2xpY2UgTnVtYmVycyAqLworICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHByZWREQ0FDW11bOF1bMTZdLCBOb3QgdGhhdCBJIGludGVudGlvbmFsbHkgICovCisgICAgLyogICAgaW5jcmVhc2UgdGhlIGRpbWVuc2lvbiBvZiBwcmVkRENBQyBmcm9tIFtdWzZdWzE1XSB0byBbXVs4XVsxNl0gKi8KKyAgICAvKiAgICBzbyB0aGF0IGNvbXBpbGVycyBjYW4gZ2VuZXJhdGUgZmFzdGVyIGNvZGUgdG8gaW5kZXhpbmcgdGhlICAgICAqLworICAgIC8qICAgIGRhdGEgaW5zaWRlIChieSB1c2luZyA8PCBpbnN0ZWFkIG9mICopLiAgICAgICAgIDA0LzE0LzIwMDAuICovCisgICAgLyogNS8yOS8wMSwgdXNlICBkZWNvZGVyIGxpYiBBQ0RDIHByZWRpY3Rpb24gbWVtb3J5IHNjaGVtZS4gICovCisgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBNNFZFTkNfTUFMTE9DKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CisgICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopIE00VkVOQ19NQUxMT0MoKChtYXhfd2lkdGggPj4gNCkgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CisgICAgICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgLyogIHRoZSByZXN0IHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyBob3Jpem9udGFsIChyb3cpIEFDIGNvZWZmaWNpZW50cyAgKi8KKyAgICAgICAgdmlkZW8tPnByZWREQ0FDX3JvdyA9IHZpZGVvLT5wcmVkRENBQ19jb2wgKyAxOyAgICAgICAgLyogIEFDREMgKi8KKworICAgICAgICB2aWRlby0+YWNQcmVkRmxhZyA9IChJbnQgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZihJbnQpKTsgLyogTWVtb3J5IGZvciBhY1ByZWRGbGFnICovCisgICAgICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIH0KKworICAgIHZpZGVvLT5vdXRwdXRNQiA9IChNYWNyb0Jsb2NrICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKE1hY3JvQmxvY2spKTsgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCisgICAgaWYgKHZpZGVvLT5vdXRwdXRNQiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPm91dHB1dE1CLT5ibG9ja1swXSwgMCwgKHNpemVvZihTaG9ydCkgPDwgNikqNik7CisKKyAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5kYXRhQmxvY2ssIDAsIHNpemVvZihTaG9ydCkgPDwgNyk7CisgICAgLyogQWxsb2NhdGUgKDIqcGFja2V0c2l6ZSkgd29ya2luZyBiaXRzdHJlYW1zICovCisKKyAgICB2aWRlby0+Yml0c3RyZWFtMSA9IEJpdFN0cmVhbUNyZWF0ZUVuYygyICogNDA5Nik7IC8qYWxsb2NhdGUgd29ya2luZyBzdHJlYW0gMSovCisgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0xID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPmJpdHN0cmVhbTIgPSBCaXRTdHJlYW1DcmVhdGVFbmMoMiAqIDQwOTYpOyAvKmFsbG9jYXRlIHdvcmtpbmcgc3RyZWFtIDIqLworICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIHZpZGVvLT5iaXRzdHJlYW0zID0gQml0U3RyZWFtQ3JlYXRlRW5jKDIgKiA0MDk2KTsgLyphbGxvY2F0ZSB3b3JraW5nIHN0cmVhbSAzKi8KKyAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTMgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIC8qIGFsbG9jYXRlIG92ZXJydW4gYnVmZmVyICovCisgICAgLy8gdGhpcyBidWZmZXIgaXMgdXNlZCB3aGVuIHVzZXIncyBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgb25lIGZyYW1lLgorICAgIC8vIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHNsaWNlLWJhc2VkIGVuY29kaW5nLgorICAgIGlmIChuTGF5ZXJzID09IDEpCisgICAgeworICAgICAgICB2aWRlby0+b0JTaXplID0gZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdID4+IDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5vQlNpemUgPSBQVl9NQVgoKGVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSA+PiAzKSwgKGVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSA+PiAzKSk7CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5vQlNpemUgPiBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkUgfHwgZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EpIC8vIHNldCBsaW1pdAorICAgIHsKKyAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRTsKKyAgICB9CisgICAgdmlkZW8tPm92ZXJydW5CdWZmZXIgPSAoVUNoYXIqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiB2aWRlby0+b0JTaXplKTsKKyAgICBpZiAodmlkZW8tPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworCisgICAgdmlkZW8tPmN1cnJWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAvKiBNZW1vcnkgZm9yIEN1cnJlbnQgVk9QICovCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBhZGQgcGFkZGluZywgMDkvMTkvMDUgKi8KKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiBtYWtlIGl0IGNvbmRpdGlvbmFsICAxMS8yOC8wNSAqLworICAgIHsKKyAgICAgICAgcGl0Y2ggPSBtYXhfd2lkdGg7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBpdGNoID0gbWF4X3dpZHRoICsgMzI7CisgICAgICAgIG9mZnNldCA9IChwaXRjaCA8PCA0KSArIDE2OworICAgICAgICBtYXhfaGVpZ2h0ICs9IDMyOworICAgIH0KKyAgICBzaXplID0gcGl0Y2ggKiBtYXhfaGVpZ2h0OworCisgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gKFBJWEVMICopTTRWRU5DX01BTExPQyhzaXplb2YoUElYRUwpICogKHNpemUgKyAoc2l6ZSA+PiAxKSkpOyAvKiBNZW1vcnkgZm9yIGN1cnJWb3AgWSAqLworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOy8qIE1lbW9yeSBmb3IgY3VyclZvcCBVICovCisgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7LyogTWVtb3J5IGZvciBjdXJyVm9wIFYgKi8KKworICAgIC8qIHNoaWZ0IGZvciB0aGUgb2Zmc2V0ICovCisgICAgaWYgKG9mZnNldCkKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OworICAgIH0KKworICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPmN1cnJWb3A7ICAgICAgLyogIEluaXRpYWxpemUgZm9yd2FyZFJlZlZvcCAqLworICAgIHZpZGVvLT5iYWNrd2FyZFJlZlZvcCA9IHZpZGVvLT5jdXJyVm9wOyAgICAgLyogIEluaXRpYWxpemUgYmFja3dhcmRSZWZWb3AgKi8KKworICAgIHZpZGVvLT5wcmV2QmFzZVZvcCA9IChWb3AgKikgTTRWRU5DX01BTExPQyhzaXplb2YoVm9wKSk7ICAgICAgICAgLyogTWVtb3J5IGZvciBQcmV2aW91cyBCYXNlIFZvcCAqLworICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICB2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBwcmV2QmFzZVZvcCBZICovCisgICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbiArIHNpemU7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgVSAqLworICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgViAqLworCisgICAgaWYgKG9mZnNldCkKKyAgICB7CisgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnZDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OworICAgIH0KKworCisgICAgaWYgKDApIC8qIElmIEIgRnJhbWVzICovCisgICAgeworICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgICAgIC8qIE1lbW9yeSBmb3IgTmV4dCBCYXNlIFZvcCAqLworICAgICAgICBpZiAodmlkZW8tPm5leHRCYXNlVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gPSAoUElYRUwgKikgTTRWRU5DX01BTExPQyhzaXplb2YoUElYRUwpICogKHNpemUgKyAoc2l6ZSA+PiAxKSkpOyAvKiBNZW1vcnkgZm9yIG5leHRCYXNlVm9wIFkgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT51Q2hhbiA9IHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIG5leHRCYXNlVm9wIFUgKi8KKyAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT52Q2hhbiA9IHZpZGVvLT5uZXh0QmFzZVZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBWICovCisKKyAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCisgICAgICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OworICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuTGF5ZXJzID4gMSkgICAvKiBJZiBlbmhhbmNlbWVudCBsYXllcnMgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9IChWb3AgKikgTTRWRU5DX01BTExPQyhzaXplb2YoVm9wKSk7ICAgICAgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBWb3AgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFaGFuY2VtZW50IFkgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIFByZXZpb3VzIEVuaGFuY2VtZW50IFUgKi8KKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBWICovCisKKyAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpZGVvLT5udW1iZXJPZkxheWVycyA9IG5MYXllcnM7IC8qIE51bWJlciBvZiBMYXllcnMgKi8KKyAgICB2aWRlby0+c3VtTUFEID0gMDsKKworCisgICAgLyogMDQvMDkvMDEsIGZvciBWb3BzIGluIHRoZSB1c2UgbXVsdGlwYXNzIHByb2Nlc3NpbmcgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdID0gKE11bHRpUGFzcyAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKE11bHRpUGFzcykpOworICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdID09IE5VTEwpICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPnBNUFtpZHhdLCAwLCBzaXplb2YoTXVsdGlQYXNzKSk7CisKKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5lbmNvZGVkX2ZyYW1lcyA9IC0xOyAvKiBmb3JnZXQgYWJvdXQgdGhlIHZlcnkgZmlyc3QgSSBmcmFtZSAqLworCisKKyAgICAgICAgLyogUkRJbmZvICoqcFJEU2FtcGxlcyAqLworICAgICAgICB2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMgPSAoUkRJbmZvICoqKU00VkVOQ19NQUxMT0MoMzAgKiBzaXplb2YoUkRJbmZvICopKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlcyA9PSBOVUxMKSAgICBnb3RvIENMRUFOX1VQOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldID0gKFJESW5mbyAqKU00VkVOQ19NQUxMT0MoMzIgKiBzaXplb2YoUkRJbmZvKSk7CisgICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgICAgTTRWRU5DX01FTVNFVCgmKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXVtqXSksIDAsIHNpemVvZihSREluZm8pKTsKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UgPSAoSW50KSh2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpZHhdICogMS4wKTsgLyogMS4wcyB0aW1lIGZyYW1lKi8KKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlID0gUFZfTUFYKHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSwgNSk7CisgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSA9IFBWX01JTih2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UsIDMwKTsKKworICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUG9zID0gLTE7CisKKyAgICB9CisgICAgLyogLy8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCisgICAgdmlkZW8tPnZvbCA9IChWb2wgKiopTTRWRU5DX01BTExPQyhuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKSk7IC8qIE1lbW9yeSBmb3IgVk9MIHBvaW50ZXJzICovCisKKyAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgSW5pdGlhbGl6YXRpb24gb2YgVm9scyBhbmQgd3JpdGluZyBvZiBoZWFkZXJzICovCisgICAgaWYgKHZpZGVvLT52b2wgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtpZHhdID0gMTsKKyAgICAgICAgdmlkZW8tPnJlZlRpY2tbaWR4XSA9IDA7CisgICAgICAgIHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2lkeF0gPSAxMDAwOworICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopTTRWRU5DX01BTExPQyhzaXplb2YoVm9sKSk7CisgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAgICAgcFZvbCA9IHZpZGVvLT52b2xbaWR4XTsKKyAgICAgICAgcEVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisKKyAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzb21lIFZPTCBwYXJhbWV0ZXJzICovCisgICAgICAgIHBWb2wtPnZvbElEID0gaWR4OyAgLyogU2V0IFZPTCBJRCAqLworICAgICAgICBwVm9sLT5zaG9ydFZpZGVvSGVhZGVyID0gcEVuY1BhcmFtcy0+SDI2M19FbmFibGVkOyAvKlNob3J0IEhlYWRlciAqLworICAgICAgICBwVm9sLT5HT1ZTdGFydCA9IHBFbmNQYXJhbXMtPkdPVl9FbmFibGVkOyAvKiBHT1YgSGVhZGVyICovCisgICAgICAgIHBWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID0gdmlkZW8tPmVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlczsKKyAgICAgICAgcFZvbC0+bmJpdHNUaW1lSW5jUmVzID0gMTsKKyAgICAgICAgd2hpbGUgKHBWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID4gKDEgPDwgcFZvbC0+bmJpdHNUaW1lSW5jUmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFZvbC0+bmJpdHNUaW1lSW5jUmVzKys7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aW1pbmcgc3R1ZmYgKi8KKyAgICAgICAgcFZvbC0+dGltZUluY3JlbWVudCA9IDA7CisgICAgICAgIHBWb2wtPm1vZHVsb1RpbWVCYXNlID0gMDsKKyAgICAgICAgcFZvbC0+Zml4ZWRWb3BSYXRlID0gMDsgLyogTm8gZml4ZWQgVk9QIHJhdGUgKi8KKyAgICAgICAgcFZvbC0+c3RyZWFtID0gKEJpdHN0cmVhbUVuY1ZpZGVvICopTTRWRU5DX01BTExPQyhzaXplb2YoQml0c3RyZWFtRW5jVmlkZW8pKTsgLyogYWxsb2NhdGUgQml0c3RyZWFtRW5jVmlkZW8gSW5zdGFuY2UgKi8KKyAgICAgICAgaWYgKHBWb2wtPnN0cmVhbSA9PSBOVUxMKSAgZ290byBDTEVBTl9VUDsKKworICAgICAgICBwVm9sLT53aWR0aCA9IHBFbmNQYXJhbXMtPkxheWVyV2lkdGhbaWR4XTsgICAgICAvKiBMYXllciBXaWR0aCAqLworICAgICAgICBwVm9sLT5oZWlnaHQgPSBwRW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOyAgICAvKiBMYXllciBIZWlnaHQgKi8KKyAgICAgICAgLy8gIHBWb2wtPmludHJhX2FjZGNQcmVkRGlzYWJsZSA9IHBFbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uOyAvKiBBQ0RDIFByZWRpY3Rpb24gKi8KKyAgICAgICAgcFZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IHBFbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGU7IC8qIFJlc3luYyBNYXJrZXIgTW9kZSAqLworICAgICAgICBwVm9sLT5kYXRhUGFydGl0aW9uaW5nID0gcEVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZzsgLyogRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyAgICAgICAgcFZvbC0+dXNlUmV2ZXJzZVZMQyA9IHBFbmNQYXJhbXMtPlJldmVyc2libGVWTEM7IC8qIFJWTEMgKi8KKyAgICAgICAgaWYgKGlkeCA+IDApIC8qIFNjYWxhYmlsaXR5IGxheWVycyAqLworICAgICAgICB7CisgICAgICAgICAgICBwVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsKKyAgICAgICAgICAgIHBWb2wtPmRhdGFQYXJ0aXRpb25pbmcgPSAwOworICAgICAgICAgICAgcFZvbC0+dXNlUmV2ZXJzZVZMQyA9IDA7IC8qICBObyBSVkxDICovCisgICAgICAgIH0KKyAgICAgICAgcFZvbC0+cXVhbnRUeXBlID0gcEVuY1BhcmFtcy0+UXVhbnRUeXBlW2lkeF07ICAgICAgICAgICAvKiBRdWFudGl6ZXIgVHlwZSAqLworCisgICAgICAgIC8qIG5vIG5lZWQgdG8gaW5pdCBRdWFudCBNYXRyaWNlcyAqLworCisgICAgICAgIHBWb2wtPnNjYWxhYmlsaXR5ID0gMDsgIC8qIFZvbCBTY2FsYWJpbGl0eSAqLworICAgICAgICBpZiAoaWR4ID4gMCkKKyAgICAgICAgICAgIHBWb2wtPnNjYWxhYmlsaXR5ID0gMTsgLyogTXVsdGlwbGUgbGF5ZXJzID0+IFNjYWxhYmlsaXR5ICovCisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBWb2wgdG8gVGVtcG9yYWwgc2NhbGFiaWxpdHkuICBJdCBjYW4gY2hhbmdlIGR1cmluZyBlbmNvZGluZyAqLworICAgICAgICBwVm9sLT5zY2FsVHlwZSA9IDE7CisgICAgICAgIC8qIEluaXRpYWxpemUgcmVmZXJlbmNlIFZvbCBJRCB0byB0aGUgYmFzZSBsYXllciA9IDAgKi8KKyAgICAgICAgcFZvbC0+cmVmVm9sSUQgPSAwOworICAgICAgICAvKiBJbml0aWFsaXplIGxheWVyIHJlc29sdXRpb24gdG8gc2FtZSBhcyB0aGUgcmVmZXJlbmNlICovCisgICAgICAgIHBWb2wtPnJlZlNhbXBEaXIgPSAwOworICAgICAgICBwVm9sLT5ob3JTYW1wX20gPSAxOworICAgICAgICBwVm9sLT5ob3JTYW1wX24gPSAxOworICAgICAgICBwVm9sLT52ZXJTYW1wX20gPSAxOworICAgICAgICBwVm9sLT52ZXJTYW1wX24gPSAxOworICAgICAgICBwVm9sLT5lbmhhbmNlbWVudFR5cGUgPSAwOyAvKiBXZSBhbHdheXMgZW5oYW5jZSB0aGUgZW50aXJlIHJlZ2lvbiAqLworCisgICAgICAgIHBWb2wtPm5NQlBlclJvdyA9IChwVm9sLT53aWR0aCArIDE1KSAvIDE2OworICAgICAgICBwVm9sLT5uTUJQZXJDb2wgPSAocFZvbC0+aGVpZ2h0ICsgMTUpIC8gMTY7CisgICAgICAgIHBWb2wtPm5Ub3RhbE1CID0gcFZvbC0+bk1CUGVyUm93ICogcFZvbC0+bk1CUGVyQ29sOworCisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDMpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAyOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDM7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA5KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNDsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDE3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDMzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNjsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDY1KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNzsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDEyOSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDg7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAyNTcpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA5OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNTEzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTA7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxMDI1KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTE7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAyMDQ5KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTI7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA0MDk3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTM7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA4MTkzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTQ7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxNjM4NSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE1OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMzI3NjkpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxNjsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDY1NTM3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTc7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxMzEwNzMpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxODsKKworICAgICAgICBpZiAocFZvbC0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChwVm9sLT53aWR0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSA5NikgIC8qIHNvdXJjZV9mb3JtYXQgPSAxICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxNzY6CisgICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gMTQ0KSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gMTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzUyOgorICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDI4OCkgIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSAyMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDcwNDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSA1NzYpICAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gODg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTQwODoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSAxMTUyKSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gMTg7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDM1MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHJhdGUgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIEJFR0lOIElOSVRJQUxJWkFUSU9OIE9GIEFOTkVYIEwgUkFURSBDT05UUk9MICovCisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICB7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspIC8qIDEyLzI1LzAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5yY1tpZHhdID0KKyAgICAgICAgICAgICAgICAocmF0ZUNvbnRyb2wgKilNNFZFTkNfTUFMTE9DKHNpemVvZihyYXRlQ29udHJvbCkpOworCisgICAgICAgICAgICBpZiAodmlkZW8tPnJjW2lkeF0gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgICAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+cmNbaWR4XSwgMCwgc2l6ZW9mKHJhdGVDb250cm9sKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBWX1NVQ0NFU1MgIT0gUkNfSW5pdGlhbGl6ZSh2aWRlbykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gZm9yIDItcGFzcyByYXRlIGNvbnRyb2wgKi8KKyAgICB9CisgICAgLyogRU5EIElOSVRJQUxJWkFUSU9OIE9GIEFOTkVYIEwgUkFURSBDT05UUk9MICovCisKKyAgICAvKioqKioqKioqKiBhc3NpZ24gcGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAxLzIzLzAxICovCisgICAgLyogVGhpcyBtdXN0IGJlIGRvbmUgYXQgcnVuLXRpbWUgbm90IGEgY29tcGlsZSB0aW1lICovCisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlciA9IChGdW5jUHRyKikgTTRWRU5DX01BTExPQyhzaXplb2YoRnVuY1B0cikpOworICAgIGlmICh2aWRlby0+ZnVuY3Rpb25Qb2ludGVyID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5Db21wdXRlTUJTdW0gPSAmQ29tcHV0ZU1CU3VtX0M7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IYWxmUGVsX0N4aDsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSGFsZlBlbF9DeWg7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmU0FEX01CX0hhbGZQZWxfQ3hoeWg7CisKKyNpZm5kZWYgTk9fSU5URVI0VgorICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbGtfSGFsZlBlbCA9ICZTQURfQmxrX0hhbGZQZWxfQzsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfQmxvY2sgPSAmU0FEX0Jsb2NrX0M7CisjZW5kaWYKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZTQURfTWFjcm9ibG9ja19DOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkNob29zZU1vZGUgPSAmQ2hvb3NlTW9kZV9DOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkdldEhhbGZQZWxNQlJlZ2lvbiA9ICZHZXRIYWxmUGVsTUJSZWdpb25fQzsKKy8vICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfUEFERElORyA9ICZTQURfTUJfUEFERElORzsgLyogNC8yMS8wMSAqLworCisKKyAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDE7ICAvKiBpbml0IGRvbmUhICovCisKKyAgICByZXR1cm4gUFZfVFJVRTsKKworQ0xFQU5fVVA6CisgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKGVuY29kZXJDb250cm9sKTsKKworICAgIHJldHVybiBQVl9GQUxTRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQ2xlYW5VcFZpZGVvRW5jb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWFsbG9jYXRlcyBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gSW5pdFZpZGVvRW5jb2RlcigpICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiA1LzIxLzAxLCBmcmVlIG9ubHkgeUNoYW4gaW4gVm9wICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworICAgIEludCBpZHgsIGk7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBpbnQgblRvdGFsTUI7CisgICAgaW50IG1heF93aWR0aCwgb2Zmc2V0OworCisjaWZkZWYgUFJJTlRfUkNfSU5GTworICAgIGlmIChmYWNjdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVE9UQUwgTlVNIEJJVFMgR0VORVJBVEVEICVkXG4iLCB0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBGUkFNRVMgQ09ERUQgJWRcbiIsCisgICAgICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+cmNbMF0tPnRvdGFsRnJhbWVOdW1iZXIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJBdmVyYWdlIEJpdFJhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgKHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkIC8gKDkwIC8gMzApKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBTVFVGRiBCSVRTICVkXG4iLCAoaVN0dWZmQml0cyArIDEwNzQwKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBCSVRTIFRPIE5FVFdPUksgJWRcbiIsICgzNTgwMCo5MCAvIDMwKSk7OworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJTVU0gT0YgU1RVRkYgQklUUyBBTkQgR0VORVJBVEVEIEJJVFMgJWRcbiIsCisgICAgICAgICAgICAgICAgKHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkICsgaVN0dWZmQml0cyArIDEwNzQwKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlVOQUNDT1VOVEVEIERJRkZFUkVOQ0UgJWRcbiIsCisgICAgICAgICAgICAgICAgKCgzNTgwMCo5MCAvIDMwKSAtICh0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCArIGlTdHVmZkJpdHMgKyAxMDc0MCkpKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmY2xvc2UoZmFjY3QpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgUFJJTlRfRUMKKyAgICBmY2xvc2UoZmVjKTsKKyNlbmRpZgorCisgICAgaWYgKHZpZGVvICE9IE5VTEwpCisgICAgeworCisgICAgICAgIGlmICh2aWRlby0+UVBNQikgTTRWRU5DX0ZSRUUodmlkZW8tPlFQTUIpOworICAgICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSlNNFZFTkNfRlJFRSh2aWRlby0+aGVhZGVySW5mby5Nb2RlKTsKKyAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUClNNFZFTkNfRlJFRSh2aWRlby0+aGVhZGVySW5mby5DQlApOworCisKKyAgICAgICAgaWYgKHZpZGVvLT5tb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5Ub3RhbE1CID0gdmlkZW8tPnZvbFswXS0+blRvdGFsTUI7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDE7IGlkeCA8IHZpZGVvLT5jdXJyTGF5ZXI7IGlkeCsrKQorICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPm5Ub3RhbE1CID4gblRvdGFsTUIpCisgICAgICAgICAgICAgICAgICAgIG5Ub3RhbE1CID0gdmlkZW8tPnZvbFtpZHhdLT5uVG90YWxNQjsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgblRvdGFsTUI7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bW90W2lkeF0pCisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5tb3RbaWR4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+bW90KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+aW50cmFBcnJheSkgTTRWRU5DX0ZSRUUodmlkZW8tPmludHJhQXJyYXkpOworCisgICAgICAgIGlmICh2aWRlby0+c2xpY2VObylNNFZFTkNfRlJFRSh2aWRlby0+c2xpY2VObyk7CisgICAgICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZylNNFZFTkNfRlJFRSh2aWRlby0+YWNQcmVkRmxhZyk7CisvLyAgICAgIGlmKHZpZGVvLT5wcmVkRENBQylNNFZFTkNfRlJFRSh2aWRlby0+cHJlZERDQUMpOworICAgICAgICBpZiAodmlkZW8tPnByZWREQykgTTRWRU5DX0ZSRUUodmlkZW8tPnByZWREQyk7CisgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSBOVUxMOworICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCkgTTRWRU5DX0ZSRUUodmlkZW8tPnByZWREQ0FDX2NvbCk7CisgICAgICAgIGlmICh2aWRlby0+b3V0cHV0TUIpTTRWRU5DX0ZSRUUodmlkZW8tPm91dHB1dE1CKTsKKworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTEpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTEpOworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTIpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTIpOworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTMpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTMpOworCisgICAgICAgIGlmICh2aWRlby0+b3ZlcnJ1bkJ1ZmZlcikgTTRWRU5DX0ZSRUUodmlkZW8tPm92ZXJydW5CdWZmZXIpOworCisgICAgICAgIG1heF93aWR0aCA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbMF07CisgICAgICAgIG1heF93aWR0aCA9ICgoKG1heF93aWR0aCArIDE1KSA+PiA0KSA8PCA0KTsgLyogMDkvMTkvMDUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCA9ICgobWF4X3dpZHRoICsgMzIpIDw8IDQpICsgMTY7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+Y3VyclZvcC0+eUNoYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPmN1cnJWb3ApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT55Q2hhbiAtPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm5leHRCYXNlVm9wLT55Q2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+bmV4dEJhc2VWb3ApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbiAtPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cHJldkJhc2VWb3ApOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnByZXZFbmhhbmNlVm9wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIDA0LzA5LzAxLCBmb3IgVm9wcyBpbiB0aGUgdXNlIG11bHRpcGFzcyBwcm9jZXNzaW5nICovCisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5wTVBbaWR4XSwgMCwgc2l6ZW9mKE11bHRpUGFzcykpOworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wTVBbaWR4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogLy8gIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworICAgICAgICBpZiAodmlkZW8tPnZvbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XS0+c3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnZvbFtpZHhdLT5zdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+dm9sW2lkeF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT52b2wpOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogc3RvcCByYXRlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIEFOTkVYIEwgUkFURSBDT05UUk9MICovCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJDX0NsZWFudXAodmlkZW8tPnJjLCB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzKTsKKworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnJjW2lkeF0pCisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5yY1tpZHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+ZnVuY3Rpb25Qb2ludGVyKSBNNFZFTkNfRlJFRSh2aWRlby0+ZnVuY3Rpb25Qb2ludGVyKTsKKworICAgICAgICAvKiBJZiBhcHBsaWNhdGlvbiBoYXMgY2FsbGVkIFBWQ2xlYW5VcFZpZGVvRW5jb2RlciB0aGVuIHdlIGRlYWxsb2NhdGUgKi8KKyAgICAgICAgLyogSWYgUFZJbml0VmlkZW9FbmNvZGVyIGNsYXNzIGl0LCB0aGVuIHdlIERPIE5PVCBkZWFsbG9jYXRlICovCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zKQorICAgICAgICB7CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+ZW5jUGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvKTsKKyAgICAgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEgPSBOVUxMOyAvKiB2aWRlbyAqLworICAgIH0KKworICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0ID0gMDsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0Vm9sSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNy8xNy8yMDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0Vm9sSGVhZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFVDaGFyICp2b2xIZWFkZXIsIEludCAqc2l6ZSwgSW50IGxheWVyKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKyAgICBQVl9TVEFUVVMgICBFbmNvZGVWT1NfU3RhcnQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCk7CisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKworICAgIGVuY0RhdGEtPmN1cnJMYXllciA9IGxheWVyOyAvKiBTZXQgTGF5ZXIgKi8KKyAgICAvKnB2X3N0YXR1cyA9ICovCisgICAgRW5jb2RlVk9TX1N0YXJ0KGVuY0N0cmwpOyAvKiBFbmNvZGUgVk9MIEhlYWRlciAqLworCisgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5HZXRWb2xIZWFkZXJbbGF5ZXJdID0gMTsgLyogU2V0IHVzYWdlIGZsYWc6IE5lZWRlZCB0byBzdXBwb3J0IG9sZCBtZXRob2QqLworCisgICAgLyogQ29weSBiaXRzdHJlYW0gdG8gYnVmZmVyIGFuZCBzZXQgdGhlIHNpemUgKi8KKworICAgIGlmICgqc2l6ZSA+IGVuY0RhdGEtPmJpdHN0cmVhbTEtPmJ5dGVDb3VudCkKKyAgICB7CisgICAgICAgICpzaXplID0gZW5jRGF0YS0+Yml0c3RyZWFtMS0+Ynl0ZUNvdW50OworICAgICAgICBNNFZFTkNfTUVNQ1BZKHZvbEhlYWRlciwgZW5jRGF0YS0+Yml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyLCAqc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgLyogUmVzZXQgYml0c3RyZWFtMSBidWZmZXIgcGFyYW1ldGVycyAqLworICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGVuY0RhdGEtPmJpdHN0cmVhbTEpOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRPdmVycnVuQnVmZmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgdGhlIG92ZXJydW4gYnVmZmVyIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUG9pbnRlciB0byBvdmVycnVuIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgVUNoYXIqIFBWR2V0T3ZlcnJ1bkJ1ZmZlcihWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKQoreworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBJbnQgY3VyckxheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisKKyAgICBpZiAoY3VyclZvbC0+c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgIT0gdmlkZW8tPm92ZXJydW5CdWZmZXIpIC8vIG5vdCB1c2VkCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gdmlkZW8tPm92ZXJydW5CdWZmZXI7Cit9CisKKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlVmlkZW9GcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSB2aWRlbyBmcmFtZSBhbmQgcmV0dXJuIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDAyLjE0LjIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgRmluaXNoaW5nIG5ldyB0aW1lc3RhbXAgMzItYml0IGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBBcHBsaWNhdGlvbnMgbmVlZCB0byB0YWtlIGNhcmUgb2Ygd3JhcC1hcm91bmQgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkVuY29kZVZpZGVvRnJhbWUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVmlkZW9FbmNGcmFtZUlPICp2aWRfaW4sIFZpZGVvRW5jRnJhbWVJTyAqdmlkX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTG9uZyAqbmV4dE1vZFRpbWUsIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsIEludCAqbkxheWVyKQoreworICAgIEJvb2wgc3RhdHVzID0gUFZfVFJVRTsKKyAgICBQVl9TVEFUVVMgcHZfc3RhdHVzOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBWb2wgKmN1cnJWb2w7CisgICAgVm9wICp0ZW1wRm9yd1JlZlZvcCA9IE5VTEw7CisgICAgSW50IHRlbXBSZWZTZWxDb2RlID0gMDsKKyAgICBQVl9TVEFUVVMgICBFbmNvZGVWT1NfU3RhcnQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCk7CisgICAgSW50IHdpZHRoXzE2LCBoZWlnaHRfMTY7CisgICAgSW50IHdpZHRoLCBoZWlnaHQ7CisgICAgVm9wICp0ZW1wOworICAgIEludCBlbmNvZGVWb3AgPSAwOworICAgIHZvaWQgIFBhZGRpbmdFZGdlKFZvcCAqcGFkVm9wKTsKKyAgICBJbnQgY3VyckxheWVyID0gLTE7CisgICAgLy9JbnQgbkxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKKworICAgIFVMb25nIG1vZFRpbWUgPSB2aWRfaW4tPnRpbWVzdGFtcDsKKworI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLworICAgIEludCByYW5kb21fdmFsWzMwXSA9IHswLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAwfTsKKyAgICBzdGF0aWMgSW50IHJhbmRfaWR4ID0gMDsKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIE5leHQgVm9wIHRvIGVuY29kZSwgaWYgYW55LCBhbmQgbkxheWVyICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy9pID0gbkxheWVycy0xOworCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplWzBdKSAvKiBmaXJzdCB2b2wgdG8gY29kZSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPm5leHRNb2RUaW1lID0gdmlkZW8tPm1vZFRpbWVSZWYgPSAoKG1vZFRpbWUpIC0gKChtb2RUaW1lKSAlIDEwMDApKTsKKyAgICB9CisKKyAgICBlbmNvZGVWb3AgPSBEZXRlcm1pbmVDb2RpbmdMYXllcih2aWRlbywgbkxheWVyLCBtb2RUaW1lKTsKKyAgICBjdXJyTGF5ZXIgPSAqbkxheWVyOworICAgIGlmICgoY3VyckxheWVyIDwgMCkgfHwgKGN1cnJMYXllciA+IGVuY1BhcmFtcy0+bkxheWVycyAtIDEpKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIElmIHBvc3Qtc2tpcHBpbmcgc3RpbGwgZWZmZWN0aXZlIC0tLSByZXR1cm4gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKCFlbmNvZGVWb3ApIC8qIHNraXAgZW5oIGxheWVyLCBubyBiYXNlIGxheWVyIGNvZGVkIC0tLSByZXR1cm4gKi8KKyAgICB7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgcHJpbnRmKCJObyBmcmFtZSBjb2RlZC4gQ29udGludWUgdG8gbmV4dCBmcmFtZS4iKTsKKyNlbmRpZgorICAgICAgICAvKiBleHBlY3RlZCBuZXh0IGNvZGUgdGltZSwgY29udmVydCBiYWNrIHRvIG1pbGxpc2VjICovCisgICAgICAgICpuZXh0TW9kVGltZSA9IHZpZGVvLT5uZXh0TW9kVGltZTsKKworI2lmZGVmIEFMTE9XX1ZPUF9OT1RfQ09ERUQKKyAgICAgICAgaWYgKHZpZGVvLT52b2xbMF0tPnNob3J0VmlkZW9IZWFkZXIpIC8qIFNob3J0IFZpZGVvIEhlYWRlciA9IDEgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKnNpemUgPSAwOworICAgICAgICAgICAgKm5MYXllciA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKm5MYXllciA9IDA7CisgICAgICAgICAgICBFbmNvZGVWb3BOb3RDb2RlZCh2aWRlbywgYnN0cmVhbSwgc2l6ZSwgbW9kVGltZSk7CisgICAgICAgICAgICAqc2l6ZSA9IHZpZGVvLT52b2xbMF0tPnN0cmVhbS0+Ynl0ZUNvdW50OworICAgICAgICB9CisjZWxzZQorICAgICAgICAqc2l6ZSA9IDA7CisgICAgICAgICpuTGF5ZXIgPSAtMTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworCisvL0VOQ09ERV9WT1BfQUdBSU46ICAvKiAxMi8zMC8wMCAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgVm9sIHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBiaXRzdHJlYW0gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIGN1cnJWb2wtPnN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnN0cmVhbTsKKyAgICBjdXJyVm9sLT5zdHJlYW0tPmJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICBCaXRzdHJlYW1FbmNSZXNldChjdXJyVm9sLT5zdHJlYW0pOworICAgIEJpdHN0cmVhbVNldE92ZXJydW5CdWZmZXIoY3VyclZvbC0+c3RyZWFtLCB2aWRlby0+b3ZlcnJ1bkJ1ZmZlciwgdmlkZW8tPm9CU2l6ZSwgdmlkZW8pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWT1MgYW5kIFZPTCBIZWFkZXJzIG9uIGZpcnN0IGNhbGwgZm9yIGVhY2ggbGF5ZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gMDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT50aW1lSW5jID0gMDsKKyAgICAgICAgaWYgKCF2aWRlby0+ZW5jUGFyYW1zLT5HZXRWb2xIZWFkZXJbY3VyckxheWVyXSkKKyAgICAgICAgICAgIHB2X3N0YXR1cyA9IEVuY29kZVZPU19TdGFydChlbmNDdHJsKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcHkgSW5wdXQgVmlkZW8gRnJhbWUgdG8gSW50ZXJuYWwgVmlkZW8gQnVmZmVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgV2lkdGggYW5kIEhlaWdodCBvZiBWb3AgTGF5ZXIgKi8KKworICAgIHdpZHRoID0gZW5jUGFyYW1zLT5MYXllcldpZHRoW2N1cnJMYXllcl07ICAgLyogR2V0IGlucHV0IHdpZHRoICovCisgICAgaGVpZ2h0ID0gZW5jUGFyYW1zLT5MYXllckhlaWdodFtjdXJyTGF5ZXJdOyAvKiBHZXQgaW5wdXQgaGVpZ2h0ICovCisgICAgLyogUm91bmQgVXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiA6IE1QRUctNCBTdGFuZGFyZCAqLworCisgICAgd2lkdGhfMTYgPSAoKHdpZHRoICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgICAgLyogUm91bmQgdXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiAqLworICAgIGhlaWdodF8xNiA9ICgoaGVpZ2h0ICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KKworICAgIHZpZGVvLT5pbnB1dCA9IHZpZF9pbjsgIC8qIHBvaW50IHRvIHRoZSBmcmFtZSBpbnB1dCAqLworCisgICAgLyovLyAgRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIFZPUCBUeXBlICAgICAgICAgICAgICAgICAqLworICAgIC8qIDYvMi8yMDAxLCBzZXBhcmF0ZSBmdW5jdGlvbiAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIERldGVybWluZVZvcFR5cGUodmlkZW8sIGN1cnJMYXllcik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICBJbml0aWFsaXplIFZPUCAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2aWRlby0+Y3VyclZvcC0+dm9sSUQgPSBjdXJyVm9sLT52b2xJRDsKKyAgICB2aWRlby0+Y3VyclZvcC0+d2lkdGggPSB3aWR0aF8xNjsKKyAgICB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0ID0gaGVpZ2h0XzE2OworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIC8qICAxMS8yOC8wNSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnBpdGNoID0gd2lkdGhfMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2ICsgMzI7CisgICAgfQorICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gY3VyclZvbC0+dGltZUluY3JlbWVudDsKKyAgICB2aWRlby0+Y3VyclZvcC0+dm9wQ29kZWQgPSAxOworICAgIHZpZGVvLT5jdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyID0gZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyOworCisgICAgaWYgKGN1cnJMYXllciA9PSAwCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgICAgICAgICB8fCByYW5kb21fdmFsW3JhbmRfaWR4XSB8fCB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdCisjZW5kaWYKKyAgICAgICApCisgICAgeworICAgICAgICB0ZW1wRm9yd1JlZlZvcCA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wOyAvKiBrZWVwIGluaXRpYWwgc3RhdGUgKi8KKyAgICAgICAgaWYgKHRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHRlbXBSZWZTZWxDb2RlID0gdGVtcEZvcndSZWZWb3AtPnJlZlNlbGVjdENvZGU7CisKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkJhc2VWb3A7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICB9CisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUKKyAgICBlbHNlCisgICAgeworICAgICAgICB0ZW1wRm9yd1JlZlZvcCA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wOyAvKiBrZWVwIGluaXRpYWwgc3RhdGUgKi8KKyAgICAgICAgaWYgKHRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHRlbXBSZWZTZWxDb2RlID0gdGVtcEZvcndSZWZWb3AtPnJlZlNlbGVjdENvZGU7CisKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMDsKKyAgICB9CisgICAgcmFuZF9pZHgrKzsKKyAgICByYW5kX2lkeCAlPSAzMDsKKyNlbmRpZgorCisgICAgdmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKyAgICB2aWRlby0+Y3VyclZvcC0+Z29iTnVtYmVyID0gMDsKKyAgICB2aWRlby0+Y3VyclZvcC0+Z29iRnJhbWVJRCA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICB2aWRlby0+Y3VyclZvcC0+dGVtcG9yYWxSZWYgPSAobW9kVGltZSAqIDMwIC8gMTAwMSkgJSAyNTY7CisKKyAgICB2aWRlby0+Y3VyclZvcC0+dGVtcG9yYWxJbnRlcnZhbCA9IDA7CisKKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyID0gZW5jUGFyYW1zLT5Jbml0UXVhbnRJdm9wW2N1cnJMYXllcl07CisgICAgZWxzZQorICAgICAgICB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyID0gZW5jUGFyYW1zLT5Jbml0UXVhbnRQdm9wW2N1cnJMYXllcl07CisKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWb3AgKi8KKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB2aWRlby0+c2xpY2VfY29kaW5nID0gMDsKKworICAgIHB2X3N0YXR1cyA9IEVuY29kZVZvcCh2aWRlbyk7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBwcmludGYoIiBJLVZPUCAiKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiIFAtVk9QIChyZWYuJWQpIiwgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUpOworI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFVwZGF0ZSBTa2lwIE5leHQgRnJhbWUgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAqbkxheWVyID0gVXBkYXRlU2tpcE5leHRGcmFtZSh2aWRlbywgbmV4dE1vZFRpbWUsIHNpemUsIHB2X3N0YXR1cyk7CisgICAgaWYgKCpuTGF5ZXIgPT0gLTEpIC8qIHNraXAgY3VycmVudCBmcmFtZSAqLworICAgIHsKKyAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgcG9pbnRlcnMgYXJlIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBzdGF0ZSAqLworICAgICAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdGVtcEZvcndSZWZWb3A7IC8qIEZvciBQLVZvcCBiYXNlIG9ubHkgKi8KKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gdGVtcFJlZlNlbENvZGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIElmIEktVk9QIHdhcyBlbmNvZGVkLCByZXNldCBJbnRyYVBlcmlvZCAqLworICAgIGlmICgoY3VyckxheWVyID09IDApICYmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID4gMCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCisgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q7CisKKyAgICAvKiBTZXQgSGludFRyYWNrIEluZm9ybWF0aW9uICovCisgICAgaWYgKGN1cnJMYXllciAhPSAtMSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2UpCisgICAgICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAwOworICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5MYXllcklEID0gKFVDaGFyKWN1cnJWb2wtPnZvbElEOworICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5Db2RlVHlwZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLlJlZlNlbENvZGUgPSAoVUNoYXIpdmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGU7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgbkxheWVyIGFuZCB0aW1lSW5jIGZvciBuZXh0IGVuY29kZSAqLworICAgIC8qIDEyLzI3LzAwIGFsd2F5cyBnbyBieSB0aGUgaGlnaGVzdCBsYXllciovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcHkgUmVjb25zdHJ1Y3RlZCBCdWZmZXIgdG8gT3V0cHV0IFZpZGVvIEZyYW1lIEJ1ZmZlciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHZpZF9vdXQtPnlDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOworICAgIHZpZF9vdXQtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuOworICAgIHZpZF9vdXQtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnZDaGFuOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgeworICAgICAgICB2aWRfb3V0LT5oZWlnaHQgPSB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0OyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodCArIDMyOyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoICsgMzI7IC8qIHBhZGRlZCB3aWR0aCAqLworICAgIH0KKyAgICAvL3ZpZGVvX291dC0+dGltZXN0YW1wID0gdmlkZW8tPm1vZFRpbWU7CisgICAgdmlkX291dC0+dGltZXN0YW1wID0gKFVMb25nKSgoKHZpZGVvLT5wcmV2RnJhbWVOdW1bY3VyckxheWVyXSAqIDEwMDApIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtjdXJyTGF5ZXJdKSArIHZpZGVvLT5tb2RUaW1lUmVmICsgMC41KTsKKworICAgIC8qLy8gRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVXBkYXRlIE91cHV0IGJzdHJlYW0gYnl0ZSBjb3VudCAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICpzaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQ7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTd2FwIFZvcCBQb2ludGVycyBmb3IgQmFzZSBMYXllciAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgeworICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT5wYWRkZWQgPSAwOyAvKiBub3QgcGFkZGVkICovCisgICAgICAgIHZpZGVvLT5jdXJyVm9wICA9IHRlbXA7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGVtcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXA7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogTW9kaWZ5IHRoZSBpbnRpYWxpemUgZmxhZyBhdCB0aGUgZW5kLiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgICAgIHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0gPSAwOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmbmRlZiBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZFbmNvZGVGcmFtZVNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVudGVyIGEgdmlkZW8gZnJhbWUgYW5kIHBlcmZvcm0gZnJvbnQtZW5kIHRpbWUgY2hlY2sgcGx1cyBNRSAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRW5jb2RlRnJhbWVTZXQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVmlkZW9FbmNGcmFtZUlPICp2aWRfaW4sIFVMb25nICpuZXh0TW9kVGltZSwgSW50ICpuTGF5ZXIpCit7CisgICAgQm9vbCBzdGF0dXMgPSBQVl9UUlVFOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBWb2wgKmN1cnJWb2w7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIEludCB3aWR0aF8xNiwgaGVpZ2h0XzE2OworICAgIEludCB3aWR0aCwgaGVpZ2h0OworICAgIEludCBlbmNvZGVWb3AgPSAwOworICAgIHZvaWQgIFBhZGRpbmdFZGdlKFZvcCAqcGFkVm9wKTsKKyAgICBJbnQgY3VyckxheWVyID0gLTE7CisgICAgLy9JbnQgbkxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKKworICAgIFVMb25nICAgbW9kVGltZSA9IHZpZF9pbi0+dGltZXN0YW1wOworCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgSW50IHJhbmRvbV92YWxbMzBdID0gezAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDB9OworICAgIHN0YXRpYyBJbnQgcmFuZF9pZHggPSAwOworI2VuZGlmCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIE5leHQgVm9wIHRvIGVuY29kZSwgaWYgYW55LCBhbmQgbkxheWVyICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICB2aWRlby0+bW9kVGltZSA9IG1vZFRpbWU7CisKKyAgICAvL2kgPSBuTGF5ZXJzLTE7CisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbMF0pIC8qIGZpcnN0IHZvbCB0byBjb2RlICovCisgICAgeworICAgICAgICB2aWRlby0+bmV4dE1vZFRpbWUgPSB2aWRlby0+bW9kVGltZVJlZiA9ICgobW9kVGltZSkgLSAoKG1vZFRpbWUpICUgMTAwMCkpOworICAgIH0KKworCisgICAgZW5jb2RlVm9wID0gRGV0ZXJtaW5lQ29kaW5nTGF5ZXIodmlkZW8sIG5MYXllciwgbW9kVGltZSk7CisKKyAgICBjdXJyTGF5ZXIgPSAqbkxheWVyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJZiBwb3N0LXNraXBwaW5nIHN0aWxsIGVmZmVjdGl2ZSAtLS0gcmV0dXJuICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICghZW5jb2RlVm9wKSAvKiBza2lwIGVuaCBsYXllciwgbm8gYmFzZSBsYXllciBjb2RlZCAtLS0gcmV0dXJuICovCisgICAgeworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIHByaW50ZigiTm8gZnJhbWUgY29kZWQuIENvbnRpbnVlIHRvIG5leHQgZnJhbWUuIik7CisjZW5kaWYKKyAgICAgICAgKm5MYXllciA9IC0xOworCisgICAgICAgIC8qIGV4cGVjdGVkIG5leHQgY29kZSB0aW1lLCBjb252ZXJ0IGJhY2sgdG8gbWlsbGlzZWMgKi8KKyAgICAgICAgKm5leHRNb2RUaW1lID0gdmlkZW8tPm5leHRNb2RUaW1lOzsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBWb2wgc3RyZWFtIHN0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIGJpdHN0cmVhbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gMDsKKyAgICBCaXRzdHJlYW1FbmNSZXNldChjdXJyVm9sLT5zdHJlYW0pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWT1MgYW5kIFZPTCBIZWFkZXJzIG9uIGZpcnN0IGNhbGwgZm9yIGVhY2ggbGF5ZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gMDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT50aW1lSW5jID0gMDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcHkgSW5wdXQgVmlkZW8gRnJhbWUgdG8gSW50ZXJuYWwgVmlkZW8gQnVmZmVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgV2lkdGggYW5kIEhlaWdodCBvZiBWb3AgTGF5ZXIgKi8KKworICAgIHdpZHRoID0gZW5jUGFyYW1zLT5MYXllcldpZHRoW2N1cnJMYXllcl07ICAgLyogR2V0IGlucHV0IHdpZHRoICovCisgICAgaGVpZ2h0ID0gZW5jUGFyYW1zLT5MYXllckhlaWdodFtjdXJyTGF5ZXJdOyAvKiBHZXQgaW5wdXQgaGVpZ2h0ICovCisgICAgLyogUm91bmQgVXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiA6IE1QRUctNCBTdGFuZGFyZCAqLworCisgICAgd2lkdGhfMTYgPSAoKHdpZHRoICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgICAgLyogUm91bmQgdXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiAqLworICAgIGhlaWdodF8xNiA9ICgoaGVpZ2h0ICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KKworICAgIHZpZGVvLT5pbnB1dCA9IHZpZF9pbjsgIC8qIHBvaW50IHRvIHRoZSBmcmFtZSBpbnB1dCAqLworCisgICAgLyovLyAgRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIFZPUCBUeXBlICAgICAgICAgICAgICAgICAqLworICAgIC8qIDYvMi8yMDAxLCBzZXBhcmF0ZSBmdW5jdGlvbiAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIERldGVybWluZVZvcFR5cGUodmlkZW8sIGN1cnJMYXllcik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICBJbml0aWFsaXplIFZPUCAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2aWRlby0+Y3VyclZvcC0+dm9sSUQgPSBjdXJyVm9sLT52b2xJRDsKKyAgICB2aWRlby0+Y3VyclZvcC0+d2lkdGggPSB3aWR0aF8xNjsKKyAgICB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0ID0gaGVpZ2h0XzE2OworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIC8qICAxMS8yOC8wNSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnBpdGNoID0gd2lkdGhfMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2ICsgMzI7CisgICAgfQorICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gY3VyclZvbC0+dGltZUluY3JlbWVudDsKKyAgICB2aWRlby0+Y3VyclZvcC0+dm9wQ29kZWQgPSAxOworICAgIHZpZGVvLT5jdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyID0gZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyOworCisgICAgaWYgKGN1cnJMYXllciA9PSAwCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgICAgICAgICB8fCByYW5kb21fdmFsW3JhbmRfaWR4XSB8fCB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdCisjZW5kaWYKKyAgICAgICApCisgICAgeworICAgICAgICB2aWRlby0+dGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCisgICAgICAgIGlmICh2aWRlby0+dGVtcEZvcndSZWZWb3AgIT0gTlVMTCkgdmlkZW8tPnRlbXBSZWZTZWxDb2RlID0gdmlkZW8tPnRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7CisgICAgfQorI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW8tPnRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICBpZiAodmlkZW8tPnRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHZpZGVvLT50ZW1wUmVmU2VsQ29kZSA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOworICAgIH0KKyAgICByYW5kX2lkeCsrOworICAgIHJhbmRfaWR4ICU9IDMwOworI2VuZGlmCisKKyAgICB2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZSA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JOdW1iZXIgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JGcmFtZUlEID0gdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbFJlZiA9ICgobW9kVGltZSkgKiAzMCAvIDEwMDEpICUgMjU2OworCisgICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsSW50ZXJ2YWwgPSAwOworCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtjdXJyTGF5ZXJdOworICAgIGVsc2UKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtjdXJyTGF5ZXJdOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFZvcCAgICovCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgdmlkZW8tPnNsaWNlX2NvZGluZyA9IDE7CisKKyAgICAvKnB2X3N0YXR1cyA9Ki8KKyAgICBFbmNvZGVWb3AodmlkZW8pOworCisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBwcmludGYoIiBJLVZPUCAiKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiIFAtVk9QIChyZWYuJWQpIiwgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUpOworI2VuZGlmCisKKyAgICAvKiBTZXQgSGludFRyYWNrIEluZm9ybWF0aW9uICovCisgICAgaWYgKGN1cnJWb2wtPnByZXZNb2R1bG9UaW1lQmFzZSkKKyAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMTsKKyAgICBlbHNlCisgICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLk1UQiA9IDA7CisKKyAgICB2aWRlby0+aGludFRyYWNrSW5mby5MYXllcklEID0gKFVDaGFyKWN1cnJWb2wtPnZvbElEOworICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLkNvZGVUeXBlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICB2aWRlby0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBOT19TTElDRV9FTkNPREUgKi8KKworI2lmbmRlZiBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZFbmNvZGVQYWNrZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBvbmUgcGFja2V0IGFuZCByZXR1cm4gYml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRW5jb2RlU2xpY2UoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVUNoYXIgKmJzdHJlYW0sIEludCAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICplbmRvZkZyYW1lLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsIFVMb25nICpuZXh0TW9kVGltZSkKK3sKKyAgICBQVl9TVEFUVVMgcHZfc3RhdHVzOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBWb2wgKmN1cnJWb2w7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIFZvcCAqdGVtcDsKKyAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgSW50IHByZV9za2lwOworICAgIEludCBwcmVfc2l6ZTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBWb2wgc3RyZWFtIHN0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIGJpdHN0cmVhbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgY3VyclZvbC0+c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBic3RyZWFtOworICAgIHByZV9zaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQ7CisgICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gcHJlX3NpemUgKyAoKnNpemUpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWT1MgYW5kIFZPTCBIZWFkZXJzIG9uIGZpcnN0IGNhbGwgZm9yIGVhY2ggbGF5ZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICB7CisgICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2N1cnJMYXllcl0pCisgICAgICAgICAgICBwdl9zdGF0dXMgPSBFbmNvZGVWT1NfU3RhcnQoZW5jQ3RybCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFNsaWNlICovCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgcHZfc3RhdHVzID0gRW5jb2RlU2xpY2UodmlkZW8pOworCisgICAgKmVuZG9mRnJhbWUgPSAwOworCisgICAgaWYgKHZpZGVvLT5tYm51bSA+PSBjdXJyVm9sLT5uVG90YWxNQiAmJiAhdmlkZW8tPmVuZF9vZl9idWYpCisgICAgeworICAgICAgICAqZW5kb2ZGcmFtZSA9IDE7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVXBkYXRlIFNraXAgTmV4dCBGcmFtZSAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcHJlX3NraXAgPSBVcGRhdGVTa2lwTmV4dEZyYW1lKHZpZGVvLCBuZXh0TW9kVGltZSwgc2l6ZSwgcHZfc3RhdHVzKTsgLyogbW9kaWZpZWQgc3VjaCB0aGF0IG5vIHByZS1za2lwcGVkICovCisKKyAgICAgICAgaWYgKHByZV9za2lwID09IC0xKSAvKiBlcnJvciAqLworICAgICAgICB7CisgICAgICAgICAgICAqZW5kb2ZGcmFtZSA9IC0xOworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgcG9pbnRlcnMgYXJlIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBzdGF0ZSAqLworICAgICAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnRlbXBGb3J3UmVmVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSB2aWRlby0+dGVtcFJlZlNlbENvZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBwdl9zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBJLVZPUCB3YXMgZW5jb2RlZCwgcmVzZXQgSW50cmFQZXJpb2QgKi8KKyAgICAgICAgaWYgKChjdXJyTGF5ZXIgPT0gMCkgJiYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPiAwKSAmJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKSkKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIENvcHkgUmVjb25zdHJ1Y3RlZCBCdWZmZXIgdG8gT3V0cHV0IFZpZGVvIEZyYW1lIEJ1ZmZlciAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgdmlkX291dC0+eUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47CisgICAgICAgIHZpZF9vdXQtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuOworICAgICAgICB2aWRfb3V0LT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT52Q2hhbjsKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodDsgLyogcGFkZGVkIGhlaWdodCAqLworICAgICAgICAgICAgdmlkX291dC0+cGl0Y2ggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7IC8qIHBhZGRlZCB3aWR0aCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodCArIDMyOyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aCArIDMyOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICAgICAgfQorICAgICAgICAvL3ZpZF9vdXQtPnRpbWVzdGFtcCA9IHZpZGVvLT5tb2RUaW1lOworICAgICAgICB2aWRfb3V0LT50aW1lc3RhbXAgPSAoVUxvbmcpKCgodmlkZW8tPnByZXZGcmFtZU51bVtjdXJyTGF5ZXJdICogMTAwMCkgLyBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2N1cnJMYXllcl0pICsgdmlkZW8tPm1vZFRpbWVSZWYgKyAwLjUpOworCisgICAgICAgIC8qLy8gRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIFN3YXAgVm9wIFBvaW50ZXJzIGZvciBCYXNlIExheWVyICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkJhc2VWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkJhc2VWb3A7IC8qIEZvciBQLVZvcCBiYXNlIG9ubHkgKi8KKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVXBkYXRlIE91cHV0IGJzdHJlYW0gYnl0ZSBjb3VudCAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICpzaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQgLSBwcmVfc2l6ZTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIE1vZGlmeSB0aGUgaW50aWFsaXplIGZsYWcgYXQgdGhlIGVuZC4qLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQorICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdID0gMDsKKworICAgIHJldHVybiBwdl9zdGF0dXM7Cit9CisjZW5kaWYgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEgyNjNQcm9maWxlTGV2ZWxJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDAyLzA1LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IEguMjYzIFByb2ZpbGUgSUQgYW5kIGxldmVsIElEIGZvciBwcm9maWxlIDAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBQcm9maWxlIElEPTAsIGxldmVsSUQgaXMgd2hhdCB3ZSB3YW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiBoMjYzTGV2ZWxbOF0sIHJCUl9ib3VuZFs4XSwgbWF4X2gyNjNfZnJhbWVyYXRlWzJdICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIG1heF9oMjYzX3dpZHRoWzJdLCBtYXhfaDI2M19oZWlnaHRbMl0gYXJlIGdsb2JhbCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0SDI2M1Byb2ZpbGVMZXZlbElEKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqcHJvZmlsZUlELCBJbnQgKmxldmVsSUQpCit7CisgICAgVmlkZW9FbmNEYXRhICplbmNEYXRhOworICAgIEludCB3aWR0aCwgaGVpZ2h0OworICAgIGZsb2F0IGJpdHJhdGVfciwgZnJhbWVyYXRlOworCisKKyAgICAvKiBGb3IgdGhpcyB2ZXJzaW9uLCB3ZSBvbmx5IHN1cHBvcnQgSC4yNjMgcHJvZmlsZSAwICovCisgICAgKnByb2ZpbGVJRCA9IDA7CisKKyAgICAqbGV2ZWxJRCA9IDA7CisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgaWYgKCFlbmNEYXRhLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkgcmV0dXJuIFBWX0ZBTFNFOworCisKKyAgICAvKiBnZXQgaW1hZ2Ugd2lkdGgsIGhlaWdodCwgYml0cmF0ZSBhbmQgZnJhbWVyYXRlICovCisgICAgd2lkdGggICAgID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllcldpZHRoWzBdOworICAgIGhlaWdodCAgICA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbMF07CisgICAgYml0cmF0ZV9yID0gKGZsb2F0KShlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVswXSkgLyAoZmxvYXQpNjQwMDAuMDsKKyAgICBmcmFtZXJhdGUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOworICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCAhKGJpdHJhdGVfciA+IDAgJiYgZnJhbWVyYXRlID4gMCkpIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qIFRoaXMgaXMgdGhlIG1vc3QgZnJlcXVlbnQgY2FzZSA6IGxldmVsIDEwICovCisgICAgaWYgKGJpdHJhdGVfciA8PSByQlJfYm91bmRbMV0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVswXSAmJgorICAgICAgICAgICAgKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzBdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMF0pKQorICAgIHsKKyAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbMV07CisgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChiaXRyYXRlX3IgPiByQlJfYm91bmRbNF0gfHwKKyAgICAgICAgICAgICAod2lkdGggPiBtYXhfaDI2M193aWR0aFsxXSB8fCBoZWlnaHQgPiBtYXhfaDI2M19oZWlnaHRbMV0pIHx8CisgICAgICAgICAgICAgZnJhbWVyYXRlID4gbWF4X2gyNjNfZnJhbWVyYXRlWzFdKSAgICAvKiBjaGVjayB0aGUgaGlnaGVzdCBsZXZlbCA3MCAqLworICAgIHsKKyAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbN107CisgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgIH0KKyAgICBlbHNlICAgLyogc2VhcmNoIGxldmVsIDIwLCAzMCwgNDAgKi8KKyAgICB7CisKKyAgICAgICAgLyogcGljayBvdXQgbGV2ZWwgMjAgKi8KKyAgICAgICAgaWYgKGJpdHJhdGVfciA8PSByQlJfYm91bmRbMl0gJiYKKyAgICAgICAgICAgICAgICAoKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzBdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMF0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVsxXSkgfHwKKyAgICAgICAgICAgICAgICAgKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzFdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMV0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVswXSkpKQorICAgICAgICB7CisgICAgICAgICAgICAqbGV2ZWxJRCA9IGgyNjNMZXZlbFsyXTsKKyAgICAgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvKiB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgYXJlIG9rLCBub3cgY2hvb3NlIGxldmVsIDMwIG9yIDQwICovCisgICAgICAgIHsKKyAgICAgICAgICAgICpsZXZlbElEID0gKGJpdHJhdGVfciA8PSByQlJfYm91bmRbM10gPyBoMjYzTGV2ZWxbM10gOiBoMjYzTGV2ZWxbNF0pOworICAgICAgICAgICAgcmV0dXJuIFBWX1RSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRNUEVHNFByb2ZpbGVMZXZlbElEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAyNi8wNi8yMDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCBNUEVHNCBMZXZlbCBhZnRlciBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogcHJvZmlsZV9sZXZlbCBhY2NvcmRpbmcgdG8gaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0TVBFRzRQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVfbGV2ZWwsIEludCBuTGF5ZXIpCit7CisgICAgVmlkZW9FbmNEYXRhKiB2aWRlbzsKKyAgICBJbnQgaTsKKworICAgIHZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAobkxheWVyID09IDApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID09IHByb2ZpbGVfbGV2ZWxfY29kZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcHJvZmlsZV9sZXZlbCA9IGk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMF0gPT0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwcm9maWxlX2xldmVsID0gaSArIFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUVuY0ZyYW1lUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIHRhcmdldCBmcmFtZSByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlICAgICovCisvKiAgICAgICAgICAgICBsYXllcihpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWVXBkYXRlRW5jRnJhbWVSYXRlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIGZsb2F0ICpmcmFtZVJhdGUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworICAgIEludCBpOy8vIG5Ub3RhbE1CLCBtYlBlclNlYzsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qIFVwZGF0ZSB0aGUgZnJhbWVyYXRlcyBmb3IgYWxsIHRoZSBsYXllcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworCisgICAgICAgIC8qIE5ldyBjaGVjazogZW5jb2RpbmcgZnJhbWVyYXRlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgICAgIC8vblRvdGFsTUIgPSAoKChlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbaV0rMTUpLzE2KSoxNikqKCgoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpXSsxNSkvMTYpKjE2KS8oMTYqMTYpOworICAgICAgICAvL21iUGVyU2VjID0gKEludCkoblRvdGFsTUIgKiBmcmFtZVJhdGVbaV0pOworICAgICAgICAvL2lmKG1iUGVyU2VjID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heE1ic1BlclNlY1tpXSkgcmV0dXJuIFBWX0ZBTFNFOworICAgICAgICBpZiAoZnJhbWVSYXRlW2ldID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVtpXSkgcmV0dXJuIFBWX0ZBTFNFOyAvKiBzZXQgYnkgdXNlcnMgb3IgcHJvZmlsZSAqLworCisgICAgICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBmcmFtZVJhdGVbaV07CisgICAgfQorCisgICAgcmV0dXJuIFJDX1VwZGF0ZUJYUkNQYXJhbXMoKHZvaWQqKSBlbmNEYXRhKTsKKworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWVXBkYXRlQml0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBVcGRhdGUgdGFyZ2V0IGJpdCByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlICAgICAgKi8KKy8qICAgICAgICAgICAgIGxheWVyKGlmIGFueSkgd2hpbGUgZW5jb2Rpbmcgb3BlcmF0aW9uIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZVcGRhdGVCaXRSYXRlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqYml0UmF0ZSkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisgICAgSW50IGk7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBVcGRhdGUgdGhlIGJpdHJhdGVzIGZvciBhbGwgdGhlIGxheWVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChiaXRSYXRlW2ldID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbaV0pIC8qIHNldCBieSB1c2VycyBvciBwcm9maWxlICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVtpXSA9IGJpdFJhdGVbaV07CisgICAgfQorCisgICAgcmV0dXJuIFJDX1VwZGF0ZUJYUkNQYXJhbXMoKHZvaWQqKSBlbmNEYXRhKTsKKworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZVZCVkRlbGF5KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8yMy8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIFZCViBidWZmZXIgc2l6ZShpbiBkZWxheSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitCb29sIFBWVXBkYXRlVkJWRGVsYXkoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgZmxvYXQgZGVsYXkpCit7CisKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisgICAgSW50IHRvdGFsX2JpdHJhdGUsIG1heF9idWZmZXJfc2l6ZTsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBkZWxheSBpcyB2YWxpZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcHJvZmlsZSAqLworICAgIHRvdGFsX2JpdHJhdGUgICA9IChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMSA/IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzBdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMV0pOworICAgIGluZGV4ID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4OworICAgIG1heF9idWZmZXJfc2l6ZSA9IChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMSA/IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSA6CisgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSk7CisKKyAgICBpZiAodG90YWxfYml0cmF0ZSpkZWxheSA+IChmbG9hdCltYXhfYnVmZmVyX3NpemUpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gZGVsYXk7CisgICAgcmV0dXJuIFBWX1RSVUU7CisKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUlGcmFtZUludGVydmFsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xMC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHVwZGF0ZXMgdGhlIElOVFJBIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwgd2hpbGUgZW5jb2RpbmcgICAgICAqLworLyogICAgICAgICAgICAgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVlVwZGF0ZUlGcmFtZUludGVydmFsKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCBhSUZyYW1lUGVyaW9kKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPSBhSUZyYW1lUGVyaW9kOworICAgIHJldHVybiBQVl9UUlVFOworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWU2V0TnVtSW50cmFNQlJlZnJlc2goKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMDUvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCAgICBQVlVwZGF0ZU51bUludHJhTUJSZWZyZXNoKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCBudW1NQikKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPlJlZnJlc2ggPSBudW1NQjsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWSUZyYW1lUmVxdWVzdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTAvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBlbmNvZGVzIHRoZSBuZXh0IGJhc2UgZnJhbWUgYXMgYW4gSS1Wb3AgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWSUZyYW1lUmVxdWVzdChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPm5leHRFbmNJVm9wID0gMTsKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEVuY01lbW9yeVVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzE3LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgSW50IFBWR2V0RW5jTWVtb3J5VXNhZ2UoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgcmV0dXJuIGVuY0RhdGEtPmVuY1BhcmFtcy0+TWVtb3J5VXNhZ2U7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEhpbnRUcmFjaygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldEhpbnRUcmFjayhWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBNUDRIaW50VHJhY2sgKmluZm8pCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGluZm8tPk1UQiA9IGVuY0RhdGEtPmhpbnRUcmFja0luZm8uTVRCOworICAgIGluZm8tPkxheWVySUQgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLkxheWVySUQ7CisgICAgaW5mby0+Q29kZVR5cGUgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLkNvZGVUeXBlOworICAgIGluZm8tPlJlZlNlbENvZGUgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLlJlZlNlbENvZGU7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldE1heFZpZGVvRnJhbWVTaXplKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDcvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRnVuY3Rpb24gbWVyZWx5IHJldHVybnMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldE1heFZpZGVvRnJhbWVTaXplKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqbWF4VmlkZW9GcmFtZVNpemUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisKKworICAgICptYXhWaWRlb0ZyYW1lU2l6ZSA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXTsKKworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMikKKyAgICAgICAgaWYgKCptYXhWaWRlb0ZyYW1lU2l6ZSA8IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSkKKyAgICAgICAgICAgICptYXhWaWRlb0ZyYW1lU2l6ZSA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXTsKKyAgICAqbWF4VmlkZW9GcmFtZVNpemUgPj49IDM7ICAgLyogQ29udmVydCB0byBCeXRlcyAqLworCisgICAgaWYgKCptYXhWaWRlb0ZyYW1lU2l6ZSA8PSA0MDAwKQorICAgICAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSA0MDAwOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0VkJWU2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xNS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGdW5jdGlvbiBtZXJlbHkgcmV0dXJucyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0VkJWU2l6ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKlZCVlNpemUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgKlZCVlNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF07CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcy0+bkxheWVycyA9PSAyKQorICAgICAgICAqVkJWU2l6ZSArPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV07CisKKyAgICByZXR1cm4gUFZfVFJVRTsKKworfQorI2VuZGlmCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVZPU19TdGFydCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGVzIHRoZSBWT1MsVk8sIGFuZCBWT0wgb3IgU2hvcnQgSGVhZGVycyAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworCisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWb2wgICAgICAgICAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgLy9pbnQgcHJvZmlsZV9sZXZlbD0weDAxOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDaGVjayBmb3Igc2hvcnRfdmlkZW9faGVhZGVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyID09IDEpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2hvcnQgVmlkZW8gSGVhZGVyIG9yIE00ViAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVmlzdWFsT2JqZWN0U2VxdWVuY2UgKCkqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMzIsIFNFU1NJT05fU1RBUlRfQ09ERSk7CisgICAgICAgIC8qICBEZXRlcm1pbmUgcHJvZmlsZV9sZXZlbCAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsW3ZpZGVvLT5jdXJyTGF5ZXJdKTsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBWaXN1YWxPYmplY3QoKSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMzIsIFZJU1VBTF9PQkpFQ1RfU1RBUlRfQ09ERSk7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7IC8qIHZpc3VhbCBvYmplY3QgaWRlbnRpZmllciAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgMHgwMSk7IC8qIHZpc3VhbCBvYmplY3QgVHlwZSA9PSAidmlkZW8gSUQiICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7IC8qIG5vIHZpZGVvIHNpZ25hbCB0eXBlICovCisKKyAgICAgICAgLyp0ZW1wICAgPSAqLworICAgICAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7CisKKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDI3LCBWT19TVEFSVF9DT0RFKTsvKiBieXRlIGFsaWduOiBzaG91bGQgYmUgMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCAweDAwKTsvKiAgVmlkZW8gSUQgPSAwICAqLworCisKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVmlkZW9PYmplY3RMYXllcigpICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlciA9PSAwKQorICAgICAgICB7IC8qIE00ViAgZWxzZSBTaG9ydCBWaWRlbyBIZWFkZXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgVk9MX1NUQVJUX0NPREVfTEVOR1RILCBWT0xfU1RBUlRfQ09ERSk7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgY3VyclZvbC0+dm9sSUQpOy8qICB2aWRlb19vYmplY3RfbGF5ZXJfaWQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7LyogIFJhbmRvbSBBY2Nlc3MgPSAwICAqLworCisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAweDAxKTsvKiBWaWRlbyBPYmplY3QgVHlwZSBJbmRpY2F0aW9uID0gMSAgLi4uIFNpbXBsZSBPYmplY3QgVHlwZSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAweDAyKTsvKiBWaWRlbyBPYmplY3QgVHlwZSBJbmRpY2F0aW9uID0gMiAgLi4uIFNpbXBsZSBTY2FsYWJsZSBPYmplY3QgVHlwZSAqLworCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qICBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmVyID0gMCAqLworCisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA0LCAweDAxKTsgLyogYXNwZWN0X3JhdGlvX2luZm8gPSAxIC4uLiAxOjEoU3F1YXJlKSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiB2b2xfY29udHJvbF9wYXJhbWV0ZXJzID0gMCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIDB4MDApOy8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IDAwIC4uLiByZWN0YW5ndWxhciAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDhCaXRzKHN0cmVhbSwgMTYsIGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKTsvKiB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmZpeGVkVm9wUmF0ZSk7LyogZml4ZWRfdm9wX3JhdGUgPSAwICovCisKKyAgICAgICAgICAgIC8qIEZvciBSZWN0YW5ndWxhciBWTyBsYXllciBzaGFwZSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDhCaXRzKHN0cmVhbSwgMTMsIGN1cnJWb2wtPndpZHRoKTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDEzLCBjdXJyVm9sLT5oZWlnaHQpOy8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyptYXJrZXIgYml0ICovCisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7LyppbnRlcmxhY2VkID0gMCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBvYm1jX2Rpc2FibGUgPSAxICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qIHNwcml0ZV9lbmFibGUgPSAwICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qIG5vdF84X2JpdCA9IDAgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+cXVhbnRUeXBlKTsvKiAgIHF1YW50X3R5cGUgKi8KKworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmxvYWRJbnRyYVF1YW50TWF0KTsgLyogSW50cmEgcXVhbnQgbWF0cml4ICovCisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWRJbnRyYVF1YW50TWF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNjM7IGogPj0gMTsgai0tKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraildICE9IGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2krai0xKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaiA9PSAxKSAmJiAoY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStqKV0gPT0gY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStqLTEpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGogKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStpKV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IDYzKQorICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJWb2wtPmlxbWF0W2pdID0gbXBlZ19pcW1hdF9kZWZbal07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5sb2FkTm9uSW50cmFRdWFudE1hdCk7IC8qIE5vbi1JbnRyYSBxdWFudCBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+bG9hZE5vbkludHJhUXVhbnRNYXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA2MzsgaiA+PSAxOyBqLS0pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2kraildICE9IGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2otMSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGogPT0gMSkgJiYgKGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2opXSA9PSBjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqLTEpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGogKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2kraSldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPCA2MykKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5uaXFtYXRbal0gPSBtcGVnX25xbWF0X2RlZltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7ICAgLyogY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAxICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPlJlc3luY01hcmtlckRpc2FibGUpOy8qIFJlc3luY19tYXJrZXJfZGlzYWJsZSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKTsvKiBEYXRhIHBhcnRpdGlvbmVkICovCisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+dXNlUmV2ZXJzZVZMQyk7IC8qIFJldmVyc2libGVfdmxjICovCisKKworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnNjYWxhYmlsaXR5KSAvKiBTY2FsYWJpbGl0eSovCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnNjYWxhYmlsaXR5KTsvKiBTY2FsYWJpbGl0eSA9IDEgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnNjYWxUeXBlKTsvKiBoaWVyYXJjaHkgX3R5cGUgLi4uIFNwYXRpYWw9IDAgYW5kIFRlbXBvcmFsID0gMSAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA0LCBjdXJyVm9sLT5yZWZWb2xJRCk7LyogcmVmX2xheWVyX2lkICAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+cmVmU2FtcERpcik7LyogcmVmX2xheWVyX3NhbXBsaW5nX2RpcmVjKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgY3VyclZvbC0+aG9yU2FtcF9uKTsvKmhvcl9zYW1wbGluZ19mYWN0b3JfbiovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPmhvclNhbXBfbSk7Lypob3Jfc2FtcGxpbmdfZmFjdG9yX20qLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT52ZXJTYW1wX24pOy8qdmVydF9zYW1wbGluZ19mYWN0b3JfbiovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPnZlclNhbXBfbSk7Lyp2ZXJ0X3NhbXBsaW5nX2ZhY3Rvcl9tKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmVuaGFuY2VtZW50VHlwZSk7LyogZW5oYW5jZW1lbnRfdHlwZSovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIE5vIFNjYWxhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsYWJpbGl0eSk7LyogU2NhbGFiaWxpdHkgPSAwICovCisKKyAgICAgICAgICAgIC8qdGVtcCA9ICovCisgICAgICAgICAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7IC8qIEJ5dGUgYWxpZ24gSGVhZGVycyBmb3IgVk9QICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFZPU19FbmQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBWaXN1YWwgT2JqZWN0IFNlcXVlbmNlIEVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBWT1NfRW5kKFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVm9sICAgICAgICAgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5zdHJlYW07CisKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCBTRVNTSU9OX0VORF9DT0RFLCAzMik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERldGVybWluZUNvZGluZ0xheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDYvMDIvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGaW5kIGxheWVyIHRvIGNvZGUgYmFzZWQgb24gY3VycmVudCBtb2QgdGltZSwgYXNzdW1pbmcgdGhhdAorICAgICAgICAgICAgICAgaXQncyB0aW1lIHRvIGVuY29kZSBlbmhhbmNlZCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IE51bWJlciBvZiBsYXllciB0byBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitJbnQgRGV0ZXJtaW5lQ29kaW5nTGF5ZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50ICpuTGF5ZXIsIFVMb25nIG1vZFRpbWUpCit7CisgICAgVm9sICoqdm9sID0gdmlkZW8tPnZvbDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgbnVtTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOworICAgIFVJbnQgbW9kVGltZVJlZiA9IHZpZGVvLT5tb2RUaW1lUmVmOworICAgIGZsb2F0ICpMYXllckZyYW1lUmF0ZSA9IGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGU7CisgICAgVUludCBmcmFtZU51bVs0XSwgZnJhbWVUaWNrOworICAgIFVMb25nIGZyYW1lTW9kVGltZSwgbmV4dEZybU1vZFRpbWU7CisjaWZkZWYgUkVEVUNFX0ZSQU1FX1ZBUklBTkNFICAgIC8qIFRvIGxpbWl0IGhvdyBjbG9zZSAyIGZyYW1lcyBjYW4gYmUgKi8KKyAgICBmbG9hdCBmcmFtZUludGVydmFsOworI2VuZGlmCisgICAgZmxvYXQgc3JjRnJhbWVJbnRlcnZhbDsKKyAgICBJbnQgZnJhbWVJbmM7CisgICAgSW50IGksIGV4dHJhX3NraXA7CisgICAgSW50IGVuY29kZVZvcCA9IDA7CisKKyAgICBpID0gbnVtTGF5ZXJzIC0gMTsKKworICAgIGlmIChtb2RUaW1lIC0gdmlkZW8tPm5leHRNb2RUaW1lID4gKChVTG9uZykoLTEpKSA+PiAxKSAvKiBuZXh0IHRpbWUgd3JhcHBlZCBhcm91bmQgKi8KKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vdCB0aW1lIHRvIGNvZGUgaXQgeWV0ICovCisKKyAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSAtPSAxMDAwOworICAgIHZpZGVvLT5uZXh0RW5jSVZvcC0tOyAgLyogbnVtYmVyIG9mIFZvcHMgaW4gaGlnaGVzdCBsYXllciByZXNvbHV0aW9uLiAqLworICAgIHZpZGVvLT5udW1Wb3BzSW5HT1ArKzsKKworICAgIC8qIGZyb20gdGhpcyBwb2ludCBmcmFtZU1vZFRpbWUgYW5kIG5leHRGcm1Nb2RUaW1lIGFyZSBpbnRlcm5hbCAqLworCisgICAgZnJhbWVOdW1baV0gPSAoVUludCkoKG1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIExheWVyRnJhbWVSYXRlW2ldICsgNTAwKSAvIDEwMDA7CisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2ldKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bVtpXSA9IGZyYW1lTnVtW2ldIC0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnJhbWVOdW1baV0gPD0gdmlkZW8tPnByZXZGcmFtZU51bVtpXSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAvKiBkbyBub3QgZW5jb2RlIHRoaXMgZnJhbWUgKi8KKyAgICB9CisKKyAgICAvKioqKiB0aGlzIHBhcnQgY29tcHV0ZXMgZXhwZWN0ZWQgbmV4dCBmcmFtZSAqKioqKioqLworICAgIGZyYW1lTW9kVGltZSA9IChVTG9uZykoKChmcmFtZU51bVtpXSAqIDEwMDApIC8gTGF5ZXJGcmFtZVJhdGVbaV0pICsgbW9kVGltZVJlZiArIDAuNSk7IC8qIHJlYy4gdGltZSAqLworICAgIG5leHRGcm1Nb2RUaW1lID0gKFVMb25nKSgoKChmcmFtZU51bVtpXSArIDEpICogMTAwMCkgLyBMYXllckZyYW1lUmF0ZVtpXSkgKyBtb2RUaW1lUmVmICsgMC41KTsgLyogcmVjLiB0aW1lICovCisKKyAgICBzcmNGcmFtZUludGVydmFsID0gMTAwMCAvIHZpZGVvLT5GcmFtZVJhdGU7CisKKyAgICB2aWRlby0+bmV4dE1vZFRpbWUgPSBuZXh0RnJtTW9kVGltZSAtIChVTG9uZykoc3JjRnJhbWVJbnRlcnZhbCAvIDIuKSAtIDE7IC8qIGJldHdlZW4gY3VycmVudCBhbmQgbmV4dCBmcmFtZSAqLworCisjaWZkZWYgUkVEVUNFX0ZSQU1FX1ZBUklBTkNFICAgIC8qIFRvIGxpbWl0IGhvdyBjbG9zZSAyIGZyYW1lcyBjYW4gYmUgKi8KKyAgICBmcmFtZUludGVydmFsID0gMTAwMCAvIExheWVyRnJhbWVSYXRlW2ldOyAvKiBuZXh0IHJlYy4gdGltZSAqLworICAgIGRlbHRhID0gKEludCkoZnJhbWVJbnRlcnZhbCAvIDQpOyAvKiBlbXBpcmljYWwgbnVtYmVyICovCisgICAgaWYgKHZpZGVvLT5uZXh0TW9kVGltZSAtIG1vZFRpbWUgIDwgKFVMb25nKWRlbHRhKSAvKiBuZWVkIHRvIG1vdmUgbmV4dE1vZFRpbWUgZnVydGhlci4gKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5uZXh0TW9kVGltZSArPSAoKGRlbHRhIC0gdmlkZW8tPm5leHRNb2RUaW1lICsgbW9kVGltZSkpOyAvKiBlbXBpcmljYWwgZm9ybXVsYSAgKi8KKyAgICB9CisjZW5kaWYKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIG1hcCBmcmFtZSBuby50byB0aWNrIGZyb20gbW9kVGltZVJlZiAqLworICAgIC8qZnJhbWVUaWNrID0gKGZyYW1lTnVtW2ldKnZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24pIDsKKyAgICBmcmFtZVRpY2sgPSAoVUludCkoKGZyYW1lVGljayArIChlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldLzIpKS9lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsqLworICAgIC8qICAxMS8xNi8wMSwgY2hhbmdlIGZyYW1lVGljayB0byBiZSB0aGUgY2xvc2VzdCB0aWNrIGZyb20gdGhlIGFjdHVhbCBtb2RUaW1lICovCisgICAgLyogIDEyLzEyLzAyLCBhZGQgKGRvdWJsZSkgdG8gcHJldmVudCBsYXJnZSBudW1iZXIgd3JhcC1hcm91bmQgKi8KKyAgICBmcmFtZVRpY2sgPSAoSW50KSgoKGRvdWJsZSkobW9kVGltZSAtIG1vZFRpbWVSZWYpICogdm9sW2ldLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiArIDUwMCkgLyAxMDAwKTsKKworICAgIC8qIGZpbmQgdGltZUluY3JlbWVudCB0byBiZSBwdXQgaW4gdGhlIGJpdHN0cmVhbSAqLworICAgIC8qIHJlZlRpY2sgaXMgc2Vjb25kIGJvdW5kYXJ5IHJlZmVyZW5jZS4gKi8KKyAgICB2b2xbaV0tPnRpbWVJbmNyZW1lbnQgPSBmcmFtZVRpY2sgLSB2aWRlby0+cmVmVGlja1tpXTsKKworCisgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSA9IDA7CisgICAgd2hpbGUgKHZvbFtpXS0+dGltZUluY3JlbWVudCA+PSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKQorICAgIHsKKyAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50IC09IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb247CisgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UrKzsKKyAgICAgICAgLyogZG8gbm90IHVwZGF0ZSByZWZUaWNrIGFuZCBtb2RUaW1lUmVmIHlldCwgZG8gaXQgYWZ0ZXIgZW5jb2RpbmchISAqLworICAgIH0KKworICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAwKSAgICAvKiBubyBza2lwcGluZyAqLworICAgIHsKKyAgICAgICAgZW5jb2RlVm9wID0gMTsKKyAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9ICpuTGF5ZXIgPSBpOworICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPSAxMDAwOworCisgICAgICAgIC8qIHRha2VzIGNhcmUgb2YgbW9yZSBkcm9wcGVkIGZyYW1lIHRoYW4gZXhwZWN0ZWQgKi8KKyAgICAgICAgZXh0cmFfc2tpcCA9IC0xOworICAgICAgICBmcmFtZUluYyA9IChmcmFtZU51bVtpXSAtIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pOworICAgICAgICBleHRyYV9za2lwICs9IGZyYW1lSW5jOworCisgICAgICAgIGlmIChleHRyYV9za2lwID4gMCkKKyAgICAgICAgeyAgIC8qIHVwZGF0ZSByYy0+TnIsIHJjLT5CLCAocmMtPlJyKSovCisgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgLT0gZXh0cmFfc2tpcDsKKyAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgKz0gZXh0cmFfc2tpcDsKKyAgICAgICAgICAgIGlmIChlbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSQ19VcGRhdGVCdWZmZXIodmlkZW8sIGksIGV4dHJhX3NraXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgLyogdXBkYXRlIGZyYW1lIG5vLiAqLworICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXTsKKworICAgIC8qIGdvIHRocm91Z2ggYWxsIGxvd2VyIGxheWVyICovCisgICAgZm9yIChpID0gKG51bUxheWVycyAtIDIpOyBpID49IDA7IGktLSkKKyAgICB7CisKKyAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gLT0gMTAwMDsKKworICAgICAgICAvKiBmaW5kIHRpbWVJbmNyZW1lbnQgdG8gYmUgcHV0IGluIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50ID0gZnJhbWVUaWNrIC0gdmlkZW8tPnJlZlRpY2tbaV07CisKKyAgICAgICAgaWYgKHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2ldIDw9IDApIC8qIHRpbWUgdG8gZW5jb2RlIGJhc2UgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogMTIvMjcvMDAgKi8KKyAgICAgICAgICAgIGVuY29kZVZvcCA9IDE7CisgICAgICAgICAgICB2aWRlby0+Y3VyckxheWVyID0gKm5MYXllciA9IGk7CisgICAgICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPQorICAgICAgICAgICAgICAgIChJbnQpKCgxMDAwLjAgKiBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW251bUxheWVycy0xXSkgLyBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsKKworICAgICAgICAgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodm9sW2ldLT50aW1lSW5jcmVtZW50ID49IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50IC09IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb247CisgICAgICAgICAgICAgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSsrOworICAgICAgICAgICAgICAgIC8qIGRvIG5vdCB1cGRhdGUgcmVmVGljayBhbmQgbW9kVGltZVJlZiB5ZXQsIGRvIGl0IGFmdGVyIGVuY29kaW5nISEgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdGFrZXMgY2FyZSBvZiBtb3JlIGRyb3BwZWQgZnJhbWUgdGhhbiBleHBlY3RlZCAqLworICAgICAgICAgICAgZnJhbWVOdW1baV0gPSAoVUludCkoKGZyYW1lTW9kVGltZSAtIG1vZFRpbWVSZWYpICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2ldKQorICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXSAtIDE7CisKKyAgICAgICAgICAgIGV4dHJhX3NraXAgPSAtMTsKKyAgICAgICAgICAgIGZyYW1lSW5jID0gKGZyYW1lTnVtW2ldIC0gdmlkZW8tPnByZXZGcmFtZU51bVtpXSk7CisgICAgICAgICAgICBleHRyYV9za2lwICs9IGZyYW1lSW5jOworCisgICAgICAgICAgICBpZiAoZXh0cmFfc2tpcCA+IDApCisgICAgICAgICAgICB7ICAgLyogdXBkYXRlIHJjLT5OciwgcmMtPkIsIChyYy0+UnIpKi8KKyAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSQ19VcGRhdGVCdWZmZXIodmlkZW8sIGksIGV4dHJhX3NraXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHVwZGF0ZSBmcmFtZSBuby4gKi8KKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgaWYgKGVuY29kZVZvcCkKKyAgICAgICAgcHJpbnRmKCIgVEk6ICVkICIsIHZvbFsqbkxheWVyXS0+dGltZUluY3JlbWVudCk7CisjZW5kaWYKKworICAgIHJldHVybiBlbmNvZGVWb3A7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGV0ZXJtaW5lVm9wVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNi8wMi8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRoZSBuYW1lIHNheXMgaXQgYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiB2b2lkIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBEZXRlcm1pbmVWb3BUeXBlKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpCit7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisvLyAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworCisgICAgaWYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gMCkgLyogSS1WT1BzIG9ubHkgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+Y3VyckxheWVyID4gMCkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgaWYgKHZpZGVvLT5udW1Wb3BzSW5HT1AgPj0gMTMyKQorICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gLTEpICAvKiBJUFBQUFAuLi4gKi8KKyAgICB7CisKKyAgICAgICAgLyogbWFpbnRhaW4gZnJhbWUgdHlwZSBpZiBwcmV2aW91cyBmcmFtZSBpcyBwcmUtc2tpcHBlZCwgMDYvMDIvMjAwMSAqLworICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EgfHwgdmlkZW8tPnJjW2N1cnJMYXllcl0tPnNraXBfbmV4dF9mcmFtZSAhPSAtMSkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworCisgICAgICAgIGlmICh2aWRlby0+Y3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgvKnZpZGVvLT5udW1Wb3BzSW5HT1A+PTEzMiB8fCAqL3ZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CisgICAgICAgICAgICAgICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7IC8qIGZvcmNlIElOVFJBIHVwZGF0ZSBldmVyeSAxMzIgYmFzZSBmcmFtZXMqLworICAgICAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+bmV4dEVuY0lWb3AgPT0gMCB8fCB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgLyogSW50cmFQZXJpb2Q+MCA6IElQUFBQUElQUFBQUEkuLi4gKi8KKyAgICB7CisKKyAgICAgICAgLyogbWFpbnRhaW4gZnJhbWUgdHlwZSBpZiBwcmV2aW91cyBmcmFtZSBpcyBwcmUtc2tpcHBlZCwgMDYvMDIvMjAwMSAqLworICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EgfHwgdmlkZW8tPnJjW2N1cnJMYXllcl0tPnNraXBfbmV4dF9mcmFtZSAhPSAtMSkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworCisgICAgICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5uZXh0RW5jSVZvcCA8PSAwIHx8IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBVcGRhdGVTa2lwTmV4dEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA2LzAyLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRnJvbSByYXRlIGNvbnRyb2wgZnJhbWUgc2tpcHBpbmcgZGVjaXNpb24sIHVwZGF0ZSB0aW1pbmcKKyAgICAgICAgICAgICAgICByZWxhdGVkIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBDdXJyZW50IGNvZGVkIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworSW50IFVwZGF0ZVNraXBOZXh0RnJhbWUoVmlkZW9FbmNEYXRhICp2aWRlbywgVUxvbmcgKm1vZFRpbWUsIEludCAqc2l6ZSwgUFZfU1RBVFVTIHN0YXR1cykKK3sKKyAgICBJbnQgY3VyckxheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBJbnQgbkxheWVyID0gY3VyckxheWVyOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIEludCBudW1MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIFZvbCAqKnZvbCA9IHZpZGVvLT52b2w7CisgICAgSW50IG51bV9za2lwLCBleHRyYV9za2lwOworICAgIEludCBpOworICAgIFVJbnQgbmV3UmVmVGljaywgZGVsdGFNb2RUaW1lOworICAgIFVJbnQgdGVtcDsKKworICAgIGlmIChlbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVswXSAmJiBjdXJyTGF5ZXIgPT0gMCkgIC8qIGFsd2F5cyBlbmNvZGUgdGhlIGZpcnN0IGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFJDX1Jlc2V0U2tpcE5leHRGcmFtZSh2aWRlbywgY3VyckxheWVyKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIGN1cnJMYXllcjsgIDA5LzE1LzA1CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkNfR2V0U2tpcE5leHRGcmFtZSh2aWRlbywgY3VyckxheWVyKSA8IDAgfHwgc3RhdHVzID09IFBWX0VORF9PRl9CVUYpICAgLyogU2tpcCBDdXJyZW50IEZyYW1lICovCisgICAgICAgICAgICB7CisKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgICAgICAgICAgICAgIHByaW50ZigiU2tpcCBjdXJyZW50IGZyYW1lIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSA9IGN1cnJWb2wtPnByZXZNb2R1bG9UaW1lQmFzZTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogcHJlcGFyZSB0byByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpzaXplID0gMDsgIC8qIFNldCBCaXRzdHJlYW0gYnVmZmVyIHRvIHplcm8gKi8KKworICAgICAgICAgICAgICAgIC8qIERldGVybWluZSBuTGF5ZXIgYW5kIG1vZFRpbWUgZm9yIG5leHQgZW5jb2RlICovCisKKyAgICAgICAgICAgICAgICAqbW9kVGltZSA9IHZpZGVvLT5uZXh0TW9kVGltZTsKKyAgICAgICAgICAgICAgICBuTGF5ZXIgPSAtMTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuTGF5ZXI7IC8qIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IHVwZGF0aW5nIFJlZlRpY2sgJiBtb2RUaW1lUmVmICovCisgICAgICAgICAgICAgICAgLyogSWYgSS1WT1Agd2FzIGF0dGVtcHRlZCwgdGhlbiBlbnN1cmUgbmV4dCBiYXNlIGlzIEktVk9QICovCisgICAgICAgICAgICAgICAgLyppZigoZW5jUGFyYW1zLT5JbnRyYVBlcmlvZD4wKSAmJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKSkKKyAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAwOyBjb21tZW50ZWQgb3V0IGJ5IDA2LzA1LzAxICovCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChudW1fc2tpcCA9IFJDX0dldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcikpID4gMCkKKyAgICAgICAgICAgIHsKKworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgICAgICAgICAgcHJpbnRmKCJTa2lwIG5leHQgJWQgZnJhbWVzIiwgbnVtX3NraXApOworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogdG8ga2VlcCB0aGUgTnIgb2YgZW5oIGxheWVyIHRoZSBzYW1lICovCisgICAgICAgICAgICAgICAgLyogYWRqdXN0IHJlbExheWVyQ29kZVRpbWUgb25seSwgZG8gbm90IGFkanVzdCBsYXllckNvZGVUaW1lW251bUxheWVycy0xXSAqLworICAgICAgICAgICAgICAgIGV4dHJhX3NraXAgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyTGF5ZXI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAxMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9za2lwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VyckxheWVyOyBpIDwgbnVtTGF5ZXJzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPSAobnVtX3NraXAgKyBleHRyYV9za2lwKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW50KSgoMTAwMC4wICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtudW1MYXllcnMtMV0pIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8qIGZpcnN0IGZyYW1lICovCisgICAgfQorICAgIC8qKioqKiAgY3VycmVudCBmcmFtZSBpcyBlbmNvZGVkLCBub3cgdXBkYXRlIHJlZlRpY2sgKioqKioqLworCisgICAgdmlkZW8tPnJlZlRpY2tbY3VyckxheWVyXSArPSB2b2xbY3VyckxheWVyXS0+cHJldk1vZHVsb1RpbWVCYXNlICogdm9sW2N1cnJMYXllcl0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOworCisgICAgLyogUmVzZXQgbGF5ZXJDb2RlVGltZSBldmVyeSBJLVZPUCB0byBwcmV2ZW50IG92ZXJmbG93ICovCisgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgIHsKKyAgICAgICAgLyogIDEyLzEyLzAyLCBmaXggZm9yIHdlaXJkIHRhcmdlciBmcmFtZSByYXRlIG9mIDkuOTkgZnBzIG9yIDMuMzMgZnBzICovCisgICAgICAgIGlmICgoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgIT0gMCkgLyomJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlPT1JX1ZPUCkqLykgfHwKKyAgICAgICAgICAgICAgICAoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gMCkgJiYgKHZpZGVvLT5udW1Wb3BzSW5HT1AgPT0gMCkpKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdSZWZUaWNrID0gdmlkZW8tPnJlZlRpY2tbMF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBudW1MYXllcnM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnJlZlRpY2tbaV0gPCBuZXdSZWZUaWNrKQorICAgICAgICAgICAgICAgICAgICBuZXdSZWZUaWNrID0gdmlkZW8tPnJlZlRpY2tbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB1cGRhdGUgaXMgaW50ZWdlciBtdWx0aXBsZSBvZiBmcmFtZSBudW1iZXIgKi8KKyAgICAgICAgICAgIC8qIGhvdyBtYW55IG1zZWMgZWxhcHNlZCBmcm9tIGxhc3QgbW9kVGltZVJlZiAqLworICAgICAgICAgICAgZGVsdGFNb2RUaW1lID0gKG5ld1JlZlRpY2sgLyB2b2xbMF0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSAqIDEwMDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IG51bUxheWVycyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAoVUludCkoZGVsdGFNb2RUaW1lICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7IC8qIDEyLzEyLzAyICovCisgICAgICAgICAgICAgICAgaWYgKHRlbXAgJSAxMDAwKQorICAgICAgICAgICAgICAgICAgICBuZXdSZWZUaWNrID0gMDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1JlZlRpY2sgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tb2RUaW1lUmVmICs9IGRlbHRhTW9kVGltZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBudW1MYXllcnMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gLT0gKFVJbnQpKGRlbHRhTW9kVGltZSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pIC8gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnJlZlRpY2tbaV0gLT0gbmV3UmVmVGljazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqbW9kVGltZSA9ICB2aWRlby0+bmV4dE1vZFRpbWU7CisKKyAgICByZXR1cm4gbkxheWVyOworfQorCisKKyNpZm5kZWYgT1JJR0lOQUxfVkVSU0lPTgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFNldFByb2ZpbGVfQnVmZmVyU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTZXQgcHJvZmlsZSBhbmQgdmlkZW8gYnVmZmVyIHNpemUsIGNvcGllZCBmcm9tIEppbSdzIGNvZGUgICAgKi8KKy8qICAgICAgICAgICAgIGluIFBWSW5pdFZpZGVvRW5jb2RlciguKSwgc2luY2Ugd2UgaGF2ZSBkaWZmZXJlbnQgcGxhY2VzICAgICAqLworLyogICAgICAgICAgICAgdG8gcmVzZXQgcHJvZmlsZSBhbmQgdmlkZW8gYnVmZmVyIHNpemUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitCb29sIFNldFByb2ZpbGVfQnVmZmVyU2l6ZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBmbG9hdCBkZWxheSwgSW50IGJJbml0aWFsaXplZCkKK3sKKyAgICBJbnQgaSwgaiwgc3RhcnQsIGVuZDsKKy8vICBJbnQgQmFzZU1Cc1BlclNlYyA9IDAsIEVuaE1Cc1BlclNlYyA9IDA7CisgICAgSW50IG5Ub3RhbE1CID0gMDsKKyAgICBJbnQgaWR4LCB0ZW1wX3csIHRlbXBfaCwgbWF4ID0gMCwgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0OworCisgICAgSW50IG5MYXllcnMgPSB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyAvKiBOdW1iZXIgb2YgTGF5ZXJzIHRvIGJlIGVuY29kZWQgKi8KKworICAgIEludCB0b3RhbF9iaXRyYXRlID0gMCwgYmFzZV9iaXRyYXRlOworICAgIEludCB0b3RhbF9wYWNrZXRfc2l6ZSA9IDAsIGJhc2VfcGFja2V0X3NpemU7CisgICAgSW50IHRvdGFsX01Cc1BlclNlYyA9IDAsIGJhc2VfTUJzUGVyU2VjOworICAgIEludCB0b3RhbF9WQlZfc2l6ZSA9IDAsIGJhc2VfVkJWX3NpemUsIGVuaGFuY2VfVkJWX3NpemUgPSAwOworICAgIGZsb2F0IHRvdGFsX2ZyYW1lcmF0ZSwgYmFzZV9mcmFtZXJhdGU7CisgICAgZmxvYXQgdXBwZXJfYm91bmRfcmF0aW87CisgICAgSW50IGJGb3VuZCA9IDA7CisgICAgSW50IGsgPSAwLCB3aWR0aDE2LCBoZWlnaHQxNiwgaW5kZXg7CisgICAgSW50IGxvd2VzdF9sZXZlbDsKKworI2RlZmluZSBNSU5fQlVGRiAgICAxNjAwMCAvKiAxNmsgbWluaW11bSBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBCVUZGX0NPTlNUICAyLjAgICAgLyogMjAwMG1zICovCisjZGVmaW5lIFVQUEVSX0JPVU5EX1JBVElPIDguNTQgLyogdXBwZXJfYm91bmQgPSAxLjQqKDEuMStib3VuZC8xMCkqYml0cmF0ZS9mcmFtZXJhdGUgKi8KKworI2RlZmluZSBRQ0lGX1dJRFRIICAxNzYKKyNkZWZpbmUgUUNJRl9IRUlHSFQgMTQ0CisKKyAgICBpbmRleCA9IHZpZGVvLT5lbmNQYXJhbXMtPnByb2ZpbGVfdGFibGVfaW5kZXg7CisKKyAgICAvKiBDYWxjdWxhdGUgIm5Ub3RhbE1CIiAqLworICAgIC8qIEZpbmQgdGhlIG1heGltdW0gd2lkdGgqaGVpZ2h0IGZvciBtZW1vcnkgYWxsb2NhdGlvbiBvZiB0aGUgVk9QcyAqLworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICB0ZW1wX3cgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllcldpZHRoW2lkeF07CisgICAgICAgIHRlbXBfaCA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0W2lkeF07CisKKyAgICAgICAgaWYgKCh0ZW1wX3cqdGVtcF9oKSA+IG1heCkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4ID0gdGVtcF93ICogdGVtcF9oOworICAgICAgICAgICAgbWF4X3dpZHRoID0gdGVtcF93OworICAgICAgICAgICAgbWF4X2hlaWdodCA9IHRlbXBfaDsKKyAgICAgICAgICAgIG5Ub3RhbE1CID0gKChtYXhfd2lkdGggKyAxNSkgPj4gNCkgKiAoKG1heF9oZWlnaHQgKyAxNSkgPj4gNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdXBwZXJfYm91bmRfcmF0aW8gPSAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfTE9XREVMQVkgPyAoZmxvYXQpNS4wIDogKGZsb2F0KVVQUEVSX0JPVU5EX1JBVElPKTsKKworCisgICAgLyogR2V0IHRoZSBiYXNpYyBpbmZvcm1hdGlvbjogYml0cmF0ZSwgcGFja2V0X3NpemUsIE1Ccy9zIGFuZCBWQlZfc2l6ZSAqLworICAgIGJhc2VfYml0cmF0ZSAgICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMF07CisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSAhPSAwKSAvKiB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCBtZWFucyBpdCBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgeworICAgICAgICBiYXNlX2JpdHJhdGUgICAgPSBQVl9NQVgoYmFzZV9iaXRyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0pOworICAgIH0KKyAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF07CisgICAgfQorCisgICAgYmFzZV9mcmFtZXJhdGUgICAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSAhPSAwKQorICAgIHsKKyAgICAgICAgYmFzZV9mcmFtZXJhdGUgID0gUFZfTUFYKGJhc2VfZnJhbWVyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSk7CisgICAgfQorICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCisgICAgeworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdIC8gblRvdGFsTUI7CisgICAgfQorCisgICAgYmFzZV9wYWNrZXRfc2l6ZSAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemU7CisgICAgYmFzZV9NQnNQZXJTZWMgICAgICA9IChJbnQpKGJhc2VfZnJhbWVyYXRlICogblRvdGFsTUIpOworICAgIGJhc2VfVkJWX3NpemUgICAgICAgPSBQVl9NQVgoKEludCkoYmFzZV9iaXRyYXRlICogZGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludCkodXBwZXJfYm91bmRfcmF0aW8gKiBiYXNlX2JpdHJhdGUgLyBiYXNlX2ZyYW1lcmF0ZSkpOworICAgIGJhc2VfVkJWX3NpemUgICAgICAgPSBQVl9NQVgoYmFzZV9WQlZfc2l6ZSwgTUlOX0JVRkYpOworCisgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplLCB3ZSdsbCBjbGlwIGl0ICovCisgICAgaWYgKGJhc2VfVkJWX3NpemUgPiBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs1XSkKKyAgICAgICAgYmFzZV9WQlZfc2l6ZSA9IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzVdOworCisKKyAgICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZ2l2ZW4gdGhlIG1heGltdW0gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKyAgICBpZiAobkxheWVycyA9PSAxICYmIGJhc2VfVkJWX3NpemUgPiBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgaWYgKG5MYXllcnMgPT0gMikKKyAgICB7CisgICAgICAgIHRvdGFsX2JpdHJhdGUgICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMV07CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxfYml0cmF0ZSAgID0gUFZfTUlOKHRvdGFsX2JpdHJhdGUsIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBpZiB0aGUgbWF4IGlzIG5vdCBzZXQsIHNldCBpdCB0byB0aGUgc3BlY2lmaWVkIHByb2ZpbGUvbGV2ZWwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICB0b3RhbF9mcmFtZXJhdGUgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbMV07CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0b3RhbF9mcmFtZXJhdGUgICAgID0gUFZfTUlOKHRvdGFsX2ZyYW1lcmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdID0gKGZsb2F0KXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpbmRleF0gLyBuVG90YWxNQjsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOworICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgID0gKEludCkodG90YWxfZnJhbWVyYXRlICogblRvdGFsTUIpOworCisgICAgICAgIGVuaGFuY2VfVkJWX3NpemUgICAgPSBQVl9NQVgoKEludCkoKHRvdGFsX2JpdHJhdGUgLSBiYXNlX2JpdHJhdGUpICogZGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnQpKHVwcGVyX2JvdW5kX3JhdGlvICogKHRvdGFsX2JpdHJhdGUgLSBiYXNlX2JpdHJhdGUpIC8gKHRvdGFsX2ZyYW1lcmF0ZSAtIGJhc2VfZnJhbWVyYXRlKSkpOworICAgICAgICBlbmhhbmNlX1ZCVl9zaXplICAgID0gUFZfTUFYKGVuaGFuY2VfVkJWX3NpemUsIE1JTl9CVUZGKTsKKworICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgID0gYmFzZV9WQlZfc2l6ZSArIGVuaGFuY2VfVkJWX3NpemU7CisKKyAgICAgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplLCB3ZSdsbCBjbGlwIGl0ICovCisgICAgICAgIGlmICh0b3RhbF9WQlZfc2l6ZSA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzZdKQorICAgICAgICB7CisgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSA9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzZdOworICAgICAgICAgICAgZW5oYW5jZV9WQlZfc2l6ZSA9IHRvdGFsX1ZCVl9zaXplIC0gYmFzZV9WQlZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBidWZmZXIgZXhjZWVkcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSBnaXZlbiB0aGUgbWF4aW11bSBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgICAgICBpZiAodG90YWxfVkJWX3NpemUgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyAgICBpZiAoIWJJbml0aWFsaXplZCkgLyogSGFzIGJlZW4gaW5pdGlhbGl6ZWQgLS0+IHByb2ZpbGUgQCBsZXZlbCBoYXMgYmVlbiBmaWd1cmVkIG91dCEgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPSBiYXNlX1ZCVl9zaXplOworICAgICAgICBpZiAobkxheWVycyA+IDEpCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdID0gZW5oYW5jZV9WQlZfc2l6ZTsKKworICAgICAgICByZXR1cm4gUFZfVFJVRTsKKyAgICB9CisKKworICAgIC8qIFByb2ZpbGUgQCBsZXZlbCBkZXRlcm1pbmF0aW9uICovCisgICAgaWYgKG5MYXllcnMgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEJBU0UgT05MWSA6IFNpbXBsZSBQcm9maWxlKFNQKSBPciBDb3JlIFByb2ZpbGUoQ1ApICovCisgICAgICAgIGlmIChiYXNlX2JpdHJhdGUgICAgID4gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0gICAgIHx8CisgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSA+IHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2luZGV4XSB8fAorICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgPiBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdICAgfHwKKyAgICAgICAgICAgICAgICBiYXNlX1ZCVl9zaXplICAgID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQorCisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIEJleW9uZCB0aGUgYm91bmQgb2YgQ29yZSBQcm9maWxlIEAgTGV2ZWwyICovCisKKyAgICAgICAgLyogRm9yIEgyNjMvU2hvcnQgaGVhZGVyLCBkZXRlcm1pbmUgayoxNjM4NCAqLworICAgICAgICB3aWR0aDE2ICA9ICgodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFswXSArIDE1KSA+PiA0KSA8PCA0OworICAgICAgICBoZWlnaHQxNiA9ICgodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbMF0gKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgayA9IDQ7CisgICAgICAgICAgICBpZiAod2lkdGgxNiAgPT0gMipRQ0lGX1dJRFRIICYmIGhlaWdodDE2ID09IDIqUUNJRl9IRUlHSFQpICAvKiBDSUYgKi8KKyAgICAgICAgICAgICAgICBrID0gMTY7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoMTYgID09IDQqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSA0KlFDSUZfSEVJR0hUKSAgLyogNENJRiAqLworICAgICAgICAgICAgICAgIGsgPSAzMjsKKworICAgICAgICAgICAgZWxzZSBpZiAod2lkdGgxNiAgPT0gOCpRQ0lGX1dJRFRIICYmIGhlaWdodDE2ID09IDgqUUNJRl9IRUlHSFQpICAvKiAxNkNJRiAqLworICAgICAgICAgICAgICAgIGsgPSA2NDsKKworICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplICA9IGsgKiAxNjM4NDsKKworICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZSB0b3AgcHJvZmlsZSBhbmQgbGV2ZWw6IHRoZSBDb3JlIHByb2ZpbGUgYW5kIGxldmVsIDIgKi8KKyAgICAgICAgICAgIGlmIChiYXNlX1ZCVl9zaXplID4gKEludCkoayoxNjM4NCArIDQqKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbNV0qMTAwMS4wIC8gMzAwMDAuMCkpCisgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSA9IChJbnQpKGsgKiAxNjM4NCArIDQgKiAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVs1XSAqIDEwMDEuMCAvIDMwMDAwLjApOworCisgICAgICAgICAgICBpZiAoYmFzZV9WQlZfc2l6ZSA+IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2luZGV4XSoxMDAxLjAgLyAzMDAwMC4wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZWFyY2ggdGhlIGFwcHJvcHJpYXRlIHByb2ZpbGVAbGV2ZWwgaW5kZXggKi8KKyAgICAgICAgaWYgKCF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAodmlkZW8tPmVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociAhPSAwIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlNlYXJjaFJhbmdlID4gMTYpKQorICAgICAgICB7CisgICAgICAgICAgICBsb3dlc3RfbGV2ZWwgPSAxOyAvKiBjYW5ub3QgYWxsb3cgU1BMMCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG93ZXN0X2xldmVsID0gMDsgLyogU1BMMCAqLworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gbG93ZXN0X2xldmVsOyBpIDw9IGluZGV4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDQgJiYgLyogc2tpcCBDb3JlIFByb2ZpbGVATGV2ZWwxIGJlY2F1c2UgdGhlIHBhcmFtZXRlcnMgaW4gaXQgYXJlIHNtYWxsZXIgdGhhbiB0aG9zZSBpbiBTaW1wbGUgUHJvZmlsZUBMZXZlbDMgKi8KKyAgICAgICAgICAgICAgICAgICAgYmFzZV9iaXRyYXRlICAgICA8PSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldICAgICAmJgorICAgICAgICAgICAgICAgICAgICBiYXNlX3BhY2tldF9zaXplIDw9IHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2ldICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2ldICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICA8PSAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkID8gKEludCkoayoxNjM4NCArIDQqKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0qMTAwMS4wIC8gMzAwMDAuMCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpXSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPiBpbmRleCkgcmV0dXJuIFBWX0ZBTFNFOyAvKiBOb3RoaW5nIGZvdW5kISEgKi8KKworICAgICAgICAvKiBGb3VuZCBvdXQgdGhlIGFjdHVhbCBwcm9maWxlIEAgbGV2ZWwgOiBpbmRleCAiaSIgKi8KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yIFNpbXBsZSBQcm9maWxlIEAgTGV2ZWwgMCwgd2UgbmVlZCB0byBkbyBvbmUgbW9yZSBjaGVjazogaW1hZ2Ugc2l6ZSA8PSBRQ0lGICovCisgICAgICAgICAgICBpZiAod2lkdGgxNiA+IFFDSUZfV0lEVEggfHwgaGVpZ2h0MTYgPiBRQ0lGX0hFSUdIVCkKKyAgICAgICAgICAgICAgICBpID0gMTsgLyogaW1hZ2Ugc2l6ZSA+IFFDSUYsIHRoZW4gc2V0IFNQIGxldmVsMSAqLworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID0gcHJvZmlsZV9sZXZlbF9jb2RlW2ldOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdICAgPSBiYXNlX1ZCVl9zaXplOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV07CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzBdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IFBWX01JTigzMCwgKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAvIG5Ub3RhbE1CKTsKKworICAgICAgICAvKiBGb3IgSDI2My9TaG9ydCBoZWFkZXIsIG9uZSBzcGVjaWFsIGNvbnN0cmFpbnQgZm9yIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSA9IChJbnQpKGsgKiAxNjM4NCArIDQgKiAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAqIDEwMDEuMCAvIDMwMDAwLjApOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNDQUxBQkFMRSBNT0RFOiBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZShTU1ApIE9yIENvcmUgU2NhbGFibGUgUHJvZmlsZShDU1ApICovCisKKyAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2luZGV4XSAgICAgfHwKKyAgICAgICAgICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbaW5kZXhdIHx8CisgICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpbmRleF0gICB8fAorICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsgLyogQmV5b25kIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCisKKyAgICAgICAgLyogT25lLXRpbWUgY2hlY2s6IFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlIG9yIENvcmUgU2NhbGFibGUgUHJvZmlsZSAqLworICAgICAgICBpZiAodG90YWxfYml0cmF0ZSAgICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzJdICAgICAgICAmJgorICAgICAgICAgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbMl0gICAgJiYKKyAgICAgICAgICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1syXSAgICAgICYmCisgICAgICAgICAgICAgICAgdG90YWxfVkJWX3NpemUgICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVsyXSkKKworICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBlbmQgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnQgPSA0OworICAgICAgICAgICAgZW5kID0gaW5kZXg7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIFNlYXJjaCB0aGUgc2NhbGFibGUgcHJvZmlsZSAqLworICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfcGFja2V0X3NpemUgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpXSAmJgorICAgICAgICAgICAgICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAgICYmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaV0pCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IGVuZCkgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgICAgIC8qIFNlYXJjaCB0aGUgYmFzZSBwcm9maWxlICovCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgYkZvdW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICBiRm91bmQgPSAwOworCisgICAgICAgIGZvciAoaiA9IHN0YXJ0OyAhYkZvdW5kICYmIGogPD0gaTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmFzZV9iaXRyYXRlICAgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2pdICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSAgICA8PSBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtqXSAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9NQnNQZXJTZWMgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbal0gICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtqXSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJGb3VuZCkgLy8gJiYgc3RhcnQgPT0gNCkKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsgLyogbWlzLW1hdGNoIGluIHRoZSBwcm9maWxlcyBiZXR3ZWVuIGJhc2UgbGF5ZXIgYW5kIGVuaGFuY2VtZW50IGxheWVyICovCisKKyAgICAgICAgLyogaiBmb3IgYmFzZSBsYXllciwgaSBmb3IgZW5oYW5jZW1lbnQgbGF5ZXIgKi8KKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID0gcHJvZmlsZV9sZXZlbF9jb2RlW2pdOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMV0gPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX2NvZGVbaV07CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gICA9IGJhc2VfVkJWX3NpemU7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV0gICA9IGVuaGFuY2VfVkJWX3NpemU7CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtqXTsKKworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0gPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSBQVl9NSU4oMzAsIChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbal0gLyBuVG90YWxNQik7CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IFBWX01JTigzMCwgKGZsb2F0KXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAvIG5Ub3RhbE1CKTsKKworCisgICAgfSAvKiBlbmQgb2Y6IGlmKG5MYXllcnMgPT0gMSkgKi8KKworCisgICAgaWYgKCF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgKHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9PSAweDA4KSkgLyogU1BMMCByZXN0cmljdGlvbiovCisgICAgeworICAgICAgICAvKiBQViBvbmx5IGFsbG93IGZyYW1lLWJhc2VkIHJhdGUgY29udHJvbCwgbm8gUVAgY2hhbmdlIGZyb20gb25lIE1CIHRvIGFub3RoZXIKKyAgICAgICAgaWYodmlkZW8tPmVuY1BhcmFtcy0+QUNEQ1ByZWRpY3Rpb24gPT0gVFJVRSAmJiBNQi1iYXNlZCByYXRlIGNvbnRyb2wpCisgICAgICAgICByZXR1cm4gUFZfRkFMU0UgKi8KKyAgICB9CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgT1JJR0lOQUxfVkVSU0lPTiAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTM1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfbGliLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9NUDRFTkNfTElCX0hfCisjZGVmaW5lIF9NUDRFTkNfTElCX0hfCisKKyNpbmNsdWRlICJtcDRkZWYuaCIgICAgIC8vIHR5cGVkZWYKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiIC8vIG1haW4gdmlkZW8gc3RydWN0dXJlCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgICAvKiBkZWZpbmVkIGluIHZvcC5jICovCisgICAgUFZfU1RBVFVTIEVuY29kZVZvcChWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgRW5jb2RlU2xpY2UoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIEVuY29kZVZpZGVvUGFja2V0SGVhZGVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGludCBNQl9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFudF9zY2FsZSwgSW50IGluc2VydCk7CisjaWZkZWYgQUxMT1dfVk9QX05PVF9DT0RFRAorICAgIFBWX1NUQVRVUyBFbmNvZGVWb3BOb3RDb2RlZChWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqYnN0cmVhbSwgSW50ICpzaXplLCBVTG9uZyBtb2RUaW1lKTsKKyNlbmRpZgorCisgICAgLyogZGVmaW5lZCBpbiBjb21iaW5lZF9kZWNvZGUuYyAqLworICAgIFBWX1NUQVRVUyBFbmNvZGVGcmFtZUNvbWJpbmVkTW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisKKyAgICAvKiBkZWZpbmVkIGluIGRhdGFwYXJ0X2RlY29kZS5jICovCisgICAgUFZfU1RBVFVTIEVuY29kZUZyYW1lRGF0YVBhcnRNb2RlKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworICAgIFBWX1NUQVRVUyBFbmNvZGVTbGljZURhdGFQYXJ0TW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKworICAgIC8qIGRlZmluZWQgaW4gZmFzdGNvZGVNQi5jICovCisKKy8vdm9pZCBtNHZfbWVtc2V0KHZvaWQgKmFkcl9kc3QsIHVpbnQ4IHZhbHVlLCB1aW50MzIgc2l6ZSk7CisKKyAgICBQVl9TVEFUVVMgQ29kZU1CX0gyNjMoVmlkZW9FbmNEYXRhICp2aWRlbywgYXBwcm94RENUICpmdW5jdGlvbiwgSW50IG9mZnNldFFQLCBJbnQgbmNvZWZibGNrW10pOworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgUFZfU1RBVFVTIENvZGVNQl9NUEVHKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGFwcHJveERDVCAqZnVuY3Rpb24sIEludCBvZmZzZXRRUCwgSW50IG5jb2VmYmxja1tdKTsKKyNlbmRpZgorICAgIEludCBnZXRCbG9ja1NBVihTaG9ydCBibG9ja1tdKTsKKyAgICBJbnQgU2FkOHg4KFVDaGFyICpyZWMsIFVDaGFyICpwcmV2LCBJbnQgbHgpOworICAgIEludCBnZXRCbG9ja1N1bShVQ2hhciAqcmVjLCBJbnQgbHgpOworCisgICAgLyogZGVmaW5lZCBpbiBkY3QuYyAqLworICAgIHZvaWQgIGJsb2NrSWRjdChTaG9ydCAqYmxvY2spOworICAgIHZvaWQgYmxvY2tJZGN0X1NTRShTaG9ydCAqaW5wdXQpOworICAgIHZvaWQgQmxvY2tEQ1RFbmMoU2hvcnQgKmJsb2NrRGF0YSwgU2hvcnQgKmJsb2NrQ29lZmYpOworCisgICAgLyotLS0tIEZhc3RRdWFudC5jIC0tLS0tKi8KKyAgICBJbnQgY2FsX2RjX3NjYWxlckVOQyhJbnQgUVAsIEludCB0eXBlKSA7CisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0ludGVyKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIEludCBjb21wLCBJbnQgZHVtbXksIFVDaGFyIHNob3J0SGVhZGVyKTsKKworICAgIEludCBCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRyYShTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlciwgVUNoYXIgc2hvcnRIZWFkZXIpOworCisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0RDSW50ZXIoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZHVtbXksIFVDaGFyIHNob3J0SGVhZGVyKTsKKworICAgIEludCBCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGRjX3NjYWxlciwgVUNoYXIgc2hvcnRIZWFkZXIpOworCisjaWZuZGVmIE5PX01QRUdfUVVBTlQKKyAgICBJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHSW50ZXIoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBEY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcik7CisKKyAgICBJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBEY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcik7CisKKyAgICBJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHRENJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZHVtbXkpOworCisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0RDSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGRjX3NjYWxlcik7CisjZW5kaWYKKworICAgIC8qLS0tLSBGYXN0SURDVC5jIC0tLS0tKi8KKyAgICB2b2lkIEJsb2NrSURDVE1vdGlvbkNvbXAoU2hvcnQgKmJsb2NrLCBVQ2hhciAqYml0bWFwY29sLCBVQ2hhciBiaXRtYXByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4X2ludHJhX3plcm9NVik7CisKKworICAgIC8qIGRlZmluZWQgaW4gbW90aW9uX2NvbXAuYyAqLworICAgIHZvaWQgZ2V0TW90aW9uQ29tcGVuc2F0ZWRNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgaW5kX3gsIEludCBpbmRfeSwgSW50IG9mZnNldCk7CisgICAgdm9pZCBFbmNQcmVkaWN0aW9uX0lOVEVSKEludCB4cHJlZCwgSW50IHlwcmVkLCBVQ2hhciAqY19wcmV2LCBVQ2hhciAqY19yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCB3aWR0aCwgSW50IHJvdW5kMSk7CisKKyAgICB2b2lkIEVuY1ByZWRpY3Rpb25fSU5URVI0VihJbnQgeHByZWQsIEludCB5cHJlZCwgTU9UICptb3QsIFVDaGFyICpjX3ByZXYsIFVDaGFyICpjX3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgd2lkdGgsIEludCByb3VuZDEpOworCisgICAgdm9pZCBFbmNQcmVkaWN0aW9uX0Nocm9tKEludCB4cHJlZCwgSW50IHlwcmVkLCBVQ2hhciAqY3VfcHJldiwgVUNoYXIgKmN2X3ByZXYsIFVDaGFyICpjdV9yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpjdl9yZWMsIEludCBwaXRjaF91diwgSW50IHdpZHRoX3V2LCBJbnQgaGVpZ2h0X3V2LCBJbnQgcm91bmQxKTsKKworICAgIHZvaWQgZ2V0X01CKFVDaGFyICpjX3ByZXYsIFVDaGFyICpjX3ByZXZfdSAgLCBVQ2hhciAqY19wcmV2X3YsCisgICAgICAgICAgICAgICAgU2hvcnQgbWJbNl1bNjRdLCBJbnQgd2lkdGgsIEludCB3aWR0aF91dik7CisKKyAgICB2b2lkIFB1dFNraXBwZWRCbG9jayhVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKworICAgIC8qIGRlZmluZWQgaW4gbW90aW9uX2VzdC5jICovCisgICAgdm9pZCBNb3Rpb25Fc3RpbWF0aW9uKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworI2lmZGVmIEhURk0KKyAgICB2b2lkIEluaXRIVEZNKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEhURk1fU3RhdCAqaHRmbV9zdGF0LCBkb3VibGUgKm5ld3ZhciwgSW50ICpjb2xsZWN0KTsKKyAgICB2b2lkIFVwZGF0ZUhURk0oVmlkZW9FbmNEYXRhICp2aWRlbywgZG91YmxlICpuZXd2YXIsIGRvdWJsZSAqZXhwX2xhbWRhLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCk7CisjZW5kaWYKKworICAgIC8qIGRlZmluZWQgaW4gTUVfdXRpbHMuYyAqLworICAgIHZvaWQgQ2hvb3NlTW9kZV9DKFVDaGFyICpNb2RlLCBVQ2hhciAqY3VyLCBJbnQgbHgsIEludCBtaW5fU0FEKTsKKyAgICB2b2lkIENob29zZU1vZGVfTU1YKFVDaGFyICpNb2RlLCBVQ2hhciAqY3VyLCBJbnQgbHgsIEludCBtaW5fU0FEKTsKKyAgICB2b2lkIEdldEhhbGZQZWxNQlJlZ2lvbl9DKFVDaGFyICpjYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4KTsKKyAgICB2b2lkIEdldEhhbGZQZWxNQlJlZ2lvbl9TU0UoVUNoYXIgKmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgpOworICAgIHZvaWQgR2V0SGFsZlBlbEJsa1JlZ2lvbihVQ2hhciAqY2FuZCwgVUNoYXIgKmhtZW0sIEludCBseCk7CisgICAgdm9pZCBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7CisgICAgdm9pZCBDb21wdXRlTUJTdW1fQyhVQ2hhciAqY3VyLCBJbnQgbHgsIE1PVCAqbW90X21iKTsKKyAgICB2b2lkIENvbXB1dGVNQlN1bV9NTVgoVUNoYXIgKmN1ciwgSW50IGx4LCBNT1QgKm1vdF9tYik7CisgICAgdm9pZCBDb21wdXRlTUJTdW1fU1NFKFVDaGFyICpjdXIsIEludCBseCwgTU9UICptb3RfbWIpOworICAgIHZvaWQgR2V0SGFsZlBlbE1CUmVnaW9uUGFkZGluZyhVQ2hhciAqbmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgsIEludCAqcmVwdGwpOworICAgIHZvaWQgR2V0SGFsZlBlbEJsa1JlZ2lvblBhZGRpbmcoVUNoYXIgKm5jYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4LCBJbnQgKnJlcHRsKTsKKworICAgIC8qIGRlZmluZWQgaW4gZmluZGhhbGZwZWwuYyAqLworICAgIHZvaWQgRmluZEhhbGZQZWxNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyLCBNT1QgKm1vdCwgVUNoYXIgKm5jYW5kLAorICAgICAgICAgICAgICAgICAgICAgICBJbnQgeHBvcywgSW50IHlwb3MsIEludCAqeGhtaW4sIEludCAqeWhtaW4sIEludCBocF9ndWVzcyk7CisgICAgSW50ICBGaW5kSGFsZlBlbEJsayhWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyLCBNT1QgKm1vdCwgSW50IHNhZDE2LCBVQ2hhciAqbmNhbmQ4W10sCisgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqbW9kZSwgSW50IHhwb3MsIEludCB5cG9zLCBJbnQgKnhobWluLCBJbnQgKnlobWluLCBVQ2hhciAqaHBfbWVtKTsKKworCisgICAgLyogZGVmaW5lZCBpbiBzYWQuYyAqLworICAgIEludCBTQURfTUJfSGFsZlBlbF9DeGh5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IYWxmUGVsX0N5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IYWxmUGVsX0N4aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IYWxmUGVsX01NWChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IYWxmUGVsX1NTRShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9CbGtfSGFsZlBlbF9DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIEludCByeCwgSW50IHhoLCBJbnQgeWgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfQmxrX0hhbGZQZWxfTU1YKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfQmxrX0hhbGZQZWxfU1NFKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTWFjcm9ibG9ja19DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01hY3JvYmxvY2tfTU1YKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01hY3JvYmxvY2tfU1NFKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX0Jsb2NrX0MoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9CbG9ja19NTVgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9CbG9ja19TU0UoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisKKyNpZmRlZiBIVEZNIC8qIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nICovCisgICAgSW50IFNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX0hQX0hURk14aHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX0hQX0hURk15aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IUF9IVEZNeGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSFRGTV9Db2xsZWN0KFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX0hURk0oVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworI2VuZGlmCisgICAgLyogb24tdGhlLWZseSBwYWRkaW5nICovCisgICAgSW50IFNBRF9CbGtfUEFERElORyhVQ2hhciAqcmVmLCBVQ2hhciAqY3VyLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX1BBRERJTkcoVUNoYXIgKnJlZiwgVUNoYXIgKmN1ciwgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisjaWZkZWYgSFRGTQorICAgIEludCBTQURfTUJfUEFERElOR19IVEZNX0NvbGxlY3QoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9QQURESU5HX0hURk0oVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisjZW5kaWYKKworICAgIC8qIGRlZmluZWQgaW4gcmF0ZV9jb250cm9sLmMgKi8KKyAgICAvKiBUaGVzZSBhcmUgQVBJcyB0byByYXRlIGNvbnRyb2wgZXhwb3NlZCB0byBjb3JlIGVuY29kZXIgbW9kdWxlLiAqLworICAgIFBWX1NUQVRVUyBSQ19Jbml0aWFsaXplKHZvaWQgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgUkNfVm9wUVBTZXR0aW5nKFZpZGVvRW5jRGF0YSAqdmlkZW8sIHJhdGVDb250cm9sICpyY1tdKTsKKyAgICBQVl9TVEFUVVMgUkNfVm9wVXBkYXRlU3RhdChWaWRlb0VuY0RhdGEgKnZpZGVvLCByYXRlQ29udHJvbCAqcmMpOworICAgIFBWX1NUQVRVUyBSQ19NQlFQU2V0dGluZyhWaWRlb0VuY0RhdGEgKnZpZGVvLCByYXRlQ29udHJvbCAqcmMsIEludCBzdGFydF9wYWNrZXRfaGVhZGVyKTsKKyAgICBQVl9TVEFUVVMgUkNfTUJVcGRhdGVTdGF0KFZpZGVvRW5jRGF0YSAqdmlkZW8sIHJhdGVDb250cm9sICpyYywgSW50IEJpLCBJbnQgSGkpOworICAgIFBWX1NUQVRVUyBSQ19DbGVhbnVwKHJhdGVDb250cm9sICpyY1tdLCBJbnQgbnVtTGF5ZXJzKTsKKworICAgIEludCAgICAgICBSQ19HZXRTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpOworICAgIEludCAgICAgICBSQ19HZXRSZW1haW5pbmdWb3BzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpOworICAgIHZvaWQgICAgICBSQ19SZXNldFNraXBOZXh0RnJhbWUoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllcik7CisgICAgUFZfU1RBVFVTIFJDX1VwZGF0ZUJ1ZmZlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyLCBJbnQgbnVtX3NraXApOworICAgIFBWX1NUQVRVUyBSQ19VcGRhdGVCWFJDUGFyYW1zKHZvaWQgKmlucHV0KTsKKworCisgICAgLyogZGVmaW5lZCBpbiB2bGNfZW5jb2RlLmMgKi8KKyAgICB2b2lkIE1CVmxjRW5jb2RlRGF0YVBhcl9JX1ZPUChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgbmNvZWZibGNrW10sIHZvaWQgKmJsa0NvZGVQdHIpOworICAgIHZvaWQgTUJWbGNFbmNvZGVEYXRhUGFyX1BfVk9QKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBuY29lZmJsY2tbXSwgdm9pZCAqYmxrQ29kZVB0cik7CisgICAgdm9pZCBNQlZsY0VuY29kZUNvbWJpbmVkX0lfVk9QKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBuY29lZmJsY2tbXSwgdm9pZCAqYmxrQ29kZVB0cik7CisgICAgdm9pZCBNQlZsY0VuY29kZUNvbWJpbmVkX1BfVk9QKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBuY29lZmJsY2tbXSwgdm9pZCAqYmxrQ29kZVB0cik7CisgICAgdm9pZCBCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcihSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIEludCBqX3N0b3AsIFVDaGFyIE1vZGUpOworICAgIHZvaWQgQmxvY2tDb2RlQ29lZmZfUlZMQyhSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIEludCBqX3N0b3AsIFVDaGFyIE1vZGUpOworICAgIHZvaWQgQmxvY2tDb2RlQ29lZmZfTm9ybWFsKFJ1bkxldmVsQmxvY2sgKlJMQiwgQml0c3RyZWFtRW5jVmlkZW8gKmJzLCBJbnQgal9zdGFydCwgSW50IGpfc3RvcCwgVUNoYXIgTW9kZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVA0RU5DX0xJQl9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjOTQyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGxpYl9pbnQuaApAQCAtMCwwICsxLDQ3MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfTVA0TElCX0lOVF9IXworI2RlZmluZSBfTVA0TElCX0lOVF9IXworCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorI2luY2x1ZGUgInJhdGVfY29udHJvbC5oIgorCisvKiBCaXRzdHJlYW1FbmNWaWRlbyB3aWxsIGJlIG1vZGlmaWVkICovCit0eXBlZGVmIHN0cnVjdCB0YWdCaXRzdHJlYW0KK3sKKyAgICBJbnQoKndyaXRlVmlkZW9QYWNrZXQpKFVDaGFyICpidWYsIEludCBuYnl0ZXNfcmVxdWlyZWQpOyAgIC8qd3JpdGUgdmlkZW8gcGFja2V0IG91dCAqLworICAgIFVDaGFyICpiaXRzdHJlYW1CdWZmZXI7IC8qYnVmZmVyIHRvIGhvbGQgb25lIHZpZGVvIHBhY2tldCovCisgICAgSW50IGJ1ZmZlclNpemU7IC8qdG90YWwgYml0c3RyZWFtIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisgICAgSW50IGJ5dGVDb3VudDsgIC8qaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSBlbmNvZGVkKi8KKyAgICBVSW50IHdvcmQ7ICAgICAgLypob2xkIG9uZSB3b3JkIHRlbXBvcmFyaWx5ICovCisgICAgSW50IGJpdExlZnQ7ICAgIC8qbnVtYmVyIG9mIGJpdHMgbGVmdCBpbiAid29yZCIgKi8KKyAgICBVQ2hhciogb3ZlcnJ1bkJ1ZmZlcjsgIC8qIHBvaW50ZXIgdG8gb3ZlcnJ1biBidWZmZXIgKi8KKyAgICBJbnQgb0JTaXplOyAgICAgLyogbGVuZ3RoIG9mIG92ZXJydW4gYnVmZmVyICovCisgICAgc3RydWN0IHRhZ1ZpZGVvRW5jRGF0YSAqdmlkZW87Cit9IEJpdHN0cmVhbUVuY1ZpZGVvOworCit0eXBlZGVmIHN0cnVjdCB0YWdWT1AKK3sKKyAgICBQSVhFTCAgICp5Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFkgY29tcG9uZW50ICovCisgICAgUElYRUwgICAqdUNoYW47ICAgICAgICAgICAgIC8qIFRoZSBVIGNvbXBvbmVudCAqLworICAgIFBJWEVMICAgKnZDaGFuOyAgICAgICAgICAgICAvKiBUaGUgViBjb21wb25lbnQgKi8KKyAgICBJbnQgICAgIGZyYW1lOyAgICAgICAgICAgICAgLyogZnJhbWUgbnVtYmVyICovCisgICAgSW50ICAgICB2b2xJRDsgICAgICAgICAgICAgIC8qIExheWVyIG51bWJlciAqLworICAgIC8vSW50ICAgICAgIHRpbWVTdGFtcDsgICAgICAgICAgLyogVm9wIFRpbWVTdGFtcCBpbiBtc2VjICovCisKKyAgICAvKiBTeW50YXggZWxlbWVudHMgY29waWVkIGZyb20gVk9MIChzdGFuZGFyZCkgKi8KKyAgICBJbnQgICAgIHdpZHRoOyAgICAgICAgICAgICAgLyogV2lkdGggKG11bHRpcGxlIG9mIDE2KSAqLworICAgIEludCAgICAgaGVpZ2h0OyAgICAgICAgICAgICAvKiBIZWlnaHQgKG11bHRpcGxlIG9mIDE2KSAqLworICAgIEludCAgICAgcGl0Y2g7ICAgICAgICAgICAgICAvKiBQaXRjaCAoZGlmZmVycyBmcm9tIHdpZHRoIGZvciBVTVYgY2FzZSkgKi8KKyAgICBJbnQgICAgIHBhZGRlZDsgICAgIC8qIGZsYWcgd2hldGhlciB0aGlzIGZyYW1lIGhhcyBiZWVuIHBhZGRlZCAqLworCisgICAgLyogQWN0dWFsIHN5bnRheCBlbGVtZW50cyBmb3IgVk9QIChzdGFuZGFyZCkgKi8KKyAgICBJbnQgICAgIHByZWRpY3Rpb25UeXBlOyAgICAgLyogVk9QIHByZWRpY3Rpb24gdHlwZSAqLworICAgIEludCAgICAgdGltZUluYzsgICAgICAgICAgICAvKiBWT1AgdGltZSBpbmNyZW1lbnQgKHJlbGF0aXZlIHRvIGxhc3QgbXRiKSAqLworICAgIEludCAgICAgdm9wQ29kZWQ7CisgICAgSW50ICAgICByb3VuZGluZ1R5cGU7CisgICAgSW50ICAgICBpbnRyYURDVmxjVGhyOworICAgIEludCAgICAgcXVhbnRpemVyOyAgICAgICAgICAvKiBWT1AgcXVhbnRpemVyICovCisgICAgSW50ICAgICBmY29kZUZvcndhcmQ7ICAgICAgIC8qIFZPUCBkeW5hbWljIHJhbmdlIG9mIG1vdGlvbiB2ZWN0b3JzICovCisgICAgSW50ICAgICBmY29kZUJhY2t3YXJkOyAgICAgIC8qIFZPUCBkeW5hbWljIHJhbmdlIG9mIG1vdGlvbiB2ZWN0b3JzICovCisgICAgSW50ICAgICByZWZTZWxlY3RDb2RlOyAgICAgIC8qIGVuaGFuY2VtZW50IGxheWVyIHJlZmVyZW5jZSBzZWxlY3QgY29kZSAqLworCisgICAgLyogSC4yNjMgcGFyYW1ldGVycyAqLworICAgIEludCAgICAgZ29iTnVtYmVyOworICAgIEludCAgICAgZ29iRnJhbWVJRDsKKyAgICBJbnQgICAgIHRlbXBvcmFsUmVmOyAgICAgICAgLyogdGVtcG9yYWwgcmVmZXJlbmNlLCByb2xsIG92ZXIgYXQgMjU2ICovCisgICAgSW50ICAgICB0ZW1wb3JhbEludGVydmFsOyAgIC8qIGluY3JlYXNlIGV2ZXJ5IDI1NiB0ZW1wb3JhbFJlZiAqLworCit9IFZvcDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVm9sCit7CisgICAgSW50ICAgICB2b2xJRDsgICAgICAgICAgICAgIC8qIFZPTCBpZGVudGlmaWVyIChmb3IgdHJhY2tpbmcpICovCisgICAgSW50ICAgICBzaG9ydFZpZGVvSGVhZGVyOyAgIC8qIHNob3J0VmlkZW9IZWFkZXIgbW9kZSAqLworICAgIEludCAgICAgR09WU3RhcnQ7ICAgICAgICAgICAvKiBJbnNlcnQgR09WIEhlYWRlciAqLworICAgIEludCAgICAgdGltZUluY3JlbWVudFJlc29sdXRpb247ICAgIC8qIFZPTCB0aW1lIGluY3JlbWVudCAqLworICAgIEludCAgICAgbmJpdHNUaW1lSW5jUmVzOyAgICAvKiBudW1iZXIgb2YgYml0cyBmb3IgdGltZSBpbmNyZW1lbnQgKi8KKyAgICBJbnQgICAgIHRpbWVJbmNyZW1lbnQ7ICAgICAgLyogdGltZSBpbmNyZW1lbnQgKi8KKyAgICBJbnQgICAgIG1vZHVsb1RpbWVCYXNlOyAgICAgLyogaW50ZXJuYWwgZGVjb2RlciBjbG9jayAqLworICAgIEludCAgICAgcHJldk1vZHVsb1RpbWVCYXNlOyAvKiBpbiBjYXNlIG9mIHByZS1mcmFtZXNraXAgKi8KKworICAgIEludCAgICAgZml4ZWRWb3BSYXRlOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICAqc3RyZWFtOyAvKiBsaWJyYXJ5IGJpdHN0cmVhbSBidWZmZXIgKGlucHV0IGJ1ZmZlcikgKi8KKworICAgIC8qIFZPTCBEaW1lbnNpb25zICovCisgICAgSW50ICAgICB3aWR0aDsgICAgICAgICAgICAgIC8qIFdpZHRoICovCisgICAgSW50ICAgICBoZWlnaHQ7ICAgICAgICAgICAgIC8qIEhlaWdodCAqLworCisgICAgLyogRXJyb3IgUmVzaWxpZW5jZSBGbGFncyAqLworICAgIEludCAgICAgUmVzeW5jTWFya2VyRGlzYWJsZTsgLyogVk9MIERpc2FibGUgUmVzeW5jaCBNYXJrZXJzICovCisgICAgSW50ICAgICB1c2VSZXZlcnNlVkxDOyAgICAgIC8qIFZPTCByZXZlcnNpYmxlIFZMQ3MgKi8KKyAgICBJbnQgICAgIGRhdGFQYXJ0aXRpb25pbmc7ICAgLyogVk9MIGRhdGEgcGFydGl0aW9uaW5nICovCisKKyAgICAvKiBRdWFudGl6YXRpb24gcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgSW50ICAgICBxdWFudFByZWNpc2lvbjsgICAgIC8qIFF1YW50aXplciBwcmVjaXNpb24gKi8KKyAgICBJbnQgICAgIHF1YW50VHlwZTsgICAgICAgICAgLyogTVBFRy00IG9yIEguMjYzIFF1YW50aXphdGlvbiBUeXBlICovCisKKyAgICAvKiBBZGRlZCBsb2FkZWQgcXVhbnQgbWF0LCAwNS8yMi8yMDAwICovCisgICAgSW50ICAgICBsb2FkSW50cmFRdWFudE1hdDsgICAgICAvKiBMb2FkIGludHJhIHF1YW50aXphdGlvbiBtYXRyaXggKi8KKyAgICBJbnQgICAgIGxvYWROb25JbnRyYVF1YW50TWF0OyAgIC8qIExvYWQgbm9uaW50cmEgcXVhbnRpemF0aW9uIG1hdHJpeCAqLworICAgIEludCAgICAgaXFtYXRbNjRdOyAgICAgICAgICAvKiBJbnRyYSBxdWFudC5tYXRyaXggKi8KKyAgICBJbnQgICAgIG5pcW1hdFs2NF07ICAgICAgICAgLyogTm9uLWludHJhIHF1YW50Lm1hdHJpeCAqLworCisKKyAgICAvKiBQYXJhbWV0ZXJzIHVzZWQgZm9yIHNjYWxhYmlsaXR5ICovCisgICAgSW50ICAgICBzY2FsYWJpbGl0eTsgICAgICAgIC8qIFZPTCBzY2FsYWJpbGl0eSAoZmxhZykgKi8KKyAgICBJbnQgICAgIHNjYWxUeXBlOyAgICAgICAgICAgLyogdGVtcG9yYWwgPSAwLCBzcGF0aWFsID0gMSwgYm90aCA9IDIgKi8KKworICAgIEludCAgICAgcmVmVm9sSUQ7ICAgICAgICAgICAvKiBWT0wgaWQgb2YgcmVmZXJlbmNlIFZPTCAqLworICAgIEludCAgICAgcmVmU2FtcERpcjsgICAgICAgICAvKiBWT0wgcmVzb2wuIG9mIHJlZi4gVk9MICovCisgICAgSW50ICAgICBob3JTYW1wX247ICAgICAgICAgIC8qIFZPTCBob3IuIHJlc2FtcGxpbmcgb2YgcmVmLiBWT0wgZ2l2ZW4gYnkgKi8KKyAgICBJbnQgICAgIGhvclNhbXBfbTsgICAgICAgICAgLyogc2FtcGZhYyA9IGhvcl9zYW1wX24vaG9yX3NhbXBfbSAgICAgICovCisgICAgSW50ICAgICB2ZXJTYW1wX247ICAgICAgICAgIC8qIFZPTCB2ZXIuIHJlc2FtcGxpbmcgb2YgcmVmLiBWT0wgZ2l2ZW4gYnkgKi8KKyAgICBJbnQgICAgIHZlclNhbXBfbTsgICAgICAgICAgLyogc2FtcGZhYyA9IHZlcl9zYW1wX24vdmVyX3NhbXBfbSAgICAgICovCisgICAgSW50ICAgICBlbmhhbmNlbWVudFR5cGU7ICAgIC8qIFZPTCB0eXBlIG9mIGVuaGFuY2VtZW50IGxheWVyICovCisKKyAgICAvKiBUaGVzZSB2YXJpYWJsZXMgd2VyZSBhZGRlZCBzaW5jZSB0aGV5IGFyZSB1c2VkIGEgbG90LiAqLworICAgIEludCAgICAgbk1CUGVyUm93LCBuTUJQZXJDb2w7ICAgLyogbnVtYmVyIG9mIE1CcyBpbiBlYWNoIHJvdyAmIGNvbHVtbiAgICAqLworICAgIEludCAgICAgblRvdGFsTUI7CisgICAgSW50ICAgICBuQml0c0Zvck1CSUQ7ICAgICAgICAgICAvKiBob3cgbWFueSBiaXRzIHJlcXVpcmVkIGZvciBNQiBudW1iZXI/ICovCisKKyAgICAvKiBmb3Igc2hvcnQgdmlkZW8gaGVhZGVyICovCisgICAgSW50ICAgICBuTUJpbkdPQjsgICAgICAgICAgIC8qIG51bWJlciBvZiBNQnMgaW4gR09CLCAwNS8yMi8wMCAqLworICAgIEludCAgICAgbkdPQmluVm9wOyAgICAgICAgICAvKiBudW1iZXIgb2YgR09CIGluIFZvcCAgMDUvMjIvMDAgKi8KK30gVm9sOworCit0eXBlZGVmIHN0cnVjdCB0YWdNYWNyb0Jsb2NrCit7CisgICAgSW50ICAgICBtYl94OyAgICAgICAgICAgICAgIC8qIFggY29vcmRpbmF0ZSAqLworICAgIEludCAgICAgbWJfeTsgICAgICAgICAgICAgICAvKiBZIGNvb3JkaW5hdGUgKi8KKyAgICBTaG9ydCAgIGJsb2NrWzldWzY0XTsgICAgICAgLyogNC1ZLCBVIGFuZCBWIGJsb2NrcyAsIGFuZCBBQU4gU2NhbGUqLworfSBNYWNyb0Jsb2NrOworCit0eXBlZGVmIHN0cnVjdCB0YWdSdW5MZXZlbEJsb2NrCit7CisgICAgSW50IHJ1bls2NF07ICAgICAgICAvKiBSdW5sZW5ndGggKi8KKyAgICBJbnQgbGV2ZWxbNjRdOyAgICAgIC8qIEFicyhsZXZlbCkgKi8KKyAgICBJbnQgc1s2NF07ICAgICAgICAgIC8qIHNpZ24gbGV2ZWwgKi8KK30gUnVuTGV2ZWxCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnSGVhZGVySW5mb0RlY1ZpZGVvCit7CisgICAgVUNoYXIgICAgICAgKk1vZGU7ICAgICAgICAgICAgICAvKiBNb2RlcyBJTlRSQS9JTlRFUi9ldGMuICovCisgICAgVUNoYXIgICAgICAgKkNCUDsgICAgICAgICAgICAgICAvKiBNQ0JQQy9DQlBZIHN0dWZmICovCit9IEhlYWRlckluZm9FbmNWaWRlbzsKKwordHlwZWRlZiBTaG9ydCB0eXBlRENTdG9yZVs2XTsgICAvKiBBQ0RDICovCit0eXBlZGVmIFNob3J0IHR5cGVEQ0FDU3RvcmVbNF1bOF07CisKK3R5cGVkZWYgc3RydWN0IHRhZ01PVAoreworICAgIEludCB4OyAgLyogaGFsZi1wZWwgcmVzb2x1dGlvbiB4IGNvbXBvbmVudCAqLworICAgIEludCB5OyAgICAgIC8qIGhhbGYtcGVsIHJlc29sdXRpb24geSBjb21wb25lbnQgKi8KKyAgICBJbnQgc2FkOyAgLyogU0FEICovCit9IE1PVDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnSGludFRyYWNrSW5mbworeworICAgIFVDaGFyIE1UQjsKKyAgICBVQ2hhciBMYXllcklEOworICAgIFVDaGFyIENvZGVUeXBlOworICAgIFVDaGFyIFJlZlNlbENvZGU7CisKK30gSGludFRyYWNrSW5mbzsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdWaWRlb0VuY1BhcmFtcworeworICAgIC8vSW50ICAgICAgIFdpZHRoOyAgICAgICAgICAgICAgICAgIC8qIElucHV0IFdpZHRoICovCisgICAgLy9JbnQgICAgICAgSGVpZ2h0OyAgICAgICAgICAgICAgICAgLyogSW5wdXQgSGVpZ2h0ICovCisgICAgLy9mbG9hdCBGcmFtZVJhdGU7ICAgICAgICAgICAgICAvKiBJbnB1dCBGcmFtZSBSYXRlICovCisgICAgVUludCAgICBUaW1lSW5jcmVtZW50UmVzOyAgICAgICAvKiB0aW1lSW5jcmVtZW50UmVzICovCisKKyAgICAvKlZPTCBQYXJhbWV0ZXJzICovCisgICAgSW50ICAgICBuTGF5ZXJzOworICAgIEludCAgICAgTGF5ZXJXaWR0aFs0XTsgICAgICAgICAgLyogRW5jb2RlZCBXaWR0aCAqLworICAgIEludCAgICAgTGF5ZXJIZWlnaHRbNF07ICAgICAgICAgLyogRW5jb2RlZCBIZWlnaHQgKi8KKyAgICBmbG9hdCAgIExheWVyRnJhbWVSYXRlWzRdOyAgICAgIC8qIEVuY29kZWQgRnJhbWUgUmF0ZSAqLworICAgIEludCAgICAgTGF5ZXJCaXRSYXRlWzRdOyAgICAgICAgLyogRW5jb2RlZCBCaXRSYXRlICovCisgICAgSW50ICAgICBMYXllck1heEJpdFJhdGVbNF07ICAgICAvKiBNYXhpbXVtIEVuY29kZWQgQml0UmF0ZSAqLworICAgIGZsb2F0ICAgTGF5ZXJNYXhGcmFtZVJhdGVbNF07ICAgLyogTWF4aW11bSBFbmNvZGVkIEZyYW1lIFJhdGUgKi8KKyAgICBJbnQgICAgIExheWVyTWF4TWJzUGVyU2VjWzRdOyAgIC8qIE1heGltdW0gbWJzIHBlciBzZWNvbmQsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgSW50ICAgICBMYXllck1heEJ1ZmZlclNpemVbNF07ICAvKiBNYXhpbXVtIGJ1ZmZlciBzaXplLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlIGFuZCBsZXZlbCAqLworCisgICAgQm9vbCAgICBSZXN5bmNNYXJrZXJEaXNhYmxlOyAgICAvKiBEaXNhYmxlIFJlc3luYyBNYXJrZXIgKi8KKyAgICBCb29sICAgIERhdGFQYXJ0aXRpb25pbmc7ICAgICAgIC8qIEJhc2UgTGF5ZXIgRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyAgICBCb29sICAgIFJldmVyc2libGVWTEM7ICAgICAgICAgIC8qIFJWTEMgd2hlbiBEYXRhIFBhcnRpdGlvbmluZyAqLworICAgIEJvb2wgICAgQUNEQ1ByZWRpY3Rpb247ICAgICAgICAgLyogQUMvREMgUHJlZGljdGlvbiAgICAqLworICAgIEludCAgICAgUXVhbnRUeXBlWzRdOyAgICAgICAgICAgLyogSDI2MywgTVBFRzIgKi8KKyAgICBJbnQgICAgIEluaXRRdWFudEJ2b3BbNF07CisgICAgSW50ICAgICBJbml0UXVhbnRQdm9wWzRdOworICAgIEludCAgICAgSW5pdFF1YW50SXZvcFs0XTsKKyAgICBJbnQgICAgIFJlc3luY1BhY2tldHNpemU7CisKKyAgICBJbnQgICAgIFJvdW5kaW5nVHlwZTsKKyAgICBJbnQgICAgIEludHJhRENWbGNUaHI7CisKKyAgICAvKiBSYXRlIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIE1QNFJhdGVDb250cm9sVHlwZSAgUkNfVHlwZTsgICAgICAgIC8qQ29uc3RhbnQgUSwgTTQgY29uc3RhbnRSYXRlLCBWTTUrLCBNNFJDLE1QRUcyVE01ICovCisKKyAgICAvKiBJbnRyYSBSZWZyZXNoIFBhcmFtZXRlcnMgKi8KKyAgICBJbnQgICAgIEludHJhUGVyaW9kOyAgICAgICAgICAgIC8qIEludHJhIHVwZGF0ZSBwZXJpb2QgKi8KKyAgICBJbnQgICAgIFJlZnJlc2g7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBNQnMgcmVmcmVzaCBpbiBlYWNoIGZyYW1lICovCisgICAgLyogT3RoZXIgUGFyYW1ldGVycyAqLworICAgIEJvb2wgICAgU2NlbmVDaGFuZ2VfRGV0OyAgICAgICAgLyogc2NlbmUgY2hhbmdlIGRldGVjdGlvbiAqLworICAgIEJvb2wgICAgRmluZUZyYW1lU2tpcF9FbmFibGVkOyAgLyogc3JjIHJhdGUgcmVzb2x1dGlvbiBmcmFtZSBza2lwcGluZyAqLworICAgIEJvb2wgICAgVkJSX0VuYWJsZWQ7ICAgICAgICAgICAgLyogVkJSIHJhdGUgY29udHJvbCAqLworICAgIEJvb2wgICAgTm9GcmFtZVNraXBfRW5hYmxlZDsgICAgLyogZG8gbm90IGFsbG93IGZyYW1lIHNraXAgKi8KKyAgICBCb29sICAgIE5vUHJlU2tpcF9FbmFibGVkOyAgICAgIC8qIGRvIG5vdCBhbGxvdyBwcmUtc2tpcCAqLworCisgICAgQm9vbCAgICBIMjYzX0VuYWJsZWQ7ICAgICAgICAgICAvKiBIMjYzIFNob3J0IEhlYWRlciAqLworICAgIEJvb2wgICAgR09WX0VuYWJsZWQ7ICAgICAgICAgICAgLyogR09WIEhlYWRlciBFbmFibGVkICovCisgICAgQm9vbCAgICBTZXF1ZW5jZVN0YXJ0Q29kZTsgICAgICAvKiBUaGlzIHByb2JhYmx5IHNob3VsZCBiZSByZW1vdmVkICovCisgICAgQm9vbCAgICBGdWxsU2VhcmNoX0VuYWJsZWQ7ICAgICAvKiBmdWxsLXBlbCBleGhhdXN0aXZlIHNlYXJjaCBtb3Rpb24gZXN0aW1hdGlvbiAqLworICAgIEJvb2wgICAgSGFsZlBlbF9FbmFibGVkOyAgICAgICAgLyogVHVybiBIYWxmcGVsIE1FIG9uIG9yIG9mZiAqLworICAgIEJvb2wgICAgTVY4eDhfRW5hYmxlZDsgICAgICAgICAgLyogRW5hYmxlIDh4OCBtb3Rpb24gdmVjdG9ycyAqLworICAgIEJvb2wgICAgUkRfb3B0X0VuYWJsZWQ7ICAgICAgICAgLyogRW5hYmxlIG9wZXJhdGlvbmFsIFItRCBvcHRpbWl6YXRpb24gKi8KKyAgICBJbnQgICAgIEdPQl9IZWFkZXJfSW50ZXJ2YWw7ICAgICAgICAvKiBFbmFibGUgZW5jb2RpbmcgR09CIGhlYWRlciBpbiBIMjYzX1dJVEhfRVJSX1JFUyBhbmQgU0hPUlRfSEVSREVSX1dJVEhfRVJSX1JFUyAqLworICAgIEludCAgICAgU2VhcmNoUmFuZ2U7ICAgICAgICAgICAgLyogU2VhcmNoIHJhbmdlIGZvciAxNngxNiBtb3Rpb24gdmVjdG9yICovCisgICAgSW50ICAgICBNZW1vcnlVc2FnZTsgICAgICAgICAgICAvKiBBbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCAqLworICAgIEludCAgICAgR2V0Vm9sSGVhZGVyWzJdOyAgICAgICAgLyogRmxhZyB0byBjaGVjayBpZiBWb2wgSGVhZGVyIGhhcyBiZWVuIHJldHJpZXZlZCAqLworICAgIEludCAgICAgQnVmZmVyU2l6ZVsyXTsgICAgICAgICAgLyogQnVmZmVyIFNpemUgZm9yIEJhc2UgYW5kIEVuaGFuY2UgTGF5ZXJzICovCisgICAgSW50ICAgICBQcm9maWxlTGV2ZWxbMl07ICAgICAgICAvKiBQcm9maWxlIGFuZCBMZXZlbCBmb3IgZW5jb2RpbmcgcHVycG9zZXMgKi8KKyAgICBmbG9hdCAgIFZCVl9kZWxheTsgICAgICAgICAgICAgIC8qIFZCViBidWZmZXIgc2l6ZSBpbiB0aGUgZm9ybSBvZiBkZWxheSAqLworICAgIEludCAgICAgbWF4RnJhbWVTaXplOyAgICAgICAgICAgLyogbWF4aW11bSBmcmFtZSBzaXplKGJpdHMpIGZvciBIMjYzL1Nob3J0IGhlYWRlciBtb2RlLCBrKjE2Mzg0ICovCisgICAgSW50ICAgICBwcm9maWxlX3RhYmxlX2luZGV4OyAgICAvKiBpbmRleCBmb3IgcHJvZmlsZSBhbmQgbGV2ZWwgdGFibGVzIGdpdmVuIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKworfSBWaWRlb0VuY1BhcmFtczsKKworLyogcGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnRnVuY1B0cgoreworLy8gIEludCAoKlNBRF9NQl9IYWxmUGVsKShVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW5fbHgsSW50IHhoLEludCB5aCx2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQoKlNBRF9NQl9IYWxmUGVsWzRdKShVQ2hhciosIFVDaGFyKiwgSW50LCB2b2lkICopOworICAgIEludCgqU0FEX0Jsa19IYWxmUGVsKShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCBJbnQgcngsIEludCB4aCwgSW50IHloLCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQoKlNBRF9NYWNyb2Jsb2NrKShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50KCpTQURfQmxvY2spKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCgqU0FEX01CX1BBRERJTkcpKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOyAvKiwgNC8yMS8wMSAqLworICAgIHZvaWQgKCpDb21wdXRlTUJTdW0pKFVDaGFyICpjdXIsIEludCBseCwgTU9UICptb3RfbWIpOworICAgIHZvaWQgKCpDaG9vc2VNb2RlKShVQ2hhciAqTW9kZSwgVUNoYXIgKmN1ciwgSW50IGx4LCBJbnQgbWluX1NBRCk7CisgICAgdm9pZCAoKkdldEhhbGZQZWxNQlJlZ2lvbikoVUNoYXIgKmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgpOworICAgIHZvaWQgKCpibG9ja0lkY3QpKEludCAqYmxvY2spOworCisKK30gRnVuY1B0cjsKKworLyogMDQvMDkvMDEsIGZvciBtdWx0aXBhc3MgcmF0ZSBjb250cm9sICovCisKK3R5cGVkZWYgc3RydWN0IHRhZ1JESW5mbworeworICAgIEludCBRUDsKKyAgICBJbnQgYWN0dWFsX2JpdHM7CisgICAgZmxvYXQgbWFkOworICAgIGZsb2F0IFJfRDsKK30gUkRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdNdWx0aVBhc3MKK3sKKyAgICAvKiBtdWx0aXBhc3MgcmF0ZSBjb250cm9sIGRhdGEgKi8KKyAgICBJbnQgdGFyZ2V0X2JpdHM7ICAgIC8qIHRhcmdldCBiaXRzIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5UICovCisgICAgSW50IGFjdHVhbF9iaXRzOyAgICAvKiBhY3R1YWwgYml0cyBmb3IgY3VycmVudCBmcmFtZSBvYnRhaW5lZCBhZnRlciBlbmNvZGluZywgPSByYy0+UmMqLworICAgIEludCBRUDsgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5RYyovCisgICAgSW50IHByZXZfUVA7ICAgICAgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgSW50IHByZXZfcHJldl9RUDsgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lIGJlZm9yZSBsYXN0Ki8KKyAgICBmbG9hdCBtYWQ7ICAgICAgICAgIC8qIG1hZCBmb3IgY3VycmVudCBmcmFtZSwgPSB2aWRlby0+YXZnTUFEKi8KKyAgICBJbnQgYml0cmF0ZTsgICAgICAgIC8qIGJpdHJhdGUgZm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBmbG9hdCBmcmFtZXJhdGU7ICAgIC8qIGZyYW1lcmF0ZSBmb3IgY3VycmVudCBmcmFtZSovCisKKyAgICBJbnQgblJlX1F1YW50aXplZDsgIC8qIGNvbnRyb2wgdmFyaWFibGUgZm9yIG11bHRpcGFzcyBlbmNvZGluZywgKi8KKyAgICAvKiAwIDogZmlyc3QgcGFzcyAqLworICAgIC8qIDEgOiBpbnRlcm1lZGlhdGUgcGFzcyhxdWFudGl6YXRpb24gYW5kIFZMQyBsb29wIG9ubHkpICovCisgICAgLyogMiA6IGZpbmFsIHBhc3MoZGUtcXVhbnRpemF0aW9uLCBpZGN0LCBldGMpICovCisgICAgLyogMyA6IG1hY3JvYmxvY2sgbGV2ZWwgcmF0ZSBjb250cm9sICovCisKKyAgICBJbnQgZW5jb2RlZF9mcmFtZXM7ICAgICAvKiBjb3VudGVyIGZvciBhbGwgZW5jb2RlZCBmcmFtZXMgKi8KKyAgICBJbnQgcmVfZW5jb2RlZF9mcmFtZXM7ICAvKiBjb3VudGVyIGZvciBhbGwgbXVsdGlwYXNzIGVuY29kZWQgZnJhbWVzKi8KKyAgICBJbnQgcmVfZW5jb2RlZF90aW1lczsgICAvKiBjb3VudGVyIGZvciBhbGwgdGltZXMgb2YgbXVsdGlwYXNzIGZyYW1lIGVuY29kaW5nICovCisKKyAgICAvKiBNdWx0aXBsZSBmcmFtZSBwcmVkaWN0aW9uKi8KKyAgICBSREluZm8gKipwUkRTYW1wbGVzOyAgICAgICAgLyogcFJEU2FtcGxlc1szMF1bMzJdLCAzMC0+MzBmcHMsIDMyIC0+IDUgYml0IHF1YW50aXplciwgMzIgY2FuZGlkYXRlcyovCisgICAgSW50IGZyYW1lUG9zOyAgICAgICAgICAgICAgIC8qIHNwZWNpZmljIHBvc2l0aW9uIGluIHByZXZpb3VzIG11bHRpcGxlIGZyYW1lcyovCisgICAgSW50IGZyYW1lUmFuZ2U7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBvdmVyYWxsIHByZXZpb3VzIG11bHRpcGxlIGZyYW1lcyAqLworICAgIEludCBzYW1wbGVzUGVyRnJhbWVbMzBdOyAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUsIDMwLT4zMGZwcyAqLworCisgICAgLyogQml0IGFsbG9jYXRpb24gZm9yIHNjZW5lIGNoYW5nZSBmcmFtZXMgYW5kIGhpZ2ggbW90aW9uIGZyYW1lcyAqLworICAgIGZsb2F0IHN1bV9tYWQ7CisgICAgSW50IGNvdW50ZXJfQlRzcmM7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIGZyb20gbG93IG1vdGlvbiBmcmFtZXMgb3IgbGVzcyBjb21wbGljYXRlZGx5IGNvbXByZXNzZWQgZnJhbWVzICovCisgICAgSW50IGNvdW50ZXJfQlRkc3Q7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIHRvIHNjZW5lIGNoYW5nZSBmcmFtZXMgb3IgaGlnaCBtb3Rpb24gZnJhbWVzIG9yIG1vcmUgY29tcGxpY2F0ZWRseSBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgIGZsb2F0IHN1bV9RUDsKKyAgICBJbnQgZGlmZl9jb3VudGVyOyAgIC8qIGRpZmZfY291bnRlciA9IC1kaWZmX2NvdW50ZXJfQlRkc3QsIG9yIGRpZmZfY291bnRlcl9CVHNyYyAqLworCisgICAgLyogRm9yIHRhcmdldCBiaXRyYXRlIG9yIGZyYW1lcmF0ZSB1cGRhdGUgKi8KKyAgICBmbG9hdCB0YXJnZXRfYml0c19wZXJfZnJhbWU7ICAgICAgICAvKiA9IEMgPSBiaXRyYXRlL2ZyYW1lcmF0ZSAqLworICAgIGZsb2F0IHRhcmdldF9iaXRzX3Blcl9mcmFtZV9wcmV2OyAgIC8qIHByZXZpb3VzIEMgKi8KKyAgICBmbG9hdCBhdmVyX21hZDsgICAgICAgICAgICAgICAgICAgICAvKiBzby1mYXIgYXZlcmFnZSBtYWQgY291bGQgcmVwbGFjZSBzdW1fbWFkICovCisgICAgZmxvYXQgYXZlcl9tYWRfcHJldjsgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgYXZlcmFnZSBtYWQgKi8KKyAgICBJbnQgICBvdmVybGFwcGVkX3dpbl9zaXplOyAgICAgICAgICAvKiB0cmFuc2l0aW9uIHBlcmlvZCBvZiB0aW1lICovCisgICAgSW50ICAgZW5jb2RlZF9mcmFtZXNfcHJldjsgICAgICAgICAgLyogcHJldmlvdXMgZW5jb2RlZF9mcmFtZXMgKi8KK30gTXVsdGlQYXNzOworCisvKiBFbmQgKi8KKworI2lmZGVmIEhURk0KK3R5cGVkZWYgc3RydWN0IHRhZ0hURk1fU3RhdAoreworICAgIEludCBhYnNfZGlmX21hZF9hdmc7CisgICAgVUludCBjb3VudGJyZWFrOworICAgIEludCBvZmZzZXRBcnJheVsxNl07CisgICAgSW50IG9mZnNldFJlZlsxNl07Cit9IEhURk1fU3RhdDsKKyNlbmRpZgorCisvKiBHbG9iYWwgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1ZpZGVvRW5jRGF0YQoreworICAgIC8qIFZPTCBIZWFkZXIgSW5pdGlhbGl6YXRpb24gKi8KKyAgICBVQ2hhciAgIHZvbEluaXRpYWxpemVbNF07ICAgICAgIC8qIFVzZWQgdG8gV3JpdGUgVk9MIEhlYWRlcnMgKi8KKyAgICAvKiBEYXRhIEZvciBMYXllcnMgKFNjYWxhYmlsaXR5KSAqLworICAgIEludCAgICAgbnVtYmVyT2ZMYXllcnM7ICAgICAvKiBOdW1iZXIgb2YgTGF5ZXJzICovCisgICAgVm9sICAgICAqKnZvbDsgICAgICAgICAgICAgIC8qIERhdGEgc3RvcmVkIGZvciBlYWNoIFZPTCAqLworCisgICAgLyogRGF0YSB1c2VkIGZvciBlbmNvZGluZyBmcmFtZXMgKi8KKyAgICBWaWRlb0VuY0ZyYW1lSU8gKmlucHV0OyAgICAgLyogb3JpZ2luYWwgaW5wdXQgZnJhbWUgKi8KKyAgICBWb3AgICAgICpjdXJyVm9wOyAgICAgICAgICAgLyogQ3VycmVudCByZWNvbnN0cnVjdGVkIFZPUCAqLworICAgIFZvcCAgICAgKnByZXZCYXNlVm9wOyAgICAgICAvKiBQcmV2aW91cyByZWZlcmVuY2UgQmFzZSBWb3AgKi8KKyAgICBWb3AgICAgICpuZXh0QmFzZVZvcDsgICAgICAgLyogTmV4dCByZWZlcmVuY2UgQmFzZSBWb3AgKi8KKyAgICBWb3AgICAgICpwcmV2RW5oYW5jZVZvcDsvKiBQcmV2aW91cyBFbmhhbmNlbWVudCBMYXllciBWb3AgKi8KKyAgICBWb3AgICAgICpmb3J3YXJkUmVmVm9wOyAgICAgLyogRm9yd2FyZCBSZWZlcmVuY2UgVk9QICovCisgICAgVm9wICAgICAqYmFja3dhcmRSZWZWb3A7ICAgIC8qIEJhY2t3YXJkIFJlZmVyZW5jZSBWT1AgKi8KKworICAgIC8qIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgQml0c3RyZWFtRW5jVmlkZW8gICpiaXRzdHJlYW0xOyAvKiBVc2VkIGZvciBkYXRhIHBhcnRpdGlvbmluZyAqLworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICAqYml0c3RyZWFtMjsgLyogYW5kIGNvbWJpbmVkIG1vZGVzIGFzICAgICAgKi8KKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAgKmJpdHN0cmVhbTM7IC8qIGludGVybWVkaWF0ZSBzdG9yYWdlcyAgICAgICovCisKKyAgICBVQ2hhciAgICpvdmVycnVuQnVmZmVyOyAgLyogZXh0cmEgb3V0cHV0IGJ1ZmZlciB0byBwcmV2ZW50IGN1cnJlbnQgc2tpcCBkdWUgdG8gb3V0cHV0IGJ1ZmZlciBvdmVycnVuKi8KKyAgICBJbnQgICAgIG9CU2l6ZTsgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIG92ZXJydW4gYnVmZmVyICovCisKKyAgICBJbnQgZGNfc2NhbGFyXzE7ICAgICAgICAgICAgLypkYyBzY2FsYXIgZm9yIFkgYmxvY2sgKi8KKyAgICBJbnQgZGNfc2NhbGFyXzI7ICAgICAgICAgICAgLypkYyBzY2FsYXIgZm9yIFUsIFYgYmxvY2sqLworCisgICAgLyogQW5uZXggTCBSYXRlIENvbnRyb2wgKi8KKyAgICByYXRlQ29udHJvbCAgICAgKnJjWzRdOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gUmF0ZSBDb250cm9sIHN0cnVjdHVyZSovCisgICAgLyogMTIvMjUvMDAsIGVhY2ggUi5DLiBmb3IgZWFjaCBsYXllciAqLworCisgICAgLyoqKioqKioqKiBtb3Rpb24gY29tcGVuc2F0aW9uIHJlbGF0ZWQgdmFyaWFibGVzICoqKioqKioqKioqKioqKiovCisgICAgTU9UICAgICAqKm1vdDsgICAgICAgICAgICAgIC8qIE1vdGlvbiB2ZWN0b3JzICovCisgICAgLyogIHdoZXJlIFttYm51bV1bMF0gPSAxTVYuCisgICAgICAgIFttYm51bV1bMS4uLjRdID0gNE1WcworICAgICAgICBbbWJudW1dWzVdID0gYmFja3dhcmQgTVYuCisgICAgICAgIFttYm51bV1bNl0gPSBkZWx0YSBNViBmb3IgZGlyZWN0IG1vZGUuCisgICAgICAgIFttYm51bV1bN10gPSBub3RoaW5nIHlldC4gKi8KKyAgICBVQ2hhciAgICppbnRyYUFycmF5OyAgICAgICAgICAgIC8qIEludHJhIFVwZGF0ZSBBcnJhcnkgKi8KKyAgICBmbG9hdCAgIHN1bU1BRDsgICAgICAgICAgICAgLyogU0FEL01BRCBmb3IgZnJhbWUgKi8KKworICAgIC8qIHRvIHNwZWVkdXAgdGhlIFNBRCBjYWxjdWxhdGlvbiAqLworICAgIHZvaWQgKnNhZF9leHRyYV9pbmZvOworI2lmZGVmIEhURk0KKyAgICBJbnQgbnJtbHpfdGhbNDhdOyAgICAgICAvKiBUaHJlc2hvbGQgZm9yIGZhc3QgU0FEIGNhbGN1bGF0aW9uIHVzaW5nIEhURk0gKi8KKyAgICBIVEZNX1N0YXQgaHRmbV9zdGF0OyAgICAvKiBGb3Igc3RhdGlzdGljcyBjb2xsZWN0aW9uICovCisjZW5kaWYKKworICAgIC8qVGFvIDA0LzA5LzAwICBGb3IgRENUIHJvdXRpbmUgKi8KKyAgICBVQ2hhciBjdXJyWU1CWzI1Nl07ICAgICAvKiBpbnRlcmxlYXZlZCBjdXJyZW50IG1hY3JvYmxvY2sgaW4gSFRGTSBvcmRlciAqLworICAgIE1hY3JvQmxvY2sgICpvdXRwdXRNQjsgICAgICAgICAgLyogT3V0cHV0IE1CIHRvIFZMQyBlbmNvZGUgKi8KKyAgICBVQ2hhciAgIHByZWRpY3RlZE1CWzM4NF07ICAgLyogc2NyYXRoIG1lbW9yeSBmb3IgcHJlZGljdGVkIHZhbHVlICovCisgICAgUnVuTGV2ZWxCbG9jayBSTEJbNl07ICAgICAgIC8qIFJ1biBhbmQgTGV2ZWwgb2YgY29lZmZpY2llbnRzISAqLworICAgIFNob3J0ICAgZGF0YUJsb2NrWzEyOF07ICAgICAvKiBEQ1QgYmxvY2sgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHF1YW50L2RlcXVhbnQqLworCisgICAgVUNoYXIgICBiaXRtYXByb3dbOF07ICAgICAgIC8qIE5lZWQgdG8ga2VlcCBpdCBmb3IgQUNEQ1ByZWRpY3Rpb24sIDggYnl0ZXMgZm9yIGFsaWdubWVudCwgbmVlZCBvbmx5IDYgKi8KKyAgICBVQ2hhciAgIGJpdG1hcGNvbFs2XVs4XTsKKyAgICBVSW50ICAgIGJpdG1hcHp6WzZdWzJdOyAvKiBmb3IgemlnemFnIGJpdG1hcCAqLworICAgIEludCAgICAgemVyb01WOyAgICAgICAgIC8qIGZsYWcgZm9yIHplcm8gTVYgKi8KKworICAgIEludCAgICAgdXNlUHJldlFQOyAgICAgIC8qIGZsYWcgZm9yIGludHJhRENWbGNUaHJlc2hvbGQgc3dpdGNoIGRlY2lzaW9uICovCisgICAgSW50ICAgICBRUF9wcmV2OyAgICAgICAgICAgIC8qIHVzZSBmb3IgRFFVQU5UIGNhbGN1bGF0aW9uICovCisgICAgSW50ICAgICAqYWNQcmVkRmxhZzsgICAgICAgIC8qICovCisgICAgdHlwZURDU3RvcmUgICAgICpwcmVkREM7ICAgICAgICAvKiBUaGUgREMgY29lZmZzIGZvciBlYWNoIE1CICovCisgICAgdHlwZURDQUNTdG9yZSAgICpwcmVkRENBQ19yb3c7CisgICAgdHlwZURDQUNTdG9yZSAgICpwcmVkRENBQ19jb2w7CisKKworICAgIFVDaGFyICAgKnNsaWNlTm87ICAgICAgICAgICAvKiBTbGljZSBOdW1iZXIgZm9yIGVhY2ggTUIgKi8KKworICAgIEludCAgICAgaGVhZGVyX2JpdHM7ICAgICAgICAvKiBoZWFkZXIgYml0cyBpbiBmcm1hZSAqLworICAgIEhlYWRlckluZm9FbmNWaWRlbyAgaGVhZGVySW5mbzsgLyogTUIgSGVhZGVyIGluZm9ybWF0aW9uICovCisgICAgVUNoYXIgICB6el9kaXJlY3Rpb247ICAgICAgIC8qIGRpcmVjdGlvbiBvZiB6aWd6YWcgc2NhbiAqLworICAgIFVDaGFyICAgKlFQTUI7ICAgICAgICAgICAgICAvKiBRdWFudGl6ZXIgdmFsdWUgZm9yIGVhY2ggTUIgKi8KKworICAgIC8qIE1pc2NlbGxhbmVvdXMgZGF0YSBwb2ludHMgdG8gYmUgcGFzc2VkICovCisgICAgZmxvYXQgICBGcmFtZVJhdGU7ICAgICAgICAgIC8qIFNyYyBmcmFtZSBSYXRlICovCisKKyAgICBVTG9uZyAgIG5leHRNb2RUaW1lOyAgICAgICAgLyogZXhwZWN0ZWQgbmV4dCBmcmFtZSB0aW1lICovCisgICAgVUludCAgICBwcmV2RnJhbWVOdW1bNF07ICAgIC8qIHByZXZpb3VzIGZyYW1lIG51bWJlciBzdGFydGluZyBmcm9tIG1vZFRpbWVSZWYgKi8KKyAgICBVSW50ICAgIG1vZFRpbWVSZWY7ICAgICAvKiBSZWZlcmVuY2UgbW9kVGltZSB1cGRhdGUgZXZlcnkgSS1Wb3AqLworICAgIFVJbnQgICAgcmVmVGlja1s0XTsgICAgICAgICAvKiBzZWNvbmQgYWxpZ25lZCByZWZlcmVuYyB0aWNrICovCisgICAgSW50ICAgICByZWxMYXllckNvZGVUaW1lWzRdOy8qIE5leHQgY29kaW5nIHRpbWUgZm9yIGVhY2ggTGF5ZXIgcmVsYXRpdmUgdG8gaGlnaGVzdCBsYXllciAqLworCisgICAgVUxvbmcgICBtb2RUaW1lOyAgICAgICAgICAgIC8qIElucHV0IGZyYW1lIG1vZFRpbWUgKi8KKyAgICBJbnQgICAgIGN1cnJMYXllcjsgICAgICAgICAgLyogQ3VycmVudCBmcmFtZSBsYXllciAgKi8KKyAgICBJbnQgICAgIG1ibnVtOyAgICAgICAgICAgICAgLyogIE1hY3JvYmxvY2sgbnVtYmVyICovCisKKyAgICAvKiBzbGljZSBjb2RpbmcsIHN0YXRlIHZhcmlhYmxlcyAqLworICAgIFZvcCAgICAgKnRlbXBGb3J3UmVmVm9wOworICAgIEludCAgICAgdGVtcFJlZlNlbENvZGU7CisgICAgSW50ICAgICBlbmRfb2ZfYnVmOyAgICAgICAgIC8qIGVuZCBvZiBiaXRzdHJlYW0gYnVmZmVyIGZsYWcgKi8KKyAgICBJbnQgICAgIHNsaWNlX2NvZGluZzsgICAgICAgLyogZmxhZyBmb3Igc2xpY2UgYmFzZWQgY29kaW5nICovCisgICAgSW50ICAgICB0b3RhbFNBRDsgICAgICAgICAgIC8qIFNvIGZhciB0b3RhbCBTQUQgZm9yIGEgZnJhbWUgKi8KKyAgICBJbnQgICAgIG51bUludHJhOyAgICAgICAgICAgLyogU28gZmFyIG51bWJlciBvZiBJbnRyYSBNQiAqLworICAgIEludCAgICAgb2Zmc2V0OyAgICAgICAgICAgICAvKiBTbyBmYXIgTUIgb2Zmc2V0ICovCisgICAgSW50ICAgICBpbmRfeCwgaW5kX3k7ICAgICAgIC8qIFNvIGZhciBNQiBjb29yZGluYXRlICovCisgICAgSW50ICAgICBjb2xsZWN0OworICAgIEludCAgICAgaHBfZ3Vlc3M7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIEhpbnRUcmFja0luZm8gaGludFRyYWNrSW5mbzsgICAgLyogaGludFRyYWNrSW5mbyAqLworICAgIC8qIEludHJhUGVyaW9kLCBUaW1lc3RhbXAsIGV0Yy4gKi8KKyAgICBmbG9hdCAgICAgICBuZXh0RW5jSVZvcDsgICAgLyogY291bnRlciB0aWwgdGhlIG5leHQgSS1Wb3AgKi8KKyAgICBmbG9hdCAgICAgICBudW1Wb3BzSW5HT1A7ICAgLyogdmFsdWUgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXh0RW5jSVZvcCAqLworCisgICAgLyogcGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyAqLworICAgIEZ1bmNQdHIgICAgICpmdW5jdGlvblBvaW50ZXI7ICAgLyogc3RydWN0dXJlIGNvbnRhaW5pbmcgcGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyAqLworCisgICAgLyogQXBwbGljYXRpb24gY29udHJvbHMgKi8KKyAgICBWaWRlb0VuY0NvbnRyb2xzICAgICp2aWRlb0VuY0NvbnRyb2xzOworICAgIFZpZGVvRW5jUGFyYW1zICAgICAgKmVuY1BhcmFtczsKKworICAgIE11bHRpUGFzcyAqcE1QWzRdOyAvKiBmb3IgbXVsdGlwYXNzIGVuY29kaW5nLCA0IHJlcHJlc2VudHMgNCBsYXllciBlbmNvZGluZyAqLworCit9IFZpZGVvRW5jRGF0YTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgIFZMQyBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB0YWdWTEN0YWJsZQoreworICAgIHVuc2lnbmVkIGludCBjb2RlOyAvKiByaWdodCBqdXN0aWZpZWQgKi8KKyAgICBpbnQgbGVuOworfSBWTEN0YWJsZSwgKkxQVkxDdGFibGU7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgIEFwcHJveCBEQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0X2FwcHJveERDVCAgYXBwcm94RENUOworc3RydWN0IHN0cnVjdF9hcHByb3hEQ1QKK3sKKyAgICBWb2lkKCpCbG9ja0RDVDh4OCkoSW50ICosIEludCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQsIEludCk7CisgICAgVm9pZCgqQmxvY2tEQ1Q4eDhJbnRyYSkoSW50ICosIEludCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQsIEludCk7CisgICAgVm9pZCgqQmxvY2tEQ1Q4eDh3U3ViKShJbnQgKiwgSW50ICosIFVDaGFyICosIFVDaGFyICosIEludCwgSW50KTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBRUCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IFFQc3RydWN0Cit7CisgICAgSW50IFFQeDIgOworICAgIEludCBRUDsKKyAgICBJbnQgUVBkaXYyOworICAgIEludCBRUHgycGx1czsKKyAgICBJbnQgQWRkaXRpb247Cit9OworCisKKyNlbmRpZiAvKiBfTVA0TElCX0lOVF9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE0OWMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMCwwICsxLDg4NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAicmF0ZV9jb250cm9sLmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKK3ZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpOwordm9pZCBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKHZvaWQgKnZpZGVvKTsKK3ZvaWQgdXBkYXRlUmF0ZUNvbnRyb2wocmF0ZUNvbnRyb2wgKnJjLCBWaWRlb0VuY0RhdGEgKnZpZGVvKTsKK3ZvaWQgdXBkYXRlUkNfUG9zdFByb2MocmF0ZUNvbnRyb2wgKnJjLCBWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKiogIFJDIEFQSXMgdG8gY29yZSBlbmNvZGluZyBtb2R1bGVzICAqKioqKioqKioqKioqKioqKioqCisKK1BWX1NUQVRVUyBSQ19Jbml0aWFsaXplKHZvaWQgKnZpZGVvKTsKK1BWX1NUQVRVUyBSQ19DbGVhbnVwKHJhdGVDb250cm9sICpyY1tdLEludCBudW1MYXllcnMpOworUFZfU1RBVFVTIFJDX1ZvcFFQU2V0dGluZyhWaWRlb0VuY0RhdGEgKnZpZGVvLHJhdGVDb250cm9sICpyY1tdKTsKK1BWX1NUQVRVUyBSQ19Wb3BVcGRhdGVTdGF0KFZpZGVvRW5jRGF0YSAqdmlkZW8scmF0ZUNvbnRyb2wgKnJjW10pOworUFZfU1RBVFVTIFJDX1VwZGF0ZUJ1ZmZlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyLCBJbnQgbnVtX3NraXApOworSW50ICAgICAgIFJDX0dldFNraXBOZXh0RnJhbWUoVmlkZW9FbmNEYXRhICp2aWRlbyxJbnQgY3VyckxheWVyKTsKK3ZvaWQgICAgICBSQ19SZXNldFNraXBOZXh0RnJhbWUodm9pZCAqdmlkZW8sSW50IGN1cnJMYXllcik7CisKK1BWX1NUQVRVUyBSQ19VcGRhdGVCWFJDUGFyYW1zKHZvaWQgKmlucHV0KTsgIFBhcmFtZXRlcnMgdXBkYXRlIGZvciB0YXJnZXQgYml0cmF0ZSBvciBmcmFtZXJhdGUgY2hhbmdlCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKiogQVBJIHBhcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZWFjaCBzZXF1ZW5jZSovCisKK1BWX1NUQVRVUyBSQ19Jbml0aWFsaXplKHZvaWQgKmlucHV0KQoreworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopIGlucHV0OworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIHJhdGVDb250cm9sICoqcmMgPSB2aWRlby0+cmM7CisgICAgSW50IG51bUxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKKyAgICBJbnQgKkxheWVyQml0UmF0ZSA9IGVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlOworICAgIGZsb2F0ICpMYXllckZyYW1lUmF0ZSA9IGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGU7CisgICAgTXVsdGlQYXNzICoqcE1QID0gdmlkZW8tPnBNUDsKKworICAgIEludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IG51bUxheWVyczsgbisrKQorICAgIHsKKyAgICAgICAgLyogcmF0ZSBjb250cm9sICovCisgICAgICAgIHJjW25dLT5maW5lX2ZyYW1lX3NraXAgPSBlbmNQYXJhbXMtPkZpbmVGcmFtZVNraXBfRW5hYmxlZDsKKyAgICAgICAgcmNbbl0tPm5vX2ZyYW1lX3NraXAgPSBlbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQ7CisgICAgICAgIHJjW25dLT5ub19wcmVfc2tpcCA9IGVuY1BhcmFtcy0+Tm9QcmVTa2lwX0VuYWJsZWQ7CisgICAgICAgIHJjW25dLT5za2lwX25leHRfZnJhbWUgPSAwOyAvKiBtdXN0IGJlIGluaXRpYWxpemVkICovCisKKyAgICAgICAgLy9yY1tuXS0+VE1OX1RIID0gKEludCkoKGZsb2F0KUxheWVyQml0UmF0ZVtuXS9MYXllckZyYW1lUmF0ZVtuXSk7CisgICAgICAgIHJjW25dLT5CcyA9IHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbbl07CisgICAgICAgIHJjW25dLT5UTU5fVyA9IDA7CisgICAgICAgIHJjW25dLT5WQlZfZnVsbG5lc3MgPSAoSW50KShyY1tuXS0+QnMgKiAwLjUpOyAvKiByY1tuXS0+QnMgKi8KKyAgICAgICAgcmNbbl0tPmVuY29kZWRfZnJhbWVzID0gMDsKKyAgICAgICAgcmNbbl0tPmZyYW1lcmF0ZSA9IExheWVyRnJhbWVSYXRlW25dOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByY1tuXS0+VE1OX1RIID0gKEludCkoKGZsb2F0KUxheWVyQml0UmF0ZVtuXSAvIExheWVyRnJhbWVSYXRlW25dKTsKKyAgICAgICAgICAgIHJjW25dLT5iaXRyYXRlID0gTGF5ZXJCaXRSYXRlW25dOworICAgICAgICAgICAgcmNbbl0tPmZyYW1lcmF0ZSA9IExheWVyRnJhbWVSYXRlW25dOworCisgICAgICAgICAgICAvLyBGb3IgaDI2MyBvciBzaG9ydCBoZWFkZXIgbW9kZSwgdGhlIGJpdCB2YXJpYXRpb24gaXMgd2l0aGluICgtMipSbWF4KjEwMDEvMzAwMCwgMipSbWF4KjEwMDEvMzAwMCkKKyAgICAgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgocmNbbl0tPkJzIC0gdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplKSAvIDIgLyAocmNbbl0tPmJpdHJhdGUgLyByY1tuXS0+ZnJhbWVyYXRlIC8gMTAuMCkpIC0gNTsKKyAgICAgICAgICAgICAgICBpZiAocmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPCAwKSByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgIC8vIE1QRUctNCBub3JtYWwgbW9kZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChJbnQpKChmbG9hdCkocmNbbl0tPkJzIC0gcmNbbl0tPlZCVl9mdWxsbmVzcykgLyAoKGZsb2F0KUxheWVyQml0UmF0ZVtuXSAvIExheWVyRnJhbWVSYXRlW25dIC8gMTAuMCkpIC0gNTsKKyAgICAgICAgICAgICAgICBpZiAocmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPCAwKSByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSArPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKExheWVyRnJhbWVSYXRlW25dIC0gTGF5ZXJGcmFtZVJhdGVbbi0xXSA+IDApIC8qICA3LzMxLzAzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPlRNTl9USCA9IChJbnQpKChmbG9hdCkoTGF5ZXJCaXRSYXRlW25dIC0gTGF5ZXJCaXRSYXRlW24tMV0pIC8gKExheWVyRnJhbWVSYXRlW25dIC0gTGF5ZXJGcmFtZVJhdGVbbi0xXSkpOworICAgICAgICAgICAgICAgIHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtID0gKEludCkoKGZsb2F0KShyY1tuXS0+QnMgLSByY1tuXS0+VkJWX2Z1bGxuZXNzKSAqIDEwIC8gKChmbG9hdClyY1tuXS0+VE1OX1RIKSkgLSA1OworICAgICAgICAgICAgICAgIGlmIChyY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA8IDApIHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgLyogIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+VE1OX1RIID0gMSA8PCAzMDsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY1tuXS0+Yml0cmF0ZSA9IExheWVyQml0UmF0ZVtuXSAtIExheWVyQml0UmF0ZVtuLTFdOworICAgICAgICAgICAgcmNbbl0tPmZyYW1lcmF0ZSA9IExheWVyRnJhbWVSYXRlW25dIC0gTGF5ZXJGcmFtZVJhdGVbbi0xXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBidWZmZXIgZnVsbG5lc3MKKyAgICAgICAgaWYgKDEpIC8vIXZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkgIHsgLy8gTVBFRy00CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIGluaXRpYWwgYnVmZmVyIGZ1bGxuZXNzIG5lZWRzIHRvIGJlIHNldCB0byAxLzMgKi8KKyAgICAgICAgICAgIHJjW25dLT5WQlZfZnVsbG5lc3MgPSAoSW50KShyY1tuXS0+QnMgLyAzLjAgLSByY1tuXS0+QnMgLyAyLjApOyAvKiB0aGUgYnVmZmVyIHJhbmdlIGlzIFstQnMvMiwgQnMvMl0gKi8KKyAgICAgICAgICAgIHBNUFtuXS0+Y291bnRlcl9CVHNyYyA9IChJbnQpKChyY1tuXS0+QnMgLyAyLjAgLSByY1tuXS0+QnMgLyAzLjApIC8gKHJjW25dLT5iaXRyYXRlIC8gcmNbbl0tPmZyYW1lcmF0ZSAvIDEwLjApKTsKKyAgICAgICAgICAgIHJjW25dLT5UTU5fVyA9IChJbnQpKHJjW25dLT5WQlZfZnVsbG5lc3MgKyBwTVBbbl0tPmNvdW50ZXJfQlRzcmMgKiAocmNbbl0tPmJpdHJhdGUgLyByY1tuXS0+ZnJhbWVyYXRlIC8gMTAuMCkpOworCisgICAgICAgICAgICByY1tuXS0+bG93X2JvdW5kID0gLXJjW25dLT5CcyAvIDI7CisgICAgICAgICAgICByY1tuXS0+IFZCVl9mdWxsbmVzc19vZmZzZXQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvKiB0aGlzIHBhcnQgZG9lc24ndCB3b3JrIGluIHNvbWUgY2FzZXMsIHRoZSBsb3dfYm91bmQgaXMgdG9vIGhpZ2gsIEphbiA0LDIwMDYgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmNbbl0tPlZCVl9mdWxsbmVzcyA9ICByY1tuXS0+QnMgLSAoSW50KSh2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXkgKiByY1tuXS0+Yml0cmF0ZSk7CisgICAgICAgICAgICBpZiAocmNbbl0tPlZCVl9mdWxsbmVzcyA8IDApIHJjW25dLT5WQlZfZnVsbG5lc3MgPSAwOworICAgICAgICAgICAgLy9yY1tuXS0+VkJWX2Z1bGxuZXNzID0gKHJjW25dLT5Ccy12aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemUpLzIgKyB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemU7CisKKyAgICAgICAgICAgIHJjW25dLT5WQlZfZnVsbG5lc3MgLT0gcmNbbl0tPkJzIC8gMjsgLyogdGhlIGJ1ZmZlciByYW5nZSBpcyBbLUJzLzIsIEJzLzJdICovCisgICAgICAgICAgICByY1tuXS0+bG93X2JvdW5kID0gLXJjW25dLT5CcyAvIDIgKyB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemU7ICAvKiAgdG9vIGhpZ2ggKi8KKyAgICAgICAgICAgIHJjW25dLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0ID0gdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplIC8gMjsgLyogIGRvbid0IHVuZGVyc3RhbmQgdGhlIG1lYW5pbmcgb2YgdGhpcyAqLworICAgICAgICAgICAgcE1QW25dLT5jb3VudGVyX0JUZHN0ID0gcE1QW25dLT5jb3VudGVyX0JUc3JjID0gMDsKKworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0dGluZyB0aGUgYml0cmF0ZSBhbmQgZnJhbWVyYXRlICovCisgICAgICAgIHBNUFtuXS0+Yml0cmF0ZSA9IHJjW25dLT5iaXRyYXRlOworICAgICAgICBwTVBbbl0tPmZyYW1lcmF0ZSA9IHJjW25dLT5mcmFtZXJhdGU7CisgICAgICAgIHBNUFtuXS0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lID0gcE1QW25dLT5iaXRyYXRlIC8gcE1QW25dLT5mcmFtZXJhdGU7CisKKyAgICB9CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFJDX0NsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTIvMjAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBmcmVlIFJhdGUgQ29udHJvbCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK1BWX1NUQVRVUyBSQ19DbGVhbnVwKHJhdGVDb250cm9sICpyY1tdLCBJbnQgbnVtTGF5ZXJzKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhyYyk7CisgICAgT1NDTF9VTlVTRURfQVJHKG51bUxheWVycyk7CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUkNfVm9wUVBTZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzExLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFJlc2V0IHJhdGUgY29udHJvbCBiZWZvcmUgY29kaW5nIFZPUCwgbW92ZWQgZnJvbSB2b3AuYyAgICAgICAqLworLyogICAgICAgICAgICAgIENvbXB1dGUgUVAgZm9yIHRoZSB3aG9sZSBWT1AgYW5kIGluaXRpYWxpemUgTUItYmFzZWQgUkMKKyAgICAgICAgICAgICAgICByZXNldCBRUE1CW10sIGN1cnJWb3AtPnF1YW50aXplciwgcmMtPkVjLCB2aWRlby0+aGVhZGVyX2JpdHMgKi8KKy8qIHRvICAgICAgICAgIEluIG9yZGVyIHRvICB3b3JrIFJDX1ZvcFFQU2V0dGluZyBoYXMgdG8gZG8gdGhlIGZvbGxvd2luZ3MKKyAgICAgICAgICAgICAgICAxLiBTZXQgdmlkZW8tPlFQTUIgb2YgYWxsIG1hY3JvYmxvY2tzLgorICAgICAgICAgICAgICAgIDIuIFNldCBjdXJyVm9wLT5xdWFudGl6ZXIKKyAgICAgICAgICAgICAgICAzLiBSZXNldCB2aWRlby0+aGVhZGVyX2JpdHMgdG8gemVyby4KKyAgICAgICAgICAgICAgICA0LiBJbml0aWFsaXplIGludGVybmFsIFJDIHBhcmFtZXRlcnMgZm9yIFZvcCBjb29kaW5nICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBUbyBiZSBtb3ZlZCB0byByYXRlX2NvbnRyb2wuYyBhbmQgc2VwYXJhdGUgYmV0d2VlbiBCWF9SQyBhbmQgQU5ORVhfTCAgICAgKi8KKworUFZfU1RBVFVTIFJDX1ZvcFFQU2V0dGluZyhWaWRlb0VuY0RhdGEgKnZpZGVvLCByYXRlQ29udHJvbCAqcHJjW10pCit7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworI2lmZGVmIFRFU1RfTUJCQVNFRF9RUAorICAgIGludCBpOworI2VuZGlmCisKKyAgICByYXRlQ29udHJvbCAqcmMgPSB2aWRlby0+cmNbY3VyckxheWVyXTsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhwcmMpOworCisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ09OU1RBTlRfUSkKKyAgICB7CisgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPlFQTUIsIGN1cnJWb3AtPnF1YW50aXplciwgc2l6ZW9mKFVDaGFyKSpjdXJyVm9sLT5uVG90YWxNQik7CisgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmICh2aWRlby0+cmNbY3VyckxheWVyXS0+ZW5jb2RlZF9mcmFtZXMgPT0gMCkgLyogcmNbY3VyckxheWVyXS0+dG90YWxGcmFtZU51bWJlciovCisgICAgICAgIHsKKyAgICAgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPlFQTUIsIGN1cnJWb3AtPnF1YW50aXplciwgc2l6ZW9mKFVDaGFyKSpjdXJyVm9sLT5uVG90YWxNQik7CisgICAgICAgICAgICB2aWRlby0+cmNbY3VyckxheWVyXS0+UWMgPSB2aWRlby0+ZW5jUGFyYW1zLT5Jbml0UXVhbnRJdm9wW2N1cnJMYXllcl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKCh2b2lkKikgdmlkZW8pOworICAgICAgICAgICAgY3VyclZvcC0+cXVhbnRpemVyID0gdmlkZW8tPnJjW2N1cnJMYXllcl0tPlFjOworI2lmZGVmIFRFU1RfTUJCQVNFRF9RUAorICAgICAgICAgICAgaSA9IGN1cnJWb2wtPm5Ub3RhbE1COyAgLyogdGVzdGluZyBjaGFuZ2luZyBRUCBhdCBNQiBsZXZlbCAqLworICAgICAgICAgICAgd2hpbGUgKGkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIHZpZGVvLT5RUE1CW2ldID0gKGkgJiAxKSA/IGN1cnJWb3AtPnF1YW50aXplciAtIDEgOiBjdXJyVm9wLT5xdWFudGl6ZXIgKyAxOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPlFQTUIsIGN1cnJWb3AtPnF1YW50aXplciwgc2l6ZW9mKFVDaGFyKSpjdXJyVm9sLT5uVG90YWxNQik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyA9IDA7CisgICAgfQorCisgICAgLyogdXBkYXRlIHBNUC0+ZnJhbWVQb3MgKi8KKyAgICBpZiAoKytwTVAtPmZyYW1lUG9zID09IHBNUC0+ZnJhbWVSYW5nZSkgcE1QLT5mcmFtZVBvcyA9IDA7CisKKyAgICBpZiAocmMtPlQgPT0gMCkKKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IChJbnQpKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW3ZpZGVvLT5jdXJyTGF5ZXJdICogNy41ICsgMC41KTsgLyogMC43NXMgdGltZSBmcmFtZSAqLworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBQVl9NSU4ocE1QLT5jb3VudGVyX0JUZHN0LCAoSW50KShyYy0+bWF4X0JpdFZhcmlhbmNlX251bSAvIDIgKiAwLjQwKSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgbWF5IGdvIGJleW9uZCBWQlYgYnVmZmVyIGlmIHdlIHNldCB0aGUgYnVmZmVyIHNpemUgc21hbGxlciB0aGFuIDAuNzVzICovCisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IFBWX01BWChwTVAtPmNvdW50ZXJfQlRkc3QsIChJbnQpKChyYy0+QnMgLyAyIC0gcmMtPlZCVl9mdWxsbmVzcykgKiAwLjMwIC8gKHJjLT5UTU5fVEggLyAxMC4wKSArIDAuNSkpOyAvKiBBdCBsZWFzdCAzMCUgb2YgVkJWIGJ1ZmZlciBzaXplLzIgKi8KKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gUFZfTUlOKHBNUC0+Y291bnRlcl9CVGRzdCwgMjApOyAvKiBMaW1pdCB0aGUgdGFyZ2V0IHRvIGJlIHNtYWxsZXIgdGhhbiAzQyAqLworCisgICAgICAgIHBNUC0+dGFyZ2V0X2JpdHMgPSByYy0+VCA9IHJjLT5UTU5fVEggPSAoSW50KShyYy0+VE1OX1RIICogKDEuMCArIHBNUC0+Y291bnRlcl9CVGRzdCAqIDAuMSkpOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IHBNUC0+Y291bnRlcl9CVGRzdDsKKyAgICB9CisKKyAgICAvKiBjb2xsZWN0IHRoZSBuZWNlc3NhcnkgZGF0YTogdGFyZ2V0IGJpdHMsIGFjdHVhbCBiaXRzLCBtYWQgYW5kIFFQICovCisgICAgcE1QLT50YXJnZXRfYml0cyA9IHJjLT5UOworICAgIHBNUC0+UVAgID0gY3VyclZvcC0+cXVhbnRpemVyOworCisgICAgcE1QLT5tYWQgPSB2aWRlby0+c3VtTUFEIC8gKGZsb2F0KWN1cnJWb2wtPm5Ub3RhbE1COworICAgIGlmIChwTVAtPm1hZCA8IE1BRF9NSU4pIHBNUC0+bWFkID0gTUFEX01JTjsgLyogTUFEX01JTiBpcyBkZWZpbmVkIGFzIDEgaW4gbXA0ZGVmLmggKi8KKworICAgIHBNUC0+Yml0cmF0ZSA9IHJjLT5iaXRyYXRlOyAvKiBjYWxjdWxhdGVkIGluIFJDVm9wUVBTZXR0aW5nICovCisgICAgcE1QLT5mcmFtZXJhdGUgPSByYy0+ZnJhbWVyYXRlOworCisgICAgLyogZmlyc3QgcGFzcyBlbmNvZGluZyAqLworICAgIHBNUC0+blJlX1F1YW50aXplZCA9IDA7CisKKyAgICByZXR1cm4gIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBTYXZlUkRTYW1wbGVzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhpc3RvcnkgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTYXZlIFFQLCBhY3R1YWxfYml0cywgbWFkIGFuZCBSX0Qgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZvaWQgU2F2ZVJEU2FtcGxlcyhNdWx0aVBhc3MgKnBNUCwgSW50IGNvdW50ZXJfc2FtcGxlcykKK3sKKyAgICAvKiBmb3IgcE1QLT5wUkRTYW1wbGVzICovCisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10uUVAgICAgPSBwTVAtPlFQOworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLmFjdHVhbF9iaXRzID0gcE1QLT5hY3R1YWxfYml0czsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5tYWQgICA9IHBNUC0+bWFkOworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLlJfRCA9IChmbG9hdCkocE1QLT5hY3R1YWxfYml0cyAvIChwTVAtPm1hZCArIDAuMDAwMSkpOworCisgICAgcmV0dXJuIDsKK30KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUkNfVm9wVXBkYXRlU3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMi8yMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVwZGF0ZSBzdGF0aXN0aWNzIGZvciByYXRlIGNvbnRyb2wgYWZ0ZXIgZW5jb2RpbmcgZWFjaCBWT1AuICAqLworLyogICAgICAgICAgICAgTm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaW4gVmlkZW9FbmNEYXRhIHN0cnVjdHVyZS4gICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIFJDX1ZvcFVwZGF0ZVN0YXQoVmlkZW9FbmNEYXRhICp2aWRlbywgcmF0ZUNvbnRyb2wgKnJjKQoreworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKKyAgICBJbnQgZGlmZl9CVENvdW50ZXI7CisKKyAgICBzd2l0Y2ggKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUpCisgICAgeworICAgICAgICBjYXNlIENPTlNUQU5UX1E6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENCUl8xOgorICAgICAgICBjYXNlIENCUl8yOgorICAgICAgICBjYXNlIFZCUl8xOgorICAgICAgICBjYXNlIFZCUl8yOgorICAgICAgICBjYXNlIENCUl9MT1dERUxBWToKKworICAgICAgICAgICAgcE1QLT5hY3R1YWxfYml0cyA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50IDw8IDM7CisKKyAgICAgICAgICAgIFNhdmVSRFNhbXBsZXMocE1QLCAwKTsKKworICAgICAgICAgICAgcE1QLT5lbmNvZGVkX2ZyYW1lcysrOworCisgICAgICAgICAgICAvKiBmb3IgcE1QLT5zYW1wbGVzUGVyRnJhbWUgKi8KKyAgICAgICAgICAgIHBNUC0+c2FtcGxlc1BlckZyYW1lW3BNUC0+ZnJhbWVQb3NdID0gMDsKKworICAgICAgICAgICAgcE1QLT5zdW1fUVAgKz0gcE1QLT5RUDsKKworCisgICAgICAgICAgICAvKiB1cGRhdGUgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKyAgICAgICAgICAgIC8qIHJlLWFsbG9jYXRlIHRoZSB0YXJnZXQgYml0IGFnYWluIGFuZCB0aGVuIHN0b3AgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgIGRpZmZfQlRDb3VudGVyID0gKEludCkoKGZsb2F0KShyYy0+VE1OX1RIIC0gcmMtPlRNTl9XIC0gcE1QLT5hY3R1YWxfYml0cykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1QLT5iaXRyYXRlIC8gKHBNUC0+ZnJhbWVyYXRlICsgMC4wMDAxKSArIDAuMDAwMSkgLyAwLjEpOworICAgICAgICAgICAgaWYgKGRpZmZfQlRDb3VudGVyID49IDApCisgICAgICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IGRpZmZfQlRDb3VudGVyOyAvKiBwTVAtPmFjdHVhbF9iaXRzIGlzIHNtYWxsZXIgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gZGlmZl9CVENvdW50ZXI7IC8qIHBNUC0+YWN0dWFsX2JpdHMgaXMgYmlnZ2VyICovCisKKyAgICAgICAgICAgIHJjLT5UTU5fVEggLT0gKEludCkoKGZsb2F0KXBNUC0+Yml0cmF0ZSAvIChwTVAtPmZyYW1lcmF0ZSArIDAuMDAwMSkgKiAoZGlmZl9CVENvdW50ZXIgKiAwLjEpKTsKKyAgICAgICAgICAgIHJjLT5UID0gcE1QLT50YXJnZXRfYml0cyA9IHJjLT5UTU5fVEggLSByYy0+VE1OX1c7CisgICAgICAgICAgICBwTVAtPmRpZmZfY291bnRlciAtPSBkaWZmX0JUQ291bnRlcjsKKworICAgICAgICAgICAgcmMtPlJjID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQgPDwgMzsgICAvKiBUb3RhbCBCaXRzIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICByYy0+SGMgPSB2aWRlby0+aGVhZGVyX2JpdHM7ICAgIC8qIFRvdGFsIEJpdHMgaW4gSGVhZGVyIGFuZCBNb3Rpb24gVmVjdG9yICovCisKKyAgICAgICAgICAgIC8qIEJYX1JDICovCisgICAgICAgICAgICB1cGRhdGVSYXRlQ29udHJvbChyYywgdmlkZW8pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBmb3IgY2FzZSBDQlJfMS8yLCBWQlJfMS8yICovCisKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgIH0KKworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUkNfR2V0U2tpcE5leHRGcmFtZSwgUkNfR2V0UmVtYWluaW5nVm9wcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAyLzIwLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIGFjY2VzcyBSQyBwYXJhbWV0ZXJzIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUuICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK0ludCBSQ19HZXRTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpCit7CisgICAgcmV0dXJuIHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5za2lwX25leHRfZnJhbWU7Cit9CisKK3ZvaWQgUkNfUmVzZXRTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpCit7CisKKyAgICB2aWRlby0+cmNbY3VyckxheWVyXS0+c2tpcF9uZXh0X2ZyYW1lID0gMDsKKyAgICByZXR1cm4gOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFJDX1VwZGF0ZUJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDIvMjAvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIFJDIGluIGNhc2Ugb2YgdGhlcmUgYXJlIGZyYW1lcyBza2lwcGVkIChjYW1lcmEgZnJlZXplKSovCisvKiAgICAgICAgICAgICAgZnJvbSB0aGUgYXBwbGljYXRpb24gbGV2ZWwgaW4gYWRkaXRpb24gdG8gd2hhdCBSQyByZXF1ZXN0ZWQgKi8KKy8qICBJbi9vdXQgICA6IE5yLCBCLCBSciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK1BWX1NUQVRVUyBSQ19VcGRhdGVCdWZmZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllciwgSW50IG51bV9za2lwKQoreworICAgIHJhdGVDb250cm9sICpyYyAgPSB2aWRlby0+cmNbY3VyckxheWVyXTsKKyAgICBNdWx0aVBhc3MgICAqcE1QID0gdmlkZW8tPnBNUFtjdXJyTGF5ZXJdOworCisgICAgaWYgKHZpZGVvID09IE5VTEwgfHwgcmMgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICByYy0+VkJWX2Z1bGxuZXNzICAgLT0gKEludCkocmMtPmJpdHJhdGUgLyByYy0+ZnJhbWVyYXRlICogbnVtX3NraXApOyAvL3JjW2N1cnJMYXllcl0tPlJwOworICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMCAqIG51bV9za2lwOworCisgICAgLyogQ2hlY2sgYnVmZmVyIHVuZGVyZmxvdyAqLworICAgIGlmIChyYy0+VkJWX2Z1bGxuZXNzIDwgcmMtPmxvd19ib3VuZCkKKyAgICB7CisgICAgICAgIHJjLT5WQlZfZnVsbG5lc3MgPSByYy0+bG93X2JvdW5kOyAvLyAtcmMtPkJzLzI7CisgICAgICAgIHJjLT5UTU5fVyA9IHJjLT5WQlZfZnVsbG5lc3MgLSByYy0+bG93X2JvdW5kOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPSBwTVAtPmNvdW50ZXJfQlRkc3QgKyAoSW50KSgoZmxvYXQpKHJjLT5CcyAvIDIgLSByYy0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgfQorCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBSQ19VcGRhdGVCWFJDUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIFJDIHBhcmFtZXRlcnMgc3BlY2lmaWNhbGx5IGZvciB0YXJnZXQgYml0cmF0ZSBvciAgICAgICovCisvKiAgICAgICAgICAgICBmcmFtZXJhdGUgdXBkYXRlIGR1cmluZyBhbiBlbmNvZGluZyBzZXNzaW9uICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgUkNfVXBkYXRlQlhSQ1BhcmFtcyh2b2lkICppbnB1dCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKSBpbnB1dDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICByYXRlQ29udHJvbCAqKnJjID0gdmlkZW8tPnJjOworICAgIEludCBudW1MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisgICAgSW50ICpMYXllckJpdFJhdGUgPSBlbmNQYXJhbXMtPkxheWVyQml0UmF0ZTsKKyAgICBmbG9hdCAqTGF5ZXJGcmFtZVJhdGUgPSBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlOworICAgIE11bHRpUGFzcyAqKnBNUCA9IHZpZGVvLT5wTVA7CisKKyAgICBJbnQgbiwgVkJWX2Z1bGxuZXNzOworICAgIEludCBkaWZmX2NvdW50ZXI7CisKKyAgICBleHRlcm4gQm9vbCBTZXRQcm9maWxlX0J1ZmZlclNpemUoVmlkZW9FbmNEYXRhICp2aWRlbywgZmxvYXQgZGVsYXksIEludCBiSW5pdGlhbGl6ZWQpOworCisKKyAgICAvKiBSZXNldCB2aWRlbyBidWZmZXIgc2l6ZSBkdWUgdG8gdGFyZ2V0IGJpdHJhdGUgY2hhbmdlICovCisgICAgU2V0UHJvZmlsZV9CdWZmZXJTaXplKHZpZGVvLCB2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXksIDApOyAvKiBvdXRwdXQ6IHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbXSAqLworCisgICAgZm9yIChuID0gMDsgbiA8IG51bUxheWVyczsgbisrKQorICAgIHsKKyAgICAgICAgLyogUmVtYWluaW5nIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIGFuZCB1bmRlcmZsb3cgY2hlY2sgaW4gdXBkYXRlIFJDICovCisgICAgICAgIHVwZGF0ZVJDX1Bvc3RQcm9jKHJjW25dLCB2aWRlbyk7CisgICAgICAgIHJjW25dLT5za2lwX25leHRfZnJhbWUgPSAwOyAvKiBtdXN0IGJlIGluaXRpYWxpemVkICovCisKKyAgICAgICAgLyogTmV3IGNoYW5nZXM6IGJpdHJhdGUgYW5kIGZyYW1lcmF0ZSwgQnMsIG1heF9CaXRWYXJpYW5jZV9udW0sIFRNTl9USChvcHRpb25hbCksIGVuY29kZWRfZnJhbWVzKG9wdGlvbmFsKSAqLworICAgICAgICByY1tuXS0+QnMgPSB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplW25dOworICAgICAgICBWQlZfZnVsbG5lc3MgPSAoSW50KShyY1tuXS0+QnMgKiAwLjUpOworCisgICAgICAgIGlmIChuID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjW25dLT5UTU5fVEggPSAoSW50KSgoZmxvYXQpTGF5ZXJCaXRSYXRlW25dIC8gTGF5ZXJGcmFtZVJhdGVbbl0pOworICAgICAgICAgICAgcmNbbl0tPmJpdHJhdGUgICA9IHBNUFtuXS0+Yml0cmF0ZSAgID0gTGF5ZXJCaXRSYXRlW25dOworICAgICAgICAgICAgcmNbbl0tPmZyYW1lcmF0ZSA9IHBNUFtuXS0+ZnJhbWVyYXRlID0gTGF5ZXJGcmFtZVJhdGVbbl07CisKKyAgICAgICAgICAgIC8vIEZvciBoMjYzIG9yIHNob3J0IGhlYWRlciBtb2RlLCB0aGUgYml0IHZhcmlhdGlvbiBpcyB3aXRoaW4gKC0yKlJtYXgqMTAwMS8zMDAwLCAyKlJtYXgqMTAwMS8zMDAwKQorICAgICAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChJbnQpKChyY1tuXS0+QnMgLSB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemUpIC8gMiAvIChyY1tuXS0+Yml0cmF0ZSAvIHJjW25dLT5mcmFtZXJhdGUgLyAxMC4wKSkgLSA1OworICAgICAgICAgICAgICAgIC8vcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgoZmxvYXQpKHJjW25dLT5CcyAtIHJjW25dLT5WQlZfZnVsbG5lc3MpLygoZmxvYXQpTGF5ZXJCaXRSYXRlW25dL0xheWVyRnJhbWVSYXRlW25dLzEwLjApKS01OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgIC8vIE1QRUctNCBub3JtYWwgbW9kZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChJbnQpKChmbG9hdCkocmNbbl0tPkJzIC0gVkJWX2Z1bGxuZXNzKSAqIDEwIC8gKChmbG9hdClMYXllckJpdFJhdGVbbl0gLyBMYXllckZyYW1lUmF0ZVtuXSkpIC0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV0gPiAwKSAvKiAgNy8zMS8wMyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjW25dLT5UTU5fVEggPSAoSW50KSgoZmxvYXQpKExheWVyQml0UmF0ZVtuXSAtIExheWVyQml0UmF0ZVtuLTFdKSAvIChMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV0pKTsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChJbnQpKChmbG9hdCkocmNbbl0tPkJzIC0gVkJWX2Z1bGxuZXNzKSAqIDEwIC8gKChmbG9hdClyY1tuXS0+VE1OX1RIKSkgLSA1OworICAgICAgICAgICAgICAgIGlmIChyY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA8IDApIHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgLyogIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+VE1OX1RIID0gMSA8PCAzMDsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY1tuXS0+Yml0cmF0ZSAgID0gcE1QW25dLT5iaXRyYXRlICAgPSBMYXllckJpdFJhdGVbbl0gLSBMYXllckJpdFJhdGVbbi0xXTsKKyAgICAgICAgICAgIHJjW25dLT5mcmFtZXJhdGUgPSBwTVBbbl0tPmZyYW1lcmF0ZSA9IExheWVyRnJhbWVSYXRlW25dIC0gTGF5ZXJGcmFtZVJhdGVbbi0xXTsKKyAgICAgICAgfQorCisgICAgICAgIHBNUFtuXS0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lX3ByZXYgPSBwTVBbbl0tPnRhcmdldF9iaXRzX3Blcl9mcmFtZTsKKyAgICAgICAgcE1QW25dLT50YXJnZXRfYml0c19wZXJfZnJhbWUgPSBwTVBbbl0tPmJpdHJhdGUgLyAoZmxvYXQpKHBNUFtuXS0+ZnJhbWVyYXRlICsgMC4wMDAxKTsgIC8qICA3LzMxLzAzICovCisKKyAgICAgICAgLyogcmNbbl0tPlZCVl9mdWxsbmVzcyBhbmQgcmNbbl0tPlRNTl9XIHNob3VsZCBiZSBrZXB0IHNhbWUgKi8KKyAgICAgICAgLyogdXBkYXRlIHBNUFtuXS0+Y291bnRlcl9CVGRzdCBhbmQgcE1QW25dLT5jb3VudGVyX0JUc3JjICAgKi8KKyAgICAgICAgZGlmZl9jb3VudGVyID0gKEludCkoKGZsb2F0KShyY1tuXS0+VkJWX2Z1bGxuZXNzIC0gcmNbbl0tPlRNTl9XKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTVBbbl0tPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwICsgMC4wMDAxKSk7IC8qICA3LzMxLzAzICovCisKKyAgICAgICAgcE1QW25dLT5jb3VudGVyX0JUZHN0ID0gcE1QW25dLT5jb3VudGVyX0JUc3JjID0gMDsKKyAgICAgICAgaWYgKGRpZmZfY291bnRlciA+IDApCisgICAgICAgICAgICBwTVBbbl0tPmNvdW50ZXJfQlRkc3QgPSBkaWZmX2NvdW50ZXI7CisKKyAgICAgICAgZWxzZSBpZiAoZGlmZl9jb3VudGVyIDwgMCkKKyAgICAgICAgICAgIHBNUFtuXS0+Y291bnRlcl9CVHNyYyA9IC1kaWZmX2NvdW50ZXI7CisKKyAgICAgICAgcmNbbl0tPlRNTl9XID0gKEludCkocmNbbl0tPlZCVl9mdWxsbmVzcyAtICAgICAgLyogcmUtY2FsY3VsYXRlIHJjW25dLT5UTU5fVyBpbiBvcmRlciBmb3IgaGlnaGVyIGFjY3VyYWN5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTVBbbl0tPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSAqIChwTVBbbl0tPmNvdW50ZXJfQlRkc3QgLSBwTVBbbl0tPmNvdW50ZXJfQlRzcmMpKTsKKworICAgICAgICAvKiBLZWVwIHRoZSBjdXJyZW50IGF2ZXJhZ2UgbWFkICovCisgICAgICAgIGlmIChwTVBbbl0tPmF2ZXJfbWFkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNUFtuXS0+YXZlcl9tYWRfcHJldiA9IHBNUFtuXS0+YXZlcl9tYWQ7CisgICAgICAgICAgICBwTVBbbl0tPmVuY29kZWRfZnJhbWVzX3ByZXYgPSBwTVBbbl0tPmVuY29kZWRfZnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgcE1QW25dLT5hdmVyX21hZCA9IDA7CisgICAgICAgIHBNUFtuXS0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA9IDQ7CisKKyAgICAgICAgLyogTWlzYyAqLworICAgICAgICBwTVBbbl0tPnN1bV9tYWQgPSBwTVBbbl0tPnN1bV9RUCA9IDA7CisgICAgICAgIC8vcE1QW25dLT5lbmNvZGVkX2ZyYW1lc19wcmV2ID0gcE1QW25dLT5lbmNvZGVkX2ZyYW1lczsKKyAgICAgICAgcE1QW25dLT5lbmNvZGVkX2ZyYW1lcyA9IHBNUFtuXS0+cmVfZW5jb2RlZF9mcmFtZXMgPSBwTVBbbl0tPnJlX2VuY29kZWRfdGltZXMgPSAwOworCisgICAgfSAvKiBlbmQgb2Y6IGZvcihuPTA7IG48bnVtTGF5ZXJzOyBuKyspICovCisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiB0YXJnZXRCaXRDYWxjdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTAvMDEvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHF1YWRyYXRpYyBiaXQgYWxsb2NhdGlvbiBtb2RlbDogVChuKSA9IEMqc3FydChtYWQobikvYXZlcl9tYWQobi0xKSkgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogcmMtPlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbih2b2lkICppbnB1dCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKSBpbnB1dDsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHZpZGVvLT5wTVBbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICByYXRlQ29udHJvbCAqcmMgPSB2aWRlby0+cmNbdmlkZW8tPmN1cnJMYXllcl07CisKKyAgICBmbG9hdCBjdXJyX21hZDsvLywgYXZlcmFnZV9tYWQ7CisgICAgSW50IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0LCBwcmV2X2NvdW50ZXJfZGlmZiwgY3Vycl9jb3VudGVyX2RpZmYsIGJvdW5kOworICAgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBmb3IgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKworICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KKyAgICB1cGRhdGVSQ19Qb3N0UHJvYyhyYywgdmlkZW8pOworCisgICAgLyogdXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYyBhbmQgcE1QLT5jb3VudGVyX0JUZHN0IHRvIGF2b2lkIGludGVyZ2VyIG92ZXJmbG93ICovCisgICAgaWYgKHBNUC0+Y291bnRlcl9CVHNyYyA+IDEwMDAgJiYgcE1QLT5jb3VudGVyX0JUZHN0ID4gMTAwMCkKKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyAtPSAxMDAwOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gMTAwMDsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIHRhcmdldCBjYWxjdWxhdGlvbiAqLworICAgIGN1cnJfbWFkID0gdmlkZW8tPnN1bU1BRCAvIChmbG9hdCljdXJyVm9sLT5uVG90YWxNQjsKKyAgICBpZiAoY3Vycl9tYWQgPCBNQURfTUlOKSBjdXJyX21hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKyAgICBwTVAtPmRpZmZfY291bnRlciA9IDA7CisKKworICAgIC8qMS5jYWxjdWxhdGUgYXZlcmFnZSBtYWQgKi8KKyAgICBwTVAtPnN1bV9tYWQgKz0gY3Vycl9tYWQ7CisgICAgLy9hdmVyYWdlX21hZCA9IChwTVAtPmVuY29kZWRfZnJhbWVzIDwgMSA/IGN1cnJfbWFkIDogcE1QLT5zdW1fbWFkLyhmbG9hdCkocE1QLT5lbmNvZGVkX2ZyYW1lcysxKSk7IC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNjb25kIGVuY29kZWQgZnJhbWUqLworICAgIC8vcE1QLT5hdmVyX21hZCA9IGF2ZXJhZ2VfbWFkOworICAgIGlmIChwTVAtPmVuY29kZWRfZnJhbWVzID49IDApIC8qIHBNUC0+ZW5jb2RlZF9mcmFtZXMgaXMgc2V0IHRvIC0xIGluaXRpYWxseSwgc28gZm9yZ2V0IGFib3V0IHRoZSB2ZXJ5IGZpcnN0IEkgZnJhbWUgKi8KKyAgICAgICAgcE1QLT5hdmVyX21hZCA9IChwTVAtPmF2ZXJfbWFkICogcE1QLT5lbmNvZGVkX2ZyYW1lcyArIGN1cnJfbWFkKSAvIChwTVAtPmVuY29kZWRfZnJhbWVzICsgMSk7CisKKyAgICBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID4gMCAmJiBwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgPj0gMCkgIC8qICA3LzMxLzAzICovCisgICAgICAgIHBNUC0+YXZlcl9tYWRfcHJldiA9IChwTVAtPmF2ZXJfbWFkX3ByZXYgKiBwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ICsgMSk7CisKKyAgICAvKjIuYXZlcmFnZV9tYWQsIG1hZCA9PT4gZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QgKi8KKyAgICBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID09IDApCisgICAgeworICAgICAgICAvKiBvcmlnaW5hbCB2ZXJpc29uICovCisgICAgICAgIGlmIChjdXJyX21hZCA+IHBNUC0+YXZlcl9tYWQqMS4xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkgPiAyKQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChJbnQpKE00VkVOQ19TUVJUKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRkc3QgPSAoSW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKSoyK2N1cnJfbWFkL3BNUC0+YXZlcl9tYWQpLygzKjAuMSkgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKEludCkoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGN1cnJfbWFkIDw9IGF2ZXJhZ2VfbWFkKjEuMSAqLworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChJbnQpKChzcXJ0KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQpICsgcG93KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQsIDEuMC8zLjApKS8oMi4wKjAuMSkgKyAwLjQpOworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KShNNFZFTkNfU1FSVChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSkgKiAxMCArIDAuNSk7CisgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KShjdXJyX21hZC9wTVAtPmF2ZXJfbWFkLzAuMSArIDAuNSkKKworICAgICAgICAvKiBhY3RpdmVseSBmaWxsIGluIHRoZSBwb3NzaWJsZSBnYXAgKi8KKyAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA9PSAwICYmIGRpZmZfY291bnRlcl9CVGRzdCA9PSAwICYmCisgICAgICAgICAgICAgICAgY3Vycl9tYWQgPD0gcE1QLT5hdmVyX21hZCoxLjEgJiYgcE1QLT5jb3VudGVyX0JUc3JjIDwgcE1QLT5jb3VudGVyX0JUZHN0KQorICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTsKKworICAgIH0KKyAgICBlbHNlIGlmIChwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPiAwKQorICAgIHsKKyAgICAgICAgLyogdHJhbnNpdGlvbiB0aW1lOiB1c2UgcHJldmlvdXMgYXZlcmFnZSBtYWQgInBNUC0+YXZlcl9tYWRfcHJldiIgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBhdmVyYWdlIG1hZCAicE1QLT5hdmVyX21hZCIgKi8KKyAgICAgICAgaWYgKGN1cnJfbWFkID4gcE1QLT5hdmVyX21hZF9wcmV2KjEuMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJfbWFkIC8gcE1QLT5hdmVyX21hZF9wcmV2ID4gMikKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoSW50KShNNFZFTkNfU1FSVChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRkc3QgPSAoSW50KSgoTTRWRU5DX1NRUlQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KSoyK2N1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikvKDMqMC4xKSArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoSW50KShjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEgKi8KKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpICsgcG93KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldiwgMS4wLzMuMCkpLygyLjAqMC4xKSArIDAuNCk7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChJbnQpKE00VkVOQ19TUVJUKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWRfcHJldiArIDAuMDAwMSkpICogMTAgKyAwLjUpOworICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2LzAuMSArIDAuNSkKKworICAgICAgICAvKiBhY3RpdmVseSBmaWxsIGluIHRoZSBwb3NzaWJsZSBnYXAgKi8KKyAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA9PSAwICYmIGRpZmZfY291bnRlcl9CVGRzdCA9PSAwICYmCisgICAgICAgICAgICAgICAgY3Vycl9tYWQgPD0gcE1QLT5hdmVyX21hZF9wcmV2KjEuMSAmJiBwTVAtPmNvdW50ZXJfQlRzcmMgPCBwTVAtPmNvdW50ZXJfQlRkc3QpCisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxOworCisgICAgICAgIGlmICgtLXBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA8PSAwKSAgICBwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPSAwOworICAgIH0KKworCisgICAgLyogaWYgZGlmZmVyZW5jZSBpcyB0b28gbXVjaCwgZG8gY2xpcHBpbmcgKi8KKyAgICAvKiBGaXJzdCwgc2V0IHRoZSB1cHBlciBib3VuZCBmb3IgY3VycmVudCBiaXQgYWxsb2NhdGlvbiB2YXJpYW5jZTogODAlIG9mIGF2YWlsYWJsZSBidWZmZXIgKi8KKyAgICBib3VuZCA9IChJbnQpKChyYy0+QnMgLyAyIC0gcmMtPlZCVl9mdWxsbmVzcykgKiAwLjYgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOyAvKiByYy0+QnMgKi8KKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAgUFZfTUlOKGRpZmZfY291bnRlcl9CVHNyYywgYm91bmQpOworICAgIGRpZmZfY291bnRlcl9CVGRzdCA9ICBQVl9NSU4oZGlmZl9jb3VudGVyX0JUZHN0LCBib3VuZCk7CisKKyAgICAvKiBTZWNvbmQsIHNldCBhbm90aGVyIHVwcGVyIGJvdW5kIGZvciBjdXJyZW50IGJpdCBhbGxvY2F0aW9uOiA0LTUqYml0cmF0ZS9mcmFtZXJhdGUgKi8KKyAgICBib3VuZCA9IDUwOworLy8gIGlmKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZKQorLy8gIG5vdCBuZWNlc3NhcnkgICAgICAgYm91bmQgPSAxMDsgICAgIC8qICAxLzE3LzAyIC0tIEZvciBMb3cgZGVsYXkgKi8KKworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9ICBQVl9NSU4oZGlmZl9jb3VudGVyX0JUc3JjLCBib3VuZCk7CisgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gIFBWX01JTihkaWZmX2NvdW50ZXJfQlRkc3QsIGJvdW5kKTsKKworCisgICAgLyogVGhpcmQsIGNoZWNrIHRoZSBidWZmZXIgKi8KKyAgICBwcmV2X2NvdW50ZXJfZGlmZiA9IHBNUC0+Y291bnRlcl9CVGRzdCAtIHBNUC0+Y291bnRlcl9CVHNyYzsKKyAgICBjdXJyX2NvdW50ZXJfZGlmZiA9IHByZXZfY291bnRlcl9kaWZmICsgKGRpZmZfY291bnRlcl9CVGRzdCAtIGRpZmZfY291bnRlcl9CVHNyYyk7CisKKyAgICBpZiAoUFZfQUJTKHByZXZfY291bnRlcl9kaWZmKSA+PSByYy0+bWF4X0JpdFZhcmlhbmNlX251bSB8fCBQVl9BQlMoY3Vycl9jb3VudGVyX2RpZmYpID49IHJjLT5tYXhfQml0VmFyaWFuY2VfbnVtKSAvLyBQVl9BQlMoY3Vycl9jb3VudGVyX2RpZmYpID49IFBWX0FCUyhwcmV2X2NvdW50ZXJfZGlmZikgKQorICAgIHsgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisKKyAgICAgICAgaWYgKGN1cnJfY291bnRlcl9kaWZmID4gcmMtPm1heF9CaXRWYXJpYW5jZV9udW0gJiYgZGlmZl9jb3VudGVyX0JUZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAocmMtPm1heF9CaXRWYXJpYW5jZV9udW0gLSBwcmV2X2NvdW50ZXJfZGlmZikgKyBkaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUZHN0IDwgMCkgZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKGN1cnJfY291bnRlcl9kaWZmIDwgLXJjLT5tYXhfQml0VmFyaWFuY2VfbnVtICYmIGRpZmZfY291bnRlcl9CVHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0IC0gKC1yYy0+bWF4X0JpdFZhcmlhbmNlX251bSAtIHByZXZfY291bnRlcl9kaWZmKTsKKyAgICAgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPCAwKSBkaWZmX2NvdW50ZXJfQlRzcmMgPSAwOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKjMuZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QgPT0+IFRNTl9USCAqLworICAgIC8vcmMtPlRNTl9USCA9IChJbnQpKChmbG9hdClwTVAtPmJpdHJhdGUvcE1QLT5mcmFtZXJhdGUpOworICAgIHJjLT5UTU5fVEggPSAoSW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSk7CisgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAwOworCisgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYykKKyAgICB7CisgICAgICAgIHJjLT5UTU5fVEggLT0gKEludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgKiBkaWZmX2NvdW50ZXJfQlRzcmMgKiAwLjEpOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IC1kaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgfQorICAgIGVsc2UgaWYgKGRpZmZfY291bnRlcl9CVGRzdCkKKyAgICB7CisgICAgICAgIHJjLT5UTU5fVEggKz0gKEludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgKiBkaWZmX2NvdW50ZXJfQlRkc3QgKiAwLjEpOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IGRpZmZfY291bnRlcl9CVGRzdDsKKyAgICB9CisKKworICAgIC8qNC51cGRhdGUgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKyAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gZGlmZl9jb3VudGVyX0JUc3JjOworICAgIHBNUC0+Y291bnRlcl9CVGRzdCArPSBkaWZmX2NvdW50ZXJfQlRkc3Q7CisKKworICAgIC8qNS50YXJnZXQgYml0IGNhbGN1bGF0aW9uICovCisgICAgcmMtPlQgPSByYy0+VE1OX1RIIC0gcmMtPlRNTl9XOworICAgIC8vcmMtPlQgPSByYy0+VE1OX1RIIC0gKEludCkoKGZsb2F0KXJjLT5UTU5fVy9yYy0+ZnJhbWVSYXRlKTsKKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgcmMtPlQgPiB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemUpCisgICAgeworICAgICAgICByYy0+VCA9IHZpZGVvLT5lbmNQYXJhbXMtPm1heEZyYW1lU2l6ZTsgIC8vICBhZGRlZCB0aGlzIDExLzA3LzA1CisgICAgfQorCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTAvMDEvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHZhcmlhYmxlIHJhdGUgYml0IGFsbG9jYXRpb24gKyBuZXcgUVAgZGV0ZXJtaW5hdGlvbiBzY2hlbWUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogcmMtPlQgYW5kIHJjLT5RYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICsgUVAgY2FsY3VsYXRpb24gd2l0aCBhIG5ldyBxdWFkcmF0aWMgbWV0aG9kICovCit2b2lkIGNhbGN1bGF0ZVF1YW50aXplcl9NdWx0aXBhc3Modm9pZCAqaW5wdXQpCit7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKikgaW5wdXQ7CisgICAgTXVsdGlQYXNzICpwTVAgPSB2aWRlby0+cE1QW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgcmF0ZUNvbnRyb2wgKnJjID0gdmlkZW8tPnJjW3ZpZGVvLT5jdXJyTGF5ZXJdOworCisgICAgSW50IHByZXZfUVAsIHByZXZfYWN0dWFsX2JpdHMsIGN1cnJfdGFyZ2V0LCBpLCBqOworCisgICAgZmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKKworCisgICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiAqLworICAgIHRhcmdldEJpdENhbGN1bGF0aW9uKCh2b2lkKikgdmlkZW8pOworCisgICAgaWYgKHJjLT5UIDw9IDAgfHwgdmlkZW8tPnN1bU1BRCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKHJjLT5UIDwgMCkgIHJjLT5RYyA9IDMxOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBjdXJyZW50IGZyYW1lIFFQIGVzdGltYXRpb24gKi8KKyAgICBjdXJyX3RhcmdldCA9IHJjLT5UOworICAgIGN1cnJfbWFkID0gdmlkZW8tPnN1bU1BRCAvIChmbG9hdCljdXJyVm9sLT5uVG90YWxNQjsKKyAgICBpZiAoY3Vycl9tYWQgPCBNQURfTUlOKSBjdXJyX21hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisgICAgY3Vycl9SRCAgPSAoZmxvYXQpY3Vycl90YXJnZXQgLyBjdXJyX21hZDsKKworICAgIC8qIEFub3RoZXIgdmVyc2lvbiBvZiBzZWFyY2ggdGhlIG9wdGltYWwgcG9pbnQgKi8KKyAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzWzBdWzBdLmFjdHVhbF9iaXRzOworICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzWzBdWzBdLm1hZDsKKworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcE1QLT5mcmFtZVJhbmdlOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZCAhPSAwICYmIHByZXZfbWFkICE9IDAgJiYKKyAgICAgICAgICAgICAgICBQVl9BQlMocHJldl9tYWQgLSBjdXJyX21hZCkgPiBQVl9BQlMocE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZCAtIGN1cnJfbWFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5hY3R1YWxfYml0czsKKyAgICAgICAgICAgIGogPSBpOworICAgICAgICB9CisgICAgfQorICAgIHByZXZfUVAgPSBwTVAtPnBSRFNhbXBsZXNbal1bMF0uUVA7CisgICAgZm9yIChpID0gMTsgaSA8IHBNUC0+c2FtcGxlc1BlckZyYW1lW2pdOyBpKyspCisgICAgeworICAgICAgICBpZiAoUFZfQUJTKHByZXZfYWN0dWFsX2JpdHMgLSBjdXJyX3RhcmdldCkgPiBQVl9BQlMocE1QLT5wUkRTYW1wbGVzW2pdW2ldLmFjdHVhbF9iaXRzIC0gY3Vycl90YXJnZXQpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2pdW2ldLmFjdHVhbF9iaXRzOworICAgICAgICAgICAgcHJldl9RUCA9IHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5RUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHF1YWRyYXRpYyBhcHByb3hpbWF0aW9uCisgICAgcHJldl9SRCA9IChmbG9hdClwcmV2X2FjdHVhbF9iaXRzIC8gcHJldl9tYWQ7CisgICAgLy9yYy0+UWMgPSAoSW50KShwcmV2X1FQICogc3FydChwcmV2X2FjdHVhbF9iaXRzL2N1cnJfdGFyZ2V0KSArIDAuNCk7CisgICAgaWYgKHByZXZfUVAgPT0gMSkgLy8gMTEvMTQvMDUsIGFkZGVkIHRoaXMgdG8gYWxsb3cgZ2V0dGluZyBvdXQgb2YgUVAgPSAxIGVhc2lseQorICAgIHsKKyAgICAgICAgcmMtPlFjID0gKEludCkocHJldl9SRCAvIGN1cnJfUkQgKyAwLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYy0+UWMgPSAoSW50KShwcmV2X1FQICogTTRWRU5DX1NRUlQocHJldl9SRCAvIGN1cnJfUkQpICsgMC45KTsKKworICAgICAgICBpZiAocHJldl9SRCAvIGN1cnJfUkQgPiAwLjUgJiYgcHJldl9SRCAvIGN1cnJfUkQgPCAyLjApCisgICAgICAgICAgICByYy0+UWMgPSAoSW50KShwcmV2X1FQICogKE00VkVOQ19TUVJUKHByZXZfUkQgLyBjdXJyX1JEKSArIHByZXZfUkQgLyBjdXJyX1JEKSAvIDIuMCArIDAuOSk7IC8qIFF1YWRyYXRpYyBhbmQgbGluZWFyIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmMtPlFjID0gKEludCkocHJldl9RUCAqIChNNFZFTkNfU1FSVChwcmV2X1JEIC8gY3Vycl9SRCkgKyBNNFZFTkNfUE9XKHByZXZfUkQgLyBjdXJyX1JELCAxLjAgLyAzLjApKSAvIDIuMCArIDAuOSk7CisgICAgfQorICAgIC8vcmMtPlFjID0oSW50KShwcmV2X1FQICogc3FydChwcmV2X1JEL2N1cnJfUkQpICsgMC40KTsKKyAgICAvLyAxMS8wOC8wNQorICAgIC8vIGxvd2VyIGJvdW5kIG9uIFFjIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIGN1cnJfbWFkCisgICAgLy8gV2hlbiBtYWQgaXMgYWxyZWFkeSBsb3csIGxvd2VyIGJvdW5kIG9uIFFjIGRvZXNuJ3QgaGF2ZSB0byBiZSBzbWFsbC4KKyAgICAvLyBOb3RlLCB0aGlzIGRvZXNuJ3Qgd29yayB3ZWxsIGZvciBsb3cgY29tcGxleGl0eSBjbGlwIGVuY29kZWQgYXQgaGlnaCBiaXQgcmF0ZQorICAgIC8vIGl0IGRvZXNuJ3QgaGl0IHRoZSB0YXJnZXQgYml0IHJhdGUgZHVlIHRvIHRoaXMgUVAgbG93ZXIgYm91bmQuCisvLy8gaWYoKGN1cnJfbWFkIDwgOCkgJiYgKHJjLT5RYyA8IDEyKSkgcmMtPlFjID0gMTI7CisvLyAgZWxzZSAgICBpZigoY3Vycl9tYWQgPCAxMjgpICYmIChyYy0+UWMgPCAzKSkgcmMtPlFjID0gMzsKKworICAgIGlmIChyYy0+UWMgPCAxKSByYy0+UWMgPSAxOworICAgIGlmIChyYy0+UWMgPiAzMSkgICAgcmMtPlFjID0gMzE7CisKKworICAgIC8qIGFjdGl2ZSBiaXQgcmVzb3VyY2UgcHJvdGVjdGlvbiAqLworICAgIGF2ZXJfUVAgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA9PSAwID8gMCA6IHBNUC0+c3VtX1FQIC8gKGZsb2F0KXBNUC0+ZW5jb2RlZF9mcmFtZXMpOworICAgIGF2ZXJhZ2VfbWFkID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCA/IDAgOiBwTVAtPnN1bV9tYWQgLyAoZmxvYXQpcE1QLT5lbmNvZGVkX2ZyYW1lcyk7IC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNjb25kIGVuY29kZWQgZnJhbWUqLworICAgIGlmIChwTVAtPmRpZmZfY291bnRlciA9PSAwICYmCisgICAgICAgICAgICAoKGZsb2F0KXJjLT5RYyA8PSBhdmVyX1FQKjEuMSB8fCBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEpICYmCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPD0gKHBNUC0+Y291bnRlcl9CVGRzdCArIChJbnQpKHBNUC0+ZnJhbWVyYXRlKjEuMCArIDAuNSkpKQorICAgIHsKKyAgICAgICAgcmMtPlRNTl9USCAtPSAoSW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwLjApOworICAgICAgICByYy0+VCA9IHJjLT5UTU5fVEggLSByYy0+VE1OX1c7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYysrOworICAgICAgICBwTVAtPmRpZmZfY291bnRlci0tOworICAgIH0KKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogdXBkYXRlUmF0ZUNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMS8xNy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6VXBkYXRlIHRoZSBSRCBNb2RhbCAoQWZ0ZXIgRW5jb2RpbmcgdGhlIEN1cnJlbnQgRnJhbWUpICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgdXBkYXRlUmF0ZUNvbnRyb2wocmF0ZUNvbnRyb2wgKnJjLCBWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIEludCAgZnJhbWVfYml0czsKKworCisgICAgLyogcmF0ZSBjb250cm9cbCAqLworICAgIGZyYW1lX2JpdHMgPSAoSW50KShyYy0+Yml0cmF0ZSAvIHJjLT5mcmFtZXJhdGUpOworICAgIHJjLT5UTU5fVyArPSAocmMtPlJjIC0gcmMtPlRNTl9USCk7CisgICAgcmMtPlZCVl9mdWxsbmVzcyArPSAocmMtPlJjIC0gZnJhbWVfYml0cyk7IC8vcmMtPlJwKTsKKyAgICAvL2lmKHJjLT5WQlZfZnVsbG5lc3MgPCAwKSByYy0+VkJWX2Z1bGxuZXNzID0gLTE7CisKKyAgICByYy0+ZW5jb2RlZF9mcmFtZXMrKzsKKworICAgIC8qIGZyYW1lIGRyb3BwaW5nICovCisgICAgcmMtPnNraXBfbmV4dF9mcmFtZSA9IDA7CisKKyAgICBpZiAoKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCAmJiByYy0+UmMgPiB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemUpIHx8IC8qICBGb3IgSDI2My9zaG9ydCBoZWFkZXIgbW9kZSwgZHJvcCB0aGUgZnJhbWUgaWYgdGhlIGFjdHVhbCBmcmFtZSBzaXplIGV4Y2VlZHMgdGhlIGJvdW5kICovCisgICAgICAgICAgICAocmMtPlZCVl9mdWxsbmVzcyA+IHJjLT5CcyAvIDIgJiYgIXJjLT5ub19wcmVfc2tpcCkpIC8qIHNraXAgdGhlIGN1cnJlbnQgZnJhbWUgKi8gLyogcmMtPkJzICovCisgICAgeworICAgICAgICByYy0+VE1OX1cgLT0gKHJjLT5SYyAtIHJjLT5UTU5fVEgpOworICAgICAgICByYy0+VkJWX2Z1bGxuZXNzIC09IHJjLT5SYzsKKyAgICAgICAgcmMtPnNraXBfbmV4dF9mcmFtZSA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICgoZmxvYXQpKHJjLT5WQlZfZnVsbG5lc3MgLSByYy0+VkJWX2Z1bGxuZXNzX29mZnNldCkgPiAocmMtPkJzIC8gMiAtIHJjLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSowLjk1ICYmCisgICAgICAgICAgICAgIXJjLT5ub19mcmFtZV9za2lwKSAvKiBza2lwIG5leHQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHJjLT5WQlZfZnVsbG5lc3MgLT0gZnJhbWVfYml0czsgLy9yYy0+UnA7CisgICAgICAgIHJjLT5za2lwX25leHRfZnJhbWUgPSAxOworICAgICAgICAvKiAgc2tpcCBtb3JlIHRoYW4gMSBmcmFtZXMgICovCisgICAgICAgIC8vd2hpbGUocmMtPlZCVl9mdWxsbmVzcyA+IHJjLT5CcyowLjQ3NSkKKyAgICAgICAgd2hpbGUgKChyYy0+VkJWX2Z1bGxuZXNzIC0gcmMtPlZCVl9mdWxsbmVzc19vZmZzZXQpID4gKHJjLT5CcyAvIDIgLSByYy0+VkJWX2Z1bGxuZXNzX29mZnNldCkqMC45NSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMtPlZCVl9mdWxsbmVzcyAtPSBmcmFtZV9iaXRzOyAvL3JjLT5ScDsKKyAgICAgICAgICAgIHJjLT5za2lwX25leHRfZnJhbWUrKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFTkQgICovCisgICAgfQorCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogdXBkYXRlUkNfUG9zdFByb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8wOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFJlbWFpbmcgUkMgdXBkYXRlIHN0dWZmIGZvciBmcmFtZSBza2lwIGFuZCBidWZmZXIgdW5kZXJmbG93ICAqLworLyogICAgICAgICAgICAgY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3ZvaWQgdXBkYXRlUkNfUG9zdFByb2MocmF0ZUNvbnRyb2wgKnJjLCBWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIE11bHRpUGFzcyAqcE1QID0gdmlkZW8tPnBNUFt2aWRlby0+Y3VyckxheWVyXTsKKworICAgIGlmIChyYy0+c2tpcF9uZXh0X2ZyYW1lID09IDEgJiYgIXJjLT5ub19mcmFtZV9za2lwKSAvKiBza2lwIG5leHQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMCAqIHJjLT5za2lwX25leHRfZnJhbWU7CisKKyAgICB9CisgICAgZWxzZSBpZiAocmMtPnNraXBfbmV4dF9mcmFtZSA9PSAtMSAmJiAhcmMtPm5vX3ByZV9za2lwKSAvKiBza2lwIGN1cnJlbnQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCAtPSBwTVAtPmRpZmZfY291bnRlcjsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IDEwOworCisgICAgICAgIHBNUC0+c3VtX21hZCAtPSBwTVAtPm1hZDsKKyAgICAgICAgcE1QLT5hdmVyX21hZCA9IChwTVAtPmF2ZXJfbWFkICogcE1QLT5lbmNvZGVkX2ZyYW1lcyAtIHBNUC0+bWFkKSAvIChmbG9hdCkocE1QLT5lbmNvZGVkX2ZyYW1lcyAtIDEgKyAwLjAwMDEpOworICAgICAgICBwTVAtPnN1bV9RUCAgLT0gcE1QLT5RUDsKKyAgICAgICAgcE1QLT5lbmNvZGVkX2ZyYW1lcyAtLTsKKyAgICB9CisgICAgLyogc29tZSBzdHVmZiBpbiB1cGRhdGUgVkJWX2Z1bGxuZXNzIHJlbWFpbnMgaGVyZSAqLworICAgIC8vaWYocmMtPlZCVl9mdWxsbmVzcyA8IC1yYy0+QnMvMikgLyogcmMtPkJzICovCisgICAgaWYgKHJjLT5WQlZfZnVsbG5lc3MgPCByYy0+bG93X2JvdW5kKQorICAgIHsKKyAgICAgICAgcmMtPlZCVl9mdWxsbmVzcyA9IHJjLT5sb3dfYm91bmQ7IC8vIC1yYy0+QnMvMjsKKyAgICAgICAgcmMtPlRNTl9XID0gcmMtPlZCVl9mdWxsbmVzcyAtIHJjLT5sb3dfYm91bmQ7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA9IHBNUC0+Y291bnRlcl9CVGRzdCArIChJbnQpKChmbG9hdCkocmMtPkJzIC8gMiAtIHJjLT5sb3dfYm91bmQpIC8gMi4wIC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyOTU0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9SQVRFX0NPTlRST0xfSF8KKyNkZWZpbmUgX1JBVEVfQ09OVFJPTF9IXworCisjaW5jbHVkZSAibXA0ZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5Cit7CisgICAgSW50IFFwOworICAgIEludCBScDsKKyAgICBmbG9hdCBNcDsgICAvKiBmb3IgTUItYmFzZWQgUkMsIDMvMTQvMDEgKi8KKyAgICBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkgKm5leHQ7CisgICAgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5ICpwcmV2OworfSBkYXRhUG9pbnRBcnJheTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEludCBhbHBoYTsgIC8qIHdlaWdodCBmb3IgSSBmcmFtZSAqLworICAgIEludCBSczsgICAgIC8qYml0IHJhdGUgZm9yIHRoZSBzZXF1ZW5jZSAob3Igc2VnbWVudCkgZS5nLiwgMjQwMDAgYml0cy9zZWMgKi8KKyAgICBJbnQgUmM7ICAgICAvKmJpdHMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuIEl0IGlzIHRoZSBiaXQgY291bnQgb2J0YWluZWQgYWZ0ZXIgZW5jb2RpbmcuICovCisgICAgSW50IFJwOyAgICAgLypiaXRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIHBlciBwaWN0dXJlLiAqLworICAgIC8qPyBpcyB0aGlzIHRoZSBhdmVyYWdlIG9uZSwgb3IganVzdCB0aGUgYml0cyBjb2RlZCBmb3IgdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgSW50IFJwczsgICAgLypiaXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGJ1ZmZlciBwZXIgc3JjIGZyYW1lICovCisgICAgZmxvYXQgVHM7ICAgLypudW1iZXIgb2Ygc2Vjb25kcyBmb3IgdGhlIHNlcXVlbmNlICAob3Igc2VnbWVudCkuIGUuZy4sIDEwIHNlYyAqLworICAgIGZsb2F0IEVwOworICAgIGZsb2F0IEVjOyAgIC8qbWVhbiBhYnNvbHV0ZSBkaWZmZXJlbmNlIGZvciB0aGUgY3VycmVudCBmcmFtZSBhZnRlciBtb3Rpb24gY29tcGVuc2F0aW9uLiovCisgICAgLypJZiB0aGUgbWFjcm9ibG9jayBpcyBpbnRyYSBjb2RlZCwgdGhlIG9yaWdpbmFsIHNwYXRpYWwgcGl4ZWwgdmFsdWVzIGFyZSBzdW1tZWQuKi8KKyAgICBJbnQgUWM7ICAgICAvKnF1YW50aXphdGlvbiBsZXZlbCB1c2VkIGZvciB0aGUgY3VycmVudCBmcmFtZS4gKi8KKyAgICBJbnQgTnI7ICAgICAvKm51bWJlciBvZiBQIGZyYW1lcyByZW1haW5pbmcgZm9yIGVuY29kaW5nLiovCisgICAgSW50IFJyOyAvKm51bWJlciBvZiBiaXRzIHJlbWFpbmluZyBmb3IgZW5jb2RpbmcgdGhpcyBzZXF1ZW5jZSAob3Igc2VnbWVudCkuKi8KKyAgICBJbnQgUnJfT2xkOy8qIDEyLzI0LzAwICovCisgICAgSW50IFQ7ICAgICAgLyp0YXJnZXQgYml0IHRvIGJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiovCisgICAgSW50IFM7ICAgICAgLypudW1iZXIgb2YgYml0cyB1c2VkIGZvciBlbmNvZGluZyB0aGUgcHJldmlvdXMgZnJhbWUuKi8KKyAgICBJbnQgSGM7IC8qaGVhZGVyIGFuZCBtb3Rpb24gdmVjdG9yIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBmcmFtZS4gSXQgaW5jbHVkZXMgYWxsIHRoZSAgaW5mb3JtYXRpb24gZXhjZXB0IHRvIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4qLworICAgIEludCBIcDsgLypoZWFkZXIgYW5kIG1vdGlvbiB2ZWN0b3IgYml0cyB1c2VkIGluIHRoZSBwcmV2aW91cyBmcmFtZS4gSXQgaW5jbHVkZXMgYWxsIHRoZSAgICAgaW5mb3JtYXRpb24gZXhjZXB0IHRvIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4qLworICAgIEludCBRbDsgLypxdWFudGl6YXRpb24gbGV2ZWwgdXNlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBJbnQgQnM7IC8qYnVmZmVyIHNpemUgZS5nLiwgUi8yICovCisgICAgSW50IEI7ICAgICAgLypjdXJyZW50IGJ1ZmZlciBsZXZlbCBlLmcuLCBSLzQgLSBzdGFydCBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIGJ1ZmZlciAqLworICAgIGZsb2F0IFgxOworICAgIGZsb2F0IFgyOworICAgIGZsb2F0IFgxMTsKKyAgICBmbG9hdCBNOyAgICAgICAgICAgIC8qc2FmZSBtYXJnaW4gZm9yIHRoZSBidWZmZXIgKi8KKyAgICBmbG9hdCBzbVRpY2s7ICAgIC8qcmF0aW8gb2Ygc3JjIHZlcnN1cyBlbmMgZnJhbWUgcmF0ZSAqLworICAgIGRvdWJsZSByZW1uYW50OyAgLypyZW1haW5kZXIgZnJhbWUgb2Ygc3JjL2VuYyBmcmFtZSBmb3IgZmluZSBmcmFtZSBza2lwcGluZyAqLworICAgIEludCB0aW1lSW5jUmVzOyAvKiB2b2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uICovCisKKyAgICBkYXRhUG9pbnRBcnJheSAgICplbmQ7IC8qcXVhbnRpemF0aW9uIGxldmVscyBmb3IgdGhlIHBhc3QgKDIwKSBmcmFtZXMgKi8KKworICAgIEludCAgICAgZnJhbWVOdW1iZXI7IC8qIHJhbmdpbmcgZnJvbSAwIHRvIDIwIG5vZGVzKi8KKyAgICBJbnQgICAgIHc7CisgICAgSW50ICAgICBOcl9PcmlnaW5hbDsKKyAgICBJbnQgICAgIE5yX09sZCwgTnJfT2xkMjsKKyAgICBJbnQgICAgIHNraXBfbmV4dF9mcmFtZTsKKyAgICBJbnQgICAgIFFkZXA7ICAgICAgIC8qIHNtb290aCBRIGFkanVzdG1lbnQgKi8KKyAgICBJbnQgICAgIGZpbmVfZnJhbWVfc2tpcDsKKyAgICBJbnQgICAgIFZCUl9FbmFibGVkOworICAgIEludCAgICAgbm9fZnJhbWVfc2tpcDsKKyAgICBJbnQgICAgIG5vX3ByZV9za2lwOworCisgICAgSW50IHRvdGFsRnJhbWVOdW1iZXI7IC8qIHRvdGFsIGNvZGVkIGZyYW1lcywgZm9yIGRlYnVnZ2luZyEhKi8KKworICAgIGNoYXIgICAgb0ZpcnN0VGltZTsKKworICAgIC8qIEJYIHJhdGUgY29udHJvbCAqLworICAgIEludCAgICAgVE1OX1c7CisgICAgSW50ICAgICBUTU5fVEg7CisgICAgSW50ICAgICBWQlZfZnVsbG5lc3M7CisgICAgSW50ICAgICBtYXhfQml0VmFyaWFuY2VfbnVtOyAvKiB0aGUgbnVtYmVyIG9mIHRoZSBtYXhpbXVtIGJpdCB2YXJpYW5jZSB3aXRoaW4gdGhlIGdpdmVuIGJ1ZmZlciB3aXRoIHRoZSB1bml0IG9mIDEwJSBvZiBiaXRyYXRlL2ZyYW1lcmF0ZSovCisgICAgSW50ICAgICBlbmNvZGVkX2ZyYW1lczsgLyogY291bnRlciBmb3IgYWxsIGVuY29kZWQgZnJhbWVzICovCisgICAgZmxvYXQgICBmcmFtZXJhdGU7CisgICAgSW50ICAgICBiaXRyYXRlOworICAgIEludCAgICAgbG93X2JvdW5kOyAgICAgICAgICAgICAgLyogYm91bmQgZm9yIHVuZGVyZmxvdyBkZXRlY3Rpb24sIHVzdWFsbHkgbG93X2JvdW5kPS1Ccy8yLCBidXQgY291bGQgYmUgY2hhbmdlZCBpbiBILjI2MyBtb2RlICovCisgICAgSW50ICAgICBWQlZfZnVsbG5lc3Nfb2Zmc2V0OyAgICAvKiBvZmZzZXQgb2YgVkJWX2Z1bGxuZXNzLCB1c3VhbGx5IGlzIHplcm8sIGJ1dCBjYW4gYmUgY2hhbmdlZCBpbiBILjI2MyBtb2RlKi8KKyAgICAvKiBFbmQgQlggKi8KKworfSByYXRlQ29udHJvbDsKKworCisjZW5kaWYgLyogX1JBVEVfQ09OVFJPTF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxOGY0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorCisjaW5jbHVkZSAic2FkX2lubGluZS5oIgorCisjZGVmaW5lIENhY2hlZF9seCAxNzYKKworI2lmZGVmIF9TQURfU1RBVAorVUxvbmcgbnVtX3NhZF9NQiA9IDA7CitVTG9uZyBudW1fc2FkX0JsayA9IDA7CitVTG9uZyBudW1fc2FkX01CX2NhbGwgPSAwOworVUxvbmcgbnVtX3NhZF9CbGtfY2FsbCA9IDA7CisKKyNkZWZpbmUgTlVNX1NBRF9NQl9DQUxMKCkgICAgICAgbnVtX3NhZF9NQl9jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9NQigpICAgICAgICAgICAgbnVtX3NhZF9NQisrCisjZGVmaW5lIE5VTV9TQURfQkxLX0NBTEwoKSAgICAgIG51bV9zYWRfQmxrX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0JMSygpICAgICAgICAgICBudW1fc2FkX0JsaysrCisKKyNlbHNlCisKKyNkZWZpbmUgTlVNX1NBRF9NQl9DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9NQigpCisjZGVmaW5lIE5VTV9TQURfQkxLX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0JMSygpCisKKyNlbmRpZgorCisKKy8qIGNvbnNpc3Qgb2YKK0ludCBTQURfTWFjcm9ibG9ja19DKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfTUJfSFRGTV9Db2xsZWN0KFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfTUJfSFRGTShVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX0Jsb2NrX0MoVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluLEludCBseCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9CbGtfUEFERElORyhVQ2hhciAqcmVmLFVDaGFyICpjdXIsSW50IGRtaW4sSW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX1BBRERJTkcoVUNoYXIgKnJlZixVQ2hhciAqY3VyLEludCBkbWluLEludCBseCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9NQl9QQUQxKFVDaGFyICpyZWYsVUNoYXIgKmN1cixJbnQgZG1pbixJbnQgbHgsSW50ICpyZXApOworSW50IFNBRF9NQl9QQURESU5HX0hURk1fQ29sbGVjdChVQ2hhciAqcmVmLFVDaGFyICpjdXIsSW50IGRtaW4sSW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX1BBRERJTkdfSFRGTShVQ2hhciAqcmVmLFVDaGFyICpjdXIsSW50IGRtaW4sSW50IGx4LHZvaWQgKnZwdHIpCisqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyAgICBJbnQgU0FEX01CX1BBRDEoVUNoYXIgKnJlZiwgVUNoYXIgKmN1ciwgSW50IGRtaW4sIEludCBseCwgSW50ICpyZXApOworCisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBTQURfTWFjcm9ibG9jaworICAgICAgICBEYXRlOiAgICAgICAwOS8wNy8yMDAwCisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYuCisgICAgICAgIFRvIGRvOiAgICAgIFVuaWZvcm0gc3Vic2FtcGxpbmcgd2lsbCBiZSBpbnNlcnRlZCBsYXRlciEKKyAgICAgICAgICAgICAgICAgICAgSHlwb3RoZXNpcyBUZXN0aW5nIEZhc3QgTWF0Y2hpbmcgdG8gYmUgdXNlZCBsYXRlciEKKyAgICAgICAgQ2hhbmdlczoKKyAgICAxMS83LzAwOiAgICAgaW1wbGVtZW50ZWQgTU1YCisgICAgMS8yNC8wMTogICAgIGltcGxlbWVudGVkIFNTRQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyoqKioqKioqKiogQyAqKioqKioqKioqKiovCisgICAgSW50IFNBRF9NYWNyb2Jsb2NrX0MoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBpbnQzMiB4MTA7CisgICAgICAgIEludCBkbWluID0gKFVMb25nKWRtaW5fbHggPj4gMTY7CisgICAgICAgIEludCBseCA9IGRtaW5fbHggJiAweEZGRkY7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGV4dHJhX2luZm8pOworCisgICAgICAgIE5VTV9TQURfTUJfQ0FMTCgpOworCisgICAgICAgIHgxMCA9IHNpbWRfc2FkX21iKHJlZiwgYmxrLCBkbWluLCBseCk7CisKKyAgICAgICAgcmV0dXJuIHgxMDsKKyAgICB9CisKKyNpZmRlZiBIVEZNICAgLyogSFRGTSB3aXRoIHVuaWZvcm0gc3Vic2FtcGxpbmcgaW1wbGVtZW50YXRpb24sIDIvMjgvMDEgKi8KKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBTQURfTUJfSFRGTV9Db2xsZWN0IGFuZCBTQURfTUJfSFRGTQorICAgICAgICBEYXRlOiAgICAgICAzLzIvMQorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gYSAxNngxNiBibG9jayB1c2luZworICAgICAgICAgICAgICAgICAgICB1bmlmb3JtIHN1YnNhbXBsaW5nIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmcgZmFzdCBtYXRjaGluZworICAgICAgICAgICAgICAgICAgICBmb3IgZWFybHkgZHJvcG91dC4gU0FEX01CX0hQX0hURk1fQ29sbGVjdCBpcyB0byBjb2xsZWN0CisgICAgICAgICAgICAgICAgICAgIHRoZSBzdGF0aXN0aWNzIHRvIGNvbXB1dGUgdGhlIHRocmVzaG9sZHMgdG8gYmUgdXNlZCBpbgorICAgICAgICAgICAgICAgICAgICBTQURfTUJfSFBfSFRGTS4KKyAgICAgICAgSW5wdXQvT3V0cHV0OgorICAgICAgICBDaGFuZ2VzOgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIEludCBTQURfTUJfSFRGTV9Db2xsZWN0KFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGk7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqcDE7CisgICAgICAgIEludCBseDQgPSAoZG1pbl9seCA8PCAyKSAmIDB4M0ZGRkM7CisgICAgICAgIFVMb25nIGN1cl93b3JkOworICAgICAgICBJbnQgc2FkZGF0YVsxNl0sIHRtcCwgdG1wMjsgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgICAgICBJbnQgZGlmbWFkOworICAgICAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgICAgICBJbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgICAgICBVSW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgICAgICBJbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworCisgICAgICAgIE5VTV9TQURfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gbHg0OworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSBseDQ7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gbHg0OworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgIE5VTV9TQURfTUIoKTsKKworICAgICAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoVUxvbmcpc2FkID4gKChVTG9uZylkbWluX2x4ID4+IDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSFRGTShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKKyAgICB7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqcDE7CisKKyAgICAgICAgSW50IGk7CisgICAgICAgIEludCB0bXAsIHRtcDI7CisgICAgICAgIEludCBseDQgPSAoZG1pbl9seCA8PCAyKSAmIDB4M0ZGRkM7CisgICAgICAgIEludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICAgICAgSW50ICpucm1sel90aCA9IChJbnQqKSBleHRyYV9pbmZvOworICAgICAgICBJbnQgKm9mZnNldFJlZiA9IChJbnQqKSBleHRyYV9pbmZvICsgMzI7CisgICAgICAgIFVMb25nIGN1cl93b3JkOworCisgICAgICAgIG1hZHN0YXIgPSAoVUxvbmcpZG1pbl9seCA+PiAyMDsKKworICAgICAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgICAgICBibGsgLT0gNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gbHg0OworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSBseDQ7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBOVU1fU0FEX01CKCk7CisKKyAgICAgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgICAgIGlmICgoKFVMb25nKXNhZCA8PSAoKFVMb25nKWRtaW5fbHggPj4gMTYpKSAmJiAoc2FkIDw9IChzYWRzdGFyIC0gKm5ybWx6X3RoKyspKSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisjZW5kaWYgLyogSFRGTSAqLworCisjaWZuZGVmIE5PX0lOVEVSNFYKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBTQURfQmxvY2sKKyAgICAgICAgRGF0ZTogICAgICAgMDkvMDcvMjAwMAorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmLgorICAgICAgICBUbyBkbzogICAgICBVbmlmb3JtIHN1YnNhbXBsaW5nIHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIhCisgICAgICAgICAgICAgICAgICAgIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nIHRvIGJlIHVzZWQgbGF0ZXIhCisgICAgICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgIGltcGxlbWVudGVkIE1NWAorICAgIDEvMjQvMDE6ICAgICBpbXBsZW1lbnRlZCBTU0UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyoqKioqKioqKiogQyAqKioqKioqKioqKiovCisgICAgSW50IFNBRF9CbG9ja19DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKikKKyAgICB7CisgICAgICAgIEludCBzYWQgPSAwOworCisgICAgICAgIEludCBpOworICAgICAgICBVQ2hhciAqaWk7CisgICAgICAgIEludCAqa2s7CisgICAgICAgIEludCB0bXAsIHRtcDIsIHRtcDMsIG1hc2sgPSAweEZGOworICAgICAgICBJbnQgd2lkdGggPSAobHggLSAzMik7CisKKyAgICAgICAgTlVNX1NBRF9CTEtfQ0FMTCgpOworCisgICAgICAgIGlpID0gcmVmOworICAgICAgICBrayAgPSAoSW50KilibGs7IC8qIGFzc3VtaW5nIHdvcmQtYWxpZ24gZm9yIGJsayAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAzID0ga2tbMV07CisgICAgICAgICAgICB0bXAgPSBpaVs3XTsKKyAgICAgICAgICAgIHRtcDIgPSAoVUludCl0bXAzID4+IDI0OworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBpaVs2XTsKKyAgICAgICAgICAgIHRtcDIgPSAodG1wMyA+PiAxNikgJiBtYXNrOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBpaVs1XTsKKyAgICAgICAgICAgIHRtcDIgPSAodG1wMyA+PiA4KSAmIG1hc2s7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IGlpWzRdOworICAgICAgICAgICAgdG1wMiA9IHRtcDMgJiBtYXNrOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAzID0gKmtrOworICAgICAgICAgICAga2sgKz0gKHdpZHRoID4+IDIpOworICAgICAgICAgICAgdG1wID0gaWlbM107CisgICAgICAgICAgICB0bXAyID0gKFVJbnQpdG1wMyA+PiAyNDsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gaWlbMl07CisgICAgICAgICAgICB0bXAyID0gKHRtcDMgPj4gMTYpICYgbWFzazsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gaWlbMV07CisgICAgICAgICAgICB0bXAyID0gKHRtcDMgPj4gOCkgJiBtYXNrOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSAqaWk7CisgICAgICAgICAgICBpaSArPSBseDsKKyAgICAgICAgICAgIHRtcDIgPSB0bXAzICYgbWFzazsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBOVU1fU0FEX0JMSygpOworCisgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbmRpZiAvKiBOT19JTlRFUjRWICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1Njk3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApAQCAtMCwwICsxLDg1NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIGNvbnRhaW5zCitJbnQgSGFsZlBlbDFfU0FEX01CKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgsSW50IGloLEludCBqaCkKK0ludCBIYWxmUGVsMl9TQURfTUIoVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluLEludCB3aWR0aCkKK0ludCBIYWxmUGVsMV9TQURfQmxrKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgsSW50IGloLEludCBqaCkKK0ludCBIYWxmUGVsMl9TQURfQmxrKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgpCisKK0ludCBTQURfTUJfSGFsZlBlbF9DKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgsSW50IHJ4LEludCB4aCxJbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0KFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgsSW50IHJ4LEludCB4aCxJbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfTUJfSFBfSFRGTShVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoLEludCByeCxJbnQgeGgsSW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX0Jsa19IYWxmUGVsX0MoVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluLEludCB3aWR0aCxJbnQgcngsSW50IHhoLEludCB5aCx2b2lkICpleHRyYV9pbmZvKQorKi8KKworLy8jaW5jbHVkZSA8c3RkbGliLmg+IC8qIGZvciBSQU5EX01BWCAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJzYWRfaGFsZnBlbF9pbmxpbmUuaCIKKworI2lmZGVmIF9TQURfU1RBVAorVUxvbmcgbnVtX3NhZF9IUF9NQiA9IDA7CitVTG9uZyBudW1fc2FkX0hQX0JsayA9IDA7CitVTG9uZyBudW1fc2FkX0hQX01CX2NhbGwgPSAwOworVUxvbmcgbnVtX3NhZF9IUF9CbGtfY2FsbCA9IDA7CisjZGVmaW5lIE5VTV9TQURfSFBfTUJfQ0FMTCgpICAgIG51bV9zYWRfSFBfTUJfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfSFBfTUIoKSAgICAgICAgIG51bV9zYWRfSFBfTUIrKworI2RlZmluZSBOVU1fU0FEX0hQX0JMS19DQUxMKCkgICBudW1fc2FkX0hQX0Jsa19jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEsoKSAgICAgICAgbnVtX3NhZF9IUF9CbGsrKworI2Vsc2UKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQl9DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQigpCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0hQX0JMSygpCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIEZ1bmN0aW9uOiAgIEhhbGZQZWwxX1NBRF9NQgorICAgICAgICBEYXRlOiAgICAgICAwMy8yNy8yMDAxCisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYgaW4gaGFsZnBlbAorICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLAorICAgICAgICBDaGFuZ2VzOgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKiBPbmUgY29tcG9uZW50IGlzIGhhbGYtcGVsICovCisgICAgSW50IEhhbGZQZWwxX1NBRF9NQihVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IHdpZHRoLCBJbnQgaWgsIEludCBqaCkKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKmtrLCAqcDEsICpwMjsKKyAgICAgICAgSW50IHRlbXA7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGpoKTsKKworICAgICAgICBwMSA9IHJlZjsKKyAgICAgICAgaWYgKGloKSBwMiA9IHJlZiArIDE7CisgICAgICAgIGVsc2UgcDIgPSByZWYgKyB3aWR0aDsKKyAgICAgICAga2sgID0gYmxrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyAxKSA+PiAxKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYWQgPiBkbWluKQorICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICBwMSArPSB3aWR0aDsKKyAgICAgICAgICAgIHAyICs9IHdpZHRoOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgLyogVHdvIGNvbXBvbmVudHMgbmVlZCBoYWxmLXBlbCAqLworICAgIEludCBIYWxmUGVsMl9TQURfTUIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCB3aWR0aCkKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKmtrLCAqcDEsICpwMiwgKnAzLCAqcDQ7CisgICAgICAgIEludCB0ZW1wOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBwMiA9IHJlZiArIDE7CisgICAgICAgIHAzID0gcmVmICsgd2lkdGg7CisgICAgICAgIHA0ID0gcmVmICsgd2lkdGggKyAxOworICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIHAzW2pdICsgcDRbal0gKyAyKSA+PiAyKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYWQgPiBkbWluKQorICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisKKyAgICAgICAgICAgIHAxICs9IHdpZHRoOworICAgICAgICAgICAgcDMgKz0gd2lkdGg7CisgICAgICAgICAgICBwMiArPSB3aWR0aDsKKyAgICAgICAgICAgIHA0ICs9IHdpZHRoOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjaWZuZGVmIE5PX0lOVEVSNFYKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBIYWxmUGVsMV9TQURfQmxrCisgICAgICAgIERhdGU6ICAgICAgIDAzLzI3LzIwMDEKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgOHg4IGJldHdlZW4gYmxrIGFuZCByZWYgaW4gaGFsZnBlbAorICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLgorICAgICAgICBDaGFuZ2VzOgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKiBPbmUgY29tcG9uZW50IG5lZWRzIGhhbGYtcGVsICovCisgICAgSW50IEhhbGZQZWwxX1NBRF9CbGsoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCB3aWR0aCwgSW50IGloLCBJbnQgamgpCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDI7CisgICAgICAgIEludCB0ZW1wOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhqaCk7CisKKyAgICAgICAgcDEgPSByZWY7CisgICAgICAgIGlmIChpaCkgcDIgPSByZWYgKyAxOworICAgICAgICBlbHNlIHAyID0gcmVmICsgd2lkdGg7CisgICAgICAgIGtrICA9IGJsazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIDEpID4+IDEpIC0gKmtrKys7CisgICAgICAgICAgICAgICAgc2FkICs9IFBWX0FCUyh0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNhZCA+IGRtaW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIHAxICs9IHdpZHRoOworICAgICAgICAgICAgcDIgKz0gd2lkdGg7CisgICAgICAgICAgICBrayArPSA4OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorICAgIC8qIFR3byBjb21wb25lbnRzIG5lZWQgaGFsZi1wZWwgKi8KKyAgICBJbnQgSGFsZlBlbDJfU0FEX0JsayhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMSwgKnAyLCAqcDMsICpwNDsKKyAgICAgICAgSW50IHRlbXA7CisKKyAgICAgICAgcDEgPSByZWY7CisgICAgICAgIHAyID0gcmVmICsgMTsKKyAgICAgICAgcDMgPSByZWYgKyB3aWR0aDsKKyAgICAgICAgcDQgPSByZWYgKyB3aWR0aCArIDE7CisgICAgICAgIGtrICA9IGJsazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIHAzW2pdICsgcDRbal0gKyAyKSA+PiAyKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYWQgPiBkbWluKQorICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisKKyAgICAgICAgICAgIHAxICs9IHdpZHRoOworICAgICAgICAgICAgcDMgKz0gd2lkdGg7CisgICAgICAgICAgICBwMiArPSB3aWR0aDsKKyAgICAgICAgICAgIHA0ICs9IHdpZHRoOworICAgICAgICAgICAga2sgKz0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKyNlbmRpZiAvLyBOT19JTlRFUjRWCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX01CX0hhbGZQZWwKKyAgICAgICAgRGF0ZTogICAgICAgMDkvMTcvMjAwMAorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gdGhlIGhhbGYtcGVsIHJlc29sdXRpb24KKyAgICAgICAgSW5wdXQvT3V0cHV0OiAgIGhtZW0gaXMgYXNzdW1lZCB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgICAgIHBvaW50IG9mIHRoZSBzZWFyY2ggaW4gdGhlIDMzeDMzIG1hdHJpeCBzZWFyY2ggcmVnaW9uCisgICAgICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgIGltcGxlbWVudGVkIE1NWAorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBTQURfTUJfSGFsZlBlbF9DCisgICAgICAgIERhdGU6ICAgICAgIDA0LzMwLzIwMDEKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgMTZ4MTYgYmV0d2VlbiBibGsgYW5kIHJlZiBpbiBoYWxmcGVsCisgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24sCisgICAgICAgIENoYW5nZXM6CisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIC8qIE9uZSBjb21wb25lbnQgaXMgaGFsZi1wZWwgKi8KKyAgICBJbnQgU0FEX01CX0hhbGZQZWxfQ3hoeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDIsICpwMywgKnA0OworLy8gIEludCBzdW1yZWY9MDsKKyAgICAgICAgSW50IHRlbXA7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGV4dHJhX2luZm8pOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBwMiA9IHJlZiArIDE7CisgICAgICAgIHAzID0gcmVmICsgcng7CisgICAgICAgIHA0ID0gcmVmICsgcnggKyAxOworICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIHAzW2pdICsgcDRbal0gKyAyKSA+PiAyKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICAgICAgaWYgKHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworCisgICAgICAgICAgICBwMSArPSByeDsKKyAgICAgICAgICAgIHAzICs9IHJ4OworICAgICAgICAgICAgcDIgKz0gcng7CisgICAgICAgICAgICBwNCArPSByeDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSGFsZlBlbF9DeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDI7CisvLyAgSW50IHN1bXJlZj0wOworICAgICAgICBJbnQgdGVtcDsKKyAgICAgICAgSW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKworICAgICAgICBPU0NMX1VOVVNFRF9BUkcoZXh0cmFfaW5mbyk7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgcDEgPSByZWY7CisgICAgICAgIHAyID0gcmVmICsgcng7IC8qIGVpdGhlciBsZWZ0L3JpZ2h0IG9yIHRvcC9ib3R0b20gcGl4ZWwgKi8KKyAgICAgICAga2sgID0gYmxrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyAxKSA+PiAxKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICAgICAgaWYgKHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgcDEgKz0gcng7CisgICAgICAgICAgICBwMiArPSByeDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSGFsZlBlbF9DeGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxOworLy8gIEludCBzdW1yZWY9MDsKKyAgICAgICAgSW50IHRlbXA7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGV4dHJhX2luZm8pOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMVtqKzFdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIHAxICs9IHJ4OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjaWZkZWYgSFRGTSAgLyogSFRGTSB3aXRoIHVuaWZvcm0gc3Vic2FtcGxpbmcgaW1wbGVtZW50YXRpb24sIDIvMjgvMDEgKi8KKworLy9DaGVjaGVjayBoZXJlCisgICAgSW50IFNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqcDEsICpwMjsKKyAgICAgICAgSW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICAgICAgSW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgICAgIEludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgICAgIEludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICAgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICAgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgICAgIHAyID0gcDEgKyByeDsKKworICAgICAgICAgICAgaiA9IDQ7LyogNCBsaW5lcyAqLworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVsxMl0gKyBwMlsxMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzEzXSArIHAyWzEzXTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbOF0gKyBwMls4XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbOV0gKyBwMls5XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbNF0gKyBwMls0XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbNV0gKyBwMls1XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbMV0gKyBwMlsxXTsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVswXSArIHAyWzBdOworICAgICAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hQX0hURk1fQ29sbGVjdHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqcDEsICpwMjsKKyAgICAgICAgSW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICAgICAgSW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgICAgIEludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgICAgIEludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICAgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICAgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgICAgIHAyID0gcDEgKyByeDsKKyAgICAgICAgICAgIGogPSA0OworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzEyXTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDJbOF07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzRdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcDIgPSBwMlswXTsKKyAgICAgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICgqY291bnRicmVhaykrKzsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpwMTsKKyAgICAgICAgSW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICAgICAgSW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgICAgIEludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgICAgIEludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICAgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICAgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKworICAgICAgICAgICAgaiA9IDQ7IC8qIDQgbGluZXMgKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxM107CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzldOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVs1XTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxXTsKKyAgICAgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICgqY291bnRicmVhaykrKzsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSFBfSFRGTXhoeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICAgICAgVUNoYXIgKnAxLCAqcDI7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgICAgIEludCAqbnJtbHpfdGggPSAoSW50KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgICAgICBVTG9uZyBjdXJfd29yZDsKKworICAgICAgICBtYWRzdGFyID0gKFVMb25nKWRtaW5fcnggPj4gMjA7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgICAgIHAyID0gcDEgKyByeDsKKworICAgICAgICAgICAgaiA9IDQ7IC8qIDQgbGluZXMgKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdICsgcDJbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxM10gKyBwMlsxM107CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzhdICsgcDJbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzldICsgcDJbOV07CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdICsgcDJbNF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzVdICsgcDJbNV07CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzFdICsgcDJbMV07CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMF0gKyBwMlswXTsKKyAgICAgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKEludCkoKFVMb25nKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgSW50IFNBRF9NQl9IUF9IVEZNeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICAgICAgVUNoYXIgKnAxLCAqcDI7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgICAgIEludCAqbnJtbHpfdGggPSAoSW50KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgICAgICBVTG9uZyBjdXJfd29yZDsKKworICAgICAgICBtYWRzdGFyID0gKFVMb25nKWRtaW5fcnggPj4gMjA7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgICAgIHAyID0gcDEgKyByeDsKKyAgICAgICAgICAgIGogPSA0OworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzEyXTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDJbOF07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzRdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcDIgPSBwMlswXTsKKyAgICAgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworICAgICAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hQX0hURk14aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMCwgdG1wLCB0bXAyOworICAgICAgICBVQ2hhciAqcDE7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgICAgIEludCAqbnJtbHpfdGggPSAoSW50KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgICAgICBVTG9uZyBjdXJfd29yZDsKKworICAgICAgICBtYWRzdGFyID0gKFVMb25nKWRtaW5fcnggPj4gMjA7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKworICAgICAgICAgICAgaiA9IDQ7LyogNCBsaW5lcyAqLworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzEzXTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbOV07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzVdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzFdOworICAgICAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKEludCkoKFVMb25nKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZW5kaWYgLyogSFRGTSAqLworCisjaWZuZGVmIE5PX0lOVEVSNFYKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBTQURfQmxrX0hhbGZQZWxfQworICAgICAgICBEYXRlOiAgICAgICAwNC8zMC8yMDAxCisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYgaW4gaGFsZnBlbAorICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLAorICAgICAgICBDaGFuZ2VzOgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKiBPbmUgY29tcG9uZW50IGlzIGhhbGYtcGVsICovCisgICAgSW50IFNBRF9CbGtfSGFsZlBlbF9DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgd2lkdGgsIEludCByeCwgSW50IHhoLCBJbnQgeWgsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDIsICpwMywgKnA0OworICAgICAgICBJbnQgdGVtcDsKKworICAgICAgICBPU0NMX1VOVVNFRF9BUkcoZXh0cmFfaW5mbyk7CisKKyAgICAgICAgTlVNX1NBRF9IUF9CTEtfQ0FMTCgpOworCisgICAgICAgIGlmICh4aCAmJiB5aCkKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWY7CisgICAgICAgICAgICBwMiA9IHJlZiArIHhoOworICAgICAgICAgICAgcDMgPSByZWYgKyB5aCAqIHJ4OworICAgICAgICAgICAgcDQgPSByZWYgKyB5aCAqIHJ4ICsgeGg7CisgICAgICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIHAzW2pdICsgcDRbal0gKyAyKSA+PiAyKSAtIGtrW2pdOworICAgICAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5VTV9TQURfSFBfQkxLKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKworICAgICAgICAgICAgICAgIHAxICs9IHJ4OworICAgICAgICAgICAgICAgIHAzICs9IHJ4OworICAgICAgICAgICAgICAgIHAyICs9IHJ4OworICAgICAgICAgICAgICAgIHA0ICs9IHJ4OworICAgICAgICAgICAgICAgIGtrICs9IHdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gcmVmOworICAgICAgICAgICAgcDIgPSByZWYgKyB4aCArIHloICogcng7IC8qIGVpdGhlciBsZWZ0L3JpZ2h0IG9yIHRvcC9ib3R0b20gcGl4ZWwgKi8KKworICAgICAgICAgICAga2sgID0gYmxrOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyAxKSA+PiAxKSAtIGtrW2pdOworICAgICAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5VTV9TQURfSFBfQkxLKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgICAgICBwMSArPSByeDsKKyAgICAgICAgICAgICAgICBwMiArPSByeDsKKyAgICAgICAgICAgICAgICBrayArPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3NzhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEZpbGVuYW1lOiBzYWRfaGFsZnBlbF9pbmxpbmUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVzY3JpcHRpb246IEltcGxlbWVudGF0aW9uIGZvciBpbi1saW5lIGZ1bmN0aW9ucyB1c2VkIGluIGRjdC5jcHAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TQURfSEFMRlBFTF9JTkxJTkVfSF8KKyNkZWZpbmUgX1NBRF9IQUxGUEVMX0lOTElORV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNSkgJiYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNCkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9ICh0bXAyID4+IDEpIC0gdG1wOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gKHRtcCA+PiAyKSAtIHRtcDI7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAsIHRtcDIsIGFzciAjMSA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wMiwgdG1wLCBhc3IgIzIgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZWxpZiAoIGRlZmluZWQoUFZfQVJNX0dDQ19WNSkgfHwgZGVmaW5lZChQVl9BUk1fR0NDX1Y0KSApIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHNzID0gc2FkOworICAgICAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdXUgPSB0bXAyOworCisgICAgICAgIGFzbSB2b2xhdGlsZSgicnNicwklMSwgJTMsICU0LCBhc3IgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgInJzYm1pICUxLCAlMSwgIzBcblx0IgorICAgICAgICAgICAgICAgICAgICAgImFkZCAgJTAsICUyLCAlMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIodHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIodXUpKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKK3sKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgICAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgc3MgPSBzYWQ7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHR0ID0gdG1wOworICAgICAgICByZWdpc3RlciBpbnQzMiB1dSA9IHRtcDI7CisKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJyc2JzICAgICAgJTEsICU0LCAlMywgYXNyICMyXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJyc2JtaSAlMSwgJTEsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICUwLCAlMiwgJTEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAgICAgIj0mciIodGVtcDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHV1KSk7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisKKyNlbmRpZiAvLyBEaWZmIE9TCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy9fU0FEX0hBTEZQRUxfSU5MSU5FX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc3ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCkBAIC0wLDAgKzEsNTM5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaWxlbmFtZTogc2FkX2lubGluZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gZm9yIGluLWxpbmUgZnVuY3Rpb25zIHVzZWQgaW4gZGN0LmNwcCAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9TQURfSU5MSU5FX0hfCisjZGVmaW5lIF9TQURfSU5MSU5FX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSAmJiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y0KSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9IHRtcCAtIHRtcDI7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICB4NyA9IHNyYzIgXiBzcmMxOyAgICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICBpZiAoKHVpbnQzMilzcmMyID49ICh1aW50MzIpc3JjMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjMSA9IHNyYzIgLSBzcmMxOyAgICAgLyogc3VicyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3JjMSA9IHNyYzEgLSBzcmMyOworICAgICAgICB9CisgICAgICAgIHg3ID0geDcgXiBzcmMxOyAgICAgLyogb25seSBvZGQgYnl0ZXMgbmVlZCB0byBhZGQgY2FycnkgKi8KKyAgICAgICAgeDcgPSBtYXNrICYgKCh1aW50MzIpeDcgPj4gMSk7CisgICAgICAgIHg3ID0gKHg3IDw8IDgpIC0geDc7CisgICAgICAgIHNyYzEgPSBzcmMxICsgKHg3ID4+IDcpOyAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgc3JjMSA9IHNyYzEgXih4NyA+PiA3KTsgICAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCkKKyAgICB7CisgICAgICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisKKyAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgaWYgKHg4ID09IDMpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgaWYgKHg4ID09IDIpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgaWYgKHg4ID09IDEpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MTsKKworLy8gIHg1ID0gKHg0PDw4KS14NDsgLyogeDUgPSB4NCoyNTU7ICovCisgICAgICAgIHg0ID0geDUgPSAwOworCisgICAgICAgIHg2ID0gMHhGRkZGMDBGRjsKKworICAgICAgICByZWYgLT0gbHg7CisgICAgICAgIGJsayAtPSAxNjsKKworICAgICAgICB4OCA9IDE2OworCitMT09QX1NBRDA6CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArPSBseCkpOworICAgICAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyA0KSk7CisgICAgICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArPSAxNikpOworICAgICAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyA0KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7CisgICAgICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArIDgpKTsKKyAgICAgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgMTIpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgICAgICBpZiAoKCh1aW50MzIpeDEwID4+IDE2KSA8PSAodWludDMyKWRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLXg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gTE9PUF9TQUQwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluKTsKKworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAsIHRtcDIgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbChpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgRU9SICAgICB4Nywgc3JjMiwgc3JjMTsgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgICAgICBTVUJTICAgIHNyYzEsIHNyYzIsIHNyYzE7CisgICAgICAgICAgICBFT1IgICAgIHg3LCB4Nywgc3JjMTsKKyAgICAgICAgICAgIEFORCAgICAgeDcsIG1hc2ssIHg3LCBsc3IgIzE7CisgICAgICAgICAgICBPUlJDQyAgIHg3LCB4NywgIzB4ODAwMDAwMDA7CisgICAgICAgICAgICBSU0IgICAgIHg3LCB4NywgeDcsIGxzbCAjODsKKyAgICAgICAgICAgIEFERCAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgICAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgICAgIEVPUiAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgICAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWxOKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBFT1IgICAgICB4Nywgc3JjMiwgc3JjMTsgICAgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgICAgICBBRERTICAgICBzcmMxLCBzcmMyLCBzcmMxOworICAgICAgICAgICAgRU9SICAgICAgeDcsIHg3LCBzcmMxOyAgICAgIC8qIG9ubHkgb2RkIGJ5dGVzIG5lZWQgdG8gYWRkIGNhcnJ5ICovCisgICAgICAgICAgICBBTkRTICAgICB4NywgbWFzaywgeDcsIHJyeDsKKyAgICAgICAgICAgIFJTQiAgICAgIHg3LCB4NywgeDcsIGxzbCAjODsKKyAgICAgICAgICAgIFNVQiAgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgICAgIEVPUiAgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7IC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisjZGVmaW5lIHN1bV9hY2N1bXVsYXRlICBfX2FzbXsgICAgICBTQkMgICAgICB4NSwgeDUsIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovIFwKKyAgICAgICAgQklDICAgICAgeDEwLCB4NiwgeDEwOyAgIC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8gXAorICAgICAgICBBREQgICAgICB4NCwgeDQsIHgxMCxsc3IgIzg7ICAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovIFwKKyAgICAgICAgU0JDICAgICAgeDUsIHg1LCB4MTE7ICAgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovIFwKKyAgICAgICAgQklDICAgICAgeDExLCB4NiwgeDExOyAgIC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8gXAorICAgICAgICBBREQgICAgICB4NCwgeDQsIHgxMSxsc3IgIzg7IH0gLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MTAwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYihVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgTU9WUyAgICB4OCwgcmVmLCBsc2wgIzMxIDsKKyAgICAgICAgICAgIEJISSAgICAgU2FkTUJPZmZzZXQzOworICAgICAgICAgICAgQkNTICAgICBTYWRNQk9mZnNldDI7CisgICAgICAgICAgICBCTUkgICAgIFNhZE1CT2Zmc2V0MTsKKworICAgICAgICAgICAgTVZOICAgICB4NiwgIzB4RkYwMDsKKyAgICAgICAgfQorTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKGludDMyKikoYmxrICsgOCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgICAgIExEUiAgICAgeDExLCBbcmVmLCAjNF07CisgICAgICAgICAgICBMRFIgICAgIHgxMCwgW3JlZl0sIGx4IDsKKyAgICAgICAgICAgIExEUiAgICAgeDE0LCBbYmxrLCAjNF07CisgICAgICAgICAgICBMRFIgICAgIHgxMiwgW2Jsa10sICMxNiA7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIFJTQlMgICAgeDExLCBkbWluLCB4MTAsIGxzciAjMTY7CisgICAgICAgICAgICBBRERMU1MgIHg4LCB4OCwgIzB4MTAwMDAwMDE7CisgICAgICAgICAgICBCTFMgICAgIExPT1BfU0FEMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworICAgIH0KKworCisjZWxpZiAoIGRlZmluZWQoUFZfQVJNX0dDQ19WNSkgfHwgZGVmaW5lZChQVl9BUk1fR0NDX1Y0KSApIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgICAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgc3MgPSBzYWQ7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHR0ID0gdG1wOworICAgICAgICByZWdpc3RlciBpbnQzMiB1dSA9IHRtcDI7CisKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJyc2JzICAlMSwgJTQsICUzXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJyc2JtaSAlMSwgJTEsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlMCwgJTIsICUxIgorICAgICAgICAgICAgIDogIj0mciIob3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyIih0dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyIih1dSkpOworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKK3sKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgICAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgczEgPSBzcmMxOworICAgICAgICByZWdpc3RlciBpbnQzMiBzMiA9IHNyYzI7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG1tID0gbWFzazsKKworICAgICAgICBhc20gdm9sYXRpbGUoImVvciAgICUwLCAlMywgJTJcblx0IgorICAgICAgICAgICAgICAgICAgICAgInN1YnMgICUxLCAlMywgJTJcblx0IgorICAgICAgICAgICAgICAgICAgICAgImVvciAgICUwLCAlMCwgJTFcblx0IgorICAgICAgICAgICAgICAgICAgICAgImFuZCAgICUwLCAlNCwgJTAsIGxzciAjMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAib3JyY2MgJTAsICUwLCAjMHg4MDAwMDAwMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAicnNiICAgJTAsICUwLCAlMCwgbHNsICM4XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlMSwgJTEsICUwLCBhc3IgIzdcblx0IgorICAgICAgICAgICAgICAgICAgICAgImVvciAgICUxLCAlMSwgJTAsIGFzciAjNyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoczEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIoczIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIobW0pKTsKKworICAgICAgICByZXR1cm4gdGVtcDE7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbE4oaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKK3sKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgICAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgczEgPSBzcmMxOworICAgICAgICByZWdpc3RlciBpbnQzMiBzMiA9IHNyYzI7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG1tID0gbWFzazsKKworICAgICAgICBhc20gdm9sYXRpbGUoImVvciAgICAlMSwgJTMsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGRzICAgJTAsICUzLCAlMlxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiZW9yICAgICUxLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAgICAgImFuZHMgICAlMSwgJTQsICUxLHJyeFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAicnNiICAgICUxLCAlMSwgJTEsIGxzbCAjOFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAic3ViICAgICUwLCAlMCwgJTEsIGFzciAjN1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAiZW9yICAgICUwLCAlMCwgJTEsIGFzciAjNyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoczEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIoczIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIobW0pKTsKKworICAgICAgICByZXR1cm4gKG91dCk7CisgICAgfQorCisjZGVmaW5lIHN1bV9hY2N1bXVsYXRlIGFzbSB2b2xhdGlsZSgic2JjICAlMCwgJTAsICUxXG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmljICAlMSwgJTQsICUxXG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAlMiwgJTIsICUxLCBsc3IgIzhcblx0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYmMgICUwLCAlMCwgJTNcblx0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaWMgICUzLCAlNCwgJTNcblx0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICUyLCAlMiwgJTMsIGxzciAjOCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IityIih4NSksICIrciIoeDEwKSwgIityIih4NCksICIrciIoeDExKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoiciIoeDYpKTsKKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MTAwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYihVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4KQoreworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICB4OCA9ICh1aW50MzIpcmVmICYgMHgzOworICAgICAgICBpZiAoeDggPT0gMykKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQzOworICAgICAgICBpZiAoeDggPT0gMikKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQyOworICAgICAgICBpZiAoeDggPT0gMSkKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQxOworCithc20gdm9sYXRpbGUoIm12biAlMCwgIzB4RkYwMCI6ICI9ciIoeDYpKTsKKworTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKGludDMyKikoYmxrICsgOCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJsZHIgICUwLCBbJTQsICM0XVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAibGRyICAlMSwgWyU0XSwgJTZcblx0IgorICAgICAgICAgICAgICAgICAgICAgImxkciAgJTIsIFslNSwgIzRdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJsZHIgICUzLCBbJTVdLCAjMTYiCisgICAgICAgICAgICAgOiAiPXIiKHgxMSksICI9ciIoeDEwKSwgIj1yIih4MTQpLCAiPXIiKHgxMiksICIrciIocmVmKSwgIityIihibGspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGx4KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgaWYgKCgodWludDMyKXgxMCA+PiAxNikgPD0gKHVpbnQzMilkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIExPT1BfU0FEMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbik7CisgICAgfQorCisjZW5kaWYgLy8gT1MKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9TQURfSU5MSU5FX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdiOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCkBAIC0wLDAgKzEsMzE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaWxlbmFtZTogc2FkX21iX29mZnNldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVzY3JpcHRpb246IEltcGxlbWVudGF0aW9uIGZvciBpbi1saW5lIGZ1bmN0aW9ucyB1c2VkIGluIGRjdC5jcHAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNCkgJiYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNSkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgbHgsIEludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgLy8gIHg1ID0gKHg0PDw4KSAtIHg0OworICAgIHg0ID0geDUgPSAwOworICAgIHg2ID0gMHhGRkZGMDBGRjsKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHJlZiAtPSBOVU1CRVI7IC8qIGJpYyByZWYsIHJlZiwgIzMgKi8KKyAgICByZWYgLT0gbHg7CisgICAgYmxrIC09IDE2OworICAgIHg4ID0gMTY7CisKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArPSBseCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgNCkpOyAgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgOCkpOyAgICAvKiBMIEsgSiBJICovCisKKyAgICB4MTAgPSAoKHVpbnQzMil4MTAgPj4gU0hJRlQpOyAvKiAwIDAgMCBEICovCisgICAgeDEwID0geDEwIHwgKHgxMSA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogRyBGIEUgRCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDAgMCAwIEggKi8KKyAgICB4MTEgPSB4MTEgfCAoeDEyIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBLIEogSSBIICovCisKKyAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKz0gMTYpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyA0KSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOyAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyAxNikpOyAgIC8qIEwgSyBKIEkgKi8KKworICAgIHgxMCA9ICgodWludDMyKXgxMCA+PiBTSElGVCk7IC8qIG12biB4MTAsIHgxMCwgbHNyICMyNCAgPSAweEZGIDB4RkYgMHhGRiB+RCAqLworICAgIHgxMCA9IHgxMCB8ICh4MTEgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIGJpYyB4MTAsIHgxMCwgeDExLCBsc2wgIzggPSB+RyB+RiB+RSB+RCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDB4RkYgMHhGRiAweEZGIH5IICovCisgICAgeDExID0geDExIHwgKHgxMiA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogfksgfkogfkkgfkggKi8KKworICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArIDgpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyAxMikpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9ICh1aW50MzIpZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDMoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbiwgaW50MzIgeDgpCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICB4NCA9IHg1ID0gMDsKKworICAgIF9fYXNteworICAgICAgICBNVk4gICAgICB4NiwgIzB4ZmYwMDAwOworICAgICAgICBCSUMgICAgICByZWYsIHJlZiwgIzM7CisKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKKyAgICB9CisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgeDEyID0gKigoaW50MzIqKShyZWYgKyAxNikpOworICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKworICAgIF9fYXNteworICAgICAgICBNVk4gICAgICB4MTAsIHgxMCwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDEwLCB4MTAsIHgxMSwgbHNsICMoMzItU0hJRlQpOworICAgICAgICBNVk4gICAgICB4MTEsIHgxMSwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDExLCB4MTEsIHgxMiwgbHNsICMoMzItU0hJRlQpOworCisgICAgICAgIExEUiAgICAgIHgxMiwgW2JsaywgIzhdOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgX19hc217CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIExEUiAgICAgIHgxMSwgW3JlZiwgIzRdOworICAgICAgICBMRFIgICAgICB4MTIsIFtyZWYsICM4XTsKKyAgICAgICAgTERSICB4MTAsIFtyZWZdLCBseCA7CisgICAgICAgIExEUiAgeDE0LCBbYmxrLCAjNF07CisKKyAgICAgICAgTVZOICAgICAgeDEwLCB4MTAsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMCwgeDEwLCB4MTEsIGxzbCAjKDMyLVNISUZUKTsKKyAgICAgICAgTVZOICAgICAgeDExLCB4MTEsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMSwgeDExLCB4MTIsIGxzbCAjKDMyLVNISUZUKTsKKworICAgICAgICBMRFIgICAgICB4MTIsIFtibGtdLCAjMTY7CisgICAgfQorCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsTih4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsTih4MTAsIHgxMiwgeDkpOworCisgICAgc3VtX2FjY3VtdWxhdGU7CisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICBfX2FzbXsKKyAgICAgICAgUlNCUyAgICAgeDExLCBkbWluLCB4MTAsIGxzciAjMTYKKyAgICAgICAgQURETFNTICAgeDgsIHg4LCAjSU5DX1g4CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgQkxTICAgICAgTE9PUF9TQUQzOworI2VsaWYgKE5VTUJFUj09MikKK0JMUyAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCitCTFMgICAgICBMT09QX1NBRDE7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKK30KKworI2VsaWYgKCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNCkgKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisjaWYgKE5VTUJFUj09MykKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQzKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTEpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgbHgsIEludCBkbWluKQorI2VuZGlmCit7CisgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAvLyAgeDUgPSAoeDQ8PDgpIC0geDQ7CisgICAgeDQgPSB4NSA9IDA7CisgICAgeDYgPSAweEZGRkYwMEZGOworICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgcmVmIC09IE5VTUJFUjsgLyogYmljIHJlZiwgcmVmLCAjMyAqLworICAgIHJlZiAtPSBseDsKKyAgICB4OCA9IDE2OworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKz0gbHgpKTsgLyogRCBDIEIgQSAqLworICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDQpKTsgICAgLyogSCBHIEYgRSAqLworICAgIHgxMiA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsgICAgLyogTCBLIEogSSAqLworCisgICAgaW50MzIgc2hpZnQgPSBTSElGVDsKKyAgICBpbnQzMiBzaGlmdDIgPSAzMiAtIFNISUZUOworICAgIGFzbSB2b2xhdGlsZSgibGRyICAlMywgWyU0LCAjNF1cblx0IgorICAgICAgICAgICAgICAgICAibXZuICAlMCwgJTAsIGxzciAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJiaWMgICUwLCAlMCwgJTEsIGxzbCAlNlxuXHQiCisgICAgICAgICAgICAgICAgICJtdm4gICUxLCAlMSwgbHNyICU1XG5cdCIKKyAgICAgICAgICAgICAgICAgImJpYyAgJTEsICUxLCAlMiwgbHNsICU2XG5cdCIKKyAgICAgICAgICAgICAgICAgImxkciAgJTIsIFslNCwgIzhdIgorICAgICAgICAgICAgIDogIityIih4MTApLCAiK3IiKHgxMSksICIrciIoeDEyKSwgIj1yIih4MTQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYmxrKSwgInIiKHNoaWZ0KSwgInIiKHNoaWZ0MikpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOyAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyAxNikpOyAgIC8qIEwgSyBKIEkgKi8KKworICAgIGFzbSB2b2xhdGlsZSgibGRyICAlMywgWyU0LCAjNF1cblx0IgorICAgICAgICAgICAgICAgICAibXZuICAlMCwgJTAsIGxzciAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJiaWMgICUwLCAlMCwgJTEsIGxzbCAlNlxuXHQiCisgICAgICAgICAgICAgICAgICJtdm4gICUxLCAlMSwgbHNyICU1XG5cdCIKKyAgICAgICAgICAgICAgICAgImJpYyAgJTEsICUxLCAlMiwgbHNsICU2XG5cdCIKKyAgICAgICAgICAgICAgICAgImxkciAgJTIsIFslNCwgIzhdIgorICAgICAgICAgICAgIDogIityIih4MTApLCAiK3IiKHgxMSksICIrciIoeDEyKSwgIj1yIih4MTQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYmxrKSwgInIiKHNoaWZ0KSwgInIiKHNoaWZ0MikpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgaWYgKCgodWludDMyKXgxMCA+PiAxNikgPD0gKHVpbnQzMilkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgIHsKKyAgICAgICAgaWYgKC0teDgpCisgICAgICAgIHsKKyNpZiAoTlVNQkVSPT0zKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCitnb3RvICAgICAgICAgTE9PUF9TQUQyOworI2VsaWYgKE5VTUJFUj09MSkKK2dvdG8gICAgICAgICBMT09QX1NBRDE7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jX3RhYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY190YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ2MmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY190YWIuaApAQCAtMCwwICsxLDExNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBzb2Z0d2FyZSBtb2R1bGUgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5CisgKgorICogUm9iZXJ0IERhbmllbHNlbiAoVGVsZW5vciAvIEFDVFMtTW9NdVN5cykuCisgKgorICogYW5kIGVkaXRlZCBieQorICoKKyAqIE1pbmh1YSBaaG91IChISEkgLyBBQ1RTLU1vTXVTeXMpLgorICogTHVpcyBEdWNsYS1Tb2FyZXMgKElTVCAvIEFDVFMtTW9NdVN5cykuCisgKgorICogaW4gdGhlIGNvdXJzZSBvZiBkZXZlbG9wbWVudCBvZiB0aGUgTVBFRy00IFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHN0YW5kYXJkLgorICogVGhpcyBzb2Z0d2FyZSBtb2R1bGUgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0IG9mIG9uZSBvciBtb3JlIE1QRUctNAorICogVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgdG9vbHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMKKyAqIDE0NDk2LTIpIHN0YW5kYXJkLgorICoKKyAqIElTTy9JRUMgZ2l2ZXMgdXNlcnMgb2YgdGhlIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZCBmcmVlCisgKiBsaWNlbnNlIHRvIHRoaXMgc29mdHdhcmUgbW9kdWxlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiBmb3IgdXNlIGluIGhhcmR3YXJlCisgKiBvciBzb2Z0d2FyZSBwcm9kdWN0cyBjbGFpbWluZyBjb25mb3JtYW5jZSB0byB0aGUgTVBFRy00IFZpZGVvIChJU08vSUVDCisgKiAxNDQ5Ni0yKSBzdGFuZGFyZC4KKyAqCisgKiBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc29mdHdhcmUgbW9kdWxlIGluIGhhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzCisgKiBhcmUgYWR2aXNlZCB0aGF0IGl0cyB1c2UgbWF5IGluZnJpbmdlIGV4aXN0aW5nIHBhdGVudHMuIFRoZSBvcmlnaW5hbAorICogZGV2ZWxvcGVyIG9mIHRoaXMgc29mdHdhcmUgbW9kdWxlIGFuZCBoaXMvaGVyIGNvbXBhbnksIHRoZSBzdWJzZXF1ZW50CisgKiBlZGl0b3JzIGFuZCB0aGVpciBjb21wYW5pZXMsIGFuZCBJU08vSUVDIGhhdmUgbm8gbGlhYmlsaXR5IGZvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUgbW9kdWxlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiBpbiBhbiBpbXBsZW1lbnRhdGlvbi4gQ29weXJpZ2h0IGlzCisgKiBub3QgcmVsZWFzZWQgZm9yIG5vbiBNUEVHLTQgVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgc3RhbmRhcmQgY29uZm9ybWluZworICogcHJvZHVjdHMuCisgKgorICogQUNUUy1Nb011U3lzIHBhcnRuZXJzIHJldGFpbiBmdWxsIHJpZ2h0IHRvIHVzZSB0aGUgY29kZSBmb3IgaGlzL2hlciBvd24KKyAqIHB1cnBvc2UsIGFzc2lnbiBvciBkb25hdGUgdGhlIGNvZGUgdG8gYSB0aGlyZCBwYXJ0eSBhbmQgdG8gaW5oaWJpdCB0aGlyZAorICogcGFydGllcyBmcm9tIHVzaW5nIHRoZSBjb2RlIGZvciBub24gTVBFRy00IFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHN0YW5kYXJkCisgKiBjb25mb3JtaW5nIHByb2R1Y3RzLiBUaGlzIGNvcHlyaWdodCBub3RpY2UgbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yCisgKiBkZXJpdmF0aXZlIHdvcmtzLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipIZWFkZXJCZWdpbioqKioqKioKKyAqCisgKiBGaWxlOiAgICB2bGMuaAorICoKKyAqIEF1dGhvcjogIFJvYmVydCBEYW5pZWxzZW4KKyAqIENyZWF0ZWQ6IDA3LjA2Ljk2CisgKgorICogRGVzY3JpcHRpb246IHZsYyB0YWJsZXMgZm9yIGVuY29kZXIKKyAqCisgKiBOb3RlczogICBJZGVhIHRha2VuIGZyb20gTVBFRy0yIHNvZnR3YXJlIHNpbXVsYXRpb24gZ3JvdXAKKyAqCisgKiBNb2RpZmllZDoKKyAqICAyOC4xMC45NiBSb2JlcnQgRGFuaWVsc2VuOiBBZGRlZCB0YWJsZXMgZm9yIEludHJhIGx1bWluYW5jZQorICogICAgICAgICAgY29lZmZpY2llbnRzCisgKiAgICAgIDAxLjA1Ljk3IEx1aXMgRHVjbGEtU29hcmVzOiBhZGRlZCBWTTcuMCBSZXZlcnNpYmxlIFZMQyB0YWJsZXMgKFJWTEMpLgorICogICAgICAxMy4wNS45NyBNaW5odWEgWmhvdTogYWRkZWQgY2JweV90YWIzLGNicHlfdGFiMgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkhlYWRlckVuZCoqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgICBJTkNMVURFIEZJTEVTICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9WTENfRU5DX1RBQl9IXworI2RlZmluZSBfVkxDX0VOQ19UQUJfSF8KKworCisjaW5jbHVkZSAibXA0ZGVmLmgiCisvKiB0eXBlIGRlZmluaXRpb25zIGZvciB2YXJpYWJsZSBsZW5ndGggY29kZSB0YWJsZSBlbnRyaWVzICovCisKKworCitzdGF0aWMgY29uc3QgSW50IGludHJhX21heF9sZXZlbFsyXVs2NF0gPQoreworICAgIHsyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIDMsCisgICAgICAgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIH0sCisKKyAgICB7OCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgfQorfTsKKworCitzdGF0aWMgY29uc3QgSW50IGludGVyX21heF9sZXZlbFsyXVs2NF0gPQoreworICAgIHsxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsCisgICAgICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfSwKKworICAgIHszLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDB9Cit9OworCisKK3N0YXRpYyBjb25zdCBJbnQgaW50cmFfbWF4X3J1bjBbMjhdID0geyA5OTksIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCitzdGF0aWMgY29uc3QgSW50IGludHJhX21heF9ydW4xWzldID0geyA5OTksIDIwLCAgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAwLCAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKK3N0YXRpYyBjb25zdCBJbnQgaW50ZXJfbWF4X3J1bjBbMTNdID0geyA5OTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCitzdGF0aWMgY29uc3QgSW50IGludGVyX21heF9ydW4xWzRdID0geyA5OTksIDQwLCAgMSwgIDAgfTsKKworCisKKy8qIERDIHByZWRpY3Rpb24gc2l6ZXMgKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIERDdGFiX2x1bVsxM10gPQoreworICAgIHszLCAzfSwgezMsIDJ9LCB7MiwgMn0sIHsyLCAzfSwgezEsIDN9LCB7MSwgNH0sIHsxLCA1fSwgezEsIDZ9LCB7MSwgN30sCisgICAgezEsIDh9LCB7MSwgOX0sIHsxLCAxMH0sIHsxLCAxMX0KK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBEQ3RhYl9jaHJvbVsxM10gPQoreworICAgIHszLCAyfSwgezIsIDJ9LCB7MSwgMn0sIHsxLCAzfSwgezEsIDR9LCB7MSwgNX0sIHsxLCA2fSwgezEsIDd9LCB7MSwgOH0sCisgICAgezEsIDl9LCB7MSwgMTB9LCB7MSwgMTF9LCB7MSwgMTJ9Cit9OworCisvKiBNb3Rpb24gdmVjdG9ycyAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgbXZ0YWJbMzNdID0KK3sKKyAgICB7MSwgMX0sIHsxLCAyfSwgezEsIDN9LCB7MSwgNH0sIHszLCA2fSwgezUsIDd9LCB7NCwgN30sIHszLCA3fSwKKyAgICB7MTEsIDl9LCB7MTAsIDl9LCB7OSwgOX0sIHsxNywgMTB9LCB7MTYsIDEwfSwgezE1LCAxMH0sIHsxNCwgMTB9LCB7MTMsIDEwfSwKKyAgICB7MTIsIDEwfSwgezExLCAxMH0sIHsxMCwgMTB9LCB7OSwgMTB9LCB7OCwgMTB9LCB7NywgMTB9LCB7NiwgMTB9LCB7NSwgMTB9LAorICAgIHs0LCAxMH0sIHs3LCAxMX0sIHs2LCAxMX0sIHs1LCAxMX0sIHs0LCAxMX0sIHszLCAxMX0sIHsyLCAxMX0sIHszLCAxMn0sCisgICAgezIsIDEyfQorfTsKKworCisvKiBNQ0JQQyBJbmRleGluZyBieSBjYnBjIGluIGZpcnN0IHR3byBiaXRzLCBtb2RlIGluIGxhc3QgdHdvLgorIENCUEMgYXMgaW4gdGFibGUgNC9ILjI2MywgTUIgdHlwZSAobW9kZSk6IDMgPSAwMSwgNCA9IDEwLgorIEV4YW1wbGU6IGNicGMgPSAwMSBhbmQgbW9kZSA9IDQgZ2l2ZXMgaW5kZXggPSAwMTEwID0gNi4gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIG1jYnBjX2ludHJhX3RhYlsxNV0gPQoreworICAgIHsweDAxLCA5fSwgezB4MDEsIDF9LCB7MHgwMSwgNH0sIHsweDAwLCAwfSwKKyAgICB7MHgwMCwgMH0sIHsweDAxLCAzfSwgezB4MDEsIDZ9LCB7MHgwMCwgMH0sCisgICAgezB4MDAsIDB9LCB7MHgwMiwgM30sIHsweDAyLCA2fSwgezB4MDAsIDB9LAorICAgIHsweDAwLCAwfSwgezB4MDMsIDN9LCB7MHgwMywgNn0KK307CisKKworLyogTUNCUEMgaW50ZXIuCisgICBBZGRyZXNzaW5nOiA1IGJpdCBjY21tbSAoY2MgPSBDQlBDLCBtbW0gPSBtb2RlICgxLTQgYmluYXJ5KSkgKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIG1jYnBjX2ludGVyX3RhYlsyOV0gPQoreworICAgIHsxLCAxfSwgezMsIDN9LCB7MiwgM30sIHszLCA1fSwgezQsIDZ9LCB7MSwgOX0sIHswLCAwfSwgezAsIDB9LAorICAgIHszLCA0fSwgezcsIDd9LCB7NSwgN30sIHs0LCA4fSwgezQsIDl9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorICAgIHsyLCA0fSwgezYsIDd9LCB7NCwgN30sIHszLCA4fSwgezMsIDl9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAorICAgIHs1LCA2fSwgezUsIDl9LCB7NSwgOH0sIHszLCA3fSwgezIsIDl9Cit9OworCisKKworLyogQ0JQWS4gU3RyYWlnaHRmb3J3YXJkIGluZGV4aW5nICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjYnB5X3RhYlsxNl0gPQoreworICAgIHszLCA0fSwgezUsIDV9LCB7NCwgNX0sIHs5LCA0fSwgezMsIDV9LCB7NywgNH0sIHsyLCA2fSwgezExLCA0fSwKKyAgICB7MiwgNX0sIHszLCA2fSwgezUsIDR9LCB7MTAsIDR9LCB7NCwgNH0sIHs4LCA0fSwgezYsIDR9LCB7MywgMn0KK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjYnB5X3RhYjNbOF0gPQoreworICAgIHszLCAzfSwgezEsIDZ9LCB7MSwgNX0sIHsyLCAzfSwgezIsIDV9LCB7MywgNX0sIHsxLCAzfSwgezEsIDF9Cit9Oworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNicHlfdGFiMls0XSA9Cit7CisgICAgezEsIDR9LCB7MSwgM30sIHsxLCAyfSwgezEsIDF9Cit9OworCisvKiBEQ1QgY29lZmZpY2llbnRzLiBGb3VyIHRhYmxlcywgdHdvIGZvciBsYXN0ID0gMCwgdHdvIGZvciBsYXN0ID0gMS4KKyAgIHRoZSBzaWduIGJpdCBtdXN0IGJlIGFkZGVkIGFmdGVyd2FyZHMuICovCisKKy8qIGZpcnN0IHBhcnQgb2YgY29lZmZzIGZvciBsYXN0ID0gMC4gSW5kZXhlZCBieSBbcnVuXVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiMFsyXVsxMl0gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7CisgICAgICAgIHsweDAyLCAyfSwgezB4MGYsIDR9LCB7MHgxNSwgNn0sIHsweDE3LCA3fSwKKyAgICAgICAgezB4MWYsIDh9LCB7MHgyNSwgOX0sIHsweDI0LCA5fSwgezB4MjEsIDEwfSwKKyAgICAgICAgezB4MjAsIDEwfSwgezB4MDcsIDExfSwgezB4MDYsIDExfSwgezB4MjAsIDExfQorICAgIH0sCisgICAgLyogcnVuID0gMSAqLworICAgIHsKKyAgICAgICAgezB4MDYsIDN9LCB7MHgxNCwgNn0sIHsweDFlLCA4fSwgezB4MGYsIDEwfSwKKyAgICAgICAgezB4MjEsIDExfSwgezB4NTAsIDEyfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sCisgICAgICAgIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0KK307CisKKy8qIHJlc3Qgb2YgY29lZmZzIGZvciBsYXN0ID0gMC4gaW5kZXhpbmcgYnkgW3J1bi0yXVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiMVsyNV1bNF0gPQoreworICAgIC8qIHJ1biA9IDIgKi8KKyAgICB7CisgICAgICAgIHsweDBlLCA0fSwgezB4MWQsIDh9LCB7MHgwZSwgMTB9LCB7MHg1MSwgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSAzICovCisgICAgeworICAgICAgICB7MHgwZCwgNX0sIHsweDIzLCA5fSwgezB4MGQsIDEwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA0LTI2ICovCisgICAgeworICAgICAgICB7MHgwYywgNX0sIHsweDIyLCA5fSwgezB4NTIsIDEyfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDBiLCA1fSwgezB4MGMsIDEwfSwgezB4NTMsIDEyfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDEzLCA2fSwgezB4MGIsIDEwfSwgezB4NTQsIDEyfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDEyLCA2fSwgezB4MGEsIDEwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MTEsIDZ9LCB7MHgwOSwgMTB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxMCwgNn0sIHsweDA4LCAxMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDE2LCA3fSwgezB4NTUsIDEyfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MTUsIDd9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDE0LCA3fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxYywgOH0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWIsIDh9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDIxLCA5fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgyMCwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWYsIDl9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDFlLCA5fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxZCwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWMsIDl9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDFiLCA5fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxYSwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MjIsIDExfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgyMywgMTF9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDU2LCAxMn0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4NTcsIDEyfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0KK307CisKKy8qIGZpcnN0IGNvZWZmcyBvZiBsYXN0ID0gMS4gaW5kZXhpbmcgYnkgW3J1bl1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjJbMl1bM10gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7CisgICAgICAgIHsweDA3LCA0fSwgezB4MTksIDl9LCB7MHgwNSwgMTF9CisgICAgfSwKKyAgICAvKiBydW4gPSAxICovCisgICAgeworICAgICAgICB7MHgwZiwgNn0sIHsweDA0LCAxMX0sIHsweDAwLCAwfQorICAgIH0KK307CisKKy8qIHJlc3Qgb2YgY29lZmZzIGZvciBsYXN0ID0gMS4gaW5kZXhpbmcgYnkgW3J1bi0yXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiM1s0MF0gPQoreworICAgIHsweDBlLCA2fSwgezB4MGQsIDZ9LCB7MHgwYywgNn0sCisgICAgezB4MTMsIDd9LCB7MHgxMiwgN30sIHsweDExLCA3fSwgezB4MTAsIDd9LAorICAgIHsweDFhLCA4fSwgezB4MTksIDh9LCB7MHgxOCwgOH0sIHsweDE3LCA4fSwKKyAgICB7MHgxNiwgOH0sIHsweDE1LCA4fSwgezB4MTQsIDh9LCB7MHgxMywgOH0sCisgICAgezB4MTgsIDl9LCB7MHgxNywgOX0sIHsweDE2LCA5fSwgezB4MTUsIDl9LAorICAgIHsweDE0LCA5fSwgezB4MTMsIDl9LCB7MHgxMiwgOX0sIHsweDExLCA5fSwKKyAgICB7MHgwNywgMTB9LCB7MHgwNiwgMTB9LCB7MHgwNSwgMTB9LCB7MHgwNCwgMTB9LAorICAgIHsweDI0LCAxMX0sIHsweDI1LCAxMX0sIHsweDI2LCAxMX0sIHsweDI3LCAxMX0sCisgICAgezB4NTgsIDEyfSwgezB4NTksIDEyfSwgezB4NWEsIDEyfSwgezB4NWIsIDEyfSwKKyAgICB7MHg1YywgMTJ9LCB7MHg1ZCwgMTJ9LCB7MHg1ZSwgMTJ9LCB7MHg1ZiwgMTJ9LAorICAgIHsweDAwLCAwfQorfTsKKworLyogTmV3IHRhYmxlcyBmb3IgSW50cmEgbHVtaW5hbmNlIGNvZWZmaWNpZW50cy4gU2FtZSBjb2Rld29yZHMsCisgICBkaWZmZXJlbnQgbWVhbmluZyAqLworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAwLCBydW4gPSAwLiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiNFsyN10gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7MHgwMiwgMn0sIHsweDA2LCAzfSwgezB4MGYsIDR9LCB7MHgwZCwgNX0sCisgICAgezB4MGMsIDV9LCB7MHgxNSwgNn0sIHsweDEzLCA2fSwgezB4MTIsIDZ9LAorICAgIHsweDE3LCA3fSwgezB4MWYsIDh9LCB7MHgxZSwgOH0sIHsweDFkLCA4fSwKKyAgICB7MHgyNSwgOX0sIHsweDI0LCA5fSwgezB4MjMsIDl9LCB7MHgyMSwgOX0sCisgICAgezB4MjEsIDEwfSwgezB4MjAsIDEwfSwgezB4MGYsIDEwfSwgezB4MGUsIDEwfSwKKyAgICB7MHgwNywgMTF9LCB7MHgwNiwgMTF9LCB7MHgyMCwgMTF9LCB7MHgyMSwgMTF9LAorICAgIHsweDUwLCAxMn0sIHsweDUxLCAxMn0sIHsweDUyLCAxMn0KK307CisKKy8qIENvZWZmcyBmb3IgbGFzdCA9IDAsIHJ1biA9IDEuIEluZGV4ZWQgYnkgW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl90YWI1WzEwXSA9Cit7CisgICAgezB4MGUsIDR9LCB7MHgxNCwgNn0sIHsweDE2LCA3fSwgezB4MWMsIDh9LAorICAgIHsweDIwLCA5fSwgezB4MWYsIDl9LCB7MHgwZCwgMTB9LCB7MHgyMiwgMTF9LAorICAgIHsweDUzLCAxMn0sIHsweDU1LCAxMn0KK307CisKKy8qIENvZWZmcyBmb3IgbGFzdCA9IDAsIHJ1biA9IDIgLT4gOS4gSW5kZXhlZCBieSBbcnVuLTJdW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl90YWI2WzhdWzVdID0KK3sKKyAgICAvKiBydW4gPSAyICovCisgICAgeworICAgICAgICB7MHgwYiwgNX0sIHsweDE1LCA3fSwgezB4MWUsIDl9LCB7MHgwYywgMTB9LAorICAgICAgICB7MHg1NiwgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSAzICovCisgICAgeworICAgICAgICB7MHgxMSwgNn0sIHsweDFiLCA4fSwgezB4MWQsIDl9LCB7MHgwYiwgMTB9LAorICAgICAgICB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDQgKi8KKyAgICB7CisgICAgICAgIHsweDEwLCA2fSwgezB4MjIsIDl9LCB7MHgwYSwgMTB9LCB7MHgwMCwgMH0sCisgICAgICAgIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gNSAqLworICAgIHsKKyAgICAgICAgezB4MGQsIDZ9LCB7MHgxYywgOX0sIHsweDA4LCAxMH0sIHsweDAwLCAwfSwKKyAgICAgICAgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA2ICovCisgICAgeworICAgICAgICB7MHgxMiwgN30sIHsweDFiLCA5fSwgezB4NTQsIDEyfSwgezB4MDAsIDB9LAorICAgICAgICB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDcgKi8KKyAgICB7CisgICAgICAgIHsweDE0LCA3fSwgezB4MWEsIDl9LCB7MHg1NywgMTJ9LCB7MHgwMCwgMH0sCisgICAgICAgIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gOCAqLworICAgIHsKKyAgICAgICAgezB4MTksIDh9LCB7MHgwOSwgMTB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwKKyAgICAgICAgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA5ICovCisgICAgeworICAgICAgICB7MHgxOCwgOH0sIHsweDIzLCAxMX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LAorICAgICAgICB7MHgwMCwgMH0KKyAgICB9Cit9OworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAwLCBydW4gPSAxMCAtPiAxNC4gSW5kZXhlZCBieSBbcnVuLTEwXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiN1s1XSA9Cit7CisgICAgezB4MTcsIDh9LCB7MHgxOSwgOX0sIHsweDE4LCA5fSwgezB4MDcsIDEwfSwKKyAgICB7MHg1OCwgMTJ9Cit9OworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAxLCBydW4gPSAwLiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiOFs4XSA9Cit7CisgICAgezB4MDcsIDR9LCB7MHgwYywgNn0sIHsweDE2LCA4fSwgezB4MTcsIDl9LAorICAgIHsweDA2LCAxMH0sIHsweDA1LCAxMX0sIHsweDA0LCAxMX0sIHsweDU5LCAxMn0KK307CisKKy8qIENvZWZmcyBmb3IgbGFzdCA9IDEsIHJ1biA9IDEgLT4gNi4gSW5kZXhlZCBieSBbcnVuLTFdW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl90YWI5WzZdWzNdID0KK3sKKyAgICAvKiBydW4gPSAxICovCisgICAgeworICAgICAgICB7MHgwZiwgNn0sIHsweDE2LCA5fSwgezB4MDUsIDEwfQorICAgIH0sCisgICAgLyogcnVuID0gMiAqLworICAgIHsKKyAgICAgICAgezB4MGUsIDZ9LCB7MHgwNCwgMTB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDMgKi8KKyAgICB7CisgICAgICAgIHsweDExLCA3fSwgezB4MjQsIDExfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA0ICovCisgICAgeworICAgICAgICB7MHgxMCwgN30sIHsweDI1LCAxMX0sIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gNSAqLworICAgIHsKKyAgICAgICAgezB4MTMsIDd9LCB7MHg1YSwgMTJ9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDYgKi8KKyAgICB7CisgICAgICAgIHsweDE1LCA4fSwgezB4NWIsIDEyfSwgezB4MDAsIDB9CisgICAgfQorfTsKKworLyogQ29lZmZzIGZvciBsYXN0ID0gMSwgcnVuID0gNyAtPiAyMC4gSW5kZXhlZCBieSBbcnVuLTddICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl90YWIxMFsxNF0gPQoreworICAgIHsweDE0LCA4fSwgezB4MTMsIDh9LCB7MHgxYSwgOH0sIHsweDE1LCA5fSwKKyAgICB7MHgxNCwgOX0sIHsweDEzLCA5fSwgezB4MTIsIDl9LCB7MHgxMSwgOX0sCisgICAgezB4MjYsIDExfSwgezB4MjcsIDExfSwgezB4NWMsIDEyfSwgezB4NWQsIDEyfSwKKyAgICB7MHg1ZSwgMTJ9LCB7MHg1ZiwgMTJ9Cit9OworCisKKyNpZm5kZWYgTk9fUlZMQworLyogUlZMQyB0YWJsZXMgKi8KKy8qIERDVCBjb2VmZmljaWVudHMuIEZvdXIgdGFibGVzLCB0d28gZm9yIGxhc3QgPSAwLCB0d28gZm9yIGxhc3QgPSAxLgorICAgdGhlIHNpZ24gYml0IG11c3QgYmUgYWRkZWQgYWZ0ZXJ3YXJkcy4gKi8KKworLyogRENUICBjb2VmZnMgKGludHJhKSBmb3IgbGFzdCA9IDAuICAqLworCisvKiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjFbMjddID0KK3sKKyAgICAvKiBydW4gPSAwICovCisgICAgeyAgICAgMHg2LCAgM30sCisgICAgeyAgICAgMHg3LCAgM30sCisgICAgeyAgICAgMHhhLCAgNH0sCisgICAgeyAgICAgMHg5LCAgNX0sCisgICAgeyAgICAweDE0LCAgNn0sCisgICAgeyAgICAweDE1LCAgNn0sCisgICAgeyAgICAweDM0LCAgN30sCisgICAgeyAgICAweDc0LCAgOH0sCisgICAgeyAgICAweDc1LCAgOH0sCisgICAgeyAgICAweGRkLCAgOX0sCisgICAgeyAgICAweGVjLCAgOX0sCisgICAgeyAgIDB4MWVjLCAxMH0sCisgICAgeyAgIDB4MWVkLCAxMH0sCisgICAgeyAgIDB4MWY0LCAxMH0sCisgICAgeyAgIDB4M2VjLCAxMX0sCisgICAgeyAgIDB4M2VkLCAxMX0sCisgICAgeyAgIDB4M2Y0LCAxMX0sCisgICAgeyAgIDB4NzdkLCAxMn0sCisgICAgeyAgIDB4N2JjLCAxMn0sCisgICAgeyAgIDB4ZmJkLCAxM30sCisgICAgeyAgIDB4ZmRjLCAxM30sCisgICAgeyAgIDB4N2JkLCAxMn0sCisgICAgeyAgIDB4ZmRkLCAxM30sCisgICAgeyAgMHgxZmJkLCAxNH0sCisgICAgeyAgMHgxZmRjLCAxNH0sCisgICAgeyAgMHgxZmRkLCAxNH0sCisgICAgeyAgMHgxZmZjLCAxNX0KK307CisKKworLyogSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIyWzEzXSA9Cit7CisgICAgLyogcnVuID0gMSAqLworICAgIHsgICAgIDB4MSwgIDR9LAorICAgIHsgICAgIDB4OCwgIDV9LAorICAgIHsgICAgMHgyZCwgIDd9LAorICAgIHsgICAgMHg2YywgIDh9LAorICAgIHsgICAgMHg2ZCwgIDh9LAorICAgIHsgICAgMHhkYywgIDl9LAorICAgIHsgICAweDFkZCwgMTB9LAorICAgIHsgICAweDNkYywgMTF9LAorICAgIHsgICAweDNkZCwgMTF9LAorICAgIHsgICAweDc3YywgMTJ9LAorICAgIHsgICAweGZiYywgMTN9LAorICAgIHsgIDB4MWY3ZCwgMTR9LAorICAgIHsgIDB4MWZiYywgMTR9Cit9OworCisKKy8qIEluZGV4ZWQgYnkgW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiM1sxMV0gPQoreworICAgIC8qIHJ1biA9IDIgKi8KKworICAgIHsgICAgIDB4NCwgIDV9LAorICAgIHsgICAgMHgyYywgIDd9LAorICAgIHsgICAgMHhiYywgIDl9LAorICAgIHsgICAweDFkYywgMTB9LAorICAgIHsgICAweDNiYywgMTF9LAorICAgIHsgICAweDNiZCwgMTF9LAorICAgIHsgICAweGVmZCwgMTN9LAorICAgIHsgICAweGY3YywgMTN9LAorICAgIHsgICAweGY3ZCwgMTN9LAorICAgIHsgIDB4MWVmZCwgMTR9LAorICAgIHsgIDB4MWY3YywgMTR9Cit9OworCisKKy8qIEluZGV4ZWQgYnkgW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiNFs5XSA9Cit7CisgICAgLyogcnVuID0gMyAqLworICAgIHsgICAgIDB4NSwgIDV9LAorICAgIHsgICAgMHg1YywgIDh9LAorICAgIHsgICAgMHhiZCwgIDl9LAorICAgIHsgICAweDM3ZCwgMTF9LAorICAgIHsgICAweDZmYywgMTJ9LAorICAgIHsgICAweGVmYywgMTN9LAorICAgIHsgIDB4MWRmZCwgMTR9LAorICAgIHsgIDB4MWVmYywgMTR9LAorICAgIHsgIDB4MWZmZCwgMTV9Cit9OworCisKKy8qIEluZGV4ZWQgYnkgW3J1bi00XVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjVbMl1bNl0gPQoreworICAgIC8qIHJ1biA9IDQgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4YywgIDZ9LAorICAgICAgICB7ICAgIDB4NWQsICA4fSwKKyAgICAgICAgeyAgIDB4MWJkLCAxMH0sCisgICAgICAgIHsgICAweDNmZCwgMTJ9LAorICAgICAgICB7ICAgMHg2ZmQsIDEyfSwKKyAgICAgICAgeyAgMHgxYmZkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDUgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4ZCwgIDZ9LAorICAgICAgICB7ICAgIDB4N2QsICA5fSwKKyAgICAgICAgeyAgIDB4MmZjLCAxMX0sCisgICAgICAgIHsgICAweDVmYywgMTJ9LAorICAgICAgICB7ICAweDFiZmMsIDE0fSwKKyAgICAgICAgeyAgMHgxZGZjLCAxNH0KKyAgICB9Cit9OworCisKKy8qIEluZGV4ZWQgYnkgW3J1bi02XVtsZXZlbC0xXSAgICAgICAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjZbMl1bNV0gPQoreworCisgICAgLyogcnVuID0gNiAqLworICAgIHsKKyAgICAgICAgeyAgICAweDFjLCAgN30sCisgICAgICAgIHsgICAweDE3YywgMTB9LAorICAgICAgICB7ICAgMHgyZmQsIDExfSwKKyAgICAgICAgeyAgIDB4NWZkLCAxMn0sCisgICAgICAgIHsgIDB4MmZmYywgMTV9CisgICAgfSwKKyAgICAvKiBydW4gPSA3ICovCisgICAgeworICAgICAgICB7ICAgIDB4MWQsICA3fSwKKyAgICAgICAgeyAgIDB4MTdkLCAxMH0sCisgICAgICAgIHsgICAweDM3YywgMTF9LAorICAgICAgICB7ICAgMHhkZmQsIDEzfSwKKyAgICAgICAgeyAgMHgyZmZkLCAxNX0KKyAgICB9CisKK307CisvKiBJbmRleGVkIGJ5IFtydW4tOF1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWI3WzJdWzRdID0KK3sKKyAgICAvKiBydW4gPSA4ICovCisgICAgeworICAgICAgICB7ICAgIDB4M2MsICA4fSwKKyAgICAgICAgeyAgIDB4MWJjLCAxMH0sCisgICAgICAgIHsgICAweGJmZCwgMTN9LAorICAgICAgICB7ICAweDE3ZmQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gOSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDNkLCAgOH0sCisgICAgICAgIHsgICAweDFmZCwgMTF9LAorICAgICAgICB7ICAgMHhkZmMsIDEzfSwKKyAgICAgICAgeyAgMHgzN2ZjLCAxNX0sCisgICAgfQorfTsKKworCisKKy8qIEluZGV4ZWQgYnkgW3J1bi0xMF1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWI4WzNdWzJdID0KK3sKKyAgICAvKiBydW4gPSAxMCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDdjLCAgOX0sCisgICAgICAgIHsgICAweDNmYywgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMSAqLworICAgIHsKKyAgICAgICAgeyAgICAweGZjLCAxMH0sCisgICAgICAgIHsgICAweGJmYywgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMiAqLworICAgIHsKKyAgICAgICAgeyAgICAweGZkLCAxMH0sCisgICAgICAgIHsgIDB4MzdmZCwgMTV9CisgICAgfQorfTsKKworCisvKiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjlbN10gPQoreworICAgIC8qIHJ1biA9IDEzIC0+IDE5ICovCisgICAgeyAgIDB4MWZjLCAxMX0sCisgICAgeyAgIDB4N2ZjLCAxM30sCisgICAgeyAgIDB4N2ZkLCAxM30sCisgICAgeyAgIDB4ZmZjLCAxNH0sCisgICAgeyAgIDB4ZmZkLCAxNH0sCisgICAgeyAgMHgxN2ZjLCAxNH0sCisgICAgeyAgMHgzYmZjLCAxNX0KK307CisKKworCisvKiBmaXJzdCBjb2VmZnMgb2YgbGFzdCA9IDEuIGluZGV4aW5nIGJ5IFtydW5dW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMTBbMl1bNV0gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4YiwgIDR9LAorICAgICAgICB7ICAgIDB4NzgsICA4fSwKKyAgICAgICAgeyAgIDB4M2Y1LCAxMX0sCisgICAgICAgIHsgICAweGZlYywgMTN9LAorICAgICAgICB7ICAweDFmZWMsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDEyLCAgNX0sCisgICAgICAgIHsgICAgMHhlZCwgIDl9LAorICAgICAgICB7ICAgMHg3ZGMsIDEyfSwKKyAgICAgICAgeyAgMHgxZmVkLCAxNH0sCisgICAgICAgIHsgIDB4M2JmZCwgMTV9CisgICAgfQorCit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjExWzNdID0KK3sKKyAgICAvKiBydW4gPSAyICovCisgICAgeyAgICAweDEzLCAgNX0sCisgICAgeyAgIDB4M2Y4LCAxMX0sCisgICAgeyAgMHgzZGZjLCAxNX0KKworfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxMlsxMV1bMl0gPQoreworICAgIC8qIHJ1biA9IDMgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxOCwgIDZ9LAorICAgICAgICB7ICAgMHg3ZGQsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gNCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDE5LCAgNn0sCisgICAgICAgIHsgICAweDdlYywgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSA1ICovCisgICAgeworICAgICAgICB7ICAgIDB4MjIsICA2fSwKKyAgICAgICAgeyAgIDB4ZmVkLCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDYgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgyMywgIDZ9LAorICAgICAgICB7ICAgMHhmZjQsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gNyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDM1LCAgN30sCisgICAgICAgIHsgICAweGZmNSwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA4ICovCisgICAgeworICAgICAgICB7ICAgIDB4MzgsICA3fSwKKyAgICAgICAgeyAgIDB4ZmY4LCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDkgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzOSwgIDd9LAorICAgICAgICB7ICAgMHhmZjksIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gMTAgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg0MiwgIDd9LAorICAgICAgICB7ICAweDFmZjQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTEgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg0MywgIDd9LAorICAgICAgICB7ICAweDFmZjUsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTIgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg3OSwgIDh9LAorICAgICAgICB7ICAweDFmZjgsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTMgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg4MiwgIDh9LAorICAgICAgICB7ICAweDNkZmQsIDE1fQorICAgIH0KKworfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxM1szMl0gPQoreworICAgIC8qIHJ1biA9IDE0IC0+IDQ0ICovCisgICAgeyAgICAweDgzLCAgOH0sCisgICAgeyAgICAweGY0LCAgOX0sCisgICAgeyAgICAweGY1LCAgOX0sCisgICAgeyAgICAweGY4LCAgOX0sCisgICAgeyAgICAweGY5LCAgOX0sCisgICAgeyAgIDB4MTAyLCAgOX0sCisgICAgeyAgIDB4MTAzLCAgOX0sCisgICAgeyAgIDB4MWY1LCAxMH0sCisgICAgeyAgIDB4MWY4LCAxMH0sCisgICAgeyAgIDB4MWY5LCAxMH0sCisgICAgeyAgIDB4MjAyLCAxMH0sCisgICAgeyAgIDB4MjAzLCAxMH0sCisgICAgeyAgIDB4M2Y5LCAxMX0sCisgICAgeyAgIDB4NDAyLCAxMX0sCisgICAgeyAgIDB4NDAzLCAxMX0sCisgICAgeyAgIDB4N2VkLCAxMn0sCisgICAgeyAgIDB4N2Y0LCAxMn0sCisgICAgeyAgIDB4N2Y1LCAxMn0sCisgICAgeyAgIDB4N2Y4LCAxMn0sCisgICAgeyAgIDB4N2Y5LCAxMn0sCisgICAgeyAgIDB4ODAyLCAxMn0sCisgICAgeyAgIDB4ODAzLCAxMn0sCisgICAgeyAgMHgxMDAyLCAxM30sCisgICAgeyAgMHgxMDAzLCAxM30sCisgICAgeyAgMHgxZmY5LCAxNH0sCisgICAgeyAgMHgyMDAyLCAxNH0sCisgICAgeyAgMHgyMDAzLCAxNH0sCisgICAgeyAgMHgzZWZjLCAxNX0sCisgICAgeyAgMHgzZWZkLCAxNX0sCisgICAgeyAgMHgzZjdjLCAxNX0sCisgICAgeyAgMHgzZjdkLCAxNX0KK307CisKKworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAwLCBydW4gPSAwLiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE0WzE5XSA9Cit7CisgICAgLyogcnVuID0gMCAqLworICAgIHsgICAgIDB4NiwgIDN9LAorICAgIHsgICAgIDB4MSwgIDR9LAorICAgIHsgICAgIDB4NCwgIDV9LAorICAgIHsgICAgMHgxYywgIDd9LAorICAgIHsgICAgMHgzYywgIDh9LAorICAgIHsgICAgMHgzZCwgIDh9LAorICAgIHsgICAgMHg3YywgIDl9LAorICAgIHsgICAgMHhmYywgMTB9LAorICAgIHsgICAgMHhmZCwgMTB9LAorICAgIHsgICAweDFmYywgMTF9LAorICAgIHsgICAweDFmZCwgMTF9LAorICAgIHsgICAweDNmYywgMTJ9LAorICAgIHsgICAweDdmYywgMTN9LAorICAgIHsgICAweDdmZCwgMTN9LAorICAgIHsgICAweGJmYywgMTN9LAorICAgIHsgICAweGJmZCwgMTN9LAorICAgIHsgICAweGZmYywgMTR9LAorICAgIHsgICAweGZmZCwgMTR9LAorICAgIHsgIDB4MWZmYywgMTV9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE1WzEwXSA9Cit7CisgICAgLyogcnVuID0gMSAqLworICAgIHsgICAgIDB4NywgIDN9LAorICAgIHsgICAgIDB4YywgIDZ9LAorICAgIHsgICAgMHg1YywgIDh9LAorICAgIHsgICAgMHg3ZCwgIDl9LAorICAgIHsgICAweDE3YywgMTB9LAorICAgIHsgICAweDJmYywgMTF9LAorICAgIHsgICAweDNmZCwgMTJ9LAorICAgIHsgICAweGRmYywgMTN9LAorICAgIHsgIDB4MTdmYywgMTR9LAorICAgIHsgIDB4MTdmZCwgMTR9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE2WzJdWzddID0KK3sKKyAgICAvKiBydW4gPSAyICovCisgICAgeworICAgICAgICB7ICAgICAweGEsICA0fSwKKyAgICAgICAgeyAgICAweDFkLCAgN30sCisgICAgICAgIHsgICAgMHhiYywgIDl9LAorICAgICAgICB7ICAgMHgyZmQsIDExfSwKKyAgICAgICAgeyAgIDB4NWZjLCAxMn0sCisgICAgICAgIHsgIDB4MWJmYywgMTR9LAorICAgICAgICB7ICAweDFiZmQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMyAqLworICAgIHsKKyAgICAgICAgeyAgICAgMHg1LCAgNX0sCisgICAgICAgIHsgICAgMHg1ZCwgIDh9LAorICAgICAgICB7ICAgMHgxN2QsIDEwfSwKKyAgICAgICAgeyAgIDB4NWZkLCAxMn0sCisgICAgICAgIHsgICAweGRmZCwgMTN9LAorICAgICAgICB7ICAweDFkZmMsIDE0fSwKKyAgICAgICAgeyAgMHgxZmZkLCAxNX0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE3WzVdID0KK3sKKyAgICAvKiBydW4gPSA0ICovCisgICAgeyAgICAgMHg4LCAgNX0sCisgICAgeyAgICAweDZjLCAgOH0sCisgICAgeyAgIDB4MzdjLCAxMX0sCisgICAgeyAgIDB4ZWZjLCAxM30sCisgICAgeyAgMHgyZmZjLCAxNX0KK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMThbM11bNF0gPQoreworICAgIC8qIHJ1biA9IDUgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4OSwgIDV9LAorICAgICAgICB7ICAgIDB4YmQsICA5fSwKKyAgICAgICAgeyAgIDB4MzdkLCAxMX0sCisgICAgICAgIHsgICAweGVmZCwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA2ICovCisgICAgeworICAgICAgICB7ICAgICAweGQsICA2fSwKKyAgICAgICAgeyAgIDB4MWJjLCAxMH0sCisgICAgICAgIHsgICAweDZmYywgMTJ9LAorICAgICAgICB7ICAweDFkZmQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gNyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDE0LCAgNn0sCisgICAgICAgIHsgICAweDFiZCwgMTB9LAorICAgICAgICB7ICAgMHg2ZmQsIDEyfSwKKyAgICAgICAgeyAgMHgyZmZkLCAxNX0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE5WzJdWzNdID0KK3sKKyAgICAvKiBydW4gPSA4ICovCisgICAgeworICAgICAgICB7ICAgIDB4MTUsICA2fSwKKyAgICAgICAgeyAgIDB4MWRjLCAxMH0sCisgICAgICAgIHsgICAweGY3YywgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA5ICovCisgICAgeworICAgICAgICB7ICAgIDB4MmMsICA3fSwKKyAgICAgICAgeyAgIDB4MWRkLCAxMH0sCisgICAgICAgIHsgIDB4MWVmYywgMTR9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIyMFs4XVsyXSA9Cit7CisgICAgLyogcnVuID0gMTAgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgyZCwgIDd9LAorICAgICAgICB7ICAgMHgzYmMsIDExfQorICAgIH0sCisgICAgLyogcnVuID0gMTEgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzNCwgIDd9LAorICAgICAgICB7ICAgMHg3N2MsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gMTIgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg2ZCwgIDh9LAorICAgICAgICB7ICAgMHhmN2QsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gMTMgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg3NCwgIDh9LAorICAgICAgICB7ICAweDFlZmQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTQgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg3NSwgIDh9LAorICAgICAgICB7ICAweDFmN2MsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTUgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHhkYywgIDl9LAorICAgICAgICB7ICAweDFmN2QsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTYgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHhkZCwgIDl9LAorICAgICAgICB7ICAweDFmYmMsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTcgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHhlYywgIDl9LAorICAgICAgICB7ICAweDM3ZmMsIDE1fQorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMjFbMjFdID0KK3sKKyAgICAvKiBydW4gPSAxOCAtPiAzOCAqLworICAgIHsgICAweDFlYywgMTB9LAorICAgIHsgICAweDFlZCwgMTB9LAorICAgIHsgICAweDFmNCwgMTB9LAorICAgIHsgICAweDNiZCwgMTF9LAorICAgIHsgICAweDNkYywgMTF9LAorICAgIHsgICAweDNkZCwgMTF9LAorICAgIHsgICAweDNlYywgMTF9LAorICAgIHsgICAweDNlZCwgMTF9LAorICAgIHsgICAweDNmNCwgMTF9LAorICAgIHsgICAweDc3ZCwgMTJ9LAorICAgIHsgICAweDdiYywgMTJ9LAorICAgIHsgICAweDdiZCwgMTJ9LAorICAgIHsgICAweGZiYywgMTN9LAorICAgIHsgICAweGZiZCwgMTN9LAorICAgIHsgICAweGZkYywgMTN9LAorICAgIHsgICAweGZkZCwgMTN9LAorICAgIHsgIDB4MWZiZCwgMTR9LAorICAgIHsgIDB4MWZkYywgMTR9LAorICAgIHsgIDB4MWZkZCwgMTR9LAorICAgIHsgIDB4MzdmZCwgMTV9LAorICAgIHsgIDB4M2JmYywgMTV9Cit9OworCisKKy8qIGZpcnN0IGNvZWZmcyBvZiBsYXN0ID0gMS4gaW5kZXhpbmcgYnkgW3J1bl1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIyMlsyXVs1XSA9Cit7CisgICAgLyogcnVuID0gMCAqLworICAgIHsKKyAgICAgICAgeyAgICAgMHhiLCAgNH0sCisgICAgICAgIHsgICAgMHg3OCwgIDh9LAorICAgICAgICB7ICAgMHgzZjUsIDExfSwKKyAgICAgICAgeyAgIDB4ZmVjLCAxM30sCisgICAgICAgIHsgIDB4MWZlYywgMTR9CisgICAgfSwKKyAgICAvKiBydW4gPSAxICovCisgICAgeworICAgICAgICB7ICAgIDB4MTIsICA1fSwKKyAgICAgICAgeyAgICAweGVkLCAgOX0sCisgICAgICAgIHsgICAweDdkYywgMTJ9LAorICAgICAgICB7ICAweDFmZWQsIDE0fSwKKyAgICAgICAgeyAgMHgzYmZkLCAxNX0KKyAgICB9CisKK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMjNbM10gPQoreworICAgIC8qIHJ1biA9IDIgKi8KKyAgICB7ICAgIDB4MTMsICA1fSwKKyAgICB7ICAgMHgzZjgsIDExfSwKKyAgICB7ICAweDNkZmMsIDE1fQorCit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjI0WzExXVsyXSA9Cit7CisgICAgLyogcnVuID0gMyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDE4LCAgNn0sCisgICAgICAgIHsgICAweDdkZCwgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSA0ICovCisgICAgeworICAgICAgICB7ICAgIDB4MTksICA2fSwKKyAgICAgICAgeyAgIDB4N2VjLCAxMn0KKyAgICB9LAorICAgIC8qIHJ1biA9IDUgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgyMiwgIDZ9LAorICAgICAgICB7ICAgMHhmZWQsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gNiAqLworICAgIHsKKyAgICAgICAgeyAgICAweDIzLCAgNn0sCisgICAgICAgIHsgICAweGZmNCwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA3ICovCisgICAgeworICAgICAgICB7ICAgIDB4MzUsICA3fSwKKyAgICAgICAgeyAgIDB4ZmY1LCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDggKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzOCwgIDd9LAorICAgICAgICB7ICAgMHhmZjgsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gOSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDM5LCAgN30sCisgICAgICAgIHsgICAweGZmOSwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDQyLCAgN30sCisgICAgICAgIHsgIDB4MWZmNCwgMTR9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDQzLCAgN30sCisgICAgICAgIHsgIDB4MWZmNSwgMTR9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMiAqLworICAgIHsKKyAgICAgICAgeyAgICAweDc5LCAgOH0sCisgICAgICAgIHsgIDB4MWZmOCwgMTR9CisgICAgfSwKKyAgICAvKiBydW4gPSAxMyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDgyLCAgOH0sCisgICAgICAgIHsgIDB4M2RmZCwgMTV9CisgICAgfQorCit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjI1WzMyXSA9Cit7CisgICAgLyogcnVuID0gMTQgLT4gNDQgKi8KKyAgICB7ICAgIDB4ODMsICA4fSwKKyAgICB7ICAgIDB4ZjQsICA5fSwKKyAgICB7ICAgIDB4ZjUsICA5fSwKKyAgICB7ICAgIDB4ZjgsICA5fSwKKyAgICB7ICAgIDB4ZjksICA5fSwKKyAgICB7ICAgMHgxMDIsICA5fSwKKyAgICB7ICAgMHgxMDMsICA5fSwKKyAgICB7ICAgMHgxZjUsIDEwfSwKKyAgICB7ICAgMHgxZjgsIDEwfSwKKyAgICB7ICAgMHgxZjksIDEwfSwKKyAgICB7ICAgMHgyMDIsIDEwfSwKKyAgICB7ICAgMHgyMDMsIDEwfSwKKyAgICB7ICAgMHgzZjksIDExfSwKKyAgICB7ICAgMHg0MDIsIDExfSwKKyAgICB7ICAgMHg0MDMsIDExfSwKKyAgICB7ICAgMHg3ZWQsIDEyfSwKKyAgICB7ICAgMHg3ZjQsIDEyfSwKKyAgICB7ICAgMHg3ZjUsIDEyfSwKKyAgICB7ICAgMHg3ZjgsIDEyfSwKKyAgICB7ICAgMHg3ZjksIDEyfSwKKyAgICB7ICAgMHg4MDIsIDEyfSwKKyAgICB7ICAgMHg4MDMsIDEyfSwKKyAgICB7ICAweDEwMDIsIDEzfSwKKyAgICB7ICAweDEwMDMsIDEzfSwKKyAgICB7ICAweDFmZjksIDE0fSwKKyAgICB7ICAweDIwMDIsIDE0fSwKKyAgICB7ICAweDIwMDMsIDE0fSwKKyAgICB7ICAweDNlZmMsIDE1fSwKKyAgICB7ICAweDNlZmQsIDE1fSwKKyAgICB7ICAweDNmN2MsIDE1fSwKKyAgICB7ICAweDNmN2QsIDE1fQorfTsKKworI2VuZGlmIC8qIE5PX1JWTEMgKi8KKworI2VuZGlmIC8qIF9WTENfRU5DX1RBQl9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTVkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApAQCAtMCwwICsxLDI3OTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgc29mdHdhcmUgbW9kdWxlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieQorKgorKiBSb2JlcnQgRGFuaWVsc2VuIChUZWxlbm9yIC8gQUNUUy1Nb011U3lzKS4KKyoKKyogYW5kIGVkaXRlZCBieQorKgorKiBMdWlzIER1Y2xhLVNvYXJlcyAoSVNUIC8gQUNUUy1Nb011U3lzKS4KKyogQ29yIFF1aXN0IChLUE4gLyBBQ1RTLU1vTXVTeXMpLgorKgorKiBpbiB0aGUgY291cnNlIG9mIGRldmVsb3BtZW50IG9mIHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgc3RhbmRhcmQuCisqIFRoaXMgc29mdHdhcmUgbW9kdWxlIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgcGFydCBvZiBvbmUgb3IgbW9yZSBNUEVHLTQKKyogVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgdG9vbHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMKKyogMTQ0OTYtMikgc3RhbmRhcmQuCisqCisqIElTTy9JRUMgZ2l2ZXMgdXNlcnMgb2YgdGhlIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZCBmcmVlCisqIGxpY2Vuc2UgdG8gdGhpcyBzb2Z0d2FyZSBtb2R1bGUgb3IgbW9kaWZpY2F0aW9ucyB0aGVyZW9mIGZvciB1c2UgaW4gaGFyZHdhcmUKKyogb3Igc29mdHdhcmUgcHJvZHVjdHMgY2xhaW1pbmcgY29uZm9ybWFuY2UgdG8gdGhlIE1QRUctNCBWaWRlbyAoSVNPL0lFQworKiAxNDQ5Ni0yKSBzdGFuZGFyZC4KKyoKKyogVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvZnR3YXJlIG1vZHVsZSBpbiBoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cworKiBhcmUgYWR2aXNlZCB0aGF0IGl0cyB1c2UgbWF5IGluZnJpbmdlIGV4aXN0aW5nIHBhdGVudHMuIFRoZSBvcmlnaW5hbAorKiBkZXZlbG9wZXIgb2YgdGhpcyBzb2Z0d2FyZSBtb2R1bGUgYW5kIGhpcy9oZXIgY29tcGFueSwgdGhlIHN1YnNlcXVlbnQKKyogZWRpdG9ycyBhbmQgdGhlaXIgY29tcGFuaWVzLCBhbmQgSVNPL0lFQyBoYXZlIG5vIGxpYWJpbGl0eSBmb3IgdXNlIG9mIHRoaXMKKyogc29mdHdhcmUgbW9kdWxlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiBpbiBhbiBpbXBsZW1lbnRhdGlvbi4gQ29weXJpZ2h0IGlzCisqIG5vdCByZWxlYXNlZCBmb3Igbm9uIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZCBjb25mb3JtaW5nCisqIHByb2R1Y3RzLgorKgorKiBBQ1RTLU1vTXVTeXMgcGFydG5lcnMgcmV0YWluIGZ1bGwgcmlnaHQgdG8gdXNlIHRoZSBjb2RlIGZvciBoaXMvaGVyIG93bgorKiBwdXJwb3NlLCBhc3NpZ24gb3IgZG9uYXRlIHRoZSBjb2RlIHRvIGEgdGhpcmQgcGFydHkgYW5kIHRvIGluaGliaXQgdGhpcmQKKyogcGFydGllcyBmcm9tIHVzaW5nIHRoZSBjb2RlIGZvciBub24gTVBFRy00IFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHN0YW5kYXJkCisqIGNvbmZvcm1pbmcgcHJvZHVjdHMuIFRoaXMgY29weXJpZ2h0IG5vdGljZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3IKKyogZGVyaXZhdGl2ZSB3b3Jrcy4KKyoKKyogQ29weXJpZ2h0IChjKSAxOTk3CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqSGVhZGVyQmVnaW4qKioqKioqCisqCisqIEZpbGU6IHB1dHZsYy5jCisqCisqIEF1dGhvcjogICBSb2JlcnQgRGFuaWVsc2VuLCBUZWxlbm9yIFImRAorKiBDcmVhdGVkOiAgMDcuMDcuOTYKKyoKKyogRGVzY3JpcHRpb246IEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBiaXRzdHJlYW0KKyoKKyogTm90ZXM6ICAgIFNhbWUga2luZCBvZiB0YWJsZXMgYXMgaW4gdGhlIE1QRUctMiBzb2Z0d2FyZSBzaW11bGF0aW9uCisqICAgICAgIGdyb3VwIHNvZnR3YXJlLgorKgorKiBNb2RpZmllZDoKKyogICAyOC4xMC45NiBSb2JlcnQgRGFuaWVsc2VuOiBBZGRlZCBQdXRDb2VmZl9JbnRyYSgpLCByZW5hbWVkCisqICAgICAgICAgICBQdXRDb2VmZigpIHRvIFB1dENvZWZmX0ludGVyKCkuCisqICAgMDYuMTEuOTYgUm9iZXJ0IERhbmllbHNlbjogQWRkZWQgUHV0TUNCUENfc2VwKCkKKyogICAgICAwMS4wNS45NyBMdWlzIER1Y2xhLVNvYXJlczogYWRkZWQgUHV0Q29lZmZfSW50cmFfUlZMQygpIGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRDb2VmZl9JbnRlcl9SVkxDKCkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkhlYWRlckVuZCoqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgICBJTkNMVURFIEZJTEVTICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgInZsY19lbmNfdGFiLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtX2lvLmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKyNpbmNsdWRlICJ2bGNfZW5jb2RlX2lubGluZS5oIgorCit0eXBlZGVmIHZvaWQgKCpCbG9ja0NvZGVDb2VmZlB0cikoUnVuTGV2ZWxCbG9jayosIEJpdHN0cmVhbUVuY1ZpZGVvKiwgSW50LCBJbnQsIFVDaGFyKSA7CisKK2NvbnN0IHN0YXRpYyBJbnQgbW9kZV9NQnR5cGVbXSA9Cit7CisgICAgMywKKyAgICAwLAorICAgIDQsCisgICAgMSwKKyAgICAyLAorfTsKKworY29uc3Qgc3RhdGljIEludCB6aWd6YWdfaW52W05DT0VGRl9CTE9DS10gPQoreworICAgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgICAgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAorICAgIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgICAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorICAgIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MworfTsKKworLyogSG9yaXpvbnRhbCB6aWd6YWcgaW52ZXJzZSAqLworY29uc3Qgc3RhdGljIEludCB6aWd6YWdfaF9pbnZbTkNPRUZGX0JMT0NLXSA9Cit7CisgICAgMCwgMSwgMiwgMywgOCwgOSwgMTYsIDE3LAorICAgIDEwLCAxMSwgNCwgNSwgNiwgNywgMTUsIDE0LAorICAgIDEzLCAxMiwgMTksIDE4LCAyNCwgMjUsIDMyLCAzMywKKyAgICAyNiwgMjcsIDIwLCAyMSwgMjIsIDIzLCAyOCwgMjksCisgICAgMzAsIDMxLCAzNCwgMzUsIDQwLCA0MSwgNDgsIDQ5LAorICAgIDQyLCA0MywgMzYsIDM3LCAzOCwgMzksIDQ0LCA0NSwKKyAgICA0NiwgNDcsIDUwLCA1MSwgNTYsIDU3LCA1OCwgNTksCisgICAgNTIsIDUzLCA1NCwgNTUsIDYwLCA2MSwgNjIsIDYzCit9OworCisvKiBWZXJ0aWNhbCB6aWd6YWcgaW52ZXJzZSAqLworY29uc3Qgc3RhdGljIEludCB6aWd6YWdfdl9pbnZbTkNPRUZGX0JMT0NLXSA9Cit7CisgICAgMCwgOCwgMTYsIDI0LCAxLCA5LCAyLCAxMCwKKyAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCA1NywgNDksCisgICAgNDEsIDMzLCAyNiwgMTgsIDMsIDExLCA0LCAxMiwKKyAgICAxOSwgMjcsIDM0LCA0MiwgNTAsIDU4LCAzNSwgNDMsCisgICAgNTEsIDU5LCAyMCwgMjgsIDUsIDEzLCA2LCAxNCwKKyAgICAyMSwgMjksIDM2LCA0NCwgNTIsIDYwLCAzNywgNDUsCisgICAgNTMsIDYxLCAyMiwgMzAsIDcsIDE1LCAyMywgMzEsCisgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgSW50IFB1dENvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludGVyX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0Q29lZmZfSW50cmEoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0Q29lZmZfSW50cmFfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRDQlBZKEludCBjYnB5LCBDaGFyIGludHJhLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0TUNCUENfSW50ZXIoSW50IGNicGMsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0TUNCUENfSW50cmEoSW50IGNicGMsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0TVYoSW50IG12aW50LCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0RENzaXplX2Nocm9tKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0RENzaXplX2x1bShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dERDc2l6ZV9sdW0oSW50IHNpemUsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworI2lmbmRlZiBOT19SVkxDCisgICAgSW50IFB1dENvZWZmX0ludGVyX1JWTEMoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0Q29lZmZfSW50ZXJfUlZMQ19MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludHJhX1JWTEMoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0Q29lZmZfSW50cmFfUlZMQ19MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisjZW5kaWYKKyAgICBJbnQgUHV0UnVuQ29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0UnVuQ29lZmZfSW50ZXJfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRSdW5Db2VmZl9JbnRyYShJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRSdW5Db2VmZl9JbnRyYV9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dExldmVsQ29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0TGV2ZWxDb2VmZl9JbnRlcl9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dExldmVsQ29lZmZfSW50cmEoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0TGV2ZWxDb2VmZl9JbnRyYV9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisKKyAgICB2b2lkIFJ1bkxldmVsKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBpbnRyYSwgSW50IGludHJhRENfZGVjaXNpb24sIEludCBuY29lZmJsY2tbXSk7CisgICAgSW50IEludHJhRENfZHBjbShJbnQgdmFsLCBJbnQgbHVtLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBWb2lkIERDQUNQcmVkKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyIE1vZGUsIEludCAqaW50cmFEQ19kZWNpc2lvbiwgSW50IGludHJhRENWbGNRUCk7CisgICAgVm9pZCBmaW5kX3BtdnMoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGJsb2NrLCBJbnQgKm12eCwgSW50ICptdnkpOworICAgIFZvaWQgIFdyaXRlTVZjb21wb25lbnQoSW50IGZfY29kZSwgSW50IGRtdiwgQml0c3RyZWFtRW5jVmlkZW8gKmJzKTsKKyAgICBzdGF0aWMgQm9vbCBJbnRyYURDU3dpdGNoX0RlY2lzaW9uKEludCBNb2RlLCBJbnQgaW50cmFfZGNfdmxjX3RocmVzaG9sZCwgSW50IGludHJhRENWbGNRUCk7CisKKyAgICBWb2lkIFNjYWxlTVZEKEludCAgZl9jb2RlLCBJbnQgIGRpZmZfdmVjdG9yLCBJbnQgICpyZXNpZHVhbCwgSW50ICAqdmxjX2NvZGVfbWFnKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworSW50CitQdXREQ3NpemVfbHVtKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGg7CisKKyAgICBpZiAoIShzaXplID49IDAgJiYgc2l6ZSA8IDEzKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbGVuZ3RoID0gREN0YWJfbHVtW3NpemVdLmxlbjsKKyAgICBpZiAobGVuZ3RoKQorICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCBEQ3RhYl9sdW1bc2l6ZV0uY29kZSk7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dERDc2l6ZV9jaHJvbShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoOworCisgICAgaWYgKCEoc2l6ZSA+PSAwICYmIHNpemUgPCAxMykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsZW5ndGggPSBEQ3RhYl9jaHJvbVtzaXplXS5sZW47CisgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgREN0YWJfY2hyb21bc2l6ZV0uY29kZSk7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dE1WKEludCBtdmludCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgc2lnbiA9IDA7CisgICAgSW50IGFic212OworICAgIEludCBsZW5ndGg7CisKKyAgICBpZiAobXZpbnQgPiAzMikKKyAgICB7CisgICAgICAgIGFic212ID0gLW12aW50ICsgNjU7CisgICAgICAgIHNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGFic212ID0gbXZpbnQ7CisKKyAgICBsZW5ndGggPSBtdnRhYlthYnNtdl0ubGVuOworICAgIGlmIChsZW5ndGgpCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIG12dGFiW2Fic212XS5jb2RlKTsKKworICAgIGlmIChtdmludCAhPSAwKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYml0c3RyZWFtLCBzaWduKTsKKyAgICAgICAgcmV0dXJuIChsZW5ndGggKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dE1DQlBDX0ludHJhKEludCBjYnAsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBpbmQ7CisgICAgSW50IGxlbmd0aDsKKworICAgIGluZCA9ICgobW9kZV9NQnR5cGVbbW9kZV0gPj4gMSkgJiAzKSB8ICgoY2JwICYgMykgPDwgMik7CisKKyAgICBsZW5ndGggPSBtY2JwY19pbnRyYV90YWJbaW5kXS5sZW47CisgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgbWNicGNfaW50cmFfdGFiW2luZF0uY29kZSk7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dE1DQlBDX0ludGVyKEludCBjYnAsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBpbmQ7CisgICAgSW50IGxlbmd0aDsKKworICAgIGluZCA9IChtb2RlX01CdHlwZVttb2RlXSAmIDcpIHwgKChjYnAgJiAzKSA8PCAzKTsKKworICAgIGxlbmd0aCA9IG1jYnBjX2ludGVyX3RhYltpbmRdLmxlbjsKKyAgICBpZiAobGVuZ3RoKQorICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCBtY2JwY19pbnRlcl90YWJbaW5kXS5jb2RlKTsKKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludAorUHV0Q0JQWShJbnQgY2JweSwgQ2hhciBpbnRyYSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgaW5kOworICAgIEludCBsZW5ndGg7CisKKyAgICBpZiAoKGludHJhID09IDApKQorICAgICAgICBjYnB5ID0gMTUgLSBjYnB5OworCisgICAgaW5kID0gY2JweTsKKworICAgIGxlbmd0aCA9IGNicHlfdGFiW2luZF0ubGVuOworICAgIGlmIChsZW5ndGgpCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNicHlfdGFiW2luZF0uY29kZSk7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKiA1LzE2LzAxLCBicmVhayB1cCBmdW5jdGlvbiBmb3IgbGFzdCBhbmQgbm90LWxhc3QgY29lZmZpY2llbnQgKi8KKy8qIE5vdGU6Ojo6IEkgY2hlY2tlZCB0aGUgQVJNIGFzc2VtYmx5IGZvciBpZiggcnVuID4geCAmJiBydW4gPCB5KSB0eXBlCisgICAgb2YgY29kZSwgdGhleSBkbyBhIHJlYWxseSBnb29kIGpvYiBjb21waWxpbmcgaXQgdG8gaWYoIChVSW50KShydW4teCkgPCB5LXgpLgorICAgIE5vIG5lZWQgdG8gaGFuZC1jb2RlIGl0ISEhISEsIDYvMS8yMDAxICovCisKK0ludCBQdXRDb2VmZl9JbnRlcihJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuIDwgMiAmJiBsZXZlbCA8IDEzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMFtydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjBbcnVuXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCAyNyAmJiBsZXZlbCA8IDUpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIxW3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIxW3J1bi0yXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0Q29lZmZfSW50ZXJfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuIDwgMiAmJiBsZXZlbCA8IDQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIyW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDQyICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIzW3J1bi0yXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIzW3J1bi0yXS5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKiA1LzE2LzAxLCBicmVhayB1cCBmdW5jdGlvbiBmb3IgbGFzdCBhbmQgbm90LWxhc3QgY29lZmZpY2llbnQgKi8KKworSW50IFB1dENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDI4KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI0W2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMSAmJiBsZXZlbCA8IDExKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI1W2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDEwICYmIGxldmVsIDwgNikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA5ICYmIHJ1biA8IDE1ICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI3W3J1bi0xMF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiN1tydW4tMTBdLmNvZGUpOworICAgIH0KKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRDb2VmZl9JbnRyYV9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDkpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI4W2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjhbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDAgJiYgcnVuIDwgNyAmJiBsZXZlbCA8IDQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI5W3J1bi0xXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI5W3J1bi0xXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gNiAmJiBydW4gPCAyMSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMTBbcnVuLTddLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjEwW3J1bi03XS5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKiA1LzE2LzAxLCBicmVhayB1cCBmdW5jdGlvbiBmb3IgbGFzdCBhbmQgbm90LWxhc3QgY29lZmZpY2llbnQgKi8KKyNpZm5kZWYgTk9fUlZMQworSW50IFB1dENvZWZmX0ludGVyX1JWTEMoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA9PSAwICYmIGxldmVsIDwgMjApCisgICAgeworICAgICAgICBsZW5ndGggPSAgY29lZmZfUlZMQ3RhYjE0W2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIxNFtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDEgJiYgbGV2ZWwgPCAxMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxNVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTVbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEgJiYgcnVuIDwgNCAmJiBsZXZlbCA8IDgpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMTZbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIxNltydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSA0ICYmIGxldmVsIDwgNikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxN1tsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTdbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDQgJiYgcnVuIDwgOCAmJiBsZXZlbCA8IDUpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMThbcnVuLTVdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIxOFtydW4tNV1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDcgJiYgcnVuIDwgMTAgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjE5W3J1bi04XVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTlbcnVuLThdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA5ICYmIHJ1biA8IDE4ICYmIGxldmVsIDwgMykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIyMFtydW4tMTBdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIyMFtydW4tMTBdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxNyAmJiBydW4gPCAzOSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjIxW3J1bi0xOF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjIxW3J1bi0xOF0uY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50IFB1dENvZWZmX0ludGVyX1JWTENfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID49IDAgJiYgcnVuIDwgMiAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMjJbcnVuXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMjJbcnVuXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDIgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjIzW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIyM1tsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMiAmJiBydW4gPCAxNCAmJiBsZXZlbCA8IDMpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMjRbcnVuLTNdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIyNFtydW4tM11bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEzICYmIHJ1biA8IDQ1ICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMjVbcnVuLTE0XS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMjVbcnVuLTE0XS5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKiA1LzE2LzAxLCBicmVhayB1cCBmdW5jdGlvbiBmb3IgbGFzdCBhbmQgbm90LWxhc3QgY29lZmZpY2llbnQgKi8KKworSW50IFB1dENvZWZmX0ludHJhX1JWTEMoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA9PSAwICYmIGxldmVsIDwgMjgpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDEgJiYgbGV2ZWwgPCAxNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIyW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIyW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMiAmJiBsZXZlbCA8IDEyKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjNbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjNbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSAzICYmIGxldmVsIDwgMTApCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiNFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiNFtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMyAmJiBydW4gPCA2ICYmIGxldmVsIDwgNykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWI1W3J1bi00XVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiNVtydW4tNF1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDUgJiYgcnVuIDwgOCAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiNltydW4tNl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjZbcnVuLTZdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA3ICYmIHJ1biA8IDEwICYmIGxldmVsIDwgNSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWI3W3J1bi04XVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiN1tydW4tOF1bbGV2ZWwtMV0uY29kZSk7CisKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gOSAmJiBydW4gPCAxMyAmJiBsZXZlbCA8IDMpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiOFtydW4tMTBdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWI4W3J1bi0xMF1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEyICYmIHJ1biA8IDIwICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiOVtydW4tMTNdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWI5W3J1bi0xM10uY29kZSk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRDb2VmZl9JbnRyYV9SVkxDX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA+PSAwICYmIHJ1biA8IDIgJiYgbGV2ZWwgPCA2KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjEwW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjEwW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSAyICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxMVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTFbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDIgJiYgcnVuIDwgMTQgJiYgbGV2ZWwgPCAzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjEyW3J1bi0zXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTJbcnVuLTNdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxMyAmJiBydW4gPCA0NSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjEzW3J1bi0xNF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjEzW3J1bi0xNF0uY29kZSk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgMy1tb2RlIFZMQyAqLworCitJbnQKK1B1dFJ1bkNvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPCAyICYmIGxldmVsIDwgMTMpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIwW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIwW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDI3ICYmIGxldmVsIDwgNSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjFbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMVtydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0UnVuQ29lZmZfSW50ZXJfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuIDwgMiAmJiBsZXZlbCA8IDQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIyW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIyW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDQyICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIzW3J1bi0yXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjNbcnVuLTJdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50IFB1dFJ1bkNvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDI4KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjRbbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMSAmJiBsZXZlbCA8IDExKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjVbbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDEwICYmIGxldmVsIDwgNikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiNltydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA5ICYmIHJ1biA8IDE1ICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI3W3J1bi0xMF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI3W3J1bi0xMF0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorSW50IFB1dFJ1bkNvZWZmX0ludHJhX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA9PSAwICYmIGxldmVsIDwgOSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjhbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI4W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMCAmJiBydW4gPCA3ICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjlbcnVuLTFdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiOVtydW4tMV1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA2ICYmIHJ1biA8IDIxICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIxMFtydW4tN10ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIxMFtydW4tN10uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gOTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dExldmVsQ29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA8IDIgJiYgbGV2ZWwgPCAxMykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjBbcnVuXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjBbcnVuXVtsZXZlbC0xXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEgJiYgcnVuIDwgMjcgJiYgbGV2ZWwgPCA1KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMVtydW4tMl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIxW3J1bi0yXVtsZXZlbC0xXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRMZXZlbENvZWZmX0ludGVyX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA8IDIgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCA0MiAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiM1tydW4tMl0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIzW3J1bi0yXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRMZXZlbENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDI4KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjRbbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMSAmJiBsZXZlbCA8IDExKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiNVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjVbbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDEwICYmIGxldmVsIDwgNikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiNltydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA5ICYmIHJ1biA8IDE1ICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI3W3J1bi0xMF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI3W3J1bi0xMF0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorSW50IFB1dExldmVsQ29lZmZfSW50cmFfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCA5KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiOFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjhbbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAwICYmIHJ1biA8IDcgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiOVtydW4tMV1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI5W3J1bi0xXVtsZXZlbC0xXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDYgJiYgcnVuIDwgMjEgJiYgbGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjEwW3J1bi03XS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjEwW3J1bi03XS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IE1CVmxjRW5jb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvMTAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgR09WIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiA1LzIxLzAxLCBicmVhayB1cCBpbnRvIHNtYWxsZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBIMjYzX09OTFkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERhdGEgUGFydGl0aW9uaW5nIEktVk9QIEVuY29kaW5nICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNQlZsY0VuY29kZURhdGFQYXJfSV9WT1AoCisgICAgVmlkZW9FbmNEYXRhICp2aWRlbywKKyAgICBJbnQgbmNvZWZibGNrW10sCisgICAgdm9pZCAqYmxrQ29kZVB0cikKK3sKKworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMyID0gdmlkZW8tPmJpdHN0cmVhbTI7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMyA9IHZpZGVvLT5iaXRzdHJlYW0zOworICAgIGludCBpOworICAgIFVDaGFyIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW3ZpZGVvLT5tYm51bV07CisgICAgVUNoYXIgQ0JQOworLy8gIE1hY3JvQmxvY2sgKk1CPXZpZGVvLT5vdXRwdXRNQjsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgSW50IGludHJhRENfZGVjaXNpb24sIERDOworLy8gIGludCB0ZW1wOworICAgIEludCBkcXVhbnQ7IC8qIDMvMTUvMDEgKi8KKyAgICBSdW5MZXZlbEJsb2NrICpSTEIgPSB2aWRlby0+UkxCOworICAgIEJsb2NrQ29kZUNvZWZmUHRyIEJsb2NrQ29kZUNvZWZmID0gKEJsb2NrQ29kZUNvZWZmUHRyKSBibGtDb2RlUHRyOworCisgICAgLyogREMgYW5kIEFDIFByZWRpY3Rpb24sIDUvMjgvMDEsIGNvbXB1dGUgQ0JQLCBpbnRyYURDX2RlY2lzaW9uKi8KKyAgICBEQ0FDUHJlZCh2aWRlbywgTW9kZSwgJmludHJhRENfZGVjaXNpb24sIHZpZGVvLT5RUF9wcmV2KTsKKworICAgIC8qIENCUCwgUnVuLCBMZXZlbCwgYW5kIFNpZ24gKi8KKyAgICBSdW5MZXZlbCh2aWRlbywgMSwgaW50cmFEQ19kZWNpc2lvbiwgbmNvZWZibGNrKTsKKyAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworCisgICAgLyogQ29tcHV0ZSBEUXVhbnQgKi8KKyAgICBkcXVhbnQgPSB2aWRlby0+UVBNQlttYm51bV0gLSB2aWRlby0+UVBfcHJldjsgLyogMy8xNS8wMSwgUVBfcHJldiBtYXkgbm90IGVxdWFsIFFQTUJbbWJudW0tMV0gaWYgbWJudW0tMSBpcyBza2lwcGVkKi8KKworICAgIHZpZGVvLT5RUF9wcmV2ID0gdmlkZW8tPlFQTUJbbWJudW1dOworCisgICAgaWYgKGRxdWFudCAmJiBNb2RlID09IE1PREVfSU5UUkEpCisgICAgeworICAgICAgICBNb2RlID0gTU9ERV9JTlRSQV9ROworICAgIH0KKworICAgIGlmIChkcXVhbnQgPj0gMCkKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpICsgMSk7CisgICAgZWxzZQorICAgICAgICBkcXVhbnQgPSAoUFZfQUJTKGRxdWFudCkgLSAxKTsKKworICAgIC8qIEZJUlNUIFBBUlQ6IEFMTCBUTyBCUzEgKi8KKworICAgIFB1dE1DQlBDX0ludHJhKENCUCwgTW9kZSwgYnMxKTsgLyogTUNCUEMgKi8KKworICAgIGlmIChNb2RlID09IE1PREVfSU5UUkFfUSkKKyAgICAgICAgLyogIE1BWSBORUVEIFRPIENIQU5HRSBEUVVBTlQgSEVSRSAgKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiczEsIDIsIGRxdWFudCk7ICAvKiBkcXVhbnQqLworCisKKyAgICBpZiAoaW50cmFEQ19kZWNpc2lvbiA9PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgREMgPSB2aWRlby0+UkxCW2ldLmxldmVsWzBdOworICAgICAgICAgICAgaWYgKHZpZGVvLT5STEJbaV0uc1swXSkKKyAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKyAgICAgICAgICAgIGlmIChpIDwgNCkKKyAgICAgICAgICAgICAgICAvKnRlbXAgPSovIEludHJhRENfZHBjbShEQywgMSwgYnMxKTsgICAgICAgIC8qIGRjdF9kY19zaXplX2x1bWluYW5jZSwgKi8KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY3RfZGNfZGlmZmVyZW50aWFsLCBhbmQgKi8KKyAgICAgICAgICAgICAgICAvKnRlbXAgPSovIEludHJhRENfZHBjbShEQywgMCwgYnMxKTsgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNFQ09ORCBQQVJUOiBBTEwgVE8gQlMyKi8KKworICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMiwgdmlkZW8tPmFjUHJlZEZsYWdbdmlkZW8tPm1ibnVtXSk7ICAgIC8qIGFjX3ByZWRfZmxhZyAqLworCisgICAgLyp0ZW1wPSovCisgICAgUHV0Q0JQWShDQlAgPj4gMiwgKENoYXIpKDEpLCBiczIpOyAvKiBjYnB5ICovCisKKworICAgIC8qIFRISVJEIFBBUlQ6ICBBTEwgVE8gQlMzKi8KKyAgICAvKiBNQl9Db2RlQ29lZmYodmlkZW8sYnMzKTsgKi8gLyogNS8yMi8wMSwgcmVwbGFjZWQgd2l0aCBiZWxvdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczMsIDEgLSBpbnRyYURDX2RlY2lzaW9uLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIFBhcnRpdGlvbmluZyBQLVZPUCBFbmNvZGluZyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNQlZsY0VuY29kZURhdGFQYXJfUF9WT1AoCisgICAgVmlkZW9FbmNEYXRhICp2aWRlbywKKyAgICBJbnQgbmNvZWZibGNrW10sCisgICAgdm9pZCAqYmxrQ29kZVB0cikKK3sKKworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMyID0gdmlkZW8tPmJpdHN0cmVhbTI7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMyA9IHZpZGVvLT5iaXRzdHJlYW0zOworICAgIGludCBpOworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBVQ2hhciBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVttYm51bV07CisgICAgSW50IFFQX3RtcCA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICBVQ2hhciBDQlA7CisvLyAgTWFjcm9CbG9jayAqTUI9dmlkZW8tPm91dHB1dE1COworICAgIEludCBpbnRyYSwgaW50cmFEQ19kZWNpc2lvbiwgREM7CisgICAgSW50IHBtdngsIHBtdnk7CisvLyAgaW50IHRlbXA7CisgICAgSW50IGRxdWFudDsgLyogMy8xNS8wMSAqLworICAgIFJ1bkxldmVsQmxvY2sgKlJMQiA9IHZpZGVvLT5STEI7CisgICAgQmxvY2tDb2RlQ29lZmZQdHIgQmxvY2tDb2RlQ29lZmYgPSAoQmxvY2tDb2RlQ29lZmZQdHIpIGJsa0NvZGVQdHI7CisKKyAgICBpbnRyYSA9IChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpOworCisgICAgLyogREMgYW5kIEFDIFByZWRpY3Rpb24sIDUvMjgvMDEsIGNvbXB1dGUgQ0JQLCBpbnRyYURDX2RlY2lzaW9uKi8KKworICAgIGlmIChpbnRyYSkKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQorICAgICAgICB7CisgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsKKyAgICAgICAgfQorCisgICAgICAgIERDQUNQcmVkKHZpZGVvLCBNb2RlLCAmaW50cmFEQ19kZWNpc2lvbiwgUVBfdG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpbnRyYURDX2RlY2lzaW9uID0gMDsgLyogdXNlZCBpbiBSdW5MZXZlbCAqLworCisgICAgLyogQ0JQLCBSdW4sIExldmVsLCBhbmQgU2lnbiAqLworICAgIFJ1bkxldmVsKHZpZGVvLCBpbnRyYSwgaW50cmFEQ19kZWNpc2lvbiwgbmNvZWZibGNrKTsKKyAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworCisgICAgLyogQ29tcHV0ZSBEUXVhbnQgKi8KKyAgICBkcXVhbnQgPSB2aWRlby0+UVBNQlttYm51bV0gLSB2aWRlby0+UVBfcHJldjsgLyogMy8xNS8wMSwgUVBfcHJldiBtYXkgbm90IGVxdWFsIFFQTUJbbWJudW0tMV0gaWYgbWJudW0tMSBpcyBza2lwcGVkKi8KKworICAgIGlmIChkcXVhbnQgJiYgKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5URVIpKQorICAgIHsKKyAgICAgICAgTW9kZSArPSAyOyAgLyogbWFrZSBpdCBNT0RFX0lOVFJBX1EgYW5kIE1PREVfSU5URVJfUSAqLworICAgIH0KKworICAgIGlmIChkcXVhbnQgPj0gMCkKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpICsgMSk7CisgICAgZWxzZQorICAgICAgICBkcXVhbnQgPSAoUFZfQUJTKGRxdWFudCkgLSAxKTsKKworICAgIC8qIEZJUlNUIFBBUlQ6IEFMTCBUTyBCUzEgKi8KKworICAgIGlmIChDQlAgPT0gMCAmJiBpbnRyYSA9PSAwKSAgLyogRGV0ZXJtaW5lIGlmIFNraXBwZWQgTUIgKi8KKyAgICB7CisgICAgICAgIGlmICgoTW9kZSA9PSBNT0RFX0lOVEVSKSAmJiAodmlkZW8tPm1vdFttYm51bV1bMF0ueCA9PSAwKSAmJiAodmlkZW8tPm1vdFttYm51bV1bMF0ueSA9PSAwKSkKKyAgICAgICAgICAgIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW3ZpZGVvLT5tYm51bV0gPSBNT0RFX1NLSVBQRUQ7CisgICAgICAgIGVsc2UgaWYgKChNb2RlID09IE1PREVfSU5URVI0VikgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzFdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzFdLnkgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzJdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzJdLnkgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzNdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzNdLnkgPT0gMCkKKyAgICAgICAgICAgICAgICAgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzRdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzRdLnkgPT0gMCkpCisgICAgICAgICAgICBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVt2aWRlby0+bWJudW1dID0gTU9ERV9TS0lQUEVEOworICAgIH0KKworCisgICAgaWYgKE1vZGUgPT0gTU9ERV9TS0lQUEVEKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMxLCAxKTsgLyogbm90X2NvZGVkID0gMSAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMxLCAwKTsgLyogbm90X2NvZGVkID0wICovCisKKyAgICB2aWRlby0+UVBfcHJldiA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICB2aWRlby0+dXNlUHJldlFQID0gMTsKKworICAgIFB1dE1DQlBDX0ludGVyKENCUCwgTW9kZSwgYnMxKTsgLyogTUNCUEMgKi8KKworICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKworICAgIGlmIChNb2RlID09IE1PREVfSU5URVIgfHwgTW9kZSA9PSBNT0RFX0lOVEVSX1EpCisgICAgeworICAgICAgICBmaW5kX3BtdnModmlkZW8sIDAsICZwbXZ4LCAmcG12eSk7IC8qIEdldCBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVswXS54IC0gcG12eCwgYnMxKTsgLyogV3JpdGUgeCB0byBiaXRzdHJlYW0gKi8KKyAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVswXS55IC0gcG12eSwgYnMxKTsgICAgIC8qIFdyaXRlIHkgdG8gYml0c3RyZWFtICovCisgICAgfQorICAgIGVsc2UgaWYgKE1vZGUgPT0gTU9ERV9JTlRFUjRWKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmluZF9wbXZzKHZpZGVvLCBpLCAmcG12eCwgJnBtdnkpOworICAgICAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVtpXS54IC0gcG12eCwgYnMxKTsKKyAgICAgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1baV0ueSAtIHBtdnksIGJzMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworCisgICAgLyogU0VDT05EIFBBUlQ6IEFMTCBUTyBCUzIgKi8KKworCisgICAgaWYgKGludHJhKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMyLCB2aWRlby0+YWNQcmVkRmxhZ1t2aWRlby0+bWJudW1dKTsgICAgLyogYWNfcHJlZF9mbGFnICovCisgICAgICAgIC8qdGVtcD0qLworICAgICAgICBQdXRDQlBZKENCUCA+PiAyLCAoQ2hhcikoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKSwgYnMyKTsgLyogY2JweSAqLworCisgICAgICAgIGlmIChNb2RlID09IE1PREVfSU5UUkFfUSkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMyLCAyLCBkcXVhbnQpOyAgLyogZHF1YW50LCAzLzE1LzAxKi8KKworICAgICAgICBpZiAoaW50cmFEQ19kZWNpc2lvbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERDID0gdmlkZW8tPlJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPlJMQltpXS5zWzBdKQorICAgICAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDQpCisgICAgICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gSW50cmFEQ19kcGNtKERDLCAxLCBiczIpOyAgICAgICAgLyogZGN0X2RjX3NpemVfbHVtaW5hbmNlLCAqLworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkY3RfZGNfZGlmZmVyZW50aWFsLCBhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDAsIGJzMik7ICAgICAgICAvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIC8qIFRISVJEIFBBUlQ6IEFMTCBUTyBCUzMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENCUCYoMSA8PCAoNSAtIGkpKSkKKyAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMywgMSAtIGludHJhRENfZGVjaXNpb24sIG5jb2VmYmxja1tpXSwgTW9kZSk7LyogQ29kZSBJbnRyYSBBQyovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyp0ZW1wPSovCisgICAgICAgIFB1dENCUFkoQ0JQID4+IDIsIChDaGFyKShNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpLCBiczIpOyAvKiBjYnB5ICovCisgICAgICAgIGlmIChNb2RlID09IE1PREVfSU5URVJfUSkKKyAgICAgICAgICAgIC8qICBNQVkgTkVFRCBUTyBDSEFOR0UgRFFVQU5UIEhFUkUgICovCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMiwgMiwgZHF1YW50KTsgIC8qIGRxdWFudCwgMy8xNS8wMSovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAvKiBUSElSRCBQQVJUOiBBTEwgVE8gQlMzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczMsIDAsIG5jb2VmYmxja1tpXSwgTW9kZSk7LyogQ29kZSBJbnRyYSBBQyovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTaG9ydCBIZWFkZXIvQ29tYmluZWQgTW9kZSB3aXRoIG9yIHdpdGhvdXQgRXJyb3IgUmVzaWxpZW5jZSBJLVZPUCBhbmQgUC1WT1AgRW5jb2RpbmcgKi8KKy8qIDUvMjEvMDEsIEItVk9QIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQhISEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTUJWbGNFbmNvZGVDb21iaW5lZF9JX1ZPUCgKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvLAorICAgIEludCBuY29lZmJsY2tbXSwKKyAgICB2b2lkICpibGtDb2RlUHRyKQoreworCisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMSA9IHZpZGVvLT5iaXRzdHJlYW0xOworLy8gIEJpdHN0cmVhbUVuY1ZpZGVvICpiczIgPSB2aWRlby0+Yml0c3RyZWFtMjsKKy8vICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMzID0gdmlkZW8tPmJpdHN0cmVhbTM7CisgICAgaW50IGk7CisgICAgVUNoYXIgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbdmlkZW8tPm1ibnVtXTsKKyAgICBVQ2hhciBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbdmlkZW8tPm1ibnVtXTsKKy8vICBNYWNyb0Jsb2NrICpNQj12aWRlby0+b3V0cHV0TUI7CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIEludCBpbnRyYURDX2RlY2lzaW9uOworLy8gIGludCB0ZW1wOworICAgIEludCBkcXVhbnQ7IC8qIDMvMTUvMDEgKi8KKyAgICBSdW5MZXZlbEJsb2NrICpSTEIgPSB2aWRlby0+UkxCOworICAgIEludCBEQzsKKyAgICBJbnQgc2hvcnRWaWRlb0hlYWRlciA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNob3J0VmlkZW9IZWFkZXI7CisgICAgQmxvY2tDb2RlQ29lZmZQdHIgQmxvY2tDb2RlQ29lZmYgPSAoQmxvY2tDb2RlQ29lZmZQdHIpIGJsa0NvZGVQdHI7CisKKyAgICAvKiBEQyBhbmQgQUMgUHJlZGljdGlvbiwgNS8yOC8wMSwgY29tcHV0ZSBDQlAsIGludHJhRENfZGVjaXNpb24qLworCisjaWZuZGVmIEgyNjNfT05MWQorICAgIGlmICghc2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgRENBQ1ByZWQodmlkZW8sIE1vZGUsICZpbnRyYURDX2RlY2lzaW9uLCB2aWRlby0+UVBfcHJldik7CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBpbnRyYURDX2RlY2lzaW9uID0gMDsKKyAgICB9CisKKyAgICAvKiBDQlAsIFJ1biwgTGV2ZWwsIGFuZCBTaWduICovCisKKyAgICBSdW5MZXZlbCh2aWRlbywgMSwgaW50cmFEQ19kZWNpc2lvbiwgbmNvZWZibGNrKTsKKyAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworCisgICAgLyogQ29tcHV0ZSBEUXVhbnQgKi8KKyAgICBkcXVhbnQgPSB2aWRlby0+UVBNQlttYm51bV0gLSB2aWRlby0+UVBfcHJldjsgLyogMy8xNS8wMSwgUVBfcHJldiBtYXkgbm90IGVxdWFsIFFQTUJbbWJudW0tMV0gaWYgbWJudW0tMSBpcyBza2lwcGVkKi8KKworICAgIHZpZGVvLT5RUF9wcmV2ID0gdmlkZW8tPlFQTUJbbWJudW1dOworCisgICAgaWYgKGRxdWFudCAmJiBNb2RlID09IE1PREVfSU5UUkEpCisgICAgeworICAgICAgICBNb2RlID0gTU9ERV9JTlRSQV9ROworICAgIH0KKworICAgIGlmIChkcXVhbnQgPj0gMCkKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpICsgMSk7CisgICAgZWxzZQorICAgICAgICBkcXVhbnQgPSAoUFZfQUJTKGRxdWFudCkgLSAxKTsKKworICAgIFB1dE1DQlBDX0ludHJhKENCUCwgTW9kZSwgYnMxKTsgLyogbWNicGMgSV9WT1AgKi8KKworICAgIGlmICghdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXS0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMSwgdmlkZW8tPmFjUHJlZEZsYWdbdmlkZW8tPm1ibnVtXSk7ICAgIC8qIGFjX3ByZWRfZmxhZyAqLworICAgIH0KKworICAgIC8qdGVtcD0qLworICAgIFB1dENCUFkoQ0JQID4+IDIsIChDaGFyKSgxKSwgYnMxKTsgLyogY2JweSAqLworCisgICAgaWYgKE1vZGUgPT0gTU9ERV9JTlRSQV9RKQorICAgICAgICAvKiAgTUFZIE5FRUQgVE8gQ0hBTkdFIERRVUFOVCBIRVJFICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMxLCAyLCBkcXVhbnQpOyAgLyogZHF1YW50LCAzLzE1LzAxKi8KKworICAgIC8qTUJfQ29kZUNvZWZmKHZpZGVvLGJzMSk7IDUvMjEvMDEsIHJlcGxhY2VkIGJ5IGJlbG93ICovCisgICAgLyoqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEgyNjNfT05MWQorICAgIGlmIChzaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBIZWFkZXIgREMgY29lZmZpY2llbnRzICovCisgICAgeworI2VuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gUkxCW2ldLmxldmVsWzBdOworICAgICAgICAgICAgaWYgKFJMQltpXS5zWzBdKQorICAgICAgICAgICAgICAgIERDID0gLURDOworICAgICAgICAgICAgaWYgKERDICE9IDEyOCkKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMSwgOCwgREMpOyAgIC8qIGludHJhX2RjX3NpemVfbHVtaW5hbmNlICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiczEsIDgsIDI1NSk7ICAgICAgICAgIC8qIGludHJhX2RjX3NpemVfbHVtaW5hbmNlICovCisgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAxLCBuY29lZmJsY2tbaV0sIE1vZGUpOyAvKiBDb2RlIHNob3J0IGhlYWRlciBJbnRyYSBBQyovCisgICAgICAgIH0KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgfQorICAgIGVsc2UgaWYgKGludHJhRENfZGVjaXNpb24gPT0gMCkgICAvKiBDb21iaW5lZCBJbnRyYSBNb2RlIERDIGFuZCBBQyBjb2VmZmljaWVudHMgKi8KKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gUkxCW2ldLmxldmVsWzBdOworICAgICAgICAgICAgaWYgKFJMQltpXS5zWzBdKQorICAgICAgICAgICAgICAgIERDID0gLURDOworCisgICAgICAgICAgICBpZiAoaSA8IDQpCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDEsIGJzMSk7ICAgICAgICAvKiBkY3RfZGNfc2l6ZV9sdW1pbmFuY2UsICovCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGN0X2RjX2RpZmZlcmVudGlhbCwgYW5kICovCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDAsIGJzMSk7ICAgICAgICAvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAxLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgLyogQ29tYmluZWQgTW9kZSBJbnRyYSBEQy9BQyBjb2VmZmljaWVudHMgKi8KKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczEsIDAsIG5jb2VmYmxja1tpXSwgTW9kZSk7LyogQ29kZSBJbnRyYSBBQyAqLworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyoqKioqKioqKioqKioqKioqKiovCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBNQlZsY0VuY29kZUNvbWJpbmVkX1BfVk9QKAorICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8sCisgICAgSW50IG5jb2VmYmxja1tdLAorICAgIHZvaWQgKmJsa0NvZGVQdHIpCit7CisKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisvLyAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMiA9IHZpZGVvLT5iaXRzdHJlYW0yOworLy8gIEJpdHN0cmVhbUVuY1ZpZGVvICpiczMgPSB2aWRlby0+Yml0c3RyZWFtMzsKKyAgICBpbnQgaTsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgVUNoYXIgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIEludCBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bV07CisgICAgVUNoYXIgQ0JQIDsKKy8vICBNYWNyb0Jsb2NrICpNQj12aWRlby0+b3V0cHV0TUI7CisgICAgSW50IGludHJhLCBpbnRyYURDX2RlY2lzaW9uOworICAgIEludCBwbXZ4LCBwbXZ5OworLy8gIGludCB0ZW1wOworICAgIEludCBkcXVhbnQ7IC8qIDMvMTUvMDEgKi8KKyAgICBSdW5MZXZlbEJsb2NrICpSTEIgPSB2aWRlby0+UkxCOworICAgIEludCBEQzsKKyAgICBJbnQgc2hvcnRWaWRlb0hlYWRlciA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNob3J0VmlkZW9IZWFkZXI7CisgICAgQmxvY2tDb2RlQ29lZmZQdHIgQmxvY2tDb2RlQ29lZmYgPSAoQmxvY2tDb2RlQ29lZmZQdHIpIGJsa0NvZGVQdHI7CisKKyAgICBpbnRyYSA9IChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpOworCisgICAgLyogREMgYW5kIEFDIFByZWRpY3Rpb24sIDUvMjgvMDEsIGNvbXB1dGUgaW50cmFEQ19kZWNpc2lvbiovCisjaWZuZGVmIEgyNjNfT05MWQorICAgIGlmICghc2hvcnRWaWRlb0hlYWRlciAmJiBpbnRyYSkKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQorICAgICAgICB7CisgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsKKyAgICAgICAgfQorICAgICAgICBEQ0FDUHJlZCh2aWRlbywgTW9kZSwgJmludHJhRENfZGVjaXNpb24sIFFQX3RtcCk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBpbnRyYURDX2RlY2lzaW9uID0gMDsKKworICAgIC8qIENCUCwgUnVuLCBMZXZlbCwgYW5kIFNpZ24gKi8KKworICAgIFJ1bkxldmVsKHZpZGVvLCBpbnRyYSwgaW50cmFEQ19kZWNpc2lvbiwgbmNvZWZibGNrKTsKKyAgICBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOworCisgICAgLyogQ29tcHV0ZSBEUXVhbnQgKi8KKyAgICBkcXVhbnQgPSB2aWRlby0+UVBNQlttYm51bV0gLSB2aWRlby0+UVBfcHJldjsgLyogMy8xNS8wMSwgUVBfcHJldiBtYXkgbm90IGVxdWFsIFFQTUJbbWJudW0tMV0gaWYgbWJudW0tMSBpcyBza2lwcGVkKi8KKyAgICBpZiAoZHF1YW50ICYmIChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVEVSKSkKKyAgICB7CisgICAgICAgIE1vZGUgKz0gMjsgIC8qIG1ha2UgaXQgTU9ERV9JTlRSQV9RIGFuZCBNT0RFX0lOVEVSX1EgKi8KKyAgICB9CisKKyAgICBpZiAoZHF1YW50ID49IDApCisgICAgICAgIGRxdWFudCA9IChQVl9BQlMoZHF1YW50KSArIDEpOworICAgIGVsc2UKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpIC0gMSk7CisKKyAgICBpZiAoQ0JQID09IDAgJiYgaW50cmEgPT0gMCkgIC8qIERldGVybWluZSBpZiBTa2lwcGVkIE1CICovCisgICAgeworICAgICAgICBpZiAoKE1vZGUgPT0gTU9ERV9JTlRFUikgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzBdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzBdLnkgPT0gMCkpCisgICAgICAgICAgICBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVt2aWRlby0+bWJudW1dID0gTU9ERV9TS0lQUEVEOworICAgICAgICBlbHNlIGlmICgoTW9kZSA9PSBNT0RFX0lOVEVSNFYpICYmICh2aWRlby0+bW90W21ibnVtXVsxXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVsxXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVsyXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVsyXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVszXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVszXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVs0XS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVs0XS55ID09IDApKQorICAgICAgICAgICAgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbdmlkZW8tPm1ibnVtXSA9IE1PREVfU0tJUFBFRDsKKyAgICB9CisKKyAgICBpZiAoTW9kZSA9PSBNT0RFX1NLSVBQRUQpCisgICAgeworICAgICAgICBCaXRzdHJlYW1QdXQxQml0cyhiczEsIDEpOyAvKiBub3RfY29kZWQgPSAxICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBCaXRzdHJlYW1QdXQxQml0cyhiczEsIDApOyAvKiBub3RfY29kZWQgPTAgKi8KKworICAgIHZpZGVvLT5RUF9wcmV2ID0gdmlkZW8tPlFQTUJbbWJudW1dOworICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOworCisgICAgUHV0TUNCUENfSW50ZXIoQ0JQLCBNb2RlLCBiczEpOyAvKiBtY2JwYyBQX1ZPUCAqLworCisgICAgaWYgKCF2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zaG9ydFZpZGVvSGVhZGVyICYmIGludHJhKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMxLCB2aWRlby0+YWNQcmVkRmxhZ1t2aWRlby0+bWJudW1dKTsgICAgLyogYWNfcHJlZF9mbGFnICovCisgICAgfQorCisgICAgLyp0ZW1wPSovCisgICAgUHV0Q0JQWShDQlAgPj4gMiwgKENoYXIpKGludHJhKSwgYnMxKTsgLyogY2JweSAqLworCisgICAgaWYgKE1vZGUgPT0gTU9ERV9JTlRSQV9RIHx8IE1vZGUgPT0gTU9ERV9JTlRFUl9RKQorICAgICAgICAvKiAgTUFZIE5FRUQgVE8gQ0hBTkdFIERRVUFOVCBIRVJFICAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMSwgMiwgZHF1YW50KTsgIC8qIGRxdWFudCwgMy8xNS8wMSovCisKKyAgICB2aWRlby0+aGVhZGVyX2JpdHMgLT0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisKKyAgICBpZiAoISgodmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXS0+c2NhbGFiaWxpdHkpICYmICh2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZSA9PSAzKSkpCisgICAgeworICAgICAgICBpZiAoTW9kZSA9PSBNT0RFX0lOVEVSIHx8IE1vZGUgPT0gTU9ERV9JTlRFUl9RKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5kX3BtdnModmlkZW8sIDAsICZwbXZ4LCAmcG12eSk7IC8qIEdldCBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1bMF0ueCAtIHBtdngsIGJzMSk7IC8qIFdyaXRlIHggdG8gYml0c3RyZWFtICovCisgICAgICAgICAgICBXcml0ZU1WY29tcG9uZW50KHZpZGVvLT5jdXJyVm9wLT5mY29kZUZvcndhcmQsIHZpZGVvLT5tb3RbbWJudW1dWzBdLnkgLSBwbXZ5LCBiczEpOyAgICAgLyogV3JpdGUgeSB0byBiaXRzdHJlYW0gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChNb2RlID09IE1PREVfSU5URVI0VikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5kX3BtdnModmlkZW8sIGksICZwbXZ4LCAmcG12eSk7CisgICAgICAgICAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVtpXS54IC0gcG12eCwgYnMxKTsKKyAgICAgICAgICAgICAgICBXcml0ZU1WY29tcG9uZW50KHZpZGVvLT5jdXJyVm9wLT5mY29kZUZvcndhcmQsIHZpZGVvLT5tb3RbbWJudW1dW2ldLnkgLSBwbXZ5LCBiczEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKworICAgIC8qIE1CX0NvZGVDb2VmZih2aWRlbyxiczEpOyAqLyAvKiA1LzIyLzAxLCByZXBsYWNlZCB3aXRoIGJlbG93ICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGludHJhKQorICAgIHsKKyNpZm5kZWYgSDI2M19PTkxZCisgICAgICAgIGlmIChzaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBIZWFkZXIgREMgY29lZmZpY2llbnRzICovCisgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQyA9IFJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgICAgICBpZiAoUkxCW2ldLnNbMF0pCisgICAgICAgICAgICAgICAgICAgIERDID0gLURDOworICAgICAgICAgICAgICAgIGlmIChEQyAhPSAxMjgpCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMxLCA4LCBEQyk7ICAgLyogaW50cmFfZGNfc2l6ZV9sdW1pbmFuY2UgKi8KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMxLCA4LCAyNTUpOyAgICAgICAgICAvKiBpbnRyYV9kY19zaXplX2x1bWluYW5jZSAqLworICAgICAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAxLCBuY29lZmJsY2tbaV0sIE1vZGUpOyAvKiBDb2RlIHNob3J0IGhlYWRlciBJbnRyYSBBQyovCisgICAgICAgICAgICB9CisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGludHJhRENfZGVjaXNpb24gPT0gMCkgICAvKiBDb21iaW5lZCBJbnRyYSBNb2RlIERDIGFuZCBBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQyA9IFJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgICAgICBpZiAoUkxCW2ldLnNbMF0pCisgICAgICAgICAgICAgICAgICAgIERDID0gLURDOworCisgICAgICAgICAgICAgICAgaWYgKGkgPCA0KQorICAgICAgICAgICAgICAgICAgICAvKnRlbXAgPSovIEludHJhRENfZHBjbShEQywgMSwgYnMxKTsgICAgICAgIC8qIGRjdF9kY19zaXplX2x1bWluYW5jZSwgKi8KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGN0X2RjX2RpZmZlcmVudGlhbCwgYW5kICovCisgICAgICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gSW50cmFEQ19kcGNtKERDLCAwLCBiczEpOyAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAxLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLyogQ29tYmluZWQgTW9kZSBJbnRyYSBEQy9BQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMSwgMCwgbmNvZWZibGNrW2ldLCBNb2RlKTsvKiBDb2RlIEludHJhIEFDICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICAgLyogU2hvcnRoZWFkZXIgb3IgQ29tYmluZWQgSU5URVIgTW9kZSBBQyBjb2VmZmljaWVudHMgKi8KKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczEsIDAsIG5jb2VmYmxja1tpXSwgTW9kZSk7LyogQ29kZSBJbnRlciBBQyovCisgICAgICAgIH0KKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICByZXR1cm4gOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJsb2NrQ29kZUNvZWZmKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8xOC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFZMQyBFbmNvZGUgIEFDL0RDIGNvZWZmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICA1LzE2LzAxICBncm91cGluZyBCaXRzdHJlYW1QdXRCaXRzIGNhbGxzICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIDUvMjIvMDEgIGJyZWFrIHVwIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBOT19SVkxDCisvKioqKioqKioqKioqKioqKiovCisvKiBSVkxDIEVOQ09ESU5HICovCisvKioqKioqKioqKioqKioqKiovCitWb2lkIEJsb2NrQ29kZUNvZWZmX1JWTEMoUnVuTGV2ZWxCbG9jayAqUkxCLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIEludCBqX3N0YXJ0LCBJbnQgal9zdG9wLCBVQ2hhciBNb2RlKQoreworICAgIGludCBsZW5ndGggPSAwOworICAgIGludCBpOworICAgIEludCBsZXZlbDsKKyAgICBJbnQgcnVuOworICAgIEludCBpbnRyYSA9IChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpOworCisgICAgLyogTm90IExhc3QgQ29lZmZpY2llbnQgKi8KKyAgICBmb3IgKGkgPSBqX3N0YXJ0OyBpIDwgal9zdG9wIC0gMTsgaSsrKQorICAgIHsKKyAgICAgICAgcnVuID0gUkxCLT5ydW5baV07CisgICAgICAgIGxldmVsID0gUkxCLT5sZXZlbFtpXTsKKyAgICAgICAgLy9pZihpPT02M3x8UkxCLT5ydW5baSsxXSA9PSAtMSkgICAgLyogRG9uJ3QgQ29kZSBMYXN0IENvZWZmaWNpZW50IEhlcmUgKi8KKyAgICAgICAgLy8gIGJyZWFrOworICAgICAgICAvKkVOQ09ERSBSVU4gTEVOR1RIICovCisgICAgICAgIGlmIChsZXZlbCA8IDI4ICYmIHJ1biA8IDM5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50cmFfUlZMQyhydW4sIGxldmVsLCBicyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50ZXJfUlZMQyhydW4sIGxldmVsLCBicyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgLyogRVNDQVBFIENPRElORyAqLworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDUgKyAxLCAyKTsgLyogRVNDQVBFICsgTm90IExhc3QgQ29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhicywxLDApOyAvKiBOb3QgTGFzdCBDb2VmZmljaWVudCAqLworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNiArIDEsIChydW4gPDwgMSkgfCAxKTsgLyogUlVOICsgTUFSS0VSIEJJVCovCisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsMSwxKTsgIC8qIE1BUktFUiBCSVQgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYnMsIDExLCBsZXZlbCk7IC8qIExFVkVMICovCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCAxICsgNCwgMTYpOyAvKiBNQVJLRVIgQklUICovCisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsNCwwKTsgIC8qIFJWTEMgVFJBSUxJTkcgRVNDQVBFICovCisgICAgICAgIH0KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgMSwgUkxCLT5zW2ldKTsgLyogU0lHTiBCSVQgKi8KKyAgICB9CisgICAgLyogTGFzdCBDb2VmZmljaWVudCEhISAqLworICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgIGxldmVsID0gUkxCLT5sZXZlbFtpXTsKKworICAgIC8qRU5DT0RFIFJVTiBMRU5HVEggKi8KKyAgICBpZiAobGV2ZWwgPCA2ICYmIHJ1biA8IDQ1KQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50cmFfUlZMQ19MYXN0KHJ1biwgbGV2ZWwsIGJzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50ZXJfUlZMQ19MYXN0KHJ1biwgbGV2ZWwsIGJzKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsZW5ndGggPSAwOworICAgIC8qIEVTQ0FQRSBDT0RJTkcgKi8KKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA1ICsgMSwgMyk7IC8qIEVTQ0FQRSBDT0RFICsgTGFzdCBDb2VmZmljaWVudCovCisgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhicywxLDEpOyAvKiBMYXN0IENvZWZmaWNpZW50ICEqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA2ICsgMSwgKHJ1biA8PCAxKSB8IDEpOyAvKiBSVU4gKyBNQVJLRVIgQklUKi8KKyAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7ICAvKiBNQVJLRVIgQklUICovCisgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYnMsIDExLCBsZXZlbCk7IC8qIExFVkVMICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDEgKyA0LCAxNik7IC8qIE1BUktFUiBCSVQgKyBSVkxDIFRSQUlMSU5HIEVTQ0FQRSAqLworICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsNCwwKTsgIC8qICovCisgICAgfQorICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCBSTEItPnNbaV0pOyAvKiBTSUdOIEJJVCAqLworCisgICAgcmV0dXJuIDsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTSE9SVCBWSURFTyBIRUFERVIgRU5DT0RJTkcgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWb2lkIEJsb2NrQ29kZUNvZWZmX1Nob3J0SGVhZGVyKFJ1bkxldmVsQmxvY2sgKlJMQiwgQml0c3RyZWFtRW5jVmlkZW8gKmJzLCBJbnQgal9zdGFydCwgSW50IGpfc3RvcCwgVUNoYXIgTW9kZSkKK3sKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpbnQgaTsKKy8vICBpbnQgdGVtcDsKKyAgICBJbnQgbGV2ZWw7CisgICAgSW50IHJ1bjsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhNb2RlKTsKKworICAgIC8qIE5vdCBMYXN0IENvZWZmaWNpZW50ICovCisgICAgZm9yIChpID0gal9zdGFydDsgaSA8IGpfc3RvcCAtIDE7IGkrKykKKyAgICB7CisgICAgICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgICAgICBsZXZlbCA9IFJMQi0+bGV2ZWxbaV07CisvLyAgICAgIGlmKGk9PTYzIHx8UkxCLT5ydW5baSsxXSA9PSAtMSkgLyogRG9uJ3QgQ29kZSBMYXN0IENvZWZmaWNpZW50IEhlcmUgKi8KKy8vICAgICAgICAgIGJyZWFrOworICAgICAgICAvKkVOQ09ERSBSVU4gTEVOR1RIICovCisgICAgICAgIGlmIChsZXZlbCA8IDEzKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBQdXRDb2VmZl9JbnRlcihydW4sIGxldmVsLCBicyk7CisgICAgICAgICAgICBpZiAobGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBCaXRzdHJlYW1QdXQxQml0cyhicywgUkxCLT5zW2ldKTsgLyogU2lnbiBCaXQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAvKiBFU0NBUEUgQ09ESU5HICovCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJMQi0+c1tpXSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDcgKyAxLCA2KTsgLyogRVNDQVBFIENPREUgKyBOb3QgTGFzdCBDb2VmZmljaWVudCAqLworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDEsMCk7IC8qIE5vdCBMYXN0IENvZWZmaWNpZW50ICovCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA2LCBydW4pOyAvKiBSVU4gKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDgsIGxldmVsJjB4RkYpOyAvKiBMRVZFTCwgbWFzayB0byBtYWtlIHN1cmUgbGVuZ3RoIDggKi8KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBMYXN0IENvZWZmaWNpZW50ISEhICovCisgICAgcnVuID0gUkxCLT5ydW5baV07CisgICAgbGV2ZWwgPSBSTEItPmxldmVsW2ldOworCisgICAgLypFTkNPREUgUlVOIExFTkdUSCAqLworICAgIGlmIChsZXZlbCA8IDEzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50ZXJfTGFzdChydW4sIGxldmVsLCBicyk7CisgICAgICAgIGlmIChsZW5ndGggIT0gMCkKKyAgICAgICAgICAgIC8qdGVtcCA9Ki8gQml0c3RyZWFtUHV0MUJpdHMoYnMsIFJMQi0+c1tpXSk7IC8qIFNpZ24gQml0ICovCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAvKiBFU0NBUEUgQ09ESU5HICovCisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKFJMQi0+c1tpXSkKKyAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA3ICsgMSwgNyk7IC8qIEVTQ0FQRSBDT0RFICsgTGFzdCBDb2VmZmljaWVudCAqLworICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsMSwxKTsgLyogTGFzdCBDb2VmZmljaWVudCAhISEqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA2LCBydW4pOyAvKiBSVU4gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgOCwgbGV2ZWwmMHhGRik7IC8qIExFVkVMLCBtYXNrIHRvIG1ha2Ugc3VyZSBsZW5ndGggOCAgKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworCit9CisKKyNpZm5kZWYgSDI2M19PTkxZCisvKioqKioqKioqKioqKioqKi8KKy8qIFZMQyBFTkNPRElORyAqLworLyoqKioqKioqKioqKioqKiovCitWb2lkIEJsb2NrQ29kZUNvZWZmX05vcm1hbChSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIEludCBqX3N0b3AsIFVDaGFyIE1vZGUpCit7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgaW50IGk7CisgICAgLy9pbnQgdGVtcDsKKyAgICBJbnQgbGV2ZWw7CisgICAgSW50IHJ1bjsKKyAgICBJbnQgaW50cmEgPSAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKTsKKyAgICBJbnQgbGV2ZWxfbWludXNfbWF4OworICAgIEludCBydW5fbWludXNfbWF4OworICAgIEludCgqUHV0Q29lZmYpKEludCwgSW50LCBCaXRzdHJlYW1FbmNWaWRlbyAqKTsgLyogcG9pbnRlciB0byBmdW5jdGlvbnMsIDUvMjgvMDEgKi8KKworICAgIC8qIE5vdCBMYXN0IENvZWZmaWNpZW50ISEhICovCisKKyAgICBpZiAoaW50cmEpCisgICAgICAgIFB1dENvZWZmID0gJlB1dENvZWZmX0ludHJhOworICAgIGVsc2UKKyAgICAgICAgUHV0Q29lZmYgPSAmUHV0Q29lZmZfSW50ZXI7CisKKyAgICBmb3IgKGkgPSBqX3N0YXJ0OyBpIDwgal9zdG9wIC0gMTsgaSsrKQorICAgIHsKKyAgICAgICAgcnVuID0gUkxCLT5ydW5baV07CisgICAgICAgIGxldmVsID0gUkxCLT5sZXZlbFtpXTsKKworICAgICAgICAvKiBFbmNvZGUgUnVuIExlbmd0aCAqLworICAgICAgICBpZiAobGV2ZWwgPCAyOCkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gKCpQdXRDb2VmZikocnVuLCBsZXZlbCwgYnMpOyAvKiA1LzI4LzAxIHJlcGxhY2VzIGFib3ZlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlyc3QgZXNjYXBlIG1vZGU6IExFVkVMIE9GRlNFVCAqLworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbF9taW51c19tYXggPSBsZXZlbCAtIGludHJhX21heF9sZXZlbFswXVtydW5dOworICAgICAgICAgICAgICAgIGlmIChsZXZlbF9taW51c19tYXggPCAyOCkKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0TGV2ZWxDb2VmZl9JbnRyYShydW4sIGxldmVsX21pbnVzX21heCwgYnMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbF9taW51c19tYXggPSBsZXZlbCAtIGludGVyX21heF9sZXZlbFswXVtydW5dOworICAgICAgICAgICAgICAgIGlmIChsZXZlbF9taW51c19tYXggPCAxMykKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0TGV2ZWxDb2VmZl9JbnRlcihydW4sIGxldmVsX21pbnVzX21heCwgYnMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2Vjb25kIGVzY2FwZSBtb2RlOiBSVU4gT0ZGU0VUICovCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9taW51c19tYXggPSBydW4gLSAoaW50cmFfbWF4X3J1bjBbbGV2ZWxdICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRSdW5Db2VmZl9JbnRyYShydW5fbWludXNfbWF4LCBsZXZlbCwgYnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgMTMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9taW51c19tYXggPSBydW4gLSAoaW50ZXJfbWF4X3J1bjBbbGV2ZWxdICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRSdW5Db2VmZl9JbnRlcihydW5fbWludXNfbWF4LCBsZXZlbCwgYnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFRoaXJkIGVzY2FwZSBtb2RlOiBGSVhFRCBMRU5HVEggQ09ERSAqLworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChSTEItPnNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgLyp0ZW1wID0qLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA3ICsgMiArIDEsIDMwKTsgLyogRVNDQVBFIENPREUgKyBGb2xsb3dlZCBieSAxMSArIE5vdCBMYXN0IENvZWZmaWNpZW50Ki8KKyAgICAgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywyLDMpOyAvKiBGb2xsb3dlZCBieSAxMSAqLworICAgICAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLCAxLCAwKTsgLyogTm90IExhc3QgQ29lZmZpY2llbnQqLworICAgICAgICAgICAgICAgICAgICAvKnRlbXAgPSovCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDYgKyAxLCAocnVuIDw8IDEpIHwgMSk7IC8qIEVuY29kZSBSdW4gKyBNYXJrZXIgQml0ICovCisgICAgICAgICAgICAgICAgICAgIC8vdGVtcCA9IEJpdHN0cmVhbVB1dEJpdHMoYnMsMSwxKTsgLyogTWFya2VyIEJpdCAqLworICAgICAgICAgICAgICAgICAgICAvKnRlbXAgPSovCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYnMsIDEyICsgMSwgKChsZXZlbCA8PCAxKSB8IDEpJjB4MUZGRik7IC8qIEVuY29kZSBMZXZlbCwgbWFzayB0byBtYWtlIHN1cmUgbGVuZ3RoIDEyICAqLworICAgICAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7IC8qIE1hcmtlciBCaXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFbmNvZGUgU2lnbiBCaXQgKi8KKyAgICAgICAgaWYgKGxlbmd0aCAhPSAwKQorICAgICAgICAgICAgLyp0ZW1wID0qLyBCaXRzdHJlYW1QdXQxQml0cyhicywgUkxCLT5zW2ldKTsgLyogU2lnbiBCaXQgKi8KKworICAgIH0KKyAgICAvKiBMYXN0IENvZWZmaWNpZW50ICovCisgICAgcnVuID0gUkxCLT5ydW5baV07CisgICAgbGV2ZWwgPSBSTEItPmxldmVsW2ldOworCisgICAgLyogRW5jb2RlIFJ1biBMZW5ndGggKi8KKyAgICBpZiAobGV2ZWwgPCA5KQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBQdXRDb2VmZl9JbnRyYV9MYXN0KHJ1biwgbGV2ZWwsIGJzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZXZlbCA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludGVyX0xhc3QocnVuLCBsZXZlbCwgYnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZW5ndGggPSAwOworICAgIH0KKworICAgIC8qIEZpcnN0IGVzY2FwZSBtb2RlOiBMRVZFTCBPRkZTRVQgKi8KKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgICBpZiAoaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldmVsX21pbnVzX21heCA9IGxldmVsIC0gaW50cmFfbWF4X2xldmVsWzFdW3J1bl07CisgICAgICAgICAgICBpZiAobGV2ZWxfbWludXNfbWF4IDwgOSkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRMZXZlbENvZWZmX0ludHJhX0xhc3QocnVuLCBsZXZlbF9taW51c19tYXgsIGJzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ZWxfbWludXNfbWF4ID0gbGV2ZWwgLSBpbnRlcl9tYXhfbGV2ZWxbMV1bcnVuXTsKKyAgICAgICAgICAgIGlmIChsZXZlbF9taW51c19tYXggPCA0KQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dExldmVsQ29lZmZfSW50ZXJfTGFzdChydW4sIGxldmVsX21pbnVzX21heCwgYnMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogU2Vjb25kIGVzY2FwZSBtb2RlOiBSVU4gT0ZGU0VUICovCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxldmVsIDwgOSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBydW5fbWludXNfbWF4ID0gcnVuIC0gKGludHJhX21heF9ydW4xW2xldmVsXSArIDEpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRSdW5Db2VmZl9JbnRyYV9MYXN0KHJ1bl9taW51c19tYXgsIGxldmVsLCBicyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJ1bl9taW51c19tYXggPSBydW4gLSAoaW50ZXJfbWF4X3J1bjFbbGV2ZWxdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dFJ1bkNvZWZmX0ludGVyX0xhc3QocnVuX21pbnVzX21heCwgbGV2ZWwsIGJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRoaXJkIGVzY2FwZSBtb2RlOiBGSVhFRCBMRU5HVEggQ09ERSAqLworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChSTEItPnNbaV0pCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJzLCA3ICsgMiArIDEsIDMxKTsgLyogRVNDQVBFIENPREUgKyBGb2xsb3dlZCBieSAxMSArIExhc3QgQ29lZmZpY2llbnQqLworICAgICAgICAgICAgICAgIC8vdGVtcCA9IEJpdHN0cmVhbVB1dEJpdHMoYnMsMiwzKTsgLyogRm9sbG93ZWQgYnkgMTEgKi8KKyAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLCAxLCAxKTsgLyogTGFzdCBDb2VmZmljaWVudCEhISovCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDYgKyAxLCAocnVuIDw8IDEpIHwgMSk7IC8qIEVuY29kZSBSdW4gKyBNYXJrZXIgQml0ICovCisgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywxLDEpOyAvKiBNYXJrZXIgQml0ICovCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYnMsIDEyICsgMSwgKChsZXZlbCA8PCAxKSB8IDEpJjB4MUZGRik7IC8qIEVuY29kZSBMZXZlbCwgbWFzayB0byBtYWtlIHN1cmUgbGVuZ3RoIDggKi8KKyAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7IC8qIE1hcmtlciBCaXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEVuY29kZSBTaWduIEJpdCAqLworICAgIGlmIChsZW5ndGggIT0gMCkKKyAgICAgICAgLyp0ZW1wID0qLyBCaXRzdHJlYW1QdXQxQml0cyhicywgUkxCLT5zW2ldKTsKKworCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmIC8qIEgyNjNfT05MWSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBSVU5MZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA5LzIwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IHRoZSBDb2RlZCBCbG9jayBQYXR0ZXJuIGZvciBlYWNoIGJsb2NrICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW50KiBxY29lZmYgICAgIFF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzCisgICAgICAgIEludCBNb2RlICAgICAgICBDb2RpbmcgTW9kZQorICAgICAgICBJbnQgbmNvZWZmcyAgICAgTnVtYmVyIG9mIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW50IENCUCAgICAgICAgIENvZGVkIEJsb2NrIFBhdHRlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBSdW5MZXZlbChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgaW50cmEsIEludCBpbnRyYURDX2RlY2lzaW9uLCBJbnQgbmNvZWZibGNrW10pCit7CisgICAgSW50IGksIGo7CisgICAgSW50IENCUCA9IHZpZGVvLT5oZWFkZXJJbmZvLkNCUFt2aWRlby0+bWJudW1dOworICAgIEludCBTaG9ydE5hY05pbnRyYSA9ICghKHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNob3J0VmlkZW9IZWFkZXIpICYmIHZpZGVvLT5hY1ByZWRGbGFnW3ZpZGVvLT5tYm51bV0gJiYgaW50cmEpOworICAgIE1hY3JvQmxvY2sgKk1CID0gdmlkZW8tPm91dHB1dE1COworICAgIFNob3J0ICpkYXRhQmxvY2s7CisgICAgSW50IGxldmVsOworICAgIFJ1bkxldmVsQmxvY2sgKlJMQjsKKyAgICBJbnQgcnVuLCBpZHg7CisgICAgSW50ICp6eiwgbmMsIHp6b3JkZXI7CisgICAgVUNoYXIgaW1hc2tbNl0gPSB7MHgxRiwgMHgyRiwgMHgzNywgMHgzQiwgMHgzRCwgMHgzRX07CisgICAgVUludCAqYml0bWFweno7CisKKyAgICAvKiBTZXQgUnVuLCBMZXZlbCBhbmQgQ0JQIGZvciB0aGlzIE1hY3JvYmxvY2sgKi8KKyAgICAvKiBaWiBzY2FuIGlzIGRvbmUgaGVyZS4gICovCisKKyAgICBpZiAoaW50cmEpCisgICAgeworCisgICAgICAgIGlmIChpbnRyYURDX2RlY2lzaW9uICE9IDApCisgICAgICAgICAgICBpbnRyYSA9IDA7ICAgICAgICAgICAgICAvKiBEQy9BQyBpbiBSdW4vTGV2ZWwgKi8KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNiA7IGkrKykKKyAgICAgICAgeworCisgICAgICAgICAgICB6eiA9IChJbnQgKikgemlnemFnX2ludjsKKworICAgICAgICAgICAgUkxCID0gdmlkZW8tPlJMQiArIGk7CisKKyAgICAgICAgICAgIGRhdGFCbG9jayA9IE1CLT5ibG9ja1tpXTsKKworICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMQi0+cnVuWzBdID0gMDsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGRhdGFCbG9ja1swXTsKKyAgICAgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAwOyAvKiByZXNldCB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbMF0gPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+c1swXSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbMF0gPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgUkxCLT5zWzBdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlkeCA9IGludHJhOworCisgICAgICAgICAgICBpZiAoKENCUCA+PiAoNSAtIGkpKSAmIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFNob3J0TmFjTmludHJhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgodmlkZW8tPnp6X2RpcmVjdGlvbiA+PiAoNSAtIGkpKSYxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgenogPSAoSW50ICopemlnemFnX3ZfaW52OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6ID0gKEludCAqKXppZ3phZ19oX2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgICAgIG5jID0gbmNvZWZibGNrW2ldOworICAgICAgICAgICAgICAgIGZvciAoaiA9IGludHJhLCB6eiArPSBpbnRyYTsgaiA8IG5jOyBqKyssIHp6KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6em9yZGVyID0gKnp6OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGRhdGFCbG9ja1t6em9yZGVyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2tbenpvcmRlcl0gPSAwOyAvKiByZXNldCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmNvZWZibGNrW2ldID0gaWR4OyAvKiA1LzIyLzAxLCByZXVzZSBuY29lZmJsY2sgKi8KKworICAgICAgICAgICAgaWYgKGlkeCA9PSBpbnRyYSkgLyogcmVzZXQgQ0JQLCBub3RoaW5nIHRvIGJlIGNvZGVkICovCisgICAgICAgICAgICAgICAgQ0JQICY9IGltYXNrW2ldOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW3ZpZGVvLT5tYm51bV0gPSBDQlA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKy8vICAgICAgenogPSAoSW50ICopIHppZ3phZ19pbnY7ICBubyBuZWVkIHRvIHVzZSBpdCwgZGVmYXVsdAorCisgICAgICAgIGlmIChDQlApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2IDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMQiA9IHZpZGVvLT5STEIgKyBpOworICAgICAgICAgICAgICAgIGlkeCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKENCUCA+PiAoNSAtIGkpKSAmIDEpCisgICAgICAgICAgICAgICAgeyAgIC8qIDcvMzAvMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogVXNlIGJpdG1hcHp6IHRvIGZpbmQgdGhlIFJ1bixMZXZlbCxTaWduIHN5bWJvbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgYml0bWFwenogPSB2aWRlby0+Yml0bWFwenpbaV07CisgICAgICAgICAgICAgICAgICAgIGRhdGFCbG9jayA9IE1CLT5ibG9ja1tpXTsKKyAgICAgICAgICAgICAgICAgICAgbmMgID0gbmNvZWZibGNrW2ldOworCisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHplcm9fcnVuX3NlYXJjaChiaXRtYXB6eiwgZGF0YUJsb2NrLCBSTEIsIG5jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2ldID0gaWR4OyAvKiA1LzIyLzAxLCByZXVzZSBuY29lZmJsY2sgKi8KKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IDApIC8qIHJlc2V0IENCUCwgbm90aGluZyB0byBiZSBjb2RlZCAqLworICAgICAgICAgICAgICAgICAgICBDQlAgJj0gaW1hc2tbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbdmlkZW8tPm1ibnVtXSA9IENCUDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KK30KKworI2lmbmRlZiBIMjYzX09OTFkKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgc3RhdGljIEJvb2wgSW50cmFEQ1N3aXRjaF9EZWNpc2lvbihJbnQgTW9kZSwgSW50IGludHJhX2RjX3ZsY190aHIsIEludCBpbnRyYURDVmxjUVApCisgICAgeworICAgICAgICBCb29sIHN3aXRjaGVkID0gRkFMU0U7CisKKyAgICAgICAgaWYgKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5UUkFfUSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgaW50cmFEQ1ZsY1FQID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN3aXRjaGVkOworICAgIH0KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK0ludCBJbnRyYURDX2RwY20oSW50IHZhbCwgSW50IGx1bSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbl9iaXRzOworICAgIEludCBhYnN2YWwsIHNpemUgPSAwOworCisgICAgYWJzdmFsID0gKHZhbCA8IDApID8gLXZhbCA6IHZhbDsgICAgLyogYWJzKHZhbCkgKi8KKworCisgICAgLyogY29tcHV0ZSBkY3RfZGNfc2l6ZSAqLworCisgICAgc2l6ZSA9IDA7CisgICAgd2hpbGUgKGFic3ZhbCkKKyAgICB7CisgICAgICAgIGFic3ZhbCA+Pj0gMTsKKyAgICAgICAgc2l6ZSsrOworICAgIH0KKworICAgIGlmIChsdW0pCisgICAgeyAgIC8qIGx1bWluYW5jZSAqLworICAgICAgICBuX2JpdHMgPSBQdXREQ3NpemVfbHVtKHNpemUsIGJpdHN0cmVhbSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLyogY2hyb21pbmFuY2UgKi8KKyAgICAgICAgbl9iaXRzID0gUHV0RENzaXplX2Nocm9tKHNpemUsIGJpdHN0cmVhbSk7CisgICAgfQorCisgICAgaWYgKHNpemUgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh2YWwgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYWJzdmFsID0gLXZhbDsgLyogc2V0IHRvICItdmFsIiBNVyAxNC1OT1YtMTk5NiAqLworICAgICAgICAgICAgdmFsID0gYWJzdmFsIF4oKDEgPDwgc2l6ZSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgKHNpemUpLCAoVUludCkodmFsKSk7CisgICAgICAgIG5fYml0cyArPSBzaXplOworCisgICAgICAgIGlmIChzaXplID4gOCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJpdHN0cmVhbSwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIG5fYml0czsgIC8qICMgYml0cyBmb3IgaW50cmFfZGMgZHBjbSAqLworCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRENfQUNfUFJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8yNC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERDIGFuZCBBQyBlbmNvZGluZyBvZiBJbnRyYSBCbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFZpZGVvRW5jRGF0YSAgICAqdmlkZW8KKyAgICAgICAgVUNoYXIgICAgICAgICAgIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworSW50IGNhbF9kY19zY2FsZXJFTkMoSW50IFFQLCBJbnQgdHlwZSkgOworCisKKyNkZWZpbmUgUFJFRElDVF9BQyAgZm9yIChtID0gMDsgbSA8IDc7IG0rKyl7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IERDQUNbMF0qUVB0bXA7XAorICAgICAgICAgICAgICAgICAgICAgICAgaWYodG1wPDApICAgdG1wID0gKHRtcC0oUVAvMikpL1FQO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIHRtcCA9ICh0bXArKFFQLzIpKS9RUDtcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkW21dID0gdG1wO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMrKztcCisgICAgICAgICAgICAgICAgICAgIH0KKworCitWb2lkIERDQUNQcmVkKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyIE1vZGUsIEludCAqaW50cmFEQ19kZWNpc2lvbiwgSW50IGludHJhRENWbGNRUCkKK3sKKyAgICBNYWNyb0Jsb2NrICpNQiA9IHZpZGVvLT5vdXRwdXRNQjsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgdHlwZURDU3RvcmUgKkRDX3N0b3JlID0gdmlkZW8tPnByZWREQyArIG1ibnVtOworICAgIHR5cGVEQ0FDU3RvcmUgKkRDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX3JvdzsKKyAgICB0eXBlRENBQ1N0b3JlICpEQ0FDX2NvbCA9IHZpZGVvLT5wcmVkRENBQ19jb2w7CisgICAgU2hvcnQgICAqRENBQzsKKyAgICBVQ2hhciBNb2RlX3RvcCwgTW9kZV9sZWZ0OworCisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBJbnQgbk1CUGVyUm93ID0gY3VyclZvbC0+bk1CUGVyUm93OworICAgIEludCB4X3BvcyA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeDsgLyogNS8yOC8wMSAqLworICAgIEludCB5X3BvcyA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeTsKKyAgICBVQ2hhciBRUCA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICBVQ2hhciAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIFVDaGFyICpzbGljZV9uYiA9IHZpZGVvLT5zbGljZU5vOworICAgIEJvb2wgYkFDUHJlZEVuYWJsZSA9IHZpZGVvLT5lbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uOworICAgIEludCAqQUNwcmVkX2ZsYWcgPSB2aWRlby0+YWNQcmVkRmxhZzsKKyAgICBJbnQgbWlkX2dyZXkgPSAxMjggPDwgMzsKKyAgICBJbnQgbTsKKyAgICBJbnQgY29tcDsKKyAgICBJbnQgZGNfc2NhbGUgPSA4LCB0bXA7CisKKyAgICBzdGF0aWMgY29uc3QgSW50IFhwb3NbNl0gPSB7IC0xLCAwLCAtMSwgMCwgLTEsIC0xfTsKKyAgICBzdGF0aWMgY29uc3QgSW50IFlwb3NbNl0gPSB7IC0xLCAtMSwgMCwgMCwgLTEsIC0xfTsKKyAgICBzdGF0aWMgY29uc3QgSW50IFh0YWJbNl0gPSB7MSwgMCwgMywgMiwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IEludCBZdGFiWzZdID0gezIsIDMsIDAsIDEsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCBJbnQgWnRhYls2XSA9IHszLCAyLCAxLCAwLCA0LCA1fTsKKworICAgIC8qIEkgYWRkZWQgdGhlc2UgdG8gc3BlZWQgdXAgY29tcGFyaXNvbnMgKi8KKyAgICBzdGF0aWMgY29uc3QgSW50IFBvczBbNl0gPSB7IDEsIDEsIDAsIDAsIDEsIDF9OworICAgIHN0YXRpYyBjb25zdCBJbnQgUG9zMVs2XSA9IHsgMSwgMCwgMSwgMCwgMSwgMX07CisgICAgc3RhdGljIGNvbnN0IEludCBCX1h0YWJbNl0gPSB7MCwgMSwgMCwgMSwgMiwgM307CisgICAgc3RhdGljIGNvbnN0IEludCBCX1l0YWJbNl0gPSB7MCwgMCwgMSwgMSwgMiwgM307CisKKyAgICBJbnQgZGlyZWN0aW9uWzZdOyAgICAgICAvKiAwOiBIT1JJWk9OVEFMLCAxOiBWRVJUSUNBTCAqLworICAgIEludCBibG9ja19BLCBibG9ja19CLCBibG9ja19DOworICAgIEludCBncmFkX2hvciwgZ3JhZF92ZXIsIERDX3ByZWQ7CisgICAgU2hvcnQgcHJlZFs3XSwgKnByZWRwdHI7CisgICAgU2hvcnQgcGNvZWZmWzQyXTsKKyAgICBTaG9ydCAqcWNvZWZmOworICAgIEludCBTID0gMCwgUzEsIFMyOworICAgIEludCBkaWZmLCBRUHRtcDsKKyAgICBJbnQgbmV3Q0JQWzZdOworICAgIFVDaGFyIG1hc2sxWzZdID0gezB4MjAsIDB4MTAsIDB4OCwgMHg0LCAweDIsIDB4MX07CisvLyAgVUNoYXIgbWFzazJbNl0gPSB7MHgxZiwweDJmLDB4MzcsMHgzYiwweDNkLDB4M2V9OworCisgICAgSW50IHlfb2Zmc2V0LCB4X29mZnNldCwgeF90YWIsIHlfdGFiLCB6X3RhYjsgICAgLyogc3BlZWR1cCBjb2VmZmljaWVudHMgKi8KKyAgICBJbnQgYl94dGFiLCBiX3l0YWI7CisKKyAgICB2aWRlby0+enpfZGlyZWN0aW9uID0gMDsKKworICAgIC8qIFN0YW5kYXJkIE1QRUctNCBIZWFkZXJzIGRvIERDL0FDIHByZWRpY3Rpb24qLworICAgIC8qIGNoZWNrIHdoZXRoZXIgbmVpZ2hib3JzIGFyZSBJTlRFUiAqLworICAgIGlmICh5X3BvcyA+IDApCisgICAgeworICAgICAgICBNb2RlX3RvcCA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW0tbk1CUGVyUm93XTsKKyAgICAgICAgaWYgKCEoTW9kZV90b3AgPT0gTU9ERV9JTlRSQSB8fCBNb2RlX3RvcCA9PSBNT0RFX0lOVFJBX1EpKQorICAgICAgICB7CisgICAgICAgICAgICBEQ0FDID0gRENfc3RvcmVbLW5NQlBlclJvd107CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAqRENBQysrID0gbWlkX2dyZXk7CisgICAgICAgICAgICAvKiBzZXQgdG8gMCBEQ0FDX3Jvd1t4X3Bvc11bMC4uM10gKi8KKyAgICAgICAgICAgIGlmIChiQUNQcmVkRW5hYmxlID09IFRSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTTRWRU5DX01FTVNFVChEQ0FDX3Jvd1t4X3Bvc11bMF0sIDAsIHNpemVvZihTaG9ydCkgPDwgNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHhfcG9zID4gMCkKKyAgICB7CisgICAgICAgIE1vZGVfbGVmdCA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW0tMV07CisgICAgICAgIGlmICghKE1vZGVfbGVmdCA9PSBNT0RFX0lOVFJBIHx8IE1vZGVfbGVmdCA9PSBNT0RFX0lOVFJBX1EpKQorICAgICAgICB7CisgICAgICAgICAgICBEQ0FDID0gRENfc3RvcmVbLTFdOworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgLyogc2V0IHRvIDAgRENBQ19jb2xbeF9wb3NdWzAuLjNdICovCisgICAgICAgICAgICBpZiAoYkFDUHJlZEVuYWJsZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00VkVOQ19NRU1TRVQoRENBQ19jb2xbMF1bMF0sIDAsIHNpemVvZihTaG9ydCkgPDwgNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTMSA9IDA7CisgICAgUzIgPSAwOworCisgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgaWYgKFlwb3NbY29tcF0gIT0gMCkgICAgICAgIHlfb2Zmc2V0ID0gLW5NQlBlclJvdzsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgeV9vZmZzZXQgPSAwOworICAgICAgICB4X29mZnNldCA9IFhwb3NbY29tcF07CisgICAgICAgIHhfdGFiID0gWHRhYltjb21wXTsKKyAgICAgICAgeV90YWIgPSBZdGFiW2NvbXBdOworICAgICAgICB6X3RhYiA9IFp0YWJbY29tcF07CisKKyAgICAgICAgYl94dGFiID0gQl9YdGFiW2NvbXBdOworICAgICAgICBiX3l0YWIgPSBCX1l0YWJbY29tcF07CisKKyAgICAgICAgcWNvZWZmID0gTUItPmJsb2NrW2NvbXBdOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgU3RvcmUgREMgY29lZmZpY2llbnRzICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBTdG9yZSBjb2VmZiB2YWx1ZXMgZm9yIEludHJhIE1CICovCisgICAgICAgIGlmIChjb21wID09IDApIGRjX3NjYWxlID0gY2FsX2RjX3NjYWxlckVOQyhRUCwgMSkgOworICAgICAgICBpZiAoY29tcCA9PSA0KSBkY19zY2FsZSA9IGNhbF9kY19zY2FsZXJFTkMoUVAsIDIpIDsKKworICAgICAgICBRUHRtcCA9IHFjb2VmZlswXSAqIGRjX3NjYWxlOyAvKiBEQyB2YWx1ZSAqLworCisgICAgICAgIGlmIChRUHRtcCA+IDIwNDcpICAgLyogMTAvMTAvMDEsIGFkZCBjbGlwcGluZyAoYnVnIGZpeGVkKSAqLworICAgICAgICAgICAgRENfc3RvcmVbMF1bY29tcF0gPSAyMDQ3OworICAgICAgICBlbHNlIGlmIChRUHRtcCA8IC0yMDQ4KQorICAgICAgICAgICAgRENfc3RvcmVbMF1bY29tcF0gPSAtMjA0ODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRENfc3RvcmVbMF1bY29tcF0gPSBRUHRtcDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIEZpbmQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcHJlZGljdGlvbiBhbmQgdGhlIERDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIGlmICgoeF9wb3MgPT0gMCkgJiYgeV9wb3MgPT0gMCkKKyAgICAgICAgeyAgIC8qIHRvcCBsZWZ0IGNvcm5lciAqLworICAgICAgICAgICAgYmxvY2tfQSA9IChjb21wID09IDEgfHwgY29tcCA9PSAzKSA/IERDX3N0b3JlWzBdW3hfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQiA9IChjb21wID09IDMpID8gRENfc3RvcmVbeF9vZmZzZXRdW3pfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQyA9IChjb21wID09IDIgfHwgY29tcCA9PSAzKSA/IERDX3N0b3JlWzBdW3lfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHhfcG9zID09IDApCisgICAgICAgIHsgICAvKiBsZWZ0IGVkZ2UgKi8KKyAgICAgICAgICAgIGJsb2NrX0EgPSAoY29tcCA9PSAxIHx8IGNvbXAgPT0gMykgPyBEQ19zdG9yZVswXVt4X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0IgPSAoKGNvbXAgPT0gMSAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLW5NQlBlclJvd10pKSB8fCBjb21wID09IDMpID8KKyAgICAgICAgICAgICAgICAgICAgICBEQ19zdG9yZVt5X29mZnNldCt4X29mZnNldF1bel90YWJdIDogbWlkX2dyZXk7CisgICAgICAgICAgICBibG9ja19DID0gKGNvbXAgPT0gMiB8fCBjb21wID09IDMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKFBvczBbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkpID8KKyAgICAgICAgICAgICAgICAgICAgICBEQ19zdG9yZVt5X29mZnNldF1beV90YWJdIDogbWlkX2dyZXk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeV9wb3MgPT0gMCkKKyAgICAgICAgeyAvKiB0b3Agcm93ICovCisgICAgICAgICAgICBibG9ja19BID0gKGNvbXAgPT0gMSB8fCBjb21wID09IDMgfHwgKFBvczFbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkpKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeF9vZmZzZXRdW3hfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQiA9ICgoY29tcCA9PSAyICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tMV0pKSB8fCBjb21wID09IDMpID8KKyAgICAgICAgICAgICAgICAgICAgICBEQ19zdG9yZVt5X29mZnNldCArIHhfb2Zmc2V0XVt6X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0MgPSAoY29tcCA9PSAyIHx8IGNvbXAgPT0gMykgPworICAgICAgICAgICAgICAgICAgICAgIERDX3N0b3JlW3lfb2Zmc2V0XVt5X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrX0EgPSAoY29tcCA9PSAxIHx8IGNvbXAgPT0gMyB8fCAoUG9zMVtjb21wXSAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTFdKSkpID8KKyAgICAgICAgICAgICAgICAgICAgICBEQ19zdG9yZVt4X29mZnNldF1beF90YWJdIDogbWlkX2dyZXk7CisgICAgICAgICAgICBibG9ja19CID0gKCgoY29tcCA9PSAwIHx8IGNvbXAgPT0gNCB8fCBjb21wID09IDUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTEtbk1CUGVyUm93XSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChjb21wID09IDEgJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbXAgPT0gMiAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTFdKSkgfHwgKGNvbXAgPT0gMykpID8KKyAgICAgICAgICAgICAgICAgICAgICAoRENfc3RvcmVbeV9vZmZzZXQgKyB4X29mZnNldF1bel90YWJdKSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQyA9IChjb21wID09IDIgfHwgY29tcCA9PSAzIHx8IChQb3MwW2NvbXBdICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeV9vZmZzZXRdW3lfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICB9CisgICAgICAgIGdyYWRfaG9yID0gYmxvY2tfQiAtIGJsb2NrX0M7CisgICAgICAgIGdyYWRfdmVyID0gYmxvY2tfQSAtIGJsb2NrX0I7CisKKyAgICAgICAgaWYgKChQVl9BQlMoZ3JhZF92ZXIpKSA8IChQVl9BQlMoZ3JhZF9ob3IpKSkKKyAgICAgICAgeworICAgICAgICAgICAgRENfcHJlZCA9IGJsb2NrX0M7CisgICAgICAgICAgICBkaXJlY3Rpb25bY29tcF0gPSAxOworICAgICAgICAgICAgdmlkZW8tPnp6X2RpcmVjdGlvbiA9ICh2aWRlby0+enpfZGlyZWN0aW9uKSB8IG1hc2sxW2NvbXBdOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEQ19wcmVkID0gYmxvY2tfQTsKKyAgICAgICAgICAgIGRpcmVjdGlvbltjb21wXSA9IDA7CisgICAgICAgICAgICAvL3ZpZGVvLT56el9kaXJlY3Rpb249dmlkZW8tPnp6X2RpcmVjdGlvbjw8MTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgUVB0bXAgPSBkY19zY2FsZTsgLyogNS8yOC8wMSAqLworICAgICAgICBxY29lZmZbMF0gLT0gKERDX3ByZWQgKyBRUHRtcCAvIDIpIC8gUVB0bXA7CisKKworICAgICAgICBpZiAoYkFDUHJlZEVuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogRmluZCBBQyBwcmVkaWN0aW9uICAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBpZiAoKHhfcG9zID09IDApICYmIHlfcG9zID09IDApICAgICAvKiB0b3AgbGVmdCBjb3JuZXIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uW2NvbXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA9PSAxIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3hfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX2NvbFswXVtiX3l0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gMiB8fCBjb21wID09IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gUVBNQlttYm51bSsgeV9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgRENBQyA9IERDQUNfcm93W3hfcG9zXVtiX3h0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh4X3BvcyA9PSAwKSAgICAvKiBsZWZ0IGVkZ2UgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uW2NvbXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA9PSAxIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3hfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX2NvbFswXVtiX3l0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKFBvczBbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wID09IDIgfHwgY29tcCA9PSAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRUHRtcCA9IFFQTUJbbWJudW0reV9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgRENBQyA9IERDQUNfcm93W3hfcG9zXVtiX3h0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh5X3BvcyA9PSAwKSAgLyogdG9wIHJvdyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25bY29tcF0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoUG9zMVtjb21wXSAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wID09IDEgfHwgY29tcCA9PSAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRUHRtcCA9IFFQTUJbbWJudW0reF9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgRENBQyA9IERDQUNfY29sWzBdW2JfeXRhYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgIT0gUVApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRElDVF9BQworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBEQ0FDOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkWzBdID0gcHJlZFsxXSA9IHByZWRbMl0gPSBwcmVkWzNdID0gcHJlZFs0XSA9IHByZWRbNV0gPSBwcmVkWzZdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA9PSAyIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3lfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX3Jvd1t4X3Bvc11bYl94dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25bY29tcF0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoUG9zMVtjb21wXSAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wID09IDEgfHwgY29tcCA9PSAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRUHRtcCA9IFFQTUJbbWJudW0reF9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgRENBQyA9IERDQUNfY29sWzBdW2JfeXRhYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgIT0gUVApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRElDVF9BQworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBEQ0FDOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkWzBdID0gcHJlZFsxXSA9IHByZWRbMl0gPSBwcmVkWzNdID0gcHJlZFs0XSA9IHByZWRbNV0gPSBwcmVkWzZdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKFBvczBbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wICA9PSAyIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3lfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX3Jvd1t4X3Bvc11bYl94dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogRGVjaWRlIGFuZCBQZXJmb3JtIEFDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBuZXdDQlBbY29tcF0gPSAwOworCisgICAgICAgICAgICBpZiAoZGlyZWN0aW9uW2NvbXBdID09IDApICAgLyogSG9yaXpvbnRhbCwgbGVmdCBDT0xVTU4gb2YgYmxvY2sgQSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERDQUMgPSBwY29lZmYgKyBjb21wICogNzsgLyogcmUtdXNlIERDQUMgYXMgbG9jYWwgdmFyICovCisgICAgICAgICAgICAgICAgcWNvZWZmICs9IDg7CisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDc7IG0rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gcWNvZWZmW208PDNdOworICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgPiAwKSAgUzEgKz0gUVB0bXA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIFMxIC09IFFQdG1wOworICAgICAgICAgICAgICAgICAgICBRUHRtcCAtPSBwcmVkcHRyW21dOworICAgICAgICAgICAgICAgICAgICBEQ0FDW21dID0gUVB0bXA7IC8qIHNhdmUgcHJlZGljdGlvbiByZXNpZHVlIHRvIHBjb2VmZiovCisgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCkgIG5ld0NCUFtjb21wXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBQVl9BQlMoUVB0bXApOworICAgICAgICAgICAgICAgICAgICBTMiArPSBkaWZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAvKiBWZXJ0aWNhbCwgdG9wIFJPVyBvZiBibG9jayBDICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcWNvZWZmKys7CisgICAgICAgICAgICAgICAgRENBQyA9IHBjb2VmZiArIGNvbXAgKiA3OyAvKiByZS11c2UgRENBQyBhcyBsb2NhbCB2YXIgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgNzsgbSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBxY29lZmZbbV07CisgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCA+IDApICBTMSArPSBRUHRtcDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgUzEgLT0gUVB0bXA7CisgICAgICAgICAgICAgICAgICAgIFFQdG1wIC09IHByZWRwdHJbbV07CisgICAgICAgICAgICAgICAgICAgIERDQUNbbV0gPSBRUHRtcDsgLyogc2F2ZSBwcmVkaWN0aW9uIHJlc2lkdWUgdG8gcGNvZWZmKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wKSAgbmV3Q0JQW2NvbXBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IFBWX0FCUyhRUHRtcCk7CisgICAgICAgICAgICAgICAgICAgIFMyICs9IGRpZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qICBTdG9yZSBEQ0FDIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBTdG9yZSBjb2VmZiB2YWx1ZXMgZm9yIEludHJhIE1CICovCisgICAgICAgICAgICBxY29lZmYgPSBNQi0+YmxvY2tbY29tcF07CisgICAgICAgICAgICBEQ0FDID0gRENBQ19yb3dbeF9wb3NdW2JfeHRhYl07CisgICAgICAgICAgICBEQ0FDWzBdID0gcWNvZWZmWzFdOworICAgICAgICAgICAgRENBQ1sxXSA9IHFjb2VmZlsyXTsKKyAgICAgICAgICAgIERDQUNbMl0gPSBxY29lZmZbM107CisgICAgICAgICAgICBEQ0FDWzNdID0gcWNvZWZmWzRdOworICAgICAgICAgICAgRENBQ1s0XSA9IHFjb2VmZls1XTsKKyAgICAgICAgICAgIERDQUNbNV0gPSBxY29lZmZbNl07CisgICAgICAgICAgICBEQ0FDWzZdID0gcWNvZWZmWzddOworCisgICAgICAgICAgICBEQ0FDID0gRENBQ19jb2xbMF1bYl95dGFiXTsKKyAgICAgICAgICAgIERDQUNbMF0gPSBxY29lZmZbOF07CisgICAgICAgICAgICBEQ0FDWzFdID0gcWNvZWZmWzE2XTsKKyAgICAgICAgICAgIERDQUNbMl0gPSBxY29lZmZbMjRdOworICAgICAgICAgICAgRENBQ1szXSA9IHFjb2VmZlszMl07CisgICAgICAgICAgICBEQ0FDWzRdID0gcWNvZWZmWzQwXTsKKyAgICAgICAgICAgIERDQUNbNV0gPSBxY29lZmZbNDhdOworICAgICAgICAgICAgRENBQ1s2XSA9IHFjb2VmZls1Nl07CisKKworICAgICAgICB9IC8qIGJBQ1ByZWRFbmFibGUgKi8KKworICAgIH0gLyogRU5EIENPTVAgRk9SIExPT1AgKi8KKworICAgIC8vaWYgKGRpZmYgPiAyMDQ3KQorICAgIC8vICAgIGJyZWFrOworICAgIFMgKz0gKFMxIC0gUzIpOworCisKKyAgICBpZiAoUyA+PSAwICYmIGJBQ1ByZWRFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIEFDcHJlZF9mbGFnW21ibnVtXSA9IDE7CisgICAgICAgIERDQUMgPSBwY29lZmY7IC8qIHByZWRpY3Rpb24gcmVzaWR1ZSAqLworICAgICAgICBxY29lZmYgPSBNQi0+YmxvY2tbMF07CisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpcmVjdGlvbltjb21wXSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHFjb2VmZls4XSA9IERDQUNbMF07CisgICAgICAgICAgICAgICAgcWNvZWZmWzE2XSA9IERDQUNbMV07CisgICAgICAgICAgICAgICAgcWNvZWZmWzI0XSA9IERDQUNbMl07CisgICAgICAgICAgICAgICAgcWNvZWZmWzMyXSA9IERDQUNbM107CisgICAgICAgICAgICAgICAgcWNvZWZmWzQwXSA9IERDQUNbNF07CisgICAgICAgICAgICAgICAgcWNvZWZmWzQ4XSA9IERDQUNbNV07CisgICAgICAgICAgICAgICAgcWNvZWZmWzU2XSA9IERDQUNbNl07CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxY29lZmZbMV0gPSBEQ0FDWzBdOworICAgICAgICAgICAgICAgIHFjb2VmZlsyXSA9IERDQUNbMV07CisgICAgICAgICAgICAgICAgcWNvZWZmWzNdID0gRENBQ1syXTsKKyAgICAgICAgICAgICAgICBxY29lZmZbNF0gPSBEQ0FDWzNdOworICAgICAgICAgICAgICAgIHFjb2VmZls1XSA9IERDQUNbNF07CisgICAgICAgICAgICAgICAgcWNvZWZmWzZdID0gRENBQ1s1XTsKKyAgICAgICAgICAgICAgICBxY29lZmZbN10gPSBEQ0FDWzZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld0NCUFtjb21wXSkgLyogNS8yOC8wMSwgdXBkYXRlIENCUCAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gfD0gbWFzazFbY29tcF07CisgICAgICAgICAgICBEQ0FDICs9IDc7CisgICAgICAgICAgICBxY29lZmYgKz0gNjQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLyogT25seSBEQyBQcmVkaWN0aW9uICovCisgICAgeworICAgICAgICBBQ3ByZWRfZmxhZ1ttYm51bV0gPSAwOworICAgIH0KKworICAgICppbnRyYURDX2RlY2lzaW9uID0gSW50cmFEQ1N3aXRjaF9EZWNpc2lvbihNb2RlLCB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RociwgaW50cmFEQ1ZsY1FQKTsKKyAgICBpZiAoKmludHJhRENfZGVjaXNpb24pIC8qIGNvZGUgREMgd2l0aCBBQyAsIDUvMjgvMDEqLworICAgIHsKKyAgICAgICAgcWNvZWZmID0gTUItPmJsb2NrWzBdOworICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKnFjb2VmZikKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dIHw9IG1hc2sxW2NvbXBdOworICAgICAgICAgICAgcWNvZWZmICs9IDY0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKworCisKK1ZvaWQgZmluZF9wbXZzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBibG9jaywgSW50ICptdngsIEludCAqbXZ5KQoreworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisvLyAgVUNoYXIgKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOyAvKiBtb2RlcyBmb3IgTUJzICovCisgICAgVUNoYXIgKnNsaWNlX25iID0gdmlkZW8tPnNsaWNlTm87CisgICAgSW50IG5NQlBlclJvdyA9IGN1cnJWb2wtPm5NQlBlclJvdzsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisKKyAgICBJbnQgICBwMXgsIHAyeCwgcDN4OworICAgIEludCAgIHAxeSwgcDJ5LCBwM3k7CisgICAgSW50ICAgeGluMSwgeGluMiwgeGluMzsKKyAgICBJbnQgICB5aW4xLCB5aW4yLCB5aW4zOworICAgIEludCAgIHZlYzEsIHZlYzIsIHZlYzM7CisgICAgSW50ICAgcnVsZTEsIHJ1bGUyLCBydWxlMzsKKyAgICBNT1QgICAqKm1vdGRhdGEgPSB2aWRlby0+bW90OworICAgIEludCAgIHggPSBtYm51bSAlIG5NQlBlclJvdzsKKyAgICBJbnQgICB5ID0gbWJudW0gLyBuTUJQZXJSb3c7CisKKyAgICAvKgorICAgICAgICBJbiBhIHByZXZpb3VzIHZlcnNpb24sIGEgTUIgdmVjdG9yIChibG9jayA9IDApIHdhcyBwcmVkaWN0ZWQgdGhlIHNhbWUgd2F5CisgICAgICAgIGFzIGJsb2NrIDEsIHdoaWNoIGlzIHRoZSBtb3N0IGxpa2VseSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVk0uCisKKyAgICAgICAgVGhlcmVmb3JlLCBpZiB3ZSBoYXZlIGFkdmFuY2VkIHByZWQuIG1vZGUsIGFuZCBpZiBhbGwgTUJzIGFyb3VuZCBoYXZlCisgICAgICAgIG9ubHkgb25lIDE2eDE2IHZlY3RvciBlYWNoLCB3ZSBjaG9zZSB0aGUgYXBwcm9waWF0ZSBibG9jayBhcyBpZiB0aGVzZQorICAgICAgICBNQnMgaGF2ZSA0IHZlY3RvcnMuCisKKyAgICAgICAgVGhpcyBkaWZmZXJlbnQgcHJlZGljdGlvbiBhZmZlY3RzIG9ubHkgMTZ4MTYgdmVjdG9ycyBvZiBNQnMgd2l0aAorICAgICAgICB0cmFuc3BhcmVudCBibG9ja3MuCisKKyAgICAgICAgSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgd2UgY2hvb3NlIGZvciB0aGUgMTZ4MTYgbW9kZSB0aGUgZmlyc3QKKyAgICAgICAgbm9uLXRyYW5zcGFyZW50IGJsb2NrIGluIHRoZSBzdXJyb3VuZGluZyBNQnMKKyAgICAqLworCisgICAgc3dpdGNoIChibG9jaykKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHZlYzEgPSAyIDsKKyAgICAgICAgICAgIHlpbjEgPSB5ICA7CisgICAgICAgICAgICB4aW4xID0geCAtIDE7CisgICAgICAgICAgICB2ZWMyID0gMyA7CisgICAgICAgICAgICB5aW4yID0geSAtIDE7CisgICAgICAgICAgICB4aW4yID0geDsKKyAgICAgICAgICAgIHZlYzMgPSAzIDsKKyAgICAgICAgICAgIHlpbjMgPSB5IC0gMTsKKyAgICAgICAgICAgIHhpbjMgPSB4ICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHZlYzEgPSAyIDsKKyAgICAgICAgICAgIHlpbjEgPSB5ICA7CisgICAgICAgICAgICB4aW4xID0geCAtIDE7CisgICAgICAgICAgICB2ZWMyID0gMyA7CisgICAgICAgICAgICB5aW4yID0geSAtIDE7CisgICAgICAgICAgICB4aW4yID0geDsKKyAgICAgICAgICAgIHZlYzMgPSAzIDsKKyAgICAgICAgICAgIHlpbjMgPSB5IC0gMTsKKyAgICAgICAgICAgIHhpbjMgPSB4ICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHZlYzEgPSAxIDsKKyAgICAgICAgICAgIHlpbjEgPSB5ICA7CisgICAgICAgICAgICB4aW4xID0geDsKKyAgICAgICAgICAgIHZlYzIgPSA0IDsKKyAgICAgICAgICAgIHlpbjIgPSB5IC0gMTsKKyAgICAgICAgICAgIHhpbjIgPSB4OworICAgICAgICAgICAgdmVjMyA9IDMgOworICAgICAgICAgICAgeWluMyA9IHkgLSAxOworICAgICAgICAgICAgeGluMyA9IHggKyAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdmVjMSA9IDQgOworICAgICAgICAgICAgeWluMSA9IHkgIDsKKyAgICAgICAgICAgIHhpbjEgPSB4IC0gMTsKKyAgICAgICAgICAgIHZlYzIgPSAxIDsKKyAgICAgICAgICAgIHlpbjIgPSB5ICA7CisgICAgICAgICAgICB4aW4yID0geDsKKyAgICAgICAgICAgIHZlYzMgPSAyIDsKKyAgICAgICAgICAgIHlpbjMgPSB5ICA7CisgICAgICAgICAgICB4aW4zID0geDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgNCAqLworICAgICAgICAgICAgdmVjMSA9IDMgOworICAgICAgICAgICAgeWluMSA9IHkgIDsKKyAgICAgICAgICAgIHhpbjEgPSB4OworICAgICAgICAgICAgdmVjMiA9IDEgOworICAgICAgICAgICAgeWluMiA9IHkgIDsKKyAgICAgICAgICAgIHhpbjIgPSB4OworICAgICAgICAgICAgdmVjMyA9IDIgOworICAgICAgICAgICAgeWluMyA9IHkgIDsKKyAgICAgICAgICAgIHhpbjMgPSB4OworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGJsb2NrID09IDApCisgICAgeworICAgICAgICAvKiBhY2NvcmRpbmcgdG8gdGhlIG1vdGlvbiBlbmNvZGluZywgd2UgbXVzdCBjaG9vc2UgYSBmaXJzdCBub24tdHJhbnNwYXJlbnQKKyAgICAgICAgYmxvY2sgaW4gdGhlIHN1cnJvdW5kaW5nIE1CcyAoMTYtbW9kZSkKKyAgICAgICAgICAgICovCisKKyAgICAgICAgaWYgKHggPiAwICYmIHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkKKyAgICAgICAgICAgIHJ1bGUxID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZTEgPSAxOworCisgICAgICAgIGlmICh5ID4gMCAmJiBzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkKKyAgICAgICAgICAgIHJ1bGUyID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZTIgPSAxOworCisgICAgICAgIGlmICgoeCAhPSBuTUJQZXJSb3cgLSAxKSAmJiAoeSA+IDApICYmIHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bSsxLW5NQlBlclJvd10pCisgICAgICAgICAgICBydWxlMyA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bGUzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgYm9yZGVycyBmb3Igc2luZ2xlIGJsb2NrcyAoYWR2YW5jZWQgbW9kZSkgKi8KKyAgICAgICAgLyogcnVsZSAxICovCisgICAgICAgIGlmICgoKGJsb2NrID09IDEgfHwgYmxvY2sgPT0gMykgJiYKKyAgICAgICAgICAgICAgICAoeCA9PSAwIHx8IHNsaWNlX25iW21ibnVtXSAhPSBzbGljZV9uYlttYm51bS0xXSkpKQorICAgICAgICAgICAgcnVsZTEgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBydWxlMSA9IDA7CisKKyAgICAgICAgLyogcnVsZSAyICovCisgICAgICAgIGlmICgoKGJsb2NrID09IDEgfHwgYmxvY2sgPT0gMikgJiYKKyAgICAgICAgICAgICAgICAoeSA9PSAwIHx8IHNsaWNlX25iW21ibnVtXSAhPSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkpCisgICAgICAgICAgICBydWxlMiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bGUyID0gMDsKKworICAgICAgICAvKiBydWxlIDMgKi8KKyAgICAgICAgaWYgKCgoYmxvY2sgPT0gMSB8fCBibG9jayA9PSAyKSAmJgorICAgICAgICAgICAgICAgICh4ID09IG5NQlBlclJvdyAtIDEgfHwgeSA9PSAwIHx8IHNsaWNlX25iW21ibnVtXSAhPSBzbGljZV9uYlttYm51bSsxLW5NQlBlclJvd10pKSkKKyAgICAgICAgICAgIHJ1bGUzID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZTMgPSAwOworICAgIH0KKworICAgIGlmIChydWxlMSkKKyAgICB7CisgICAgICAgIHAxeCA9IHAxeSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgcDF4ID0gbW90ZGF0YVt5aW4xKm5NQlBlclJvdyt4aW4xXVt2ZWMxXS54OworICAgICAgICBwMXkgPSBtb3RkYXRhW3lpbjEqbk1CUGVyUm93K3hpbjFdW3ZlYzFdLnk7CisgICAgICAgIC8vcDF4ID0gbW90eGRhdGFbeGluMSoyKyh2ZWMxJjB4MSkgKyAoeWluMSoyKyh2ZWMxPj4xKSkqeEJdOworICAgICAgICAvL3AxeSA9IG1vdHlkYXRhW3hpbjEqMisodmVjMSYweDEpICsgKHlpbjEqMisodmVjMT4+MSkpKnhCXTsKKyAgICB9CisKKyAgICBpZiAocnVsZTIpCisgICAgeworICAgICAgICBwMnggPSBwMnkgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwMnggPSBtb3RkYXRhW3lpbjIqbk1CUGVyUm93K3hpbjJdW3ZlYzJdLng7CisgICAgICAgIHAyeSA9IG1vdGRhdGFbeWluMipuTUJQZXJSb3creGluMl1bdmVjMl0ueTsKKyAgICAgICAgLy9wMnggPSBtb3R4ZGF0YVt4aW4yKjIrKHZlYzImMHgxKSArICh5aW4yKjIrKHZlYzI+PjEpKSp4Ql07CisgICAgICAgIC8vcDJ5ID0gbW90eWRhdGFbeGluMioyKyh2ZWMyJjB4MSkgKyAoeWluMioyKyh2ZWMyPj4xKSkqeEJdOworICAgIH0KKworICAgIGlmIChydWxlMykKKyAgICB7CisgICAgICAgIHAzeCA9IHAzeSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHAzeCA9IG1vdGRhdGFbeWluMypuTUJQZXJSb3creGluM11bdmVjM10ueDsKKyAgICAgICAgcDN5ID0gbW90ZGF0YVt5aW4zKm5NQlBlclJvdyt4aW4zXVt2ZWMzXS55OworICAgICAgICAvL3AzeCA9IG1vdHhkYXRhW3hpbjMqMisgKHZlYzMmMHgxKSArICh5aW4zKjIrKHZlYzM+PjEpKSp4Ql07CisgICAgICAgIC8vcDN5ID0gbW90eWRhdGFbeGluMyoyKyAodmVjMyYweDEpICsgKHlpbjMqMisodmVjMz4+MSkpKnhCXTsKKyAgICB9CisKKyAgICBpZiAocnVsZTEgJiYgcnVsZTIgJiYgcnVsZTMpCisgICAgeworICAgICAgICAvKiBhbGwgTUJzIGFyZSBvdXRzaWRlIHRoZSBWT1AgKi8KKyAgICAgICAgKm12eCA9ICptdnkgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChydWxlMSArIHJ1bGUyICsgcnVsZTMgPT0gMikKKyAgICB7CisgICAgICAgIC8qIHR3byBvZiB0aHJlZSBhcmUgemVybyAqLworICAgICAgICAqbXZ4ID0gKHAxeCArIHAyeCArIHAzeCk7CisgICAgICAgICptdnkgPSAocDF5ICsgcDJ5ICsgcDN5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm12eCA9ICgocDF4ICsgcDJ4ICsgcDN4IC0gUFZfTUFYKHAxeCwgUFZfTUFYKHAyeCwgcDN4KSkgLSBQVl9NSU4ocDF4LCBQVl9NSU4ocDJ4LCBwM3gpKSkpOworICAgICAgICAqbXZ5ID0gKChwMXkgKyBwMnkgKyBwM3kgLSBQVl9NQVgocDF5LCBQVl9NQVgocDJ5LCBwM3kpKSAtIFBWX01JTihwMXksIFBWX01JTihwMnksIHAzeSkpKSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKK1ZvaWQgV3JpdGVNVmNvbXBvbmVudChJbnQgZl9jb2RlLCBJbnQgZG12LCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMpCit7CisgICAgSW50IHJlc2lkdWFsLCB2bGNfY29kZV9tYWcsIGJpdHMsIGVudHJ5OworCisgICAgU2NhbGVNVkQoZl9jb2RlLCBkbXYsICZyZXNpZHVhbCwgJnZsY19jb2RlX21hZyk7CisKKyAgICBpZiAodmxjX2NvZGVfbWFnIDwgMCkKKyAgICAgICAgZW50cnkgPSB2bGNfY29kZV9tYWcgKyA2NTsKKyAgICBlbHNlCisgICAgICAgIGVudHJ5ID0gdmxjX2NvZGVfbWFnOworCisgICAgYml0cyA9IFB1dE1WKGVudHJ5LCBicyk7CisKKyAgICBpZiAoKGZfY29kZSAhPSAxKSAmJiAodmxjX2NvZGVfbWFnICE9IDApKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgZl9jb2RlIC0gMSwgcmVzaWR1YWwpOworICAgICAgICBiaXRzICs9IGZfY29kZSAtIDE7CisgICAgfQorICAgIHJldHVybjsKK30KKworCitWb2lkCitTY2FsZU1WRCgKKyAgICBJbnQgIGZfY29kZSwgICAgICAgLyogPC0tIE1WIHJhbmdlIGluIDEvMiB1bml0czogMT0zMiwyPTY0LC4uLiw3PTIwNDggICAgICovCisgICAgSW50ICBkaWZmX3ZlY3RvciwgIC8qIDwtLSBNViBEaWZmZXJlbmNlIGNvbW1wb25lbnQgaW4gMS8yIHVuaXRzICAgICAgICAgICAqLworICAgIEludCAgKnJlc2lkdWFsLCAgICAvKiAtLT4gdmFsdWUgdG8gYmUgRkxDIGNvZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBJbnQgICp2bGNfY29kZV9tYWcgLyogLS0+IHZhbHVlIHRvIGJlIFZMQyBjb2RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCispCit7CisgICAgSW50ICAgcmFuZ2U7CisgICAgSW50ICAgc2NhbGVfZmFjdG9yOworICAgIEludCAgIHJfc2l6ZTsKKyAgICBJbnQgICBsb3c7CisgICAgSW50ICAgaGlnaDsKKyAgICBJbnQgICBhdXg7CisKKyAgICByX3NpemUgPSBmX2NvZGUgLSAxOworICAgIHNjYWxlX2ZhY3RvciA9IDEgPDwgcl9zaXplOworICAgIHJhbmdlID0gMzIgKiBzY2FsZV9mYWN0b3I7CisgICAgbG93ICAgPSAtcmFuZ2U7CisgICAgaGlnaCAgPSAgcmFuZ2UgLSAxOworCisgICAgaWYgKGRpZmZfdmVjdG9yIDwgbG93KQorICAgICAgICBkaWZmX3ZlY3RvciArPSAyICogcmFuZ2U7CisgICAgZWxzZSBpZiAoZGlmZl92ZWN0b3IgPiBoaWdoKQorICAgICAgICBkaWZmX3ZlY3RvciAtPSAyICogcmFuZ2U7CisKKyAgICBpZiAoZGlmZl92ZWN0b3IgPT0gMCkKKyAgICB7CisgICAgICAgICp2bGNfY29kZV9tYWcgPSAwOworICAgICAgICAqcmVzaWR1YWwgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChzY2FsZV9mYWN0b3IgPT0gMSkKKyAgICB7CisgICAgICAgICp2bGNfY29kZV9tYWcgPSBkaWZmX3ZlY3RvcjsKKyAgICAgICAgKnJlc2lkdWFsID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXV4ID0gUFZfQUJTKGRpZmZfdmVjdG9yKSArIHNjYWxlX2ZhY3RvciAtIDE7CisgICAgICAgICp2bGNfY29kZV9tYWcgPSBhdXggPj4gcl9zaXplOworCisgICAgICAgIGlmIChkaWZmX3ZlY3RvciA8IDApCisgICAgICAgICAgICAqdmxjX2NvZGVfbWFnID0gLSp2bGNfY29kZV9tYWc7CisgICAgICAgICpyZXNpZHVhbCA9IGF1eCAmIChzY2FsZV9mYWN0b3IgLSAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyMWI2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuaApAQCAtMCwwICsxLDQyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfVkxDX0VOQ09ERV9IXworI2RlZmluZSBfVkxDX0VOQ09ERV9IXworCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCitJbnQgUHV0Q29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0Q29lZmZfSW50cmEoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0Q0JQWShJbnQgY2JweSwgQ2hhciBpbnRyYSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0TUNCUENfSW50ZXIoSW50IGNicGMsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXRNQ0JQQ19JbnRyYShJbnQgY2JwYywgSW50IG1vZGUsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dE1WKEludCBtdmludCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0RENzaXplX2Nocm9tKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXREQ3NpemVfbHVtKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXREQ3NpemVfbHVtKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXRDb2VmZl9JbnRlcl9SVkxDKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dENvZWZmX0ludHJhX1JWTEMoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0UnVuQ29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0UnVuQ29lZmZfSW50cmEoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0TGV2ZWxDb2VmZl9JbnRlcihJbnQgcnVuLCBJbnQgbGV2ZWwsIEludCBsYXN0LCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXRMZXZlbENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworCitWb2lkIE1CX0NvZGVDb2VmZihWaWRlb0VuY0RhdGEgKnZpZGVvLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMpOworVm9pZCBCbG9ja0NvZGVDb2VmZihSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIFVDaGFyIE1vZGUsIEludCBydmxjLCBJbnQgc2hvcnRWaWRlb0hlYWRlcik7CisjZW5kaWYgLyogX1ZMQ19FTkNPREVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjQ5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oCkBAIC0wLDAgKzEsMzE2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfVkxDX0VOQ09ERV9JTkxJTkVfSF8KKyNkZWZpbmUgX1ZMQ19FTkNPREVfSU5MSU5FX0hfCisKKyNpZiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSAmJiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y0KQorCitfX2lubGluZSAgSW50IHplcm9fcnVuX3NlYXJjaChVSW50ICpiaXRtYXB6eiwgU2hvcnQgKmRhdGFCbG9jaywgUnVuTGV2ZWxCbG9jayAqUkxCLCBJbnQgbmMpCit7CisgICAgSW50IGlkeCwgcnVuLCBsZXZlbCwgajsKKyAgICBVSW50IGVuZCwgbWF0Y2g7CisKKyAgICBpZHggPSAwOworICAgIGogICA9IDA7CisgICAgcnVuID0gMDsKKyAgICBtYXRjaCA9IDEgPDwgMzE7CisgICAgaWYgKG5jID4gMzIpCisgICAgICAgIGVuZCA9IDE7CisgICAgZWxzZQorICAgICAgICBlbmQgPSAxIDw8ICgzMiAtIG5jKTsKKworICAgIHdoaWxlIChtYXRjaCA+PSBlbmQpCisgICAgeworICAgICAgICBpZiAoKG1hdGNoJmJpdG1hcHp6WzBdKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIG1hdGNoID4+PSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWF0Y2ggPj49IDE7CisgICAgICAgICAgICBsZXZlbCA9IGRhdGFCbG9ja1tqXTsKKyAgICAgICAgICAgIGRhdGFCbG9ja1tqXSA9IDA7IC8qIHJlc2V0IG91dHB1dCAqLworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAxOworICAgICAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDA7CisgICAgICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG5jIC09IDMyOworICAgIGlmIChuYyA+IDApCisgICAgeworICAgICAgICBtYXRjaCA9IDEgPDwgMzE7CisgICAgICAgIGVuZCA9IDEgPDwgKDMyIC0gbmMpOworICAgICAgICB3aGlsZSAobWF0Y2ggPj0gZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1hdGNoJmJpdG1hcHp6WzFdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBtYXRjaCA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXRjaCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGRhdGFCbG9ja1tqXTsKKyAgICAgICAgICAgICAgICBkYXRhQmxvY2tbal0gPSAwOyAvKiByZXNldCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAxOworICAgICAgICAgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkeDsKK30KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCitfX2lubGluZSAgSW50IHplcm9fcnVuX3NlYXJjaChVSW50ICpiaXRtYXB6eiwgU2hvcnQgKmRhdGFCbG9jaywgUnVuTGV2ZWxCbG9jayAqUkxCLCBJbnQgbmMpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKG5jKTsKKyAgICBJbnQgaWR4LCBydW4sIGxldmVsLCBqOworICAgIFVJbnQgZW5kLCBtYXRjaDsKKyAgICBJbnQgIHp6b3JkZXI7CisKKyAgICBpZHggPSAwOworICAgIHJ1biA9IDA7CisgICAgaiAgID0gLTE7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIGxkciBtYXRjaCwgW2JpdG1hcHp6XQorICAgICAgICBjbHogcnVuLCBtYXRjaAorICAgIH0KKworICAgIHp6b3JkZXIgPSAwOworCisgICAgd2hpbGUgKHJ1biA8IDMyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgbW92IGVuZCwgIzB4ODAwMDAwMDAKKyAgICAgICAgICAgIG1vdiBlbmQsIGVuZCwgbHNyIHJ1biAgIC8qIG1hc2sqLworICAgICAgICAgICAgYmljIG1hdGNoLCBtYXRjaCwgZW5kICAgICAgIC8qIHJlbW92ZSBpdCBmcm9tIGJpdG1hcCAqLworICAgICAgICAgICAgbW92IHJ1biwgcnVuLCBsc2wgIzEgIC8qIDA1LzA5LzAyICovCisgICAgICAgICAgICBsZHJzaCBsZXZlbCwgW2RhdGFCbG9jaywgcnVuXSAvKiAgbG9hZCBkYXRhICovCisgICAgICAgICAgICBzdHJoIHp6b3JkZXIsIFtkYXRhQmxvY2ssIHJ1bl0gLyogcmVzZXQgb3V0cHV0ICovCisgICAgICAgICAgICBhZGQgaiwgaiwgIzEKKyAgICAgICAgICAgIHJzYiBydW4sIGosIHJ1biwgbHNyICMxIC8qIGRlbHRhIHJ1biAqLworICAgICAgICAgICAgYWRkIGosIGosIHJ1biAgICAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAqLworICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSBsZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgY2x6IHJ1biwgbWF0Y2gKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbGRyIG1hdGNoLCBbYml0bWFwenosICM0XQorICAgICAgICBjbHogcnVuLCBtYXRjaAorICAgIH0KKworICAgIHdoaWxlIChydW4gPCAzMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vdiBlbmQsICMweDgwMDAwMDAwCisgICAgICAgICAgICBtb3YgZW5kLCBlbmQsIGxzciBydW4gICAvKiBtYXNrKi8KKyAgICAgICAgICAgIGJpYyBtYXRjaCwgbWF0Y2gsIGVuZCAgICAgICAvKiByZW1vdmUgaXQgZnJvbSBiaXRtYXAgKi8KKyAgICAgICAgICAgIGFkZCBydW4sIHJ1biwgIzMyICAgICAgIC8qIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIG1vdiBydW4sIHJ1biwgbHNsICMxICAgIC8qIDA5LzAyLzA1ICovCisgICAgICAgICAgICBsZHJzaCBsZXZlbCwgW2RhdGFCbG9jaywgcnVuXSAvKiAgbG9hZCBkYXRhICovCisgICAgICAgICAgICBzdHJoICB6em9yZGVyLCBbZGF0YUJsb2NrLCBydW5dIC8qIHJlc2V0IG91dHB1dCAqLworICAgICAgICAgICAgYWRkIGosIGosICMxCisgICAgICAgICAgICByc2IgcnVuLCBqLCBydW4sIGxzciAjMSAgICAgLyogZGVsdGEgcnVuICovCisgICAgICAgICAgICBhZGQgaiwgaiwgcnVuICAgICAgICAgICAvKiBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gLWxldmVsOworICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAxOworICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IGxldmVsOworICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAwOworICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBjbHogcnVuLCBtYXRjaAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkeDsKK30KKworI2VsaWYgKCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNSkgKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCitfX2lubGluZSBJbnQgbTR2X2VuY19jbHooVUludCB0ZW1wKQoreworICAgIHJlZ2lzdGVyIEludCByYjsKKyAgICByZWdpc3RlciBVSW50IHJhID0gKFVJbnQpdGVtcDsKKworICAgIGFzbSB2b2xhdGlsZSgiY2x6ICAgJTAsICUxIgorICAgICAgICAgICAgIDogIj0mciIocmIpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIocmEpCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgcmV0dXJuIChyYik7Cit9CisKK19faW5saW5lICBJbnQgemVyb19ydW5fc2VhcmNoKFVJbnQgKmJpdG1hcHp6LCBTaG9ydCAqZGF0YUJsb2NrLCBSdW5MZXZlbEJsb2NrICpSTEIsIEludCBuYykKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcobmMpOworICAgIEludCBpZHgsIHJ1biwgbGV2ZWwgPSAwLCBqOworICAgIFVJbnQgZW5kID0gMCwgbWF0Y2g7CisgICAgSW50ICB6em9yZGVyOworCisgICAgaWR4ID0gMDsKKyAgICBydW4gPSAwOworICAgIGogICA9IC0xOworICAgIG1hdGNoID0gKmJpdG1hcHp6OworICAgIHJ1biA9IG00dl9lbmNfY2x6KG1hdGNoKTsKKworICAgIHp6b3JkZXIgPSAwOworCisgICAgd2hpbGUgKHJ1biA8IDMyKQorICAgIHsKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3YgICAlMCwgIzB4ODAwMDAwMDBcblx0IgorICAgICAgICAgICAgICAgICAgICAgIm1vdiAgICUwLCAlMCwgbHNyICUxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJiaWMgICAlMiwgJTIsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJtb3YgICAlMSwgJTEsIGxzbCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAibGRyc2ggJTMsIFslNiwgJTFdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJzdHJoICAlNSwgWyU2LCAlMV1cblx0IgorICAgICAgICAgICAgICAgICAgICAgImFkZCAgICU0LCAlNCwgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgInJzYiAgICUxLCAlNCwgJTEsIGxzciAjMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAgJTQsICU0LCAlMSIKKyAgICAgICAgICAgICA6ICIrciIoZW5kKSwgIityIihydW4pLCAiK3IiKG1hdGNoKSwgIj1yIihsZXZlbCksICIrciIoaikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoenpvcmRlciksICJyIihkYXRhQmxvY2spKTsKKyAgICAgICAgaWYgKGxldmVsIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gLWxldmVsOworICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAxOworICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IGxldmVsOworICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAwOworICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgfQorICAgICAgICBydW4gPSBtNHZfZW5jX2NseihtYXRjaCk7CisgICAgfQorICAgIG1hdGNoID0gYml0bWFwenpbMV07CisgICAgcnVuID0gbTR2X2VuY19jbHoobWF0Y2gpOworCisgICAgd2hpbGUgKHJ1biA8IDMyKQorICAgIHsKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3YgICAlMCwgIzB4ODAwMDAwMDBcblx0IgorICAgICAgICAgICAgICAgICAgICAgIm1vdiAgICUwLCAlMCwgbHNyICUxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJiaWMgICAlMiwgJTIsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlMSwgJTEsICMzMlxuXHQiCisgICAgICAgICAgICAgICAgICAgICAibW92ICAgJTEsICUxLCBsc2wgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgImxkcnNoICUzLCBbJTYsICUxXVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAic3RyaCAgJTUsIFslNiwgJTFdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlNCwgJTQsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJyc2IgICAlMSwgJTQsICUxLCBsc3IgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgImFkZCAgICU0LCAlNCwgJTEiCisgICAgICAgICAgICAgOiAiK3IiKGVuZCksICIrciIocnVuKSwgIityIihtYXRjaCksICIrciIobGV2ZWwpLCAiK3IiKGopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHp6b3JkZXIpLCAiciIoZGF0YUJsb2NrKSk7CisgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSBsZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgcnVuID0gbTR2X2VuY19jbHoobWF0Y2gpOworICAgIH0KKworICAgIHJldHVybiBpZHg7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLy8gX1ZMQ19FTkNPREVfSU5MSU5FX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdm9wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZvcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwNzZjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZvcC5jcHAKQEAgLTAsMCArMSw1ODEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW1faW8uaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCitQVl9TVEFUVVMgRW5jb2RlU2hvcnRIZWFkZXIoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgVm9wICpjdXJyVm9wKTsKK1BWX1NUQVRVUyBFbmNvZGVWT1BIZWFkZXIoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgVm9sICpjdXJyVm9sLCBWb3AgKmN1cnJWb3ApOworUFZfU1RBVFVTIEVuY29kZUdPVkhlYWRlcihCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBVSW50IHNlY29uZHMpOworCitQVl9TVEFUVVMgRW5jb2RlVm9wX0JYUkMoVmlkZW9FbmNEYXRhICp2aWRlbyk7CitQVl9TVEFUVVMgRW5jb2RlVm9wX05vTUUoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGVjb2RlVm9wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBWT1AgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlVm9wKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKy8vICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtPXZpZGVvLT5iaXRzdHJlYW0xOworICAgIFVDaGFyICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICByYXRlQ29udHJvbCAqKnJjID0gdmlkZW8tPnJjOworLy8gIFVJbnQgdGltZT0wOworCisgICAgLyoqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBtb2RlICovCisgICAgLyoqKioqKioqKioqKioqKioqKiovCisKKyAgICBzd2l0Y2ggKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBJX1ZPUDoKKyAgICAgICAgICAgIE00VkVOQ19NRU1TRVQoTW9kZSwgTU9ERV9JTlRSQSwgc2l6ZW9mKFVDaGFyKSpjdXJyVm9sLT5uVG90YWxNQik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1ZPUDoKKyAgICAgICAgICAgIE00VkVOQ19NRU1TRVQoTW9kZSwgTU9ERV9JTlRFUiwgc2l6ZW9mKFVDaGFyKSpjdXJyVm9sLT5uVG90YWxNQik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCX1ZPUDoKKyAgICAgICAgICAgIC8qTTRWRU5DX01FTVNFVChNb2RlLCBNT0RFX0lOVEVSX0Isc2l6ZW9mKFVDaGFyKSpuVG90YWxNQik7Ki8KKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBNb3Rpb24gRXN0aW1hdGlvbiAqLworICAgIC8qIGNvbXB1dGUgTVZzLCBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uLCBlZGdlIHBhZGRpbmcsICovCisgICAgLyogaW50cmEgcmVmcmVzaCwgY29tcHV0ZSBibG9jayBhY3Rpdml0eSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKiovCisgICAgTW90aW9uRXN0aW1hdGlvbih2aWRlbyk7ICAgIC8qIGRvIE1FIGZvciB0aGUgd2hvbGUgZnJhbWUgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogcmF0ZSBDb250cm9sIChhc3NpZ24gUVApICovCisgICAgLyogNC8xMS8wMSwgY2xlYW4tdXAsIGFuZCBwdXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBzdGF0dXMgPSBSQ19Wb3BRUFNldHRpbmcodmlkZW8sIHJjKTsKKyAgICBpZiAoc3RhdHVzID09IFBWX0ZBSUwpCisgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgIEVuY29kZSBWT1AgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHZpZGVvLT5zbGljZV9jb2RpbmcpIC8qIGVuZCBoZXJlICovCisgICAgeworICAgICAgICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlIGZvciBzbGljZS1iYXNlZCBBUElzICovCisgICAgICAgIHZpZGVvLT50b3RhbFNBRCA9IDA7CisgICAgICAgIHZpZGVvLT5tYm51bSA9IDA7CisgICAgICAgIHZpZGVvLT5zbGljZU5vWzBdID0gMDsKKyAgICAgICAgdmlkZW8tPm51bUludHJhID0gMDsKKyAgICAgICAgdmlkZW8tPm9mZnNldCA9IDA7CisgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMDsKKyAgICAgICAgdmlkZW8tPmhwX2d1ZXNzID0gLTE7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gRW5jb2RlVm9wX05vTUUodmlkZW8pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiByYXRlIGNvbnRyb2wgKHVwZGF0ZSBzdGF0KSAqLworICAgIC8qIDYvMi8wMSBzZXBhcmF0ZSBmdW5jdGlvbiAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBSQ19Wb3BVcGRhdGVTdGF0KHZpZGVvLCByY1tjdXJyTGF5ZXJdKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlVm9wX05vTUUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOC8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlVm9wIHdpdGhvdXQgbW90aW9uIGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgRW5jb2RlVm9wX05vTUUoVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBJbnQgdGltZSA9IDA7ICAgLyogZm9sbG93cyBFbmNvZGVWb3AgdmFsdWUgKi8KKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBWaWRlbyBIZWFkZXIgPSAxICovCisgICAgeworCisgICAgICAgIHN0YXR1cyA9IEVuY29kZVNob3J0SGVhZGVyKHN0cmVhbSwgY3VyclZvcCk7IC8qIEVuY29kZSBTaG9ydCBIZWFkZXIgKi8KKworICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3Moc3RyZWFtKTsgLyogSGVhZGVyIEJpdHMgKi8KKworICAgICAgICBzdGF0dXMgPSBFbmNvZGVGcmFtZUNvbWJpbmVkTW9kZSh2aWRlbyk7CisKKyAgICB9CisjaWZuZGVmIEgyNjNfT05MWQorICAgIGVsc2UgICAgLyogU2hvcnQgVmlkZW8gSGVhZGVyID0gMCAqLworICAgIHsKKworICAgICAgICBpZiAoY3VyclZvbC0+R09WU3RhcnQgJiYgY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVHT1ZIZWFkZXIoc3RyZWFtLCB0aW1lKTsgLyogRW5jb2RlIEdPViBIZWFkZXIgKi8KKworICAgICAgICBzdGF0dXMgPSBFbmNvZGVWT1BIZWFkZXIoc3RyZWFtLCBjdXJyVm9sLCBjdXJyVm9wKTsgIC8qIEVuY29kZSBWT1AgSGVhZGVyICovCisKKyAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzID0gQml0c3RyZWFtR2V0UG9zKHN0cmVhbSk7IC8qIEhlYWRlciBCaXRzICovCisKKyAgICAgICAgaWYgKGN1cnJWb3AtPnZvcENvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWN1cnJWb2wtPnNjYWxhYmlsaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlRnJhbWVEYXRhUGFydE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgRGF0YSBQYXJ0aXRpb25pbmcgTW9kZSBWT1AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlRnJhbWVDb21iaW5lZE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgQ29tYmluZWQgTW9kZSBWT1AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlRnJhbWVDb21iaW5lZE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgQ29tYmluZWQgTW9kZSBWT1AgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBWb3AgTm90IGNvZGVkICovCisgICAgICAgIHsKKworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVNsaWNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTkvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGlzdG9yeSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBvbmUgc2xpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEVuY29kZVNsaWNlKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtMTsgLyogZGlmZmVyZW50IGZyb20gZnJhbWUtYmFzZWQgKi8KKyAgICBJbnQgdGltZSA9IDA7ICAgLyogZm9sbG93cyBFbmNvZGVWb3AgdmFsdWUgKi8KKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICByYXRlQ29udHJvbCAqKnJjID0gdmlkZW8tPnJjOworCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpIC8qIFNob3J0IFZpZGVvIEhlYWRlciA9IDEgKi8KKyAgICB7CisKKyAgICAgICAgaWYgKHZpZGVvLT5tYm51bSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTaG9ydEhlYWRlcihzdHJlYW0sIGN1cnJWb3ApOyAvKiBFbmNvZGUgU2hvcnQgSGVhZGVyICovCisKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyA9IEJpdHN0cmVhbUdldFBvcyhzdHJlYW0pOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUodmlkZW8pOworCisgICAgfQorI2lmbmRlZiBIMjYzX09OTFkKKyAgICBlbHNlICAgIC8qIFNob3J0IFZpZGVvIEhlYWRlciA9IDAgKi8KKyAgICB7CisKKyAgICAgICAgaWYgKHZpZGVvLT5tYm51bSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VyclZvbC0+R09WU3RhcnQpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlR09WSGVhZGVyKHN0cmVhbSwgdGltZSk7IC8qIEVuY29kZSBHT1YgSGVhZGVyICovCisKKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVZPUEhlYWRlcihzdHJlYW0sIGN1cnJWb2wsIGN1cnJWb3ApOyAgLyogRW5jb2RlIFZPUCBIZWFkZXIgKi8KKworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzID0gQml0c3RyZWFtR2V0UG9zKHN0cmVhbSk7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyclZvcC0+dm9wQ29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY3VyclZvbC0+c2NhbGFiaWxpdHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmRhdGFQYXJ0aXRpb25pbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTbGljZURhdGFQYXJ0TW9kZSh2aWRlbyk7IC8qIEVuY29kZSBEYXRhIFBhcnRpdGlvbmluZyBNb2RlIFZPUCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTbGljZUNvbWJpbmVkTW9kZSh2aWRlbyk7IC8qIEVuY29kZSBDb21iaW5lZCBNb2RlIFZPUCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTbGljZUNvbWJpbmVkTW9kZSh2aWRlbyk7IC8qIEVuY29kZSBDb21iaW5lZCBNb2RlIFZPUCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIFZvcCBOb3QgY29kZWQgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworICAgIGlmICh2aWRlby0+bWJudW0gPj0gY3VyclZvbC0+blRvdGFsTUIgJiYgc3RhdHVzICE9IFBWX0VORF9PRl9CVUYpIC8qIGVuZCBvZiBWb3AgKi8KKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHJhdGUgY29udHJvbCAodXBkYXRlIHN0YXQpICovCisgICAgICAgIC8qIDYvMi8wMSBzZXBhcmF0ZSBmdW5jdGlvbiAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIHN0YXR1cyA9IFJDX1ZvcFVwZGF0ZVN0YXQodmlkZW8sIHJjW2N1cnJMYXllcl0pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7CisKK30KKyNlbmRpZiAvKiBOT19TTElDRV9FTkNPREUgKi8KKworI2lmbmRlZiBIMjYzX09OTFkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlR09WSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBHT1YgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlR09WSGVhZGVyKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIFVJbnQgc2Vjb25kcykKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworLy8gIGludCB0ZW1wOworICAgIFVJbnQgdG1wdmFyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEdyb3VwX29mX1ZpZGVvT2JqZWN0UGxhbmUoKSAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBHUk9VUF9TVEFSVF9DT0RFKTsKKyAgICAvKiB0aW1lX2NvZGUgKi8KKyAgICB0bXB2YXIgPSBzZWNvbmRzIC8gMzYwMDsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgdG1wdmFyKTsgLyogSG91cnMqLworCisgICAgdG1wdmFyID0gKHNlY29uZHMgLSB0bXB2YXIgKiAzNjAwKSAvIDYwOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA2LCB0bXB2YXIpOyAvKiBNaW51dGVzKi8KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIE1hcmtlciovCisKKyAgICB0bXB2YXIgPSBzZWNvbmRzICUgNjA7CisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDYsIHRtcHZhcik7IC8qIFNlY29uZHMqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsgLyogY2xvc2VkX2dvdiAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIGJyb2tlbl9saW5rICovCisgICAgLyp0ZW1wID0qLworICAgIEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoc3RyZWFtKTsgLyogQnl0ZSBhbGlnbiBHT1YgSGVhZGVyICovCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQUxMT1dfVk9QX05PVF9DT0RFRAorCitQVl9TVEFUVVMgRW5jb2RlVm9wTm90Q29kZWQoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmJzdHJlYW0sIEludCAqc2l6ZSwgVUxvbmcgbW9kVGltZSkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbMF07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSA9IGN1cnJWb2wtPnN0cmVhbTsKKyAgICBVSW50IGZyYW1lVGljazsKKyAgICBJbnQgdGltZUluYzsKKworICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnN0cmVhbTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICBCaXRzdHJlYW1FbmNSZXNldChzdHJlYW0pOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAzMiwgVk9QX1NUQVJUX0NPREUpOyAvKlN0YXJ0IENvZGUgZm9yIFZPUCovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIFBfVk9QKTsvKiBWT1AgQ29kaW5nIFR5cGUqLworCisgICAgZnJhbWVUaWNrID0gKEludCkoKChkb3VibGUpKG1vZFRpbWUgLSB2aWRlby0+bW9kVGltZVJlZikgKiBjdXJyVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiArIDUwMCkgLyAxMDAwKTsKKyAgICB0aW1lSW5jID0gZnJhbWVUaWNrIC0gdmlkZW8tPnJlZlRpY2tbMF07CisgICAgd2hpbGUgKHRpbWVJbmMgPj0gY3VyclZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24pCisgICAgeworICAgICAgICB0aW1lSW5jIC09IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDEpOworICAgICAgICAvKiBkbyBub3QgdXBkYXRlIHJlZlRpY2sgYW5kIG1vZFRpbWVSZWYgeWV0LCBkbyBpdCBhZnRlciBlbmNvZGluZyEhICovCisgICAgfQorICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsgLyogbWFya2VyIGJpdCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCBjdXJyVm9sLT5uYml0c1RpbWVJbmNSZXMsIHRpbWVJbmMpOyAvKiB2b3BfdGltZV9pbmNyZW1lbnQgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDEpOyAvKiBtYXJrZXIgYml0ICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAwKTsgLyogdm9wX2NvZGVkIGJpdCAqLworICAgIEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoc3RyZWFtKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVWT1BIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIFZPUCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEVuY29kZVZPUEhlYWRlcihCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBWb2wgKmN1cnJWb2wsIFZvcCAqY3VyclZvcCkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIC8vaW50IHRlbXA7CisKKyAgICBpbnQgTVRCID0gY3VyclZvbC0+bW9kdWxvVGltZUJhc2U7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBWaWRlb09iamVjdFBsYW5lKCkgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBWT1BfU1RBUlRfQ09ERSk7IC8qU3RhcnQgQ29kZSBmb3IgVk9QKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMiwgY3VyclZvcC0+cHJlZGljdGlvblR5cGUpOy8qIFZPUCBDb2RpbmcgVHlwZSovCisKKyAgICBjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2UgPSBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZTsKKworICAgIHdoaWxlIChNVEIpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDEpOworICAgICAgICBNVEItLTsKKyAgICB9CisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAwKTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIG1hcmtlciBiaXQgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgY3VyclZvbC0+bmJpdHNUaW1lSW5jUmVzLCBjdXJyVm9wLT50aW1lSW5jKTsgLyogdm9wX3RpbWVfaW5jcmVtZW50ICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsgLyogbWFya2VyIGJpdCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvcC0+dm9wQ29kZWQpOyAvKiB2b3BfY29kZWQgYml0ICovCisgICAgaWYgKGN1cnJWb3AtPnZvcENvZGVkID09IDApCisgICAgeworICAgICAgICAvKnRlbXAgPSovCisgICAgICAgIEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoc3RyZWFtKTsgLyogQnl0ZSBhbGlnbiBWT1AgSGVhZGVyICovCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9wLT5yb3VuZGluZ1R5cGUpOyAvKiB2b3Bfcm91bmRpbmdfdHlwZSAqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIGN1cnJWb3AtPmludHJhRENWbGNUaHIpOyAvKiBpbnRyYV9kY192bGNfdGhyICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb3AtPnF1YW50aXplcik7ICAgLyogdm9wX3F1YW50ICovCisKKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgIT0gSV9WT1ApCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCBjdXJyVm9wLT5mY29kZUZvcndhcmQpOyAvKiB2b3BfZmNvZGVfZm9yd2FyZCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBCX1ZPUCkKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQpOy8qIHZvcF9mY29kZV9iYWNrd2FyZCAqLworCisgICAgaWYgKGN1cnJWb2wtPnNjYWxhYmlsaXR5KQorICAgICAgICAvKiBlbmhhbmNlbWVudF90eXBlID0gMCAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMiwgY3VyclZvcC0+cmVmU2VsZWN0Q29kZSk7IC8qIHJlZl9zZWxlY3RfY29kZSAqLworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlU2hvcnRIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBWT1AgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBFbmNvZGVTaG9ydEhlYWRlcihCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBWb3AgKmN1cnJWb3ApCit7CisKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAyMiwgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSKTsgLyogU2hvcnRfdmlkZW9fc3RhcnRfbWFya2VyICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIGN1cnJWb3AtPnRlbXBvcmFsUmVmKTsgLyogdGVtcG9yYWxfcmVmZXJlbmNlICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsgLyogbWFya2VyIGJpdCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIHplcm8gYml0ICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAwKTsgLyogc3BsaXRfc2NyZWVuX2luZGljYXRvcj0wKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOyAvKiBkb2N1bWVudF9jYW1lcmFfaW5kaWNhdG9yPTAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIGZ1bGxfcGljdHVyZV9mcmVlemVfcmVsZWFzZT0wKi8KKworICAgIHN3aXRjaCAoY3VyclZvcC0+d2lkdGgpCisgICAgeworICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5oZWlnaHQgPT0gOTYpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIDEpOyAvKiBzb3VyY2VfZm9ybWF0ID0gMSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTc2OgorICAgICAgICAgICAgaWYgKGN1cnJWb3AtPmhlaWdodCA9PSAxNDQpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIDIpOyAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzUyOgorICAgICAgICAgICAgaWYgKGN1cnJWb3AtPmhlaWdodCA9PSAyODgpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIDMpOyAvKiBzb3VyY2VfZm9ybWF0ID0gMyAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNzA0OgorICAgICAgICAgICAgaWYgKGN1cnJWb3AtPmhlaWdodCA9PSA1NzYpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIDQpOyAvKiBzb3VyY2VfZm9ybWF0ID0gNCAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTQwODoKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5oZWlnaHQgPT0gMTE1MikKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMywgNSk7IC8qIHNvdXJjZV9mb3JtYXQgPSA1ICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSk7IC8qIHBpY3R1cmVfY29kaW5nIHR5cGUgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgMCk7IC8qIGZvdXJfcmVzZXJ2ZWRfemVyb19iaXRzICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb3AtPnF1YW50aXplcik7IC8qIHZvcF9xdWFudCovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAwKTsgLyogemVyb19iaXQqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIHBlaT0wICovCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjaWZuZGVmIEgyNjNfT05MWQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVWaWRlb1BhY2tldEhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA5LzA1LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhpc3RvcnkgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgYSBmcmFtZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gQ29tYmluZWQgbW9kZS4gICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAwNC8yNS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBBZGQgYml0c3RyZWFtIHN0cnVjdHVyZSBhcyBpbnB1dCBhcmd1bWVudCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlVmlkZW9QYWNrZXRIZWFkZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgaW50IE1CX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbnRfc2NhbGUsIEludCBpbnNlcnQpCit7CisvLyAgUFZfU1RBVFVTIHN0YXR1cz1QVl9TVUNDRVNTOworICAgIGludCBmY29kZTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgdG1wOworICAgIFVDaGFyIGJ1ZmZlclszMF07CisKKyAgICBpZiAoaW5zZXJ0KSAvKiBpbnNlcnQgcGFja2V0IGhlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJzMSAqLworICAgIHsKKyAgICAgICAgdG1wLmJpdHN0cmVhbUJ1ZmZlciA9IGJ1ZmZlcjsgLyogdXNlIHRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICAgICAgdG1wLmJ1ZmZlclNpemUgPSAzMDsKKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoJnRtcCk7CisgICAgICAgIGJzID0gJnRtcDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBicyA9IHZpZGVvLT5iaXRzdHJlYW0xOworCisKKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzLCAxNywgMSk7ICAgIC8qIHJlc3luY19tYXJrZXIgSV9WT1AgKi8KKyAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICB7CisgICAgICAgIGZjb2RlID0gY3VyclZvcC0+ZmNvZGVGb3J3YXJkOworICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhicywgMTYgKyBmY29kZSwgMSk7ICAgIC8qIHJlc3luY19tYXJrZXIgUF9WT1AgKi8KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmY29kZSA9IGN1cnJWb3AtPmZjb2RlRm9yd2FyZDsKKyAgICAgICAgaWYgKGN1cnJWb3AtPmZjb2RlQmFja3dhcmQgPiBmY29kZSkKKyAgICAgICAgICAgIGZjb2RlID0gY3VyclZvcC0+ZmNvZGVCYWNrd2FyZDsKKyAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMsIDE2ICsgZmNvZGUsIDEpOyAgICAvKiByZXN5bmNfbWFya2VyIEJfVk9QICovCisgICAgfQorCisgICAgQml0c3RyZWFtUHV0Qml0cyhicywgY3VyclZvbC0+bkJpdHNGb3JNQklELCBNQl9udW1iZXIpOyAvKiByZXN5bmNfbWFya2VyICovCisgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNSwgcXVhbnRfc2NhbGUpOyAvKiBxdWFudF9zY2FsZSAqLworICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCAwKTsgLyogaGVhZGVyX2V4dGVuc2lvbl9jb2RlID0gMCAqLworCisgICAgaWYgKDApIC8qIGhlYWRlcl9leHRlbnNpb25fY29kZSA9IDEgKi8KKyAgICB7CisgICAgICAgIC8qIE5FRUQgbW9kdWxvX3RpbWVfYmFzZSBjb2RlIGhlcmUgLi4uIGRlZmF1bHQgMHgwMSAgYmVsbyovCisgICAgICAgIC8qc3RhdHVzID0qLworICAgICAgICBCaXRzdHJlYW1QdXQxQml0cyhicywgMSk7CisgICAgICAgIC8qc3RhdHVzID0gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMsIDApOworCisgICAgICAgIC8qc3RhdHVzID0gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMsIDEpOyAvKiBtYXJrZXIgYml0ICovCisgICAgICAgIC8qc3RhdHVzID0gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgY3VyclZvbC0+bmJpdHNUaW1lSW5jUmVzLCBjdXJyVm9wLT50aW1lSW5jKTsgLyogdm9wX3RpbWVfaW5jcmVtZW50ICovCisgICAgICAgIC8qc3RhdHVzID0gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMsIDEpOyAvKiBtYXJrZXIgYml0ICovCisKKyAgICAgICAgLypzdGF0dXMgPSAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCAyLCBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSk7LyogVk9QIENvZGluZyBUeXBlKi8KKworICAgICAgICAvKnN0YXR1cyA9ICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDMsIGN1cnJWb3AtPmludHJhRENWbGNUaHIpOyAvKiBpbnRyYV9kY192bGNfdGhyICovCisKKyAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlICE9IElfVk9QKQorICAgICAgICAgICAgLypzdGF0dXMgPSAqLyBCaXRzdHJlYW1QdXRCaXRzKGJzLCAzLCBjdXJyVm9wLT5mY29kZUZvcndhcmQpOworICAgICAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gQl9WT1ApCisgICAgICAgICAgICAvKnN0YXR1cyA9ICovIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDMsIGN1cnJWb3AtPmZjb2RlQmFja3dhcmQpOworICAgIH0KKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCisgICAgaWYgKGluc2VydCkKKyAgICAgICAgQml0c3RyZWFtUHJlcGVuZFBhY2tldCh2aWRlby0+Yml0c3RyZWFtMSwgYnMpOworI2VuZGlmCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTVAzRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwCmluZGV4IGVmY2I0NzYuLjU5ZGQ3NDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTVAzRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NUDNEZWNvZGVyLmNwcApAQCAtMjcsMTMgKzI3LDM1IEBACiAKIE1QM0RlY29kZXI6Ok1QM0RlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCiAgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTnVtQ2hhbm5lbHMoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCiAgICAgICBtQ29uZmlnKG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwpLAogICAgICAgbURlY29kZXJCdWYoTlVMTCksCiAgICAgICBtQW5jaG9yVGltZVVzKDApLAotICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCisgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAogICAgICAgbUlucHV0QnVmZmVyKE5VTEwpIHsKKyAgICBpbml0KCk7Cit9CisKK3ZvaWQgTVAzRGVjb2Rlcjo6aW5pdCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiTVAzRGVjb2RlciIpOwogfQogCiBNUDNEZWNvZGVyOjp+TVAzRGVjb2RlcigpIHsKQEAgLTYyLDcgKzg0LDcgQEAKICAgICBtU291cmNlLT5zdGFydCgpOwogCiAgICAgbUFuY2hvclRpbWVVcyA9IDA7Ci0gICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAogICAgIHJldHVybiBPSzsKQEAgLTkwLDI2ICsxMTIsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gTVAzRGVjb2Rlcjo6Z2V0Rm9ybWF0KCkgewotICAgIHNwPE1ldGFEYXRhPiBzcmNGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiTVAzRGVjb2RlciIpOwotCi0gICAgcmV0dXJuIG1ldGE7CisgICAgcmV0dXJuIG1NZXRhOwogfQogCiBzdGF0dXNfdCBNUDNEZWNvZGVyOjpyZWFkKApAQCAtMTE5LDE1ICsxMjIsMjAgQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKIAotICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwogCiAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKICAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2Vla1RpbWVVcyA9IC0xOwogICAgIH0KQEAgLTE0Miw3ICsxNTAsNyBAQAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBhIG5ldyB0aW1lc3RhbXAgYWZ0ZXIgc2Vla2luZy4KICAgICAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPCAwKTsKQEAgLTE3OSw3ICsxODcsNyBAQAogCiAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAogICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlci0+ZGF0YSgpLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUpOworICAgICAgICBtZW1zZXQoYnVmZmVyLT5kYXRhKCksIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgfQogCkBAIC0xOTgsOSArMjA2LDkgQEAKICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgIGtLZXlUaW1lLAogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMCkgLyBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7CiAKLSAgICBtTnVtU2FtcGxlc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBzaXplb2YoaW50MTZfdCk7CisgICAgbU51bUZyYW1lc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBtTnVtQ2hhbm5lbHM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCmluZGV4IDM1YjY0NzUuLjI4NmM2MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCkBAIC00MCw3ICs0MCw3IEBACiAgICAgaW50MzIgeHJbIF0sICAgICAgICAgICAgICAgIHJlc2NhbGVkIGRhdGEKICAgICBzdHJ1Y3QgZ3JfaW5mb19zICpncl9pbmZvLCAgZ3JhbnVsZSBzdHJ1Y3R1cmUKICAgICBtcDNIZWFkZXIgKmluZm8sICAgICAgICAgICAgbXAzIGhlYWRlciBpbmZvCi0gICAgaW50MzIgIFNjcmF0Y2hfbWVtWzE2OF0gICAgIGZvciB0ZW1wb3JhcnkgdXNhZ2UKKyAgICBpbnQzMiAgU2NyYXRjaF9tZW1bMTk4XSAgICAgZm9yIHRlbXBvcmFyeSB1c2FnZQogCiAgT3V0cHV0czoKIApAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgZ3JhbnVsZUluZm8gKmdyX2luZm8sCiAgICAgICAgICAgICAgICAgICAgaW50MzIgICp1c2VkX2ZyZXFfbGluZXMsCiAgICAgICAgICAgICAgICAgICAgbXAzSGVhZGVyICppbmZvLAotICAgICAgICAgICAgICAgICAgIGludDMyICBTY3JhdGNoX21lbVsxNjhdKQorICAgICAgICAgICAgICAgICAgIGludDMyICBTY3JhdGNoX21lbVsxOThdKQogewogICAgIGludDMyIHNmcmVxID0gIGluZm8tPnZlcnNpb25feCArIChpbmZvLT52ZXJzaW9uX3ggPDwgMSk7CiAgICAgc2ZyZXEgKz0gaW5mby0+c2FtcGxpbmdfZnJlcXVlbmN5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oCmluZGV4IGJhNmVjMTYuLjUyNDg5NTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmgKQEAgLTg5LDcgKzg5LDcgQEAKICAgICBncmFudWxlSW5mbyAqZ3JfaW5mbywKICAgICBpbnQzMiAqdXNlZF9mcmVxX2xpbmVzLAogICAgIG1wM0hlYWRlciAqaW5mbywKLSAgICBpbnQzMiAgU2NyYXRjaF9tZW1bMTY4XSk7CisgICAgaW50MzIgIFNjcmF0Y2hfbWVtWzE5OF0pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfZmlsZS5oCmluZGV4IDgwNWNlZGIuLjYxMWUwOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2ZpbGUuaApAQCAtODcsNyArODcsNyBAQAogICAgICAgICBpbnQzMiAgICAgICAgICAgbnVtX2NoYW5uZWxzOwogICAgICAgICBpbnQzMiAgICAgICAgICAgcHJlZGljdGVkX2ZyYW1lX3NpemU7CiAgICAgICAgIGludDMyICAgICAgICAgICBmcmFtZV9zdGFydDsKLSAgICAgICAgaW50MzIgICAgICAgICAgIFNjcmF0Y2hfbWVtWzE2OF07CisgICAgICAgIGludDMyICAgICAgICAgICBTY3JhdGNoX21lbVsxOThdOwogICAgICAgICB0bXAzZGVjX2NoYW4gICAgcGVyQ2hhbltDSEFOXTsKICAgICAgICAgbXAzU2NhbGVGYWN0b3JzIHNjYWxlRmFjdG9yc1tDSEFOXTsKICAgICAgICAgbXAzU2lkZUluZm8gICAgIHNpZGVJbmZvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDMxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY5ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgVlBYRGVjb2Rlci5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3ZweGRlYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4IFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfY29kZWMgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9wb3J0cworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9WUFhEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1ZQWERlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzMxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9WUFhEZWNvZGVyLmNwcApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVlBYRGVjb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlZQWERlY29kZXIuaCIKKworI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVlBYRGVjb2Rlcjo6VlBYRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1CdWZmZXJTaXplKDApLAorICAgICAgbUN0eChOVUxMKSwKKyAgICAgIG1CdWZmZXJHcm91cChOVUxMKSwKKyAgICAgIG1UYXJnZXRUaW1lVXMoLTEpIHsKKyAgICBzcDxNZXRhRGF0YT4gaW5wdXRGb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUFgpKTsKKworICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVdpZHRoKSk7CisgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOworCisgICAgbUJ1ZmZlclNpemUgPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKworICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIlZQWERlY29kZXIiKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtRm9ybWF0LT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgIH0KK30KKworVlBYRGVjb2Rlcjo6flZQWERlY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZQWERlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICopIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZ2cHhfY29kZWNfdnA4X2R4X2FsZ28sIE5VTEwsIDApKSkgeworICAgICAgICBMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIHZweF9lcnIpOworCisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1CdWZmZXJTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtQnVmZmVyU2l6ZSkpOworCisgICAgbVRhcmdldFRpbWVVcyA9IC0xOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBWUFhEZWNvZGVyOjpzdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOworCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3koKHZweF9jb2RlY19jdHhfdCAqKW1DdHgpOworICAgIGRlbGV0ZSAodnB4X2NvZGVjX2N0eF90ICopbUN0eDsKKyAgICBtQ3R4ID0gTlVMTDsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBWUFhEZWNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Gb3JtYXQ7Cit9CisKK3N0YXR1c190IFZQWERlY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICpvdXQgPSBOVUxMOworCisgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgc2Vla2luZyA9IHRydWU7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXIgKmlucHV0OworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmlucHV0LCBvcHRpb25zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBMT0dWKCJyZWFkICVkIGJ5dGVzIGZyb20gc291cmNlXG4iLCBpbnB1dC0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgaWYgKHNlZWtpbmcpIHsKKyAgICAgICAgaW50NjRfdCB0YXJnZXRUaW1lVXM7CisgICAgICAgIGlmIChpbnB1dC0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgJnRhcmdldFRpbWVVcykKKyAgICAgICAgICAgICAgICAmJiB0YXJnZXRUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LAorICAgICAgICAgICAgICAgICh1aW50OF90ICopaW5wdXQtPmRhdGEoKSArIGlucHV0LT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICBpbnB1dC0+cmFuZ2VfbGVuZ3RoKCksCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICBMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOworICAgICAgICBpbnB1dC0+cmVsZWFzZSgpOworICAgICAgICBpbnB1dCA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgTE9HVigic3VjY2Vzc2Z1bGx5IGRlY29kZWQgMSBvciBtb3JlIGZyYW1lcy4iKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGlucHV0LT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICBpbnB1dC0+cmVsZWFzZSgpOworICAgIGlucHV0ID0gTlVMTDsKKworICAgIGJvb2wgc2tpcEZyYW1lID0gZmFsc2U7CisKKyAgICBpZiAobVRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgIENIRUNLKHRpbWVVcyA8PSBtVGFyZ2V0VGltZVVzKTsKKworICAgICAgICBpZiAodGltZVVzIDwgbVRhcmdldFRpbWVVcykgeworICAgICAgICAgICAgLy8gV2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGZyYW1lIHdpdGggdGhlIG1hdGNoaW5nCisgICAgICAgICAgICAvLyB0aW1lc3RhbXAgYW5kIHdlIHdvbid0IHJldHVybiB0aGUgY3VycmVudCBvbmUuCisgICAgICAgICAgICBza2lwRnJhbWUgPSB0cnVlOworCisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyBmcmFtZSBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoImZvdW5kIHRhcmdldCBmcmFtZSBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNraXBGcmFtZSkgeworICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOworCisgICAgaWYgKGltZyA9PSBOVUxMKSB7CisgICAgICAgIExPR0koIm9uMiBkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgZnJhbWUuIik7CisKKyAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIENIRUNLX0VRKGltZy0+Zm10LCBJTUdfRk1UX0k0MjApOworCisgICAgaW50MzJfdCB3aWR0aCA9IGltZy0+ZF93OworICAgIGludDMyX3QgaGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICBpZiAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIExPR0koIkltYWdlIGRpbWVuc2lvbnMgY2hhbmdlZCwgd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWQiLAorICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICBtQnVmZmVyU2l6ZSA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworICAgICAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgICAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtQnVmZmVyU2l6ZSkpOworICAgICAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1CdWZmZXJTaXplKSk7CisKKyAgICAgICAgcmV0dXJuIElORk9fRk9STUFUX0NIQU5HRUQ7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXIgKm91dHB1dDsKKyAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRwdXQpLCBPSyk7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9ZXTsKKyAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW91dHB1dC0+ZGF0YSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2g7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyk7CisKKyAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9ZXTsKKyAgICAgICAgZHN0ICs9IGltZy0+ZF93OworICAgIH0KKworICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1VdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1VdOworICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgIH0KKworICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1ZdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ZdOworICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgIH0KKworICAgIG91dHB1dC0+c2V0X3JhbmdlKDAsICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMik7CisKKyAgICBvdXRwdXQtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICpvdXQgPSBvdXRwdXQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1ZvcmJpc0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKaW5kZXggZGYzZjE2YS4uZTE0ZmI5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZvcmJpc0RlY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJWb3JiaXNEZWNvZGVyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CkBAIC0xMDgsNiArMTEyLDEyIEBACiAKICAgICBtQW5jaG9yVGltZVVzID0gMDsKICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKworICAgIC8vIElmIHRoZSBzb3VyY2UgbmV2ZXIgbGltaXRzIHRoZSBudW1iZXIgb2YgdmFsaWQgZnJhbWVzIGNvbnRhaW5lZAorICAgIC8vIGluIHRoZSBpbnB1dCBkYXRhLCB3ZSdsbCBhc3N1bWUgdGhhdCBhbGwgb2YgdGhlIGRlY29kZWQgZnJhbWVzIGFyZQorICAgIC8vIHZhbGlkLgorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xODgsNiArMTk4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIExPR1YoImRpc2NhcmRpbmcgJWQgZnJhbWVzIGF0IGVuZCBvZiBwYWdlIiwKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgLT0gbnVtRnJhbWVzOworICAgIH0KKwogICAgIG91dC0+c2V0X3JhbmdlKDAsIG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscyk7CiAKICAgICByZXR1cm4gbnVtRnJhbWVzOwpAQCAtMjAwLDcgKzIxOSw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CkBAIC0yMjUsNiArMjQ1LDEzIEBACiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPCAwKTsKICAgICB9CiAKKyAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgIGlmIChpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CisgICAgICAgIENIRUNLKG51bVBhZ2VTYW1wbGVzID49IDApOworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VTYW1wbGVzOworICAgIH0KKwogICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXI7CiAgICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0cHV0QnVmZmVyKSwgT0spOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCmluZGV4IGI5YmExYmUuLjBkY2JkNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCkBAIC02LDcgKzYsNyBAQAogICAgICAgICBTb2Z0d2FyZVJlbmRlcmVyLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCBlNzQ3ODJmLi41YjE2OTk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTQyLDYgKzQyLDcgQEAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC03MSw2ICs3MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzcmNCaXRzLCBzcmNTa2lwLCBkc3RCaXRzLCBkc3RTa2lwKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3JjQml0cywgc3JjU2tpcCwgZHN0Qml0cywgZHN0U2tpcCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4gVW5rbm93biBjb2xvciBjb252ZXJzaW9uLiIpOwpAQCAtMjc5LDYgKzI4NSw2OCBAQAogICAgIH0KIH0KIAordm9pZCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFNlbWlQbGFuYXIoCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywgc2l6ZV90IHNyY1NraXAsCisgICAgICAgIHZvaWQgKmRzdEJpdHMsIHNpemVfdCBkc3RTa2lwKSB7CisgICAgQ0hFQ0tfRVEoc3JjU2tpcCwgMCk7ICAvLyBEb2Vzbid0IHJlYWxseSBtYWtlIHNlbnNlIGZvciBZVVYgZm9ybWF0cy4KKyAgICBDSEVDSyhkc3RTa2lwID49IHdpZHRoICogMik7CisgICAgQ0hFQ0soKGRzdFNraXAgJiAzKSA9PSAwKTsKKworICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOworCisgICAgdWludDMyX3QgKmRzdF9wdHIgPSAodWludDMyX3QgKilkc3RCaXRzOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNCaXRzOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgd2lkdGggKiBoZWlnaHQ7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIDE2OworICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfeVt4ICsgMV0gLSAxNjsKKworICAgICAgICAgICAgc2lnbmVkIHYgPSAoc2lnbmVkKXNyY191W3ggJiB+MV0gLSAxMjg7CisgICAgICAgICAgICBzaWduZWQgdSA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyAxXSAtIDEyODsKKworICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7CisgICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7CisgICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7CisgICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKKworICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCBiMSA9ICh0bXAxICsgdV9iKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCBnMSA9ICh0bXAxICsgdl9nICsgdV9nKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDI1NjsKKworICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIDI5ODsKKyAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKKworICAgICAgICAgICAgdWludDMyX3QgcmdiMSA9CisgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMV0gPj4gMikgPDwgNSkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IxXSA+PiAzKTsKKworICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9CisgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKTsKKworICAgICAgICAgICAgZHN0X3B0clt4IC8gMl0gPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICB9CisKKyAgICAgICAgc3JjX3kgKz0gd2lkdGg7CisKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICBzcmNfdSArPSB3aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdF9wdHIgKz0gZHN0U2tpcCAvIDQ7CisgICAgfQorfQorCiB1aW50OF90ICpDb2xvckNvbnZlcnRlcjo6aW5pdENsaXAoKSB7CiAgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1pbiA9IC0yNzg7CiAgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1heCA9IDUzNTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCBhNmRiZjY5Li44NmFkODViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0zMCw3ICszMCw4IEBACiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAogICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKKyAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQsCisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKQogICAgIDogbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKICAgICAgIG1Db252ZXJ0ZXIoY29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSksCiAgICAgICBtSVN1cmZhY2Uoc3VyZmFjZSksCkBAIC01NiwxMCArNTcsMjAgQEAKICAgICBDSEVDSyhtTWVtb3J5SGVhcC0+aGVhcElEKCkgPj0gMCk7CiAgICAgQ0hFQ0sobUNvbnZlcnRlci5pc1ZhbGlkKCkpOwogCisgICAgdWludDMyX3Qgb3JpZW50YXRpb247CisgICAgc3dpdGNoIChyb3RhdGlvbkRlZ3JlZXMpIHsKKyAgICAgICAgY2FzZSAwOiBvcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMDsgYnJlYWs7CisgICAgICAgIGNhc2UgOTA6IG9yaWVudGF0aW9uID0gSVN1cmZhY2U6OkJ1ZmZlckhlYXA6OlJPVF85MDsgYnJlYWs7CisgICAgICAgIGNhc2UgMTgwOiBvcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMTgwOyBicmVhazsKKyAgICAgICAgY2FzZSAyNzA6IG9yaWVudGF0aW9uID0gSVN1cmZhY2U6OkJ1ZmZlckhlYXA6OlJPVF8yNzA7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBvcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMDsgYnJlYWs7CisgICAgfQorCiAgICAgSVN1cmZhY2U6OkJ1ZmZlckhlYXAgYnVmZmVySGVhcCgKICAgICAgICAgICAgIG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCiAgICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzU2NSwKKyAgICAgICAgICAgIG9yaWVudGF0aW9uLCAwLAogICAgICAgICAgICAgbU1lbW9yeUhlYXApOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbUlTdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVySGVhcCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiOWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUF0b21pemVyLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQUF0b21pemVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitBQXRvbWl6ZXIgQUF0b21pemVyOjpnQXRvbWl6ZXI7CisKKy8vIHN0YXRpYworY29uc3QgY2hhciAqQUF0b21pemVyOjpBdG9taXplKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICByZXR1cm4gZ0F0b21pemVyLmF0b21pemUobmFtZSk7Cit9CisKK0FBdG9taXplcjo6QUF0b21pemVyKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI4OyArK2kpIHsKKyAgICAgICAgbUF0b21zLnB1c2goTGlzdDxBU3RyaW5nPigpKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKkFBdG9taXplcjo6YXRvbWl6ZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGNvbnN0IHNpemVfdCBuID0gbUF0b21zLnNpemUoKTsKKyAgICBzaXplX3QgaW5kZXggPSBBQXRvbWl6ZXI6Okhhc2gobmFtZSkgJSBuOworICAgIExpc3Q8QVN0cmluZz4gJmVudHJ5ID0gbUF0b21zLmVkaXRJdGVtQXQoaW5kZXgpOworICAgIExpc3Q8QVN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZW50cnkuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gZW50cnkuZW5kKCkpIHsKKyAgICAgICAgaWYgKCgqaXQpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKml0KS5jX3N0cigpOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgZW50cnkucHVzaF9iYWNrKEFTdHJpbmcobmFtZSkpOworCisgICAgcmV0dXJuICgqLS1lbnRyeS5lbmQoKSkuY19zdHIoKTsKK30KKworLy8gc3RhdGljCit1aW50MzJfdCBBQXRvbWl6ZXI6Okhhc2goY29uc3QgY2hhciAqcykgeworICAgIHVpbnQzMl90IHN1bSA9IDA7CisgICAgd2hpbGUgKCpzICE9ICdcMCcpIHsKKyAgICAgICAgc3VtID0gKHN1bSAqIDMxKSArICpzOworICAgICAgICArK3M7CisgICAgfQorCisgICAgcmV0dXJuIHN1bTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzhkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQUJpdFJlYWRlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBQml0UmVhZGVyOjpBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbURhdGEoZGF0YSksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SZXNlcnZvaXIoMCksCisgICAgICBtTnVtQml0c0xlZnQoMCkgeworfQorCit2b2lkIEFCaXRSZWFkZXI6OmZpbGxSZXNlcnZvaXIoKSB7CisgICAgQ0hFQ0tfR1QobVNpemUsIDB1KTsKKworICAgIG1SZXNlcnZvaXIgPSAwOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IG1TaXplID4gMCAmJiBpIDwgNDsgKytpKSB7CisgICAgICAgIG1SZXNlcnZvaXIgPSAobVJlc2Vydm9pciA8PCA4KSB8ICptRGF0YTsKKworICAgICAgICArK21EYXRhOworICAgICAgICAtLW1TaXplOworICAgIH0KKworICAgIG1OdW1CaXRzTGVmdCA9IDggKiBpOworICAgIG1SZXNlcnZvaXIgPDw9IDMyIC0gbU51bUJpdHNMZWZ0OworfQorCit1aW50MzJfdCBBQml0UmVhZGVyOjpnZXRCaXRzKHNpemVfdCBuKSB7CisgICAgQ0hFQ0tfTEUobiwgMzJ1KTsKKworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgIGlmIChtTnVtQml0c0xlZnQgPT0gMCkgeworICAgICAgICAgICAgZmlsbFJlc2Vydm9pcigpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG0gPSBuOworICAgICAgICBpZiAobSA+IG1OdW1CaXRzTGVmdCkgeworICAgICAgICAgICAgbSA9IG1OdW1CaXRzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgbSkgfCAobVJlc2Vydm9pciA+PiAoMzIgLSBtKSk7CisgICAgICAgIG1SZXNlcnZvaXIgPDw9IG07CisgICAgICAgIG1OdW1CaXRzTGVmdCAtPSBtOworCisgICAgICAgIG4gLT0gbTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFCaXRSZWFkZXI6OnNraXBCaXRzKHNpemVfdCBuKSB7CisgICAgd2hpbGUgKG4gPiAzMikgeworICAgICAgICBnZXRCaXRzKDMyKTsKKyAgICAgICAgbiAtPSAzMjsKKyAgICB9CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZ2V0Qml0cyhuKTsKKyAgICB9Cit9CisKK3ZvaWQgQUJpdFJlYWRlcjo6cHV0Qml0cyh1aW50MzJfdCB4LCBzaXplX3QgbikgeworICAgIENIRUNLX0xFKG1OdW1CaXRzTGVmdCArIG4sIDMydSk7CisKKyAgICBtUmVzZXJ2b2lyID0gKG1SZXNlcnZvaXIgPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7CisgICAgbU51bUJpdHNMZWZ0ICs9IG47Cit9CisKK3NpemVfdCBBQml0UmVhZGVyOjpudW1CaXRzTGVmdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemUgKiA4ICsgbU51bUJpdHNMZWZ0OworfQorCitjb25zdCB1aW50OF90ICpBQml0UmVhZGVyOjpkYXRhKCkgY29uc3QgeworICAgIENIRUNLX0VRKG1OdW1CaXRzTGVmdCAlIDgsIDB1KTsKKworICAgIHJldHVybiBtRGF0YSAtIG1OdW1CaXRzTGVmdCAvIDg7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTczZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFCdWZmZXIuaCIKKworI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFMb29wZXIuaCIKKyNpbmNsdWRlICJBTWVzc2FnZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FCdWZmZXI6OkFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQorICAgIDogbURhdGEobWFsbG9jKGNhcGFjaXR5KSksCisgICAgICBtQ2FwYWNpdHkoY2FwYWNpdHkpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKGNhcGFjaXR5KSwKKyAgICAgIG1JbnQzMkRhdGEoMCksCisgICAgICBtT3duc0RhdGEodHJ1ZSkgeworfQorCitBQnVmZmVyOjpBQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKKyAgICA6IG1EYXRhKGRhdGEpLAorICAgICAgbUNhcGFjaXR5KGNhcGFjaXR5KSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChjYXBhY2l0eSksCisgICAgICBtSW50MzJEYXRhKDApLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSB7Cit9CisKK0FCdWZmZXI6On5BQnVmZmVyKCkgeworICAgIGlmIChtT3duc0RhdGEpIHsKKyAgICAgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICAgICAgbURhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1GYXJld2VsbCAhPSBOVUxMKSB7CisgICAgICAgIG1GYXJld2VsbC0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBBQnVmZmVyOjpzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLX0xFKG9mZnNldCwgbUNhcGFjaXR5KTsKKyAgICBDSEVDS19MRShvZmZzZXQgKyBzaXplLCBtQ2FwYWNpdHkpOworCisgICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1SYW5nZUxlbmd0aCA9IHNpemU7Cit9CisKK3ZvaWQgQUJ1ZmZlcjo6c2V0RmFyZXdlbGxNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBtRmFyZXdlbGwgPSBtc2c7Cit9CisKK3NwPEFNZXNzYWdlPiBBQnVmZmVyOjptZXRhKCkgeworICAgIGlmIChtTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIG1NZXRhID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbU1ldGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1ZjdlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIYW5kbGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8QUxvb3Blcj4gQUhhbmRsZXI6Omxvb3BlcigpIHsKKyAgICBleHRlcm4gQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOworCisgICAgcmV0dXJuIGdMb29wZXJSb3N0ZXIuZmluZExvb3BlcihpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDg3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBTG9vcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgIkFMb29wZXIuaCIKKworI2luY2x1ZGUgIkFIYW5kbGVyLmgiCisjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgorI2luY2x1ZGUgIkFNZXNzYWdlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOworCitzdHJ1Y3QgQUxvb3Blcjo6TG9vcGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgTG9vcGVyVGhyZWFkKEFMb29wZXIgKmxvb3BlciwgYm9vbCBjYW5DYWxsSmF2YSkKKyAgICAgICAgOiBUaHJlYWQoY2FuQ2FsbEphdmEpLAorICAgICAgICAgIG1Mb29wZXIobG9vcGVyKSB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHJldHVybiBtTG9vcGVyLT5sb29wKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TG9vcGVyVGhyZWFkKCkge30KKworcHJpdmF0ZToKKyAgICBBTG9vcGVyICptTG9vcGVyOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9vcGVyVGhyZWFkKTsKK307CisKKy8vIHN0YXRpYworaW50NjRfdCBBTG9vcGVyOjpHZXROb3dVcygpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworICAgIHJldHVybiAoaW50NjRfdCl0di50dl9zZWMgKiAxMDAwMDAwbGwgKyB0di50dl91c2VjOworfQorCitBTG9vcGVyOjpBTG9vcGVyKCkKKyAgICA6IG1SdW5uaW5nTG9jYWxseShmYWxzZSkgeworfQorCitBTG9vcGVyOjp+QUxvb3BlcigpIHsKKyAgICBzdG9wKCk7Cit9CisKK3ZvaWQgQUxvb3Blcjo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgbU5hbWUgPSBuYW1lOworfQorCitBTG9vcGVyOjpoYW5kbGVyX2lkIEFMb29wZXI6OnJlZ2lzdGVySGFuZGxlcihjb25zdCBzcDxBSGFuZGxlcj4gJmhhbmRsZXIpIHsKKyAgICByZXR1cm4gZ0xvb3BlclJvc3Rlci5yZWdpc3RlckhhbmRsZXIodGhpcywgaGFuZGxlcik7Cit9CisKK3ZvaWQgQUxvb3Blcjo6dW5yZWdpc3RlckhhbmRsZXIoaGFuZGxlcl9pZCBoYW5kbGVySUQpIHsKKyAgICBnTG9vcGVyUm9zdGVyLnVucmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXJJRCk7Cit9CisKK3N0YXR1c190IEFMb29wZXI6OnN0YXJ0KAorICAgICAgICBib29sIHJ1bk9uQ2FsbGluZ1RocmVhZCwgYm9vbCBjYW5DYWxsSmF2YSwgaW50MzJfdCBwcmlvcml0eSkgeworICAgIGlmIChydW5PbkNhbGxpbmdUaHJlYWQpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgaWYgKG1UaHJlYWQgIT0gTlVMTCB8fCBtUnVubmluZ0xvY2FsbHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SdW5uaW5nTG9jYWxseSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKGxvb3AoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVRocmVhZCAhPSBOVUxMIHx8IG1SdW5uaW5nTG9jYWxseSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVRocmVhZCA9IG5ldyBMb29wZXJUaHJlYWQodGhpcywgY2FuQ2FsbEphdmEpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVRocmVhZC0+cnVuKAorICAgICAgICAgICAgbU5hbWUuZW1wdHkoKSA/ICJBTG9vcGVyIiA6IG1OYW1lLmNfc3RyKCksIHByaW9yaXR5KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBTG9vcGVyOjpzdG9wKCkgeworICAgIHNwPExvb3BlclRocmVhZD4gdGhyZWFkOworICAgIGJvb2wgcnVubmluZ0xvY2FsbHk7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgdGhyZWFkID0gbVRocmVhZDsKKyAgICAgICAgcnVubmluZ0xvY2FsbHkgPSBtUnVubmluZ0xvY2FsbHk7CisgICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgbVJ1bm5pbmdMb2NhbGx5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRocmVhZCA9PSBOVUxMICYmICFydW5uaW5nTG9jYWxseSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKHRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHRocmVhZC0+cmVxdWVzdEV4aXQoKTsKKyAgICB9CisKKyAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgaWYgKCFydW5uaW5nTG9jYWxseSkgeworICAgICAgICB0aHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBTG9vcGVyOjpwb3N0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCB3aGVuVXM7CisgICAgaWYgKGRlbGF5VXMgPiAwKSB7CisgICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCkgKyBkZWxheVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCk7CisgICAgfQorCisgICAgTGlzdDxFdmVudD46Oml0ZXJhdG9yIGl0ID0gbUV2ZW50UXVldWUuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUV2ZW50UXVldWUuZW5kKCkgJiYgKCppdCkubVdoZW5VcyA8PSB3aGVuVXMpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisKKyAgICBFdmVudCBldmVudDsKKyAgICBldmVudC5tV2hlblVzID0gd2hlblVzOworICAgIGV2ZW50Lm1NZXNzYWdlID0gbXNnOworCisgICAgaWYgKGl0ID09IG1FdmVudFF1ZXVlLmJlZ2luKCkpIHsKKyAgICAgICAgbVF1ZXVlQ2hhbmdlZENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9CisKKyAgICBtRXZlbnRRdWV1ZS5pbnNlcnQoaXQsIGV2ZW50KTsKK30KKworYm9vbCBBTG9vcGVyOjpsb29wKCkgeworICAgIEV2ZW50IGV2ZW50OworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobVRocmVhZCA9PSBOVUxMICYmICFtUnVubmluZ0xvY2FsbHkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVF1ZXVlQ2hhbmdlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludDY0X3Qgd2hlblVzID0gKCptRXZlbnRRdWV1ZS5iZWdpbigpKS5tV2hlblVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gR2V0Tm93VXMoKTsKKworICAgICAgICBpZiAod2hlblVzID4gbm93VXMpIHsKKyAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHdoZW5VcyAtIG5vd1VzOworICAgICAgICAgICAgbVF1ZXVlQ2hhbmdlZENvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIGRlbGF5VXMgKiAxMDAwbGwpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50ID0gKm1FdmVudFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1FdmVudFF1ZXVlLmVyYXNlKG1FdmVudFF1ZXVlLmJlZ2luKCkpOworICAgIH0KKworICAgIGdMb29wZXJSb3N0ZXIuZGVsaXZlck1lc3NhZ2UoZXZlbnQubU1lc3NhZ2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWExYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUxvb3BlclJvc3RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFMb29wZXJSb3N0ZXIuaCIKKworI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFIYW5kbGVyLmgiCisjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTG9vcGVyUm9zdGVyOjpBTG9vcGVyUm9zdGVyKCkKKyAgICA6IG1OZXh0SGFuZGxlcklEKDEpIHsKK30KKworQUxvb3Blcjo6aGFuZGxlcl9pZCBBTG9vcGVyUm9zdGVyOjpyZWdpc3RlckhhbmRsZXIoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+IGxvb3BlciwgY29uc3Qgc3A8QUhhbmRsZXI+ICZoYW5kbGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChoYW5kbGVyLT5pZCgpICE9IDApIHsKKyAgICAgICAgQ0hFQ0soISJBIGhhbmRsZXIgbXVzdCBvbmx5IGJlIHJlZ2lzdGVyZWQgb25jZS4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEhhbmRsZXJJbmZvIGluZm87CisgICAgaW5mby5tTG9vcGVyID0gbG9vcGVyOworICAgIGluZm8ubUhhbmRsZXIgPSBoYW5kbGVyOworICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEID0gbU5leHRIYW5kbGVySUQrKzsKKyAgICBtSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCwgaW5mbyk7CisKKyAgICBoYW5kbGVyLT5zZXRJRChoYW5kbGVySUQpOworCisgICAgcmV0dXJuIGhhbmRsZXJJRDsKK30KKwordm9pZCBBTG9vcGVyUm9zdGVyOjp1bnJlZ2lzdGVySGFuZGxlcihBTG9vcGVyOjpoYW5kbGVyX2lkIGhhbmRsZXJJRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUhhbmRsZXJzLmluZGV4T2ZLZXkoaGFuZGxlcklEKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOworCisgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKKworICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlci0+c2V0SUQoMCk7CisgICAgfQorCisgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworfQorCit2b2lkIEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZS4gVGFyZ2V0IGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CisKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZS4gIgorICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciAlZCBzdGlsbCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIiwKKyAgICAgICAgICAgICBtc2ctPnRhcmdldCgpKTsKKworICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb29wZXItPnBvc3QobXNnLCBkZWxheVVzKTsKK30KKwordm9pZCBBTG9vcGVyUm9zdGVyOjpkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFIYW5kbGVyPiBoYW5kbGVyOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKKworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBMT0dXKCJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7CisKKyAgICAgICAgaWYgKGhhbmRsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVygiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZS4gIgorICAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCisgICAgICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOworCisgICAgICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoYW5kbGVyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworfQorCitzcDxBTG9vcGVyPiBBTG9vcGVyUm9zdGVyOjpmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShoYW5kbGVySUQpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCkubUxvb3Blci5wcm9tb3RlKCk7CisKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbG9vcGVyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmM2ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJBQXRvbWl6ZXIuaCIKKyNpbmNsdWRlICJBRGVidWcuaCIKKyNpbmNsdWRlICJBTG9vcGVyUm9zdGVyLmgiCisjaW5jbHVkZSAiQVN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FNZXNzYWdlOjpBTWVzc2FnZSh1aW50MzJfdCB3aGF0LCBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCkKKyAgICA6IG1XaGF0KHdoYXQpLAorICAgICAgbVRhcmdldCh0YXJnZXQpLAorICAgICAgbU51bUl0ZW1zKDApIHsKK30KKworQU1lc3NhZ2U6On5BTWVzc2FnZSgpIHsKKyAgICBjbGVhcigpOworfQorCit2b2lkIEFNZXNzYWdlOjpzZXRXaGF0KHVpbnQzMl90IHdoYXQpIHsKKyAgICBtV2hhdCA9IHdoYXQ7Cit9CisKK3VpbnQzMl90IEFNZXNzYWdlOjp3aGF0KCkgY29uc3QgeworICAgIHJldHVybiBtV2hhdDsKK30KKwordm9pZCBBTWVzc2FnZTo6c2V0VGFyZ2V0KEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7CisgICAgbVRhcmdldCA9IGhhbmRsZXJJRDsKK30KKworQUxvb3Blcjo6aGFuZGxlcl9pZCBBTWVzc2FnZTo6dGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiBtVGFyZ2V0OworfQorCit2b2lkIEFNZXNzYWdlOjpjbGVhcigpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CisgICAgICAgIEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICBmcmVlSXRlbShpdGVtKTsKKyAgICB9CisgICAgbU51bUl0ZW1zID0gMDsKK30KKwordm9pZCBBTWVzc2FnZTo6ZnJlZUl0ZW0oSXRlbSAqaXRlbSkgeworICAgIHN3aXRjaCAoaXRlbS0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBrVHlwZVN0cmluZzoKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlIGl0ZW0tPnUuc3RyaW5nVmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1R5cGVPYmplY3Q6CisgICAgICAgIGNhc2Uga1R5cGVNZXNzYWdlOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbS0+dS5yZWZWYWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+dS5yZWZWYWx1ZS0+ZGVjU3Ryb25nKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgbmFtZSA9IEFBdG9taXplcjo6QXRvbWl6ZShuYW1lKTsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG1OdW1JdGVtcyAmJiBtSXRlbXNbaV0ubU5hbWUgIT0gbmFtZSkgeworICAgICAgICArK2k7CisgICAgfQorCisgICAgSXRlbSAqaXRlbTsKKworICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CisgICAgICAgIGl0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICBmcmVlSXRlbShpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhtTnVtSXRlbXMgPCBrTWF4TnVtSXRlbXMpOworICAgICAgICBpID0gbU51bUl0ZW1zKys7CisgICAgICAgIGl0ZW0gPSAmbUl0ZW1zW2ldOworCisgICAgICAgIGl0ZW0tPm1OYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworY29uc3QgQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjpmaW5kSXRlbSgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgVHlwZSB0eXBlKSBjb25zdCB7CisgICAgbmFtZSA9IEFBdG9taXplcjo6QXRvbWl6ZShuYW1lKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKKyAgICAgICAgY29uc3QgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07CisKKyAgICAgICAgaWYgKGl0ZW0tPm1OYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtLT5tVHlwZSA9PSB0eXBlID8gaXRlbSA6IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBCQVNJQ19UWVBFKE5BTUUsRklFTEROQU1FLFRZUEVOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBBTWVzc2FnZTo6c2V0IyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FIHZhbHVlKSB7ICAgICAgICAgICAgXAorICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGl0ZW0tPm1UeXBlID0ga1R5cGUjI05BTUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGl0ZW0tPnUuRklFTEROQU1FID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYm9vbCBBTWVzc2FnZTo6ZmluZCMjTkFNRShjb25zdCBjaGFyICpuYW1lLCBUWVBFTkFNRSAqdmFsdWUpIGNvbnN0IHsgICAgXAorICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSBmaW5kSXRlbShuYW1lLCBrVHlwZSMjTkFNRSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpdGVtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqdmFsdWUgPSBpdGVtLT51LkZJRUxETkFNRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitCQVNJQ19UWVBFKEludDMyLGludDMyVmFsdWUsaW50MzJfdCkKK0JBU0lDX1RZUEUoSW50NjQsaW50NjRWYWx1ZSxpbnQ2NF90KQorQkFTSUNfVFlQRShTaXplLHNpemVWYWx1ZSxzaXplX3QpCitCQVNJQ19UWVBFKEZsb2F0LGZsb2F0VmFsdWUsZmxvYXQpCitCQVNJQ19UWVBFKERvdWJsZSxkb3VibGVWYWx1ZSxkb3VibGUpCitCQVNJQ19UWVBFKFBvaW50ZXIscHRyVmFsdWUsdm9pZCAqKQorCisjdW5kZWYgQkFTSUNfVFlQRQorCit2b2lkIEFNZXNzYWdlOjpzZXRTdHJpbmcoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbGVuKSB7CisgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKKyAgICBpdGVtLT5tVHlwZSA9IGtUeXBlU3RyaW5nOworICAgIGl0ZW0tPnUuc3RyaW5nVmFsdWUgPSBuZXcgQVN0cmluZyhzLCBsZW4gPCAwID8gc3RybGVuKHMpIDogbGVuKTsKK30KKwordm9pZCBBTWVzc2FnZTo6c2V0T2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmopIHsKKyAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOworICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVPYmplY3Q7CisKKyAgICBpZiAob2JqICE9IE5VTEwpIHsgb2JqLT5pbmNTdHJvbmcodGhpcyk7IH0KKyAgICBpdGVtLT51LnJlZlZhbHVlID0gb2JqLmdldCgpOworfQorCit2b2lkIEFNZXNzYWdlOjpzZXRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb2JqKSB7CisgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKKyAgICBpdGVtLT5tVHlwZSA9IGtUeXBlTWVzc2FnZTsKKworICAgIGlmIChvYmogIT0gTlVMTCkgeyBvYmotPmluY1N0cm9uZyh0aGlzKTsgfQorICAgIGl0ZW0tPnUucmVmVmFsdWUgPSBvYmouZ2V0KCk7Cit9CisKK2Jvb2wgQU1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKKyAgICBjb25zdCBJdGVtICppdGVtID0gZmluZEl0ZW0obmFtZSwga1R5cGVTdHJpbmcpOworICAgIGlmIChpdGVtKSB7CisgICAgICAgICp2YWx1ZSA9ICppdGVtLT51LnN0cmluZ1ZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFNZXNzYWdlOjpmaW5kT2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIHNwPFJlZkJhc2U+ICpvYmopIGNvbnN0IHsKKyAgICBjb25zdCBJdGVtICppdGVtID0gZmluZEl0ZW0obmFtZSwga1R5cGVPYmplY3QpOworICAgIGlmIChpdGVtKSB7CisgICAgICAgICpvYmogPSBpdGVtLT51LnJlZlZhbHVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFNZXNzYWdlOjpmaW5kTWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBzcDxBTWVzc2FnZT4gKm9iaikgY29uc3QgeworICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSBmaW5kSXRlbShuYW1lLCBrVHlwZU1lc3NhZ2UpOworICAgIGlmIChpdGVtKSB7CisgICAgICAgICpvYmogPSBzdGF0aWNfY2FzdDxBTWVzc2FnZSAqPihpdGVtLT51LnJlZlZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBTWVzc2FnZTo6cG9zdChpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBleHRlcm4gQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOworCisgICAgZ0xvb3BlclJvc3Rlci5wb3N0TWVzc2FnZSh0aGlzLCBkZWxheVVzKTsKK30KKworc3A8QU1lc3NhZ2U+IEFNZXNzYWdlOjpkdXAoKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShtV2hhdCwgbVRhcmdldCk7CisgICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CisgICAgICAgIGNvbnN0IEl0ZW0gKmZyb20gPSAmbUl0ZW1zW2ldOworICAgICAgICBJdGVtICp0byA9ICZtc2ctPm1JdGVtc1tpXTsKKworICAgICAgICB0by0+bU5hbWUgPSBmcm9tLT5tTmFtZTsKKyAgICAgICAgdG8tPm1UeXBlID0gZnJvbS0+bVR5cGU7CisKKyAgICAgICAgc3dpdGNoIChmcm9tLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBrVHlwZVN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0by0+dS5zdHJpbmdWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBU3RyaW5nKCpmcm9tLT51LnN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBrVHlwZU9iamVjdDoKKyAgICAgICAgICAgIGNhc2Uga1R5cGVNZXNzYWdlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvLT51LnJlZlZhbHVlID0gZnJvbS0+dS5yZWZWYWx1ZTsKKyAgICAgICAgICAgICAgICB0by0+dS5yZWZWYWx1ZS0+aW5jU3Ryb25nKG1zZy5nZXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG8tPnUgPSBmcm9tLT51OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1zZzsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kSW5kZW50KEFTdHJpbmcgKnMsIGludDMyX3QgaW5kZW50KSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9CisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisKKyAgICBDSEVDS19MVCgoc2l6ZV90KWluZGVudCwgc2l6ZW9mKGtXaGl0ZXNwYWNlKSk7CisKKyAgICBzLT5hcHBlbmQoa1doaXRlc3BhY2UsIGluZGVudCk7Cit9CisKK3N0YXRpYyBib29sIGlzRm91cmNjKHVpbnQzMl90IHdoYXQpIHsKKyAgICByZXR1cm4gaXNwcmludCh3aGF0ICYgMHhmZikKKyAgICAgICAgJiYgaXNwcmludCgod2hhdCA+PiA4KSAmIDB4ZmYpCisgICAgICAgICYmIGlzcHJpbnQoKHdoYXQgPj4gMTYpICYgMHhmZikKKyAgICAgICAgJiYgaXNwcmludCgod2hhdCA+PiAyNCkgJiAweGZmKTsKK30KKworQVN0cmluZyBBTWVzc2FnZTo6ZGVidWdTdHJpbmcoaW50MzJfdCBpbmRlbnQpIGNvbnN0IHsKKyAgICBBU3RyaW5nIHMgPSAiQU1lc3NhZ2Uod2hhdCA9ICI7CisKKyAgICBBU3RyaW5nIHRtcDsKKyAgICBpZiAoaXNGb3VyY2MobVdoYXQpKSB7CisgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJyVjJWMlYyVjJyIsCisgICAgICAgICAgICAgICAgKGNoYXIpKG1XaGF0ID4+IDI0KSwKKyAgICAgICAgICAgICAgICAoY2hhcikoKG1XaGF0ID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgIChjaGFyKSgobVdoYXQgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAoY2hhcikobVdoYXQgJiAweGZmKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCIweCUwOHgiLCBtV2hhdCk7CisgICAgfQorICAgIHMuYXBwZW5kKHRtcCk7CisKKyAgICBpZiAobVRhcmdldCAhPSAwKSB7CisgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiLCB0YXJnZXQgPSAlZCIsIG1UYXJnZXQpOworICAgICAgICBzLmFwcGVuZCh0bXApOworICAgIH0KKyAgICBzLmFwcGVuZCgiKSA9IHtcbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgICAgICBjb25zdCBJdGVtICZpdGVtID0gbUl0ZW1zW2ldOworCisgICAgICAgIHN3aXRjaCAoaXRlbS5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBrVHlwZUludDMyOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQzMl90ICVzID0gJWQiLCBpdGVtLm1OYW1lLCBpdGVtLnUuaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImludDY0X3QgJXMgPSAlbGxkIiwgaXRlbS5tTmFtZSwgaXRlbS51LmludDY0VmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZVNpemU6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemVfdCAlcyA9ICVkIiwgaXRlbS5tTmFtZSwgaXRlbS51LnNpemVWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0ICVzID0gJWYiLCBpdGVtLm1OYW1lLCBpdGVtLnUuZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUgJXMgPSAlZiIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5kb3VibGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlUG9pbnRlcjoKKyAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAidm9pZCAqJXMgPSAlcCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5wdHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgJXMgPSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udS5zdHJpbmdWYWx1ZS0+Y19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlT2JqZWN0OgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWZCYXNlIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgaXRlbS51LnJlZlZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVNZXNzYWdlOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJBTWVzc2FnZSAlcyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTWVzc2FnZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnUucmVmVmFsdWUpLT5kZWJ1Z1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgc3RybGVuKGl0ZW0ubU5hbWUpICsgMTQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisKKyAgICAgICAgYXBwZW5kSW5kZW50KCZzLCBpbmRlbnQpOworICAgICAgICBzLmFwcGVuZCgiICAiKTsKKyAgICAgICAgcy5hcHBlbmQodG1wKTsKKyAgICAgICAgcy5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgYXBwZW5kSW5kZW50KCZzLCBpbmRlbnQpOworICAgIHMuYXBwZW5kKCJ9Iik7CisKKyAgICByZXR1cm4gczsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjc2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFTdHJpbmcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKkFTdHJpbmc6OmtFbXB0eVN0cmluZyA9ICIiOworCitBU3RyaW5nOjpBU3RyaW5nKCkKKyAgICA6IG1EYXRhKChjaGFyICopa0VtcHR5U3RyaW5nKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUFsbG9jU2l6ZSgxKSB7Cit9CisKK0FTdHJpbmc6OkFTdHJpbmcoY29uc3QgY2hhciAqcykKKyAgICA6IG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKKyAgICBzZXRUbyhzKTsKK30KKworQVN0cmluZzo6QVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKKyAgICBzZXRUbyhzLCBzaXplKTsKK30KKworQVN0cmluZzo6QVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tKQorICAgIDogbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1BbGxvY1NpemUoMSkgeworICAgIHNldFRvKGZyb20sIDAsIGZyb20uc2l6ZSgpKTsKK30KKworQVN0cmluZzo6QVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbikKKyAgICA6IG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKKyAgICBzZXRUbyhmcm9tLCBvZmZzZXQsIG4pOworfQorCitBU3RyaW5nOjp+QVN0cmluZygpIHsKKyAgICBjbGVhcigpOworfQorCitBU3RyaW5nICZBU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQVN0cmluZyAmZnJvbSkgeworICAgIGlmICgmZnJvbSAhPSB0aGlzKSB7CisgICAgICAgIHNldFRvKGZyb20sIDAsIGZyb20uc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NpemVfdCBBU3RyaW5nOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZTsKK30KKworY29uc3QgY2hhciAqQVN0cmluZzo6Y19zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitib29sIEFTdHJpbmc6OmVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZSA9PSAwOworfQorCit2b2lkIEFTdHJpbmc6OnNldFRvKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBzZXRUbyhzLCBzdHJsZW4ocykpOworfQorCit2b2lkIEFTdHJpbmc6OnNldFRvKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplKSB7CisgICAgY2xlYXIoKTsKKyAgICBhcHBlbmQocywgc2l6ZSk7Cit9CisKK3ZvaWQgQVN0cmluZzo6c2V0VG8oY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pIHsKKyAgICBDSEVDSygmZnJvbSAhPSB0aGlzKTsKKworICAgIGNsZWFyKCk7CisgICAgc2V0VG8oZnJvbS5tRGF0YSArIG9mZnNldCwgbik7Cit9CisKK3ZvaWQgQVN0cmluZzo6Y2xlYXIoKSB7CisgICAgaWYgKG1EYXRhICYmIG1EYXRhICE9IGtFbXB0eVN0cmluZykgeworICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgbURhdGEgPSBOVUxMOworICAgIH0KKworICAgIG1EYXRhID0gKGNoYXIgKilrRW1wdHlTdHJpbmc7CisgICAgbVNpemUgPSAwOworICAgIG1BbGxvY1NpemUgPSAxOworfQorCitzaXplX3QgQVN0cmluZzo6aGFzaCgpIGNvbnN0IHsKKyAgICBzaXplX3QgeCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2l6ZTsgKytpKSB7CisgICAgICAgIHggPSAoeCAqIDMxKSArIG1EYXRhW2ldOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCitib29sIEFTdHJpbmc6Om9wZXJhdG9yPT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemUgPT0gb3RoZXIubVNpemUgJiYgIW1lbWNtcChtRGF0YSwgb3RoZXIubURhdGEsIG1TaXplKTsKK30KKwordm9pZCBBU3RyaW5nOjp0cmltKCkgeworICAgIG1ha2VNdXRhYmxlKCk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBtU2l6ZSAmJiBpc3NwYWNlKG1EYXRhW2ldKSkgeworICAgICAgICArK2k7CisgICAgfQorCisgICAgc2l6ZV90IGogPSBtU2l6ZTsKKyAgICB3aGlsZSAoaiA+IGkgJiYgaXNzcGFjZShtRGF0YVtqIC0gMV0pKSB7CisgICAgICAgIC0tajsKKyAgICB9CisKKyAgICBtZW1tb3ZlKG1EYXRhLCAmbURhdGFbaV0sIGogLSBpKTsKKyAgICBtU2l6ZSA9IGogLSBpOworICAgIG1EYXRhW21TaXplXSA9ICdcMCc7Cit9CisKK3ZvaWQgQVN0cmluZzo6ZXJhc2Uoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbikgeworICAgIENIRUNLX0xUKHN0YXJ0LCBtU2l6ZSk7CisgICAgQ0hFQ0tfTEUoc3RhcnQgKyBuLCBtU2l6ZSk7CisKKyAgICBtYWtlTXV0YWJsZSgpOworCisgICAgbWVtbW92ZSgmbURhdGFbc3RhcnRdLCAmbURhdGFbc3RhcnQgKyBuXSwgbVNpemUgLSBzdGFydCAtIG4pOworICAgIG1TaXplIC09IG47CisgICAgbURhdGFbbVNpemVdID0gJ1wwJzsKK30KKwordm9pZCBBU3RyaW5nOjptYWtlTXV0YWJsZSgpIHsKKyAgICBpZiAobURhdGEgPT0ga0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG1EYXRhID0gc3RyZHVwKGtFbXB0eVN0cmluZyk7CisgICAgfQorfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZChjb25zdCBjaGFyICpzKSB7CisgICAgYXBwZW5kKHMsIHN0cmxlbihzKSk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplKSB7CisgICAgbWFrZU11dGFibGUoKTsKKworICAgIGlmIChtU2l6ZSArIHNpemUgKyAxID4gbUFsbG9jU2l6ZSkgeworICAgICAgICBtQWxsb2NTaXplID0gKG1BbGxvY1NpemUgKyBzaXplICsgMzEpICYgLTMyOworICAgICAgICBtRGF0YSA9IChjaGFyICopcmVhbGxvYyhtRGF0YSwgbUFsbG9jU2l6ZSk7CisgICAgICAgIENIRUNLKG1EYXRhICE9IE5VTEwpOworICAgIH0KKworICAgIG1lbWNweSgmbURhdGFbbVNpemVdLCBzLCBzaXplKTsKKyAgICBtU2l6ZSArPSBzaXplOworICAgIG1EYXRhW21TaXplXSA9ICdcMCc7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGNvbnN0IEFTdHJpbmcgJmZyb20pIHsKKyAgICBhcHBlbmQoZnJvbS5jX3N0cigpLCBmcm9tLnNpemUoKSk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBuKSB7CisgICAgYXBwZW5kKGZyb20uY19zdHIoKSArIG9mZnNldCwgbik7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGludCB4KSB7CisgICAgY2hhciBzWzE2XTsKKyAgICBzcHJpbnRmKHMsICIlZCIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCB4KSB7CisgICAgY2hhciBzWzE2XTsKKyAgICBzcHJpbnRmKHMsICIldSIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZChsb25nIHgpIHsKKyAgICBjaGFyIHNbMTZdOworICAgIHNwcmludGYocywgIiVsZCIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIHgpIHsKKyAgICBjaGFyIHNbMTZdOworICAgIHNwcmludGYocywgIiVsdSIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZChsb25nIGxvbmcgeCkgeworICAgIGNoYXIgc1szMl07CisgICAgc3ByaW50ZihzLCAiJWxsZCIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIGxvbmcgeCkgeworICAgIGNoYXIgc1szMl07CisgICAgc3ByaW50ZihzLCAiJWxsdSIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZChmbG9hdCB4KSB7CisgICAgY2hhciBzWzE2XTsKKyAgICBzcHJpbnRmKHMsICIlZiIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZChkb3VibGUgeCkgeworICAgIGNoYXIgc1sxNl07CisgICAgc3ByaW50ZihzLCAiJWYiLCB4KTsKKworICAgIGFwcGVuZChzKTsKK30KKwordm9pZCBBU3RyaW5nOjphcHBlbmQodm9pZCAqeCkgeworICAgIGNoYXIgc1sxNl07CisgICAgc3ByaW50ZihzLCAiJXAiLCB4KTsKKworICAgIGFwcGVuZChzKTsKK30KKworc3NpemVfdCBBU3RyaW5nOjpmaW5kKGNvbnN0IGNoYXIgKnN1YnN0cmluZywgc2l6ZV90IHN0YXJ0KSBjb25zdCB7CisgICAgQ0hFQ0tfTEUoc3RhcnQsIHNpemUoKSk7CisKKyAgICBjb25zdCBjaGFyICptYXRjaCA9IHN0cnN0cihtRGF0YSArIHN0YXJ0LCBzdWJzdHJpbmcpOworCisgICAgaWYgKG1hdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBtYXRjaCAtIG1EYXRhOworfQorCit2b2lkIEFTdHJpbmc6Omluc2VydChjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3QgaW5zZXJ0aW9uUG9zKSB7CisgICAgaW5zZXJ0KGZyb20uY19zdHIoKSwgZnJvbS5zaXplKCksIGluc2VydGlvblBvcyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6aW5zZXJ0KGNvbnN0IGNoYXIgKmZyb20sIHNpemVfdCBzaXplLCBzaXplX3QgaW5zZXJ0aW9uUG9zKSB7CisgICAgQ0hFQ0tfR0UoaW5zZXJ0aW9uUG9zLCAwdSk7CisgICAgQ0hFQ0tfTEUoaW5zZXJ0aW9uUG9zLCBtU2l6ZSk7CisKKyAgICBtYWtlTXV0YWJsZSgpOworCisgICAgaWYgKG1TaXplICsgc2l6ZSArIDEgPiBtQWxsb2NTaXplKSB7CisgICAgICAgIG1BbGxvY1NpemUgPSAobUFsbG9jU2l6ZSArIHNpemUgKyAzMSkgJiAtMzI7CisgICAgICAgIG1EYXRhID0gKGNoYXIgKilyZWFsbG9jKG1EYXRhLCBtQWxsb2NTaXplKTsKKyAgICAgICAgQ0hFQ0sobURhdGEgIT0gTlVMTCk7CisgICAgfQorCisgICAgbWVtbW92ZSgmbURhdGFbaW5zZXJ0aW9uUG9zICsgc2l6ZV0sCisgICAgICAgICAgICAmbURhdGFbaW5zZXJ0aW9uUG9zXSwgbVNpemUgLSBpbnNlcnRpb25Qb3MgKyAxKTsKKworICAgIG1lbWNweSgmbURhdGFbaW5zZXJ0aW9uUG9zXSwgZnJvbSwgc2l6ZSk7CisKKyAgICBtU2l6ZSArPSBzaXplOworfQorCitib29sIEFTdHJpbmc6Om9wZXJhdG9yPChjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlKG90aGVyKSA8IDA7Cit9CisKK2Jvb2wgQVN0cmluZzo6b3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUob3RoZXIpID4gMDsKK30KKworaW50IEFTdHJpbmc6OmNvbXBhcmUoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY21wKG1EYXRhLCBvdGhlci5tRGF0YSk7Cit9CisKK3ZvaWQgQVN0cmluZzo6dG9sb3dlcigpIHsKKyAgICBtYWtlTXV0YWJsZSgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2l6ZTsgKytpKSB7CisgICAgICAgIG1EYXRhW2ldID0gOjp0b2xvd2VyKG1EYXRhW2ldKTsKKyAgICB9Cit9CisKK2Jvb2wgQVN0cmluZzo6c3RhcnRzV2l0aChjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXN0cm5jbXAobURhdGEsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitBU3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisKKyAgICBjaGFyICpidWZmZXI7CisgICAgdmFzcHJpbnRmKCZidWZmZXIsIGZvcm1hdCwgYXApOworCisgICAgdmFfZW5kKGFwKTsKKworICAgIEFTdHJpbmcgcmVzdWx0KGJ1ZmZlcik7CisKKyAgICBmcmVlKGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE3ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgIEFBdG9taXplci5jcHAgICAgICAgICAgICAgICBcCisgICAgQUJpdFJlYWRlci5jcHAgICAgICAgICAgICAgIFwKKyAgICBBQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgXAorICAgIEFIYW5kbGVyLmNwcCAgICAgICAgICAgICAgICBcCisgICAgQUxvb3Blci5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICBBTG9vcGVyUm9zdGVyLmNwcCAgICAgICAgICAgXAorICAgIEFNZXNzYWdlLmNwcCAgICAgICAgICAgICAgICBcCisgICAgQVN0cmluZy5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICBiYXNlNjQuY3BwICAgICAgICAgICAgICAgICAgXAorICAgIGhleGR1bXAuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGliYmluZGVyICAgICAgICAgXAorICAgICAgICBsaWJtZWRpYSAgICAgICAgICBcCisgICAgICAgIGxpYnV0aWxzICAgICAgICAgIFwKKyAgICAgICAgbGliY3V0aWxzICAgICAgICAgXAorICAgICAgICBsaWJ1aSAgICAgICAgICAgICBcCisgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKKyAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAorICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgICAgICBsaWJjYW1lcmFfY2xpZW50CisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmI0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYmFzZTY0LmgiCisKKyNpbmNsdWRlICJBQnVmZmVyLmgiCisjaW5jbHVkZSAiQURlYnVnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpIHsKKyAgICBpZiAoKHMuc2l6ZSgpICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaXplX3QgbiA9IHMuc2l6ZSgpOworICAgIHNpemVfdCBwYWRkaW5nID0gMDsKKyAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgICAgIHBhZGRpbmcgPSAxOworCisgICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG91dExlbiA9IDMgKiBzLnNpemUoKSAvIDQgLSBwYWRkaW5nOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuKTsKKworICAgIHVpbnQ4X3QgKm91dCA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBqID0gMDsKKyAgICB1aW50MzJfdCBhY2N1bSA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gMjYgKyBjIC0gJ2EnOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDUyICsgYyAtICcwJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MjsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICAgICAgdmFsdWUgPSA2MzsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGFjY3VtID0gKGFjY3VtIDw8IDYpIHwgdmFsdWU7CisKKyAgICAgICAgaWYgKCgoaSArIDEpICUgNCkgPT0gMCkgeworICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gMTYpOworCisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiA4KSAmIDB4ZmY7IH0gCisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IGFjY3VtICYgMHhmZjsgfQorCisgICAgICAgICAgICBhY2N1bSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgY2hhciBlbmNvZGU2Qml0KHVuc2lnbmVkIHgpIHsKKyAgICBpZiAoeCA8PSAyNSkgeworICAgICAgICByZXR1cm4gJ0EnICsgeDsKKyAgICB9IGVsc2UgaWYgKHggPD0gNTEpIHsKKyAgICAgICAgcmV0dXJuICdhJyArIHggLSAyNjsKKyAgICB9IGVsc2UgaWYgKHggPD0gNjEpIHsKKyAgICAgICAgcmV0dXJuICcwJyArIHggLSA1MjsKKyAgICB9IGVsc2UgaWYgKHggPT0gNjIpIHsKKyAgICAgICAgcmV0dXJuICcrJzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJy8nOworICAgIH0KK30KKwordm9pZCBlbmNvZGVCYXNlNjQoCisgICAgICAgIGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KSB7CisgICAgb3V0LT5jbGVhcigpOworCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CisKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgLyAzKSAqIDM7IGkgKz0gMykgeworICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICB1aW50OF90IHgzID0gZGF0YVtpICsgMl07CisKKyAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoKHgxIDw8IDQgfCB4MiA+PiA0KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCgoeDIgPDwgMiB8IHgzID4+IDYpICYgMHgzZikpOworICAgICAgICBvdXQtPmFwcGVuZChlbmNvZGU2Qml0KHgzICYgMHgzZikpOworICAgIH0KKyAgICBzd2l0Y2ggKHNpemUgJSAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDEgPSBkYXRhW2ldOworICAgICAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZChlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZChlbmNvZGU2Qml0KCh4MiA8PCAyKSAmIDB4M2YpKTsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKCc9Jyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCgoeDEgPDwgNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgiPT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2YmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiaGV4ZHVtcCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImhleGR1bXAuaCIKKworI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFTdHJpbmcuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIGhleGR1bXAoY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICBBU3RyaW5nIGxpbmU7CisKKyAgICAgICAgY2hhciB0bXBbMzJdOworICAgICAgICBzcHJpbnRmKHRtcCwgIiUwOGx4OiAgIiwgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKKworICAgICAgICBsaW5lLmFwcGVuZCh0bXApOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPT0gOCkgeworICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgaSA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoIiAgICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiUwMnggIiwgZGF0YVtvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQodG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxpbmUuYXBwZW5kKCcgJyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgaSA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc3ByaW50KGRhdGFbb2Zmc2V0ICsgaV0pKSB7CisgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoKGNoYXIpZGF0YVtvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKCcuJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisKKyAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ZGQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCisgICAgICAgIExpdmVTb3VyY2UuY3BwICBcCisgICAgICAgIE0zVVBhcnNlci5jcHAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0CisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQorZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI0NTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNvdXJjZS5jcHAKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkxpdmVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0xpdmVTb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL00zVVBhcnNlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitMaXZlU291cmNlOjpMaXZlU291cmNlKGNvbnN0IGNoYXIgKnVybCkKKyAgICA6IG1NYXN0ZXJVUkwodXJsKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtRHVyYXRpb25VcygtMSksCisgICAgICBtUGxheWxpc3RJbmRleCgwKSwKKyAgICAgIG1MYXN0RmV0Y2hUaW1lVXMoLTEpLAorICAgICAgbVNvdXJjZShuZXcgTnVIVFRQRGF0YVNvdXJjZSksCisgICAgICBtU291cmNlU2l6ZSgwKSwKKyAgICAgIG1PZmZzZXRCaWFzKDApLAorICAgICAgbVNpZ25hbERpc2NvbnRpbnVpdHkoZmFsc2UpLAorICAgICAgbVByZXZCYW5kd2lkdGhJbmRleCgtMSkgeworICAgIGlmIChzd2l0Y2hUb05leHQoKSkgeworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisKKyAgICAgICAgZGV0ZXJtaW5lU2Vla2FiaWxpdHkoKTsKKyAgICB9Cit9CisKK0xpdmVTb3VyY2U6On5MaXZlU291cmNlKCkgeworfQorCitzdGF0dXNfdCBMaXZlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKKy8vIHN0YXRpYworaW50IExpdmVTb3VyY2U6OlNvcnRCeUJhbmR3aWR0aChjb25zdCBCYW5kd2lkdGhJdGVtICphLCBjb25zdCBCYW5kd2lkdGhJdGVtICpiKSB7CisgICAgaWYgKGEtPm1CYW5kd2lkdGggPCBiLT5tQmFuZHdpZHRoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGEtPm1CYW5kd2lkdGggPT0gYi0+bUJhbmR3aWR0aCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGRvdWJsZSB1bmlmb3JtUmFuZCgpIHsKKyAgICByZXR1cm4gKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWDsKK30KKworYm9vbCBMaXZlU291cmNlOjpsb2FkUGxheWxpc3QoYm9vbCBmZXRjaE1hc3RlcikgeworICAgIG1TaWduYWxEaXNjb250aW51aXR5ID0gZmFsc2U7CisKKyAgICBtUGxheWxpc3QuY2xlYXIoKTsKKyAgICBtUGxheWxpc3RJbmRleCA9IDA7CisKKyAgICBpZiAoZmV0Y2hNYXN0ZXIpIHsKKyAgICAgICAgbVByZXZCYW5kd2lkdGhJbmRleCA9IC0xOworCisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZmV0Y2hNM1UobU1hc3RlclVSTC5jX3N0cigpLCAmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUGxheWxpc3QgPSBuZXcgTTNVUGFyc2VyKAorICAgICAgICAgICAgICAgIG1NYXN0ZXJVUkwuY19zdHIoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBpZiAobVBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNWYXJpYW50UGxheWxpc3QoKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWxpc3QtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgQmFuZHdpZHRoSXRlbSBpdGVtOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgICAgICAgICAgbVBsYXlsaXN0LT5pdGVtQXQoaSwgJml0ZW0ubVVSSSwgJm1ldGEpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBiYW5kd2lkdGg7CisgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJiYW5kd2lkdGgiLCAoaW50MzJfdCAqKSZpdGVtLm1CYW5kd2lkdGgpKTsKKworICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5wdXNoKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnNvcnQoU29ydEJ5QmFuZHdpZHRoKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJpdGVtICMlZDogJXMiLCBpLCBpdGVtLm1VUkkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLnNpemUoKSA+IDApIHsKKyNpZiAwCisgICAgICAgIC8vIENoYW5nZSBiYW5kd2lkdGggYXQgcmFuZG9tKCkKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gdW5pZm9ybVJhbmQoKSAqIG1CYW5kd2lkdGhJdGVtcy5zaXplKCk7CisjZWxpZiAwCisgICAgICAgIC8vIFRoZXJlJ3MgYSA1MCUgY2hhbmNlIHRvIHN0YXkgb24gdGhlIGN1cnJlbnQgYmFuZHdpZHRoIGFuZAorICAgICAgICAvLyBhIDUwJSBjaGFuY2UgdG8gc3dpdGNoIHRvIHRoZSBuZXh0IGhpZ2hlciBiYW5kd2lkdGggKHdyYXBwaW5nIGFyb3VuZAorICAgICAgICAvLyB0byBsb3dlc3QpCisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgaWYgKHVuaWZvcm1SYW5kKCkgPCAwLjUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gbVByZXZCYW5kd2lkdGhJbmRleCA8IDAgPyAwIDogKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1QcmV2QmFuZHdpZHRoSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1QcmV2QmFuZHdpZHRoSW5kZXggKyAxOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vIFN0YXkgb24gdGhlIGxvd2VzdCBiYW5kd2lkdGggYXZhaWxhYmxlLgorICAgICAgICBzaXplX3QgaW5kZXggPSBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpIC0gMTsgIC8vIEhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbQorI2VuZGlmCisKKyAgICAgICAgbVVSTCA9IG1CYW5kd2lkdGhJdGVtcy5lZGl0SXRlbUF0KGluZGV4KS5tVVJJOworCisgICAgICAgIGlmIChtUHJldkJhbmR3aWR0aEluZGV4ID49IDAgJiYgKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4ICE9IGluZGV4KSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBzd2l0Y2hlZCBzdHJlYW1zIGJlY2F1c2Ugb2YgYmFuZHdpZHRoIGNoYW5nZXMsCisgICAgICAgICAgICAvLyB3ZSdsbCBzaWduYWwgdGhpcyBkaXNjb250aW51aXR5IGJ5IGluc2VydGluZyBhCisgICAgICAgICAgICAvLyBzcGVjaWFsIHRyYW5zcG9ydCBzdHJlYW0gcGFja2V0IGludG8gdGhlIHN0cmVhbS4KKyAgICAgICAgICAgIG1TaWduYWxEaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1QcmV2QmFuZHdpZHRoSW5kZXggPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBtVVJMID0gbU1hc3RlclVSTDsKKyAgICB9CisKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZXRjaE0zVShtVVJMLmNfc3RyKCksICZidWZmZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1QbGF5bGlzdCA9IG5ldyBNM1VQYXJzZXIobVVSTC5jX3N0cigpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgIGlmIChtUGxheWxpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVBsYXlsaXN0LT5pc1ZhcmlhbnRQbGF5bGlzdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgIm1lZGlhLXNlcXVlbmNlIiwgJm1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlcikpIHsKKyAgICAgICAgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKyAgICByZXR1cm4gKGludDY0X3QpdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDBsbDsKK30KKworYm9vbCBMaXZlU291cmNlOjpzd2l0Y2hUb05leHQoKSB7CisgICAgbVNpZ25hbERpc2NvbnRpbnVpdHkgPSBmYWxzZTsKKworICAgIG1PZmZzZXRCaWFzICs9IG1Tb3VyY2VTaXplOworICAgIG1Tb3VyY2VTaXplID0gMDsKKworICAgIGlmIChtTGFzdEZldGNoVGltZVVzIDwgMCB8fCBnZXROb3dVcygpID49IG1MYXN0RmV0Y2hUaW1lVXMgKyAxNTAwMDAwMGxsCisgICAgICAgIHx8IG1QbGF5bGlzdEluZGV4ID09IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgIGludDMyX3QgbmV4dFNlcXVlbmNlTnVtYmVyID0KKyAgICAgICAgICAgIG1QbGF5bGlzdEluZGV4ICsgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyOworCisgICAgICAgIGlmICghbG9hZFBsYXlsaXN0KG1MYXN0RmV0Y2hUaW1lVXMgPCAwKSkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlbG9hZCBwbGF5bGlzdCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1MYXN0RmV0Y2hUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICBtUGxheWxpc3RJbmRleCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmV4dFNlcXVlbmNlTnVtYmVyIDwgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHx8IG5leHRTZXF1ZW5jZU51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IG1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlciArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgc2VxdWVuY2UgbnVtYmVyICVkIGluIG5ldyBwbGF5bGlzdCIsCisgICAgICAgICAgICAgICAgICAgICBuZXh0U2VxdWVuY2VOdW1iZXIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUGxheWxpc3RJbmRleCA9IG5leHRTZXF1ZW5jZU51bWJlciAtIG1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0RmV0Y2hUaW1lVXMgPSBnZXROb3dVcygpOworICAgIH0KKworICAgIEFTdHJpbmcgdXJpOworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChtUGxheWxpc3RJbmRleCwgJnVyaSwgJml0ZW1NZXRhKSk7CisgICAgTE9HVigic3dpdGNoaW5nIHRvICVzIiwgdXJpLmNfc3RyKCkpOworCisgICAgaWYgKG1Tb3VyY2UtPmNvbm5lY3QodXJpLmNfc3RyKCkpICE9IE9LCisgICAgICAgICAgICB8fCBtU291cmNlLT5nZXRTaXplKCZtU291cmNlU2l6ZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgdmFsOworICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnZhbCkgJiYgdmFsICE9IDApIHsKKyAgICAgICAgbVNpZ25hbERpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgIH0KKworICAgIG1QbGF5bGlzdEluZGV4Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCBzc2l6ZV90IGtIZWFkZXJTaXplID0gMTg4OworCitzc2l6ZV90IExpdmVTb3VyY2U6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0sob2Zmc2V0ID49IG1PZmZzZXRCaWFzKTsKKyAgICBvZmZzZXQgLT0gbU9mZnNldEJpYXM7CisKKyAgICBvZmZfdCBkZWx0YSA9IG1TaWduYWxEaXNjb250aW51aXR5ID8ga0hlYWRlclNpemUgOiAwOworCisgICAgaWYgKG9mZnNldCA+PSBtU291cmNlU2l6ZSArIGRlbHRhKSB7CisgICAgICAgIENIRUNLX0VRKG9mZnNldCwgbVNvdXJjZVNpemUgKyBkZWx0YSk7CisKKyAgICAgICAgb2Zmc2V0IC09IG1Tb3VyY2VTaXplICsgZGVsdGE7CisgICAgICAgIGlmICghc3dpdGNoVG9OZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TaWduYWxEaXNjb250aW51aXR5KSB7CisgICAgICAgICAgICBMT0dWKCJzd2l0Y2hUb05leHQgY2hhbmdlZCBzdHJlYW1zIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJzd2l0Y2hUb05leHQgc3RheWVkIHdpdGhpbiB0aGUgc2FtZSBzdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1PZmZzZXRCaWFzICs9IGRlbHRhOworCisgICAgICAgIGRlbHRhID0gbVNpZ25hbERpc2NvbnRpbnVpdHkgPyBrSGVhZGVyU2l6ZSA6IDA7CisgICAgfQorCisgICAgaWYgKG9mZnNldCA8IGRlbHRhKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGRlbHRhIC0gb2Zmc2V0OworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYXZhaWwpOworICAgICAgICByZXR1cm4gYXZhaWw7CisgICAgfQorCisgICAgc2l6ZV90IG51bVJlYWQgPSAwOworICAgIHdoaWxlIChudW1SZWFkIDwgc2l6ZSkgeworICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtUmVhZCAtIGRlbHRhLAorICAgICAgICAgICAgICAgICh1aW50OF90ICopZGF0YSArIG51bVJlYWQsIHNpemUgLSBudW1SZWFkKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bVJlYWQgKz0gbjsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtUmVhZDsKK30KKworc3RhdHVzX3QgTGl2ZVNvdXJjZTo6ZmV0Y2hNM1UoY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqb3V0KSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2U7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgeworICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5jb25uZWN0KHVybCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZSA9IG1Tb3VyY2U7CisgICAgfQorCisgICAgb2ZmX3Qgc2l6ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPmdldFNpemUoJnNpemUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCAoc2l6ZV90KXNpemUpIHsKKyAgICAgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisKKyAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IG47CisgICAgfQorCisgICAgKm91dCA9IGJ1ZmZlcjsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBMaXZlU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgTE9HVigic2VlayB0byAlbGxkIHVzIiwgc2Vla1RpbWVVcyk7CisKKyAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOworICAgIGlmICghbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzZWVrVGltZVNlY3MgPSAoc2Vla1RpbWVVcyArIDUwMDAwMGxsKSAvIDEwMDAwMDBsbDsKKworICAgIGludDY0X3QgaW5kZXggPSBzZWVrVGltZVNlY3MgLyB0YXJnZXREdXJhdGlvbjsKKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbVBsYXlsaXN0LT5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBuZXdQbGF5bGlzdEluZGV4ID0gbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyICsgaW5kZXg7CisKKyAgICBpZiAobmV3UGxheWxpc3RJbmRleCA9PSBtUGxheWxpc3RJbmRleCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVBsYXlsaXN0SW5kZXggPSBuZXdQbGF5bGlzdEluZGV4OworCisgICAgc3dpdGNoVG9OZXh0KCk7CisgICAgbU9mZnNldEJpYXMgPSAwOworCisgICAgTE9HVigic2Vla2luZyB0byBpbmRleCAlbGxkIiwgaW5kZXgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTGl2ZVNvdXJjZTo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3QgeworICAgIGlmIChtRHVyYXRpb25VcyA+PSAwKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgICpkdXJhdGlvblVzID0gMDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTGl2ZVNvdXJjZTo6aXNTZWVrYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUR1cmF0aW9uVXMgPj0gMDsKK30KKwordm9pZCBMaXZlU291cmNlOjpkZXRlcm1pbmVTZWVrYWJpbGl0eSgpIHsKKyAgICBtRHVyYXRpb25VcyA9IC0xOworCisgICAgaWYgKCFtUGxheWxpc3QtPmlzQ29tcGxldGUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKKyAgICBpZiAoIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1EdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb24gKiAxMDAwMDAwbGwgKiBtUGxheWxpc3QtPnNpemUoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjNkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvTTNVUGFyc2VyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTTNVUGFyc2VyOjpNM1VQYXJzZXIoCisgICAgICAgIGNvbnN0IGNoYXIgKmJhc2VVUkksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1CYXNlVVJJKGJhc2VVUkkpLAorICAgICAgbUlzRXh0TTNVKGZhbHNlKSwKKyAgICAgIG1Jc1ZhcmlhbnRQbGF5bGlzdChmYWxzZSksCisgICAgICBtSXNDb21wbGV0ZShmYWxzZSkgeworICAgIG1Jbml0Q2hlY2sgPSBwYXJzZShkYXRhLCBzaXplKTsKK30KKworTTNVUGFyc2VyOjp+TTNVUGFyc2VyKCkgeworfQorCitzdGF0dXNfdCBNM1VQYXJzZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworYm9vbCBNM1VQYXJzZXI6OmlzRXh0TTNVKCkgY29uc3QgeworICAgIHJldHVybiBtSXNFeHRNM1U7Cit9CisKK2Jvb2wgTTNVUGFyc2VyOjppc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzVmFyaWFudFBsYXlsaXN0OworfQorCitib29sIE0zVVBhcnNlcjo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzQ29tcGxldGU7Cit9CisKK3NwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CisgICAgcmV0dXJuIG1NZXRhOworfQorCitzaXplX3QgTTNVUGFyc2VyOjpzaXplKCkgeworICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworfQorCitib29sIE0zVVBhcnNlcjo6aXRlbUF0KHNpemVfdCBpbmRleCwgQVN0cmluZyAqdXJpLCBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKKyAgICB1cmktPmNsZWFyKCk7CisgICAgaWYgKG1ldGEpIHsgKm1ldGEgPSBOVUxMOyB9CisKKyAgICBpZiAoaW5kZXggPj0gbUl0ZW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisKKyAgICBpZiAobWV0YSkgeworICAgICAgICAqbWV0YSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1NZXRhOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBNYWtlVVJMKGNvbnN0IGNoYXIgKmJhc2VVUkwsIGNvbnN0IGNoYXIgKnVybCwgQVN0cmluZyAqb3V0KSB7CisgICAgb3V0LT5jbGVhcigpOworCisgICAgaWYgKHN0cm5jYXNlY21wKCJodHRwOi8vIiwgYmFzZVVSTCwgNykKKyAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKCJmaWxlOi8vIiwgYmFzZVVSTCwgNykpIHsKKyAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykpIHsKKyAgICAgICAgLy8gInVybCIgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIGlnbm9yZSBiYXNlIFVSTC4KKyAgICAgICAgb3V0LT5zZXRUbyh1cmwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzaXplX3QgbiA9IHN0cmxlbihiYXNlVVJMKTsKKyAgICBpZiAoYmFzZVVSTFtuIC0gMV0gPT0gJy8nKSB7CisgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisKKyAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIH0KKworICAgICAgICBvdXQtPmFwcGVuZCgiLyIpOworICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBNM1VQYXJzZXI6OnBhcnNlKGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGludDMyX3QgbGluZU5vID0gMDsKKworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKworICAgIGNvbnN0IGNoYXIgKmRhdGEgPSAoY29uc3QgY2hhciAqKV9kYXRhOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBvZmZzZXRMRiA9IG9mZnNldDsKKyAgICAgICAgd2hpbGUgKG9mZnNldExGIDwgc2l6ZSAmJiBkYXRhW29mZnNldExGXSAhPSAnXG4nKSB7CisgICAgICAgICAgICArK29mZnNldExGOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXRMRiA+PSBzaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgbGluZTsKKyAgICAgICAgaWYgKG9mZnNldExGID4gb2Zmc2V0ICYmIGRhdGFbb2Zmc2V0TEYgLSAxXSA9PSAnXHInKSB7CisgICAgICAgICAgICBsaW5lLnNldFRvKCZkYXRhW29mZnNldF0sIG9mZnNldExGIC0gb2Zmc2V0IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lLnNldFRvKCZkYXRhW29mZnNldF0sIG9mZnNldExGIC0gb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExPR0koIiMlcyMiLCBsaW5lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChsaW5lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldExGICsgMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmVObyA9PSAwICYmIGxpbmUgPT0gIiNFWFRNM1UiKSB7CisgICAgICAgICAgICBtSXNFeHRNM1UgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0V4dE0zVSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1UQVJHRVREVVJBVElPTiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1ldGFEYXRhKGxpbmUsICZtTWV0YSwgInRhcmdldC1kdXJhdGlvbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1NRURJQS1TRVFVRU5DRSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1ldGFEYXRhKGxpbmUsICZtTWV0YSwgIm1lZGlhLXNlcXVlbmNlIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLUVORExJU1QiKSkgeworICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhUSU5GIikpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzVmFyaWFudFBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlTWV0YURhdGEobGluZSwgJml0ZW1NZXRhLCAiZHVyYXRpb24iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtRElTQ09OVElOVUlUWSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXRlbU1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpdGVtTWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbU1ldGEtPnNldEludDMyKCJkaXNjb250aW51aXR5IiwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLVNUUkVBTS1JTkYiKSkgeworICAgICAgICAgICAgICAgIGlmIChtTWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Jc1ZhcmlhbnRQbGF5bGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VTdHJlYW1JbmYobGluZSwgJml0ZW1NZXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiIyIpKSB7CisgICAgICAgICAgICBpZiAoIW1Jc1ZhcmlhbnRQbGF5bGlzdCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgZHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIGlmIChpdGVtTWV0YSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXRlbU1ldGEtPmZpbmRJbnQzMigiZHVyYXRpb24iLCAmZHVyYXRpb25TZWNzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUl0ZW1zLnB1c2goKTsKKyAgICAgICAgICAgIEl0ZW0gKml0ZW0gPSAmbUl0ZW1zLmVkaXRJdGVtQXQobUl0ZW1zLnNpemUoKSAtIDEpOworCisgICAgICAgICAgICBDSEVDSyhNYWtlVVJMKG1CYXNlVVJJLmNfc3RyKCksIGxpbmUuY19zdHIoKSwgJml0ZW0tPm1VUkkpKTsKKworICAgICAgICAgICAgaXRlbS0+bU1ldGEgPSBpdGVtTWV0YTsKKworICAgICAgICAgICAgaXRlbU1ldGEuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCA9IG9mZnNldExGICsgMTsKKyAgICAgICAgKytsaW5lTm87CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IE0zVVBhcnNlcjo6cGFyc2VNZXRhRGF0YSgKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbGluZSwgc3A8QU1lc3NhZ2U+ICptZXRhLCBjb25zdCBjaGFyICprZXkpIHsKKyAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7CisKKyAgICBpZiAoY29sb25Qb3MgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaW50MzJfdCB4OworICAgIHN0YXR1c190IGVyciA9IFBhcnNlSW50MzIobGluZS5jX3N0cigpICsgY29sb25Qb3MgKyAxLCAmeCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgfQorICAgICgqbWV0YSktPnNldEludDMyKGtleSwgeCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgTTNVUGFyc2VyOjpwYXJzZVN0cmVhbUluZigKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbGluZSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7CisgICAgc3NpemVfdCBjb2xvblBvcyA9IGxpbmUuZmluZCgiOiIpOworCisgICAgaWYgKGNvbG9uUG9zIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNpemVfdCBvZmZzZXQgPSBjb2xvblBvcyArIDE7CisKKyAgICB3aGlsZSAob2Zmc2V0IDwgbGluZS5zaXplKCkpIHsKKyAgICAgICAgc3NpemVfdCBlbmQgPSBsaW5lLmZpbmQoIiwiLCBvZmZzZXQpOworICAgICAgICBpZiAoZW5kIDwgMCkgeworICAgICAgICAgICAgZW5kID0gbGluZS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGF0dHIobGluZSwgb2Zmc2V0LCBlbmQgLSBvZmZzZXQpOworICAgICAgICBhdHRyLnRyaW0oKTsKKworICAgICAgICBvZmZzZXQgPSBlbmQgKyAxOworCisgICAgICAgIHNzaXplX3QgZXF1YWxQb3MgPSBhdHRyLmZpbmQoIj0iKTsKKyAgICAgICAgaWYgKGVxdWFsUG9zIDwgMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGtleShhdHRyLCAwLCBlcXVhbFBvcyk7CisgICAgICAgIGtleS50cmltKCk7CisKKyAgICAgICAgQVN0cmluZyB2YWwoYXR0ciwgZXF1YWxQb3MgKyAxLCBhdHRyLnNpemUoKSAtIGVxdWFsUG9zIC0gMSk7CisgICAgICAgIHZhbC50cmltKCk7CisKKyAgICAgICAgTE9HVigia2V5PSVzIHZhbHVlPSVzIiwga2V5LmNfc3RyKCksIHZhbC5jX3N0cigpKTsKKworICAgICAgICBpZiAoIXN0cmNhc2VjbXAoImJhbmR3aWR0aCIsIGtleS5jX3N0cigpKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHZhbC5jX3N0cigpOworICAgICAgICAgICAgY2hhciAqZW5kOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB4ID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisKKyAgICAgICAgICAgIGlmIChlbmQgPT0gcyB8fCAqZW5kICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWxmb3JtZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqbWV0YSktPnNldEludDMyKCJiYW5kd2lkdGgiLCB4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBNM1VQYXJzZXI6OlBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCkgeworICAgIGNoYXIgKmVuZDsKKyAgICBsb25nIGx2YWwgPSBzdHJ0b2wocywgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBzIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnLCcpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnggPSAoaW50MzJfdClsdmFsOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCA5M2ZhYzFjLi4yM2M4ZTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDMgQEAKLWlmZXEgKCQoQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUKSx0cnVlKQotCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC0yOCw1ICsyNiwzIEBACiBMT0NBTF9NT0RVTEUgOj0gdGVzdGlkMwogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggY2EwYzY4Yy4uZGEzNDBmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTE0MiwxMSArMTQyLDIyIEBACiAgICAgbVNpemUgPSBzaXplOwogCiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHNpemVvZihoZWFkZXIpLCBtRGF0YSwgbVNpemUpICE9IChzc2l6ZV90KW1TaXplKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChoZWFkZXIuZmxhZ3MgJiAweDgwKSB7CisgICAgaWYgKGhlYWRlci52ZXJzaW9uX21ham9yID09IDQpIHsKKyAgICAgICAgaWYgKCFyZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoKSkgeworICAgICAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgICAgICBtRGF0YSA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaGVhZGVyLmZsYWdzICYgMHg4MCkgewogICAgICAgICBMT0dWKCJyZW1vdmluZyB1bnN5bmNocm9uaXphdGlvbiIpOworCiAgICAgICAgIHJlbW92ZVVuc3luY2hyb25pemF0aW9uKCk7CiAgICAgfQogCkBAIC0yNDMsNiArMjU0LDc0IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBXcml0ZVN5bmNzYWZlSW50ZWdlcih1aW50OF90ICpkc3QsIHNpemVfdCB4KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgZHN0WzMgLSBpXSA9ICh4ICYgMHg3Zik7CisgICAgICAgIHggPj49IDc7CisgICAgfQorfQorCitib29sIElEMzo6cmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KCkgeworICAgIHNpemVfdCBvbGRTaXplID0gbVNpemU7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMTAgPD0gbVNpemUpIHsKKyAgICAgICAgaWYgKCFtZW1jbXAoJm1EYXRhW29mZnNldF0sICJcMFwwXDBcMCIsIDQpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICAgICAgaWYgKCFQYXJzZVN5bmNzYWZlSW50ZWdlcigmbURhdGFbb2Zmc2V0ICsgNF0sICZkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgKyBkYXRhU2l6ZSArIDEwID4gbVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQxNl90IGZsYWdzID0gVTE2X0FUKCZtRGF0YVtvZmZzZXQgKyA4XSk7CisgICAgICAgIHVpbnQxNl90IHByZXZGbGFncyA9IGZsYWdzOworCisgICAgICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgICAgIC8vIFN0cmlwIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCisgICAgICAgICAgICBtZW1tb3ZlKCZtRGF0YVtvZmZzZXQgKyAxMF0sICZtRGF0YVtvZmZzZXQgKyAxNF0sIG1TaXplIC0gb2Zmc2V0IC0gMTQpOworICAgICAgICAgICAgbVNpemUgLT0gNDsKKyAgICAgICAgICAgIGRhdGFTaXplIC09IDQ7CisKKyAgICAgICAgICAgIGZsYWdzICY9IH4xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgMikgeworICAgICAgICAgICAgLy8gVW5zeW5jaHJvbml6YXRpb24gYWRkZWQuCisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICsgMSA8IGRhdGFTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFbb2Zmc2V0ICsgMTAgKyBpXSA9PSAweGZmCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YVtvZmZzZXQgKyAxMSArIGldID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgmbURhdGFbb2Zmc2V0ICsgMTEgKyBpXSwgJm1EYXRhW29mZnNldCArIDEyICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpemUgLSBvZmZzZXQgLSAxMiAtIGkpOworICAgICAgICAgICAgICAgICAgICAtLW1TaXplOworICAgICAgICAgICAgICAgICAgICAtLWRhdGFTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmxhZ3MgJj0gfjI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgIT0gcHJldkZsYWdzKSB7CisgICAgICAgICAgICBXcml0ZVN5bmNzYWZlSW50ZWdlcigmbURhdGFbb2Zmc2V0ICsgNF0sIGRhdGFTaXplKTsKKyAgICAgICAgICAgIG1EYXRhW29mZnNldCArIDhdID0gZmxhZ3MgPj4gODsKKyAgICAgICAgICAgIG1EYXRhW29mZnNldCArIDldID0gZmxhZ3MgJiAweGZmOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IDEwICsgZGF0YVNpemU7CisgICAgfQorCisgICAgbWVtc2V0KCZtRGF0YVttU2l6ZV0sIDAsIG9sZFNpemUgLSBtU2l6ZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogSUQzOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgSUQzICZwYXJlbnQsIGNvbnN0IGNoYXIgKmlkKQogICAgIDogbVBhcmVudChwYXJlbnQpLAogICAgICAgbUlEKE5VTEwpLApAQCAtNTI5LDEwICs2MDgsMTEgQEAKIAogICAgICAgICAgICAgdWludDE2X3QgZmxhZ3MgPSBVMTZfQVQoJm1QYXJlbnQubURhdGFbbU9mZnNldCArIDhdKTsKIAotICAgICAgICAgICAgaWYgKChtUGFyZW50Lm1WZXJzaW9uID09IElEM19WMl80ICYmIChmbGFncyAmIDB4MDAwZSkpCisgICAgICAgICAgICBpZiAoKG1QYXJlbnQubVZlcnNpb24gPT0gSUQzX1YyXzQgJiYgKGZsYWdzICYgMHgwMDBjKSkKICAgICAgICAgICAgICAgICB8fCAobVBhcmVudC5tVmVyc2lvbiA9PSBJRDNfVjJfMyAmJiAoZmxhZ3MgJiAweDAwYzApKSkgewotICAgICAgICAgICAgICAgIC8vIENvbXByZXNzaW9uLCBFbmNyeXB0aW9uIG9yIHBlci1GcmFtZSB1bnN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgIC8vIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgICAgICAgICAvLyBDb21wcmVzc2lvbiBvciBlbmNyeXB0aW9uIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgICAgICAgICAvLyBQZXItZnJhbWUgdW5zeW5jaHJvbml6YXRpb24gYW5kIGRhdGEtbGVuZ3RoIGluZGljYXRvcgorICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCiAKICAgICAgICAgICAgICAgICBMT0dWKCJTa2lwcGluZyB1bnN1cHBvcnRlZCBmcmFtZSAoY29tcHJlc3Npb24sIGVuY3J5cHRpb24gIgogICAgICAgICAgICAgICAgICAgICAgIm9yIHBlci1mcmFtZSB1bnN5bmNocm9uaXphdGlvbiBmbGFnZ2VkIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCmluZGV4IGYwOWFkZGQuLjg4NmEzYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworc3RydWN0IE1ldGFEYXRhOwogCiBzdHJ1Y3QgQUFDRGVjb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiAgICAgQUFDRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CkBAIC00MSw2ICs0Miw3IEBACiAgICAgdmlydHVhbCB+QUFDRGVjb2RlcigpOwogCiBwcml2YXRlOgorICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC01MCw5ICs1MiwxMyBAQAogICAgIHZvaWQgKm1EZWNvZGVyQnVmOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgaW50NjRfdCAgbU51bURlY29kZWRCdWZmZXJzOworICAgIGludDMyX3QgIG1VcHNhbXBsaW5nRmFjdG9yOwogCiAgICAgTWVkaWFCdWZmZXIgKm1JbnB1dEJ1ZmZlcjsKIAorICAgIHN0YXR1c190IGluaXRDaGVjaygpOwogICAgIEFBQ0RlY29kZXIoY29uc3QgQUFDRGVjb2RlciAmKTsKICAgICBBQUNEZWNvZGVyICZvcGVyYXRvcj0oY29uc3QgQUFDRGVjb2RlciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzUzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQUNfRU5DT0RFUl9ICisjZGVmaW5lIEFBQ19FTkNPREVSX0gKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOworc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworY2xhc3MgQUFDRW5jb2RlcjogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFBQ0VuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIH5BQUNFbmNvZGVyKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gICBtU291cmNlOworICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtTWV0YTsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVN0YXJ0ZWQ7CisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKKyAgICAgICAgTWVkaWFCdWZmZXIgICAgICAqbUlucHV0QnVmZmVyOworICAgICAgICBzdGF0dXNfdCAgICAgICAgICBtSW5pdENoZWNrOworICAgICAgICBpbnQzMl90ICAgICAgICAgICBtU2FtcGxlUmF0ZTsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUNoYW5uZWxzOworICAgICAgICBpbnQzMl90ICAgICAgICAgICBtQml0UmF0ZTsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUZyYW1lQ291bnQ7CisKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgbUFuY2hvclRpbWVVczsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgbU51bUlucHV0U2FtcGxlczsKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMDI0LAorICAgICAgICB9OworCisgICAgICAgIGludDE2X3QgICAgICAgICAgIG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgICAgIHVpbnQ4X3QgICAgICAgICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVsyXTsgLy8gYXVpZG8gc3BlY2lmaWMgZGF0YQorICAgICAgICB2b2lkICAgICAgICAgICAgICptRW5jb2RlckhhbmRsZTsKKyAgICAgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgICAgIFZPX01FTV9PUEVSQVRPUiAgKm1NZW1PcGVyYXRvcjsKKworICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpOworICAgICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgICAgICBBQUNFbmNvZGVyJiBvcGVyYXRvcj0oY29uc3QgQUFDRW5jb2RlciAmcmhzKTsKKyAgICAgICAgQUFDRW5jb2Rlcihjb25zdCBBQUNFbmNvZGVyJiBjb3B5KTsKKworfTsKKworfQorCisjZW5kaWYgIC8vI2lmbmRlZiBBQUNfRU5DT0RFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oCmluZGV4IGRiNDlmZTQuLjFjZGYzNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaApAQCAtMjIsNiArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIFN0cmluZzg7CiAKIGNsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CkBAIC00OSw3ICs1MCw4IEBACiB9OwogCiBib29sIFNuaWZmQU1SKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJOQkVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1STkJFbmNvZGVyLmgKaW5kZXggNzE2N2MwMC4uNzExNjBlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJOQkVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUk5CRW5jb2Rlci5oCkBAIC0xOSwxMyArMTksMTQgQEAKICNkZWZpbmUgQU1SX05CX0VOQ09ERVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKIAogc3RydWN0IEFNUk5CRW5jb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgQU1STkJFbmNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICBBTVJOQkVuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwpAQCAtNDAsNiArNDEsNyBAQAogCiBwcml2YXRlOgogICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKICAgICBib29sIG1TdGFydGVkOwogCiAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJXQkVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SV0JFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SV0JFbmNvZGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU1SX1dCX0VOQ09ERVJfSAorI2RlZmluZSBBTVJfV0JfRU5DT0RFUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK3N0cnVjdCBWT19BVURJT19DT0RFQ0FQSTsKK3N0cnVjdCBWT19NRU1fT1BFUkFUT1I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA7CisKK2NsYXNzIEFNUldCRW5jb2RlcjogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFNUldCRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfkFNUldCRW5jb2RlcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICAgbVNvdXJjZTsKKyAgICAgICAgc3A8TWV0YURhdGE+ICAgICAgbU1ldGE7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1TdGFydGVkOworICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7CisgICAgICAgIE1lZGlhQnVmZmVyICAgICAgKm1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgbUluaXRDaGVjazsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUJpdFJhdGU7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgKm1FbmNvZGVySGFuZGxlOworICAgICAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKKyAgICAgICAgVk9fTUVNX09QRVJBVE9SICAqbU1lbU9wZXJhdG9yOworCisgICAgICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OworCisgICAgICAgIGludDE2X3QgbUlucHV0RnJhbWVbMzIwXTsKKyAgICAgICAgaW50MzJfdCBtTnVtSW5wdXRTYW1wbGVzOworCisgICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgICAgIEFNUldCRW5jb2RlciYgb3BlcmF0b3I9KGNvbnN0IEFNUldCRW5jb2RlciAmcmhzKTsKKyAgICAgICAgQU1SV0JFbmNvZGVyKGNvbnN0IEFNUldCRW5jb2RlciYgY29weSk7CisKK307CisKK30KKworI2VuZGlmICAvLyNpZm5kZWYgQU1SX1dCX0VOQ09ERVJfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdmZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1JUU1BfQ09OVFJPTExFUl9IXworCisjZGVmaW5lIEFfUlRTUF9DT05UUk9MTEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgTXlIYW5kbGVyOworCitzdHJ1Y3QgQVJUU1BDb250cm9sbGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKKyAgICBBUlRTUENvbnRyb2xsZXIoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3Blcik7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IGNoYXIgKnVybCk7CisgICAgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2b2lkIHNlZWtBc3luYyhpbnQ2NF90IHRpbWVVcywgdm9pZCAoKnNlZWtEb25lQ2IpKHZvaWQgKiksIHZvaWQgKmNvb2tpZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBpbnQ2NF90IGdldE5vcm1hbFBsYXlUaW1lVXMoKTsKKyAgICBpbnQ2NF90IGdldFF1ZXVlRHVyYXRpb25Vcyhib29sICplb3MpOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeworICAgICAgICAvLyBTZWVraW5nIDEwc2VjcyBmb3J3YXJkIG9yIGJhY2t3YXJkIGlzIGEgdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uCisgICAgICAgIC8vIGZvciBydHNwLCBzbyBsZXQncyBub3QgZW5hYmxlIHRoYXQuCisgICAgICAgIC8vIFRoZSB1c2VyIGNhbiBhbHdheXMgdXNlIHRoZSBzZWVrIGJhci4KKworICAgICAgICByZXR1cm4gQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVJUU1BDb250cm9sbGVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q29ubmVjdERvbmUgICAgPSAnY2RvbicsCisgICAgICAgIGtXaGF0RGlzY29ubmVjdERvbmUgPSAnZGRvbicsCisgICAgICAgIGtXaGF0U2Vla0RvbmUgICAgICAgPSAnc2RvbicsCisgICAgfTsKKworICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RFRCwKKyAgICAgICAgQ09OTkVDVElORywKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBTdGF0ZSBtU3RhdGU7CisgICAgc3RhdHVzX3QgbUNvbm5lY3Rpb25SZXN1bHQ7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8QVJUU1BDb250cm9sbGVyPiA+IG1SZWZsZWN0b3I7CisKKyAgICB2b2lkICgqbVNlZWtEb25lQ2IpKHZvaWQgKik7CisgICAgdm9pZCAqbVNlZWtEb25lQ29va2llOworICAgIGludDY0X3QgbUxhc3RTZWVrQ29tcGxldGVkVGltZVVzOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUU1BDb250cm9sbGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFNQX0NPTlRST0xMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNEZWNvZGVyLmgKaW5kZXggNjIxYWE5YS4uZWIzYjE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNEZWNvZGVyLmgKQEAgLTU4LDYgKzU4LDEyIEBACiAgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOwogICAgIGludDY0X3QgbU51bVNhbXBsZXNPdXRwdXQ7CiAgICAgaW50NjRfdCBtUGVuZGluZ1NlZWtUaW1lVXM7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtUGVuZGluZ1NlZWtNb2RlOworCisgICAgaW50NjRfdCBtVGFyZ2V0VGltZVVzOworCisgICAgYm9vbCBtU1BTU2VlbjsKKyAgICBib29sIG1QUFNTZWVuOwogCiAgICAgdm9pZCBhZGRDb2RlY1NwZWNpZmljRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTc2LDYgKzgyLDggQEAKIAogICAgIHZvaWQgcmVsZWFzZUZyYW1lcygpOwogCisgICAgTWVkaWFCdWZmZXIgKmRyYWluT3V0cHV0QnVmZmVyKCk7CisKICAgICBBVkNEZWNvZGVyKGNvbnN0IEFWQ0RlY29kZXIgJik7CiAgICAgQVZDRGVjb2RlciAmb3BlcmF0b3I9KGNvbnN0IEFWQ0RlY29kZXIgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWQ0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2UxZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNFbmNvZGVyLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVZDX0VOQ09ERVJfSF8KKworI2RlZmluZSBBVkNfRU5DT0RFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCitzdHJ1Y3QgdGFnQVZDSGFuZGxlOworc3RydWN0IHRhZ0FWQ0VuY1BhcmFtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworCitzdHJ1Y3QgQVZDRW5jb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworICAgIEFWQ0VuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKworICAgIC8vIENhbGxiYWNrcyByZXF1aXJlZCBieSB0aGUgZW5jb2RlcgorICAgIGludDMyX3QgYWxsb2NPdXRwdXRCdWZmZXJzKHVuc2lnbmVkIGludCBzaXplSW5NYnMsIHVuc2lnbmVkIGludCBudW1CdWZmZXJzKTsKKyAgICB2b2lkICAgIHVuYmluZE91dHB1dEJ1ZmZlcihpbnQzMl90IGluZGV4KTsKKyAgICBpbnQzMl90IGJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BVkNFbmNvZGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWV0YURhdGE+ICAgIG1Gb3JtYXQ7CisgICAgc3A8TWV0YURhdGE+ICAgIG1NZXRhOworCisgICAgaW50MzJfdCAgbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCAgbVZpZGVvSGVpZ2h0OworICAgIGludDMyX3QgIG1WaWRlb0ZyYW1lUmF0ZTsKKyAgICBpbnQzMl90ICBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgIG1WaWRlb0NvbG9yRm9ybWF0OworICAgIGludDY0X3QgIG1OdW1JbnB1dEZyYW1lczsKKyAgICBpbnQ2NF90ICBtUHJldlRpbWVzdGFtcFVzOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworICAgIGJvb2wgICAgIG1SZWFkeUZvck5leHRGcmFtZTsKKyAgICBpbnQzMl90ICBtSXNJRFJGcmFtZTsgIC8vIGZvciBzZXQga0tleUlzU3luY0ZyYW1lCisKKyAgICB0YWdBVkNIYW5kbGUgICAgICAgICAgKm1IYW5kbGU7CisgICAgdGFnQVZDRW5jUGFyYW0gICAgICAgICptRW5jUGFyYW1zOworICAgIE1lZGlhQnVmZmVyICAgICAgICAgICAqbUlucHV0QnVmZmVyOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAqbUlucHV0RnJhbWVEYXRhOworICAgIE1lZGlhQnVmZmVyR3JvdXAgICAgICAqbUdyb3VwOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtT3V0cHV0QnVmZmVyczsKKworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CisgICAgdm9pZCByZWxlYXNlT3V0cHV0QnVmZmVycygpOworCisgICAgQVZDRW5jb2Rlcihjb25zdCBBVkNFbmNvZGVyICYpOworICAgIEFWQ0VuY29kZXIgJm9wZXJhdG9yPShjb25zdCBBVkNFbmNvZGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBVkNfRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCBmMGZkMGYyLi40NTI2YmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtMTgsMTIgKzE4LDEzIEBACiAKICNkZWZpbmUgQVdFU09NRV9QTEFZRVJfSF8KIAorI2luY2x1ZGUgIk51SFRUUERhdGFTb3VyY2UuaCIKICNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgogCkBAIC0zNCw4ICszNSwxMyBAQAogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IFByZWZldGNoZXI7Ci1zdHJ1Y3QgVGltZVNvdXJjZTsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKK3N0cnVjdCBBUlRQU2Vzc2lvbjsKK3N0cnVjdCBVRFBQdXNoZXI7CisKIGNsYXNzIERybU1hbmFnZXJDbGluZXQ7CiBjbGFzcyBEZWNyeXB0SGFuZGxlOwogCkBAIC05MCw2ICs5Niw5IEBACiAgICAgLy8gVGhpcyBpcyBhIG1hc2sgb2YgTWVkaWFFeHRyYWN0b3I6OkZsYWdzLgogICAgIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKKyAgICB2b2lkIHBvc3RBdWRpb0VPUygpOworICAgIHZvaWQgcG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBBd2Vzb21lRXZlbnQ7CiAKQEAgLTEwMSw2ICsxMTAsMTAgQEAKICAgICAgICAgUFJFUEFSRUQgICAgICAgICAgICA9IDE2LAogICAgICAgICBBVF9FT1MgICAgICAgICAgICAgID0gMzIsCiAgICAgICAgIFBSRVBBUkVfQ0FOQ0VMTEVEICAgPSA2NCwKKyAgICAgICAgQ0FDSEVfVU5ERVJSVU4gICAgICA9IDEyOCwKKyAgICAgICAgQVVESU9fQVRfRU9TICAgICAgICA9IDI1NiwKKyAgICAgICAgVklERU9fQVRfRU9TICAgICAgICA9IDUxMiwKKyAgICAgICAgQVVUT19MT09QSU5HICAgICAgICA9IDEwMjQsCiAgICAgfTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC0xMTQsNiArMTI3LDcgQEAKICAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogCisgICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKICAgICBUaW1lU291cmNlICptVGltZVNvdXJjZTsKIAogICAgIFN0cmluZzggbVVyaTsKQEAgLTE0Miw2ICsxNTYsOCBAQAogICAgIGJvb2wgbVNlZWtOb3RpZmljYXRpb25TZW50OwogICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CiAKKyAgICBpbnQ2NF90IG1CaXRyYXRlOyAgLy8gdG90YWwgYml0cmF0ZSBvZiB0aGUgZmlsZSAoaW4gYnBzKSBvciAtMSBpZiB1bmtub3duLgorCiAgICAgYm9vbCBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZTsKICAgICBib29sIG1XYXRjaEZvckF1ZGlvRU9TOwogCkBAIC0xNjksOCArMTg1LDEzIEBACiAgICAgTWVkaWFCdWZmZXIgKm1MYXN0VmlkZW9CdWZmZXI7CiAgICAgTWVkaWFCdWZmZXIgKm1WaWRlb0J1ZmZlcjsKIAotICAgIHNwPFByZWZldGNoZXI+IG1QcmVmZXRjaGVyOwotICAgIHNwPEhUVFBEYXRhU291cmNlPiBtQ29ubmVjdGluZ0RhdGFTb3VyY2U7CisgICAgc3A8TnVIVFRQRGF0YVNvdXJjZT4gbUNvbm5lY3RpbmdEYXRhU291cmNlOworICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QVJUU1BDb250cm9sbGVyPiBtUlRTUENvbnRyb2xsZXI7CisgICAgc3A8QVJUUFNlc3Npb24+IG1SVFBTZXNzaW9uOworICAgIHNwPFVEUFB1c2hlcj4gbVJUUFB1c2hlciwgbVJUQ1BQdXNoZXI7CiAKICAgICBzdHJ1Y3QgU3VzcGVuc2lvblN0YXRlIHsKICAgICAgICAgU3RyaW5nOCBtVXJpOwpAQCAtMjA4LDggKzIyOSw5IEBACiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwogICAgIHZvaWQgcmVzZXRfbCgpOworICAgIHZvaWQgcGFydGlhbF9yZXNldF9sKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOwotICAgIHN0YXR1c190IHBhdXNlX2woKTsKKyAgICBzdGF0dXNfdCBwYXVzZV9sKGJvb2wgYXRfZW9zID0gZmFsc2UpOwogICAgIHZvaWQgaW5pdFJlbmRlcmVyX2woKTsKICAgICB2b2lkIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIApAQCAtMjE5LDcgKzI0MSw3IEBACiAgICAgc3RhdHVzX3QgaW5pdEF1ZGlvRGVjb2RlcigpOwogCiAgICAgdm9pZCBzZXRWaWRlb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKTsKLSAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgaW5pdFZpZGVvRGVjb2Rlcih1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgdm9pZCBvblN0cmVhbURvbmUoKTsKIApAQCAtMjMwLDExICsyNTIsMjEgQEAKICAgICB2b2lkIG9uQ2hlY2tBdWRpb1N0YXR1cygpOwogICAgIHZvaWQgb25QcmVwYXJlQXN5bmNFdmVudCgpOwogICAgIHZvaWQgYWJvcnRQcmVwYXJlKHN0YXR1c190IGVycik7CisgICAgdm9pZCBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOworCisgICAgYm9vbCBnZXRDYWNoZWREdXJhdGlvbl9sKGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcyk7CiAKICAgICBzdGF0dXNfdCBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKIAogICAgIHN0YXRpYyBib29sIENvbnRpbnVlUHJlcGFyYXRpb24odm9pZCAqY29va2llKTsKIAorICAgIHN0YXRpYyB2b2lkIE9uUlRTUFNlZWtEb25lV3JhcHBlcih2b2lkICpjb29raWUpOworICAgIHZvaWQgb25SVFNQU2Vla0RvbmUoKTsKKworICAgIGJvb2wgZ2V0Qml0cmF0ZShpbnQ2NF90ICpiaXRyYXRlKTsKKworICAgIHZvaWQgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpOworCiAgICAgQXdlc29tZVBsYXllcihjb25zdCBBd2Vzb21lUGxheWVyICYpOwogICAgIEF3ZXNvbWVQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBBd2Vzb21lUGxheWVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCmluZGV4IDAxZTIyNmUuLmNhZmM4MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaApAQCAtMjMsNiArMjMsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CkBAIC01MSw3ICs1Miw4IEBACiB9OwogCiBib29sIFNuaWZmRFJNKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gKik7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRzcxMURlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRzcxMURlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUxNDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9HNzExRGVjb2Rlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEc3MTFfREVDT0RFUl9IXworCisjZGVmaW5lIEc3MTFfREVDT0RFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworc3RydWN0IEc3MTFEZWNvZGVyIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBHNzExRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RzcxMURlY29kZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbUlzTUxhdzsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKKworICAgIHN0YXRpYyB2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisgICAgc3RhdGljIHZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKworICAgIEc3MTFEZWNvZGVyKGNvbnN0IEc3MTFEZWNvZGVyICYpOworICAgIEc3MTFEZWNvZGVyICZvcGVyYXRvcj0oY29uc3QgRzcxMURlY29kZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEc3MTFfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggYzZiMWE4Yi4uN2RkYmI0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC04MCw2ICs4MCw3IEBACiAgICAgYm9vbCBwYXJzZVYxKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwogICAgIGJvb2wgcGFyc2VWMihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKICAgICB2b2lkIHJlbW92ZVVuc3luY2hyb25pemF0aW9uKCk7CisgICAgYm9vbCByZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoKTsKIAogICAgIHN0YXRpYyBib29sIFBhcnNlU3luY3NhZmVJbnRlZ2VyKGNvbnN0IHVpbnQ4X3QgZW5jb2RlZFs0XSwgc2l6ZV90ICp4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0xpdmVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRkNDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU291cmNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTElWRV9TT1VSQ0VfSF8KKworI2RlZmluZSBMSVZFX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBOdUhUVFBEYXRhU291cmNlOworc3RydWN0IE0zVVBhcnNlcjsKKworc3RydWN0IExpdmVTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICAgTGl2ZVNvdXJjZShjb25zdCBjaGFyICp1cmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmc7CisgICAgfQorCisgICAgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdDsKKworICAgIGJvb2wgaXNTZWVrYWJsZSgpIGNvbnN0OworICAgIGJvb2wgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5MaXZlU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEJhbmR3aWR0aEl0ZW0geworICAgICAgICBBU3RyaW5nIG1VUkk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbUJhbmR3aWR0aDsKKyAgICB9OworICAgIFZlY3RvcjxCYW5kd2lkdGhJdGVtPiBtQmFuZHdpZHRoSXRlbXM7CisKKyAgICBBU3RyaW5nIG1NYXN0ZXJVUkw7CisgICAgQVN0cmluZyBtVVJMOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgaW50NjRfdCBtRHVyYXRpb25VczsKKworICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OworICAgIGludDMyX3QgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyOworICAgIHNpemVfdCBtUGxheWxpc3RJbmRleDsKKyAgICBpbnQ2NF90IG1MYXN0RmV0Y2hUaW1lVXM7CisKKyAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtU291cmNlOworICAgIG9mZl90IG1Tb3VyY2VTaXplOworICAgIG9mZl90IG1PZmZzZXRCaWFzOworCisgICAgYm9vbCBtU2lnbmFsRGlzY29udGludWl0eTsKKyAgICBzc2l6ZV90IG1QcmV2QmFuZHdpZHRoSW5kZXg7CisKKyAgICBzdGF0dXNfdCBmZXRjaE0zVShjb25zdCBjaGFyICp1cmwsIHNwPEFCdWZmZXI+ICpidWZmZXIpOworCisgICAgc3RhdGljIGludCBTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqYSwgY29uc3QgQmFuZHdpZHRoSXRlbSAqYik7CisKKyAgICBib29sIHN3aXRjaFRvTmV4dCgpOworICAgIGJvb2wgbG9hZFBsYXlsaXN0KGJvb2wgZmV0Y2hNYXN0ZXIpOworICAgIHZvaWQgZGV0ZXJtaW5lU2Vla2FiaWxpdHkoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpdmVTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBMSVZFX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5ZWViZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTTNVX1BBUlNFUl9IXworCisjZGVmaW5lIE0zVV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE0zVVBhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBNM1VQYXJzZXIoY29uc3QgY2hhciAqYmFzZVVSSSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICBib29sIGlzRXh0TTNVKCkgY29uc3Q7CisgICAgYm9vbCBpc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0OworICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OworCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKKworICAgIHNpemVfdCBzaXplKCk7CisgICAgYm9vbCBpdGVtQXQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICp1cmksIHNwPEFNZXNzYWdlPiAqbWV0YSA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TTNVUGFyc2VyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEl0ZW0geworICAgICAgICBBU3RyaW5nIG1VUkk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKKyAgICB9OworCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIEFTdHJpbmcgbUJhc2VVUkk7CisgICAgYm9vbCBtSXNFeHRNM1U7CisgICAgYm9vbCBtSXNWYXJpYW50UGxheWxpc3Q7CisgICAgYm9vbCBtSXNDb21wbGV0ZTsKKworICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKKyAgICBWZWN0b3I8SXRlbT4gbUl0ZW1zOworCisgICAgc3RhdHVzX3QgcGFyc2UoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgc3RhdGljIHN0YXR1c190IHBhcnNlTWV0YURhdGEoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZsaW5lLCBzcDxBTWVzc2FnZT4gKm1ldGEsIGNvbnN0IGNoYXIgKmtleSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VTdHJlYW1JbmYoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZsaW5lLCBzcDxBTWVzc2FnZT4gKm1ldGEpOworCisgICAgc3RhdGljIHN0YXR1c190IFBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNM1VQYXJzZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNM1VfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNEZWNvZGVyLmgKaW5kZXggZWM0OWU4MC4uN2Q3M2UzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTR2SDI2M0RlY29kZXIuaApAQCAtNTQsNiArNTQsNyBAQAogICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7CiAKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIGludDY0X3QgbVRhcmdldFRpbWVVczsKIAogICAgIHZvaWQgYWxsb2NhdGVGcmFtZXMoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOwogICAgIHZvaWQgcmVsZWFzZUZyYW1lcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTlmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNFbmNvZGVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTTRWX0gyNjNfRU5DT0RFUl9IXworCisjZGVmaW5lIE00Vl9IMjYzX0VOQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworc3RydWN0IHRhZ3ZpZGVvRW5jQ29udHJvbHM7CitzdHJ1Y3QgdGFndmlkZW9FbmNPcHRpb25zOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworCitzdHJ1Y3QgTTR2SDI2M0VuY29kZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBNNHZIMjYzRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TTR2SDI2M0VuY29kZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZXRhRGF0YT4gICAgbUZvcm1hdDsKKyAgICBzcDxNZXRhRGF0YT4gICAgbU1ldGE7CisKKyAgICBpbnQzMl90ICBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90ICBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCAgbVZpZGVvRnJhbWVSYXRlOworICAgIGludDMyX3QgIG1WaWRlb0JpdFJhdGU7CisgICAgaW50MzJfdCAgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIGludDY0X3QgIG1OZXh0TW9kVGltZVVzOworICAgIGludDY0X3QgIG1QcmV2VGltZXN0YW1wVXM7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgICAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICAgKm1FbmNQYXJhbXM7CisgICAgTWVkaWFCdWZmZXIgICAgICAgICAgICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICptSW5wdXRGcmFtZURhdGE7CisgICAgTWVkaWFCdWZmZXJHcm91cCAgICAgICptR3JvdXA7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBNNHZIMjYzRW5jb2Rlcihjb25zdCBNNHZIMjYzRW5jb2RlciAmKTsKKyAgICBNNHZIMjYzRW5jb2RlciAmb3BlcmF0b3I9KGNvbnN0IE00dkgyNjNFbmNvZGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNNFZfSDI2M19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCmluZGV4IDg4YWE0YzYuLjQwODZmYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCkBAIC00Miw2ICs0Miw5IEBACiAKIHByaXZhdGU6CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworCiAgICAgYm9vbCBtU3RhcnRlZDsKIAogICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKQEAgLTQ5LDEwICs1MiwxMiBAQAogICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKICAgICB2b2lkICptRGVjb2RlckJ1ZjsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CiAKICAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOwogCisgICAgdm9pZCBpbml0KCk7CisKICAgICBNUDNEZWNvZGVyKGNvbnN0IE1QM0RlY29kZXIgJik7CiAgICAgTVAzRGVjb2RlciAmb3BlcmF0b3I9KGNvbnN0IE1QM0RlY29kZXIgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKaW5kZXggM2NlNmRmMy4uMzAxMzZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCkBAIC0yMiwxMyArMjIsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAogY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKIHB1YmxpYzoKICAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCi0gICAgTVAzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgIE1QM0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKICAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwpAQCAtMzYsMTAgKzM3LDkgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDNFeHRyYWN0b3IoKTsKLQogcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgb2ZmX3QgbUZpcnN0RnJhbWVQb3M7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwpAQCAtNTIsNyArNTIsOCBAQAogfTsKIAogYm9vbCBTbmlmZk1QMygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKTsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKm1ldGEpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4M2I1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworc3RydWN0IEFUU1BhcnNlcjsKK3N0cnVjdCBEYXRhU291cmNlOworc3RydWN0IE1QRUcyVFNTb3VyY2U7CitzdHJ1Y3QgU3RyaW5nODsKK3N0cnVjdCBMaXZlU291cmNlOworCitzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisgICAgTVBFRzJUU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKworICAgIHZvaWQgc2V0TGl2ZVNvdXJjZShjb25zdCBzcDxMaXZlU291cmNlPiAmbGl2ZVNvdXJjZSk7CisgICAgdm9pZCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgc3A8TGl2ZVNvdXJjZT4gbUxpdmVTb3VyY2U7CisKKyAgICBzcDxBVFNQYXJzZXI+IG1QYXJzZXI7CisKKyAgICBWZWN0b3I8c3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtU291cmNlSW1wbHM7CisKKyAgICBvZmZfdCBtT2Zmc2V0OworCisgICAgdm9pZCBpbml0KCk7CisgICAgc3RhdHVzX3QgZmVlZE1vcmUoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOworfTsKKworYm9vbCBTbmlmZk1QRUcyVFMoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDg0OWJjODkuLmJjMmU0ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU2FtcGxlVGFibGU7CiBjbGFzcyBTdHJpbmc4OwpAQCAtODcsMTIgKzg4LDE1IEBACiAgICAgYm9vbCBtSXNEcm07CiAgICAgc3RhdHVzX3QgcGFyc2VEcm1TSU5GKG9mZl90ICpvZmZzZXQsIG9mZl90IGRhdGFfb2Zmc2V0KTsKIAorICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmX3QgZGF0YV9vZmZzZXQsIG9mZl90IGRhdGFfc2l6ZSk7CisKICAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKICAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogfTsKIAogYm9vbCBTbmlmZk1QRUc0KAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMjA4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VX0NBQ0hFRF9TT1VSQ0VfMl9IXworCisjZGVmaW5lIE5VX0NBQ0hFRF9TT1VSQ0VfMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgUGFnZUNhY2hlOworCitzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIE51Q2FjaGVkU291cmNlMihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZl90ICpzaXplKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBzaXplX3QgY2FjaGVkU2l6ZSgpOworICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nKGJvb2wgKmVvcyk7CisKKyAgICB2b2lkIHN1c3BlbmQoKTsKKyAgICB2b2lkIGNsZWFyQ2FjaGVBbmRSZXN1bWUoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk51Q2FjaGVkU291cmNlMigpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3I8TnVDYWNoZWRTb3VyY2UyPjsKKworICAgIGVudW0geworICAgICAgICBrUGFnZVNpemUgICAgICAgICAgICA9IDY1NTM2LAorICAgICAgICBrSGlnaFdhdGVyVGhyZXNob2xkICA9IDUgKiAxMDI0ICogMTAyNCwKKyAgICAgICAga0xvd1dhdGVyVGhyZXNob2xkICAgPSA1MTIgKiAxMDI0LAorCisgICAgICAgIC8vIFJlYWQgZGF0YSBhZnRlciBhIDE1IHNlYyB0aW1lb3V0IHdoZXRoZXIgd2UncmUgYWN0aXZlbHkKKyAgICAgICAgLy8gZmV0Y2hpbmcgb3Igbm90LgorICAgICAgICBrS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IDE1MDAwMDAwLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGZXRjaE1vcmUgID0gJ2ZldGMnLAorICAgICAgICBrV2hhdFJlYWQgICAgICAgPSAncmVhZCcsCisgICAgICAgIGtXaGF0U3VzcGVuZCAgICA9ICdzdXNwJywKKyAgICB9OworCisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+ID4gbVJlZmxlY3RvcjsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgTXV0ZXggbVNlcmlhbGl6ZXI7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBQYWdlQ2FjaGUgKm1DYWNoZTsKKyAgICBvZmZfdCBtQ2FjaGVPZmZzZXQ7CisgICAgc3RhdHVzX3QgbUZpbmFsU3RhdHVzOworICAgIG9mZl90IG1MYXN0QWNjZXNzUG9zOworICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNSZXN1bHQ7CisgICAgYm9vbCBtRmV0Y2hpbmc7CisgICAgaW50NjRfdCBtTGFzdEZldGNoVGltZVVzOworICAgIGJvb2wgbVN1c3BlbmRlZDsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25GZXRjaCgpOworICAgIHZvaWQgb25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uU3VzcGVuZCgpOworCisgICAgdm9pZCBmZXRjaEludGVybmFsKCk7CisgICAgc3NpemVfdCByZWFkSW50ZXJuYWwob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmX3Qgb2Zmc2V0KTsKKworICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woYm9vbCAqZW9zKTsKKyAgICB2b2lkIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVDYWNoZWRTb3VyY2UyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTNhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIE5VX0hUVFBfREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgIkhUVFBTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVIVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBOdUhUVFBEYXRhU291cmNlKCk7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gMCk7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TnVIVFRQRGF0YVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIFN0YXRlIG1TdGF0ZTsKKworICAgIFN0cmluZzggbUhvc3Q7CisgICAgdW5zaWduZWQgbVBvcnQ7CisgICAgU3RyaW5nOCBtUGF0aDsKKyAgICBTdHJpbmc4IG1IZWFkZXJzOworCisgICAgSFRUUFN0cmVhbSBtSFRUUDsKKyAgICBvZmZfdCBtT2Zmc2V0OworICAgIG9mZl90IG1Db250ZW50TGVuZ3RoOworICAgIGJvb2wgbUNvbnRlbnRMZW5ndGhWYWxpZDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsIG9mZl90IG9mZnNldCk7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsCisgICAgICAgICAgICBvZmZfdCBvZmZzZXQpOworCisgICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOworCisgICAgc3RhdGljIHZvaWQgTWFrZUZ1bGxIZWFkZXJzKAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKm92ZXJyaWRlcywKKyAgICAgICAgICAgIFN0cmluZzggKmhlYWRlcnMpOworCisgICAgTnVIVFRQRGF0YVNvdXJjZShjb25zdCBOdUhUVFBEYXRhU291cmNlICYpOworICAgIE51SFRUUERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBOdUhUVFBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAppbmRleCBlYTEzMWU4Li43MmFiNWFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKQEAgLTkyLDcgKzkyLDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgICAgIHNpemVfdCBlbmNvZGVkV2lkdGgsIHNpemVfdCBlbmNvZGVkSGVpZ2h0LAotICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvKTsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCiAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKTsKLSAgICAgICAgCisKICAgICBPTVhfRVJST1JUWVBFIE9uRW1wdHlCdWZmZXJEb25lKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOwogCkBAIC0xMTUsMjAgKzExNiwxOSBAQAogICAgIHZpcnR1YWwgfk9NWCgpOwogCiBwcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgT01YTWFzdGVyICptTWFzdGVyOwotCiAgICAgc3RydWN0IENhbGxiYWNrRGlzcGF0Y2hlcjsKLSAgICBzcDxDYWxsYmFja0Rpc3BhdGNoZXI+IG1EaXNwYXRjaGVyOwogCisgICAgTXV0ZXggbUxvY2s7CisgICAgT01YTWFzdGVyICptTWFzdGVyOwogICAgIGludDMyX3QgbU5vZGVDb3VudGVyOwogCiAgICAgS2V5ZWRWZWN0b3I8d3A8SUJpbmRlcj4sIE9NWE5vZGVJbnN0YW5jZSAqPiBtTGl2ZU5vZGVzOwogICAgIEtleWVkVmVjdG9yPG5vZGVfaWQsIE9NWE5vZGVJbnN0YW5jZSAqPiBtTm9kZUlEVG9JbnN0YW5jZTsKKyAgICBLZXllZFZlY3Rvcjxub2RlX2lkLCBzcDxDYWxsYmFja0Rpc3BhdGNoZXI+ID4gbURpc3BhdGNoZXJzOwogCiAgICAgbm9kZV9pZCBtYWtlTm9kZUlEKE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UpOwogICAgIE9NWE5vZGVJbnN0YW5jZSAqZmluZEluc3RhbmNlKG5vZGVfaWQgbm9kZSk7CisgICAgc3A8Q2FsbGJhY2tEaXNwYXRjaGVyPiBmaW5kRGlzcGF0Y2hlcihub2RlX2lkIG5vZGUpOwogCiAgICAgdm9pZCBpbnZhbGlkYXRlTm9kZUlEX2wobm9kZV9pZCBub2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKaW5kZXggNzA2NjY2OS4uMWVkYTAyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKQEAgLTUzLDcgKzU0LDggQEAKIH07CiAKIGJvb2wgU25pZmZPZ2coCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ByZWZldGNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvUHJlZmV0Y2hlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDExZDFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvUHJlZmV0Y2hlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUFJFRkVUQ0hFUl9IXwotCi0jZGVmaW5lIFBSRUZFVENIRVJfSF8KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IFByZWZldGNoZWRTb3VyY2U7Ci0KLXN0cnVjdCBQcmVmZXRjaGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIFByZWZldGNoZXIoKTsKLQotICAgIC8vIEdpdmVuIGFuIGV4aXN0aW5nIE1lZGlhU291cmNlIHJldHVybnMgYSBuZXcgTWVkaWFTb3VyY2UKLSAgICAvLyB0aGF0IHdpbGwgYmVuZWZpdCBmcm9tIHByZWZldGNoaW5nL2NhY2hpbmcgdGhlIG9yaWdpbmFsIG9uZS4KLSAgICBzcDxNZWRpYVNvdXJjZT4gYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLQotICAgIGludDY0X3QgZ2V0Q2FjaGVkRHVyYXRpb25Vcyhib29sICpub01vcmVEYXRhID0gTlVMTCk7Ci0KLSAgICAvLyBJZiBwcm92aWRlZCAobm9uLU5VTEwpLCAiY29udGludWVGdW5jIiB3aWxsIGJlIGNhbGxlZCByZXBlYXRlZGx5Ci0gICAgLy8gd2hpbGUgcHJlcGFyaW5nIGFuZCBwcmVwYXJhdGlvbiB3aWxsIGZpbmlzaCBlYXJseSBpZiBpdCByZXR1cm5zCi0gICAgLy8gZmFsc2UuIEluIHRoaXMgY2FzZSAiLUVJTlRSIiBpcyByZXR1cm5lZCBhcyBhIHJlc3VsdC4KLSAgICBzdGF0dXNfdCBwcmVwYXJlKAotICAgICAgICAgICAgYm9vbCAoKmNvbnRpbnVlRnVuYykodm9pZCAqY29va2llKSA9IE5VTEwsCi0gICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflByZWZldGNoZXIoKTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIFZlY3Rvcjx3cDxQcmVmZXRjaGVkU291cmNlPiA+IG1Tb3VyY2VzOwotICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgbVRocmVhZDsKLSAgICBib29sIG1Eb25lOwotICAgIGJvb2wgbVRocmVhZEV4aXRlZDsKLQotICAgIHZvaWQgc3RhcnRUaHJlYWQoKTsKLSAgICB2b2lkIHN0b3BUaHJlYWQoKTsKLQotICAgIHN0YXRpYyBpbnQgVGhyZWFkV3JhcHBlcih2b2lkICptZSk7Ci0gICAgdm9pZCB0aHJlYWRGdW5jKCk7Ci0KLSAgICBQcmVmZXRjaGVyKGNvbnN0IFByZWZldGNoZXIgJik7Ci0gICAgUHJlZmV0Y2hlciAmb3BlcmF0b3I9KGNvbnN0IFByZWZldGNoZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBSRUZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAppbmRleCA1MzNjZTg0Li5mODMwNjkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCkBAIC02MCwxNCArNjAsMjEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICAgICAgb2ZmX3QgKm9mZnNldCwKICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpkZWNvZGluZ1RpbWUpOworICAgICAgICAgICAgdWludDMyX3QgKmRlY29kaW5nVGltZSwKKyAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwpOwogCiAgICAgZW51bSB7Ci0gICAgICAgIGtTeW5jU2FtcGxlX0ZsYWcgPSAxCisgICAgICAgIGtGbGFnQmVmb3JlLAorICAgICAgICBrRmxhZ0FmdGVyLAorICAgICAgICBrRmxhZ0Nsb3Nlc3QKICAgICB9OwotICAgIHN0YXR1c190IGZpbmRDbG9zZXN0U2FtcGxlKAorICAgIHN0YXR1c190IGZpbmRTYW1wbGVBdFRpbWUoCiAgICAgICAgICAgICB1aW50MzJfdCByZXFfdGltZSwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCisgICAgc3RhdHVzX3QgZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCiAgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbFNhbXBsZSh1aW50MzJfdCAqc2FtcGxlX2luZGV4KTsKIAogcHJvdGVjdGVkOgpAQCAtOTksNiArMTA2LDggQEAKIAogICAgIG9mZl90IG1TeW5jU2FtcGxlT2Zmc2V0OwogICAgIHVpbnQzMl90IG1OdW1TeW5jU2FtcGxlczsKKyAgICB1aW50MzJfdCAqbVN5bmNTYW1wbGVzOworICAgIHNpemVfdCBtTGFzdFN5bmNTYW1wbGVJbmRleDsKIAogICAgIFNhbXBsZUl0ZXJhdG9yICptU2FtcGxlSXRlcmF0b3I7CiAKQEAgLTExMSw5ICsxMjAsNiBAQAogCiAgICAgZnJpZW5kIHN0cnVjdCBTYW1wbGVJdGVyYXRvcjsKIAotICAgIHN0YXR1c190IGZpbmRDbG9zZXN0U3luY1NhbXBsZV9sKAotICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4KTsKLQogICAgIHN0YXR1c190IGdldFNhbXBsZVNpemVfbCh1aW50MzJfdCBzYW1wbGVfaW5kZXgsIHNpemVfdCAqc2FtcGxlX3NpemUpOwogCiAgICAgU2FtcGxlVGFibGUoY29uc3QgU2FtcGxlVGFibGUgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDllZWQwODkuLjI1YzlkZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0zMyw3ICszMyw4IEBACiAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOworICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQsCisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcyA9IDApOwogCiAgICAgdmlydHVhbCB+U29mdHdhcmVSZW5kZXJlcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RocmVhZGVkU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RocmVhZGVkU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3Mjk1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyZWFkZWRTb3VyY2UuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJFQURFRF9TT1VSQ0VfSF8KKworI2RlZmluZSBUSFJFQURFRF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFRocmVhZGVkU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBUaHJlYWRlZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRocmVhZGVkU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RGVjb2RlTW9yZSA9ICdkZWNvJywKKyAgICAgICAga1doYXRTZWVrICAgICAgID0gJ3NlZWsnLAorICAgIH07CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxUaHJlYWRlZFNvdXJjZT4gPiBtUmVmbGVjdG9yOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKyAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1RdWV1ZTsKKyAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisgICAgYm9vbCBtRGVjb2RlUGVuZGluZzsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbVNlZWtNb2RlOworCisgICAgdm9pZCBwb3N0RGVjb2RlTW9yZV9sKCk7CisgICAgdm9pZCBjbGVhclF1ZXVlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRocmVhZGVkU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVEhSRUFERURfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODE2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJPVFRMRURfU09VUkNFX0hfCisKKyNkZWZpbmUgVEhST1RUTEVEX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgVGhyb3R0bGVkU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIFRocm90dGxlZFNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBpbnQzMl90IGJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmX3QgKnNpemUpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKworICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgaW50MzJfdCBtQmFuZHdpZHRoTGltaXRCeXRlc1BlclNlY29uZDsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJyZWQ7CisKKyAgICBUaHJvdHRsZWRTb3VyY2UoY29uc3QgVGhyb3R0bGVkU291cmNlICYpOworICAgIFRocm90dGxlZFNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFRocm90dGxlZFNvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVEhST1RUTEVEX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WUFhEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ZQWERlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjgzNjJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WUFhEZWNvZGVyLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVlBYX0RFQ09ERVJfSF8KKworI2RlZmluZSBWUFhfREVDT0RFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworc3RydWN0IFZQWERlY29kZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIFZQWERlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZQWERlY29kZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBib29sIG1TdGFydGVkOworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIHNpemVfdCBtQnVmZmVyU2l6ZTsKKworICAgIHZvaWQgKm1DdHg7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOworCisgICAgaW50NjRfdCBtVGFyZ2V0VGltZVVzOworCisgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CisKKyAgICBWUFhEZWNvZGVyKGNvbnN0IFZQWERlY29kZXIgJik7CisgICAgVlBYRGVjb2RlciAmb3BlcmF0b3I9KGNvbnN0IFZQWERlY29kZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZQWF9ERUNPREVSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVm9yYmlzRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Wb3JiaXNEZWNvZGVyLmgKaW5kZXggZTlhNDg4YS4uMTNlOGI3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Wb3JiaXNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Wb3JiaXNEZWNvZGVyLmgKQEAgLTU1LDYgKzU1LDcgQEAKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKIAogICAgIHZvcmJpc19kc3Bfc3RhdGUgKm1TdGF0ZTsKICAgICB2b3JiaXNfaW5mbyAqbVZpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKaW5kZXggOTM4NDk0Mi4uZGY2ZDNlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKQEAgLTQzLDYgKzQ0LDcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVZhbGlkRm9ybWF0OworICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OwogICAgIHVpbnQxNl90IG1OdW1DaGFubmVsczsKICAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICB1aW50MTZfdCBtQml0c1BlclNhbXBsZTsKQEAgLTU3LDcgKzU5LDggQEAKIH07CiAKIGJvb2wgU25pZmZXQVYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNmYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBVkNfVVRJTFNfSF8KKworI2RlZmluZSBBVkNfVVRJTFNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQml0UmVhZGVyOworCit2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworCit1bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKTsKKworc3RhdHVzX3QgZ2V0TmV4dE5BTFVuaXQoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipfZGF0YSwgc2l6ZV90ICpfc2l6ZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqKm5hbFN0YXJ0LCBzaXplX3QgKm5hbFNpemUsCisgICAgICAgIGJvb2wgc3RhcnRDb2RlRm9sbG93cyA9IGZhbHNlKTsKKworc3RydWN0IE1ldGFEYXRhOworc3A8TWV0YURhdGE+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisKK2Jvb2wgSXNJRFIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFWQ19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjOWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IuY3BwICAgICBcCisgICAgICAgIG1rdnBhcnNlci5jcHAgICAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoSk5JX0hfSU5DTFVERSkgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDY5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDU5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWF0cm9za2FFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSAibWt2cGFyc2VyLmhwcCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERhdGFTb3VyY2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKKyAgICBEYXRhU291cmNlUmVhZGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBSZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcikgeworICAgICAgICBDSEVDSyhwb3NpdGlvbiA+PSAwKTsKKyAgICAgICAgQ0hFQ0sobGVuZ3RoID49IDApOworCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQocG9zaXRpb24sIGJ1ZmZlciwgbGVuZ3RoKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKKyAgICAgICAgb2ZmX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICp0b3RhbCA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAqYXZhaWxhYmxlID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworCisgICAgRGF0YVNvdXJjZVJlYWRlcihjb25zdCBEYXRhU291cmNlUmVhZGVyICYpOworICAgIERhdGFTb3VyY2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlUmVhZGVyICYpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPGN0eXBlLmg+CitzdGF0aWMgdm9pZCBoZXhkdW1wKGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIHByaW50ZigiMHglMDR4ICAiLCBvZmZzZXQpOworCisgICAgICAgIHNpemVfdCBuID0gc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgaWYgKG4gPiAxNikgeworICAgICAgICAgICAgbiA9IDE2OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSA4KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBpIDwgc2l6ZSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBkYXRhW29mZnNldCArIGldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigiICIpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXNwcmludChkYXRhW29mZnNldCArIGldKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJWMiLCBkYXRhW29mZnNldCArIGldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoIlxuIik7CisKKyAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgIH0KK30KKworc3RydWN0IEJsb2NrSXRlcmF0b3IgeworICAgIEJsb2NrSXRlcmF0b3IobWt2cGFyc2VyOjpTZWdtZW50ICpzZWdtZW50LCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKTsKKworICAgIGJvb2wgZW9zKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkdmFuY2UoKTsKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jaygpIGNvbnN0OworICAgIGludDY0X3QgYmxvY2tUaW1lVXMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OworICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOworCisgICAgbWt2cGFyc2VyOjpDbHVzdGVyICptQ2x1c3RlcjsKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OworCisgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworfTsKKworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBNYXRyb3NrYVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1hdHJvc2thRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBBVkMsCisgICAgICAgIEFBQywKKyAgICAgICAgT1RIRVIKKyAgICB9OworCisgICAgc3A8TWF0cm9za2FFeHRyYWN0b3I+IG1FeHRyYWN0b3I7CisgICAgc2l6ZV90IG1UcmFja0luZGV4OworICAgIFR5cGUgbVR5cGU7CisgICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOworCisgICAgc3RhdHVzX3QgYWR2YW5jZSgpOworCisgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CisgICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKK307CisKK01hdHJvc2thU291cmNlOjpNYXRyb3NrYVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TWF0cm9za2FFeHRyYWN0b3I+ICZleHRyYWN0b3IsIHNpemVfdCBpbmRleCkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1UcmFja0luZGV4KGluZGV4KSwKKyAgICAgIG1UeXBlKE9USEVSKSwKKyAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci0+bVNlZ21lbnQsCisgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0pIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YS0+CisgICAgICAgICAgICBmaW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBtVHlwZSA9IEFWQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKKyAgICAgICAgbVR5cGUgPSBBQUM7CisgICAgfQorfQorCitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCbG9ja0l0ZXJhdG9yOjpCbG9ja0l0ZXJhdG9yKAorICAgICAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKnNlZ21lbnQsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pCisgICAgOiBtU2VnbWVudChzZWdtZW50KSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtQ2x1c3RlcihOVUxMKSwKKyAgICAgIG1CbG9ja0VudHJ5KE5VTEwpIHsKKyAgICByZXNldCgpOworfQorCitib29sIEJsb2NrSXRlcmF0b3I6OmVvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsdXN0ZXIgPT0gTlVMTCB8fCBtQ2x1c3Rlci0+RU9TKCk7Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6YWR2YW5jZSgpIHsKKyAgICB3aGlsZSAoIWVvcygpKSB7CisgICAgICAgIGlmIChtQmxvY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyLT5HZXROZXh0KG1CbG9ja0VudHJ5KTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ2x1c3RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ2x1c3RlciA9IG1TZWdtZW50LT5HZXROZXh0KG1DbHVzdGVyKTsKKworICAgICAgICAgICAgaWYgKGVvcygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CbG9ja0VudHJ5ID0gbUNsdXN0ZXItPkdldEZpcnN0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJsb2NrRW50cnkgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUcmFja051bWJlcigpID09IG1UcmFja051bSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6cmVzZXQoKSB7CisgICAgbUNsdXN0ZXIgPSBtU2VnbWVudC0+R2V0Rmlyc3QoKTsKKyAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyLT5HZXRGaXJzdCgpOworCisgICAgd2hpbGUgKCFlb3MoKSAmJiBibG9jaygpLT5HZXRUcmFja051bWJlcigpICE9IG1UcmFja051bSkgeworICAgICAgICBhZHZhbmNlKCk7CisgICAgfQorfQorCit2b2lkIEJsb2NrSXRlcmF0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgbUNsdXN0ZXIgPSBtU2VnbWVudC0+R2V0Q2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKKyAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyICE9IE5VTEwgPyBtQ2x1c3Rlci0+R2V0Rmlyc3QoKSA6IE5VTEw7CisKKyAgICB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIWVvcygpICYmICFtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+SXNLZXkoKSkgeworICAgICAgICBhZHZhbmNlKCk7CisgICAgfQorfQorCitjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpCbG9ja0l0ZXJhdG9yOjpibG9jaygpIGNvbnN0IHsKKyAgICBDSEVDSyghZW9zKCkpOworCisgICAgcmV0dXJuIG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpOworfQorCitpbnQ2NF90IEJsb2NrSXRlcmF0b3I6OmJsb2NrVGltZVVzKCkgY29uc3QgeworICAgIHJldHVybiAobUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwbGwpIC8gMTAwMGxsOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgbUJsb2NrSXRlci5zZWVrKHNlZWtUaW1lVXMpOworICAgIH0KKworICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gbUJsb2NrSXRlci5ibG9jaygpOworICAgIHNpemVfdCBzaXplID0gYmxvY2stPkdldFNpemUoKTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IG1CbG9ja0l0ZXIuYmxvY2tUaW1lVXMoKTsKKworICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSArIDIpOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgYmxvY2stPklzS2V5KCkpOworCisgICAgbG9uZyByZXMgPSBibG9jay0+UmVhZCgKKyAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1SZWFkZXIsICh1bnNpZ25lZCBjaGFyICopYnVmZmVyLT5kYXRhKCkgKyAyKTsKKworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBidWZmZXItPnNldF9yYW5nZSgyLCBzaXplKTsKKworICAgIGlmIChtVHlwZSA9PSBBVkMpIHsKKyAgICAgICAgQ0hFQ0soc2l6ZSA+PSAyKTsKKworICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKKworICAgICAgICB1bnNpZ25lZCBOQUxzaXplID0gZGF0YVsyXSA8PCA4IHwgZGF0YVszXTsKKyAgICAgICAgQ0hFQ0tfRVEoc2l6ZSwgTkFMc2l6ZSArIDIpOworCisgICAgICAgIG1lbWNweShkYXRhLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBzaXplICsgMik7CisgICAgfSBlbHNlIGlmIChtVHlwZSA9PSBBQUMpIHsKKyAgICAgICAgLy8gVGhlcmUncyBzdHJhbmdlIGp1bmsgYXQgdGhlIGJlZ2lubmluZy4uLgorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgMjsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplICYmIGRhdGFbb2Zmc2V0XSAhPSAweDIxKSB7CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXItPnNldF9yYW5nZSgyICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICAqb3V0ID0gYnVmZmVyOworCisjaWYgMAorICAgIGhleGR1bXAoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyNlbmRpZgorCisgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VSZWFkZXIobURhdGFTb3VyY2UpKSwKKyAgICAgIG1TZWdtZW50KE5VTEwpLAorICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMoZmFsc2UpIHsKKyAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKKyAgICBsb25nIGxvbmcgcG9zOworICAgIGlmIChlYm1sSGVhZGVyLlBhcnNlKG1SZWFkZXIsIHBvcykgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb25nIGxvbmcgcmV0ID0KKyAgICAgICAgbWt2cGFyc2VyOjpTZWdtZW50OjpDcmVhdGVJbnN0YW5jZShtUmVhZGVyLCBwb3MsIG1TZWdtZW50KTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgICAgQ0hFQ0sobVNlZ21lbnQgPT0gTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXQgPSBtU2VnbWVudC0+TG9hZCgpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZGVsZXRlIG1TZWdtZW50OworICAgICAgICBtU2VnbWVudCA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhZGRUcmFja3MoKTsKK30KKworTWF0cm9za2FFeHRyYWN0b3I6On5NYXRyb3NrYUV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbVNlZ21lbnQ7CisgICAgbVNlZ21lbnQgPSBOVUxMOworCisgICAgZGVsZXRlIG1SZWFkZXI7CisgICAgbVJlYWRlciA9IE5VTEw7Cit9CisKK3NpemVfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOworfQorCitzcDxNZWRpYVNvdXJjZT4gTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKK30KKworc3A8TWV0YURhdGE+IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMpIHsKKyAgICAgICAgZmluZFRodW1ibmFpbHMoKTsKKyAgICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEVTRFNGcm9tQXVkaW9TcGVjaWZpY0luZm8oCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgdm9pZCAqYXNpLCBzaXplX3QgYXNpU2l6ZSkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CisgICAgICAgIDB4MDMsIDIyLAorICAgICAgICAweDAwLCAweDAwLCAgICAgLy8gRVNfSUQKKyAgICAgICAgMHgwMCwgICAgICAgICAgIC8vIHN0cmVhbURlcGVuZGVuY2VGbGFnLCBVUkxfRmxhZywgT0NSc3RyZWFtRmxhZworCisgICAgICAgIDB4MDQsIDE3LAorICAgICAgICAweDQwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKyAgICAgICAgMHgwNSwKKyAgICAgICAgLy8gQXVkaW9TcGVjaWZpY0luZm8gKHdpdGggc2l6ZSBwcmVmaXgpIGZvbGxvd3MKKyAgICB9OworCisgICAgQ0hFQ0soYXNpU2l6ZSA8IDEyOCk7CisgICAgc2l6ZV90IGVzZHNTaXplID0gc2l6ZW9mKGtTdGF0aWNFU0RTKSArIGFzaVNpemUgKyAxOworICAgIHVpbnQ4X3QgKmVzZHMgPSBuZXcgdWludDhfdFtlc2RzU2l6ZV07CisgICAgbWVtY3B5KGVzZHMsIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKKyAgICB1aW50OF90ICpwdHIgPSBlc2RzICsgc2l6ZW9mKGtTdGF0aWNFU0RTKTsKKyAgICAqcHRyKysgPSBhc2lTaXplOworICAgIG1lbWNweShwdHIsIGFzaSwgYXNpU2l6ZSk7CisKKyAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLCBlc2RzU2l6ZSk7CisKKyAgICBkZWxldGVbXSBlc2RzOworICAgIGVzZHMgPSBOVUxMOworfQorCit2b2lkIGFkZFZvcmJpc0NvZGVjSW5mbygKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAorICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgeworICAgIC8vIHByaW50Zigidm9yYmlzIHByaXZhdGUgZGF0YSBmb2xsb3dzOlxuIik7CisgICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKworICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMyk7CisKKyAgICBjb25zdCB1aW50OF90ICpjb2RlY1ByaXZhdGUgPSAoY29uc3QgdWludDhfdCAqKV9jb2RlY1ByaXZhdGU7CisgICAgQ0hFQ0soY29kZWNQcml2YXRlWzBdID09IDB4MDIpOworCisgICAgc2l6ZV90IGxlbjEgPSBjb2RlY1ByaXZhdGVbMV07CisgICAgc2l6ZV90IGxlbjIgPSBjb2RlY1ByaXZhdGVbMl07CisKKyAgICBDSEVDSyhjb2RlY1ByaXZhdGVTaXplID4gMyArIGxlbjEgKyBsZW4yKTsKKworICAgIENIRUNLKGNvZGVjUHJpdmF0ZVszXSA9PSAweDAxKTsKKyAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCAmY29kZWNQcml2YXRlWzNdLCBsZW4xKTsKKworICAgIENIRUNLKGNvZGVjUHJpdmF0ZVtsZW4xICsgM10gPT0gMHgwMyk7CisKKyAgICBDSEVDSyhjb2RlY1ByaXZhdGVbbGVuMSArIGxlbjIgKyAzXSA9PSAweDA1KTsKKyAgICBtZXRhLT5zZXREYXRhKAorICAgICAgICAgICAga0tleVZvcmJpc0Jvb2tzLCAwLCAmY29kZWNQcml2YXRlW2xlbjEgKyBsZW4yICsgM10sCisgICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplIC0gbGVuMSAtIGxlbjIgLSAzKTsKK30KKwordm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6YWRkVHJhY2tzKCkgeworICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2tzICp0cmFja3MgPSBtU2VnbWVudC0+R2V0VHJhY2tzKCk7CisKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOyArK2luZGV4KSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrID0gdHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOworCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGNvZGVjSUQgPSB0cmFjay0+R2V0Q29kZWNJZCgpOworICAgICAgICBMT0dWKCJjb2RlYyBpZCA9ICVzIiwgY29kZWNJRCk7CisgICAgICAgIExPR1YoImNvZGVjIG5hbWUgPSAlcyIsIHRyYWNrLT5HZXRDb2RlY05hbWVBc1VURjgoKSk7CisKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGVjUHJpdmF0ZSA9CisgICAgICAgICAgICB0cmFjay0+R2V0Q29kZWNQcml2YXRlKCZjb2RlY1ByaXZhdGVTaXplKTsKKworICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKworICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOworCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDgiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlBYKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHZ0cmFjay0+R2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgdnRyYWNrLT5HZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVFJBQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpBdWRpb1RyYWNrICphdHJhY2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKj4odHJhY2spOworCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIkFfQUFDIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21BdWRpb1NwZWNpZmljSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRWb3JiaXNDb2RlY0luZm8obWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgbG9uZyBkdXJhdGlvbk5zID0gbVNlZ21lbnQtPkdldER1cmF0aW9uKCk7CisgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CisKKyAgICAgICAgbVRyYWNrcy5wdXNoKCk7CisgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpOworICAgICAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKKyAgICAgICAgdHJhY2tJbmZvLT5tTWV0YSA9IG1ldGE7CisgICAgfQorfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpmaW5kVGh1bWJuYWlscygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhpbmZvLT5tTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKG1TZWdtZW50LCBpbmZvLT5tVHJhY2tOdW0pOworICAgICAgICBpbnQzMl90IGkgPSAwOworICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVcyA9IDA7CisgICAgICAgIHNpemVfdCBtYXhCbG9ja1NpemUgPSAwOworICAgICAgICB3aGlsZSAoIWl0ZXIuZW9zKCkgJiYgaSA8IDIwKSB7CisgICAgICAgICAgICBpZiAoaXRlci5ibG9jaygpLT5Jc0tleSgpKSB7CisgICAgICAgICAgICAgICAgKytpOworCisgICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IGl0ZXIuYmxvY2soKS0+R2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChibG9ja1NpemUgPiBtYXhCbG9ja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4QmxvY2tTaXplID0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxUaW1lVXMgPSBpdGVyLmJsb2NrVGltZVVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5mby0+bU1ldGEtPnNldEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCB0aHVtYm5haWxUaW1lVXMpOworICAgIH0KK30KKworc3A8TWV0YURhdGE+IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKKworICAgIHJldHVybiBtZXRhOworfQorCitib29sIFNuaWZmTWF0cm9za2EoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKKyAgICBEYXRhU291cmNlUmVhZGVyIHJlYWRlcihzb3VyY2UpOworICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOworICAgIGxvbmcgbG9uZyBwb3M7CisgICAgaWYgKGVibWxIZWFkZXIuUGFyc2UoJnJlYWRlciwgcG9zKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworICAgICpjb25maWRlbmNlID0gMC42OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIwYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBta3ZwYXJzZXIgeworc3RydWN0IFNlZ21lbnQ7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIFN0cmluZzg7CisKK3N0cnVjdCBEYXRhU291cmNlUmVhZGVyOworc3RydWN0IE1hdHJvc2thU291cmNlOworCitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWF0cm9za2FFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE1hdHJvc2thU291cmNlOworCisgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOworICAgICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgfTsKKyAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOworCisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZVJlYWRlciAqbVJlYWRlcjsKKyAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OworICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7CisKKyAgICB2b2lkIGFkZFRyYWNrcygpOworICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKKworICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOworICAgIE1hdHJvc2thRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7Cit9OworCitib29sIFNuaWZmTWF0cm9za2EoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvbWt2cGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL21rdnBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1MTAwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL21rdnBhcnNlci5jcHAKQEAgLTAsMCArMSwzMTAzIEBACisjaW5jbHVkZSAibWt2cGFyc2VyLmhwcCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK21rdnBhcnNlcjo6SU1rdlJlYWRlcjo6fklNa3ZSZWFkZXIoKQoreworfQorCitsb25nIGxvbmcgbWt2cGFyc2VyOjpSZWFkVUludChJTWt2UmVhZGVyKiBwUmVhZGVyLCBsb25nIGxvbmcgcG9zLCBsb25nJiBsZW4pCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChwb3MgPCBhdmFpbGFibGUpOworICAgIGFzc2VydCgoYXZhaWxhYmxlIC0gcG9zKSA+PSAxKTsgIC8vYXNzdW1lIGhlcmUgbWF4IHUtaW50IGxlbiBpcyA4CisgICAgCisgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJmIpOworICAgIGlmIChociA8IDApCisgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgCisgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAKKyAgICBpZiAoYiAmIDB4ODApICAgICAgIC8vMTAwMCAwMDAwCisgICAgeworICAgICAgICBsZW4gPSAxOworICAgICAgICBiICY9IDB4N0Y7ICAgICAgLy8wMTExIDExMTEKKyAgICB9ICAgICAgICAKKyAgICBlbHNlIGlmIChiICYgMHg0MCkgIC8vMDEwMCAwMDAwCisgICAgeworICAgICAgICBsZW4gPSAyOworICAgICAgICBiICY9IDB4M0Y7ICAgICAgLy8wMDExIDExMTEKKyAgICB9CisgICAgZWxzZSBpZiAoYiAmIDB4MjApICAvLzAwMTAgMDAwMAorICAgIHsKKyAgICAgICAgbGVuID0gMzsKKyAgICAgICAgYiAmPSAweDFGOyAgICAgIC8vMDAwMSAxMTExCisgICAgfQorICAgIGVsc2UgaWYgKGIgJiAweDEwKSAgLy8wMDAxIDAwMDAKKyAgICB7CisgICAgICAgIGxlbiA9IDQ7CisgICAgICAgIGIgJj0gMHgwRjsgICAgICAvLzAwMDAgMTExMQorICAgIH0KKyAgICBlbHNlIGlmIChiICYgMHgwOCkgIC8vMDAwMCAxMDAwCisgICAgeworICAgICAgICBsZW4gPSA1OworICAgICAgICBiICY9IDB4MDc7ICAgICAgLy8wMDAwIDAxMTEKKyAgICB9CisgICAgZWxzZSBpZiAoYiAmIDB4MDQpICAvLzAwMDAgMDEwMAorICAgIHsKKyAgICAgICAgbGVuID0gNjsKKyAgICAgICAgYiAmPSAweDAzOyAgICAgIC8vMDAwMCAwMDExCisgICAgfQorICAgIGVsc2UgaWYgKGIgJiAweDAyKSAgLy8wMDAwIDAwMTAKKyAgICB7CisgICAgICAgIGxlbiA9IDc7CisgICAgICAgIGIgJj0gMHgwMTsgICAgICAvLzAwMDAgMDAwMQorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIgJiAweDAxKTsgIC8vMDAwMCAwMDAxCisgICAgICAgIGxlbiA9IDg7CisgICAgICAgIGIgPSAwOyAgICAgICAgICAgICAvLzAwMDAgMDAwMAorICAgIH0KKyAgICAKKyAgICBhc3NlcnQoKGF2YWlsYWJsZSAtIHBvcykgPj0gbGVuKTsKKyAgICAKKyAgICBsb25nIGxvbmcgcmVzdWx0ID0gYjsKKyAgICArK3BvczsKKyAgICBmb3IgKGxvbmcgaSA9IDE7IGkgPCBsZW47ICsraSkKKyAgICB7CisgICAgICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MsIDEsICZiKTsKKyAgICAgICAgCisgICAgICAgIGlmIChociA8IDApCisgICAgICAgICAgICByZXR1cm4gaHI7CisgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA8PD0gODsKKyAgICAgICAgcmVzdWx0IHw9IGI7CisgICAgICAgIAorICAgICAgICArK3BvczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyAgICAKKyAgICAKK2xvbmcgbG9uZyBta3ZwYXJzZXI6OkdldFVJbnRMZW5ndGgoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcgcG9zLCAKKyAgICBsb25nJiBsZW4pCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIAorICAgIGlmIChwb3MgPj0gYXZhaWxhYmxlKQorICAgICAgICByZXR1cm4gcG9zOyAgLy90b28gZmV3IGJ5dGVzIGF2YWlsYWJsZQorICAgIAorICAgIHVuc2lnbmVkIGNoYXIgYjsKKyAgICAKKyAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgCisgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgcmV0dXJuIGhyOworCisgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAKKyAgICBpZiAoYiA9PSAwKSAgLy93ZSBjYW4ndCBoYW5kbGUgdS1pbnQgdmFsdWVzIGxhcmdlciB0aGFuIDggYnl0ZXMKKyAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyIG0gPSAweDgwOworICAgIGxlbiA9IDE7CisgICAgCisgICAgd2hpbGUgKCEoYiAmIG0pKQorICAgIHsKKyAgICAgICAgbSA+Pj0gMTsKKyAgICAgICAgKytsZW47CisgICAgfQorICAgIAorICAgIHJldHVybiAwOyAgLy9zdWNjZXNzCit9CisKKworbG9uZyBsb25nIG1rdnBhcnNlcjo6U3luY1JlYWRVSW50KAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nIHBvcywgCisgICAgbG9uZyBsb25nIHN0b3AsCisgICAgbG9uZyYgbGVuKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKworICAgIGlmIChwb3MgPj0gc3RvcCkKKyAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyIGI7CisgICAgCisgICAgbG9uZyBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgCisgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgcmV0dXJuIGhyOworICAgICAgICAKKyAgICBpZiAoaHIgIT0gMEwpCisgICAgICAgIHJldHVybiBFX0JVRkZFUl9OT1RfRlVMTDsKKworICAgIGlmIChiID09IDApICAvL3dlIGNhbid0IGhhbmRsZSB1LWludCB2YWx1ZXMgbGFyZ2VyIHRoYW4gOCBieXRlcworICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgIAorICAgIHVuc2lnbmVkIGNoYXIgbSA9IDB4ODA7CisgICAgbGVuID0gMTsKKyAgICAgICAgCisgICAgd2hpbGUgKCEoYiAmIG0pKQorICAgIHsKKyAgICAgICAgbSA+Pj0gMTsKKyAgICAgICAgKytsZW47CisgICAgfQorICAgIAorICAgIGlmICgocG9zICsgbGVuKSA+IHN0b3ApCisgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgIAorICAgIGxvbmcgbG9uZyByZXN1bHQgPSBiICYgKH5tKTsKKyAgICArK3BvczsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgKytpKQorICAgIHsKKyAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJmIpOworICAgICAgICAKKyAgICAgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgICAgCisgICAgICAgIGlmIChociAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICAgICAgICAgIAorICAgICAgICByZXN1bHQgPDw9IDg7CisgICAgICAgIHJlc3VsdCB8PSBiOworICAgICAgICAKKyAgICAgICAgKytwb3M7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworbG9uZyBsb25nIG1rdnBhcnNlcjo6VW5zZXJpYWxpemVVSW50KAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsIAorICAgIGxvbmcgbG9uZyBwb3MsCisgICAgbG9uZyBsb25nIHNpemUpCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgICBhc3NlcnQoc2l6ZSA8PSA4KTsKKyAgICAKKyAgICBsb25nIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAKKyAgICBmb3IgKGxvbmcgbG9uZyBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJmIpOworICAgICAgICAKKyAgICAgICAgaWYgKGhyIDwgMCkgICAgICAKKyAgICAgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgcmVzdWx0IDw8PSA4OworICAgICAgICByZXN1bHQgfD0gYjsKKyAgICAgICAgCisgICAgICAgICsrcG9zOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Zsb2F0IG1rdnBhcnNlcjo6VW5zZXJpYWxpemU0RmxvYXQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwgCisgICAgbG9uZyBsb25nIHBvcykKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKyAgICAKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIGFzc2VydCgocG9zICsgNCkgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBmbG9hdCByZXN1bHQ7CisgICAgCisgICAgdW5zaWduZWQgY2hhciogY29uc3QgcCA9ICh1bnNpZ25lZCBjaGFyKikmcmVzdWx0OworICAgIHVuc2lnbmVkIGNoYXIqIHEgPSBwICsgNDsKKyAgICAKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgLS1xKTsKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAgICAgCisgICAgICAgIGlmIChxID09IHApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICArK3BvczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitkb3VibGUgbWt2cGFyc2VyOjpVbnNlcmlhbGl6ZThEb3VibGUoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwgCisgICAgbG9uZyBsb25nIHBvcykKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBkb3VibGUgcmVzdWx0OworICAgIAorICAgIHVuc2lnbmVkIGNoYXIqIGNvbnN0IHAgPSAodW5zaWduZWQgY2hhciopJnJlc3VsdDsKKyAgICB1bnNpZ25lZCBjaGFyKiBxID0gcCArIDg7CisgICAgCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGNvbnN0IGxvbmcgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgLS1xKTsKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAgICAgCisgICAgICAgIGlmIChxID09IHApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICArK3BvczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2lnbmVkIGNoYXIgbWt2cGFyc2VyOjpVbnNlcmlhbGl6ZTFTSW50KAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nIHBvcykKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPT0gMCk7ICAgCisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgYXNzZXJ0KHBvcyA8IGF2YWlsYWJsZSk7CisKKyAgICBzaWduZWQgY2hhciByZXN1bHQ7CisKKyAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAodW5zaWduZWQgY2hhciopJnJlc3VsdCk7CisgICAgYXNzZXJ0KGhyID09IDApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2hvcnQgbWt2cGFyc2VyOjpVbnNlcmlhbGl6ZTJTSW50KAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsIAorICAgIGxvbmcgbG9uZyBwb3MpCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisgICAgCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA+PSAwKTsKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICBhc3NlcnQoKHBvcyArIDIpIDw9IGF2YWlsYWJsZSk7CisgICAgCisgICAgc2hvcnQgcmVzdWx0OworICAgIAorICAgIHVuc2lnbmVkIGNoYXIqIGNvbnN0IHAgPSAodW5zaWduZWQgY2hhciopJnJlc3VsdDsKKyAgICB1bnNpZ25lZCBjaGFyKiBxID0gcCArIDI7CisgICAgCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MsIDEsIC0tcSk7CisgICAgICAgIGFzc2VydChociA9PSAwTCk7CisgICAgICAgIAorICAgICAgICBpZiAocSA9PSBwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgKytwb3M7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCBta3ZwYXJzZXI6Ok1hdGNoKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nJiBwb3MsCisgICAgdW5zaWduZWQgbG9uZyBpZF8sCisgICAgbG9uZyBsb25nJiB2YWwpCisKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgbG9uZyBsZW47CisKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KGlkID49IDApOworICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIGlmICgodW5zaWduZWQgbG9uZylpZCAhPSBpZF8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzaXplID49IDApOworICAgIGFzc2VydChzaXplIDw9IDgpOworICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUgb2YgcGF5bG9hZAorICAgIAorICAgIHZhbCA9IFVuc2VyaWFsaXplVUludChwUmVhZGVyLCBwb3MsIHNpemUpOworICAgIGFzc2VydCh2YWwgPj0gMCk7CisgICAgCisgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgc2l6ZSBvZiBwYXlsb2FkCisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgbWt2cGFyc2VyOjpNYXRjaCgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyYgcG9zLAorICAgIHVuc2lnbmVkIGxvbmcgaWRfLAorICAgIGNoYXIqJiB2YWwpCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIAorICAgIGxvbmcgbGVuOworCisgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChpZCA+PSAwKTsKKyAgICBhc3NlcnQobGVuID4gMCk7CisgICAgYXNzZXJ0KGxlbiA8PSA4KTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBpZiAoKHVuc2lnbmVkIGxvbmcpaWQgIT0gaWRfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplXyA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2l6ZV8gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGFzc2VydChsZW4gPD0gOCk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IGF2YWlsYWJsZSk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBwYXlsb2FkCisgICAgYXNzZXJ0KChwb3MgKyBzaXplXykgPD0gYXZhaWxhYmxlKTsKKworICAgIGNvbnN0IHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplXyk7ICAgIAorICAgIHZhbCA9IG5ldyBjaGFyW3NpemUrMV07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICB7CisgICAgICAgIGNoYXIgYzsKKworICAgICAgICBociA9IHBSZWFkZXItPlJlYWQocG9zICsgaSwgMSwgKHVuc2lnbmVkIGNoYXIqKSZjKTsKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAgICAgICAgIAorICAgICAgICB2YWxbaV0gPSBjOworICAgCisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsgICAgIAorICAgCisgICAgfQorCisgICAgdmFsW3NpemVdID0gJ1wwJzsKKyAgICBwb3MgKz0gc2l6ZV87ICAvL2NvbnN1bWUgc2l6ZSBvZiBwYXlsb2FkCisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCitib29sIG1rdnBhcnNlcjo6TWF0Y2goCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcywKKyAgICB1bnNpZ25lZCBsb25nIGlkLAorICAgIHdjaGFyX3QqJiB2YWwpCit7CisgICAgY2hhciogc3RyOworICAgIAorICAgIGlmICghTWF0Y2gocFJlYWRlciwgcG9zLCBpZCwgc3RyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtYnN0b3djcyhOVUxMLCBzdHIsIDApOworICAgICAgIAorICAgIGlmIChzaXplID09IDApIAorICAgICAgICB2YWwgPSBOVUxMOworICAgIGVsc2UgCisgICAgeyAKKyAgICAgICAgdmFsID0gbmV3IHdjaGFyX3Rbc2l6ZSsxXTsKKyAgICAgICAgbWJzdG93Y3ModmFsLCBzdHIsIHNpemUpOworICAgICAgICB2YWxbc2l6ZV0gPSBMJ1wwJzsKKyAgICB9CisKKyAgICBkZWxldGVbXSBzdHI7CisgICAgcmV0dXJuIHRydWU7ICAgIAorfQorI2VuZGlmCisKKworYm9vbCBta3ZwYXJzZXI6Ok1hdGNoKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nJiBwb3MsCisgICAgdW5zaWduZWQgbG9uZyBpZF8sCisgICAgdW5zaWduZWQgY2hhciomIHZhbCwKKyAgICBzaXplX3QgKm9wdGlvbmFsU2l6ZSkKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgbG9uZyBsZW47CisgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChpZCA+PSAwKTsKKyAgICBhc3NlcnQobGVuID4gMCk7CisgICAgYXNzZXJ0KGxlbiA8PSA4KTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBpZiAoKHVuc2lnbmVkIGxvbmcpaWQgIT0gaWRfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2l6ZV8gPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KHNpemVfID49IDApOworICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUgb2YgcGF5bG9hZAorICAgIGFzc2VydCgocG9zICsgc2l6ZV8pIDw9IGF2YWlsYWJsZSk7CisKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZV8pOyAgICAKKyAgICB2YWwgPSBuZXcgdW5zaWduZWQgY2hhcltzaXplXTsKKyAKKyAgICBpZiAob3B0aW9uYWxTaXplKSB7CisgICAgICAgICpvcHRpb25hbFNpemUgPSBzaXplOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MgKyBpLCAxLCAmYik7CisgICAgICAgIGFzc2VydChociA9PSAwTCk7CisKKyAgICAgICAgdmFsW2ldID0gYjsgCisgICAgfQorICAgIAorICAgIHBvcyArPSBzaXplXzsgIC8vY29uc3VtZSBzaXplIG9mIHBheWxvYWQgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBta3ZwYXJzZXI6Ok1hdGNoKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nJiBwb3MsCisgICAgdW5zaWduZWQgbG9uZyBpZF8sCisgICAgZG91YmxlJiB2YWwpCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIGxvbmcgaWRsZW47CisgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBpZGxlbik7CisgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPCisgICAgCisgICAgaWYgKCh1bnNpZ25lZCBsb25nKWlkICE9IGlkXykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbG9uZyBzaXplbGVuOworICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zICsgaWRsZW4sIHNpemVsZW4pOworCisgICAgc3dpdGNoIChzaXplKQorICAgIHsJCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcG9zICs9IGlkbGVuICsgc2l6ZWxlbjsgIC8vY29uc3VtZSBpZCBhbmQgc2l6ZSBmaWVsZHMKKyAgICBhc3NlcnQoKHBvcyArIHNpemUpIDw9IGF2YWlsYWJsZSk7CisKKyAgICBpZiAoc2l6ZSA9PSA0KQorICAgICAgICB2YWwgPSBVbnNlcmlhbGl6ZTRGbG9hdChwUmVhZGVyLCBwb3MpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFzc2VydChzaXplID09IDgpOworICAgICAgICB2YWwgPSBVbnNlcmlhbGl6ZThEb3VibGUocFJlYWRlciwgcG9zKTsKKyAgICB9CisgICAgCisgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgc2l6ZSBvZiBwYXlsb2FkCisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBta3ZwYXJzZXI6Ok1hdGNoKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nJiBwb3MsCisgICAgdW5zaWduZWQgbG9uZyBpZF8sCisgICAgc2hvcnQmIHZhbCkKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgbG9uZyBsZW47CisgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChpZCA+PSAwKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBpZiAoKHVuc2lnbmVkIGxvbmcpaWQgIT0gaWRfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2l6ZSA8PSAyKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gYXZhaWxhYmxlKTsKKyAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUgb2YgcGF5bG9hZAorICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gYXZhaWxhYmxlKTsKKworICAgIC8vVE9ETzoKKyAgICAvLyBHZW5lcmFsaXplIHRoaXMgdG8gd29yayBmb3IgYW55IHNpemUgc2lnbmVkIGludAorICAgIGlmIChzaXplID09IDEpCisgICAgICAgIHZhbCA9IFVuc2VyaWFsaXplMVNJbnQocFJlYWRlciwgcG9zKTsKKyAgICBlbHNlIAorICAgICAgICB2YWwgPSBVbnNlcmlhbGl6ZTJTSW50KHBSZWFkZXIsIHBvcyk7CisgICAgICAgIAorICAgIHBvcyArPSBzaXplOyAgLy9jb25zdW1lIHNpemUgb2YgcGF5bG9hZAorICAgIAorICAgIHJldHVybiB0cnVlOworfQorCisKK25hbWVzcGFjZSBta3ZwYXJzZXIKK3sKKworRUJNTEhlYWRlcjo6RUJNTEhlYWRlcigpOgorICAgIG1fZG9jVHlwZShOVUxMKQoreworfQorCitFQk1MSGVhZGVyOjp+RUJNTEhlYWRlcigpCit7CisgICAgZGVsZXRlW10gbV9kb2NUeXBlOworfQorCitsb25nIGxvbmcgRUJNTEhlYWRlcjo6UGFyc2UoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcykKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisgICAgCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIAorICAgIGlmIChociA8IDApIAorICAgICAgICByZXR1cm4gaHI7CisgICAgCisgICAgcG9zID0gMDsgICAgCisgICAgbG9uZyBsb25nIGVuZCA9ICgxMDI0IDwgYXZhaWxhYmxlKT8gMTAyNDogYXZhaWxhYmxlOyAgICAKKworICAgIGZvciAoOzspCisgICAgeyAgICAKKyAgICAgICAgdW5zaWduZWQgY2hhciBiID0gMDsKKyAgICAKKyAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJmIpOworICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChociA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGhyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYiA9PSAweDFBKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgKytwb3M7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKGIgIT0gMHgxQSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwb3MgPj0gMTAyNCkgfHwKKyAgICAgICAgICAgICAgICAoYXZhaWxhYmxlID49IHRvdGFsKSB8fCAKKyAgICAgICAgICAgICAgICAoKHRvdGFsIC0gYXZhaWxhYmxlKSA8IDUpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZSArIDU7ICAvLzUgPSA0LWJ5dGUgSUQgKyAxc3QgYnl0ZSBvZiBzaXplCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCh0b3RhbCAtIHBvcykgPCA1KQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKGF2YWlsYWJsZSAtIHBvcykgPCA1KQorICAgICAgICAgICAgcmV0dXJuIHBvcyArIDU7ICAvL3RyeSBhZ2FpbiBsYXRlcgorCisgICAgICAgIGxvbmcgbGVuOyAgICAgICAgICAgIAorCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyByZXN1bHQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAweDBBNDVERkEzKSAgLy9SZWFkSWQgbWFza3Mtb2ZmIGxlbmd0aCBpbmRpY2F0b3IgYml0cworICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobGVuID09IDQpOworICAgICAgICAgICAgcG9zICs9IGxlbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKytwb3M7ICAvL3Rocm93IGF3YXkganVzdCB0aGUgMHgxQSBieXRlLCBhbmQgdHJ5IGFnYWluCisgICAgfQorICAgICAgICAKKyAgICBsb25nIGxlbjsKKyAgICBsb25nIGxvbmcgcmVzdWx0ID0gR2V0VUludExlbmd0aChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgCisgICAgaWYgKHJlc3VsdCA8IDApICAvL2Vycm9yCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIAorICAgIGlmIChyZXN1bHQgPiAwKSAgLy9uZWVkIG1vcmUgZGF0YQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAKKyAgICBhc3NlcnQobGVuID4gMCk7CisgICAgYXNzZXJ0KGxlbiA8PSA4KTsKKyAgICAKKyAgICBpZiAoKHRvdGFsIC0gIHBvcykgPCBsZW4pCisgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKChhdmFpbGFibGUgLSBwb3MpIDwgbGVuKQorICAgICAgICByZXR1cm4gcG9zICsgbGVuOyAgLy90cnkgYWdhaW4gbGF0ZXIKKyAgICAgICAgCisgICAgcmVzdWx0ID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIAorICAgIGlmIChyZXN1bHQgPCAwKSAgLy9lcnJvcgorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHUtaW50CisgICAgCisgICAgaWYgKCh0b3RhbCAtIHBvcykgPCByZXN1bHQpCisgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisKKyAgICBpZiAoKGF2YWlsYWJsZSAtIHBvcykgPCByZXN1bHQpCisgICAgICAgIHJldHVybiBwb3MgKyByZXN1bHQ7CisgICAgICAgIAorICAgIGVuZCA9IHBvcyArIHJlc3VsdDsKKyAgICAKKyAgICBtX3ZlcnNpb24gPSAxOworICAgIG1fcmVhZFZlcnNpb24gPSAxOworICAgIG1fbWF4SWRMZW5ndGggPSA0OworICAgIG1fbWF4U2l6ZUxlbmd0aCA9IDg7CisgICAgbV9kb2NUeXBlVmVyc2lvbiA9IDE7CisgICAgbV9kb2NUeXBlUmVhZFZlcnNpb24gPSAxOworCisgICAgd2hpbGUgKHBvcyA8IGVuZCkKKyAgICB7CisgICAgICAgIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDI4NiwgbV92ZXJzaW9uKSkgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAyRjcsIG1fcmVhZFZlcnNpb24pKSAgICAgICAgCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwMkYyLCBtX21heElkTGVuZ3RoKSkgICAgICAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDJGMywgbV9tYXhTaXplTGVuZ3RoKSkgICAgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAyODIsIG1fZG9jVHlwZSkpICAgICAgICAgICAgCisgICAgICAgICAgICA7IAorICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDI4NywgbV9kb2NUeXBlVmVyc2lvbikpICAgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAyODUsIG1fZG9jVHlwZVJlYWRWZXJzaW9uKSkgCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCA+IDApOworICAgICAgICAgICAgYXNzZXJ0KGxlbiA+IDApOworICAgICAgICAgICAgYXNzZXJ0KGxlbiA8PSA4KTsKKyAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICAgICAgYXNzZXJ0KHBvcyA8IGVuZCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChyZXN1bHQgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnQobGVuID4gMCk7CisgICAgICAgICAgICBhc3NlcnQobGVuIDw9IDgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuICsgcmVzdWx0OworICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBlbmQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gZW5kKTsKKyAgICAgICAgCisgICAgcmV0dXJuIDA7ICAgIAorfQorCisKK1NlZ21lbnQ6OlNlZ21lbnQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcgc3RhcnQsCisgICAgbG9uZyBsb25nIHNpemUpIDoKKyAgICBtX3BSZWFkZXIocFJlYWRlciksCisgICAgbV9zdGFydChzdGFydCksCisgICAgbV9zaXplKHNpemUpLAorICAgIG1fcG9zKHN0YXJ0KSwKKyAgICBtX3BJbmZvKE5VTEwpLAorICAgIG1fcFRyYWNrcyhOVUxMKSwKKyAgICBtX2NsdXN0ZXJDb3VudCgwKQorICAgIC8vbV9jbHVzdGVyTnVtYmVyKDApCit7Cit9CisKKworU2VnbWVudDo6flNlZ21lbnQoKQoreworICAgIENsdXN0ZXIqKiBpID0gbV9jbHVzdGVyczsKKyAgICBDbHVzdGVyKiogaiA9IG1fY2x1c3RlcnMgKyBtX2NsdXN0ZXJDb3VudDsKKworICAgIHdoaWxlIChpICE9IGopCisgICAgeworICAgICAgICBDbHVzdGVyKiBwID0gKmkrKzsKKyAgICAgICAgYXNzZXJ0KHApOwkJCisgICAgICAgIGRlbGV0ZSBwOworICAgIH0gCisgICAgCisgICAgZGVsZXRlW10gbV9jbHVzdGVyczsKKyAgICAgICAKKyAgICBkZWxldGUgbV9wVHJhY2tzOworICAgIGRlbGV0ZSBtX3BJbmZvOworfQorCisKK2xvbmcgbG9uZyBTZWdtZW50OjpDcmVhdGVJbnN0YW5jZSgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyBwb3MsCisgICAgU2VnbWVudComIHBTZWdtZW50KQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIHBTZWdtZW50ID0gTlVMTDsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKyAgICAKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIAorICAgIC8vSSB3b3VsZCBhc3N1bWUgdGhhdCBpbiBwcmFjdGljZSB0aGlzIGxvb3Agd291bGQgZXhlY3V0ZQorICAgIC8vZXhhY3RseSBvbmNlLCBidXQgd2UgYWxsb3cgZm9yIG90aGVyIGVsZW1lbnRzIChlLmcuIFZvaWQpCisgICAgLy90byBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEVCTUwgaGVhZGVyLiAgVGhpcyBpcyBmaW5lIGZvcgorICAgIC8vdGhlIHNvdXJjZSBmaWx0ZXIgY2FzZSAoc2luY2UgdGhlIGVudGlyZSBmaWxlIGlzIGF2YWlsYWJsZSksCisgICAgLy9idXQgaW4gdGhlIHNwbGl0dGVyIGNhc2Ugb3ZlciBhIG5ldHdvcmsgd2Ugc2hvdWxkIHByb2JhYmx5CisgICAgLy9qdXN0IGdpdmUgdXAgZWFybHkuICBXZSBjb3VsZCBmb3IgZXhhbXBsZSBkZWNpZGUgb25seSB0bworICAgIC8vZXhlY3V0ZSB0aGlzIGxvb3AgYSBtYXhpbXVtIG9mLCBzYXksIDEwIHRpbWVzLgorICAgIAorICAgIHdoaWxlIChwb3MgPCB0b3RhbCkKKyAgICB7ICAgIAorICAgICAgICAvL1JlYWQgSUQKKyAgICAgICAgCisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBsb25nIGxvbmcgcmVzdWx0ID0gR2V0VUludExlbmd0aChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0KSAgLy9lcnJvciwgb3IgdG9vIGZldyBhdmFpbGFibGUgYnl0ZXMKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBsZW4pID4gdG90YWwpCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IGF2YWlsYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBwb3MgKyBsZW47CisKKyAgICAgICAgLy9UT0RPOiBpZiB3ZSBsaWJlcmFsaXplIHRoZSBiZWhhdmlvciBvZiBSZWFkVUludCwgd2UgY2FuCisgICAgICAgIC8vcHJvYmFibHkgZWxpbWluYXRlIGhhdmluZyB0byB1c2UgR2V0VUludExlbmd0aCBoZXJlLgorICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgSUQKKyAgICAgICAgCisgICAgICAgIC8vUmVhZCBTaXplCisgICAgICAgIAorICAgICAgICByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQpICAvL2Vycm9yLCBvciB0b28gZmV3IGF2YWlsYWJsZSBieXRlcworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiB0b3RhbCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBsZW4pID4gYXZhaWxhYmxlKQorICAgICAgICAgICAgcmV0dXJuIHBvcyArIGxlbjsKKworICAgICAgICAvL1RPRE86IGlmIHdlIGxpYmVyYWxpemUgdGhlIGJlaGF2aW9yIG9mIFJlYWRVSW50LCB3ZSBjYW4KKyAgICAgICAgLy9wcm9iYWJseSBlbGltaW5hdGUgaGF2aW5nIHRvIHVzZSBHZXRVSW50TGVuZ3RoIGhlcmUuCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBlbGVtZW50CisgICAgICAgIAorICAgICAgICAvL1BvcyBub3cgcG9pbnRzIHRvIHN0YXJ0IG9mIHBheWxvYWQKKyAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgc2l6ZSkgPiB0b3RhbCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMHgwODUzODA2NykgIC8vU2VnbWVudCBJRAorICAgICAgICB7CisgICAgICAgICAgICBwU2VnbWVudCA9IG5ldyAgU2VnbWVudChwUmVhZGVyLCBwb3MsIHNpemUpOyAKKyAgICAgICAgICAgIGFzc2VydChwU2VnbWVudCk7ICAvL1RPRE8gICAKKworICAgICAgICAgICAgcmV0dXJuIDA7ICAgIC8vc3VjY2VzcworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gdG90YWwpOworICAgIAorICAgIHBTZWdtZW50ID0gbmV3IFNlZ21lbnQocFJlYWRlciwgcG9zLCAwKTsgCisgICAgYXNzZXJ0KHBTZWdtZW50KTsgIC8vVE9ETyAgIAorCisgICAgcmV0dXJuIDA7ICAvL3N1Y2Nlc3MgKHNvcnQgb2YpCit9CisKKworbG9uZyBsb25nIFNlZ21lbnQ6OlBhcnNlSGVhZGVycygpCit7CisgICAgLy9PdXRlcm1vc3QgKGxldmVsIDApIHNlZ21lbnQgb2JqZWN0IGhhcyBiZWVuIGNvbnN0cnVjdGVkLCAKKyAgICAvL2FuZCBwb3MgZGVzaWduYXRlcyBzdGFydCBvZiBwYXlsb2FkLiAgV2UgbmVlZCB0byBmaW5kIHRoZQorICAgIC8vaW5uZXIgKGxldmVsIDEpIGVsZW1lbnRzLgorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworICAgIAorICAgIGxvbmcgaHIgPSBtX3BSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA+PSAwKTsKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisgICAgYXNzZXJ0KHN0b3AgPD0gdG90YWwpOworICAgIGFzc2VydChtX3BvcyA8PSBzdG9wKTsKKyAgICAKKyAgICBib29sIGJRdWl0ID0gZmFsc2U7CisgICAgd2hpbGUgKChtX3BvcyA8IHN0b3ApICYmICFiUXVpdCkKKyAgICB7CisgICAgICAgIGxvbmcgbG9uZyBwb3MgPSBtX3BvczsKKyAgICAgICAgCisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBsb25nIGxvbmcgcmVzdWx0ID0gR2V0VUludExlbmd0aChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQpICAvL2Vycm9yLCBvciB0b28gZmV3IGF2YWlsYWJsZSBieXRlcworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBzdG9wKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBhdmFpbGFibGUpCisgICAgICAgICAgICByZXR1cm4gcG9zICsgbGVuOworICAgICAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZHBvcyA9IHBvczsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBpZHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBJRAorICAgICAgICAKKyAgICAgICAgLy9SZWFkIFNpemUKKyAgICAgICAgcmVzdWx0ID0gR2V0VUludExlbmd0aChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQpICAvL2Vycm9yLCBvciB0b28gZmV3IGF2YWlsYWJsZSBieXRlcworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBzdG9wKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBhdmFpbGFibGUpCisgICAgICAgICAgICByZXR1cm4gcG9zICsgbGVuOworCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIGVsZW1lbnQKKyAgICAgICAgCisgICAgICAgIC8vUG9zIG5vdyBwb2ludHMgdG8gc3RhcnQgb2YgcGF5bG9hZAorICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBzaXplKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIC8vV2UgcmVhZCBFQk1MIGVsZW1lbnRzIGVpdGhlciBpbiB0b3RhbCBvciBub3RoaW5nIGF0IGFsbC4KKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIHNpemUpID4gYXZhaWxhYmxlKQorICAgICAgICAgICAgcmV0dXJuIHBvcyArIHNpemU7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMHgwNTQ5QTk2NikgIC8vU2VnbWVudCBJbmZvIElECisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtX3BJbmZvID09IE5VTEwpOworICAgICAgICAgICAgbV9wSW5mbyA9IG5ldyAgU2VnbWVudEluZm8odGhpcywgcG9zLCBzaXplKTsKKyAgICAgICAgICAgIGFzc2VydChtX3BJbmZvKTsgIC8vVE9ETworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobV9wVHJhY2tzKQorICAgICAgICAgICAgICAgIGJRdWl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpZCA9PSAweDA2NTRBRTZCKSAgLy9UcmFja3MgSUQKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KG1fcFRyYWNrcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1fcFRyYWNrcyA9IG5ldyAgVHJhY2tzKHRoaXMsIHBvcywgc2l6ZSk7CisgICAgICAgICAgICBhc3NlcnQobV9wVHJhY2tzKTsgIC8vVE9ETworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobV9wSW5mbykKKyAgICAgICAgICAgICAgICBiUXVpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaWQgPT0gMHgwRjQzQjY3NSkgIC8vQ2x1c3RlciBJRAorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgaWYgKG1fcEluZm8gPT0gTlVMTCkgIC8vVE9ETzogbGliZXJhbGl6ZQorICAgICAgICAgICAgICAgIDsgIAorICAgICAgICAgICAgZWxzZSBpZiAobV9wVHJhY2tzID09IE5VTEwpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vUGFyc2VDbHVzdGVyKGlkcG9zLCBwb3MsIHNpemUpOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENsdXN0ZXI6OlBhcnNlKHRoaXMsIG1fY2x1c3RlcnMsIHBvcywgc2l6ZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGJRdWl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9wb3MgPSBwb3MgKyBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KG1fcG9zIDw9IHN0b3ApOworICAgIAorICAgIHJldHVybiAwOyAgLy9zdWNjZXNzCit9CisKKworbG9uZyBTZWdtZW50OjpQYXJzZUNsdXN0ZXIoQ2x1c3RlciomIHBDbHVzdGVyLCBsb25nIGxvbmcmIHBvc18pIGNvbnN0Cit7CisgICAgcENsdXN0ZXIgPSBOVUxMOworICAgIHBvc18gPSAtMTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisgICAgYXNzZXJ0KG1fcG9zIDw9IHN0b3ApOworICAgIAorICAgIGxvbmcgbG9uZyBwb3MgPSBtX3BvczsKKyAgICBsb25nIGxvbmcgb2ZmID0gLTE7CisgICAKKyAKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWRwb3MgPSBwb3M7CisgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBTeW5jUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIHN0b3AsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KGlkKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZCAgICAgICAgCisgICAgICAgIGFzc2VydChwb3MgPCBzdG9wKTsKKworICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFN5bmNSZWFkVUludChtX3BSZWFkZXIsIHBvcywgc3RvcCwgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzaXplIDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihzaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoc2l6ZSA9PSAwKSAgLy93ZWlyZAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgLy9wb3Mgbm93IHBvaW50cyB0byBzdGFydCBvZiBwYXlsb2FkCisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworCisgICAgICAgIGlmIChvZmYgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcG9zXyA9IGlkcG9zOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaWQgPT0gMHgwRjQzQjY3NSkgIC8vQ2x1c3RlciBJRAorICAgICAgICAgICAgb2ZmID0gaWRwb3MgLSBtX3N0YXJ0OworICAgIH0KKyAgICAKKyAgICBTZWdtZW50KiBjb25zdCB0aGlzXyA9IGNvbnN0X2Nhc3Q8U2VnbWVudCo+KHRoaXMpOworICAgIGNvbnN0IHNpemVfdCBpZHggPSBtX2NsdXN0ZXJDb3VudDsKKyAgICAKKyAgICBpZiAocG9zID49IHN0b3ApCisgICAgeworICAgICAgICBwb3NfID0gc3RvcDsKKyAgICAgICAgCisjaWYgMCAgICAgICAgCisgICAgICAgIGlmIChvZmYgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQ2x1c3RlciA9IENsdXN0ZXI6OkNyZWF0ZUVuZE9mU3RyZWFtKHRoaXNfLCBpZHgpOworICAgICAgICAgICAgcmV0dXJuIDFMOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAxTDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIAorICAgICAgICAvL1JlYWRpbmcgMCBieXRlcyBhdCBwb3MgbWlnaHQgd29yayB0b28gLS0gaXQgd291bGQgZGVwZW5kIAorICAgICAgICAvL29uIGhvdyB0aGUgcmVhZGVyIGlzIGltcGxlbWVudGVkLgorICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgY2hhciBiOworCisgICAgICAgIGNvbnN0IGxvbmcgaHIgPSBtX3BSZWFkZXItPlJlYWQocG9zIC0gMSwgMSwgJmIpOworICAgICAgICAKKyAgICAgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoaHIgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gRV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfQorICAgIAorICAgIGFzc2VydChvZmYgPj0gMCk7CisgICAgYXNzZXJ0KHBvc18gPj0gbV9zdGFydCk7CisgICAgYXNzZXJ0KHBvc18gPD0gc3RvcCk7CisKKyAgICBwQ2x1c3RlciA9IENsdXN0ZXI6OlBhcnNlKHRoaXNfLCBpZHgsIG9mZik7CisgICAgcmV0dXJuIDBMOworfQorCisKK2Jvb2wgU2VnbWVudDo6QWRkQ2x1c3RlcihDbHVzdGVyKiBwQ2x1c3RlciwgbG9uZyBsb25nIHBvcykKK3sKKyAgICBhc3NlcnQocG9zID49IG1fc3RhcnQpOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIG1fc2l6ZTsKKyAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworCisgICAgaWYgKHBDbHVzdGVyKSAgICAKKyAgICAgICAgbV9jbHVzdGVyc1twb3NdID0gcENsdXN0ZXI7CisgICAgICAgIAorICAgIG1fcG9zID0gcG9zOyAgLy9tX3BvcyA+PSBzdG9wIGlzIG5vdyB3ZSBrbm93IHdlIGhhdmUgYWxsIGNsdXN0ZXJzCisgICAgCisgICAgcmV0dXJuIChwb3MgPj0gc3RvcCk7Cit9CisKKworbG9uZyBTZWdtZW50OjpMb2FkKCkKK3sKKyAgICAvL091dGVybW9zdCAobGV2ZWwgMCkgc2VnbWVudCBvYmplY3QgaGFzIGJlZW4gY29uc3RydWN0ZWQsIAorICAgIC8vYW5kIHBvcyBkZXNpZ25hdGVzIHN0YXJ0IG9mIHBheWxvYWQuICBXZSBuZWVkIHRvIGZpbmQgdGhlCisgICAgLy9pbm5lciAobGV2ZWwgMSkgZWxlbWVudHMuCisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBtX3N0YXJ0ICsgbV9zaXplOworI2lmZGVmIF9ERUJVRworICAgIHsKKyAgICAgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisgICAgICAgIAorICAgICAgICBsb25nIGhyID0gbV9wUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICAgICAgYXNzZXJ0KGhyID49IDApOworICAgICAgICBhc3NlcnQoYXZhaWxhYmxlID49IHRvdGFsKTsKKyAgICAgICAgYXNzZXJ0KHN0b3AgPD0gdG90YWwpOworICAgIH0KKyNlbmRpZgorICAgIGxvbmcgbG9uZyBpbmRleCA9IG1fcG9zOworICAgIAorICAgIG1fY2x1c3RlckNvdW50ID0gMDsKKworICAgIHdoaWxlIChpbmRleCA8IHN0b3ApCisgICAgeworICAgICAgICBsb25nIGxlbiA9IDA7CisKKyAgICAgICAgbG9uZyBsb25nIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBpbmRleCwgbGVuKTsKKyAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4ocmVzdWx0KTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKGluZGV4ICsgbGVuKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZHBvcyA9IGluZGV4OworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChtX3BSZWFkZXIsIGlkcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKGlkIDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihpZCk7CisgICAgICAgICAgICAKKyAgICAgICAgaW5kZXggKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgICAgIAorICAgICAgICAvL1JlYWQgU2l6ZQorICAgICAgICByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKG1fcFJlYWRlciwgaW5kZXgsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihyZXN1bHQpOworICAgICAgICAgICAgCisgICAgICAgIGlmICgoaW5kZXggKyBsZW4pID4gc3RvcCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIGluZGV4LCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHNpemUgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KHNpemUpOworICAgICAgICAgICAgCisgICAgICAgIGluZGV4ICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBlbGVtZW50CisgCisgICAgICAgIGlmIChpZCA9PSAweDBGNDNCNjc1KSAvLyBDbHVzdGVyIElEIAorICAgICAgICAgICAgYnJlYWs7CisJCisgICAgICAgIGlmIChpZCA9PSAweDAxNEQ5Qjc0KSAvLyBTZWVrSGVhZCBJRCAKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2VTZWVrSGVhZChpbmRleCwgc2l6ZSwgTlVMTCk7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggKz0gc2l6ZTsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChtX2NsdXN0ZXJDb3VudCA9PSAwKQorICAgICAgICByZXR1cm4gLTFMOworCisgICAgd2hpbGUgKG1fcG9zIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGxvbmcgbG9uZyBwb3MgPSBtX3BvczsKKyAgICAgICAgCisgICAgICAgIGxvbmcgbGVuOworCisgICAgICAgIGxvbmcgbG9uZyByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4ocmVzdWx0KTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBzdG9wKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgaWRwb3MgPSBwb3M7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgaWRwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KGlkKTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgICAgIAorICAgICAgICAvL1JlYWQgU2l6ZQorICAgICAgICByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4ocmVzdWx0KTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBzdG9wKQorCSAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgIAorICAgICAgICBpZiAoc2l6ZSA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oc2l6ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBlbGVtZW50CisgICAgICAgIAorICAgICAgICAvL1BvcyBub3cgcG9pbnRzIHRvIHN0YXJ0IG9mIHBheWxvYWQKKyAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgc2l6ZSkgPiBzdG9wKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMHgwRjQzQjY3NSkgIC8vQ2x1c3RlciBJRAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGlkID09IDB4MDE0RDlCNzQpICAvL1NlZWtIZWFkIElECisgICAgICAgIHsKKyAgICAgICAgICAgIG1fY2x1c3RlcnMgPSBuZXcgQ2x1c3RlcipbbV9jbHVzdGVyQ291bnRdOyAgIAorICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUGFyc2VTZWVrSGVhZChwb3MsIHNpemUsICZpbmRleCk7ICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQoaW5kZXggPT0gbV9jbHVzdGVyQ291bnQpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIGVsc2UgaWYgKGlkID09IDB4MDU0OUE5NjYpICAvL1NlZ21lbnQgSW5mbyBJRAorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9wSW5mbyA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1fcEluZm8gPSBuZXcgIFNlZ21lbnRJbmZvKHRoaXMsIHBvcywgc2l6ZSk7CisgICAgICAgICAgICBhc3NlcnQobV9wSW5mbyk7ICAvL1RPRE8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpZCA9PSAweDA2NTRBRTZCKSAgLy9UcmFja3MgSUQKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KG1fcFRyYWNrcyA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1fcFRyYWNrcyA9IG5ldyBUcmFja3ModGhpcywgcG9zLCBzaXplKTsKKyAgICAgICAgICAgIGFzc2VydChtX3BUcmFja3MpOyAgLy9UT0RPCisgICAgICAgIH0KKworICAgICAgICBtX3BvcyA9IHBvcyArIHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgIH0KKyAgICAKKyAgICBhc3NlcnQobV9jbHVzdGVycyk7CisgICAgCisgICAgLy9UT0RPOiBzZWUgbm90ZXMgYWJvdmUuICBUaGlzIGNoZWNrIGlzIGhlcmUgKHRlbXBvcmFyaWx5KSB0byBlbnN1cmUKKyAgICAvL3RoYXQgdGhlIGZpcnN0IHNlZWtoZWFkIGhhcyBlbnRyaWVzIGZvciB0aGUgY2x1c3RlcnMgKGJlY2F1c2UgdGhhdCdzCisgICAgLy93aGVuIHRoZXkncmUgbG9hZGVkKS4gIEluIGNhc2Ugd2UgYXJlIGdpdmVuIGEgZmlsZSB0aGF0IGxpc3RzIHRoZQorICAgIC8vY2x1c3RlcnMgaW4gYSBzZWNvbmQgc2Vla2hlYWQsIHRoZSB3b3JzdCB0aGluZyB0aGF0IGhhcHBlbnMgaXMgdGhhdAorICAgIC8vd2UgdHJlYXQgdGhpcyBhcyBhbiBpbnZhbGlkIGZpbGUgKHdoaWNoIGlzIGJldHRlciB0aGVuIHNpbXBseQorICAgIC8vYXNzZXJ0aW5nIHNvbWV3aGVyZSkuICBCdXQgdGhhdCdzIG9ubHkgYSB3b3JrLWFyb3VuZC4gIFdoYXQgd2UgbmVlZAorICAgIC8vdG8gZG8gaXMgYmUgYWJsZSB0byBoYW5kbGUgaGF2aW5nIG11bHRpcGxlIHNlZWtoZWFkcywgYW5kIGhhdmluZworICAgIC8vY2x1c3RlcnMgbGlzdGVkIHNvbWV3aGVyZSBiZXNpZGVzIHRoZSBmaXJzdCBzZWVraGVhZC4KKyAgICAvLyAgICAKKyAgICAvL2lmIChtX2NsdXN0ZXJzID09IE5VTEwpCisgICAgLy8gICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgCisgICAgLy9OT1RFOiB3ZSBzdG9wIHBhcnNpbmcgd2hlbiB3ZSByZWFjaCB0aGUgZmlyc3QgY2x1c3RlciwgdW5kZXIgdGhlCisgICAgLy9hc3N1bXB0aW9uIGFsbCBjbHVzdGVycyBhcmUgbmFtZWQgaW4gc29tZSBTZWVrSGVhZC4gIENsdXN0ZXJzCisgICAgLy93aWxsIGhhdmUgYmVlbiAocHJlKWxvYWRlZCwgc28gd2UgaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGFsbCBjbHVzdGVycworICAgIC8vYnkgYWRqdXN0aW5nIHRoZSBwYXJzZSBwb3NpdGlvbjoKKyAgICBtX3BvcyA9IHN0b3A7ICAvL21lYW5zICJ3ZSBoYXZlIGFsbCBjbHVzdGVycyIKKworICAgIHJldHVybiAwTDsKK30KKworCit2b2lkIFNlZ21lbnQ6OlBhcnNlU2Vla0hlYWQobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZV8sIHNpemVfdCogcEluZGV4KQoreworICAgIGxvbmcgbG9uZyBwb3MgPSBzdGFydDsKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IHN0YXJ0ICsgc2l6ZV87CisgICAgd2hpbGUgKHBvcyA8IHN0b3ApCisgICAgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE8KKyAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBJRAorICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgU2l6ZSBmaWVsZAorICAgICAgICBhc3NlcnQoKHBvcyArIHNpemUpIDw9IHN0b3ApOworCisgICAgICAgIGlmIChpZCA9PSAweDBEQkIpICAvL1NlZWtFbnRyeSBJRAorICAgICAgICAgICAgUGFyc2VTZWVrRW50cnkocG9zLCBzaXplLCBwSW5kZXgpOworICAgICAgICAKKyAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgIH0KKyAgICAKKyAgICBhc3NlcnQocG9zID09IHN0b3ApOworfQorCisKK3ZvaWQgU2VnbWVudDo6UGFyc2VTZWNvbmRhcnlTZWVrSGVhZChsb25nIGxvbmcgb2ZmLCBzaXplX3QqIHBJbmRleCkKK3sKKyAgICBhc3NlcnQob2ZmID49IDApOworICAgIGFzc2VydChvZmYgPCBtX3NpemUpOworCisgICAgbG9uZyBsb25nIHBvcyA9IG1fc3RhcnQgKyBvZmY7CisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBtX3N0YXJ0ICsgbV9zaXplOworICAgIAorICAgIGxvbmcgbGVuOworCisgICAgbG9uZyBsb25nIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIGlkcG9zID0gcG9zOworCisgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBpZHBvcywgbGVuKTsKKyAgICBhc3NlcnQoaWQgPT0gMHgwMTREOUI3NCk7ICAvL1NlZWtIZWFkIElECisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBJRAorICAgIGFzc2VydChwb3MgPCBzdG9wKTsKKyAgICAKKyAgICAvL1JlYWQgU2l6ZQorICAgIAorICAgIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIGVsZW1lbnQKKyAgICBhc3NlcnQoKHBvcyArIHNpemUpIDw9IHN0b3ApOworICAgIAorICAgIC8vUG9zIG5vdyBwb2ludHMgdG8gc3RhcnQgb2YgcGF5bG9hZAorICAgIAorICAgIFBhcnNlU2Vla0hlYWQocG9zLCBzaXplLCBwSW5kZXgpOworfQorCisKK3ZvaWQgU2VnbWVudDo6UGFyc2VTZWVrRW50cnkobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZV8sIHNpemVfdCogcEluZGV4KQoreworICAgIGxvbmcgbG9uZyBwb3MgPSBzdGFydDsKKworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplXzsKKyAgICAKKyAgICBsb25nIGxlbjsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla0lkSWQgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAvL3NlZWtJZElkOworICAgIGFzc2VydChzZWVrSWRJZCA9PSAweDEzQUIpOyAgLy9TZWVrSUQgSUQKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorCisgICAgY29uc3QgbG9uZyBsb25nIHNlZWtJZFNpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2Vla0lkU2l6ZSA+PSAwKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNlZWtJZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOyAgLy9wYXlsb2FkCisgICAgYXNzZXJ0KHNlZWtJZCA+PSAwKTsKKyAgICBhc3NlcnQobGVuID09IHNlZWtJZFNpemUpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBwb3MgKz0gc2Vla0lkU2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNlZWtQb3NJZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgIC8vc2Vla1Bvc0lkOworICAgIGFzc2VydChzZWVrUG9zSWQgPT0gMHgxM0FDKTsgIC8vU2Vla1BvcyBJRAorICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNlZWtQb3NTaXplID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KHNlZWtQb3NTaXplID49IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKworICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgc2l6ZQorICAgIGFzc2VydCgocG9zICsgc2Vla1Bvc1NpemUpIDw9IHN0b3ApOworICAgICAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla09mZiA9IFVuc2VyaWFsaXplVUludChtX3BSZWFkZXIsIHBvcywgc2Vla1Bvc1NpemUpOworICAgIGFzc2VydChzZWVrT2ZmID49IDApOworICAgIGFzc2VydChzZWVrT2ZmIDwgbV9zaXplKTsKKyAgICAKKyAgICBwb3MgKz0gc2Vla1Bvc1NpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNlZWtQb3MgPSBtX3N0YXJ0ICsgc2Vla09mZjsKKyAgICBhc3NlcnQoc2Vla1BvcyA8IChtX3N0YXJ0ICsgbV9zaXplKSk7CisgICAKKyAgICBpZiAoc2Vla0lkID09IDB4MEY0M0I2NzUpICAvL2NsdXN0ZXIgaWQKKyAgICB7ICAgICAgIAorICAgICAgICBpZiAocEluZGV4ID09IE5VTEwpCisgICAgICAgICAgICArK21fY2x1c3RlckNvdW50OyAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9jbHVzdGVycyk7CisgICAgICAgICAgICBhc3NlcnQobV9jbHVzdGVyQ291bnQgPiAwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2l6ZV90JiBpbmRleCA9ICpwSW5kZXg7CisgICAgICAgICAgICBhc3NlcnQoaW5kZXggPCBtX2NsdXN0ZXJDb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENsdXN0ZXIqJiBwQ2x1c3RlciA9IG1fY2x1c3RlcnNbaW5kZXhdOworICAgICAgICAgICAgCisgICAgICAgICAgICBwQ2x1c3RlciA9IENsdXN0ZXI6OlBhcnNlKHRoaXMsIGluZGV4LCBzZWVrT2ZmKTsKKyAgICAgICAgICAgIGFzc2VydChwQ2x1c3Rlcik7ICAvL1RPRE8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzZWVrSWQgPT0gMHgwMTREOUI3NCkgIC8vU2Vla0hlYWQgSUQKKyAgICB7CisgICAgICAgIFBhcnNlU2Vjb25kYXJ5U2Vla0hlYWQoc2Vla09mZiwgcEluZGV4KTsKKyAgICB9Cit9CisKKworbG9uZyBsb25nIFNlZ21lbnQ6OlVucGFyc2VkKCkgY29uc3QKK3sKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisKKyAgICBjb25zdCBsb25nIGxvbmcgcmVzdWx0ID0gc3RvcCAtIG1fcG9zOworICAgIGFzc2VydChyZXN1bHQgPj0gMCk7CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisjaWYgMCAgLy9OT1RFOiB0b28gaW5lZmZpY2llbnQKK2xvbmcgbG9uZyBTZWdtZW50OjpMb2FkKGxvbmcgbG9uZyB0aW1lX25zKQoreworICAgIGlmIChVbnBhcnNlZCgpIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHdoaWxlIChtX2NsdXN0ZXJzLmVtcHR5KCkpCisgICAgeworICAgICAgICBjb25zdCBsb25nIGxvbmcgcmVzdWx0ID0gUGFyc2UoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQpICAvL2Vycm9yLCBvciBub3QgZW5vdWdoIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoVW5wYXJzZWQoKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHdoaWxlIChtX2NsdXN0ZXJzLmJhY2soKS0+R2V0VGltZSgpIDwgdGltZV9ucykKKyAgICB7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyByZXN1bHQgPSBQYXJzZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCkgIC8vZXJyb3IsIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgCisgICAgICAgIGlmIChVbnBhcnNlZCgpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9ICAgICAgICAKKworICAgIHJldHVybiAwOyAgICAgICAgCit9CisjZW5kaWYKKworCitDbHVzdGVyKiBTZWdtZW50OjpHZXRGaXJzdCgpCit7CisgICAgaWYgKChtX2NsdXN0ZXJzID09IE5VTEwpIHx8IChtX2NsdXN0ZXJDb3VudCA8PSAwKSkKKyAgICAgICByZXR1cm4gJm1fZW9zOworCisgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBtX2NsdXN0ZXJzWzBdOworICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgICAgIAorICAgIHJldHVybiBwQ2x1c3RlcjsKK30KKworCitDbHVzdGVyKiBTZWdtZW50OjpHZXRMYXN0KCkKK3sKKyAgICBpZiAoKG1fY2x1c3RlcnMgPT0gTlVMTCkgfHwgKG1fY2x1c3RlckNvdW50IDw9IDApKQorICAgICAgICByZXR1cm4gJm1fZW9zOworCisgICAgY29uc3Qgc2l6ZV90IGlkeCA9IG1fY2x1c3RlckNvdW50IC0gMTsgICAgCisgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBtX2NsdXN0ZXJzW2lkeF07CisgICAgYXNzZXJ0KHBDbHVzdGVyKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHBDbHVzdGVyOworfQorCisKK3Vuc2lnbmVkIGxvbmcgU2VnbWVudDo6R2V0Q291bnQoKSBjb25zdAoreworICAgIC8vVE9ETzogbV9jbHVzdGVyQ291bnQgc2hvdWxkIG5vdCBiZSBsb25nIGxvbmcuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1fY2x1c3RlckNvdW50KTsKK30KKworCitDbHVzdGVyKiBTZWdtZW50OjpHZXROZXh0KGNvbnN0IENsdXN0ZXIqIHBDdXJyKQoreworICAgIGFzc2VydChwQ3Vycik7CisgICAgYXNzZXJ0KHBDdXJyICE9ICZtX2Vvcyk7CisgICAgYXNzZXJ0KG1fY2x1c3RlcnMpOworICAgIGFzc2VydChtX2NsdXN0ZXJDb3VudCA+IDApOworCisgICAgc2l6ZV90IGlkeCA9ICBwQ3Vyci0+bV9pbmRleDsKKyAgICBhc3NlcnQoaWR4IDwgbV9jbHVzdGVyQ291bnQpOworICAgIGFzc2VydChwQ3VyciA9PSBtX2NsdXN0ZXJzW2lkeF0pOworICAgIAorICAgIGlkeCsrOworICAgIAorICAgIGlmIChpZHggPj0gbV9jbHVzdGVyQ291bnQpIAorICAgICAgICByZXR1cm4gJm1fZW9zOworICAgICAgICAKKyAgICBDbHVzdGVyKiBjb25zdCBwTmV4dCA9IG1fY2x1c3RlcnNbaWR4XTsKKyAgICBhc3NlcnQocE5leHQpOworICAgIAorICAgIHJldHVybiBwTmV4dDsKK30KKworCitDbHVzdGVyKiBTZWdtZW50OjpHZXRDbHVzdGVyKGxvbmcgbG9uZyB0aW1lX25zKQoreworICAgIGlmICgobV9jbHVzdGVycyA9PSBOVUxMKSB8fCAobV9jbHVzdGVyQ291bnQgPD0gMCkpCisgICAgICAgIHJldHVybiAmbV9lb3M7CisgICAgICAgIAorICAgIHsKKyAgICAgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBtX2NsdXN0ZXJzWzBdOworICAgICAgICBhc3NlcnQocENsdXN0ZXIpOworICAgICAgICBhc3NlcnQocENsdXN0ZXItPm1faW5kZXggPT0gMCk7CisgICAgICAgIAorICAgICAgICBpZiAodGltZV9ucyA8PSBwQ2x1c3Rlci0+R2V0VGltZSgpKQorICAgICAgICAgICAgcmV0dXJuIHBDbHVzdGVyOworICAgIH0KKyAgICAKKyAgICAvL0JpbmFyeSBzZWFyY2ggb2YgY2x1c3RlciBhcnJheQorICAgICAgIAorICAgIHNpemVfdCBpID0gMDsKKyAgICBzaXplX3QgaiA9IG1fY2x1c3RlckNvdW50OworICAgIAorICAgIHdoaWxlIChpIDwgaikKKyAgICB7CisgICAgICAgIC8vSU5WQVJJQU5UOgorICAgICAgICAvL1swLCBpKSA8PSB0aW1lX25zCisgICAgICAgIC8vW2ksIGopID8KKyAgICAgICAgLy9baiwgbV9jbHVzdGVyQ291bnQpICA+IHRpbWVfbnMKKyAgICAgICAgCisgICAgICAgIGNvbnN0IHNpemVfdCBrID0gaSArIChqIC0gaSkgLyAyOworICAgICAgICBhc3NlcnQoayA8IG1fY2x1c3RlckNvdW50KTsKKworICAgICAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG1fY2x1c3RlcnNba107CisgICAgICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgICAgIGFzc2VydChwQ2x1c3Rlci0+bV9pbmRleCA9PSBrKTsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyB0ID0gcENsdXN0ZXItPkdldFRpbWUoKTsKKyAgICAgICAgCisgICAgICAgIGlmICh0IDw9IHRpbWVfbnMpCisgICAgICAgICAgICBpID0gayArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGogPSBrOworICAgICAgICAgICAgCisgICAgICAgIGFzc2VydChpIDw9IGopOworICAgIH0KKyAgICAKKyAgICBhc3NlcnQoaSA9PSBqKTsKKyAgICBhc3NlcnQoaSA+IDApOworICAgIGFzc2VydChpIDw9IG1fY2x1c3RlckNvdW50KTsKKyAgICAKKyAgICBjb25zdCBzaXplX3QgayA9IGkgLSAxOworICAgIAorICAgIENsdXN0ZXIqIGNvbnN0IHBDbHVzdGVyID0gbV9jbHVzdGVyc1trXTsKKyAgICBhc3NlcnQocENsdXN0ZXIpOworICAgIGFzc2VydChwQ2x1c3Rlci0+bV9pbmRleCA9PSBrKTsKKyAgICBhc3NlcnQocENsdXN0ZXItPkdldFRpbWUoKSA8PSB0aW1lX25zKTsKKyAgICAKKyAgICByZXR1cm4gcENsdXN0ZXI7Cit9CisKKworVHJhY2tzKiBTZWdtZW50OjpHZXRUcmFja3MoKSBjb25zdAoreworICAgIHJldHVybiBtX3BUcmFja3M7Cit9CisKKworY29uc3QgU2VnbWVudEluZm8qIGNvbnN0IFNlZ21lbnQ6OkdldEluZm8oKSBjb25zdAoreworICAgIHJldHVybiBtX3BJbmZvOworfQorCisKK2xvbmcgbG9uZyBTZWdtZW50OjpHZXREdXJhdGlvbigpIGNvbnN0Cit7CisgICAgYXNzZXJ0KG1fcEluZm8pOworICAgIHJldHVybiBtX3BJbmZvLT5HZXREdXJhdGlvbigpOworfQorCisKK1NlZ21lbnRJbmZvOjpTZWdtZW50SW5mbyhTZWdtZW50KiBwU2VnbWVudCwgbG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZV8pIDoKKyAgICBtX3BTZWdtZW50KHBTZWdtZW50KSwKKyAgICBtX3N0YXJ0KHN0YXJ0KSwKKyAgICBtX3NpemUoc2l6ZV8pLAorICAgIG1fcE11eGluZ0FwcEFzVVRGOChOVUxMKSwKKyAgICBtX3BXcml0aW5nQXBwQXNVVEY4KE5VTEwpLAorICAgIG1fcFRpdGxlQXNVVEY4KE5VTEwpCit7CisgICAgSU1rdlJlYWRlciogY29uc3QgcFJlYWRlciA9IG1fcFNlZ21lbnQtPm1fcFJlYWRlcjsKKyAgIAorICAgIGxvbmcgbG9uZyBwb3MgPSBzdGFydDsKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IHN0YXJ0ICsgc2l6ZV87CisgICAgCisgICAgbV90aW1lY29kZVNjYWxlID0gMTAwMDAwMDsKKyAgICBtX2R1cmF0aW9uID0gMDsKKyAgICAKKyAgICAKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MEFEN0IxLCBtX3RpbWVjb2RlU2NhbGUpKQorICAgICAgICAgICAgYXNzZXJ0KG1fdGltZWNvZGVTY2FsZSA+IDApOworCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwNDg5LCBtX2R1cmF0aW9uKSkKKyAgICAgICAgICAgIGFzc2VydChtX2R1cmF0aW9uID49IDApOworCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwRDgwLCBtX3BNdXhpbmdBcHBBc1VURjgpKSAgIC8vWzREXVs4MF0gCisgICAgICAgICAgICBhc3NlcnQobV9wTXV4aW5nQXBwQXNVVEY4KTsKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MTc0MSwgbV9wV3JpdGluZ0FwcEFzVVRGOCkpICAvL1s1N11bNDFdCisgICAgICAgICAgICBhc3NlcnQobV9wV3JpdGluZ0FwcEFzVVRGOCk7CisgICAgICAgICAgICAKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDNCQTksIG1fcFRpdGxlQXNVVEY4KSkgICAgICAgIC8vWzdCXVtBOV0KKyAgICAgICAgICAgIGFzc2VydChtX3BUaXRsZUFzVVRGOCk7CisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgLy9pZDsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgICAgICAgICAgYXNzZXJ0KChzdG9wIC0gcG9zKSA+IDApOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChzaXplID49IDApOworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuICsgc2l6ZTsgIC8vY29uc3VtZSBzaXplIGFuZCBwYXlsb2FkCisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7Cit9CisKK1NlZ21lbnRJbmZvOjp+U2VnbWVudEluZm8oKQoreworICAgIGlmIChtX3BNdXhpbmdBcHBBc1VURjgpCisgICAgeworICAgICAgICBkZWxldGVbXSBtX3BNdXhpbmdBcHBBc1VURjg7CisgICAgICAgIG1fcE11eGluZ0FwcEFzVVRGOCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1fcFdyaXRpbmdBcHBBc1VURjgpCisgICAgeworICAgICAgICBkZWxldGVbXSBtX3BXcml0aW5nQXBwQXNVVEY4OworICAgICAgICBtX3BXcml0aW5nQXBwQXNVVEY4ID0gTlVMTDsKKyAgICB9CisgICAKKyAgICBpZiAobV9wVGl0bGVBc1VURjgpCisgICAgeworICAgICAgICBkZWxldGVbXSBtX3BUaXRsZUFzVVRGODsKKyAgICAgICAgbV9wVGl0bGVBc1VURjggPSBOVUxMOworICAgIH0KK30KKworbG9uZyBsb25nIFNlZ21lbnRJbmZvOjpHZXRUaW1lQ29kZVNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aW1lY29kZVNjYWxlOworfQorCisKK2xvbmcgbG9uZyBTZWdtZW50SW5mbzo6R2V0RHVyYXRpb24oKSBjb25zdAoreworICAgIGFzc2VydChtX2R1cmF0aW9uID49IDApOyAgICAKKyAgICBhc3NlcnQobV90aW1lY29kZVNjYWxlID49IDEpOworICAgIAorICAgIGNvbnN0IGRvdWJsZSBkZCA9IGRvdWJsZShtX2R1cmF0aW9uKSAqIGRvdWJsZShtX3RpbWVjb2RlU2NhbGUpOworICAgIGNvbnN0IGxvbmcgbG9uZyBkID0gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihkZCk7CisgICAgCisgICAgcmV0dXJuIGQ7Cit9CisKK2NvbnN0IGNoYXIqIFNlZ21lbnRJbmZvOjpHZXRNdXhpbmdBcHBBc1VURjgoKSBjb25zdAoreworICAgIHJldHVybiBtX3BNdXhpbmdBcHBBc1VURjg7Cit9CisKK2NvbnN0IGNoYXIqIFNlZ21lbnRJbmZvOjpHZXRXcml0aW5nQXBwQXNVVEY4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wV3JpdGluZ0FwcEFzVVRGODsKK30KKworY29uc3QgY2hhciogU2VnbWVudEluZm86OkdldFRpdGxlQXNVVEY4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wVGl0bGVBc1VURjg7Cit9CisKK1RyYWNrOjpUcmFjayhTZWdtZW50KiBwU2VnbWVudCwgY29uc3QgSW5mbyYgaSkgOgorICAgIG1fcFNlZ21lbnQocFNlZ21lbnQpLAorICAgIG1faW5mbyhpKQoreworfQorCitUcmFjazo6flRyYWNrKCkKK3sKKyAgICBJbmZvJiBpbmZvID0gY29uc3RfY2FzdDxJbmZvJj4obV9pbmZvKTsKKyAgICBpbmZvLkNsZWFyKCk7Cit9CisKK1RyYWNrOjpJbmZvOjpJbmZvKCk6CisgICAgdHlwZSgtMSksCisgICAgbnVtYmVyKC0xKSwKKyAgICB1aWQoLTEpLAorICAgIG5hbWVBc1VURjgoTlVMTCksCisgICAgY29kZWNJZChOVUxMKSwKKyAgICBjb2RlY1ByaXZhdGUoTlVMTCksCisgICAgY29kZWNQcml2YXRlU2l6ZSgwKSwKKyAgICBjb2RlY05hbWVBc1VURjgoTlVMTCkKK3sKK30KKwordm9pZCBUcmFjazo6SW5mbzo6Q2xlYXIoKSAKK3sKKyAgICBkZWxldGVbXSBuYW1lQXNVVEY4OworICAgIG5hbWVBc1VURjggPSBOVUxMOworCisgICAgZGVsZXRlW10gY29kZWNJZDsKKyAgICBjb2RlY0lkID0gTlVMTDsKKworICAgIGRlbGV0ZVtdIGNvZGVjUHJpdmF0ZTsKKyAgICBjb2RlY1ByaXZhdGUgPSBOVUxMOworCisgICAgZGVsZXRlW10gY29kZWNOYW1lQXNVVEY4OworICAgIGNvZGVjTmFtZUFzVVRGOCA9IE5VTEw7Cit9CisKK2NvbnN0IEJsb2NrRW50cnkqIFRyYWNrOjpHZXRFT1MoKSBjb25zdAoreworICAgIHJldHVybiAmbV9lb3M7Cit9CisKK2xvbmcgbG9uZyBUcmFjazo6R2V0VHlwZSgpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyByZXN1bHQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX2luZm8udHlwZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgbG9uZyBUcmFjazo6R2V0TnVtYmVyKCkgY29uc3QKK3sKKyAgICBhc3NlcnQobV9pbmZvLm51bWJlciA+PSAwKTsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1faW5mby5udW1iZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IGNoYXIqIFRyYWNrOjpHZXROYW1lQXNVVEY4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbmZvLm5hbWVBc1VURjg7Cit9CisKK2NvbnN0IGNoYXIqIFRyYWNrOjpHZXRDb2RlY05hbWVBc1VURjgoKSBjb25zdAoreyAgCisgICAgcmV0dXJuIG1faW5mby5jb2RlY05hbWVBc1VURjg7Cit9CisKKworY29uc3QgY2hhciogVHJhY2s6OkdldENvZGVjSWQoKSBjb25zdAoreworICAgIHJldHVybiBtX2luZm8uY29kZWNJZDsKK30KKworCitjb25zdCB1bnNpZ25lZCBjaGFyKiBUcmFjazo6R2V0Q29kZWNQcml2YXRlKHNpemVfdCAqb3B0aW9uYWxTaXplKSBjb25zdAoreworICAgIGlmIChvcHRpb25hbFNpemUpIHsKKyAgICAgICAgKm9wdGlvbmFsU2l6ZSA9IG1faW5mby5jb2RlY1ByaXZhdGVTaXplOworICAgIH0KKyAgICByZXR1cm4gbV9pbmZvLmNvZGVjUHJpdmF0ZTsKK30KKworCitsb25nIFRyYWNrOjpHZXRGaXJzdChjb25zdCBCbG9ja0VudHJ5KiYgcEJsb2NrRW50cnkpIGNvbnN0Cit7CisgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBtX3BTZWdtZW50LT5HZXRGaXJzdCgpOworICAgIAorICAgIC8vSWYgU2VnbWVudDo6R2V0Rmlyc3QgcmV0dXJucyBOVUxMLCB0aGVuIHRoaXMgbXVzdCBiZSBhIG5ldHdvcmsgCisgICAgLy9kb3dubG9hZCwgYW5kIHdlIGhhdmVuJ3QgbG9hZGVkIGFueSBjbHVzdGVycyB5ZXQuICBJbiB0aGlzIGNhc2UsCisgICAgLy9yZXR1cm5pbmcgTlVMTCBmcm9tIFRyYWNrOjpHZXRGaXJzdCBtZWFucyB0aGUgc2FtZSB0aGluZy4KKworICAgIGlmICgocENsdXN0ZXIgPT0gTlVMTCkgfHwgcENsdXN0ZXItPkVPUygpKQorICAgIHsKKyAgICAgICAgcEJsb2NrRW50cnkgPSBOVUxMOworICAgICAgICByZXR1cm4gRV9CVUZGRVJfTk9UX0ZVTEw7ICAvL3JldHVybiAxTCBpbnN0ZWFkPworICAgIH0KKyAgICAgICAgCisgICAgcEJsb2NrRW50cnkgPSBwQ2x1c3Rlci0+R2V0Rmlyc3QoKTsKKyAgICAKKyAgICB3aGlsZSAocEJsb2NrRW50cnkpCisgICAgeworICAgICAgICBjb25zdCBCbG9jayogY29uc3QgcEJsb2NrID0gcEJsb2NrRW50cnktPkdldEJsb2NrKCk7CisgICAgICAgIGFzc2VydChwQmxvY2spOworICAgICAgICAKKyAgICAgICAgaWYgKHBCbG9jay0+R2V0VHJhY2tOdW1iZXIoKSA9PSAodW5zaWduZWQgbG9uZyltX2luZm8ubnVtYmVyKQorICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICAgICAgCisgICAgICAgIHBCbG9ja0VudHJ5ID0gcENsdXN0ZXItPkdldE5leHQocEJsb2NrRW50cnkpOworICAgIH0KKyAgICAKKyAgICAvL05PVEU6IGlmIHdlIGdldCBoZXJlLCBpdCBtZWFucyB0aGF0IHdlIGRpZG4ndCBmaW5kIGEgYmxvY2sgd2l0aAorICAgIC8vYSBtYXRjaGluZyB0cmFjayBudW1iZXIuICBXZSBpbnRlcnByZXQgdGhhdCBhcyBhbiBlcnJvciAod2hpY2gKKyAgICAvL21pZ2h0IGJlIHRvbyBjb25zZXJ2YXRpdmUpLgorCisgICAgcEJsb2NrRW50cnkgPSBHZXRFT1MoKTsgIC8vc28gd2UgY2FuIHJldHVybiBhIG5vbi1OVUxMIHZhbHVlCisgICAgcmV0dXJuIDFMOworfQorCisKK2xvbmcgVHJhY2s6OkdldE5leHQoY29uc3QgQmxvY2tFbnRyeSogcEN1cnJFbnRyeSwgY29uc3QgQmxvY2tFbnRyeSomIHBOZXh0RW50cnkpIGNvbnN0Cit7CisgICAgYXNzZXJ0KHBDdXJyRW50cnkpOworICAgIGFzc2VydCghcEN1cnJFbnRyeS0+RU9TKCkpOyAgLy8/CisgICAgYXNzZXJ0KHBDdXJyRW50cnktPkdldEJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgPT0gKHVuc2lnbmVkIGxvbmcpbV9pbmZvLm51bWJlcik7ICAgIAorICAgIAorICAgIGNvbnN0IENsdXN0ZXIqIGNvbnN0IHBDdXJyQ2x1c3RlciA9IHBDdXJyRW50cnktPkdldENsdXN0ZXIoKTsKKyAgICBhc3NlcnQocEN1cnJDbHVzdGVyKTsKKyAgICBhc3NlcnQoIXBDdXJyQ2x1c3Rlci0+RU9TKCkpOworICAgIAorICAgIHBOZXh0RW50cnkgPSBwQ3VyckNsdXN0ZXItPkdldE5leHQocEN1cnJFbnRyeSk7CisgICAgICAgICAgICAKKyAgICB3aGlsZSAocE5leHRFbnRyeSkKKyAgICB7ICAgIAorICAgICAgICBjb25zdCBCbG9jayogY29uc3QgcE5leHRCbG9jayA9IHBOZXh0RW50cnktPkdldEJsb2NrKCk7CisgICAgICAgIGFzc2VydChwTmV4dEJsb2NrKTsKKyAgICAKKyAgICAgICAgaWYgKHBOZXh0QmxvY2stPkdldFRyYWNrTnVtYmVyKCkgPT0gKHVuc2lnbmVkIGxvbmcpbV9pbmZvLm51bWJlcikKKyAgICAgICAgICAgIHJldHVybiAwTDsKKyAgICAgICAgICAgIAorICAgICAgICBwTmV4dEVudHJ5ID0gcEN1cnJDbHVzdGVyLT5HZXROZXh0KHBOZXh0RW50cnkpOworICAgIH0KKworICAgIFNlZ21lbnQqIHBTZWdtZW50ID0gcEN1cnJDbHVzdGVyLT5tX3BTZWdtZW50OyAgICAKKyAgICBDbHVzdGVyKiBjb25zdCBwTmV4dENsdXN0ZXIgPSBwU2VnbWVudC0+R2V0TmV4dChwQ3VyckNsdXN0ZXIpOworICAgIAorICAgIGlmICgocE5leHRDbHVzdGVyID09IE5VTEwpIHx8IHBOZXh0Q2x1c3Rlci0+RU9TKCkpCisgICAgeworICAgICAgICBpZiAocFNlZ21lbnQtPlVucGFyc2VkKCkgPD0gMCkgICAvL2FsbCBjbHVzdGVycyBoYXZlIGJlZW4gbG9hZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIHBOZXh0RW50cnkgPSBHZXRFT1MoKTsKKyAgICAgICAgICAgIHJldHVybiAxTDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcE5leHRFbnRyeSA9IE5VTEw7CisgICAgICAgIHJldHVybiBFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9CisgICAgICAgIAorICAgIHBOZXh0RW50cnkgPSBwTmV4dENsdXN0ZXItPkdldEZpcnN0KCk7CisgICAgCisgICAgd2hpbGUgKHBOZXh0RW50cnkpCisgICAgeworICAgICAgICBjb25zdCBCbG9jayogY29uc3QgcE5leHRCbG9jayA9IHBOZXh0RW50cnktPkdldEJsb2NrKCk7CisgICAgICAgIGFzc2VydChwTmV4dEJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIGlmIChwTmV4dEJsb2NrLT5HZXRUcmFja051bWJlcigpID09ICh1bnNpZ25lZCBsb25nKW1faW5mby5udW1iZXIpCisgICAgICAgICAgICByZXR1cm4gMEw7CisgICAgICAgICAgICAKKyAgICAgICAgcE5leHRFbnRyeSA9IHBOZXh0Q2x1c3Rlci0+R2V0TmV4dChwTmV4dEVudHJ5KTsKKyAgICB9CisgICAgCisgICAgLy9UT0RPOiB3aGF0IGhhcyBoYXBwZW5lZCBoZXJlIGlzIHRoYXQgd2UgZGlkIG5vdCBmaW5kIGEgYmxvY2sKKyAgICAvL3dpdGggYSBtYXRjaGluZyB0cmFjayBudW1iZXIgb24gdGhlIG5leHQgY2x1c3Rlci4gIEl0IG1pZ2h0CisgICAgLy9iZSB0aGUgY2FzZSB0aGF0IHNvbWUgY2x1c3RlciBiZXlvbmQgdGhlIG5leHQgY2x1c3RlciAKKyAgICAvL2NvbnRhaW5zIGEgYmxvY2sgaGF2aW5nIGEgbWF0Y2hpbmcgdHJhY2sgbnVtYmVyLCBidXQgZm9yCisgICAgLy9ub3cgd2UgdGVybWluYXRlIHRoZSBzZWFyY2ggaW1tZWRpYXRlbHkuICBXZSBkbyB0aGlzIHNvIHRoYXQKKyAgICAvL3dlIGRvbid0IGVuZCB1cCBzZWFyY2hpbmcgdGhlIGVudGlyZSBmaWxlIGxvb2tpbmcgZm9yIHRoZQorICAgIC8vbmV4dCBibG9jay4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gdHJ5IHNlYXJjaGluZyBmb3IgdGhlIG5leHQKKyAgICAvL2Jsb2NrIGluIGEgc21hbGwsIGZpeGVkIG51bWJlciBvZiBjbHVzdGVycyAoaW50ZWFkIHNlYXJjaGluZworICAgIC8vanVzdCB0aGUgbmV4dCBvbmUpLCBvciB0byB0ZXJtaW5hdGUgdGhlIHNlYXJjaCB3aGVuIHdoZW4gdGhlCisgICAgLy90aGVyZSBpcyBhIGxhcmdlIGdhcCBpbiB0aW1lLCBvciBsYXJnZSBnYXAgaW4gZmlsZSBwb3NpdGlvbi4gIEl0CisgICAgLy9taWdodCB2ZXJ5IHdlbGwgYmUgdGhlIGNhc2UgdGhhdCB0aGUgYXBwcm9hY2ggd2UgdXNlIGhlcmUgaXMKKyAgICAvL3VubmVjZXNzYXJpbHkgY29uc2VydmF0aXZlLgorICAgIAorICAgIC8vVE9ETzogYWdhaW4sIGhlcmUncyBhIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byByZXR1cm4gdGhlIHNwZWNpYWwKKyAgICAvL0VPUyBibG9jay4gIE9yIHNvbWV0aGluZy4gIEl0J3MgT0sgaWYgcE5leHQgaXMgTlVMTCwgYmVjYXVzZQorICAgIC8vd2Ugb25seSBuZWVkIGl0IHRvIHNldCB0aGUgc3RvcCB0aW1lIG9mIHRoZSBtZWRpYSBzYW1wbGUuCisgICAgLy8oVGhlIHN0YXJ0IHRpbWUgaXMgZGV0ZXJtaW5lZCBmcm9tIHBDdXJyLCB3aGljaCBpcyBub24tTlVMTAorICAgIC8vYW5kIG5vbi1FT1MuKSAgVGhlIHByb2JsZW0gaXMgd2hlbiB3ZSBzZXQgcEN1cnI9cE5leHQ7IHdoZW4KKyAgICAvL3BDdXJyIGhhcyB0aGUgdmFsdWUgTlVMTCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgd2UKKyAgICAvL2hhdmVuJ3QgZnVsbHkgaW5pdGlhbGl6ZWQgcEN1cnIgYW5kIHdlIGF0dGVtcHQgdG8gc2V0IGl0IHRvCisgICAgLy9wb2ludCB0byB0aGUgZmlyc3QgYmxvY2sgZm9yIHRoaXMgdHJhY2suICBCdXQgdGhhdCdzIG5vdCB3aGF0CisgICAgLy93ZSB3YW50IGF0IGFsbDsgd2Ugd2FudCB0aGUgbmV4dCBjYWxsIHRvIFBvcHVsYXRlU2FtcGxlIHRvCisgICAgLy9yZXR1cm4gZW5kLW9mLXN0cmVhbSwgbm90IChyZSlzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgLy8KKyAgICAvL09uZSB3b3JrLWFyb3VuZCBpcyB0byBzZW5kIEVPUyBpbW1lZGlhdGVseS4gIFdlIHdvdWxkIHNlbmQgCisgICAgLy90aGUgRU9TIHRoZSBuZXh0IHBhc3MgYW55d2F5LCBzbyBtYXliZSBpdCdzIG5vIGdyZWF0IGxvc3MuICBUaGUgCisgICAgLy9vbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB0aGlzIHRoZSBzdHJlYW0gcmVhbGx5IGRvZXMgZW5kIG9uZQorICAgIC8vY2x1c3RlciBlYXJseSAocmVsYXRpdmUgdG8gb3RoZXIgdHJhY2tzKSwgb3IgdGhlIGxhc3QgZnJhbWUKKyAgICAvL2hhcHBlbnMgdG8gYmUgYSBrZXlmcmFtZSAoIkNhblNlZWtUb0VuZCIpLgorICAgIC8vCisgICAgLy9UaGUgcHJvYmxlbSBpcyB0aGF0IHdlIG5lZWQgYSB3YXkgdG8gbWFyayBhcyBzdHJlYW0gYXMKKyAgICAvLyJhdCBlbmQgb2Ygc3RyZWFtIiB3aXRob3V0IGFjdHVhbGx5IGJlaW5nIGF0IGVuZCBvZiBzdHJlYW0uCisgICAgLy9XZSBuZWVkIHRvIGdpdmUgcEN1cnIgc29tZSB2YWx1ZSB0aGF0IG1lYW5zICJ5b3UndmUgcmVhY2hlZCBFT1MiLgorICAgIC8vV2UgY2FuJ3Qgc3ludGhlc2l6ZSB0aGUgc3BlY2lhbCBFT1MgQ2x1c3RlciBpbW1lZGlhdGVseQorICAgIC8vKHdoZW4gd2UgZmlyc3Qgb3BlbiB0aGUgZmlsZSwgc2F5KSwgYmVjYXVzZSB3ZSB1c2UgdGhlIGV4aXN0YW5jZQorICAgIC8vb2YgdGhhdCBzcGVjaWFsIGNsdXN0ZXIgdmFsdWUgdG8gbWVhbiB0aGF0IHdlJ3ZlIHJlYWQgYWxsIG9mIAorICAgIC8vdGhlIGNsdXN0ZXJzICh0aGlzIGlzIGEgbmV0d29yayBkb3dubG9hZCwgc28gd2UgY2FuJ3Qga25vdyBhcHJpb3JpCisgICAgLy9ob3cgbWFueSB3ZSBoYXZlKS4KKyAgICAvLworICAgIC8vT3IsIHdlIGNvdWxkIHJldHVybiBFX0ZBSUwsIGFuZCBzZXQgYW5vdGhlciBiaXQgaW4gdGhlIHN0cmVhbQorICAgIC8vb2JqZWN0IGl0c2VsZiwgdG8gaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgc2VuZCBFT1MgZWFybGllcgorICAgIC8vdGhhbiB3aGVuIChwQ3Vycj1wU3RvcCkuCisgICAgLy8KKyAgICAvL09yLCBwcm9iYWJseSB0aGUgYmVzdCBzb2x1dGlvbiwgd2hlbiB3ZSBhY3R1YWxseSBsb2FkIHRoZSAKKyAgICAvL2Jsb2NrcyBpbnRvIGEgY2x1c3RlcjogaWYgd2Ugbm90aWNlIHRoYXQgdGhlcmUncyBubyBibG9jaworICAgIC8vZm9yIGEgdHJhY2ssIHdlIHN5bnRoZXNpemUgYSBub25jZSBFT1MgYmxvY2sgZm9yIHRoYXQgdHJhY2suCisgICAgLy9UaGF0IHdheSB3ZSBhbHdheXMgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuLiAgQnV0IHRoYXQgd2lsbAorICAgIC8vb25seSB3b3JrIGZvciBzZXF1ZW50aWFsIHNjYW4/Pz8KKworICAgIC8vcE5leHQgPSBOVUxMOyAgICAKKyAgICAvL3JldHVybiBFX0ZBSUw7CisgICAgcE5leHRFbnRyeSA9IEdldEVPUygpOworICAgIHJldHVybiAxTDsKK30KKworCitUcmFjazo6RU9TQmxvY2s6OkVPU0Jsb2NrKCkKK3sKK30KKworCitib29sIFRyYWNrOjpFT1NCbG9jazo6RU9TKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitDbHVzdGVyKiBUcmFjazo6RU9TQmxvY2s6OkdldENsdXN0ZXIoKSBjb25zdAoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3NpemVfdCBUcmFjazo6RU9TQmxvY2s6OkdldEluZGV4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gMDsKK30KKworCitjb25zdCBCbG9jayogVHJhY2s6OkVPU0Jsb2NrOjpHZXRCbG9jaygpIGNvbnN0Cit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworYm9vbCBUcmFjazo6RU9TQmxvY2s6OklzQkZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworVmlkZW9UcmFjazo6VmlkZW9UcmFjayhTZWdtZW50KiBwU2VnbWVudCwgY29uc3QgSW5mbyYgaSkgOgorICAgIFRyYWNrKHBTZWdtZW50LCBpKSwKKyAgICBtX3dpZHRoKC0xKSwKKyAgICBtX2hlaWdodCgtMSksCisgICAgbV9yYXRlKC0xKQoreworICAgIGFzc2VydChpLnR5cGUgPT0gMSk7CisgICAgYXNzZXJ0KGkubnVtYmVyID4gMCk7CisgICAgCisgICAgSU1rdlJlYWRlciogY29uc3QgcFJlYWRlciA9IHBTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgY29uc3QgU2V0dGluZ3MmIHMgPSBpLnNldHRpbmdzOworICAgIGFzc2VydChzLnN0YXJ0ID49IDApOworICAgIGFzc2VydChzLnNpemUgPj0gMCk7CisgICAgCisgICAgbG9uZyBsb25nIHBvcyA9IHMuc3RhcnQ7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IHBvcyArIHMuc2l6ZTsKKyAgICAKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisjaWZkZWYgX0RFQlVHCisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETzogaGFuZGxlIGVycm9yIGNhc2UKKyAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworI2VuZGlmCisgICAgICAgIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MzAsIG1fd2lkdGgpKSAgICAgICAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4M0EsIG1faGVpZ2h0KSkgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAzODNFMywgbV9yYXRlKSkgCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChzaXplID49IDApOyAgLy9UT0RPOiBoYW5kbGUgZXJyb3IgY2FzZQorICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIHNpemUpIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL3BvcyBub3cgZGVzaWduYXRlcyBzdGFydCBvZiBwYXlsb2FkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICAgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisKK2Jvb2wgVmlkZW9UcmFjazo6VmV0RW50cnkoY29uc3QgQmxvY2tFbnRyeSogcEJsb2NrRW50cnkpIGNvbnN0Cit7CisgICAgYXNzZXJ0KHBCbG9ja0VudHJ5KTsKKyAgICAKKyAgICBjb25zdCBCbG9jayogY29uc3QgcEJsb2NrID0gcEJsb2NrRW50cnktPkdldEJsb2NrKCk7CisgICAgYXNzZXJ0KHBCbG9jayk7ICAgIAorICAgIGFzc2VydChwQmxvY2stPkdldFRyYWNrTnVtYmVyKCkgPT0gKHVuc2lnbmVkIGxvbmcpbV9pbmZvLm51bWJlcik7CisgICAgCisgICAgcmV0dXJuIHBCbG9jay0+SXNLZXkoKTsKK30KKworCisKK2xvbmcgbG9uZyBWaWRlb1RyYWNrOjpHZXRXaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fd2lkdGg7Cit9CisKKworbG9uZyBsb25nIFZpZGVvVHJhY2s6OkdldEhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faGVpZ2h0OworfQorCisKK2RvdWJsZSBWaWRlb1RyYWNrOjpHZXRGcmFtZVJhdGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3JhdGU7Cit9CisKKworQXVkaW9UcmFjazo6QXVkaW9UcmFjayhTZWdtZW50KiBwU2VnbWVudCwgY29uc3QgSW5mbyYgaSkgOgorICAgIFRyYWNrKHBTZWdtZW50LCBpKQoreworICAgIGFzc2VydChpLnR5cGUgPT0gMik7CisgICAgYXNzZXJ0KGkubnVtYmVyID4gMCk7CisKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gcFNlZ21lbnQtPm1fcFJlYWRlcjsKKyAgICAKKyAgICBjb25zdCBTZXR0aW5ncyYgcyA9IGkuc2V0dGluZ3M7CisgICAgYXNzZXJ0KHMuc3RhcnQgPj0gMCk7CisgICAgYXNzZXJ0KHMuc2l6ZSA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgcG9zID0gcy5zdGFydDsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gcG9zICsgcy5zaXplOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyNpZmRlZiBfREVCVUcKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPOiBoYW5kbGUgZXJyb3IgY2FzZQorICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisjZW5kaWYKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgzNSwgbV9yYXRlKSkgICAgICAgICAgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDFGLCBtX2NoYW5uZWxzKSkgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDIyNjQsIG1fYml0RGVwdGgpKSAgCisgICAgICAgICAgICA7ICAgICAgICAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChzaXplID49IDApOyAgLy9UT0RPOiBoYW5kbGUgZXJyb3IgY2FzZQorICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIHNpemUpIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL3BvcyBub3cgZGVzaWduYXRlcyBzdGFydCBvZiBwYXlsb2FkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICAgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK2Jvb2wgQXVkaW9UcmFjazo6VmV0RW50cnkoY29uc3QgQmxvY2tFbnRyeSogcEJsb2NrRW50cnkpIGNvbnN0Cit7CisgICAgYXNzZXJ0KHBCbG9ja0VudHJ5KTsKKyAgICAKKyAgICBjb25zdCBCbG9jayogY29uc3QgcEJsb2NrID0gcEJsb2NrRW50cnktPkdldEJsb2NrKCk7CisgICAgYXNzZXJ0KHBCbG9jayk7CisgICAgYXNzZXJ0KHBCbG9jay0+R2V0VHJhY2tOdW1iZXIoKSA9PSAodW5zaWduZWQgbG9uZyltX2luZm8ubnVtYmVyKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2RvdWJsZSBBdWRpb1RyYWNrOjpHZXRTYW1wbGluZ1JhdGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3JhdGU7Cit9CisKKworbG9uZyBsb25nIEF1ZGlvVHJhY2s6OkdldENoYW5uZWxzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jaGFubmVsczsKK30KKworbG9uZyBsb25nIEF1ZGlvVHJhY2s6OkdldEJpdERlcHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iaXREZXB0aDsKK30KKworVHJhY2tzOjpUcmFja3MoU2VnbWVudCogcFNlZ21lbnQsIGxvbmcgbG9uZyBzdGFydCwgbG9uZyBsb25nIHNpemVfKSA6CisgICAgbV9wU2VnbWVudChwU2VnbWVudCksCisgICAgbV9zdGFydChzdGFydCksCisgICAgbV9zaXplKHNpemVfKSwKKyAgICBtX3RyYWNrRW50cmllcyhOVUxMKSwKKyAgICBtX3RyYWNrRW50cmllc0VuZChOVUxMKQoreworICAgIGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIG1fc2l6ZTsKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gbV9wU2VnbWVudC0+bV9wUmVhZGVyOworICAgIAorICAgIGxvbmcgbG9uZyBwb3MxID0gbV9zdGFydDsKKyAgICBpbnQgY291bnQgPSAwOworICAgIAorICAgIHdoaWxlIChwb3MxIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MxLCBsZW4pOworICAgICAgICBhc3NlcnQoaWQgPj0gMCk7CisgICAgICAgIGFzc2VydCgocG9zMSArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICBwb3MxICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MxLCBsZW4pOworICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KChwb3MxICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgIHBvczEgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplCisgICAgICAgIAorICAgICAgICAvL3BvcyBub3cgZGVzaW5hdGVzIHN0YXJ0IG9mIGVsZW1lbnQKKyAgICAgICAgaWYgKGlkID09IDB4MkUpICAvL1RyYWNrRW50cnkgSUQKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zMSArPSBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICAgICAgYXNzZXJ0KHBvczEgPD0gc3RvcCk7CisgICAgfSAgICAKKworICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3RyYWNrRW50cmllcyA9IG5ldyBUcmFjaypbY291bnRdOworICAgIG1fdHJhY2tFbnRyaWVzRW5kID0gbV90cmFja0VudHJpZXM7CisKKyAgICBsb25nIGxvbmcgcG9zID0gbV9zdGFydDsKKworICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgYXNzZXJ0KGlkID49IDApOworICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZTEgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIGFzc2VydChzaXplMSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZQorICAgICAgICAKKyAgICAgICAgLy9wb3Mgbm93IGRlc2luYXRlcyBzdGFydCBvZiBlbGVtZW50CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMHgyRSkgIC8vVHJhY2tFbnRyeSBJRAorICAgICAgICAgICAgUGFyc2VUcmFja0VudHJ5KHBvcywgc2l6ZTEsICptX3RyYWNrRW50cmllc0VuZCsrKTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gc2l6ZTE7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgIH0gICAgCit9CisKK3Vuc2lnbmVkIGxvbmcgVHJhY2tzOjpHZXRUcmFja3NDb3VudCgpIGNvbnN0Cit7CisgICAgY29uc3QgcHRyZGlmZl90IHJlc3VsdCA9IG1fdHJhY2tFbnRyaWVzRW5kIC0gbV90cmFja0VudHJpZXM7CisgICAgYXNzZXJ0KHJlc3VsdCA+PSAwKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocmVzdWx0KTsKK30KKworCit2b2lkIFRyYWNrczo6UGFyc2VUcmFja0VudHJ5KAorICAgIGxvbmcgbG9uZyBzdGFydCwKKyAgICBsb25nIGxvbmcgc2l6ZSwKKyAgICBUcmFjayomIHBUcmFjaykKK3sKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gbV9wU2VnbWVudC0+bV9wUmVhZGVyOworICAgIAorICAgIGxvbmcgbG9uZyBwb3MgPSBzdGFydDsKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IHN0YXJ0ICsgc2l6ZTsKKworICAgIFRyYWNrOjpJbmZvIGk7CisgICAgCisgICAgVHJhY2s6OlNldHRpbmdzIHZpZGVvU2V0dGluZ3M7CisgICAgdmlkZW9TZXR0aW5ncy5zdGFydCA9IC0xOworICAgIAorICAgIFRyYWNrOjpTZXR0aW5ncyBhdWRpb1NldHRpbmdzOworICAgIGF1ZGlvU2V0dGluZ3Muc3RhcnQgPSAtMTsKKyAgICAKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisjaWZkZWYgX0RFQlVHCisgICAgICAgIGxvbmcgbGVuOworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIGxlbjsKKyAgICAgICAgaWQ7CisjZW5kaWYKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHg1NywgaS5udW1iZXIpKQorICAgICAgICAgICAgYXNzZXJ0KGkubnVtYmVyID4gMCk7CisKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDMzQzUsIGkudWlkKSkgICAgICAgICAgIAorICAgICAgICAgICAgOyAgCisKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAzLCBpLnR5cGUpKSAgICAgICAgICAgIAorICAgICAgICAgICAgOyAgCisKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDEzNkUsIGkubmFtZUFzVVRGOCkpICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0KGkubmFtZUFzVVRGOCk7ICAKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDYsIGkuY29kZWNJZCkpICAgICAgICAgCisgICAgICAgICAgICA7ICAKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MjNBMiwgaS5jb2RlY1ByaXZhdGUsICZpLmNvZGVjUHJpdmF0ZVNpemUpKSAgCisgICAgICAgICAgICA7ICAKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDU4Njg4LCBpLmNvZGVjTmFtZUFzVVRGOCkpICAgCisgICAgICAgICAgICBhc3NlcnQoaS5jb2RlY05hbWVBc1VURjgpOyAgCisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPOiBoYW5kbGUgZXJyb3IgY2FzZQorICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlkID09IDB4NjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW9TZXR0aW5ncy5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgICAgIHZpZGVvU2V0dGluZ3Muc2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpZCA9PSAweDYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF1ZGlvU2V0dGluZ3Muc3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgICAgICBhdWRpb1NldHRpbmdzLnNpemUgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7CisgICAgLy9UT0RPOiBwcm9wZXJ0bHkgdmV0IGluZm8ubnVtYmVyLCB0byBlbnN1cmUgYm90aCBpdHMgZXhpc3RlbmNlLAorICAgIC8vYW5kIHRoYXQgaXQgaXMgdW5pcXVlIGFtb25nIGFsbCB0cmFja3MuCisgICAgYXNzZXJ0KGkubnVtYmVyID4gMCk7CisKKyAgICAvL1RPRE86IHZldCBzZXR0aW5ncywgdG8gZW5zdXJlIHRoYXQgdmlkZW8gc2V0dGluZ3MgKDB4NjApCisgICAgLy93ZXJlIHNwZWNpZmllZCB3aGVuIHR5cGUgPSAxLCBhbmQgdGhhdCBhdWRpbyBzZXR0aW5ncyAoMHg2MSkKKyAgICAvL3dlcmUgc3BlY2lmaWVkIHdoZW4gdHlwZSA9IDIuICAgIAorICAgIGlmIChpLnR5cGUgPT0gMSkgIC8vdmlkZW8KKyAgICB7CisgICAgICAgIGFzc2VydChhdWRpb1NldHRpbmdzLnN0YXJ0IDwgMCk7CisgICAgICAgIGFzc2VydCh2aWRlb1NldHRpbmdzLnN0YXJ0ID49IDApOworICAgICAgICAKKyAgICAgICAgaS5zZXR0aW5ncyA9IHZpZGVvU2V0dGluZ3M7CisgICAgICAgIAorICAgICAgICBWaWRlb1RyYWNrKiBjb25zdCB0ID0gbmV3IFZpZGVvVHJhY2sobV9wU2VnbWVudCwgaSk7CisgICAgICAgIGFzc2VydCh0KTsgIC8vVE9ETworICAgICAgICBwVHJhY2sgPSB0OyAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoaS50eXBlID09IDIpICAvL2F1ZGlvCisgICAgeworICAgICAgICBhc3NlcnQodmlkZW9TZXR0aW5ncy5zdGFydCA8IDApOworICAgICAgICBhc3NlcnQoYXVkaW9TZXR0aW5ncy5zdGFydCA+PSAwKTsKKyAgICAgICAgCisgICAgICAgIGkuc2V0dGluZ3MgPSBhdWRpb1NldHRpbmdzOworICAgICAgICAKKyAgICAgICAgQXVkaW9UcmFjayogY29uc3QgdCA9IG5ldyAgQXVkaW9UcmFjayhtX3BTZWdtZW50LCBpKTsKKyAgICAgICAgYXNzZXJ0KHQpOyAgLy9UT0RPCisgICAgICAgIHBUcmFjayA9IHQ7ICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gZm9yIG5vdyB3ZSBkbyBub3Qgc3VwcG9ydCBvdGhlciB0cmFjayB0eXBlcyB5ZXQuCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgdHJhY2sgdHlwZXMKKyAgICAgICAgaS5DbGVhcigpOworICAKKyAgICAgICAgcFRyYWNrID0gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisKK1RyYWNrczo6flRyYWNrcygpCit7CisgICAgVHJhY2sqKiBpID0gbV90cmFja0VudHJpZXM7CisgICAgVHJhY2sqKiBjb25zdCBqID0gbV90cmFja0VudHJpZXNFbmQ7CisgICAgCisgICAgd2hpbGUgKGkgIT0gaikKKyAgICB7CisgICAgICAgIFRyYWNrKiBwVHJhY2sgPSAqaSsrOworICAgICAgICBkZWxldGUgcFRyYWNrOworICAgICAgICBwVHJhY2sgPSBOVUxMOyAgICAKKyAgICB9CisKKyAgICBkZWxldGVbXSBtX3RyYWNrRW50cmllczsKK30KKworCitUcmFjayogVHJhY2tzOjpHZXRUcmFja0J5TnVtYmVyKHVuc2lnbmVkIGxvbmcgdG4pIGNvbnN0Cit7CisgICAgVHJhY2sqKiBpID0gbV90cmFja0VudHJpZXM7CisgICAgVHJhY2sqKiBjb25zdCBqID0gbV90cmFja0VudHJpZXNFbmQ7CisKKyAgICB3aGlsZSAoaSAhPSBqKQorICAgIHsKKyAgICAgICAgVHJhY2sqIGNvbnN0IHBUcmFjayA9ICppKys7CisgICAgICAgCisgICAgICAgIGlmIChwVHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICh0biA9PSBwVHJhY2stPkdldE51bWJlcigpKQorICAgICAgICAgICAgcmV0dXJuIHBUcmFjazsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsgIC8vbm90IGZvdW5kCit9CisKKworVHJhY2sqIFRyYWNrczo6R2V0VHJhY2tCeUluZGV4KHVuc2lnbmVkIGxvbmcgaWR4KSBjb25zdAoreworICAgIGNvbnN0IHB0cmRpZmZfdCBjb3VudCA9IG1fdHJhY2tFbnRyaWVzRW5kIC0gbV90cmFja0VudHJpZXM7CisgICAgICAgCisgICAgaWYgKGlkeCA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihjb3VudCkpCisgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBtX3RyYWNrRW50cmllc1tpZHhdOworfQorCisKK3ZvaWQgQ2x1c3Rlcjo6TG9hZCgpCit7CisgICAgYXNzZXJ0KG1fcFNlZ21lbnQpOworICAgIAorICAgIGlmIChtX3N0YXJ0ID4gMCkKKyAgICB7CisgICAgICAgIGFzc2VydChtX3NpemUgPiAwKTsKKyAgICAgICAgYXNzZXJ0KG1fdGltZWNvZGUgPj0gMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KG1fc2l6ZSA9PSAwKTsKKyAgICBhc3NlcnQobV90aW1lY29kZSA8IDApOworICAgIAorICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BTZWdtZW50LT5tX3BSZWFkZXI7CisKKyAgICBjb25zdCBsb25nIGxvbmcgb2ZmID0gLW1fc3RhcnQ7ICAvL3JlbGF0aXZlIHRvIHNlZ21lbnQKKyAgICBsb25nIGxvbmcgcG9zID0gbV9wU2VnbWVudC0+bV9zdGFydCArIG9mZjsgIC8vYWJzb2x1dGUKKyAgICAKKyAgICBsb25nIGxlbjsKKworICAgIGNvbnN0IGxvbmcgbG9uZyBpZF8gPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KGlkXyA+PSAwKTsKKyAgICBhc3NlcnQoaWRfID09IDB4MEY0M0I2NzUpOyAgLy9DbHVzdGVyIElECisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplXyA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2l6ZV8gPj0gMCk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgCisgICAgbV9zdGFydCA9IHBvczsKKyAgICBtX3NpemUgPSBzaXplXzsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBzaXplXzsKKyAgICAKKyAgICBsb25nIGxvbmcgdGltZWNvZGUgPSAtMTsKKyAgICAKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4NjcsIHRpbWVjb2RlKSkKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE8KKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpZCA9PSAweDIwKSAgLy9CbG9ja0dyb3VwIElECisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaWQgPT0gMHgyMykgIC8vU2ltcGxlQmxvY2sgSUQKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgIGFzc2VydCh0aW1lY29kZSA+PSAwKTsKKyAgICAKKyAgICBtX3RpbWVjb2RlID0gdGltZWNvZGU7Cit9CisKKworQ2x1c3RlciogQ2x1c3Rlcjo6UGFyc2UoCisgICAgU2VnbWVudCogcFNlZ21lbnQsCisgICAgc2l6ZV90IGlkeCwKKyAgICBsb25nIGxvbmcgb2ZmKQoreworICAgIGFzc2VydChwU2VnbWVudCk7CisgICAgYXNzZXJ0KG9mZiA+PSAwKTsKKyAgICBhc3NlcnQob2ZmIDwgcFNlZ21lbnQtPm1fc2l6ZSk7CisgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBuZXcgQ2x1c3RlcihwU2VnbWVudCwgaWR4LCAtb2ZmKTsKKyAgICBhc3NlcnQocENsdXN0ZXIpOworICAgIAorICAgIHJldHVybiBwQ2x1c3RlcjsKK30KKworCitDbHVzdGVyOjpDbHVzdGVyKCkgOgorICAgIG1fcFNlZ21lbnQoTlVMTCksCisgICAgbV9pbmRleCgwKSwKKyAgICBtX3N0YXJ0KDApLAorICAgIG1fc2l6ZSgwKSwKKyAgICBtX3RpbWVjb2RlKDApLAorICAgIG1fcEVudHJpZXMoTlVMTCksCisgICAgbV9lbnRyaWVzQ291bnQoMCkKK3sKK30KKworQ2x1c3Rlcjo6Q2x1c3RlcigKKyAgICBTZWdtZW50KiBwU2VnbWVudCwKKyAgICBzaXplX3QgaWR4LAorICAgIGxvbmcgbG9uZyBvZmYpIDoKKyAgICBtX3BTZWdtZW50KHBTZWdtZW50KSwKKyAgICBtX2luZGV4KGlkeCksCisgICAgbV9zdGFydChvZmYpLAorICAgIG1fc2l6ZSgwKSwKKyAgICBtX3RpbWVjb2RlKC0xKSwKKyAgICBtX3BFbnRyaWVzKE5VTEwpLAorICAgIG1fZW50cmllc0NvdW50KDApCit7Cit9CisKKworQ2x1c3Rlcjo6fkNsdXN0ZXIoKQoreworI2lmIDAKKyAgICB3aGlsZSAoIW1fcEVudHJpZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIEJsb2NrRW50cnkqIHBCbG9ja0VudHJ5ID0gbV9wRW50cmllcy5mcm9udCgpOworICAgICAgICBhc3NlcnQocEJsb2NrRW50cnkpOworICAgICAgICAKKyAgICAgICAgbV9wRW50cmllcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgZGVsZXRlIHBCbG9ja0VudHJ5OworICAgIH0KKyNlbHNlCisgICAgQmxvY2tFbnRyeSoqIGkgPSBtX3BFbnRyaWVzOworICAgIEJsb2NrRW50cnkqKiBjb25zdCBqID0gbV9wRW50cmllcyArIG1fZW50cmllc0NvdW50OworICAgIHdoaWxlIChpICE9IGopCisgICAgeworICAgICAgICAgQmxvY2tFbnRyeSogcCA9ICppKys7CisgICAKKyAgICAgICAgIGFzc2VydChwKTsKKyAgICAgICAgIGRlbGV0ZSBwOworICAgIH0KKyAKKyAgICBkZWxldGVbXSBtX3BFbnRyaWVzOworI2VuZGlmCisKK30KKworYm9vbCBDbHVzdGVyOjpFT1MoKSBjb25zdAoreworICAgIHJldHVybiAobV9wU2VnbWVudCA9PSAwKTsKK30KKworCit2b2lkIENsdXN0ZXI6OkxvYWRCbG9ja0VudHJpZXMoKQoreworICAgIGlmIChtX3BFbnRyaWVzKQorICAgICAgICByZXR1cm47CisKKyAgICBMb2FkKCk7ICAgIAorICAgIGFzc2VydChtX3RpbWVjb2RlID49IDApOworICAgIGFzc2VydChtX3N0YXJ0ID4gMCk7CisgICAgYXNzZXJ0KG1fc2l6ZSA+IDApOworICAgIAorICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgbG9uZyBsb25nIHBvcyA9IG1fc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBtX3N0YXJ0ICsgbV9zaXplOworICAgIGxvbmcgbG9uZyB0aW1lY29kZSA9IC0xOworICAgCisgICAgbG9uZyBsb25nIGlkeCA9IHBvczsKKworICAgIG1fZW50cmllc0NvdW50ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoaWR4IDwgc3RvcCkKKyAgICB7CisgICAgICAgIGlmIChNYXRjaChwUmVhZGVyLCBpZHgsIDB4NjcsIHRpbWVjb2RlKSkKKyAgICAgICAgICAgIGFzc2VydCh0aW1lY29kZSA9PSBtX3RpbWVjb2RlKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIGlkeCwgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChpZHggKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZHggKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgaWR4LCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE8KKyAgICAgICAgICAgIGFzc2VydCgoaWR4ICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWR4ICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpZCA9PSAweDIwKSAgLy9CbG9ja0dyb3VwIElECisgICAgICAgICAgICAgICAgKyttX2VudHJpZXNDb3VudDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlkID09IDB4MjMpICAvL1NpbXBsZUJsb2NrIElECisgICAgICAgICAgICAgICAgKyttX2VudHJpZXNDb3VudDsKKworICAgICAgICAgICAgaWR4ICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorCisgICAgICAgICAgICBhc3NlcnQoaWR4IDw9IHN0b3ApOworICAgICAgICB9ICAKKyAgICB9CisKKyAgICBpZiAobV9lbnRyaWVzQ291bnQgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgICAKKyAgICBtX3BFbnRyaWVzID0gbmV3IEJsb2NrRW50cnkqW21fZW50cmllc0NvdW50XTsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHg2NywgdGltZWNvZGUpKQorICAgICAgICAgICAgYXNzZXJ0KHRpbWVjb2RlID09IG1fdGltZWNvZGUpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlkID09IDB4MjApICAvL0Jsb2NrR3JvdXAgSUQKKyAgICAgICAgICAgICAgICBQYXJzZUJsb2NrR3JvdXAocG9zLCBzaXplLCBpbmRleCsrKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlkID09IDB4MjMpICAvL1NpbXBsZUJsb2NrIElECisgICAgICAgICAgICAgICAgUGFyc2VTaW1wbGVCbG9jayhwb3MsIHNpemUsIGluZGV4KyspOworCisgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7CisgICAgYXNzZXJ0KHRpbWVjb2RlID49IDApOworICAgIGFzc2VydChpbmRleCA9PSBtX2VudHJpZXNDb3VudCk7Cit9CisKKworCitsb25nIGxvbmcgQ2x1c3Rlcjo6R2V0VGltZUNvZGUoKQoreworICAgIExvYWQoKTsKKyAgICByZXR1cm4gbV90aW1lY29kZTsKK30KKworCitsb25nIGxvbmcgQ2x1c3Rlcjo6R2V0VGltZSgpCit7CisgICAgY29uc3QgbG9uZyBsb25nIHRjID0gR2V0VGltZUNvZGUoKTsKKyAgICBhc3NlcnQodGMgPj0gMCk7CisgICAgCisgICAgY29uc3QgU2VnbWVudEluZm8qIGNvbnN0IHBJbmZvID0gbV9wU2VnbWVudC0+R2V0SW5mbygpOworICAgIGFzc2VydChwSW5mbyk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNjYWxlID0gcEluZm8tPkdldFRpbWVDb2RlU2NhbGUoKTsKKyAgICBhc3NlcnQoc2NhbGUgPj0gMSk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHQgPSBtX3RpbWVjb2RlICogc2NhbGU7CisKKyAgICByZXR1cm4gdDsKK30KKworCit2b2lkIENsdXN0ZXI6OlBhcnNlQmxvY2tHcm91cChsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplLCBzaXplX3QgaW5kZXgpCit7CisgICAgYXNzZXJ0KG1fcEVudHJpZXMpOworICAgIGFzc2VydChtX2VudHJpZXNDb3VudCk7CisgICAgYXNzZXJ0KGluZGV4IDwgbV9lbnRyaWVzQ291bnQpOworICAgIAorICAgIEJsb2NrR3JvdXAqIGNvbnN0IHBHcm91cCA9IG5ldyBCbG9ja0dyb3VwKHRoaXMsIGluZGV4LCBzdGFydCwgc2l6ZSk7CisgICAgYXNzZXJ0KHBHcm91cCk7ICAvL1RPRE8KKyAgICAgICAgCisgICAgbV9wRW50cmllc1tpbmRleF0gPSBwR3JvdXA7Cit9CisKKworCit2b2lkIENsdXN0ZXI6OlBhcnNlU2ltcGxlQmxvY2sobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSwgc2l6ZV90IGluZGV4KQoreworICAgIGFzc2VydChtX3BFbnRyaWVzKTsKKyAgICBhc3NlcnQobV9lbnRyaWVzQ291bnQpOworICAgIGFzc2VydChpbmRleCA8IG1fZW50cmllc0NvdW50KTsKKworICAgIFNpbXBsZUJsb2NrKiBjb25zdCBwU2ltcGxlQmxvY2sgPSBuZXcgU2ltcGxlQmxvY2sodGhpcywgaW5kZXgsIHN0YXJ0LCBzaXplKTsKKyAgICBhc3NlcnQocFNpbXBsZUJsb2NrKTsgIC8vVE9ETworICAgICAgICAKKyAgICBtX3BFbnRyaWVzW2luZGV4XSA9IHBTaW1wbGVCbG9jazsKK30KKworCitjb25zdCBCbG9ja0VudHJ5KiBDbHVzdGVyOjpHZXRGaXJzdCgpCit7CisgICAgTG9hZEJsb2NrRW50cmllcygpOworICAgIAorICAgIHJldHVybiBtX3BFbnRyaWVzWzBdOworfQorCisgICAgICAgIAorY29uc3QgQmxvY2tFbnRyeSogQ2x1c3Rlcjo6R2V0TGFzdCgpCit7IAorICAgIGlmIChtX2VudHJpZXNDb3VudCA9PSAwKQorICAgICAgICByZXR1cm4gbV9wRW50cmllc1swXTsKKyAgICAKKyAgICByZXR1cm4gbV9wRW50cmllc1ttX2VudHJpZXNDb3VudC0xXTsKK30KKworICAgICAgICAKK2NvbnN0IEJsb2NrRW50cnkqIENsdXN0ZXI6OkdldE5leHQoY29uc3QgQmxvY2tFbnRyeSogcEVudHJ5KSBjb25zdAoreworICAgIGFzc2VydChwRW50cnkpOworICAgIAorICAgIHNpemVfdCBpZHggPSBwRW50cnktPkdldEluZGV4KCk7CisgICAgCisgICAgKytpZHg7CisKKyAgICBpZiAoaWR4ID09IG1fZW50cmllc0NvdW50KSAKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG1fcEVudHJpZXNbaWR4XTsKKworfQorCisKK2NvbnN0IEJsb2NrRW50cnkqIENsdXN0ZXI6OkdldEVudHJ5KGNvbnN0IFRyYWNrKiBwVHJhY2spCit7CisKKyAgICBhc3NlcnQocFRyYWNrKTsKKyAgICAKKyAgICBpZiAobV9wU2VnbWVudCA9PSBOVUxMKSAgLy9FT1MKKyAgICAgICAgcmV0dXJuIHBUcmFjay0+R2V0RU9TKCk7CisgICAgCisgICAgTG9hZEJsb2NrRW50cmllcygpOworICAgIAorICAgIEJsb2NrRW50cnkqIGkgPSAqbV9wRW50cmllczsKKyAgICBCbG9ja0VudHJ5KiBqID0gKm1fcEVudHJpZXMgKyBtX2VudHJpZXNDb3VudDsKKyAgICB3aGlsZSAoaSAhPSBqKQorICAgIHsKKyAgICAgICAgQmxvY2tFbnRyeSogcEVudHJ5ID0gaTsKKyAgICAgICAgaSsrOworICAgICAgICBhc3NlcnQocEVudHJ5KTsKKyAgICAgICAgYXNzZXJ0KCFwRW50cnktPkVPUygpKTsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwQmxvY2sgPSBwRW50cnktPkdldEJsb2NrKCk7CisgICAgICAgIGFzc2VydChwQmxvY2spOworICAgICAgICAKKyAgICAgICAgaWYgKHBCbG9jay0+R2V0VHJhY2tOdW1iZXIoKSAhPSBwVHJhY2stPkdldE51bWJlcigpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHBUcmFjay0+VmV0RW50cnkocEVudHJ5KSkKKyAgICAgICAgICAgIHJldHVybiBwRW50cnk7CisgICAgfQorICAgIAorICAgIHJldHVybiBwVHJhY2stPkdldEVPUygpOyAgLy9ubyBzYXRpc2ZhY3RvcnkgYmxvY2sgZm91bmQKK30KKworCitCbG9ja0VudHJ5OjpCbG9ja0VudHJ5KCkKK3sKK30KKworCitCbG9ja0VudHJ5Ojp+QmxvY2tFbnRyeSgpCit7Cit9CisKKworCitTaW1wbGVCbG9jazo6U2ltcGxlQmxvY2soCisgICAgQ2x1c3RlciogcENsdXN0ZXIsIAorICAgIHNpemVfdCBpZHgsIAorICAgIGxvbmcgbG9uZyBzdGFydCwgCisgICAgbG9uZyBsb25nIHNpemUpIDoKKyAgICBtX3BDbHVzdGVyKHBDbHVzdGVyKSwKKyAgICBtX2luZGV4KGlkeCksCisgICAgbV9ibG9jayhzdGFydCwgc2l6ZSwgcENsdXN0ZXItPm1fcFNlZ21lbnQtPm1fcFJlYWRlcikKK3sKK30KKworCitib29sIFNpbXBsZUJsb2NrOjpFT1MoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworCitDbHVzdGVyKiBTaW1wbGVCbG9jazo6R2V0Q2x1c3RlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcENsdXN0ZXI7Cit9CisKKworc2l6ZV90IFNpbXBsZUJsb2NrOjpHZXRJbmRleCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5kZXg7Cit9CisKKworY29uc3QgQmxvY2sqIFNpbXBsZUJsb2NrOjpHZXRCbG9jaygpIGNvbnN0Cit7CisgICAgcmV0dXJuICZtX2Jsb2NrOworfQorCisKK2Jvb2wgU2ltcGxlQmxvY2s6OklzQkZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworQmxvY2tHcm91cDo6QmxvY2tHcm91cCgKKyAgICBDbHVzdGVyKiBwQ2x1c3RlciwgCisgICAgc2l6ZV90IGlkeCwgCisgICAgbG9uZyBsb25nIHN0YXJ0LCAKKyAgICBsb25nIGxvbmcgc2l6ZV8pIDoKKyAgICBtX3BDbHVzdGVyKHBDbHVzdGVyKSwKKyAgICBtX2luZGV4KGlkeCksCisgICAgbV9wcmV2VGltZUNvZGUoMCksCisgICAgbV9uZXh0VGltZUNvZGUoMCksCisgICAgbV9wQmxvY2soTlVMTCkgIC8vVE9ETzogYWNjZXB0IG11bHRpcGxlIGJsb2NrcyB3aXRoaW4gYSBibG9jayBncm91cAoreworICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BDbHVzdGVyLT5tX3BTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplXzsKKyAKKyAgICBib29sIGJTaW1wbGVCbG9jayA9IGZhbHNlOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgc2hvcnQgdDsKKyAgICAKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHg3QiwgdCkpCisgICAgICAgIHsgICAgCisgICAgICAgICAgICBpZiAodCA8IDApCisgICAgICAgICAgICAgICAgbV9wcmV2VGltZUNvZGUgPSB0OworICAgICAgICAgICAgZWxzZSBpZiAodCA+IDApCisgICAgICAgICAgICAgICAgbV9uZXh0VGltZUNvZGUgPSB0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE8KKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAoaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDIzOiAgLy9TaW1wbGVCbG9jayBJRAorICAgICAgICAgICAgICAgICAgICBiU2ltcGxlQmxvY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvL1lFUywgRkFMTCBUSFJPVUdIIFRPIE5FWFQgQ0FTRQorCisgICAgICAgICAgICAgICAgY2FzZSAweDIxOiAgLy9CbG9jayBJRAorICAgICAgICAgICAgICAgICAgICBQYXJzZUJsb2NrKHBvcywgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBhc3NlcnQocG9zID09IHN0b3ApOworICAgIGFzc2VydChtX3BCbG9jayk7CisgICAgCisgICAgaWYgKCFiU2ltcGxlQmxvY2spCisgICAgICAgIG1fcEJsb2NrLT5TZXRLZXkobV9wcmV2VGltZUNvZGUgPj0gMCk7Cit9CisKKworQmxvY2tHcm91cDo6fkJsb2NrR3JvdXAoKQoreworICAgIGRlbGV0ZSBtX3BCbG9jazsKK30KKworCit2b2lkIEJsb2NrR3JvdXA6OlBhcnNlQmxvY2sobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSkKK3sgICAKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gbV9wQ2x1c3Rlci0+bV9wU2VnbWVudC0+bV9wUmVhZGVyOworICAgIAorICAgIEJsb2NrKiBjb25zdCBwQmxvY2sgPSBuZXcgQmxvY2soc3RhcnQsIHNpemUsIHBSZWFkZXIpOworICAgIGFzc2VydChwQmxvY2spOyAgLy9UT0RPCisKKyAgICAvL1RPRE86IHRoZSBNYXRyb3NrYSBzcGVjIHNheXMgeW91IGhhdmUgbXVsdGlwbGUgYmxvY2tzIHdpdGhpbiB0aGUgCisgICAgLy9zYW1lIGJsb2NrIGdyb3VwLCB3aXRoIGJsb2NrcyByYW5rZWQgYnkgcHJpb3JpdHkgKHRoZSBmbGFnIGJpdHMpLgorICAgIC8vSSBoYXZlbid0IGV2ZXIgc2VlbiBzdWNoIGEgZmlsZSAobWt2bXV4IGNlcnRhaW5seSBkb2Vzbid0IG1ha2UKKyAgICAvL29uZSksIHNvIHVudGlsIHRoZW4gSSdsbCBqdXN0IGFzc3VtZSBibG9jayBncm91cHMgY29udGFpbiBhIHNpbmdsZQorICAgIC8vYmxvY2suCisjaWYgMCAgICAKKyAgICBtX2Jsb2Nrcy5wdXNoX2JhY2socEJsb2NrKTsKKyNlbHNlCisgICAgYXNzZXJ0KG1fcEJsb2NrID09IE5VTEwpOworICAgIG1fcEJsb2NrID0gcEJsb2NrOworI2VuZGlmCisKKyNpZiAwCisgICAgVHJhY2sqIGNvbnN0IHBUcmFjayA9IHBCbG9jay0+R2V0VHJhY2soKTsKKyAgICBhc3NlcnQocFRyYWNrKTsKKyAgICAKKyAgICBwVHJhY2stPkluc2VydChwQmxvY2spOworI2VuZGlmCit9CisKKworYm9vbCBCbG9ja0dyb3VwOjpFT1MoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworCitDbHVzdGVyKiBCbG9ja0dyb3VwOjpHZXRDbHVzdGVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wQ2x1c3RlcjsKK30KKworCitzaXplX3QgQmxvY2tHcm91cDo6R2V0SW5kZXgoKSBjb25zdAoreworICAgIHJldHVybiBtX2luZGV4OworfQorCisKK2NvbnN0IEJsb2NrKiBCbG9ja0dyb3VwOjpHZXRCbG9jaygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcEJsb2NrOworfQorCisKK3Nob3J0IEJsb2NrR3JvdXA6OkdldFByZXZUaW1lQ29kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJldlRpbWVDb2RlOworfQorCisKK3Nob3J0IEJsb2NrR3JvdXA6OkdldE5leHRUaW1lQ29kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbmV4dFRpbWVDb2RlOworfSAgICAKKworCitib29sIEJsb2NrR3JvdXA6OklzQkZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fbmV4dFRpbWVDb2RlID4gMCk7Cit9CisKKworCitCbG9jazo6QmxvY2sobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZV8sIElNa3ZSZWFkZXIqIHBSZWFkZXIpIDoKKyAgICBtX3N0YXJ0KHN0YXJ0KSwKKyAgICBtX3NpemUoc2l6ZV8pCit7CisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplXzsKKworICAgIGxvbmcgbGVuOworICAgIAorICAgIG1fdHJhY2sgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KG1fdHJhY2sgPiAwKTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSB0cmFjayBudW1iZXIKKyAgICBhc3NlcnQoKHN0b3AgLSBwb3MpID49IDIpOworICAgIAorICAgIG1fdGltZWNvZGUgPSBVbnNlcmlhbGl6ZTJTSW50KHBSZWFkZXIsIHBvcyk7CisKKyAgICBwb3MgKz0gMjsKKyAgICBhc3NlcnQoKHN0b3AgLSBwb3MpID49IDEpOworICAgIAorICAgIGNvbnN0IGxvbmcgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJm1fZmxhZ3MpOworICAgIGFzc2VydChociA9PSAwTCk7CisKKyAgICArK3BvczsKKyAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgIAorICAgIG1fZnJhbWVPZmYgPSBwb3M7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIGZyYW1lX3NpemUgPSBzdG9wIC0gcG9zOworCisgICAgYXNzZXJ0KGZyYW1lX3NpemUgPD0gMjE0NzQ4MzY0N0wpOworICAgIAorICAgIG1fZnJhbWVTaXplID0gc3RhdGljX2Nhc3Q8bG9uZz4oZnJhbWVfc2l6ZSk7Cit9CisKKworbG9uZyBsb25nIEJsb2NrOjpHZXRUaW1lQ29kZShDbHVzdGVyKiBwQ2x1c3RlcikgY29uc3QKK3sKKyAgICBhc3NlcnQocENsdXN0ZXIpOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyB0YzAgPSBwQ2x1c3Rlci0+R2V0VGltZUNvZGUoKTsKKyAgICBhc3NlcnQodGMwID49IDApOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyB0YyA9IHRjMCArIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obV90aW1lY29kZSk7CisgICAgYXNzZXJ0KHRjID49IDApOworICAgIAorICAgIHJldHVybiB0YzsgIC8vdW5zY2FsZWQgdGltZWNvZGUgdW5pdHMKK30KKworCitsb25nIGxvbmcgQmxvY2s6OkdldFRpbWUoQ2x1c3RlciogcENsdXN0ZXIpIGNvbnN0Cit7CisgICAgYXNzZXJ0KHBDbHVzdGVyKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgdGMgPSBHZXRUaW1lQ29kZShwQ2x1c3Rlcik7CisgICAgCisgICAgY29uc3QgU2VnbWVudCogY29uc3QgcFNlZ21lbnQgPSBwQ2x1c3Rlci0+bV9wU2VnbWVudDsKKyAgICBjb25zdCBTZWdtZW50SW5mbyogY29uc3QgcEluZm8gPSBwU2VnbWVudC0+R2V0SW5mbygpOworICAgIGFzc2VydChwSW5mbyk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNjYWxlID0gcEluZm8tPkdldFRpbWVDb2RlU2NhbGUoKTsKKyAgICBhc3NlcnQoc2NhbGUgPj0gMSk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIG5zID0gdGMgKiBzY2FsZTsKKworICAgIHJldHVybiBuczsKK30KKworCit1bnNpZ25lZCBsb25nIEJsb2NrOjpHZXRUcmFja051bWJlcigpIGNvbnN0Cit7CisgICAgYXNzZXJ0KG1fdHJhY2sgPiAwKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV90cmFjayk7Cit9CisKKworYm9vbCBCbG9jazo6SXNLZXkoKSBjb25zdAoreworICAgIHJldHVybiAoKG1fZmxhZ3MgJiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigxIDw8IDcpKSAhPSAwKTsKK30KKworCit2b2lkIEJsb2NrOjpTZXRLZXkoYm9vbCBiS2V5KQoreworICAgIGlmIChiS2V5KQorICAgICAgICBtX2ZsYWdzIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDEgPDwgNyk7CisgICAgZWxzZQorICAgICAgICBtX2ZsYWdzICY9IDB4N0Y7Cit9CisKKworbG9uZyBCbG9jazo6R2V0U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWVTaXplOworfQorCisKK2xvbmcgQmxvY2s6OlJlYWQoSU1rdlJlYWRlciogcFJlYWRlciwgdW5zaWduZWQgY2hhciogYnVmKSBjb25zdAoreworCisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChidWYpOworICAgIAorICAgIGNvbnN0IGxvbmcgaHIgPSBwUmVhZGVyLT5SZWFkKG1fZnJhbWVPZmYsIG1fZnJhbWVTaXplLCBidWYpOworICAgIAorICAgIHJldHVybiBocjsKK30KKworCit9ICAvL2VuZCBuYW1lc3BhY2UgbWt2cGFyc2VyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9ta3ZwYXJzZXIuaHBwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvbWt2cGFyc2VyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMxMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvbWt2cGFyc2VyLmhwcApAQCAtMCwwICsxLDQyOCBAQAorI2lmbmRlZiBNS1ZQQVJTRVJfSFBQCisjZGVmaW5lIE1LVlBBUlNFUl9IUFAKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCituYW1lc3BhY2UgbWt2cGFyc2VyCit7CisKK2NvbnN0IGludCBFX0ZJTEVfRk9STUFUX0lOVkFMSUQgPSAtMjsKK2NvbnN0IGludCBFX0JVRkZFUl9OT1RfRlVMTCA9IC0zOworCitjbGFzcyBJTWt2UmVhZGVyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgUmVhZChsb25nIGxvbmcgcG9zaXRpb24sIGxvbmcgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpID0gMDsgCQorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfklNa3ZSZWFkZXIoKTsKK307CisKK2xvbmcgbG9uZyBHZXRVSW50TGVuZ3RoKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcsIGxvbmcmKTsKK2xvbmcgbG9uZyBSZWFkVUludChJTWt2UmVhZGVyKiwgbG9uZyBsb25nLCBsb25nJik7Citsb25nIGxvbmcgU3luY1JlYWRVSW50KElNa3ZSZWFkZXIqLCBsb25nIGxvbmcgcG9zLCBsb25nIGxvbmcgc3RvcCwgbG9uZyYpOworbG9uZyBsb25nIFVuc2VyaWFsaXplVUludChJTWt2UmVhZGVyKiwgbG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHNpemUpOworZmxvYXQgVW5zZXJpYWxpemU0RmxvYXQoSU1rdlJlYWRlciosIGxvbmcgbG9uZyk7Citkb3VibGUgVW5zZXJpYWxpemU4RG91YmxlKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcpOworc2hvcnQgVW5zZXJpYWxpemUyU0ludChJTWt2UmVhZGVyKiwgbG9uZyBsb25nKTsKK3NpZ25lZCBjaGFyIFVuc2VyaWFsaXplMVNJbnQoSU1rdlJlYWRlciosIGxvbmcgbG9uZyk7Citib29sIE1hdGNoKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcmLCB1bnNpZ25lZCBsb25nLCBsb25nIGxvbmcmKTsKK2Jvb2wgTWF0Y2goSU1rdlJlYWRlciosIGxvbmcgbG9uZyYsIHVuc2lnbmVkIGxvbmcsIGNoYXIqJik7Citib29sIE1hdGNoKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcmLCB1bnNpZ25lZCBsb25nLHVuc2lnbmVkIGNoYXIqJiwKKyAgICAgICAgICAgc2l6ZV90ICpvcHRpb25hbFNpemUgPSBOVUxMKTsKK2Jvb2wgTWF0Y2goSU1rdlJlYWRlciosIGxvbmcgbG9uZyYsIHVuc2lnbmVkIGxvbmcsIGRvdWJsZSYpOworYm9vbCBNYXRjaChJTWt2UmVhZGVyKiwgbG9uZyBsb25nJiwgdW5zaWduZWQgbG9uZywgc2hvcnQmKTsKKworCitzdHJ1Y3QgRUJNTEhlYWRlcgoreworICAgIEVCTUxIZWFkZXIoKTsKKyAgICB+RUJNTEhlYWRlcigpOyAgCisgICAgbG9uZyBsb25nIG1fdmVyc2lvbjsKKyAgICBsb25nIGxvbmcgbV9yZWFkVmVyc2lvbjsKKyAgICBsb25nIGxvbmcgbV9tYXhJZExlbmd0aDsKKyAgICBsb25nIGxvbmcgbV9tYXhTaXplTGVuZ3RoOworICAgIGNoYXIqIG1fZG9jVHlwZTsKKyAgICBsb25nIGxvbmcgbV9kb2NUeXBlVmVyc2lvbjsKKyAgICBsb25nIGxvbmcgbV9kb2NUeXBlUmVhZFZlcnNpb247CisgICAgCisgICAgbG9uZyBsb25nIFBhcnNlKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcmKTsKK307CisKKworY2xhc3MgU2VnbWVudDsKK2NsYXNzIFRyYWNrOworY2xhc3MgQ2x1c3RlcjsKKworY2xhc3MgQmxvY2sKK3sKKyAgICBCbG9jayhjb25zdCBCbG9jayYpOworICAgIEJsb2NrJiBvcGVyYXRvcj0oY29uc3QgQmxvY2smKTsKKworcHVibGljOgorICAgIGNvbnN0IGxvbmcgbG9uZyBtX3N0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3NpemU7CisgICAgCisgICAgQmxvY2sobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSwgSU1rdlJlYWRlciopOworICAgIAorICAgIHVuc2lnbmVkIGxvbmcgR2V0VHJhY2tOdW1iZXIoKSBjb25zdDsKKyAgICAKKyAgICBsb25nIGxvbmcgR2V0VGltZUNvZGUoQ2x1c3RlciopIGNvbnN0OyAgLy9hYnNvbHV0ZSwgYnV0IG5vdCBzY2FsZWQKKyAgICBsb25nIGxvbmcgR2V0VGltZShDbHVzdGVyKikgY29uc3Q7ICAgICAgLy9hYnNvbHV0ZSwgYW5kIHNjYWxlZCAobmFub3NlY29uZCB1bml0cykKKyAgICBib29sIElzS2V5KCkgY29uc3Q7CisgICAgdm9pZCBTZXRLZXkoYm9vbCk7CisKKyAgICBsb25nIEdldFNpemUoKSBjb25zdDsKKyAgICBsb25nIFJlYWQoSU1rdlJlYWRlciosIHVuc2lnbmVkIGNoYXIqKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgbG9uZyBsb25nIG1fdHJhY2s7ICAgLy9UcmFjazo6TnVtYmVyKCkKKyAgICBzaG9ydCBtX3RpbWVjb2RlOyAgLy9yZWxhdGl2ZSB0byBjbHVzdGVyCisgICAgdW5zaWduZWQgY2hhciBtX2ZsYWdzOworICAgIGxvbmcgbG9uZyBtX2ZyYW1lT2ZmOworICAgIGxvbmcgbV9mcmFtZVNpemU7ICAgIAorCit9OworCisKK2NsYXNzIEJsb2NrRW50cnkKK3sKKyAgICBCbG9ja0VudHJ5KGNvbnN0IEJsb2NrRW50cnkmKTsKKyAgICBCbG9ja0VudHJ5JiBvcGVyYXRvcj0oY29uc3QgQmxvY2tFbnRyeSYpOworICAgIAorcHVibGljOgorICAgIHZpcnR1YWwgfkJsb2NrRW50cnkoKTsKKyAgICB2aXJ0dWFsIGJvb2wgRU9TKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgQ2x1c3RlciogR2V0Q2x1c3RlcigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCBHZXRJbmRleCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IEJsb2NrKiBHZXRCbG9jaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgSXNCRnJhbWUoKSBjb25zdCA9IDA7CisgICAgCitwcm90ZWN0ZWQ6CisgICAgQmxvY2tFbnRyeSgpOworCit9OworCisKK2NsYXNzIFNpbXBsZUJsb2NrIDogcHVibGljIEJsb2NrRW50cnkKK3sKKyAgICBTaW1wbGVCbG9jayhjb25zdCBTaW1wbGVCbG9jayYpOworICAgIFNpbXBsZUJsb2NrJiBvcGVyYXRvcj0oY29uc3QgU2ltcGxlQmxvY2smKTsKKworcHVibGljOgorICAgIFNpbXBsZUJsb2NrKENsdXN0ZXIqLCBzaXplX3QsIGxvbmcgbG9uZyBzdGFydCwgbG9uZyBsb25nIHNpemUpOworCisgICAgYm9vbCBFT1MoKSBjb25zdDsKKyAgICBDbHVzdGVyKiBHZXRDbHVzdGVyKCkgY29uc3Q7IAorICAgIHNpemVfdCBHZXRJbmRleCgpIGNvbnN0OworICAgIGNvbnN0IEJsb2NrKiBHZXRCbG9jaygpIGNvbnN0OworICAgIGJvb2wgSXNCRnJhbWUoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIENsdXN0ZXIqIGNvbnN0IG1fcENsdXN0ZXI7CisgICAgY29uc3Qgc2l6ZV90IG1faW5kZXg7CisgICAgQmxvY2sgbV9ibG9jazsKKyAgICAKK307CisKKworY2xhc3MgQmxvY2tHcm91cCA6IHB1YmxpYyBCbG9ja0VudHJ5Cit7CisgICAgQmxvY2tHcm91cChjb25zdCBCbG9ja0dyb3VwJik7CisgICAgQmxvY2tHcm91cCYgb3BlcmF0b3I9KGNvbnN0IEJsb2NrR3JvdXAmKTsKKworcHVibGljOgorICAgIEJsb2NrR3JvdXAoQ2x1c3RlciosIHNpemVfdCwgbG9uZyBsb25nLCBsb25nIGxvbmcpOworICAgIH5CbG9ja0dyb3VwKCk7CisgICAgCisgICAgYm9vbCBFT1MoKSBjb25zdDsKKyAgICBDbHVzdGVyKiBHZXRDbHVzdGVyKCkgY29uc3Q7IAorICAgIHNpemVfdCBHZXRJbmRleCgpIGNvbnN0OworICAgIGNvbnN0IEJsb2NrKiBHZXRCbG9jaygpIGNvbnN0OworICAgIGJvb2wgSXNCRnJhbWUoKSBjb25zdDsKKyAgICAKKyAgICBzaG9ydCBHZXRQcmV2VGltZUNvZGUoKSBjb25zdDsgIC8vcmVsYXRpdmUgdG8gYmxvY2sncyB0aW1lCisgICAgc2hvcnQgR2V0TmV4dFRpbWVDb2RlKCkgY29uc3Q7ICAvL2FzIGFib3ZlCisgICAgCitwcm90ZWN0ZWQ6CisgICAgQ2x1c3RlciogY29uc3QgbV9wQ2x1c3RlcjsKKyAgICBjb25zdCBzaXplX3QgbV9pbmRleDsKKyAgICAKK3ByaXZhdGU6CisgICAgQmxvY2tHcm91cChDbHVzdGVyKiwgc2l6ZV90LCB1bnNpZ25lZCBsb25nKTsKKyAgICB2b2lkIFBhcnNlQmxvY2sobG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSk7CisKKyAgICBzaG9ydCBtX3ByZXZUaW1lQ29kZTsKKyAgICBzaG9ydCBtX25leHRUaW1lQ29kZTsKKyAgICAKKyAgICAvL1RPRE86IHRoZSBNYXRyb3NrYSBzcGVjIHNheXMgeW91IGNhbiBoYXZlIG11bHRpcGxlIGJsb2NrcyB3aXRoaW4gdGhlIAorICAgIC8vc2FtZSBibG9jayBncm91cCwgd2l0aCBibG9ja3MgcmFua2VkIGJ5IHByaW9yaXR5ICh0aGUgZmxhZyBiaXRzKS4KKyAgICAvL0ZvciBub3cgd2UganVzdCBjYWNoZSBhIHNpbmdsZSBibG9jay4KKyNpZiAwCisgICAgdHlwZWRlZiBzdGQ6OmRlcXVlPEJsb2NrKj4gYmxvY2tzX3Q7CisgICAgYmxvY2tzX3QgbV9ibG9ja3M7ICAvL0luIHByYWN0aWNlIHNob3VsZCBjb250YWluIG9ubHkgYSBzaW5nbGUgZWxlbWVudC4KKyNlbHNlCisgICAgQmxvY2sqIG1fcEJsb2NrOworI2VuZGlmCisgICAgCit9OworCisKK2NsYXNzIFRyYWNrCit7CisgICAgVHJhY2soY29uc3QgVHJhY2smKTsKKyAgICBUcmFjayYgb3BlcmF0b3I9KGNvbnN0IFRyYWNrJik7CisKK3B1YmxpYzogICAgCisgICAgU2VnbWVudCogY29uc3QgbV9wU2VnbWVudDsKKyAgICB2aXJ0dWFsIH5UcmFjaygpOworICAgIAorICAgIGxvbmcgbG9uZyBHZXRUeXBlKCkgY29uc3Q7IAorICAgIHVuc2lnbmVkIGxvbmcgR2V0TnVtYmVyKCkgY29uc3Q7CisgICAgY29uc3QgY2hhciogR2V0TmFtZUFzVVRGOCgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIEdldENvZGVjTmFtZUFzVVRGOCgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIEdldENvZGVjSWQoKSBjb25zdDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBHZXRDb2RlY1ByaXZhdGUoCisgICAgICAgICAgICBzaXplX3QgKm9wdGlvbmFsU2l6ZSA9IE5VTEwpIGNvbnN0OworICAgIAorICAgIGNvbnN0IEJsb2NrRW50cnkqIEdldEVPUygpIGNvbnN0OworICAgIAorICAgIHN0cnVjdCBTZXR0aW5ncyAKKyAgICB7CisgICAgICAgIGxvbmcgbG9uZyBzdGFydDsKKyAgICAgICAgbG9uZyBsb25nIHNpemU7CisgICAgfTsKKyAgICAKKyAgICBzdHJ1Y3QgSW5mbworICAgIHsKKyAgICAgICAgbG9uZyBsb25nIHR5cGU7CisgICAgICAgIGxvbmcgbG9uZyBudW1iZXI7CisgICAgICAgIGxvbmcgbG9uZyB1aWQ7CisgICAgICAgIGNoYXIqIG5hbWVBc1VURjg7CisgICAgICAgIGNoYXIqIGNvZGVjSWQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIGNvZGVjUHJpdmF0ZTsKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemU7CisgICAgICAgIGNoYXIqIGNvZGVjTmFtZUFzVVRGODsKKyAgICAgICAgU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIEluZm8oKTsKKyAgICAgICAgdm9pZCBDbGVhcigpOworICAgIH07CisgICAgCisgICAgbG9uZyBHZXRGaXJzdChjb25zdCBCbG9ja0VudHJ5KiYpIGNvbnN0OworICAgIGxvbmcgR2V0TmV4dChjb25zdCBCbG9ja0VudHJ5KiBwQ3VyciwgY29uc3QgQmxvY2tFbnRyeSomIHBOZXh0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgVmV0RW50cnkoY29uc3QgQmxvY2tFbnRyeSopIGNvbnN0ID0gMDsKKyAgICAgICAgCitwcm90ZWN0ZWQ6CisgICAgVHJhY2soU2VnbWVudCosIGNvbnN0IEluZm8mKTsgICAgICAgIAorICAgIGNvbnN0IEluZm8gbV9pbmZvOworCisgICAgY2xhc3MgRU9TQmxvY2sgOiBwdWJsaWMgQmxvY2tFbnRyeQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVPU0Jsb2NrKCk7CisKKyAgICAgICAgYm9vbCBFT1MoKSBjb25zdDsgICAgCisgICAgICAgIENsdXN0ZXIqIEdldENsdXN0ZXIoKSBjb25zdDsKKyAgICAgICAgc2l6ZV90IEdldEluZGV4KCkgY29uc3Q7CisgICAgICAgIGNvbnN0IEJsb2NrKiBHZXRCbG9jaygpIGNvbnN0OworICAgICAgICBib29sIElzQkZyYW1lKCkgY29uc3Q7CisgICAgfTsKKyAgICAKKyAgICBFT1NCbG9jayBtX2VvczsKKyAgICAKK307CisKKworY2xhc3MgVmlkZW9UcmFjayA6IHB1YmxpYyBUcmFjaworeworICAgIFZpZGVvVHJhY2soY29uc3QgVmlkZW9UcmFjayYpOworICAgIFZpZGVvVHJhY2smIG9wZXJhdG9yPShjb25zdCBWaWRlb1RyYWNrJik7CisgICAgCitwdWJsaWM6CisgICAgVmlkZW9UcmFjayhTZWdtZW50KiwgY29uc3QgSW5mbyYpOyAgICAKKyAgICBsb25nIGxvbmcgR2V0V2lkdGgoKSBjb25zdDsKKyAgICBsb25nIGxvbmcgR2V0SGVpZ2h0KCkgY29uc3Q7CisgICAgZG91YmxlIEdldEZyYW1lUmF0ZSgpIGNvbnN0OworICAgIAorICAgIGJvb2wgVmV0RW50cnkoY29uc3QgQmxvY2tFbnRyeSopIGNvbnN0OworCitwcml2YXRlOgorICAgIGxvbmcgbG9uZyBtX3dpZHRoOworICAgIGxvbmcgbG9uZyBtX2hlaWdodDsKKyAgICBkb3VibGUgbV9yYXRlOworICAgIAorfTsKKworCitjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIFRyYWNrCit7CisgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJik7CisgICAgQXVkaW9UcmFjayYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvVHJhY2smKTsKKworcHVibGljOgorICAgIEF1ZGlvVHJhY2soU2VnbWVudCosIGNvbnN0IEluZm8mKTsgICAgCisgICAgZG91YmxlIEdldFNhbXBsaW5nUmF0ZSgpIGNvbnN0OworICAgIGxvbmcgbG9uZyBHZXRDaGFubmVscygpIGNvbnN0OworICAgIGxvbmcgbG9uZyBHZXRCaXREZXB0aCgpIGNvbnN0OyAgICAKKyAgICBib29sIFZldEVudHJ5KGNvbnN0IEJsb2NrRW50cnkqKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBkb3VibGUgbV9yYXRlOworICAgIGxvbmcgbG9uZyBtX2NoYW5uZWxzOworICAgIGxvbmcgbG9uZyBtX2JpdERlcHRoOworfTsKKworCitjbGFzcyBUcmFja3MKK3sKKyAgICBUcmFja3MoY29uc3QgVHJhY2tzJik7CisgICAgVHJhY2tzJiBvcGVyYXRvcj0oY29uc3QgVHJhY2tzJik7CisKK3B1YmxpYzoKKyAgICBTZWdtZW50KiBjb25zdCBtX3BTZWdtZW50OworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3N0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3NpemU7CisgICAgCisgICAgVHJhY2tzKFNlZ21lbnQqLCBsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplKTsKKyAgICB2aXJ0dWFsIH5UcmFja3MoKTsKKworICAgIFRyYWNrKiBHZXRUcmFja0J5TnVtYmVyKHVuc2lnbmVkIGxvbmcgdG4pIGNvbnN0OworICAgIFRyYWNrKiBHZXRUcmFja0J5SW5kZXgodW5zaWduZWQgbG9uZyBpZHgpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBUcmFjayoqIG1fdHJhY2tFbnRyaWVzOyAKKyAgICBUcmFjayoqIG1fdHJhY2tFbnRyaWVzRW5kOworCisgICAgdm9pZCBQYXJzZVRyYWNrRW50cnkobG9uZyBsb25nLCBsb25nIGxvbmcsIFRyYWNrKiYpOworICAgIAorcHVibGljOgorICAgIHVuc2lnbmVkIGxvbmcgR2V0VHJhY2tzQ291bnQoKSBjb25zdDsKK307CisKKworY2xhc3MgU2VnbWVudEluZm8KK3sKKyAgICBTZWdtZW50SW5mbyhjb25zdCBTZWdtZW50SW5mbyYpOworICAgIFNlZ21lbnRJbmZvJiBvcGVyYXRvcj0oY29uc3QgU2VnbWVudEluZm8mKTsKKyAgICAKK3B1YmxpYzoKKyAgICBTZWdtZW50KiBjb25zdCBtX3BTZWdtZW50OworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3N0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3NpemU7CisgICAgCisgICAgU2VnbWVudEluZm8oU2VnbWVudCosIGxvbmcgbG9uZyBzdGFydCwgbG9uZyBsb25nIHNpemUpOworICAgIH5TZWdtZW50SW5mbygpOworICAgIGxvbmcgbG9uZyBHZXRUaW1lQ29kZVNjYWxlKCkgY29uc3Q7CisgICAgbG9uZyBsb25nIEdldER1cmF0aW9uKCkgY29uc3Q7ICAvL3NjYWxlZAorICAgIGNvbnN0IGNoYXIqIEdldE11eGluZ0FwcEFzVVRGOCgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIEdldFdyaXRpbmdBcHBBc1VURjgoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyKiBHZXRUaXRsZUFzVVRGOCgpIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBsb25nIGxvbmcgbV90aW1lY29kZVNjYWxlOworICAgIGRvdWJsZSBtX2R1cmF0aW9uOworICAgIGNoYXIqIG1fcE11eGluZ0FwcEFzVVRGODsKKyAgICBjaGFyKiBtX3BXcml0aW5nQXBwQXNVVEY4OworICAgIGNoYXIqIG1fcFRpdGxlQXNVVEY4OworfTsKKworCitjbGFzcyBDbHVzdGVyCit7CisgICAgQ2x1c3Rlcihjb25zdCBDbHVzdGVyJik7CisgICAgQ2x1c3RlciYgb3BlcmF0b3I9KGNvbnN0IENsdXN0ZXImKTsKKworcHVibGljOgorICAgIFNlZ21lbnQqIGNvbnN0IG1fcFNlZ21lbnQ7CisgICAgY29uc3Qgc2l6ZV90IG1faW5kZXg7CisgICAgCitwdWJsaWM6ICAgIAorICAgIHN0YXRpYyBDbHVzdGVyKiBQYXJzZShTZWdtZW50Kiwgc2l6ZV90LCBsb25nIGxvbmcgb2ZmKTsKKworICAgIENsdXN0ZXIoKTsgIC8vRW5kT2ZTdHJlYW0KKyAgICB+Q2x1c3RlcigpOworICAgIAorICAgIGJvb2wgRU9TKCkgY29uc3Q7CisgICAgCisgICAgbG9uZyBsb25nIEdldFRpbWVDb2RlKCk7ICAvL2Fic29sdXRlLCBidXQgbm90IHNjYWxlZAorICAgIGxvbmcgbG9uZyBHZXRUaW1lKCk7ICAgICAgLy9hYnNvbHV0ZSwgYW5kIHNjYWxlZCAobmFub3NlY29uZCB1bml0cykKKworICAgIGNvbnN0IEJsb2NrRW50cnkqIEdldEZpcnN0KCk7CisgICAgY29uc3QgQmxvY2tFbnRyeSogR2V0TGFzdCgpOworICAgIGNvbnN0IEJsb2NrRW50cnkqIEdldE5leHQoY29uc3QgQmxvY2tFbnRyeSopIGNvbnN0OyAgICAKKyAgICBjb25zdCBCbG9ja0VudHJ5KiBHZXRFbnRyeShjb25zdCBUcmFjayopOworcHJvdGVjdGVkOiAgICAKKyAgICBDbHVzdGVyKFNlZ21lbnQqLCBzaXplX3QsIGxvbmcgbG9uZyBvZmYpOworICAgIAorcHJpdmF0ZToKKyAgICBsb25nIGxvbmcgbV9zdGFydDsKKyAgICBsb25nIGxvbmcgbV9zaXplOyAgICAKKyAgICBsb25nIGxvbmcgbV90aW1lY29kZTsKKyAgICBCbG9ja0VudHJ5KiogbV9wRW50cmllczsKKyAgICBzaXplX3QgbV9lbnRyaWVzQ291bnQ7CisgICAKKyAgICB2b2lkIExvYWQoKTsKKyAgICB2b2lkIExvYWRCbG9ja0VudHJpZXMoKTsKKyAgICB2b2lkIFBhcnNlQmxvY2tHcm91cChsb25nIGxvbmcsIGxvbmcgbG9uZywgc2l6ZV90KTsKKyAgICB2b2lkIFBhcnNlU2ltcGxlQmxvY2sobG9uZyBsb25nLCBsb25nIGxvbmcsIHNpemVfdCk7CisgICAgCit9OworCisKK2NsYXNzIFNlZ21lbnQKK3sKKyAgICBTZWdtZW50KGNvbnN0IFNlZ21lbnQmKTsKKyAgICBTZWdtZW50JiBvcGVyYXRvcj0oY29uc3QgU2VnbWVudCYpOworCitwcml2YXRlOgorICAgIFNlZ21lbnQoSU1rdlJlYWRlciosIGxvbmcgbG9uZyBwb3MsIGxvbmcgbG9uZyBzaXplKTsKKworcHVibGljOgorICAgIElNa3ZSZWFkZXIqIGNvbnN0IG1fcFJlYWRlcjsKKyAgICBjb25zdCBsb25nIGxvbmcgbV9zdGFydDsgIC8vcG9zbiBvZiBzZWdtZW50IHBheWxvYWQKKyAgICBjb25zdCBsb25nIGxvbmcgbV9zaXplOyAgIC8vc2l6ZSBvZiBzZWdtZW50IHBheWxvYWQKKyAgICBDbHVzdGVyIG1fZW9zOyAgLy9UT0RPOiBtYWtlIHByaXZhdGU/CisgICAgCisgICAgc3RhdGljIGxvbmcgbG9uZyBDcmVhdGVJbnN0YW5jZShJTWt2UmVhZGVyKiwgbG9uZyBsb25nLCBTZWdtZW50KiYpOworICAgIH5TZWdtZW50KCk7CisKKyAgICAvL2ZvciBiaWctYmFuZyBsb2FkaW5nIChzb3VyY2UgZmlsdGVyKQorICAgIGxvbmcgTG9hZCgpOworCisgICAgLy9mb3IgaW5jcmVtZW50YWwgbG9hZGluZyAoc3BsaXR0ZXIpICAgIAorICAgIGxvbmcgbG9uZyBVbnBhcnNlZCgpIGNvbnN0OworICAgIGxvbmcgbG9uZyBQYXJzZUhlYWRlcnMoKTsKKyAgICBsb25nIFBhcnNlQ2x1c3RlcihDbHVzdGVyKiYsIGxvbmcgbG9uZyYgbmV3cG9zKSBjb25zdDsKKyAgICBib29sIEFkZENsdXN0ZXIoQ2x1c3RlciosIGxvbmcgbG9uZyk7CisKKyAgICBUcmFja3MqIEdldFRyYWNrcygpIGNvbnN0OyAgICAKKyAgICBjb25zdCBTZWdtZW50SW5mbyogY29uc3QgR2V0SW5mbygpIGNvbnN0OworICAgIGxvbmcgbG9uZyBHZXREdXJhdGlvbigpIGNvbnN0OworICAgIAorICAgIC8vTk9URTogdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBpbmVmZmljaWVudC4KKyAgICAvL2xvbmcgbG9uZyBMb2FkKGxvbmcgbG9uZyB0aW1lX25hbm9zZWNvbmRzKTsKKworICAgIENsdXN0ZXIqIEdldEZpcnN0KCk7CisgICAgQ2x1c3RlciogR2V0TGFzdCgpOworICAgIHVuc2lnbmVkIGxvbmcgR2V0Q291bnQoKSBjb25zdDsKKyAgICAKKyAgICBDbHVzdGVyKiBHZXROZXh0KGNvbnN0IENsdXN0ZXIqKTsKKyAgICBDbHVzdGVyKiBHZXRDbHVzdGVyKGxvbmcgbG9uZyB0aW1lX25hbm9zZWNvbmRzKTsKKyAgICAKK3ByaXZhdGU6CisgICAgbG9uZyBsb25nIG1fcG9zOyAgLy9hYnNvbHV0ZSBmaWxlIHBvc247IHdoYXQgaGFzIGJlZW4gY29uc3VtZWQgc28gZmFyICAgIAorICAgIFNlZ21lbnRJbmZvKiBtX3BJbmZvOworICAgIFRyYWNrcyogbV9wVHJhY2tzOyAgICAKKyAgICBDbHVzdGVyKiogbV9jbHVzdGVyczsKKyAgICBzaXplX3QgbV9jbHVzdGVyQ291bnQ7CisKKyAgICB2b2lkIFBhcnNlU2Vla0hlYWQobG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHNpemUsIHNpemVfdCopOworICAgIHZvaWQgUGFyc2VTZWVrRW50cnkobG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHNpemUsIHNpemVfdCopOworICAgIHZvaWQgUGFyc2VTZWNvbmRhcnlTZWVrSGVhZChsb25nIGxvbmcgb2ZmLCBzaXplX3QqKTsKK307CisKKworfSAgLy9lbmQgbmFtZXNwYWNlIG1rdnBhcnNlcgorCisjZW5kaWYgIC8vTUtWUEFSU0VSX0hQUApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGM2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFUU1BhcnNlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIkVTUXVldWUuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gSSB3YW50IHRoZSBleHByZXNzaW9uICJ5IiBldmFsdWF0ZWQgZXZlbiBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgb2ZmLgorI2RlZmluZSBNWV9MT0dWKHgsIHkpIFwKKyAgICBkbyB7IHVuc2lnbmVkIHRtcCA9IHk7IExPR1YoeCwgdG1wKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4OworCitzdHJ1Y3QgQVRTUGFyc2VyOjpQcm9ncmFtIDogcHVibGljIFJlZkJhc2UgeworICAgIFByb2dyYW0odW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CisKKyAgICBib29sIHBhcnNlUElEKAorICAgICAgICAgICAgdW5zaWduZWQgcGlkLCB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAorICAgICAgICAgICAgQUJpdFJlYWRlciAqYnIpOworCisgICAgdm9pZCBzaWduYWxEaXNjb250aW51aXR5KGJvb2wgaXNBU2Vlayk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CisKKyAgICBpbnQ2NF90IGNvbnZlcnRQVFNUb1RpbWVzdGFtcCh1aW50NjRfdCBQVFMpOworCitwcml2YXRlOgorICAgIHVuc2lnbmVkIG1Qcm9ncmFtTWFwUElEOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxTdHJlYW0+ID4gbVN0cmVhbXM7CisgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKKyAgICB1aW50NjRfdCBtRmlyc3RQVFM7CisKKyAgICB2b2lkIHBhcnNlUHJvZ3JhbU1hcChBQml0UmVhZGVyICpicik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcm9ncmFtKTsKK307CisKK3N0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSk7CisKKyAgICB2b2lkIHBhcnNlKAorICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyKTsKKworICAgIHZvaWQgc2lnbmFsRGlzY29udGludWl0eShib29sIGlzQVNlZWspOworCisgICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U3RyZWFtKCk7CisKK3ByaXZhdGU6CisgICAgUHJvZ3JhbSAqbVByb2dyYW07CisgICAgdW5zaWduZWQgbUVsZW1lbnRhcnlQSUQ7CisgICAgdW5zaWduZWQgbVN0cmVhbVR5cGU7CisKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtUGF5bG9hZFN0YXJ0ZWQ7CisKKyAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgbVF1ZXVlOworCisgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpOworCisgICAgdm9pZCBvblBheWxvYWREYXRhKAorICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGV4dHJhY3RBQUNGcmFtZXMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVRTUGFyc2VyOjpQcm9ncmFtOjpQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCisgICAgOiBtUHJvZ3JhbU1hcFBJRChwcm9ncmFtTWFwUElEKSwKKyAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1GaXJzdFBUUygwKSB7Cit9CisKK2Jvb2wgQVRTUGFyc2VyOjpQcm9ncmFtOjpwYXJzZVBJRCgKKyAgICAgICAgdW5zaWduZWQgcGlkLCB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAorICAgICAgICBBQml0UmVhZGVyICpicikgeworICAgIGlmIChwaWQgPT0gbVByb2dyYW1NYXBQSUQpIHsKKyAgICAgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNraXAgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIGJyLT5za2lwQml0cyhza2lwICogOCk7CisgICAgICAgIH0KKworICAgICAgICBwYXJzZVByb2dyYW1NYXAoYnIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbXMuaW5kZXhPZktleShwaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+cGFyc2UoCisgICAgICAgICAgICBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBicik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBVFNQYXJzZXI6OlByb2dyYW06OnNpZ25hbERpc2NvbnRpbnVpdHkoYm9vbCBpc0FTZWVrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBtU3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+c2lnbmFsRGlzY29udGludWl0eShpc0FTZWVrKTsKKyAgICB9Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpQcm9ncmFtOjpwYXJzZVByb2dyYW1NYXAoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCB0YWJsZV9pZCA9IGJyLT5nZXRCaXRzKDgpOworICAgIExPR1YoIiAgdGFibGVfaWQgPSAldSIsIHRhYmxlX2lkKTsKKyAgICBDSEVDS19FUSh0YWJsZV9pZCwgMHgwMnUpOworCisgICAgdW5zaWduZWQgc2VjdGlvbl9zeW50YXhfaW5kaWNhdG9yID0gYnItPmdldEJpdHMoMSk7CisgICAgTE9HVigiICBzZWN0aW9uX3N5bnRheF9pbmRpY2F0b3IgPSAldSIsIHNlY3Rpb25fc3ludGF4X2luZGljYXRvcik7CisgICAgQ0hFQ0tfRVEoc2VjdGlvbl9zeW50YXhfaW5kaWNhdG9yLCAxdSk7CisKKyAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMHUpOworICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKKworICAgIHVuc2lnbmVkIHNlY3Rpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOworICAgIExPR1YoIiAgc2VjdGlvbl9sZW5ndGggPSAldSIsIHNlY3Rpb25fbGVuZ3RoKTsKKyAgICBDSEVDSygoc2VjdGlvbl9sZW5ndGggJiAweGMwMCkgPT0gMCk7CisgICAgQ0hFQ0tfTEUoc2VjdGlvbl9sZW5ndGgsIDEwMjF1KTsKKworICAgIE1ZX0xPR1YoIiAgcHJvZ3JhbV9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDE2KSk7CisgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOworICAgIE1ZX0xPR1YoIiAgdmVyc2lvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDUpKTsKKyAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKKyAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CisgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CisgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMykpOworICAgIE1ZX0xPR1YoIiAgUENSX1BJRCA9IDB4JTA0eCIsIGJyLT5nZXRCaXRzKDEzKSk7CisgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOworCisgICAgdW5zaWduZWQgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKKyAgICBMT0dWKCIgIHByb2dyYW1faW5mb19sZW5ndGggPSAldSIsIHByb2dyYW1faW5mb19sZW5ndGgpOworICAgIENIRUNLKChwcm9ncmFtX2luZm9fbGVuZ3RoICYgMHhjMDApID09IDApOworCisgICAgYnItPnNraXBCaXRzKHByb2dyYW1faW5mb19sZW5ndGggKiA4KTsgIC8vIHNraXAgZGVzY3JpcHRvcnMKKworICAgIC8vIGluZm9CeXRlc1JlbWFpbmluZyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAvLyB2YXJpYWJsZSBsZW5ndGggc2VjdGlvbiBvZiBFU19pbmZvcy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAgICAvLyBmaW5hbCBDUkMuCisgICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OworCisgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nLCA1dSk7CisKKyAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBzdHJlYW1UeXBlKTsKKworICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDMpKTsKKworICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElEID0gYnItPmdldEJpdHMoMTMpOworICAgICAgICBMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBlbGVtZW50YXJ5UElEKTsKKworICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDQpKTsKKworICAgICAgICB1bnNpZ25lZCBFU19pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKKyAgICAgICAgTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIENIRUNLKChFU19pbmZvX2xlbmd0aCAmIDB4YzAwKSA9PSAwKTsKKworICAgICAgICBDSEVDS19HRShpbmZvQnl0ZXNSZW1haW5pbmcgLSA1LCBFU19pbmZvX2xlbmd0aCk7CisKKyNpZiAwCisgICAgICAgIGJyLT5za2lwQml0cyhFU19pbmZvX2xlbmd0aCAqIDgpOyAgLy8gc2tpcCBkZXNjcmlwdG9ycworI2Vsc2UKKyAgICAgICAgdW5zaWduZWQgaW5mb19ieXRlc19yZW1haW5pbmcgPSBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgd2hpbGUgKGluZm9fYnl0ZXNfcmVtYWluaW5nID49IDIpIHsKKyAgICAgICAgICAgIE1ZX0xPR1YoIiAgICAgIHRhZyA9IDB4JTAyeCIsIGJyLT5nZXRCaXRzKDgpKTsKKworICAgICAgICAgICAgdW5zaWduZWQgZGVzY0xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgTE9HVigiICAgICAgbGVuID0gJXUiLCBkZXNjTGVuZ3RoKTsKKworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5mb19ieXRlc19yZW1haW5pbmcsIDIgKyBkZXNjTGVuZ3RoKTsKKworICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NMZW5ndGggKiA4KTsKKworICAgICAgICAgICAgaW5mb19ieXRlc19yZW1haW5pbmcgLT0gZGVzY0xlbmd0aCArIDI7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoaW5mb19ieXRlc19yZW1haW5pbmcsIDB1KTsKKyNlbmRpZgorCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGVsZW1lbnRhcnlQSUQpOworI2lmIDAgIC8vIFhYWCByZXZpc2l0CisgICAgICAgIENIRUNLX0xUKGluZGV4LCAwKTsKKyAgICAgICAgbVN0cmVhbXMuYWRkKGVsZW1lbnRhcnlQSUQsCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtKHRoaXMsIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUpKTsKKyNlbHNlCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmFkZChlbGVtZW50YXJ5UElELAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW0odGhpcywgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOworICAgIH0KKworICAgIENIRUNLX0VRKGluZm9CeXRlc1JlbWFpbmluZywgMHUpOworCisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworfQorCitzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVN0cmVhbXMuZWRpdFZhbHVlQXQoaSktPmdldFNvdXJjZSh0eXBlKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludDY0X3QgQVRTUGFyc2VyOjpQcm9ncmFtOjpjb252ZXJ0UFRTVG9UaW1lc3RhbXAodWludDY0X3QgUFRTKSB7CisgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CisgICAgICAgIG1GaXJzdFBUUyA9IFBUUzsKKyAgICAgICAgUFRTID0gMDsKKyAgICB9IGVsc2UgaWYgKFBUUyA8IG1GaXJzdFBUUykgeworICAgICAgICBQVFMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFBUUyAtPSBtRmlyc3RQVFM7CisgICAgfQorCisgICAgcmV0dXJuIChQVFMgKiAxMDApIC8gOTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVRTUGFyc2VyOjpTdHJlYW06OlN0cmVhbSgKKyAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSkKKyAgICA6IG1Qcm9ncmFtKHByb2dyYW0pLAorICAgICAgbUVsZW1lbnRhcnlQSUQoZWxlbWVudGFyeVBJRCksCisgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKKyAgICAgIG1CdWZmZXIobmV3IEFCdWZmZXIoMTI4ICogMTAyNCkpLAorICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKKyAgICAgIG1RdWV1ZShzdHJlYW1UeXBlID09IDB4MWIKKyAgICAgICAgICAgICAgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkgyNjQgOiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFBQykgeworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworfQorCitBVFNQYXJzZXI6OlN0cmVhbTo6flN0cmVhbSgpIHsKK30KKwordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsIEFCaXRSZWFkZXIgKmJyKSB7CisgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgaWYgKG1QYXlsb2FkU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHJ1biB0aGUgZGFuZ2VyIG9mIHJlY2VpdmluZyB0aGUgdHJhaWxpbmcgYnl0ZXMKKyAgICAgICAgICAgIC8vIG9mIGEgUEVTIHBhY2tldCB0aGF0IHdlIG5ldmVyIHNhdyB0aGUgc3RhcnQgb2YgYW5kIGFzc3VtaW5nCisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgYSBjb21wbGV0ZSBQRVMgcGFja2V0LgorCisgICAgICAgICAgICBmbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgbVBheWxvYWRTdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIW1QYXlsb2FkU3RhcnRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOworICAgIENIRUNLKChwYXlsb2FkU2l6ZUJpdHMgJSA4KSA9PSAwKTsKKworICAgIENIRUNLX0xFKG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDgsIG1CdWZmZXItPmNhcGFjaXR5KCkpOworCisgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OnNpZ25hbERpc2NvbnRpbnVpdHkoYm9vbCBpc0FTZWVrKSB7CisgICAgTE9HVigiU3RyZWFtIGRpc2NvbnRpbnVpdHkiKTsKKyAgICBtUGF5bG9hZFN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIG1RdWV1ZS5jbGVhcigpOworCisgICAgaWYgKGlzQVNlZWspIHsKKyAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGEgIm1pbm9yIiBkaXNjb250aW51aXR5LCB3ZSBzdGF5IHdpdGhpbiB0aGUgc2FtZQorICAgICAgICAvLyBiaXRzdHJlYW0uCisKKyAgICAgICAgbVNvdXJjZS0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU3RyZWFtVHlwZSA9PSAweDFiICYmIG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBEb24ndCBzaWduYWwgZGlzY29udGludWl0aWVzIG9uIGF1ZGlvIHN0cmVhbXMuCisgICAgICAgIG1Tb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSgpOworICAgIH0KK30KKwordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IGJyLT5nZXRCaXRzKDI0KTsKKworICAgIExPR1YoInBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gMHglMDh4IiwgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgpOworCisgICAgQ0hFQ0tfRVEocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgsIDB4MDAwMDAxdSk7CisKKyAgICB1bnNpZ25lZCBzdHJlYW1faWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICBMT0dWKCJzdHJlYW1faWQgPSAweCUwMngiLCBzdHJlYW1faWQpOworCisgICAgdW5zaWduZWQgUEVTX3BhY2tldF9sZW5ndGggPSBici0+Z2V0Qml0cygxNik7CisgICAgTE9HVigiUEVTX3BhY2tldF9sZW5ndGggPSAldSIsIFBFU19wYWNrZXRfbGVuZ3RoKTsKKworICAgIGlmIChzdHJlYW1faWQgIT0gMHhiYyAgLy8gcHJvZ3JhbV9zdHJlYW1fbWFwCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhiZSAgLy8gcGFkZGluZ19zdHJlYW0KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGJmICAvLyBwcml2YXRlX3N0cmVhbV8yCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMCAgLy8gRUNNCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMSAgLy8gRU1NCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmZiAgLy8gcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5CisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMiAgLy8gRFNNQ0MKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGY4KSB7ICAvLyBILjIyMi4xIHR5cGUgRQorICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygyKSwgMnUpOworCisgICAgICAgIE1ZX0xPR1YoIlBFU19zY3JhbWJsaW5nX2NvbnRyb2wgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKKyAgICAgICAgTVlfTE9HVigiUEVTX3ByaW9yaXR5ID0gJXUiLCBici0+Z2V0Qml0cygxKSk7CisgICAgICAgIE1ZX0xPR1YoImRhdGFfYWxpZ25tZW50X2luZGljYXRvciA9ICV1IiwgYnItPmdldEJpdHMoMSkpOworICAgICAgICBNWV9MT0dWKCJjb3B5cmlnaHQgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKKyAgICAgICAgTVlfTE9HVigib3JpZ2luYWxfb3JfY29weSA9ICV1IiwgYnItPmdldEJpdHMoMSkpOworCisgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MgPSBici0+Z2V0Qml0cygyKTsKKyAgICAgICAgTE9HVigiUFRTX0RUU19mbGFncyA9ICV1IiwgUFRTX0RUU19mbGFncyk7CisKKyAgICAgICAgdW5zaWduZWQgRVNDUl9mbGFnID0gYnItPmdldEJpdHMoMSk7CisgICAgICAgIExPR1YoIkVTQ1JfZmxhZyA9ICV1IiwgRVNDUl9mbGFnKTsKKworICAgICAgICB1bnNpZ25lZCBFU19yYXRlX2ZsYWcgPSBici0+Z2V0Qml0cygxKTsKKyAgICAgICAgTE9HVigiRVNfcmF0ZV9mbGFnID0gJXUiLCBFU19yYXRlX2ZsYWcpOworCisgICAgICAgIHVuc2lnbmVkIERTTV90cmlja19tb2RlX2ZsYWcgPSBici0+Z2V0Qml0cygxKTsKKyAgICAgICAgTE9HVigiRFNNX3RyaWNrX21vZGVfZmxhZyA9ICV1IiwgRFNNX3RyaWNrX21vZGVfZmxhZyk7CisKKyAgICAgICAgdW5zaWduZWQgYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyA9IGJyLT5nZXRCaXRzKDEpOworICAgICAgICBMT0dWKCJhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gJXUiLCBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnKTsKKworICAgICAgICBNWV9MT0dWKCJQRVNfQ1JDX2ZsYWcgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKKyAgICAgICAgTVlfTE9HVigiUEVTX2V4dGVuc2lvbl9mbGFnID0gJXUiLCBici0+Z2V0Qml0cygxKSk7CisKKyAgICAgICAgdW5zaWduZWQgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBMT0dWKCJQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gJXUiLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoKTsKKworICAgICAgICB1bnNpZ25lZCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOworCisgICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7CisKKyAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKKyAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworCisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cyg0KSwgUFRTX0RUU19mbGFncyk7CisKKyAgICAgICAgICAgIFBUUyA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIFBUUyB8PSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDE1KSkgPDwgMTU7CisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgUFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisKKyAgICAgICAgICAgIExPR1YoIlBUUyA9ICVsbHUiLCBQVFMpOworICAgICAgICAgICAgLy8gTE9HSSgiUFRTID0gJS4yZiBzZWNzIiwgUFRTIC8gOTAwMDAuMGYpOworCisgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKKworICAgICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMykgeworICAgICAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNXUpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoNCksIDF1KTsKKworICAgICAgICAgICAgICAgIERUUyA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOworICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgRFRTIHw9ICgodWludDY0X3QpYnItPmdldEJpdHMoMTUpKSA8PCAxNTsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIERUUyB8PSBici0+Z2V0Qml0cygxNSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKworICAgICAgICAgICAgICAgIExPR1YoIkRUUyA9ICVsbHUiLCBEVFMpOworCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRVNDUl9mbGFnKSB7CisgICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDZ1KTsKKworICAgICAgICAgICAgYnItPmdldEJpdHMoMik7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IEVTQ1IgPSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDMpKSA8PCAzMDsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBFU0NSIHw9ICgodWludDY0X3QpYnItPmdldEJpdHMoMTUpKSA8PCAxNTsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBFU0NSIHw9IGJyLT5nZXRCaXRzKDE1KTsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisKKyAgICAgICAgICAgIExPR1YoIkVTQ1IgPSAlbGx1IiwgRVNDUik7CisgICAgICAgICAgICBNWV9MT0dWKCJFU0NSX2V4dGVuc2lvbiA9ICV1IiwgYnItPmdldEJpdHMoOSkpOworCisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworCisgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFU19yYXRlX2ZsYWcpIHsKKyAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgM3UpOworCisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgTVlfTE9HVigiRVNfcmF0ZSA9ICV1IiwgYnItPmdldEJpdHMoMjIpKTsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisKKyAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSAzOworICAgICAgICB9CisKKyAgICAgICAgYnItPnNraXBCaXRzKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAqIDgpOworCisgICAgICAgIC8vIEVTIGRhdGEgZm9sbG93cy4KKworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfR0UoUEVTX3BhY2tldF9sZW5ndGgsIFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKTsKKworICAgICAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9CisgICAgICAgICAgICAgICAgUEVTX3BhY2tldF9sZW5ndGggLSAzIC0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKKworICAgICAgICAgICAgQ0hFQ0tfR0UoYnItPm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKKworICAgICAgICAgICAgb25QYXlsb2FkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsIGJyLT5kYXRhKCksIGRhdGFMZW5ndGgpOworCisgICAgICAgICAgICBici0+c2tpcEJpdHMoZGF0YUxlbmd0aCAqIDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb25QYXlsb2FkRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsCisgICAgICAgICAgICAgICAgICAgIGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7CisKKyAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkU2l6ZUJpdHMgPSBici0+bnVtQml0c0xlZnQoKTsKKyAgICAgICAgICAgIENIRUNLKChwYXlsb2FkU2l6ZUJpdHMgJSA4KSA9PSAwKTsKKworICAgICAgICAgICAgTE9HVigiVGhlcmUncyAlZCBieXRlcyBvZiBwYXlsb2FkLiIsIHBheWxvYWRTaXplQml0cyAvIDgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KKyAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICAgICAgYnItPnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICAgICAgYnItPnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CisgICAgfQorfQorCit2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpmbHVzaCgpIHsKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR1YoImZsdXNoaW5nIHN0cmVhbSAweCUwNHggc2l6ZSA9ICVkIiwgbUVsZW1lbnRhcnlQSUQsIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBwYXJzZVBFUygmYnIpOworCisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCisgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIExPR1YoIm9uUGF5bG9hZERhdGEgbVN0cmVhbVR5cGU9MHglMDJ4IiwgbVN0cmVhbVR5cGUpOworCisgICAgQ0hFQ0soUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMyk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBtUHJvZ3JhbS0+Y29udmVydFBUU1RvVGltZXN0YW1wKFBUUyk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUXVldWUuYXBwZW5kRGF0YShkYXRhLCBzaXplLCB0aW1lVXMpOworICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgd2hpbGUgKChhY2Nlc3NVbml0ID0gbVF1ZXVlLmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUXVldWUuZ2V0Rm9ybWF0KCk7CisKKyAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJjcmVhdGVkIHNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1RdWV1ZS5nZXRGb3JtYXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBBZnRlciBhIGRpc2NvbnRpbnVpdHkgd2UgaW52YWxpZGF0ZSB0aGUgcXVldWUncyBmb3JtYXQKKyAgICAgICAgICAgIC8vIGFuZCB3b24ndCBlbnF1ZXVlIGFueSBhY2Nlc3MgdW5pdHMgdG8gdGhlIHNvdXJjZSB1bnRpbAorICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGhhcyByZWVzdGFibGlzaGVkIHRoZSBuZXcgZm9ybWF0LgorICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICB9CisgICAgfQorfQorCitzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpTdHJlYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKKyAgICBpZiAoKHR5cGUgPT0gQVZDX1ZJREVPICYmIG1TdHJlYW1UeXBlID09IDB4MWIpCisgICAgICAgIHx8ICh0eXBlID09IE1QRUcyQURUU19BVURJTyAmJiBtU3RyZWFtVHlwZSA9PSAweDBmKSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVRTUGFyc2VyOjpBVFNQYXJzZXIoKSB7Cit9CisKK0FUU1BhcnNlcjo6fkFUU1BhcnNlcigpIHsKK30KKwordm9pZCBBVFNQYXJzZXI6OmZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLX0VRKHNpemUsIGtUU1BhY2tldFNpemUpOworCisgICAgQUJpdFJlYWRlciBicigoY29uc3QgdWludDhfdCAqKWRhdGEsIGtUU1BhY2tldFNpemUpOworICAgIHBhcnNlVFMoJmJyKTsKK30KKwordm9pZCBBVFNQYXJzZXI6OnNpZ25hbERpc2NvbnRpbnVpdHkoYm9vbCBpc0FTZWVrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbVByb2dyYW1zLmVkaXRJdGVtQXQoaSktPnNpZ25hbERpc2NvbnRpbnVpdHkoaXNBU2Vlayk7CisgICAgfQorfQorCit2b2lkIEFUU1BhcnNlcjo6cGFyc2VQcm9ncmFtQXNzb2NpYXRpb25UYWJsZShBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIHRhYmxlX2lkID0gYnItPmdldEJpdHMoOCk7CisgICAgTE9HVigiICB0YWJsZV9pZCA9ICV1IiwgdGFibGVfaWQpOworICAgIENIRUNLX0VRKHRhYmxlX2lkLCAweDAwdSk7CisKKyAgICB1bnNpZ25lZCBzZWN0aW9uX3N5bnRheF9pbmRpY3RvciA9IGJyLT5nZXRCaXRzKDEpOworICAgIExPR1YoIiAgc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IgPSAldSIsIHNlY3Rpb25fc3ludGF4X2luZGljdG9yKTsKKyAgICBDSEVDS19FUShzZWN0aW9uX3N5bnRheF9pbmRpY3RvciwgMXUpOworCisgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDB1KTsKKyAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CisKKyAgICB1bnNpZ25lZCBzZWN0aW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKKyAgICBMT0dWKCIgIHNlY3Rpb25fbGVuZ3RoID0gJXUiLCBzZWN0aW9uX2xlbmd0aCk7CisgICAgQ0hFQ0soKHNlY3Rpb25fbGVuZ3RoICYgMHhjMDApID09IDApOworCisgICAgTVlfTE9HVigiICB0cmFuc3BvcnRfc3RyZWFtX2lkID0gJXUiLCBici0+Z2V0Qml0cygxNikpOworICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg1KSk7CisgICAgTVlfTE9HVigiICBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gJXUiLCBici0+Z2V0Qml0cygxKSk7CisgICAgTVlfTE9HVigiICBzZWN0aW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoOCkpOworICAgIE1ZX0xPR1YoIiAgbGFzdF9zZWN0aW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoOCkpOworCisgICAgc2l6ZV90IG51bVByb2dyYW1CeXRlcyA9IChzZWN0aW9uX2xlbmd0aCAtIDUgLyogaGVhZGVyICovIC0gNCAvKiBjcmMgKi8pOworICAgIENIRUNLX0VRKChudW1Qcm9ncmFtQnl0ZXMgJSA0KSwgMHUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Qcm9ncmFtQnl0ZXMgLyA0OyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgcHJvZ3JhbV9udW1iZXIgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgIExPR1YoIiAgICBwcm9ncmFtX251bWJlciA9ICV1IiwgcHJvZ3JhbV9udW1iZXIpOworCisgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMykpOworCisgICAgICAgIGlmIChwcm9ncmFtX251bWJlciA9PSAwKSB7CisgICAgICAgICAgICBNWV9MT0dWKCIgICAgbmV0d29ya19QSUQgPSAweCUwNHgiLCBici0+Z2V0Qml0cygxMykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKKworICAgICAgICAgICAgTE9HVigiICAgIHByb2dyYW1fbWFwX1BJRCA9IDB4JTA0eCIsIHByb2dyYW1NYXBQSUQpOworCisgICAgICAgICAgICBtUHJvZ3JhbXMucHVzaChuZXcgUHJvZ3JhbShwcm9ncmFtTWFwUElEKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNWV9MT0dWKCIgIENSQyA9IDB4JTA4eCIsIGJyLT5nZXRCaXRzKDMyKSk7Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpwYXJzZVBJRCgKKyAgICAgICAgQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCwKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgeworICAgIGlmIChQSUQgPT0gMCkgeworICAgICAgICBpZiAocGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgeworICAgICAgICAgICAgdW5zaWduZWQgc2tpcCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgYnItPnNraXBCaXRzKHNraXAgKiA4KTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZVByb2dyYW1Bc3NvY2lhdGlvblRhYmxlKGJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtUHJvZ3JhbXMuZWRpdEl0ZW1BdChpKS0+cGFyc2VQSUQoCisgICAgICAgICAgICAgICAgICAgIFBJRCwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgYnIpKSB7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFoYW5kbGVkKSB7CisgICAgICAgIExPR1YoIlBJRCAweCUwNHggbm90IGhhbmRsZWQuIiwgUElEKTsKKyAgICB9Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CisgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID4gMCkgeworICAgICAgICBici0+c2tpcEJpdHMoYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggKiA4KTsgIC8vIFhYWAorICAgIH0KK30KKwordm9pZCBBVFNQYXJzZXI6OnBhcnNlVFMoQUJpdFJlYWRlciAqYnIpIHsKKyAgICBMT0dWKCItLS0iKTsKKworICAgIHVuc2lnbmVkIHN5bmNfYnl0ZSA9IGJyLT5nZXRCaXRzKDgpOworICAgIENIRUNLX0VRKHN5bmNfYnl0ZSwgMHg0N3UpOworCisgICAgTVlfTE9HVigidHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9ICV1IiwgYnItPmdldEJpdHMoMSkpOworCisgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciA9IGJyLT5nZXRCaXRzKDEpOworICAgIExPR1YoInBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSAldSIsIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpOworCisgICAgTVlfTE9HVigidHJhbnNwb3J0X3ByaW9yaXR5ID0gJXUiLCBici0+Z2V0Qml0cygxKSk7CisKKyAgICB1bnNpZ25lZCBQSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgTE9HVigiUElEID0gMHglMDR4IiwgUElEKTsKKworICAgIE1ZX0xPR1YoInRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKKworICAgIHVuc2lnbmVkIGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9IGJyLT5nZXRCaXRzKDIpOworICAgIExPR1YoImFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9ICV1IiwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sKTsKKworICAgIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciA9IGJyLT5nZXRCaXRzKDQpOworICAgIExPR1YoImNvbnRpbnVpdHlfY291bnRlciA9ICV1IiwgY29udGludWl0eV9jb3VudGVyKTsKKworICAgIC8vIExPR0koIlBJRCA9IDB4JTA0eCwgY29udGludWl0eV9jb3VudGVyID0gJXUiLCBQSUQsIGNvbnRpbnVpdHlfY291bnRlcik7CisKKyAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDIgfHwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDMpIHsKKyAgICAgICAgcGFyc2VBZGFwdGF0aW9uRmllbGQoYnIpOworICAgIH0KKworICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMSB8fCBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMykgeworICAgICAgICBwYXJzZVBJRChiciwgUElELCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKTsKKyAgICB9Cit9CisKK3NwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9ncmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVByb2dyYW1zLmVkaXRJdGVtQXQoaSktPmdldFNvdXJjZSh0eXBlKTsKKworICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjFkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfVFNfUEFSU0VSX0hfCisKKyNkZWZpbmUgQV9UU19QQVJTRVJfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJpdFJlYWRlcjsKK3N0cnVjdCBNZWRpYVNvdXJjZTsKKworc3RydWN0IEFUU1BhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBVFNQYXJzZXIoKTsKKworICAgIHZvaWQgZmVlZFRTUGFja2V0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoYm9vbCBpc0FTZWVrID0gZmFsc2UpOworCisgICAgZW51bSBTb3VyY2VUeXBlIHsKKyAgICAgICAgQVZDX1ZJREVPLAorICAgICAgICBNUEVHMkFEVFNfQVVESU8KKyAgICB9OworICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBQcm9ncmFtOworICAgIHN0cnVjdCBTdHJlYW07CisKKyAgICBWZWN0b3I8c3A8UHJvZ3JhbT4gPiBtUHJvZ3JhbXM7CisKKyAgICB2b2lkIHBhcnNlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoQUJpdFJlYWRlciAqYnIpOworICAgIHZvaWQgcGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKTsKKyAgICB2b2lkIHBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKTsKKworICAgIHZvaWQgcGFyc2VQSUQoCisgICAgICAgIEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQsCisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpOworCisgICAgdm9pZCBwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpicik7CisgICAgdm9pZCBwYXJzZVRTKEFCaXRSZWFkZXIgKmJyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFUU1BhcnNlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfVFNfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMDQxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFub3RoZXJQYWNrZXRTb3VyY2UuY3BwICAgXAorICAgICAgICBBVFNQYXJzZXIuY3BwICAgICAgICAgICAgIFwKKyAgICAgICAgRVNRdWV1ZS5jcHAgICAgICAgICAgICAgICBcCisgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IuY3BwICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoSk5JX0hfSU5DTFVERSkgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodAorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQorZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3NDdjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Fub3RoZXJQYWNrZXRTb3VyY2U6OkFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQorICAgIDogbUZvcm1hdChtZXRhKSwKKyAgICAgIG1FT1NSZXN1bHQoT0spIHsKK30KKworQW5vdGhlclBhY2tldFNvdXJjZTo6fkFub3RoZXJQYWNrZXRTb3VyY2UoKSB7Cit9CisKK3N0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtRm9ybWF0OworfQorCitzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKikgeworICAgICpvdXQgPSBOVUxMOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICB3aGlsZSAobUVPU1Jlc3VsdCA9PSBPSyAmJiBtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOworICAgICAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpKTsKKworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpCisgICAgICAgICAgICAgICAgJiYgZGlzY29udGludWl0eSkgeworICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZSIsIChpbnQ2NF90ICopJnRpbWVVcykpOworCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICAgICAgICAgLy8gaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkobWVkaWFCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICpvdXQgPSBtZWRpYUJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtRU9TUmVzdWx0OworfQorCit2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50MzJfdCBkYW1hZ2VkOworICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkYW1hZ2VkIiwgJmRhbWFnZWQpICYmIGRhbWFnZWQpIHsKKyAgICAgICAgLy8gTE9HKFZFUkJPU0UpIDw8ICJkaXNjYXJkaW5nIGRhbWFnZWQgQVUiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKyAgICBMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLCB0aW1lVXMsIHRpbWVVcyAvIDFFNik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVEaXNjb250aW51aXR5KCkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDApOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHRydWUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6Y2xlYXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtQnVmZmVycy5jbGVhcigpOworICAgIG1FT1NSZXN1bHQgPSBPSzsKK30KKwordm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpzaWduYWxFT1Moc3RhdHVzX3QgcmVzdWx0KSB7CisgICAgQ0hFQ0socmVzdWx0ICE9IE9LKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUVPU1Jlc3VsdCA9IHJlc3VsdDsKKyAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCitib29sIEFub3RoZXJQYWNrZXRTb3VyY2U6Omhhc0J1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAqZmluYWxSZXN1bHQgPSBtRU9TUmVzdWx0OworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5OTE3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFOT1RIRVJfUEFDS0VUX1NPVVJDRV9IXworCisjZGVmaW5lIEFOT1RIRVJfUEFDS0VUX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIEFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICBib29sIGhhc0J1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpOworCisgICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoKTsKKyAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCByZXN1bHQpOworCisgICAgdm9pZCBjbGVhcigpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QW5vdGhlclBhY2tldFNvdXJjZSgpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworCisgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1CdWZmZXJzOworICAgIHN0YXR1c190IG1FT1NSZXN1bHQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBbm90aGVyUGFja2V0U291cmNlKTsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTk9USEVSX1BBQ0tFVF9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjllNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJFU1F1ZXVlIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlICJFU1F1ZXVlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkVsZW1lbnRhcnlTdHJlYW1RdWV1ZShNb2RlIG1vZGUpCisgICAgOiBtTW9kZShtb2RlKSB7Cit9CisKK3NwPE1ldGFEYXRhPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbUZvcm1hdDsKK30KKwordm9pZCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmNsZWFyKCkgeworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworICAgIG1UaW1lc3RhbXBzLmNsZWFyKCk7CisgICAgbUZvcm1hdC5jbGVhcigpOworfQorCitzdGF0dXNfdCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZERhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVVcykgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgY2FzZSBIMjY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNCB8fCBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBkYXRhLCA0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAyIHx8IHB0clswXSAhPSAweGZmIHx8IChwdHJbMV0gPj4gNCkgIT0gMHgwZikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG5lZWRlZFNpemUgPSAobUJ1ZmZlciA9PSBOVUxMID8gMCA6IG1CdWZmZXItPnNpemUoKSkgKyBzaXplOworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbmVlZGVkU2l6ZSA+IG1CdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OworCisgICAgICAgIExPR1YoInJlc2l6aW5nIGJ1ZmZlciB0byBzaXplICVkIiwgbmVlZGVkU2l6ZSk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIobmVlZGVkU2l6ZSk7CisgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgfQorCisgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgZGF0YSwgc2l6ZSk7CisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgc2l6ZSk7CisKKyAgICBtVGltZXN0YW1wcy5wdXNoX2JhY2sodGltZVVzKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKKyAgICBpZiAobU1vZGUgPT0gSDI2NCkgeworICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1Nb2RlLCAodW5zaWduZWQpQUFDKTsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUFDKCk7CisgICAgfQorfQorCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUFDKCkgeworICAgIFZlY3RvcjxzaXplX3Q+IGZyYW1lT2Zmc2V0czsKKyAgICBWZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVzOworICAgIHNpemVfdCBhdVNpemUgPSAwOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCArIDcgPD0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIEFCaXRSZWFkZXIgYml0cyhtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgICAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoMTIpLCAweGZmZnUpOworICAgICAgICBiaXRzLnNraXBCaXRzKDMpOyAgLy8gSUQsIGxheWVyCisgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKKworICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICAgICAgQ0hFQ0tfTkUocHJvZmlsZSwgM3UpOworICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7CisgICAgICAgICAgICBDSEVDS19ORShjaGFubmVsX2NvbmZpZ3VyYXRpb24sIDB1KTsKKyAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCisKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAorICAgICAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkdHNfdmFyaWFibGVfaGVhZGVyCisKKyAgICAgICAgLy8gY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCwgY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7CisKKyAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9IGJpdHMuZ2V0Qml0cygxMyk7CisKKyAgICAgICAgYml0cy5za2lwQml0cygxMSk7ICAvLyBhZHRzX2J1ZmZlcl9mdWxsbmVzcworCisgICAgICAgIHVuc2lnbmVkIG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWUgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICAgICAgaWYgKG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWUgIT0gMCkgeworICAgICAgICAgICAgLy8gVG8gYmUgaW1wbGVtZW50ZWQuCisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCArIGFhY19mcmFtZV9sZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgPSBwcm90ZWN0aW9uX2Fic2VudCA/IDcgOiA5OworCisgICAgICAgIGZyYW1lT2Zmc2V0cy5wdXNoKG9mZnNldCArIGhlYWRlclNpemUpOworICAgICAgICBmcmFtZVNpemVzLnB1c2goYWFjX2ZyYW1lX2xlbmd0aCAtIGhlYWRlclNpemUpOworICAgICAgICBhdVNpemUgKz0gYWFjX2ZyYW1lX2xlbmd0aCAtIGhlYWRlclNpemU7CisKKyAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CisgICAgfQorCisgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihhdVNpemUpOworICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVPZmZzZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBmcmFtZU9mZnNldHMuaXRlbUF0KGkpLAorICAgICAgICAgICAgICAgZnJhbWVTaXplcy5pdGVtQXQoaSkpOworCisgICAgICAgIGRzdE9mZnNldCArPSBmcmFtZVNpemVzLml0ZW1BdChpKTsKKyAgICB9CisKKyAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LAorICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOworCisgICAgQ0hFQ0tfR1QobVRpbWVzdGFtcHMuc2l6ZSgpLCAwdSk7CisgICAgaW50NjRfdCB0aW1lVXMgPSAqbVRpbWVzdGFtcHMuYmVnaW4oKTsKKyAgICBtVGltZXN0YW1wcy5lcmFzZShtVGltZXN0YW1wcy5iZWdpbigpKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWUiLCB0aW1lVXMpOworCisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKKy8vIHN0YXRpYworc3A8TWV0YURhdGE+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIENIRUNLX0xFKHNhbXBsaW5nX2ZyZXFfaW5kZXgsIDExdSk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKKyAgICAgICAgMHgwMywgMjIsCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAvLyBFU19JRAorICAgICAgICAweDAwLCAgICAgICAgICAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAgICAgMHgwNCwgMTcsCisgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworICAgICAgICAweDA1LCAyLAorICAgICAgICAvLyBBdWRpb1NwZWNpZmljSW5mbyBmb2xsb3dzCisKKyAgICAgICAgLy8gb29vbyBvZmZmIGZjY2MgYzAwMAorICAgICAgICAvLyBvIC0gYXVkaW9PYmplY3RUeXBlCisgICAgICAgIC8vIGYgLSBzYW1wbGluZ0ZyZXFJbmRleAorICAgICAgICAvLyBjIC0gY2hhbm5lbENvbmZpZworICAgIH07CisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIoc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDIpOworICAgIG1lbWNweShjc2QtPmRhdGEoKSwga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOworCisgICAgY3NkLT5kYXRhKClbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPQorICAgICAgICAoKHByb2ZpbGUgKyAxKSA8PCAzKSB8IChzYW1wbGluZ19mcmVxX2luZGV4ID4+IDEpOworCisgICAgY3NkLT5kYXRhKClbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0KKyAgICAgICAgKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOworCisgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBtZXRhOworfQorCitzdHJ1Y3QgTkFMUG9zaXRpb24geworICAgIHNpemVfdCBuYWxPZmZzZXQ7CisgICAgc2l6ZV90IG5hbFNpemU7Cit9OworCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0SDI2NCgpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgVmVjdG9yPE5BTFBvc2l0aW9uPiBuYWxzOworCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgc2l6ZV90IG5hbFNpemU7CisgICAgYm9vbCBmb3VuZFNsaWNlID0gZmFsc2U7CisgICAgd2hpbGUgKChlcnIgPSBnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUpKSA9PSBPSykgeworICAgICAgICBDSEVDS19HVChuYWxTaXplLCAwdSk7CisKKyAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKKyAgICAgICAgYm9vbCBmbHVzaCA9IGZhbHNlOworCisgICAgICAgIGlmIChuYWxUeXBlID09IDEgfHwgbmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICBpZiAoZm91bmRTbGljZSkgeworICAgICAgICAgICAgICAgIEFCaXRSZWFkZXIgYnIobmFsU3RhcnQgKyAxLCBuYWxTaXplKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdF9tYl9pbl9zbGljZSA9IHBhcnNlVUUoJmJyKTsKKworICAgICAgICAgICAgICAgIGlmIChmaXJzdF9tYl9pbl9zbGljZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2xpY2Ugc3RhcnRzIGEgbmV3IGZyYW1lLgorCisgICAgICAgICAgICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvdW5kU2xpY2UgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKChuYWxUeXBlID09IDkgfHwgbmFsVHlwZSA9PSA3KSAmJiBmb3VuZFNsaWNlKSB7CisgICAgICAgICAgICAvLyBBY2Nlc3MgdW5pdCBkZWxpbWl0ZXIgYW5kIFNQUyB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgIC8vIG5leHQgZnJhbWUuCisKKyAgICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbHVzaCkgeworICAgICAgICAgICAgLy8gVGhlIGFjY2VzcyB1bml0IHdpbGwgY29udGFpbiBhbGwgbmFsIHVuaXRzIHVwIHRvLCBidXQgZXhjbHVkaW5nCisgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBvbmUsIHNlcGFyYXRlZCBieSAweDAwIDB4MDAgMHgwMCAweDAxIHN0YXJ0Y29kZXMuCisKKyAgICAgICAgICAgIHNpemVfdCBhdVNpemUgPSA0ICogbmFscy5zaXplKCkgKyB0b3RhbFNpemU7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoYXVTaXplKTsKKworI2lmICFMT0dfTkRFQlVHCisgICAgICAgICAgICBBU3RyaW5nIG91dDsKKyNlbmRpZgorCisgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFscy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IE5BTFBvc2l0aW9uICZwb3MgPSBuYWxzLml0ZW1BdChpKTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtQnVmZmVyLT5kYXRhKClbcG9zLm5hbE9mZnNldF0gJiAweDFmOworCisjaWYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBjaGFyIHRtcFsxMjhdOworICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiMHglMDJ4IiwgbmFsVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodG1wKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIGRzdE9mZnNldCwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKworICAgICAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBkc3RPZmZzZXQgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBwb3MubmFsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBwb3MubmFsU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gcG9zLm5hbFNpemUgKyA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0dWKCJhY2Nlc3NVbml0IGNvbnRhaW5zIG5hbCB0eXBlcyAlcyIsIG91dC5jX3N0cigpKTsKKworICAgICAgICAgICAgY29uc3QgTkFMUG9zaXRpb24gJnBvcyA9IG5hbHMuaXRlbUF0KG5hbHMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBzaXplX3QgbmV4dFNjYW4gPSBwb3MubmFsT2Zmc2V0ICsgcG9zLm5hbFNpemU7CisKKyAgICAgICAgICAgIG1lbW1vdmUobUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBuZXh0U2NhbiwKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gbmV4dFNjYW4pOworCisgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBuZXh0U2Nhbik7CisKKyAgICAgICAgICAgIENIRUNLX0dUKG1UaW1lc3RhbXBzLnNpemUoKSwgMHUpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAqbVRpbWVzdGFtcHMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1UaW1lc3RhbXBzLmVyYXNlKG1UaW1lc3RhbXBzLmJlZ2luKCkpOworCisgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKKworICAgICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NVbml0OworICAgICAgICB9CisKKyAgICAgICAgTkFMUG9zaXRpb24gcG9zOworICAgICAgICBwb3MubmFsT2Zmc2V0ID0gbmFsU3RhcnQgLSBtQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHBvcy5uYWxTaXplID0gbmFsU2l6ZTsKKworICAgICAgICBuYWxzLnB1c2gocG9zKTsKKworICAgICAgICB0b3RhbFNpemUgKz0gbmFsU2l6ZTsKKyAgICB9CisgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpLUVBR0FJTik7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhZjgzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEVTX1FVRVVFX0hfCisKKyNkZWZpbmUgRVNfUVVFVUVfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IE1ldGFEYXRhOworCitzdHJ1Y3QgRWxlbWVudGFyeVN0cmVhbVF1ZXVlIHsKKyAgICBlbnVtIE1vZGUgeworICAgICAgICBIMjY0LAorICAgICAgICBBQUMKKyAgICB9OworICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZShNb2RlIG1vZGUpOworCisgICAgc3RhdHVzX3QgYXBwZW5kRGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0KCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisgICAgTGlzdDxpbnQ2NF90PiBtVGltZXN0YW1wczsKKworICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OworCisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKKworICAgIHN0YXRpYyBzcDxNZXRhRGF0YT4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbGVtZW50YXJ5U3RyZWFtUXVldWUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBFU19RVUVVRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NjgxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1QRUcyVFNFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0xpdmVTb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4OworCitzdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgTVBFRzJUU1NvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1QRUcyVFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsCisgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKKyAgICAgICAgICAgIGJvb2wgc2Vla2FibGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJpdmF0ZToKKyAgICBzcDxNUEVHMlRTRXh0cmFjdG9yPiBtRXh0cmFjdG9yOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1JbXBsOworCisgICAgLy8gSWYgdGhlcmUgYXJlIGJvdGggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMsIG9ubHkgdGhlIHZpZGVvIHN0cmVhbQorICAgIC8vIHdpbGwgYmUgc2Vla2FibGUsIG90aGVyd2lzZSB0aGUgc2luZ2xlIHN0cmVhbSB3aWxsIGJlIHNlZWthYmxlLgorICAgIGJvb2wgbVNlZWthYmxlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU1NvdXJjZSk7Cit9OworCitNUEVHMlRTU291cmNlOjpNUEVHMlRTU291cmNlKAorICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKKyAgICAgICAgYm9vbCBzZWVrYWJsZSkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1JbXBsKGltcGwpLAorICAgICAgbVNlZWthYmxlKHNlZWthYmxlKSB7Cit9CisKK3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXJ0KHBhcmFtcyk7Cit9CisKK3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSW1wbC0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKG1FeHRyYWN0b3ItPm1MaXZlU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1FeHRyYWN0b3ItPm1MaXZlU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YTsKK30KKworc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChtU2Vla2FibGUgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgbUV4dHJhY3Rvci0+c2Vla1RvKHNlZWtUaW1lVXMpOworICAgIH0KKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHdoaWxlICghbUltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtSW1wbC0+c2lnbmFsRU9TKGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCisgICAgICBtT2Zmc2V0KDApIHsKKyAgICBpbml0KCk7Cit9CisKK3NpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJvb2wgc2Vla2FibGUgPSB0cnVlOworICAgIGlmIChtU291cmNlSW1wbHMuc2l6ZSgpID4gMSkgeworICAgICAgICBDSEVDS19FUShtU291cmNlSW1wbHMuc2l6ZSgpLCAydSk7CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpOworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgIHNlZWthYmxlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE1QRUcyVFNTb3VyY2UodGhpcywgbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLCBzZWVrYWJsZSk7Cit9CisKK3NwPE1ldGFEYXRhPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQorICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOworfQorCitzcDxNZXRhRGF0YT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKworICAgIHJldHVybiBtZXRhOworfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmluaXQoKSB7CisgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKKyAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOworICAgIGludCBudW1QYWNrZXRzUGFyc2VkID0gMDsKKworICAgIHdoaWxlIChmZWVkTW9yZSgpID09IE9LKSB7CisgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlOworICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPQorICAgICAgICAgICAgICAgIChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpBVkNfVklERU8pLmdldCgpOworCisgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaGF2ZUF1ZGlvKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0KKyAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6TVBFRzJBRFRTX0FVRElPKS5nZXQoKTsKKworICAgICAgICAgICAgaWYgKGltcGwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CisgICAgICAgICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKytudW1QYWNrZXRzUGFyc2VkID4gMjUwMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dJKCJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCIsIGhhdmVBdWRpbywgaGF2ZVZpZGVvKTsKK30KKworc3RhdGljIGJvb2wgaXNEaXNjb250aW51aXR5KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBzaXplID09IDE4OCAmJiBkYXRhWzBdID09IDB4MDA7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRNb3JlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisKKyAgICBpZiAoaXNEaXNjb250aW51aXR5KHBhY2tldCwgbikpIHsKKyAgICAgICAgTE9HSSgiWFhYIGRpc2NvbnRpbnVpdHkgZGV0ZWN0ZWQiKTsKKyAgICAgICAgbVBhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgpOworICAgIH0gZWxzZSBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgcmV0dXJuIChuIDwgMCkgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisgICAgfQorCisgICAgbU9mZnNldCArPSBuOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OnNldExpdmVTb3VyY2UoY29uc3Qgc3A8TGl2ZVNvdXJjZT4gJmxpdmVTb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbUxpdmVTb3VyY2UgPSBsaXZlU291cmNlOworfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1MaXZlU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPnN1c3BlbmQoKTsKKyAgICB9CisKKyAgICBpZiAobUxpdmVTb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzKSkgeworICAgICAgICBtUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KHRydWUgIC8qIGlzU2VlayAqLyk7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSkKKyAgICAgICAgICAgIC0+Y2xlYXJDYWNoZUFuZFJlc3VtZSgpOworICAgIH0KK30KKwordWludDMyX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHVpbnQzMl90IGZsYWdzID0gQ0FOX1BBVVNFOworCisgICAgaWYgKG1MaXZlU291cmNlICE9IE5VTEwgJiYgbUxpdmVTb3VyY2UtPmlzU2Vla2FibGUoKSkgeworICAgICAgICBmbGFncyB8PSBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFSzsKKyAgICB9CisKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgU25pZmZNUEVHMlRTKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgY2hhciBoZWFkZXI7CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChrVFNQYWNrZXRTaXplICogaSwgJmhlYWRlciwgMSkgIT0gMQorICAgICAgICAgICAgICAgIHx8IGhlYWRlciAhPSAweDQ3KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuMWY7CisgICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawppbmRleCBmNGY1Y2MxLi5lYWQxNjc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawpAQCAtMSwxMCArMSwxMiBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAoraWZuZXEgKCQoQlVJTERfV0lUSE9VVF9QViksdHJ1ZSkKICMgU2V0IHVwIHRoZSBPcGVuQ29yZSB2YXJpYWJsZXMuCiBpbmNsdWRlIGV4dGVybmFsL29wZW5jb3JlL0NvbmZpZy5tawogTE9DQUxfQ19JTkNMVURFUyA6PSAkKFBWX0lOQ0xVREVTKQogTE9DQUxfQ0ZMQUdTIDo9ICQoUFZfQ0ZMQUdTX01JTlVTX1ZJU0lCSUxJVFkpCitlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTICs9ICQoSk5JX0hfSU5DTFVERSkKIApAQCAtMjEsNiArMjMsOCBAQAogTE9DQUxfQ0ZMQUdTICs9IC1ETk9fT1BFTkNPUkUKIGVuZGlmCiAKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCiAgICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlibWVkaWEgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCAxMzJlMzFiLi42M2FmMjZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtNDMsNyArNDMsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIENhbGxiYWNrRGlzcGF0Y2hlcihPTVggKm93bmVyKTsKKyAgICBDYWxsYmFja0Rpc3BhdGNoZXIoT01YTm9kZUluc3RhbmNlICpvd25lcik7CiAKICAgICB2b2lkIHBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBPTVggKm1Pd25lcjsKKyAgICBPTVhOb2RlSW5zdGFuY2UgKm1Pd25lcjsKICAgICBib29sIG1Eb25lOwogICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkOwogICAgIExpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKQEAgLTY5LDcgKzY5LDcgQEAKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIgJm9wZXJhdG9yPShjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXIgJik7CiB9OwogCi1PTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6Q2FsbGJhY2tEaXNwYXRjaGVyKE9NWCAqb3duZXIpCitPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6Q2FsbGJhY2tEaXNwYXRjaGVyKE9NWE5vZGVJbnN0YW5jZSAqb3duZXIpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbURvbmUoZmFsc2UpIHsKICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOwpAQCAtMTAxLDEyICsxMDEsMTEgQEAKIH0KIAogdm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6ZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewotICAgIE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UgPSBtT3duZXItPmZpbmRJbnN0YW5jZShtc2cubm9kZSk7Ci0gICAgaWYgKGluc3RhbmNlID09IE5VTEwpIHsKKyAgICBpZiAobU93bmVyID09IE5VTEwpIHsKICAgICAgICAgTE9HVigiV291bGQgaGF2ZSBkaXNwYXRjaGVkIGEgbWVzc2FnZSB0byBhIG5vZGUgdGhhdCdzIGFscmVhZHkgZ29uZS4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpbnN0YW5jZS0+b25NZXNzYWdlKG1zZyk7CisgICAgbU93bmVyLT5vbk1lc3NhZ2UobXNnKTsKIH0KIAogLy8gc3RhdGljCkBAIC0xNDUsNyArMTQ0LDYgQEAKIAogT01YOjpPTVgoKQogICAgIDogbU1hc3RlcihuZXcgT01YTWFzdGVyKSwKLSAgICAgIG1EaXNwYXRjaGVyKG5ldyBDYWxsYmFja0Rpc3BhdGNoZXIodGhpcykpLAogICAgICAgbU5vZGVDb3VudGVyKDApIHsKIH0KIApAQCAtMTY2LDYgKzE2NCwxMCBAQAogICAgICAgICBpbnN0YW5jZSA9IG1MaXZlTm9kZXMuZWRpdFZhbHVlQXQoaW5kZXgpOwogICAgICAgICBtTGl2ZU5vZGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCisgICAgICAgIGluZGV4ID0gbURpc3BhdGNoZXJzLmluZGV4T2ZLZXkoaW5zdGFuY2UtPm5vZGVJRCgpKTsKKyAgICAgICAgQ0hFQ0soaW5kZXggPj0gMCk7CisgICAgICAgIG1EaXNwYXRjaGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKwogICAgICAgICBpbnZhbGlkYXRlTm9kZUlEX2woaW5zdGFuY2UtPm5vZGVJRCgpKTsKICAgICB9CiAKQEAgLTIyNiw2ICsyMjgsNyBAQAogICAgIH0KIAogICAgICpub2RlID0gbWFrZU5vZGVJRChpbnN0YW5jZSk7CisgICAgbURpc3BhdGNoZXJzLmFkZCgqbm9kZSwgbmV3IENhbGxiYWNrRGlzcGF0Y2hlcihpbnN0YW5jZSkpOwogCiAgICAgaW5zdGFuY2UtPnNldEhhbmRsZSgqbm9kZSwgaGFuZGxlKTsKIApAQCAtMjQxLDkgKzI0NCwxNiBAQAogICAgIHNzaXplX3QgaW5kZXggPSBtTGl2ZU5vZGVzLmluZGV4T2ZLZXkoaW5zdGFuY2UtPm9ic2VydmVyKCktPmFzQmluZGVyKCkpOwogICAgIENIRUNLKGluZGV4ID49IDApOwogICAgIG1MaXZlTm9kZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKICAgICBpbnN0YW5jZS0+b2JzZXJ2ZXIoKS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKIAotICAgIHJldHVybiBpbnN0YW5jZS0+ZnJlZU5vZGUobU1hc3Rlcik7CisgICAgc3RhdHVzX3QgZXJyID0gaW5zdGFuY2UtPmZyZWVOb2RlKG1NYXN0ZXIpOworCisgICAgaW5kZXggPSBtRGlzcGF0Y2hlcnMuaW5kZXhPZktleShub2RlKTsKKyAgICBDSEVDSyhpbmRleCA+PSAwKTsKKyAgICBtRGlzcGF0Y2hlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBPTVg6OnNlbmRDb21tYW5kKApAQCAtMzQxLDcgKzM1MSw3IEBACiAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMSA9IG5EYXRhMTsKICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGEyID0gbkRhdGEyOwogCi0gICAgbURpc3BhdGNoZXItPnBvc3QobXNnKTsKKyAgICBmaW5kRGlzcGF0Y2hlcihub2RlKS0+cG9zdChtc2cpOwogCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CkBAIC0zNTUsNyArMzY1LDcgQEAKICAgICBtc2cubm9kZSA9IG5vZGU7CiAgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyID0gcEJ1ZmZlcjsKIAotICAgIG1EaXNwYXRjaGVyLT5wb3N0KG1zZyk7CisgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQpAQCAtMzc1LDcgKzM4NSw3IEBACiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSA9IHBCdWZmZXItPnBQbGF0Zm9ybVByaXZhdGU7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIgPSBwQnVmZmVyLT5wQnVmZmVyOwogCi0gICAgbURpc3BhdGNoZXItPnBvc3QobXNnKTsKKyAgICBmaW5kRGlzcGF0Y2hlcihub2RlKS0+cG9zdChtc2cpOwogCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CkBAIC0zOTcsNiArNDA3LDE0IEBACiAgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5VTEwgOiBtTm9kZUlEVG9JbnN0YW5jZS52YWx1ZUF0KGluZGV4KTsKIH0KIAorc3A8T01YOjpDYWxsYmFja0Rpc3BhdGNoZXI+IE9NWDo6ZmluZERpc3BhdGNoZXIobm9kZV9pZCBub2RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtRGlzcGF0Y2hlcnMuaW5kZXhPZktleShub2RlKTsKKworICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogbURpc3BhdGNoZXJzLnZhbHVlQXQoaW5kZXgpOworfQorCiB2b2lkIE9NWDo6aW52YWxpZGF0ZU5vZGVJRChub2RlX2lkIG5vZGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGludmFsaWRhdGVOb2RlSURfbChub2RlKTsKQEAgLTQ0MSw3ICs0NTksOCBAQAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCwKICAgICAgICAgc2l6ZV90IGVuY29kZWRXaWR0aCwgc2l6ZV90IGVuY29kZWRIZWlnaHQsCi0gICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBWaWRlb1JlbmRlcmVyICppbXBsID0gTlVMTDsKQEAgLTQ0OSw2ICs0NjgsMTQgQEAKICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iLCBSVExEX05PVyk7CiAKICAgICBpZiAobGliSGFuZGxlKSB7CisgICAgICAgIHR5cGVkZWYgVmlkZW9SZW5kZXJlciAqKCpDcmVhdGVSZW5kZXJlcldpdGhSb3RhdGlvbkZ1bmMpKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzKTsKKwogICAgICAgICB0eXBlZGVmIFZpZGVvUmVuZGVyZXIgKigqQ3JlYXRlUmVuZGVyZXJGdW5jKSgKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKQEAgLTQ1NiwyMiArNDgzLDM1IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOwogCi0gICAgICAgIENyZWF0ZVJlbmRlcmVyRnVuYyBmdW5jID0KLSAgICAgICAgICAgIChDcmVhdGVSZW5kZXJlckZ1bmMpZGxzeW0oCisgICAgICAgIENyZWF0ZVJlbmRlcmVyV2l0aFJvdGF0aW9uRnVuYyBmdW5jV2l0aFJvdGF0aW9uID0KKyAgICAgICAgICAgIChDcmVhdGVSZW5kZXJlcldpdGhSb3RhdGlvbkZ1bmMpZGxzeW0oCiAgICAgICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIl9aMTRjcmVhdGVSZW5kZXJlclJLTjdhbmRyb2lkMnNwSU5TXzhJU3VyZmFjZUVFRVBLYzIwIgotICAgICAgICAgICAgICAgICAgICAiT01YX0NPTE9SX0ZPUk1BVFRZUEVqampqIik7CisgICAgICAgICAgICAgICAgICAgICJfWjI2Y3JlYXRlUmVuZGVyZXJXaXRoUm90YXRpb25SS043YW5kcm9pZDJzcElOU184IgorICAgICAgICAgICAgICAgICAgICAiSVN1cmZhY2VFRUVQS2MyME9NWF9DT0xPUl9GT1JNQVRUWVBFampqamkiKTsKIAotICAgICAgICBpZiAoZnVuYykgewotICAgICAgICAgICAgaW1wbCA9ICgqZnVuYykoc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwgZW5jb2RlZFdpZHRoLCBlbmNvZGVkSGVpZ2h0KTsKKyAgICAgICAgaWYgKGZ1bmNXaXRoUm90YXRpb24pIHsKKyAgICAgICAgICAgIGltcGwgPSAoKmZ1bmNXaXRoUm90YXRpb24pKAorICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LCBlbmNvZGVkV2lkdGgsIGVuY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDcmVhdGVSZW5kZXJlckZ1bmMgZnVuYyA9CisgICAgICAgICAgICAgICAgKENyZWF0ZVJlbmRlcmVyRnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfWjE0Y3JlYXRlUmVuZGVyZXJSS043YW5kcm9pZDJzcElOU184SVN1cmZhY2VFRUVQS2MyMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJPTVhfQ09MT1JfRk9STUFUVFlQRWpqamoiKTsKIAotICAgICAgICAgICAgaWYgKGltcGwpIHsKLSAgICAgICAgICAgICAgICBpbXBsID0gbmV3IFNoYXJlZFZpZGVvUmVuZGVyZXIobGliSGFuZGxlLCBpbXBsKTsKLSAgICAgICAgICAgICAgICBsaWJIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgICAgICAgICBpbXBsID0gKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwgZW5jb2RlZFdpZHRoLCBlbmNvZGVkSGVpZ2h0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChpbXBsKSB7CisgICAgICAgICAgICBpbXBsID0gbmV3IFNoYXJlZFZpZGVvUmVuZGVyZXIobGliSGFuZGxlLCBpbXBsKTsKKyAgICAgICAgICAgIGxpYkhhbmRsZSA9IE5VTEw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAobGliSGFuZGxlKSB7CiAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CiAgICAgICAgICAgICBsaWJIYW5kbGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCA5YTQ1YmVhLi41NmIxNjlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT01YTWFzdGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSAiT01YTWFzdGVyLmgiCiAKICNpbmNsdWRlIDxkbGZjbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCBjMWEwMTBjLi41ZGI1MTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjY0LDYgKzI2NCw4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKKwogICAgICpidWZmZXIgPSBoZWFkZXI7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKQEAgLTI5NCw2ICsyOTYsOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJfbWV0YSk7CisKICAgICAqYnVmZmVyID0gaGVhZGVyOwogICAgICpidWZmZXJfZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKIApAQCAtMzI1LDYgKzMyOSw4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKKwogICAgICpidWZmZXIgPSBoZWFkZXI7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZWUxMTdlNS4uYmY2OTQyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsNSArMSwzIEBACi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIApAQCAtMTIsMTIgKzEwLDggQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBvbXhfdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWVuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IGZjZjUwNmQuLjRmMjg4NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3A8TWVtb3J5RGVhbGVyPiBkZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKDggKiAxMDI0ICogMTAyNCwgIk9NWEhhcm5lc3MiKTsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoMTYgKiAxMDI0ICogMTAyNCwgIk9NWEhhcm5lc3MiKTsKICAgICBJT01YOjpub2RlX2lkIG5vZGU7CiAKICAgICBzdGF0dXNfdCBlcnIgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmNmU5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFBTVJBc3NlbWJsZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlICJBUlRQU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7CisKKyAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7CisKKyAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7CisgICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA9PSBrZXlMZW4gJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7CisgICAgICAgICAgICB2YWx1ZS0+c2V0VG8oIjEiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSBjb2xvblBvcyArIDE7CisgICAgfQorfQorCitBQU1SQXNzZW1ibGVyOjpBQU1SQXNzZW1ibGVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgYm9vbCBpc1dpZGUsIGNvbnN0IEFTdHJpbmcgJnBhcmFtcykKKyAgICA6IG1Jc1dpZGUoaXNXaWRlKSwKKyAgICAgIG1Ob3RpZnlNc2cobm90aWZ5KSwKKyAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObygwKSB7CisgICAgQVN0cmluZyB2YWx1ZTsKKyAgICBDSEVDSyhHZXRBdHRyaWJ1dGUocGFyYW1zLmNfc3RyKCksICJvY3RldC1hbGlnbiIsICZ2YWx1ZSkgJiYgdmFsdWUgPT0gIjEiKTsKKyAgICBDSEVDSyghR2V0QXR0cmlidXRlKHBhcmFtcy5jX3N0cigpLCAiY3JjIiwgJnZhbHVlKSB8fCB2YWx1ZSA9PSAiMCIpOworICAgIENIRUNLKCFHZXRBdHRyaWJ1dGUocGFyYW1zLmNfc3RyKCksICJpbnRlcmxlYXZpbmciLCAmdmFsdWUpKTsKK30KKworQUFNUkFzc2VtYmxlcjo6fkFBTVJBc3NlbWJsZXIoKSB7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFBTVJBc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIHJldHVybiBhZGRQYWNrZXQoc291cmNlKTsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZUKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbOF0gPSB7CisgICAgICAgIDk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzldID0geworICAgICAgICAxMzIsIDE3NywgMjUzLCAyODUsIDMxNywgMzY1LCAzOTcsIDQ2MSwgNDc3CisgICAgfTsKKworICAgIHNpemVfdCBmcmFtZVNpemUgPSBpc1dpZGUgPyBrRnJhbWVTaXplV0JbRlRdIDoga0ZyYW1lU2l6ZU5CW0ZUXTsKKworICAgIC8vIFJvdW5kIHVwIGJpdHMgdG8gYnl0ZXMgYW5kIGFkZCAxIGZvciB0aGUgaGVhZGVyIGJ5dGUuCisgICAgZnJhbWVTaXplID0gKGZyYW1lU2l6ZSArIDcpIC8gOCArIDE7CisKKyAgICByZXR1cm4gZnJhbWVTaXplOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQU1SQXNzZW1ibGVyOjphZGRQYWNrZXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworCisgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmICghbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQgPSB0cnVlOworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICBMT0dWKCJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIik7CisKKyAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICB9CisKKyAgICAvLyBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAxKSB7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIExPR1YoIkFNUiBwYWNrZXQgdG9vIHNob3J0LiIpOworCisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRIZWFkZXIgPSBidWZmZXItPmRhdGEoKVswXTsKKyAgICB1bnNpZ25lZCBDTVIgPSBwYXlsb2FkSGVhZGVyID4+IDQ7CisgICAgQ0hFQ0tfRVEocGF5bG9hZEhlYWRlciAmIDB4MGYsIDB1KTsgIC8vIFJSCisKKyAgICBWZWN0b3I8dWludDhfdD4gdGFibGVPZkNvbnRlbnRzOworCisgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAob2Zmc2V0ID49IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgICAgIExPR1YoIlVuYWJsZSB0byBwYXJzZSBUT0MuIik7CisKKyAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCB0b2MgPSBidWZmZXItPmRhdGEoKVtvZmZzZXQrK107CisKKyAgICAgICAgdW5zaWduZWQgRlQgPSAodG9jID4+IDMpICYgMHgwZjsKKyAgICAgICAgaWYgKCh0b2MgJiAzKSAhPSAwCisgICAgICAgICAgICAgICAgfHwgKG1Jc1dpZGUgJiYgRlQgPiA4KQorICAgICAgICAgICAgICAgIHx8ICghbUlzV2lkZSAmJiBGVCA+IDcpKSB7CisgICAgICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgICAgIExPR1YoIklsbGVnYWwgVE9DIGVudHJ5LiIpOworCisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsU2l6ZSArPSBnZXRGcmFtZVNpemUobUlzV2lkZSwgKHRvYyA+PiAzKSAmIDB4MGYpOworCisgICAgICAgIHRhYmxlT2ZDb250ZW50cy5wdXNoKHRvYyk7CisKKyAgICAgICAgaWYgKDAgPT0gKHRvYyAmIDB4ODApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcih0b3RhbFNpemUpOworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCBidWZmZXIpOworCisgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWJsZU9mQ29udGVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdWludDhfdCB0b2MgPSB0YWJsZU9mQ29udGVudHNbaV07CisKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCAodG9jID4+IDMpICYgMHgwZik7CisKKyAgICAgICAgaWYgKG9mZnNldCArIGZyYW1lU2l6ZSAtIDEgPiBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgICAgICBMT0dWKCJBTVIgcGFja2V0IHRvbyBzaG9ydC4iKTsKKworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KKworICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKClbZHN0T2Zmc2V0KytdID0gdG9jOworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGZyYW1lU2l6ZSAtIDEpOworCisgICAgICAgIG9mZnNldCArPSBmcmFtZVNpemUgLSAxOworICAgICAgICBkc3RPZmZzZXQgKz0gZnJhbWVTaXplIC0gMTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFBTVJBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworfQorCit2b2lkIEFBTVJBc3NlbWJsZXI6Om9uQnllUmVjZWl2ZWQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIG1zZy0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTVlMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9BTVJfQVNTRU1CTEVSX0hfCisKKyNkZWZpbmUgQV9BTVJfQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQVN0cmluZzsKKworc3RydWN0IEFBTVJBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUFNUkFzc2VtYmxlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIGlzV2lkZSwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQU1SQXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNXaWRlOworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQU1SQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9BTVJfQVNTRU1CTEVSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQVZDQXNzZW1ibGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUFWQ0Fzc2VtYmxlci5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK0FBVkNBc3NlbWJsZXI6OkFBVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQUFWQ0Fzc2VtYmxlcjo6fkFBVkNBc3NlbWJsZXIoKSB7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFBVkNBc3NlbWJsZXI6OmFkZE5BTFVuaXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworCisgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmICghbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQgPSB0cnVlOworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICBMT0dWKCJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIik7CisKKyAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIGlmIChzaXplIDwgMSB8fCAoZGF0YVswXSAmIDB4ODApKSB7CisgICAgICAgIC8vIENvcnJ1cHQuCisKKyAgICAgICAgTE9HVigiSWdub3JpbmcgY29ycnVwdCBidWZmZXIuIik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSA+PSAxICYmIG5hbFR5cGUgPD0gMjMpIHsKKyAgICAgICAgYWRkU2luZ2xlTkFMVW5pdChidWZmZXIpOworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSAyOCkgeworICAgICAgICAvLyBGVS1BCisgICAgICAgIHJldHVybiBhZGRGcmFnbWVudGVkTkFMVW5pdChxdWV1ZSk7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDI0KSB7CisgICAgICAgIC8vIFNUQVAtQQorICAgICAgICBib29sIHN1Y2Nlc3MgPSBhZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoYnVmZmVyKTsKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiSWdub3JpbmcgdW5zdXBwb3J0ZWQgYnVmZmVyIChuYWxUeXBlPSVkKSIsIG5hbFR5cGUpOworCisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KK30KKwordm9pZCBBQVZDQXNzZW1ibGVyOjphZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBMT0dWKCJhZGRTaW5nbGVOQUxVbml0IG9mIHNpemUgJWQiLCBidWZmZXItPnNpemUoKSk7CisjaWYgIUxPR19OREVCVUcKKyAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAoIW1OQUxVbml0cy5lbXB0eSgpICYmIHJ0cFRpbWUgIT0gbUFjY2Vzc1VuaXRSVFBUaW1lKSB7CisgICAgICAgIHN1Ym1pdEFjY2Vzc1VuaXQoKTsKKyAgICB9CisgICAgbUFjY2Vzc1VuaXRSVFBUaW1lID0gcnRwVGltZTsKKworICAgIG1OQUxVbml0cy5wdXNoX2JhY2soYnVmZmVyKTsKK30KKworYm9vbCBBQVZDQXNzZW1ibGVyOjphZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgIExPR1YoIkRpc2NhcmRpbmcgdG9vIHNtYWxsIFNUQVAtQSBwYWNrZXQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICArK2RhdGE7CisgICAgLS1zaXplOworICAgIHdoaWxlIChzaXplID49IDIpIHsKKyAgICAgICAgc2l6ZV90IG5hbFNpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisKKyAgICAgICAgaWYgKHNpemUgPCBuYWxTaXplICsgMikgeworICAgICAgICAgICAgTE9HVigiRGlzY2FyZGluZyBtYWxmb3JtZWQgU1RBUC1BIHBhY2tldC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgJmRhdGFbMl0sIG5hbFNpemUpOworCisgICAgICAgIENvcHlUaW1lcyh1bml0LCBidWZmZXIpOworCisgICAgICAgIGFkZFNpbmdsZU5BTFVuaXQodW5pdCk7CisKKyAgICAgICAgZGF0YSArPSAyICsgbmFsU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSAyICsgbmFsU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgIExPR1YoIlVuZXhwZWN0ZWQgcGFkZGluZyBhdCBlbmQgb2YgU1RBUC1BIHBhY2tldC4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUFWQ0Fzc2VtYmxlcjo6YWRkRnJhZ21lbnRlZE5BTFVuaXQoCisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpIHsKKyAgICBDSEVDSyghcXVldWUtPmVtcHR5KCkpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgQ0hFQ0soc2l6ZSA+IDApOworICAgIHVuc2lnbmVkIGluZGljYXRvciA9IGRhdGFbMF07CisKKyAgICBDSEVDSygoaW5kaWNhdG9yICYgMHgxZikgPT0gMjgpOworCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIExPR1YoIklnbm9yaW5nIG1hbGZvcm1lZCBGVSBidWZmZXIgKHNpemUgPSAlZCkiLCBzaXplKTsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorCisgICAgaWYgKCEoZGF0YVsxXSAmIDB4ODApKSB7CisgICAgICAgIC8vIFN0YXJ0IGJpdCBub3Qgc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyAgICAgICAgTE9HVigiU3RhcnQgYml0IG5vdCBzZXQgb24gZmlyc3QgYnVmZmVyIik7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVpbnQzMl90IG5hbFR5cGUgPSBkYXRhWzFdICYgMHgxZjsKKyAgICB1aW50MzJfdCBucmkgPSAoZGF0YVswXSA+PiA1KSAmIDM7CisKKyAgICB1aW50MzJfdCBleHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgKyAxOworICAgIHNpemVfdCB0b3RhbFNpemUgPSBzaXplIC0gMjsKKyAgICBzaXplX3QgdG90YWxDb3VudCA9IDE7CisgICAgYm9vbCBjb21wbGV0ZSA9IGZhbHNlOworCisgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CisgICAgICAgIC8vIEh1aD8gRW5kIGJpdCBhbHNvIHNldCBvbiB0aGUgZmlyc3QgYnVmZmVyLgorCisgICAgICAgIExPR1YoIkdycnIuIFRoaXMgaXNuJ3QgZnJhZ21lbnRlZCBhdCBhbGwuIik7CisKKyAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgICAgICBMT0dWKCJzZXF1ZW5jZSBsZW5ndGggJWQiLCB0b3RhbENvdW50KTsKKworICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgICAgICAgICAgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IGV4cGVjdGVkU2VxTm8pIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJzZXF1ZW5jZSBub3QgY29tcGxldGUsIGV4cGVjdGVkIHNlcU5vICVkLCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXFObywgKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemUgPCAyCisgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbMF0gIT0gaW5kaWNhdG9yCisgICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHgxZikgIT0gbmFsVHlwZQorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsxXSAmIDB4ODApKSB7CisgICAgICAgICAgICAgICAgTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlci4iKTsKKworICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgd2hvbGUgc3RhcnQgb2YgdGhlIEZVLgorCisgICAgICAgICAgICAgICAgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSB0b3RhbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzaXplIC0gMjsKKyAgICAgICAgICAgICsrdG90YWxDb3VudDsKKworICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOworCisgICAgICAgICAgICBpZiAoZGF0YVsxXSAmIDB4NDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LgorICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghY29tcGxldGUpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vOworCisgICAgLy8gV2UgZm91bmQgYWxsIHRoZSBmcmFnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjb21wbGV0ZSBOQUwgdW5pdC4KKworICAgIC8vIExlYXZlIHJvb20gZm9yIHRoZSBoZWFkZXIuIFNvIGZhciB0b3RhbFNpemUgZGlkIG5vdCBpbmNsdWRlIHRoZQorICAgIC8vIGhlYWRlciBieXRlLgorICAgICsrdG90YWxTaXplOworCisgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgQ29weVRpbWVzKHVuaXQsICpxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICB1bml0LT5kYXRhKClbMF0gPSAobnJpIDw8IDUpIHwgbmFsVHlwZTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAxOworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworCisgICAgICAgIExPR1YoInBpZWNlICMlZC8lZCIsIGkgKyAxLCB0b3RhbENvdW50KTsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisgICAgICAgIG9mZnNldCArPSBidWZmZXItPnNpemUoKSAtIDI7CisKKyAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOworICAgIH0KKworICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CisKKyAgICBhZGRTaW5nbGVOQUxVbml0KHVuaXQpOworCisgICAgTE9HVigic3VjY2Vzc2Z1bGx5IGFzc2VtYmxlZCBhIE5BTCB1bml0IGZyb20gZnJhZ21lbnRzLiIpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFBVkNBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CisgICAgQ0hFQ0soIW1OQUxVbml0cy5lbXB0eSgpKTsKKworICAgIExPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglZCBuYWwgdW5pdHMpIiwgbU5BTFVuaXRzLnNpemUoKSk7CisKKyAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1OQUxVbml0cy5lbmQoKTsgKytpdCkgeworICAgICAgICB0b3RhbFNpemUgKz0gNCArICgqaXQpLT5zaXplKCk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbU5BTFVuaXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtTkFMVW5pdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gKml0OworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBuYWwtPmRhdGEoKSwgbmFsLT5zaXplKCkpOworICAgICAgICBvZmZzZXQgKz0gbmFsLT5zaXplKCk7CisgICAgfQorCisgICAgQ29weVRpbWVzKGFjY2Vzc1VuaXQsICptTkFMVW5pdHMuYmVnaW4oKSk7CisKKyNpZiAwCisgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1OQUxVbml0cy5jbGVhcigpOworICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IGZhbHNlOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0T2JqZWN0KCJhY2Nlc3MtdW5pdCIsIGFjY2Vzc1VuaXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQVZDQXNzZW1ibGVyOjphc3NlbWJsZU1vcmUoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGROQUxVbml0KHNvdXJjZSk7CisgICAgaWYgKHN0YXR1cyA9PSBNQUxGT1JNRURfUEFDS0VUKSB7CisgICAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQUFWQ0Fzc2VtYmxlcjo6cGFja2V0TG9zdCgpIHsKKyAgICBDSEVDSyhtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCk7CisgICAgTE9HVigicGFja2V0TG9zdCAoZXhwZWN0ZWQgJWQpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBQVZDQXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzODllYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfQVZDX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfQVZDX0FTU0VNQkxFUl9IXworCisjaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgorCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEFBVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUFWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQVZDQXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisKKyAgICB1aW50MzJfdCBtQWNjZXNzVW5pdFJUUFRpbWU7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKKworICAgIEFzc2VtYmx5U3RhdHVzIGFkZE5BTFVuaXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBhZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIEFzc2VtYmx5U3RhdHVzIGFkZEZyYWdtZW50ZWROQUxVbml0KExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpOworICAgIGJvb2wgYWRkU2luZ2xlVGltZUFnZ3JlZ2F0aW9uUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQVZDQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9BVkNfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODI5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBSDI2M0Fzc2VtYmxlci5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBSDI2M0Fzc2VtYmxlcjo6QUgyNjNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQUgyNjNBc3NlbWJsZXI6On5BSDI2M0Fzc2VtYmxlcigpIHsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUgyNjNBc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSDI2M0Fzc2VtYmxlcjo6YWRkUGFja2V0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyNpZiBWRVJCT1NFCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTm90IHRoZSBzZXF1ZW5jZSBudW1iZXIgSSBleHBlY3RlZCI7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAobVBhY2tldHMuc2l6ZSgpID4gMCAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgeworICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CisgICAgfQorICAgIG1BY2Nlc3NVbml0UlRQVGltZSA9IHJ0cFRpbWU7CisKKyAgICAvLyBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyKSB7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRIZWFkZXIgPSBVMTZfQVQoYnVmZmVyLT5kYXRhKCkpOworICAgIENIRUNLX0VRKHBheWxvYWRIZWFkZXIgPj4gMTEsIDB1KTsgIC8vIFJSPTAKKyAgICB1bnNpZ25lZCBQID0gKHBheWxvYWRIZWFkZXIgPj4gMTApICYgMTsKKyAgICBDSEVDS19FUSgocGF5bG9hZEhlYWRlciA+PiA5KSAmIDEsIDB1KTsgIC8vIFY9MAorICAgIENIRUNLX0VRKChwYXlsb2FkSGVhZGVyID4+IDMpICYgMHgzZiwgMHUpOyAgLy8gUExFTj0wCisgICAgQ0hFQ0tfRVEocGF5bG9hZEhlYWRlciAmIDcsIDB1KTsgIC8vIFBFQklUPTAKKworICAgIGlmIChQKSB7CisgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHgwMDsKKyAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSAweDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisgICAgfQorCisgICAgbVBhY2tldHMucHVzaF9iYWNrKGJ1ZmZlcik7CisKKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFIMjYzQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgeworICAgIENIRUNLKCFtUGFja2V0cy5lbXB0eSgpKTsKKworI2lmIFZFUkJPU0UKKyAgICBMT0coVkVSQk9TRSkgPDwgIkFjY2VzcyB1bml0IGNvbXBsZXRlICgiIDw8IG1QYWNrZXRzLnNpemUoKSA8PCAiIHBhY2tldHMpIjsKKyNlbmRpZgorCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1QYWNrZXRzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QYWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZ1bml0ID0gKml0OworCisgICAgICAgIHRvdGFsU2l6ZSArPSB1bml0LT5zaXplKCk7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaXQgPSBtUGFja2V0cy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGFja2V0cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmdW5pdCA9ICppdDsKKworICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICB1bml0LT5kYXRhKCksIHVuaXQtPnNpemUoKSk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHVuaXQtPnNpemUoKTsKKworICAgICAgICArK2l0OworICAgIH0KKworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbVBhY2tldHMuYmVnaW4oKSk7CisKKyNpZiAwCisgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1QYWNrZXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQUgyNjNBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBSDI2M0Fzc2VtYmxlcjo6b25CeWVSZWNlaXZlZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZjNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfSDI2M19BU1NFTUJMRVJfSF8KKworI2RlZmluZSBBX0gyNjNfQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBSDI2M0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKKyAgICBBSDI2M0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BSDI2M0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworICAgIHVpbnQzMl90IG1BY2Nlc3NVbml0UlRQVGltZTsKKyAgICBib29sIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkOworICAgIHVpbnQzMl90IG1OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICBib29sIG1BY2Nlc3NVbml0RGFtYWdlZDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVBhY2tldHM7CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBSDI2M0Fzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfSDI2M19BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMmM2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlICJBUlRQU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6QU1QRUc0QXVkaW9Bc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQU1QRUc0QXVkaW9Bc3NlbWJsZXI6On5BTVBFRzRBdWRpb0Fzc2VtYmxlcigpIHsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6YWRkUGFja2V0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyNpZiBWRVJCT1NFCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTm90IHRoZSBzZXF1ZW5jZSBudW1iZXIgSSBleHBlY3RlZCI7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAobVBhY2tldHMuc2l6ZSgpID4gMCAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgeworICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CisgICAgfQorICAgIG1BY2Nlc3NVbml0UlRQVGltZSA9IHJ0cFRpbWU7CisKKyAgICBtUGFja2V0cy5wdXNoX2JhY2soYnVmZmVyKTsKKworICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CisgICAgQ0hFQ0soIW1QYWNrZXRzLmVtcHR5KCkpOworCisjaWYgVkVSQk9TRQorICAgIExPRyhWRVJCT1NFKSA8PCAiQWNjZXNzIHVuaXQgY29tcGxldGUgKCIgPDwgbVBhY2tldHMuc2l6ZSgpIDw8ICIgcGFja2V0cykiOworI2VuZGlmCisKKyAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbVBhY2tldHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBhY2tldHMuZW5kKCkpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnVuaXQgPSAqaXQ7CisKKyAgICAgICAgc2l6ZV90IG4gPSAwOworICAgICAgICB3aGlsZSAodW5pdC0+ZGF0YSgpW25dID09IDB4ZmYpIHsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgICAgICArK247CisKKyAgICAgICAgdG90YWxTaXplICs9IHVuaXQtPnNpemUoKSAtIG47CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaXQgPSBtUGFja2V0cy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGFja2V0cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmdW5pdCA9ICppdDsKKworICAgICAgICBzaXplX3QgbiA9IDA7CisgICAgICAgIHdoaWxlICh1bml0LT5kYXRhKClbbl0gPT0gMHhmZikgeworICAgICAgICAgICAgKytuOworICAgICAgICB9CisgICAgICAgICsrbjsKKworICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICB1bml0LT5kYXRhKCkgKyBuLCB1bml0LT5zaXplKCkgLSBuKTsKKworICAgICAgICBvZmZzZXQgKz0gdW5pdC0+c2l6ZSgpIC0gbjsKKworICAgICAgICArK2l0OworICAgIH0KKworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbVBhY2tldHMuYmVnaW4oKSk7CisKKyNpZiAwCisgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1QYWNrZXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6b25CeWVSZWNlaXZlZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ZjIwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01QRUc0X0FVRElPX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfTVBFRzRfQVVESU9fQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBTVBFRzRBdWRpb0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKKyAgICBBTVBFRzRBdWRpb0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTVBFRzRBdWRpb0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworICAgIHVpbnQzMl90IG1BY2Nlc3NVbml0UlRQVGltZTsKKyAgICBib29sIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkOworICAgIHVpbnQzMl90IG1OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICBib29sIG1BY2Nlc3NVbml0RGFtYWdlZDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVBhY2tldHM7CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTVBFRzRBdWRpb0Fzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTVBFRzRfQVVESU9fQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk4OGNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgeworICAgICAgICAgICAgKytzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKKworICAgICAgICBzaXplX3QgbGVuID0KKyAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKKworICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JworICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChzLCBrZXksIGtleUxlbikpIHsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworc3RhdGljIGJvb2wgR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCB1bnNpZ25lZCAqeCkgeworICAgICp4ID0gMDsKKworICAgIEFTdHJpbmcgdmFsOworICAgIGlmICghR2V0QXR0cmlidXRlKHMsIGtleSwgJnZhbCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHMgPSB2YWwuY19zdHIoKTsKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgeSA9IHN0cnRvdWwocywgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSB5OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6QU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IEFTdHJpbmcgJmRlc2MsIGNvbnN0IEFTdHJpbmcgJnBhcmFtcykKKyAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKKyAgICAgIG1Jc0dlbmVyaWMoZmFsc2UpLAorICAgICAgbVBhcmFtcyhwYXJhbXMpLAorICAgICAgbVNpemVMZW5ndGgoMCksCisgICAgICBtSW5kZXhMZW5ndGgoMCksCisgICAgICBtSW5kZXhEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1DVFNEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1EVFNEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1SYW5kb21BY2Nlc3NJbmRpY2F0aW9uKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1TdGF0ZUluZGljYXRpb24oMCksCisgICAgICBtQXV4aWxpYXJ5RGF0YVNpemVMZW5ndGgoMCksCisgICAgICBtSGFzQVVIZWFkZXIoZmFsc2UpLAorICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAorICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSB7CisgICAgbUlzR2VuZXJpYyA9IGRlc2Muc3RhcnRzV2l0aCgibXBlZzQtZ2VuZXJpYy8iKTsKKworICAgIGlmIChtSXNHZW5lcmljKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZShwYXJhbXMuY19zdHIoKSwgIm1vZGUiLCAmdmFsdWUpKTsKKworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUocGFyYW1zLmNfc3RyKCksICJzaXplTGVuZ3RoIiwgJm1TaXplTGVuZ3RoKSkgeworICAgICAgICAgICAgbVNpemVMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgImluZGV4TGVuZ3RoIiwgJm1JbmRleExlbmd0aCkpIHsKKyAgICAgICAgICAgIG1JbmRleExlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jX3N0cigpLCAiaW5kZXhEZWx0YUxlbmd0aCIsICZtSW5kZXhEZWx0YUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1JbmRleERlbHRhTGVuZ3RoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNfc3RyKCksICJDVFNEZWx0YUxlbmd0aCIsICZtQ1RTRGVsdGFMZW5ndGgpKSB7CisgICAgICAgICAgICBtQ1RTRGVsdGFMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgIkRUU0RlbHRhTGVuZ3RoIiwgJm1EVFNEZWx0YUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1EVFNEZWx0YUxlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCB4OworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jX3N0cigpLCAicmFuZG9tQWNjZXNzSW5kaWNhdGlvbiIsICZ4KSkgeworICAgICAgICAgICAgbVJhbmRvbUFjY2Vzc0luZGljYXRpb24gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKHggPT0gMCB8fCB4ID09IDEpOworICAgICAgICAgICAgbVJhbmRvbUFjY2Vzc0luZGljYXRpb24gPSAoeCAhPSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNfc3RyKCksICJzdHJlYW1TdGF0ZUluZGljYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAmbVN0cmVhbVN0YXRlSW5kaWNhdGlvbikpIHsKKyAgICAgICAgICAgIG1TdHJlYW1TdGF0ZUluZGljYXRpb24gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgImF1eGlsaWFyeURhdGFTaXplTGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgJm1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtSGFzQVVIZWFkZXIgPQorICAgICAgICAgICAgbVNpemVMZW5ndGggPiAwCisgICAgICAgICAgICB8fCBtSW5kZXhMZW5ndGggPiAwCisgICAgICAgICAgICB8fCBtSW5kZXhEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1DVFNEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1EVFNEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1SYW5kb21BY2Nlc3NJbmRpY2F0aW9uCisgICAgICAgICAgICB8fCBtU3RyZWFtU3RhdGVJbmRpY2F0aW9uID4gMDsKKyAgICB9Cit9CisKK0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXI6On5BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyKCkgeworfQorCitzdHJ1Y3QgQVVIZWFkZXIgeworICAgIHVuc2lnbmVkIG1TaXplOworICAgIHVuc2lnbmVkIG1TZXJpYWw7Cit9OworCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjphZGRQYWNrZXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworCisgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmICghbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQgPSB0cnVlOworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICBMT0dWKCJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIik7CisKKyAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgaWYgKG1QYWNrZXRzLnNpemUoKSA+IDAgJiYgcnRwVGltZSAhPSBtQWNjZXNzVW5pdFJUUFRpbWUpIHsKKyAgICAgICAgc3VibWl0QWNjZXNzVW5pdCgpOworICAgIH0KKyAgICBtQWNjZXNzVW5pdFJUUFRpbWUgPSBydHBUaW1lOworCisgICAgaWYgKCFtSXNHZW5lcmljKSB7CisgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBDSEVDS19HRShidWZmZXItPnNpemUoKSwgMnUpOworICAgICAgICB1bnNpZ25lZCBBVV9oZWFkZXJzX2xlbmd0aCA9IFUxNl9BVChidWZmZXItPmRhdGEoKSk7ICAvLyBpbiBiaXRzCisKKyAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDgpOworCisgICAgICAgIExpc3Q8QVVIZWFkZXI+IGhlYWRlcnM7CisKKyAgICAgICAgQUJpdFJlYWRlciBiaXRzKGJ1ZmZlci0+ZGF0YSgpICsgMiwgYnVmZmVyLT5zaXplKCkgLSAyKTsKKyAgICAgICAgdW5zaWduZWQgbnVtQml0c0xlZnQgPSBBVV9oZWFkZXJzX2xlbmd0aDsKKworICAgICAgICB1bnNpZ25lZCBBVV9zZXJpYWwgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAobnVtQml0c0xlZnQgPCBtU2l6ZUxlbmd0aCkgeyBicmVhazsgfQorCisgICAgICAgICAgICB1bnNpZ25lZCBBVV9zaXplID0gYml0cy5nZXRCaXRzKG1TaXplTGVuZ3RoKTsKKyAgICAgICAgICAgIG51bUJpdHNMZWZ0IC09IG1TaXplTGVuZ3RoOworCisgICAgICAgICAgICBzaXplX3QgbiA9IGhlYWRlcnMuZW1wdHkoKSA/IG1JbmRleExlbmd0aCA6IG1JbmRleERlbHRhTGVuZ3RoOworICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgbikgeyBicmVhazsgfQorCisgICAgICAgICAgICB1bnNpZ25lZCBBVV9pbmRleCA9IGJpdHMuZ2V0Qml0cyhuKTsKKyAgICAgICAgICAgIG51bUJpdHNMZWZ0IC09IG47CisKKyAgICAgICAgICAgIGlmIChoZWFkZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBVV9zZXJpYWwgPSBBVV9pbmRleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVVfc2VyaWFsICs9IDEgKyBBVV9pbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DVFNEZWx0YUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtQml0c0xlZnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtLW51bUJpdHNMZWZ0OworICAgICAgICAgICAgICAgIGlmIChiaXRzLmdldEJpdHMoMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgbUNUU0RlbHRhTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiaXRzLnNraXBCaXRzKG1DVFNEZWx0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG51bUJpdHNMZWZ0IC09IG1DVFNEZWx0YUxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRFRTRGVsdGFMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1udW1CaXRzTGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoYml0cy5nZXRCaXRzKDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1CaXRzTGVmdCA8IG1EVFNEZWx0YUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYml0cy5za2lwQml0cyhtRFRTRGVsdGFMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBudW1CaXRzTGVmdCAtPSBtRFRTRGVsdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVJhbmRvbUFjY2Vzc0luZGljYXRpb24pIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtQml0c0xlZnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEpOworICAgICAgICAgICAgICAgIC0tbnVtQml0c0xlZnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3RyZWFtU3RhdGVJbmRpY2F0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChudW1CaXRzTGVmdCA8IG1TdHJlYW1TdGF0ZUluZGljYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMobVN0cmVhbVN0YXRlSW5kaWNhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFVSGVhZGVyIGhlYWRlcjsKKyAgICAgICAgICAgIGhlYWRlci5tU2l6ZSA9IEFVX3NpemU7CisgICAgICAgICAgICBoZWFkZXIubVNlcmlhbCA9IEFVX3NlcmlhbDsKKyAgICAgICAgICAgIGhlYWRlcnMucHVzaF9iYWNrKGhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMiArIChBVV9oZWFkZXJzX2xlbmd0aCArIDcpIC8gODsKKworICAgICAgICBpZiAobUF1eGlsaWFyeURhdGFTaXplTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgQUJpdFJlYWRlciBiaXRzKGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGF1eFNpemUgPSBiaXRzLmdldEJpdHMobUF1eGlsaWFyeURhdGFTaXplTGVuZ3RoKTsKKworICAgICAgICAgICAgb2Zmc2V0ICs9IChtQXV4aWxpYXJ5RGF0YVNpemVMZW5ndGggKyBhdXhTaXplICsgNykgLyA4OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChMaXN0PEFVSGVhZGVyPjo6aXRlcmF0b3IgaXQgPSBoZWFkZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gaGVhZGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3QgQVVIZWFkZXIgJmhlYWRlciA9ICppdDsKKworICAgICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgaGVhZGVyLm1TaXplLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihoZWFkZXIubVNpemUpOworICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGhlYWRlci5tU2l6ZSk7CisKKyAgICAgICAgICAgIG9mZnNldCArPSBoZWFkZXIubVNpemU7CisKKyAgICAgICAgICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCBidWZmZXIpOworICAgICAgICAgICAgbVBhY2tldHMucHVzaF9iYWNrKGFjY2Vzc1VuaXQpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEob2Zmc2V0LCBidWZmZXItPnNpemUoKSk7CisgICAgfQorCisgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgeworICAgIENIRUNLKCFtUGFja2V0cy5lbXB0eSgpKTsKKworICAgIExPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglZCBuYWwgdW5pdHMpIiwgbVBhY2tldHMuc2l6ZSgpKTsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1QYWNrZXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtUGFja2V0cy5lbmQoKTsgKytpdCkgeworICAgICAgICB0b3RhbFNpemUgKz0gKCppdCktPnNpemUoKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIodG90YWxTaXplKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtUGFja2V0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVBhY2tldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gKml0OworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBuYWwtPmRhdGEoKSwgbmFsLT5zaXplKCkpOworICAgICAgICBvZmZzZXQgKz0gbmFsLT5zaXplKCk7CisgICAgfQorCisgICAgQ29weVRpbWVzKGFjY2Vzc1VuaXQsICptUGFja2V0cy5iZWdpbigpKTsKKworI2lmIDAKKyAgICBwcmludGYobUFjY2Vzc1VuaXREYW1hZ2VkID8gIlgiIDogIi4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgICAgaWYgKG1BY2Nlc3NVbml0RGFtYWdlZCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkYW1hZ2VkIiwgdHJ1ZSk7CisgICAgfQorCisgICAgbVBhY2tldHMuY2xlYXIoKTsKKyAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSBmYWxzZTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldE9iamVjdCgiYWNjZXNzLXVuaXQiLCBhY2Nlc3NVbml0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6YXNzZW1ibGVNb3JlKAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgQXNzZW1ibHlTdGF0dXMgc3RhdHVzID0gYWRkUGFja2V0KHNvdXJjZSk7CisgICAgaWYgKHN0YXR1cyA9PSBNQUxGT1JNRURfUEFDS0VUKSB7CisgICAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6cGFja2V0TG9zdCgpIHsKKyAgICBDSEVDSyhtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCk7CisgICAgTE9HVigicGFja2V0TG9zdCAoZXhwZWN0ZWQgJWQpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKKworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0YmJjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTVBFRzRfRUxFTV9BU1NFTUJMRVJfSF8KKworI2RlZmluZSBBX01QRUc0X0VMRU1fQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgeworICAgIEFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3QgQVN0cmluZyAmZGVzYywKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgYm9vbCBtSXNHZW5lcmljOworICAgIEFTdHJpbmcgbVBhcmFtczsKKworICAgIHVuc2lnbmVkIG1TaXplTGVuZ3RoOworICAgIHVuc2lnbmVkIG1JbmRleExlbmd0aDsKKyAgICB1bnNpZ25lZCBtSW5kZXhEZWx0YUxlbmd0aDsKKyAgICB1bnNpZ25lZCBtQ1RTRGVsdGFMZW5ndGg7CisgICAgdW5zaWduZWQgbURUU0RlbHRhTGVuZ3RoOworICAgIGJvb2wgbVJhbmRvbUFjY2Vzc0luZGljYXRpb247CisgICAgdW5zaWduZWQgbVN0cmVhbVN0YXRlSW5kaWNhdGlvbjsKKyAgICB1bnNpZ25lZCBtQXV4aWxpYXJ5RGF0YVNpemVMZW5ndGg7CisgICAgYm9vbCBtSGFzQVVIZWFkZXI7CisKKyAgICB1aW50MzJfdCBtQWNjZXNzVW5pdFJUUFRpbWU7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1QYWNrZXRzOworCisgICAgQXNzZW1ibHlTdGF0dXMgYWRkUGFja2V0KGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpOworICAgIHZvaWQgc3VibWl0QWNjZXNzVW5pdCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTVBFRzRfRUxFTV9BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2M4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBUGFja2V0U291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgorCisjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorCisjaW5jbHVkZSAiYXZjX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKworICAgIHNpemVfdCBrZXlMZW4gPSBzdHJsZW4oa2V5KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnMpKSB7CisgICAgICAgICAgICArK3M7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOworCisgICAgICAgIHNpemVfdCBsZW4gPQorICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOworCisgICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgeworICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSBjb2xvblBvcyArIDE7CisgICAgfQorfQorCitzdGF0aWMgc3A8QUJ1ZmZlcj4gZGVjb2RlSGV4KGNvbnN0IEFTdHJpbmcgJnMpIHsKKyAgICBpZiAoKHMuc2l6ZSgpICUgMikgIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaXplX3Qgb3V0TGVuID0gcy5zaXplKCkgLyAyOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7CisgICAgdWludDhfdCAqb3V0ID0gYnVmZmVyLT5kYXRhKCk7CisKKyAgICB1aW50OF90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdhJyArIDEwOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQScgKyAxMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNCkgfCB2YWx1ZTsKKworICAgICAgICBpZiAoaSAmIDEpIHsKKyAgICAgICAgICAgICpvdXQrKyA9IGFjY3VtOworCisgICAgICAgICAgICBhY2N1bSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICAqd2lkdGggPSAwOworICAgICpoZWlnaHQgPSAwOworCisgICAgQVN0cmluZyB2YWw7CisgICAgaWYgKCFHZXRBdHRyaWJ1dGUocGFyYW1zLCAicHJvZmlsZS1sZXZlbC1pZCIsICZ2YWwpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IHByb2ZpbGVMZXZlbElEID0gZGVjb2RlSGV4KHZhbCk7CisgICAgQ0hFQ0socHJvZmlsZUxldmVsSUQgIT0gTlVMTCk7CisgICAgQ0hFQ0tfRVEocHJvZmlsZUxldmVsSUQtPnNpemUoKSwgM3UpOworCisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gcGFyYW1TZXRzOworCisgICAgc2l6ZV90IG51bVNlcVBhcmFtZXRlclNldHMgPSAwOworICAgIHNpemVfdCB0b3RhbFNlcVBhcmFtZXRlclNldFNpemUgPSAwOworICAgIHNpemVfdCBudW1QaWNQYXJhbWV0ZXJTZXRzID0gMDsKKyAgICBzaXplX3QgdG90YWxQaWNQYXJhbWV0ZXJTZXRTaXplID0gMDsKKworICAgIGlmICghR2V0QXR0cmlidXRlKHBhcmFtcywgInNwcm9wLXBhcmFtZXRlci1zZXRzIiwgJnZhbCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNzaXplX3QgY29tbWFQb3MgPSB2YWwuZmluZCgiLCIsIHN0YXJ0KTsKKyAgICAgICAgc2l6ZV90IGVuZCA9IChjb21tYVBvcyA8IDApID8gdmFsLnNpemUoKSA6IGNvbW1hUG9zOworCisgICAgICAgIEFTdHJpbmcgbmFsU3RyaW5nKHZhbCwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gZGVjb2RlQmFzZTY0KG5hbFN0cmluZyk7CisgICAgICAgIENIRUNLKG5hbCAhPSBOVUxMKTsKKyAgICAgICAgQ0hFQ0tfR1QobmFsLT5zaXplKCksIDB1KTsKKyAgICAgICAgQ0hFQ0tfTEUobmFsLT5zaXplKCksIDY1NTM1dSk7CisKKyAgICAgICAgdWludDhfdCBuYWxUeXBlID0gbmFsLT5kYXRhKClbMF0gJiAweDFmOworICAgICAgICBpZiAobnVtU2VxUGFyYW1ldGVyU2V0cyA9PSAwKSB7CisgICAgICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbmFsVHlwZSwgN3UpOworICAgICAgICB9IGVsc2UgaWYgKG51bVBpY1BhcmFtZXRlclNldHMgPiAwKSB7CisgICAgICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbmFsVHlwZSwgOHUpOworICAgICAgICB9CisgICAgICAgIGlmIChuYWxUeXBlID09IDcpIHsKKyAgICAgICAgICAgICsrbnVtU2VxUGFyYW1ldGVyU2V0czsKKyAgICAgICAgICAgIHRvdGFsU2VxUGFyYW1ldGVyU2V0U2l6ZSArPSBuYWwtPnNpemUoKTsKKyAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbmFsVHlwZSwgOHUpOworICAgICAgICAgICAgKytudW1QaWNQYXJhbWV0ZXJTZXRzOworICAgICAgICAgICAgdG90YWxQaWNQYXJhbWV0ZXJTZXRTaXplICs9IG5hbC0+c2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1TZXRzLnB1c2gobmFsKTsKKworICAgICAgICBpZiAoY29tbWFQb3MgPCAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0ID0gY29tbWFQb3MgKyAxOworICAgIH0KKworICAgIENIRUNLX0xUKG51bVNlcVBhcmFtZXRlclNldHMsIDMydSk7CisgICAgQ0hFQ0tfTEUobnVtUGljUGFyYW1ldGVyU2V0cywgMjU1dSk7CisKKyAgICBzaXplX3QgY3NkU2l6ZSA9CisgICAgICAgIDEgKyAzICsgMSArIDEKKyAgICAgICAgKyAyICogbnVtU2VxUGFyYW1ldGVyU2V0cyArIHRvdGFsU2VxUGFyYW1ldGVyU2V0U2l6ZQorICAgICAgICArIDEgKyAyICogbnVtUGljUGFyYW1ldGVyU2V0cyArIHRvdGFsUGljUGFyYW1ldGVyU2V0U2l6ZTsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGNzZFNpemUpOworICAgIHVpbnQ4X3QgKm91dCA9IGNzZC0+ZGF0YSgpOworCisgICAgKm91dCsrID0gMHgwMTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uCisgICAgbWVtY3B5KG91dCwgcHJvZmlsZUxldmVsSUQtPmRhdGEoKSwgMyk7CisgICAgb3V0ICs9IDM7CisgICAgKm91dCsrID0gKDB4M2YgPDwgMikgfCAxOyAgLy8gbGVuZ3RoU2l6ZSA9PSAyIGJ5dGVzCisgICAgKm91dCsrID0gMHhlMCB8IG51bVNlcVBhcmFtZXRlclNldHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlcVBhcmFtZXRlclNldHM7ICsraSkgeworICAgICAgICBzcDxBQnVmZmVyPiBuYWwgPSBwYXJhbVNldHMuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICAqb3V0KysgPSBuYWwtPnNpemUoKSA+PiA4OworICAgICAgICAqb3V0KysgPSBuYWwtPnNpemUoKSAmIDB4ZmY7CisKKyAgICAgICAgbWVtY3B5KG91dCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKKworICAgICAgICBvdXQgKz0gbmFsLT5zaXplKCk7CisKKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgRmluZEFWQ0RpbWVuc2lvbnMobmFsLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIExPR0koImRpbWVuc2lvbnMgJWR4JWQiLCAqd2lkdGgsICpoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgKm91dCsrID0gbnVtUGljUGFyYW1ldGVyU2V0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGljUGFyYW1ldGVyU2V0czsgKytpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9IHBhcmFtU2V0cy5lZGl0SXRlbUF0KGkgKyBudW1TZXFQYXJhbWV0ZXJTZXRzKTsKKworICAgICAgICAqb3V0KysgPSBuYWwtPnNpemUoKSA+PiA4OworICAgICAgICAqb3V0KysgPSBuYWwtPnNpemUoKSAmIDB4ZmY7CisKKyAgICAgICAgbWVtY3B5KG91dCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKKworICAgICAgICBvdXQgKz0gbmFsLT5zaXplKCk7CisgICAgfQorCisgICAgLy8gaGV4ZHVtcChjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworCisgICAgcmV0dXJuIGNzZDsKK30KKworc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IGNoYXIgKnBhcmFtcykgeworICAgIEFTdHJpbmcgdmFsOworICAgIENIRUNLKEdldEF0dHJpYnV0ZShwYXJhbXMsICJjb25maWciLCAmdmFsKSk7CisKKyAgICBzcDxBQnVmZmVyPiBjb25maWcgPSBkZWNvZGVIZXgodmFsKTsKKyAgICBDSEVDSyhjb25maWcgIT0gTlVMTCk7CisgICAgQ0hFQ0tfR0UoY29uZmlnLT5zaXplKCksIDR1KTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBjb25maWctPmRhdGEoKTsKKyAgICB1aW50MzJfdCB4ID0gZGF0YVswXSA8PCAyNCB8IGRhdGFbMV0gPDwgMTYgfCBkYXRhWzJdIDw8IDggfCBkYXRhWzNdOworICAgIHggPSAoeCA+PiAxKSAmIDB4ZmZmZjsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CisgICAgICAgIDB4MDMsIDIyLAorICAgICAgICAweDAwLCAweDAwLCAgICAgLy8gRVNfSUQKKyAgICAgICAgMHgwMCwgICAgICAgICAgIC8vIHN0cmVhbURlcGVuZGVuY2VGbGFnLCBVUkxfRmxhZywgT0NSc3RyZWFtRmxhZworCisgICAgICAgIDB4MDQsIDE3LAorICAgICAgICAweDQwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKyAgICAgICAgMHgwNSwgMiwKKyAgICAgICAgLy8gQXVkaW9TcGVjaWZpY0luZm8gZm9sbG93cworICAgIH07CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplb2Yoa1N0YXRpY0VTRFMpICsgMik7CisgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CisgICAgY3NkLT5kYXRhKClbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPSAoeCA+PiA4KSAmIDB4ZmY7CisgICAgY3NkLT5kYXRhKClbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0geCAmIDB4ZmY7CisKKyAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICByZXR1cm4gY3NkOworfQorCisvLyBGcm9tIG1wZWc0LWdlbmVyaWMgY29uZmlndXJhdGlvbiBkYXRhLgorc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhMihjb25zdCBjaGFyICpwYXJhbXMpIHsKKyAgICBBU3RyaW5nIHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIG9iamVjdFR5cGU7CisgICAgaWYgKEdldEF0dHJpYnV0ZShwYXJhbXMsICJvYmplY3RUeXBlIiwgJnZhbCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IHZhbC5jX3N0cigpOworICAgICAgICBjaGFyICplbmQ7CisgICAgICAgIG9iamVjdFR5cGUgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICAgICAgQ0hFQ0soZW5kID4gcyAmJiAqZW5kID09ICdcMCcpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9iamVjdFR5cGUgPSAweDQwOyAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgfQorCisgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHBhcmFtcywgImNvbmZpZyIsICZ2YWwpKTsKKworICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGRlY29kZUhleCh2YWwpOworICAgIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKKworICAgIC8vIE1ha2Ugc3VyZSBzaXplIGZpdHMgaW50byBhIHNpbmdsZSBieXRlIGFuZCBkb2Vzbid0IGhhdmUgdG8KKyAgICAvLyBiZSBlbmNvZGVkLgorICAgIENIRUNLX0xUKDIwICsgY29uZmlnLT5zaXplKCksIDEyOHUpOworCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGNvbmZpZy0+ZGF0YSgpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKKyAgICAgICAgMHgwMywgMjIsCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAvLyBFU19JRAorICAgICAgICAweDAwLCAgICAgICAgICAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAgICAgMHgwNCwgMTcsCisgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworICAgICAgICAweDA1LCAyLAorICAgICAgICAvLyBBdWRpb1NwZWNpZmljSW5mbyBmb2xsb3dzCisgICAgfTsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKHNpemVvZihrU3RhdGljRVNEUykgKyBjb25maWctPnNpemUoKSk7CisgICAgdWludDhfdCAqZHN0ID0gY3NkLT5kYXRhKCk7CisgICAgKmRzdCsrID0gMHgwMzsKKyAgICAqZHN0KysgPSAyMCArIGNvbmZpZy0+c2l6ZSgpOworICAgICpkc3QrKyA9IDB4MDA7ICAvLyBFU19JRAorICAgICpkc3QrKyA9IDB4MDA7CisgICAgKmRzdCsrID0gMHgwMDsgIC8vIHN0cmVhbURlcGVuZGVuY2VGbGFnLCBVUkxfRmxhZywgT0NSc3RyZWFtRmxhZworICAgICpkc3QrKyA9IDB4MDQ7CisgICAgKmRzdCsrID0gMTUgKyBjb25maWctPnNpemUoKTsKKyAgICAqZHN0KysgPSBvYmplY3RUeXBlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI7ICsraSkgeyAqZHN0KysgPSAweDAwOyB9CisgICAgKmRzdCsrID0gMHgwNTsKKyAgICAqZHN0KysgPSBjb25maWctPnNpemUoKTsKKyAgICBtZW1jcHkoZHN0LCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworCisgICAgLy8gaGV4ZHVtcChjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworCisgICAgcmV0dXJuIGNzZDsKK30KKworc3RhdGljIHNpemVfdCBHZXRTaXplV2lkdGgoc2l6ZV90IHgpIHsKKyAgICBzaXplX3QgbiA9IDE7CisgICAgd2hpbGUgKHggPiAxMjcpIHsKKyAgICAgICAgKytuOworICAgICAgICB4ID4+PSA3OworICAgIH0KKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIHVpbnQ4X3QgKkVuY29kZVNpemUodWludDhfdCAqZHN0LCBzaXplX3QgeCkgeworICAgIHdoaWxlICh4ID4gMTI3KSB7CisgICAgICAgICpkc3QrKyA9ICh4ICYgMHg3ZikgfCAweDgwOworICAgICAgICB4ID4+PSA3OworICAgIH0KKyAgICAqZHN0KysgPSB4OworICAgIHJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmNvbmZpZywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgICp3aWR0aCA9IDA7CisgICAgKmhlaWdodCA9IDA7CisKKyAgICBjb25zdCB1aW50OF90ICpwdHIgPSBjb25maWctPmRhdGEoKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBib29sIGZvdW5kVk9MID0gZmFsc2U7CisgICAgd2hpbGUgKG9mZnNldCArIDMgPCBjb25maWctPnNpemUoKSkgeworICAgICAgICBpZiAobWVtY21wKCJceDAwXHgwMFx4MDEiLCAmcHRyW29mZnNldF0sIDMpCisgICAgICAgICAgICAgICAgfHwgKHB0cltvZmZzZXQgKyAzXSAmIDB4ZjApICE9IDB4MjApIHsKKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmb3VuZFZPTCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghZm91bmRWT0wpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYnIoJnB0cltvZmZzZXQgKyA0XSwgY29uZmlnLT5zaXplKCkgLSBvZmZzZXQgLSA0KTsKKyAgICBici5za2lwQml0cygxKTsgIC8vIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbAorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSBici5nZXRCaXRzKDgpOworCisgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKKyAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKKworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZDsKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHk7CisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKKyAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKKyAgICB9CisgICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOworICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgeworICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl93aWR0aAorICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl9oZWlnaHQKKyAgICB9CisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMKKyAgICAgICAgYnIuc2tpcEJpdHMoMik7ICAvLyBjaHJvbWFfZm9ybWF0CisgICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gbG93X2RlbGF5CisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2YnZfcGFyYW1ldGVycworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSBici5nZXRCaXRzKDIpOworICAgIENIRUNLX0VRKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSwgMHgwMHUgLyogcmVjdGFuZ3VsYXIgKi8pOworCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSBici5nZXRCaXRzKDE2KTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKworICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmaXhlZF92b3BfcmF0ZQorICAgICAgICAvLyByYW5nZSBbMC4udm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24pCisKKyAgICAgICAgLy8gdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24KKyAgICAgICAgLy8gMiA9PiAwLi4xLCAxIGJpdAorICAgICAgICAvLyAzID0+IDAuLjIsIDIgYml0cworICAgICAgICAvLyA0ID0+IDAuLjMsIDIgYml0cworICAgICAgICAvLyA1ID0+IDAuLjQsIDMgYml0cworICAgICAgICAvLyAuLi4KKworICAgICAgICBDSEVDS19HVCh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiwgMHUpOworICAgICAgICAtLXZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCisgICAgICAgIHVuc2lnbmVkIG51bUJpdHMgPSAwOworICAgICAgICB3aGlsZSAodm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwKSB7CisgICAgICAgICAgICArK251bUJpdHM7CisgICAgICAgICAgICB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGJyLnNraXBCaXRzKG51bUJpdHMpOyAgLy8gZml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50CisgICAgfQorCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorCisgICAgdW5zaWduZWQgaW50ZXJsYWNlZCA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CisgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CisKKyAgICBMT0dJKCJWT0wgZGltZW5zaW9ucyA9ICVkeCVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzcDxBQnVmZmVyPiBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICAqd2lkdGggPSAwOworICAgICpoZWlnaHQgPSAwOworCisgICAgQVN0cmluZyB2YWw7CisgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHBhcmFtcywgImNvbmZpZyIsICZ2YWwpKTsKKworICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGRlY29kZUhleCh2YWwpOworICAgIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKKworICAgIGlmICghRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKGNvbmZpZywgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IGxlbjEgPSBjb25maWctPnNpemUoKSArIEdldFNpemVXaWR0aChjb25maWctPnNpemUoKSkgKyAxOworICAgIHNpemVfdCBsZW4yID0gbGVuMSArIEdldFNpemVXaWR0aChsZW4xKSArIDEgKyAxMzsKKyAgICBzaXplX3QgbGVuMyA9IGxlbjIgKyBHZXRTaXplV2lkdGgobGVuMikgKyAxICsgMzsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGxlbjMpOworICAgIHVpbnQ4X3QgKmRzdCA9IGNzZC0+ZGF0YSgpOworICAgICpkc3QrKyA9IDB4MDM7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjIgKyAzKTsKKyAgICAqZHN0KysgPSAweDAwOyAgLy8gRVNfSUQKKyAgICAqZHN0KysgPSAweDAwOworICAgICpkc3QrKyA9IDB4MDA7ICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICpkc3QrKyA9IDB4MDQ7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjEgKyAxMyk7CisgICAgKmRzdCsrID0gMHgwMTsgIC8vIFZpZGVvIElTTy9JRUMgMTQ0OTYtMiBTaW1wbGUgUHJvZmlsZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICAqZHN0KysgPSAweDAwOworICAgIH0KKworICAgICpkc3QrKyA9IDB4MDU7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICBtZW1jcHkoZHN0LCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworICAgIGRzdCArPSBjb25maWctPnNpemUoKTsKKworICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBjc2Q7Cit9CisKK3N0YXRpYyBib29sIEdldENsb2NrUmF0ZShjb25zdCBBU3RyaW5nICZkZXNjLCB1aW50MzJfdCAqY2xvY2tSYXRlKSB7CisgICAgc3NpemVfdCBzbGFzaFBvcyA9IGRlc2MuZmluZCgiLyIpOworICAgIGlmIChzbGFzaFBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnMgPSBkZXNjLmNfc3RyKCkgKyBzbGFzaFBvcyArIDE7CisKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgbG9uZyB4ID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisKKyAgICBpZiAoZW5kID09IHMgfHwgKCplbmQgIT0gJ1wwJyAmJiAqZW5kICE9ICcvJykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpjbG9ja1JhdGUgPSB4OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0FQYWNrZXRTb3VyY2U6OkFQYWNrZXRTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4KQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1Gb3JtYXQobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1FT1NSZXN1bHQoT0spLAorICAgICAgbUlzQVZDKGZhbHNlKSwKKyAgICAgIG1TY2FuRm9ySURSKHRydWUpLAorICAgICAgbVJUUFRpbWVCYXNlKDApLAorICAgICAgbU5vcm1hbFBsYXlUaW1lQmFzZVVzKDApLAorICAgICAgbUxhc3ROb3JtYWxQbGF5VGltZVVzKDApIHsKKyAgICB1bnNpZ25lZCBsb25nIFBUOworICAgIEFTdHJpbmcgZGVzYzsKKyAgICBBU3RyaW5nIHBhcmFtczsKKyAgICBzZXNzaW9uRGVzYy0+Z2V0Rm9ybWF0VHlwZShpbmRleCwgJlBULCAmZGVzYywgJnBhcmFtcyk7CisKKyAgICBDSEVDSyhHZXRDbG9ja1JhdGUoZGVzYywgJm1DbG9ja1JhdGUpKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldER1cmF0aW9uVXMoJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCA2MCAqIDYwICogMTAwMDAwMGxsKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7CisgICAgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjQvIiwgNSkpIHsKKyAgICAgICAgbUlzQVZDID0gdHJ1ZTsKKworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmICghc2Vzc2lvbkRlc2MtPmdldERpbWVuc2lvbnMoaW5kZXgsIFBULCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICAgICB3aWR0aCA9IC0xOworICAgICAgICAgICAgaGVpZ2h0ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGVuY1dpZHRoLCBlbmNIZWlnaHQ7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjU3BlY2lmaWNEYXRhID0KKyAgICAgICAgICAgIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShwYXJhbXMuY19zdHIoKSwgJmVuY1dpZHRoLCAmZW5jSGVpZ2h0KTsKKworICAgICAgICBpZiAoY29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHdpZHRoL2hlaWdodCBnaXZlbiBpbiB0aGUgc2RwLCB1c2UgdGhlIGRpbWVuc2lvbnMKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0ZWQgZnJvbSB0aGUgZmlyc3Qgc2VxdWVuY2UgcGFyYW1ldGVyIHNldC4KKyAgICAgICAgICAgICAgICB3aWR0aCA9IGVuY1dpZHRoOworICAgICAgICAgICAgICAgIGhlaWdodCA9IGVuY0hlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIDAsCisgICAgICAgICAgICAgICAgICAgIGNvZGVjU3BlY2lmaWNEYXRhLT5kYXRhKCksIGNvZGVjU3BlY2lmaWNEYXRhLT5zaXplKCkpOworICAgICAgICB9IGVsc2UgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjYzLTIwMDAvIiwgMTApCisgICAgICAgICAgICB8fCAhc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjYzLTE5OTgvIiwgMTApKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmICghc2Vzc2lvbkRlc2MtPmdldERpbWVuc2lvbnMoaW5kZXgsIFBULCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIk1QNEEtTEFUTS8iLCAxMCkpIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBudW1DaGFubmVsczsKKyAgICAgICAgQVNlc3Npb25EZXNjcmlwdGlvbjo6UGFyc2VGb3JtYXREZXNjKAorICAgICAgICAgICAgICAgIGRlc2MuY19zdHIoKSwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscyk7CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNTcGVjaWZpY0RhdGEgPQorICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKHBhcmFtcy5jX3N0cigpKTsKKworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKAorICAgICAgICAgICAgICAgIGtLZXlFU0RTLCAwLAorICAgICAgICAgICAgICAgIGNvZGVjU3BlY2lmaWNEYXRhLT5kYXRhKCksIGNvZGVjU3BlY2lmaWNEYXRhLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiQU1SLyIsIDQpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworCisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb246OlBhcnNlRm9ybWF0RGVzYygKKyAgICAgICAgICAgICAgICBkZXNjLmNfc3RyKCksICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworCisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IDgwMDAgfHwgbnVtQ2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJBTVItV0IvIiwgNykpIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CisKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBudW1DaGFubmVsczsKKyAgICAgICAgQVNlc3Npb25EZXNjcmlwdGlvbjo6UGFyc2VGb3JtYXREZXNjKAorICAgICAgICAgICAgICAgIGRlc2MuY19zdHIoKSwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscyk7CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gMTYwMDAgfHwgbnVtQ2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJNUDRWLUVTLyIsIDgpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoIXNlc3Npb25EZXNjLT5nZXREaW1lbnNpb25zKGluZGV4LCBQVCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgd2lkdGggPSAtMTsKKyAgICAgICAgICAgIGhlaWdodCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNXaWR0aCwgZW5jSGVpZ2h0OworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1NwZWNpZmljRGF0YSA9CisgICAgICAgICAgICBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgJmVuY1dpZHRoLCAmZW5jSGVpZ2h0KTsKKworICAgICAgICBpZiAoY29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIDAsCisgICAgICAgICAgICAgICAgICAgIGNvZGVjU3BlY2lmaWNEYXRhLT5kYXRhKCksIGNvZGVjU3BlY2lmaWNEYXRhLT5zaXplKCkpOworCisgICAgICAgICAgICBpZiAod2lkdGggPCAwKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBlbmNXaWR0aDsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBlbmNIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPCAwKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIm1wZWc0LWdlbmVyaWMvIiwgMTQpKSB7CisgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICBpZiAoIUdldEF0dHJpYnV0ZShwYXJhbXMuY19zdHIoKSwgIm1vZGUiLCAmdmFsKQorICAgICAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKHZhbC5jX3N0cigpLCAiQUFDLWxiciIpCisgICAgICAgICAgICAgICAgICAgICYmIHN0cmNhc2VjbXAodmFsLmNfc3RyKCksICJBQUMtaGJyIikpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzOworICAgICAgICBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpQYXJzZUZvcm1hdERlc2MoCisgICAgICAgICAgICAgICAgZGVzYy5jX3N0cigpLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzKTsKKworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1NwZWNpZmljRGF0YSA9CisgICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEyKHBhcmFtcy5jX3N0cigpKTsKKworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKAorICAgICAgICAgICAgICAgIGtLZXlFU0RTLCAwLAorICAgICAgICAgICAgICAgIGNvZGVjU3BlY2lmaWNEYXRhLT5kYXRhKCksIGNvZGVjU3BlY2lmaWNEYXRhLT5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9Cit9CisKK0FQYWNrZXRTb3VyY2U6On5BUGFja2V0U291cmNlKCkgeworfQorCitzdGF0dXNfdCBBUGFja2V0U291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IEFQYWNrZXRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFQYWNrZXRTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQVBhY2tldFNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtRm9ybWF0OworfQorCitzdGF0dXNfdCBBUGFja2V0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKikgeworICAgICpvdXQgPSBOVUxMOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICB3aGlsZSAobUVPU1Jlc3VsdCA9PSBPSyAmJiBtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOworCisgICAgICAgIHVwZGF0ZU5vcm1hbFBsYXlUaW1lX2woYnVmZmVyKTsKKworICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICAgICBtZW1jcHkobWVkaWFCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgKm91dCA9IG1lZGlhQnVmZmVyOworCisgICAgICAgIG1CdWZmZXJzLmVyYXNlKG1CdWZmZXJzLmJlZ2luKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIG1FT1NSZXN1bHQ7Cit9CisKK3ZvaWQgQVBhY2tldFNvdXJjZTo6dXBkYXRlTm9ybWFsUGxheVRpbWVfbChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIG1MYXN0Tm9ybWFsUGxheVRpbWVVcyA9CisgICAgICAgICgoKGRvdWJsZSlydHBUaW1lIC0gKGRvdWJsZSltUlRQVGltZUJhc2UpIC8gbUNsb2NrUmF0ZSkKKyAgICAgICAgICAgICogMTAwMDAwMGxsCisgICAgICAgICAgICArIG1Ob3JtYWxQbGF5VGltZUJhc2VVczsKK30KKwordm9pZCBBUGFja2V0U291cmNlOjpxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDMyX3QgZGFtYWdlZDsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKSAmJiBkYW1hZ2VkKSB7CisgICAgICAgIExPR1YoImRpc2NhcmRpbmcgZGFtYWdlZCBBVSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1TY2FuRm9ySURSICYmIG1Jc0FWQykgeworICAgICAgICAvLyBUaGlzIHByZXR0eSBwaWVjZSBvZiBjb2RlIGVuc3VyZXMgdGhhdCB0aGUgZmlyc3QgYWNjZXNzIHVuaXQKKyAgICAgICAgLy8gZmVkIHRvIHRoZSBkZWNvZGVyIGFmdGVyIHN0cmVhbS1zdGFydCBvciBzZWVrIGlzIGd1YXJhbnRlZWQgdG8KKyAgICAgICAgLy8gYmUgYW4gSURSIGZyYW1lLiBUaGlzIGlzIHRvIHdvcmthcm91bmQgbGltaXRhdGlvbnMgb2YgYSBjZXJ0YWluCisgICAgICAgIC8vIGhhcmR3YXJlIGguMjY0IGRlY29kZXIgdGhhdCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBjYXNlLgorCisgICAgICAgIGlmICghSXNJRFIoYnVmZmVyKSkgeworICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgQVUgd2hpbGUgc2Nhbm5pbmcgZm9yIG5leHQgSURSIGZyYW1lLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNjYW5Gb3JJRFIgPSBmYWxzZTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQVBhY2tldFNvdXJjZTo6c2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCkgeworICAgIENIRUNLKHJlc3VsdCAhPSBPSyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1FT1NSZXN1bHQgPSByZXN1bHQ7CisgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBBUGFja2V0U291cmNlOjpmbHVzaFF1ZXVlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIG1TY2FuRm9ySURSID0gdHJ1ZTsKK30KKworaW50NjRfdCBBUGFja2V0U291cmNlOjpnZXROb3JtYWxQbGF5VGltZVVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1MYXN0Tm9ybWFsUGxheVRpbWVVczsKK30KKwordm9pZCBBUGFja2V0U291cmNlOjpzZXROb3JtYWxQbGF5VGltZU1hcHBpbmcoCisgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3Qgbm9ybWFsUGxheVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtUlRQVGltZUJhc2UgPSBydHBUaW1lOworICAgIG1Ob3JtYWxQbGF5VGltZUJhc2VVcyA9IG5vcm1hbFBsYXlUaW1lVXM7Cit9CisKK2ludDY0X3QgQVBhY2tldFNvdXJjZTo6Z2V0UXVldWVEdXJhdGlvblVzKGJvb2wgKmVvcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqZW9zID0gKG1FT1NSZXN1bHQgIT0gT0spOworCisgICAgaWYgKG1CdWZmZXJzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gZmlyc3QgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBsYXN0ID0gKi0tbUJ1ZmZlcnMuZW5kKCk7CisKKyAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgIENIRUNLKGZpcnN0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmZpcnN0VGltZVVzKSk7CisKKyAgICBpbnQ2NF90IGxhc3RUaW1lVXM7CisgICAgQ0hFQ0sobGFzdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0VGltZVVzKSk7CisKKyAgICBpZiAobGFzdFRpbWVVcyA8IGZpcnN0VGltZVVzKSB7CisgICAgICAgIExPR0UoIkh1aD8gVGltZSBtb3ZpbmcgYmFja3dhcmRzPyAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgZmlyc3RUaW1lVXMsIGxhc3RUaW1lVXMpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBsYXN0VGltZVVzIC0gZmlyc3RUaW1lVXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzdmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1BBQ0tFVF9TT1VSQ0VfSF8KKworI2RlZmluZSBBX1BBQ0tFVF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQVNlc3Npb25EZXNjcmlwdGlvbjsKKworc3RydWN0IEFQYWNrZXRTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIEFQYWNrZXRTb3VyY2UoY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJnNlc3Npb25EZXNjLCBzaXplX3QgaW5kZXgpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgcmVzdWx0KTsKKworICAgIHZvaWQgZmx1c2hRdWV1ZSgpOworCisgICAgaW50NjRfdCBnZXROb3JtYWxQbGF5VGltZVVzKCk7CisKKyAgICB2b2lkIHNldE5vcm1hbFBsYXlUaW1lTWFwcGluZygKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3Qgbm9ybWFsUGxheVRpbWVVcyk7CisKKyAgICBpbnQ2NF90IGdldFF1ZXVlRHVyYXRpb25Vcyhib29sICplb3MpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVBhY2tldFNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKworICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtQnVmZmVyczsKKyAgICBzdGF0dXNfdCBtRU9TUmVzdWx0OworCisgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtU2NhbkZvcklEUjsKKworICAgIHVpbnQzMl90IG1DbG9ja1JhdGU7CisKKyAgICB1aW50MzJfdCBtUlRQVGltZUJhc2U7CisgICAgaW50NjRfdCBtTm9ybWFsUGxheVRpbWVCYXNlVXM7CisKKyAgICBpbnQ2NF90IG1MYXN0Tm9ybWFsUGxheVRpbWVVczsKKworICAgIHZvaWQgdXBkYXRlTm9ybWFsUGxheVRpbWVfbChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFQYWNrZXRTb3VyY2UpOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfUEFDS0VUX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMmIzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwbGw7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFSVFBBc3NlbWJsZXIoKQorICAgIDogbUZpcnN0RmFpbHVyZVRpbWVVcygtMSkgeworfQorCit2b2lkIEFSVFBBc3NlbWJsZXI6Om9uUGFja2V0UmVjZWl2ZWQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1czsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN0YXR1cyA9IGFzc2VtYmxlTW9yZShzb3VyY2UpOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSKSB7CisgICAgICAgICAgICBpZiAobUZpcnN0RmFpbHVyZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldE5vd1VzKCkgLSBtRmlyc3RGYWlsdXJlVGltZVVzID4gMTAwMDBsbCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RGYWlsdXJlVGltZVVzID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTE9HKFZFUkJPU0UpIDw8ICJ3YWl0ZWQgdG9vIGxvbmcgZm9yIHBhY2tldC4iOworICAgICAgICAgICAgICAgICAgICBwYWNrZXRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZpcnN0RmFpbHVyZVRpbWVVcyA9IGdldE5vd1VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GaXJzdEZhaWx1cmVUaW1lVXMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEFSVFBBc3NlbWJsZXI6OkNvcHlUaW1lcyhjb25zdCBzcDxBQnVmZmVyPiAmdG8sIGNvbnN0IHNwPEFCdWZmZXI+ICZmcm9tKSB7CisgICAgdWludDY0X3QgbnRwVGltZTsKKyAgICBDSEVDSyhmcm9tLT5tZXRhKCktPmZpbmRJbnQ2NCgibnRwLXRpbWUiLCAoaW50NjRfdCAqKSZudHBUaW1lKSk7CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGZyb20tPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIHRvLT5tZXRhKCktPnNldEludDY0KCJudHAtdGltZSIsIG50cFRpbWUpOworICAgIHRvLT5tZXRhKCktPnNldEludDMyKCJydHAtdGltZSIsIHJ0cFRpbWUpOworCisgICAgLy8gQ29weSB0aGUgc2VxIG51bWJlci4KKyAgICB0by0+c2V0SW50MzJEYXRhKGZyb20tPmludDMyRGF0YSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYTE4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfUlRQX0FTU0VNQkxFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBUlRQU291cmNlOworCitzdHJ1Y3QgQVJUUEFzc2VtYmxlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIEFzc2VtYmx5U3RhdHVzIHsKKyAgICAgICAgTUFMRk9STUVEX1BBQ0tFVCwKKyAgICAgICAgV1JPTkdfU0VRVUVOQ0VfTlVNQkVSLAorICAgICAgICBOT1RfRU5PVUdIX0RBVEEsCisgICAgICAgIE9LCisgICAgfTsKKworICAgIEFSVFBBc3NlbWJsZXIoKTsKKworICAgIHZvaWQgb25QYWNrZXRSZWNlaXZlZChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgQXNzZW1ibHlTdGF0dXMgYXNzZW1ibGVNb3JlKGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpID0gMDsKKworICAgIHN0YXRpYyB2b2lkIENvcHlUaW1lcyhjb25zdCBzcDxBQnVmZmVyPiAmdG8sIGNvbnN0IHNwPEFCdWZmZXI+ICZmcm9tKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1GaXJzdEZhaWx1cmVUaW1lVXM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWVhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDY3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVJUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOworCitzdGF0aWMgdWludDE2X3QgdTE2YXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworfQorCitzdGF0aWMgdWludDMyX3QgdTMyYXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiB1MTZhdChkYXRhKSA8PCAxNiB8IHUxNmF0KCZkYXRhWzJdKTsKK30KKworc3RhdGljIHVpbnQ2NF90IHU2NGF0KGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICByZXR1cm4gKHVpbnQ2NF90KSh1MzJhdChkYXRhKSkgPDwgMzIgfCB1MzJhdCgmZGF0YVs0XSk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgaW50NjRfdCBBUlRQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBsbDsKKworc3RydWN0IEFSVFBDb25uZWN0aW9uOjpTdHJlYW1JbmZvIHsKKyAgICBpbnQgbVJUUFNvY2tldDsKKyAgICBpbnQgbVJUQ1BTb2NrZXQ7CisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gbVNlc3Npb25EZXNjOworICAgIHNpemVfdCBtSW5kZXg7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPEFSVFBTb3VyY2U+ID4gbVNvdXJjZXM7CisKKyAgICBpbnQ2NF90IG1OdW1SVENQUGFja2V0c1JlY2VpdmVkOworICAgIGludDY0X3QgbU51bVJUUFBhY2tldHNSZWNlaXZlZDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZVJUQ1BBZGRyOworCisgICAgYm9vbCBtSXNJbmplY3RlZDsKK307CisKK0FSVFBDb25uZWN0aW9uOjpBUlRQQ29ubmVjdGlvbih1aW50MzJfdCBmbGFncykKKyAgICA6IG1GbGFncyhmbGFncyksCisgICAgICBtUG9sbEV2ZW50UGVuZGluZyhmYWxzZSksCisgICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzKC0xKSB7Cit9CisKK0FSVFBDb25uZWN0aW9uOjp+QVJUUENvbm5lY3Rpb24oKSB7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OmFkZFN0cmVhbSgKKyAgICAgICAgaW50IHJ0cFNvY2tldCwgaW50IHJ0Y3BTb2NrZXQsCisgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywKKyAgICAgICAgc2l6ZV90IGluZGV4LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgYm9vbCBpbmplY3RlZCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBZGRTdHJlYW0sIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoInJ0cC1zb2NrZXQiLCBydHBTb2NrZXQpOworICAgIG1zZy0+c2V0SW50MzIoInJ0Y3Atc29ja2V0IiwgcnRjcFNvY2tldCk7CisgICAgbXNnLT5zZXRPYmplY3QoInNlc3Npb24tZGVzYyIsIHNlc3Npb25EZXNjKTsKKyAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOworICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKKyAgICBtc2ctPnNldEludDMyKCJpbmplY3RlZCIsIGluamVjdGVkKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6cmVtb3ZlU3RyZWFtKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CisgICAgbXNnLT5zZXRJbnQzMigicnRjcC1zb2NrZXQiLCBydGNwU29ja2V0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdGljIHZvaWQgYnVtcFNvY2tldEJ1ZmZlclNpemUoaW50IHMpIHsKKyAgICBpbnQgc2l6ZSA9IDI1NiAqIDEwMjQ7CisgICAgQ0hFQ0tfRVEoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZzaXplLCBzaXplb2Yoc2l6ZSkpLCAwKTsKK30KKworLy8gc3RhdGljCit2b2lkIEFSVFBDb25uZWN0aW9uOjpNYWtlUG9ydFBhaXIoCisgICAgICAgIGludCAqcnRwU29ja2V0LCBpbnQgKnJ0Y3BTb2NrZXQsIHVuc2lnbmVkICpydHBQb3J0KSB7CisgICAgKnJ0cFNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRSgqcnRwU29ja2V0LCAwKTsKKworICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydHBTb2NrZXQpOworCisgICAgKnJ0Y3BTb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UoKnJ0Y3BTb2NrZXQsIDApOworCisgICAgYnVtcFNvY2tldEJ1ZmZlclNpemUoKnJ0Y3BTb2NrZXQpOworCisgICAgdW5zaWduZWQgc3RhcnQgPSAocmFuZCgpICogMTAwMCkvIFJBTkRfTUFYICsgMTU1NTA7CisgICAgc3RhcnQgJj0gfjE7CisKKyAgICBmb3IgKHVuc2lnbmVkIHBvcnQgPSBzdGFydDsgcG9ydCA8IDY1NTM2OyBwb3J0ICs9IDIpIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOworICAgICAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworICAgICAgICBpZiAoYmluZCgqcnRwU29ja2V0LAorICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0ICsgMSk7CisKKyAgICAgICAgaWYgKGJpbmQoKnJ0Y3BTb2NrZXQsCisgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKSB7CisgICAgICAgICAgICAqcnRwUG9ydCA9IHBvcnQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUUkVTUEFTUygpOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFkZFN0cmVhbToKKyAgICAgICAgeworICAgICAgICAgICAgb25BZGRTdHJlYW0obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbW92ZVN0cmVhbToKKyAgICAgICAgeworICAgICAgICAgICAgb25SZW1vdmVTdHJlYW0obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBvbGxTdHJlYW1zOgorICAgICAgICB7CisgICAgICAgICAgICBvblBvbGxTdHJlYW1zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbmplY3RQYWNrZXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uSW5qZWN0UGFja2V0KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGYWtlVGltZXN0YW1wczoKKyAgICAgICAgeworICAgICAgICAgICAgb25GYWtlVGltZXN0YW1wcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246Om9uQWRkU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbVN0cmVhbXMucHVzaF9iYWNrKFN0cmVhbUluZm8oKSk7CisgICAgU3RyZWFtSW5mbyAqaW5mbyA9ICYqLS1tU3RyZWFtcy5lbmQoKTsKKworICAgIGludDMyX3QgczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRwLXNvY2tldCIsICZzKSk7CisgICAgaW5mby0+bVJUUFNvY2tldCA9IHM7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3Atc29ja2V0IiwgJnMpKTsKKyAgICBpbmZvLT5tUlRDUFNvY2tldCA9IHM7CisKKyAgICBpbnQzMl90IGluamVjdGVkOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpbmplY3RlZCIsICZpbmplY3RlZCkpOworCisgICAgaW5mby0+bUlzSW5qZWN0ZWQgPSBpbmplY3RlZDsKKworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNlc3Npb24tZGVzYyIsICZvYmopKTsKKyAgICBpbmZvLT5tU2Vzc2lvbkRlc2MgPSBzdGF0aWNfY2FzdDxBU2Vzc2lvbkRlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CisKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJpbmRleCIsICZpbmZvLT5tSW5kZXgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJub3RpZnkiLCAmaW5mby0+bU5vdGlmeU1zZykpOworCisgICAgaW5mby0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPSAwOworICAgIGluZm8tPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQgPSAwOworICAgIG1lbXNldCgmaW5mby0+bVJlbW90ZVJUQ1BBZGRyLCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyKSk7CisKKyAgICBpZiAoIWluamVjdGVkKSB7CisgICAgICAgIHBvc3RQb2xsRXZlbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246Om9uUmVtb3ZlU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBydHBTb2NrZXQsIHJ0Y3BTb2NrZXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC1zb2NrZXQiLCAmcnRwU29ja2V0KSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3Atc29ja2V0IiwgJnJ0Y3BTb2NrZXQpKTsKKworICAgIExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVN0cmVhbXMuZW5kKCkKKyAgICAgICAgICAgJiYgKGl0LT5tUlRQU29ja2V0ICE9IHJ0cFNvY2tldCB8fCBpdC0+bVJUQ1BTb2NrZXQgIT0gcnRjcFNvY2tldCkpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisKKyAgICBpZiAoaXQgPT0gbVN0cmVhbXMuZW5kKCkpIHsKKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBtU3RyZWFtcy5lcmFzZShpdCk7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OnBvc3RQb2xsRXZlbnQoKSB7CisgICAgaWYgKG1Qb2xsRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbFN0cmVhbXMsIGlkKCkpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgbVBvbGxFdmVudFBlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvblBvbGxTdHJlYW1zKCkgeworICAgIG1Qb2xsRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAobVN0cmVhbXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdHYudHZfc2VjID0gMDsKKyAgICB0di50dl91c2VjID0ga1NlbGVjdFRpbWVvdXRVczsKKworICAgIGZkX3NldCByczsKKyAgICBGRF9aRVJPKCZycyk7CisKKyAgICBpbnQgbWF4U29ja2V0ID0gLTE7CisgICAgZm9yIChMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtU3RyZWFtcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkubUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgRkRfU0VUKGl0LT5tUlRQU29ja2V0LCAmcnMpOworICAgICAgICBGRF9TRVQoaXQtPm1SVENQU29ja2V0LCAmcnMpOworCisgICAgICAgIGlmIChpdC0+bVJUUFNvY2tldCA+IG1heFNvY2tldCkgeworICAgICAgICAgICAgbWF4U29ja2V0ID0gaXQtPm1SVFBTb2NrZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5tUlRDUFNvY2tldCA+IG1heFNvY2tldCkgeworICAgICAgICAgICAgbWF4U29ja2V0ID0gaXQtPm1SVENQU29ja2V0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1heFNvY2tldCA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHJlcyA9IHNlbGVjdChtYXhTb2NrZXQgKyAxLCAmcnMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgQ0hFQ0tfR0UocmVzLCAwKTsKKworICAgIGlmIChyZXMgPiAwKSB7CisgICAgICAgIGZvciAoTGlzdDxTdHJlYW1JbmZvPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtcy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoKCppdCkubUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUKGl0LT5tUlRQU29ja2V0LCAmcnMpKSB7CisgICAgICAgICAgICAgICAgcmVjZWl2ZSgmKml0LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChGRF9JU1NFVChpdC0+bVJUQ1BTb2NrZXQsICZycykpIHsKKyAgICAgICAgICAgICAgICByZWNlaXZlKCYqaXQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvc3RQb2xsRXZlbnQoKTsKKworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzIDw9IDAKKyAgICAgICAgICAgIHx8IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgKyA1MDAwMDAwbGwgPD0gbm93VXMpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOworICAgICAgICBmb3IgKExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBtU3RyZWFtcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgU3RyZWFtSW5mbyAqcyA9ICYqaXQ7CisKKyAgICAgICAgICAgIGlmIChzLT5tSXNJbmplY3RlZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbmV2ZXIgcmVjZWl2ZWQgYW55IFJUQ1AgcGFja2V0cyBvbiB0aGlzIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBldmVuIGtub3cgd2hlcmUgdG8gc2VuZCBhIHJlcG9ydC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLT5tU291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IHMtPm1Tb3VyY2VzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgICAgICAgICBzb3VyY2UtPmFkZFJlY2VpdmVyUmVwb3J0KGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga1JlZ3VsYXJseVJlcXVlc3RGSVIpIHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT5hZGRGSVIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJTZW5kaW5nIFJSLi4uIik7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tUlRDUFNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+bVJlbW90ZVJUQ1BBZGRyKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyA9IG5vd1VzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cmVjZWl2ZShTdHJlYW1JbmZvICpzLCBib29sIHJlY2VpdmVSVFApIHsKKyAgICBDSEVDSyghcy0+bUlzSW5qZWN0ZWQpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworCisgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPQorICAgICAgICAoIXJlY2VpdmVSVFAgJiYgcy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPT0gMCkKKyAgICAgICAgICAgID8gc2l6ZW9mKHMtPm1SZW1vdGVSVENQQWRkcikgOiAwOworCisgICAgc3NpemVfdCBuYnl0ZXMgPSByZWN2ZnJvbSgKKyAgICAgICAgICAgIHJlY2VpdmVSVFAgPyBzLT5tUlRQU29ja2V0IDogcy0+bVJUQ1BTb2NrZXQsCisgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgIGJ1ZmZlci0+Y2FwYWNpdHkoKSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICByZW1vdGVBZGRyTGVuID4gMCA/IChzdHJ1Y3Qgc29ja2FkZHIgKikmcy0+bVJlbW90ZVJUQ1BBZGRyIDogTlVMTCwKKyAgICAgICAgICAgIHJlbW90ZUFkZHJMZW4gPiAwID8gJnJlbW90ZUFkZHJMZW4gOiBOVUxMKTsKKworICAgIGlmIChuYnl0ZXMgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIG5ieXRlcyk7CisKKyAgICAvLyBMT0dJKCJyZWNlaXZlZCAlZCBieXRlcy4iLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKHJlY2VpdmVSVFApIHsKKyAgICAgICAgZXJyID0gcGFyc2VSVFAocywgYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBwYXJzZVJUQ1AocywgYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVFAoU3RyZWFtSW5mbyAqcywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChzLT5tTnVtUlRQUGFja2V0c1JlY2VpdmVkKysgPT0gMCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZpcnN0LXJ0cCIsIHRydWUpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgICAvLyBUb28gc2hvcnQgdG8gYmUgYSB2YWxpZCBSVFAgaGVhZGVyLgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworCisgICAgaWYgKChkYXRhWzBdID4+IDYpICE9IDIpIHsKKyAgICAgICAgLy8gVW5zdXBwb3J0ZWQgdmVyc2lvbi4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChkYXRhWzBdICYgMHgyMCkgeworICAgICAgICAvLyBQYWRkaW5nIHByZXNlbnQuCisKKyAgICAgICAgc2l6ZV90IHBhZGRpbmdMZW5ndGggPSBkYXRhW3NpemUgLSAxXTsKKworICAgICAgICBpZiAocGFkZGluZ0xlbmd0aCArIDEyID4gc2l6ZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGlzIG11Y2ggcGFkZGluZyB3ZSdkIGVuZCB1cCB3aXRoIHNvbWV0aGluZworICAgICAgICAgICAgLy8gdGhhdCdzIHRvbyBzaG9ydCB0byBiZSBhIHZhbGlkIFJUUCBoZWFkZXIuCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzaXplIC09IHBhZGRpbmdMZW5ndGg7CisgICAgfQorCisgICAgaW50IG51bUNTUkNzID0gZGF0YVswXSAmIDB4MGY7CisKKyAgICBzaXplX3QgcGF5bG9hZE9mZnNldCA9IDEyICsgNCAqIG51bUNTUkNzOworCisgICAgaWYgKHNpemUgPCBwYXlsb2FkT2Zmc2V0KSB7CisgICAgICAgIC8vIE5vdCBlbm91Z2ggZGF0YSB0byBmaXQgdGhlIGJhc2ljIGhlYWRlciBhbmQgYWxsIHRoZSBDU1JDIGVudHJpZXMuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVswXSAmIDB4MTApIHsKKyAgICAgICAgLy8gSGVhZGVyIGVYdGVuc2lvbiBwcmVzZW50LgorCisgICAgICAgIGlmIChzaXplIDwgcGF5bG9hZE9mZnNldCArIDQpIHsKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggZGF0YSB0byBmaXQgdGhlIGJhc2ljIGhlYWRlciwgYWxsIENTUkMgZW50cmllcworICAgICAgICAgICAgLy8gYW5kIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBleHRlbnNpb24gaGVhZGVyLgorCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpleHRlbnNpb25EYXRhID0gJmRhdGFbcGF5bG9hZE9mZnNldF07CisKKyAgICAgICAgc2l6ZV90IGV4dGVuc2lvbkxlbmd0aCA9CisgICAgICAgICAgICA0ICogKGV4dGVuc2lvbkRhdGFbMl0gPDwgOCB8IGV4dGVuc2lvbkRhdGFbM10pOworCisgICAgICAgIGlmIChzaXplIDwgcGF5bG9hZE9mZnNldCArIDQgKyBleHRlbnNpb25MZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBheWxvYWRPZmZzZXQgKz0gNCArIGV4dGVuc2lvbkxlbmd0aDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzcmNJZCA9IHUzMmF0KCZkYXRhWzhdKTsKKworICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGZpbmRTb3VyY2Uocywgc3JjSWQpOworCisgICAgdWludDMyX3QgcnRwVGltZSA9IHUzMmF0KCZkYXRhWzRdKTsKKworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYnVmZmVyLT5tZXRhKCk7CisgICAgbWV0YS0+c2V0SW50MzIoInNzcmMiLCBzcmNJZCk7CisgICAgbWV0YS0+c2V0SW50MzIoInJ0cC10aW1lIiwgcnRwVGltZSk7CisgICAgbWV0YS0+c2V0SW50MzIoIlBUIiwgZGF0YVsxXSAmIDB4N2YpOworICAgIG1ldGEtPnNldEludDMyKCJNIiwgZGF0YVsxXSA+PiA3KTsKKworICAgIGJ1ZmZlci0+c2V0SW50MzJEYXRhKHUxNmF0KCZkYXRhWzJdKSk7CisgICAgYnVmZmVyLT5zZXRSYW5nZShwYXlsb2FkT2Zmc2V0LCBzaXplIC0gcGF5bG9hZE9mZnNldCk7CisKKyAgICBpZiAoKG1GbGFncyAmIGtGYWtlVGltZXN0YW1wcykgJiYgIXNvdXJjZS0+dGltZUVzdGFibGlzaGVkKCkpIHsKKyAgICAgICAgc291cmNlLT50aW1lVXBkYXRlKHJ0cFRpbWUsIDApOworICAgICAgICBzb3VyY2UtPnRpbWVVcGRhdGUocnRwVGltZSArIDkwMDAwLCAweDEwMDAwMDAwMGxsKTsKKyAgICAgICAgQ0hFQ0soc291cmNlLT50aW1lRXN0YWJsaXNoZWQoKSk7CisgICAgfQorCisgICAgc291cmNlLT5wcm9jZXNzUlRQUGFja2V0KGJ1ZmZlcik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVJUQ1AoU3RyZWFtSW5mbyAqcywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChzLT5tTnVtUlRDUFBhY2tldHNSZWNlaXZlZCsrID09IDApIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJmaXJzdC1ydGNwIiwgdHJ1ZSk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICAgICAgLy8gVG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRDUCBoZWFkZXIKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZGF0YVswXSA+PiA2KSAhPSAyKSB7CisgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCB2ZXJzaW9uLgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRhdGFbMF0gJiAweDIwKSB7CisgICAgICAgICAgICAvLyBQYWRkaW5nIHByZXNlbnQuCisKKyAgICAgICAgICAgIHNpemVfdCBwYWRkaW5nTGVuZ3RoID0gZGF0YVtzaXplIC0gMV07CisKKyAgICAgICAgICAgIGlmIChwYWRkaW5nTGVuZ3RoICsgMTIgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGlzIG11Y2ggcGFkZGluZyB3ZSdkIGVuZCB1cCB3aXRoIHNvbWV0aGluZworICAgICAgICAgICAgICAgIC8vIHRoYXQncyB0b28gc2hvcnQgdG8gYmUgYSB2YWxpZCBSVFAgaGVhZGVyLgorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZSAtPSBwYWRkaW5nTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGhlYWRlckxlbmd0aCA9IDQgKiAoZGF0YVsyXSA8PCA4IHwgZGF0YVszXSkgKyA0OworCisgICAgICAgIGlmIChzaXplIDwgaGVhZGVyTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBPbmx5IHJlY2VpdmVkIGEgcGFydGlhbCBwYWNrZXQ/CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGRhdGFbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgMjAwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnNlU1IocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyMDE6ICAvLyBSUgorICAgICAgICAgICAgY2FzZSAyMDI6ICAvLyBTREVTCisgICAgICAgICAgICBjYXNlIDIwNDogIC8vIEFQUAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDIwNTogIC8vIFRTRkIgKHRyYW5zcG9ydCBsYXllciBzcGVjaWZpYyBmZWVkYmFjaykKKyAgICAgICAgICAgIGNhc2UgMjA2OiAgLy8gUFNGQiAocGF5bG9hZCBzcGVjaWZpYyBmZWVkYmFjaykKKyAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGRhdGEsIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjAzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnNlQllFKHMsIGRhdGEsIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGhlYWRlckxlbmd0aDsKKyAgICAgICAgc2l6ZSAtPSBoZWFkZXJMZW5ndGg7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VCWUUoCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IFNDID0gZGF0YVswXSAmIDB4M2Y7CisKKyAgICBpZiAoU0MgPT0gMCB8fCBzaXplIDwgKDQgKyBTQyAqIDQpKSB7CisgICAgICAgIC8vIFBhY2tldCB0b28gc2hvcnQgZm9yIHRoZSBtaW5pbWFsIEJZRSBoZWFkZXIuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKworICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGZpbmRTb3VyY2UocywgaWQpOworCisgICAgc291cmNlLT5ieWVSZWNlaXZlZCgpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VTUigKKyAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgUkMgPSBkYXRhWzBdICYgMHgxZjsKKworICAgIGlmIChzaXplIDwgKDcgKyBSQyAqIDYpICogNCkgeworICAgICAgICAvLyBQYWNrZXQgdG9vIHNob3J0IGZvciB0aGUgbWluaW1hbCBTUiBoZWFkZXIuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKyAgICB1aW50NjRfdCBudHBUaW1lID0gdTY0YXQoJmRhdGFbOF0pOworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSB1MzJhdCgmZGF0YVsxNl0pOworCisjaWYgMAorICAgIExPR0koIlhYWCB0aW1lVXBkYXRlOiBzc3JjPTB4JTA4eCwgcnRwVGltZSAldSA9PSBudHBUaW1lICUuM2YiLAorICAgICAgICAgaWQsCisgICAgICAgICBydHBUaW1lLAorICAgICAgICAgKG50cFRpbWUgPj4gMzIpICsgKGRvdWJsZSkobnRwVGltZSAmIDB4ZmZmZmZmZmYpIC8gKDFsbCA8PCAzMikpOworI2VuZGlmCisKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIGlkKTsKKworICAgIGlmICgobUZsYWdzICYga0Zha2VUaW1lc3RhbXBzKSA9PSAwKSB7CisgICAgICAgIHNvdXJjZS0+dGltZVVwZGF0ZShydHBUaW1lLCBudHBUaW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3A8QVJUUFNvdXJjZT4gQVJUUENvbm5lY3Rpb246OmZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3Qgc3JjSWQpIHsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2U7CisgICAgc3NpemVfdCBpbmRleCA9IGluZm8tPm1Tb3VyY2VzLmluZGV4T2ZLZXkoc3JjSWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBpbmZvLT5tU291cmNlcy5zaXplKCk7CisKKyAgICAgICAgc291cmNlID0gbmV3IEFSVFBTb3VyY2UoCisgICAgICAgICAgICAgICAgc3JjSWQsIGluZm8tPm1TZXNzaW9uRGVzYywgaW5mby0+bUluZGV4LCBpbmZvLT5tTm90aWZ5TXNnKTsKKworICAgICAgICBpbmZvLT5tU291cmNlcy5hZGQoc3JjSWQsIHNvdXJjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc291cmNlID0gaW5mby0+bVNvdXJjZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIHNvdXJjZTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6aW5qZWN0UGFja2V0KGludCBpbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbmplY3RQYWNrZXQsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgIG1zZy0+c2V0T2JqZWN0KCJidWZmZXIiLCBidWZmZXIpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkluamVjdFBhY2tldChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpCisgICAgICAgICAgICYmIGl0LT5tUlRQU29ja2V0ICE9IGluZGV4ICYmIGl0LT5tUlRDUFNvY2tldCAhPSBpbmRleCkgeworICAgICAgICArK2l0OworICAgIH0KKworICAgIGlmIChpdCA9PSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIFN0cmVhbUluZm8gKnMgPSAmKml0OworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChpdC0+bVJUUFNvY2tldCA9PSBpbmRleCkgeworICAgICAgICBlcnIgPSBwYXJzZVJUUChzLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IHBhcnNlUlRDUChzLCBidWZmZXIpOworICAgIH0KK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6ZmFrZVRpbWVzdGFtcHMoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZha2VUaW1lc3RhbXBzLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6b25GYWtlVGltZXN0YW1wcygpIHsKKyAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpKSB7CisgICAgICAgIFN0cmVhbUluZm8gJmluZm8gPSAqaXQrKzsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm8ubVNvdXJjZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGluZm8ubVNvdXJjZXMudmFsdWVBdChqKTsKKworICAgICAgICAgICAgaWYgKCFzb3VyY2UtPnRpbWVFc3RhYmxpc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT50aW1lVXBkYXRlKDAsIDApOworICAgICAgICAgICAgICAgIHNvdXJjZS0+dGltZVVwZGF0ZSgwICsgOTAwMDAsIDB4MTAwMDAwMDAwbGwpOworCisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGYWtlVGltZXN0YW1wczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2IzODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX0NPTk5FQ1RJT05fSF8KKworI2RlZmluZSBBX1JUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFSVFBTb3VyY2U7CitzdHJ1Y3QgQVNlc3Npb25EZXNjcmlwdGlvbjsKKworc3RydWN0IEFSVFBDb25uZWN0aW9uIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga0Zha2VUaW1lc3RhbXBzICAgICAgPSAxLAorICAgICAgICBrUmVndWxhcmx5UmVxdWVzdEZJUiA9IDIsCisgICAgfTsKKworICAgIEFSVFBDb25uZWN0aW9uKHVpbnQzMl90IGZsYWdzID0gMCk7CisKKyAgICB2b2lkIGFkZFN0cmVhbSgKKyAgICAgICAgICAgIGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0LAorICAgICAgICAgICAgY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJnNlc3Npb25EZXNjLCBzaXplX3QgaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGJvb2wgaW5qZWN0ZWQpOworCisgICAgdm9pZCByZW1vdmVTdHJlYW0oaW50IHJ0cFNvY2tldCwgaW50IHJ0Y3BTb2NrZXQpOworCisgICAgdm9pZCBpbmplY3RQYWNrZXQoaW50IGluZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIC8vIENyZWF0ZXMgYSBwYWlyIG9mIFVEUCBkYXRhZ3JhbSBzb2NrZXRzIGJvdW5kIHRvIGFkamFjZW50IHBvcnRzCisgICAgLy8gKHRoZSBydHBTb2NrZXQgaXMgYm91bmQgdG8gYW4gZXZlbiBwb3J0LCB0aGUgcnRjcFNvY2tldCB0byB0aGUKKyAgICAvLyBuZXh0IGhpZ2hlciBwb3J0KS4KKyAgICBzdGF0aWMgdm9pZCBNYWtlUG9ydFBhaXIoCisgICAgICAgICAgICBpbnQgKnJ0cFNvY2tldCwgaW50ICpydGNwU29ja2V0LCB1bnNpZ25lZCAqcnRwUG9ydCk7CisKKyAgICB2b2lkIGZha2VUaW1lc3RhbXBzKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BUlRQQ29ubmVjdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWRkU3RyZWFtLAorICAgICAgICBrV2hhdFJlbW92ZVN0cmVhbSwKKyAgICAgICAga1doYXRQb2xsU3RyZWFtcywKKyAgICAgICAga1doYXRJbmplY3RQYWNrZXQsCisgICAgICAgIGtXaGF0RmFrZVRpbWVzdGFtcHMsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTZWxlY3RUaW1lb3V0VXM7CisKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisKKyAgICBzdHJ1Y3QgU3RyZWFtSW5mbzsKKyAgICBMaXN0PFN0cmVhbUluZm8+IG1TdHJlYW1zOworCisgICAgYm9vbCBtUG9sbEV2ZW50UGVuZGluZzsKKyAgICBpbnQ2NF90IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXM7CisKKyAgICB2b2lkIG9uQWRkU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUmVtb3ZlU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUG9sbFN0cmVhbXMoKTsKKyAgICB2b2lkIG9uSW5qZWN0UGFja2V0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uU2VuZFJlY2VpdmVyUmVwb3J0cygpOworICAgIHZvaWQgb25GYWtlVGltZXN0YW1wcygpOworCisgICAgc3RhdHVzX3QgcmVjZWl2ZShTdHJlYW1JbmZvICppbmZvLCBib29sIHJlY2VpdmVSVFApOworCisgICAgc3RhdHVzX3QgcGFyc2VSVFAoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgcGFyc2VSVENQKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHN0YXR1c190IHBhcnNlU1IoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlQllFKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHNwPEFSVFBTb3VyY2U+IGZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3QgaWQpOworCisgICAgdm9pZCBwb3N0UG9sbEV2ZW50KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfUlRQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNjYxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBUlRQU2Vzc2lvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FSVFBTZXNzaW9uOjpBUlRQU2Vzc2lvbigpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpIHsKK30KKworc3RhdHVzX3QgQVJUUFNlc3Npb246OnNldHVwKGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZkZXNjKSB7CisgICAgQ0hFQ0tfRVEobUluaXRDaGVjaywgKHN0YXR1c190KU5PX0lOSVQpOworCisgICAgbURlc2MgPSBkZXNjOworCisgICAgbVJUUENvbm4gPSBuZXcgQVJUUENvbm5lY3Rpb24oCisgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6a0Zha2VUaW1lc3RhbXBzCisgICAgICAgICAgICAgICAgfCBBUlRQQ29ubmVjdGlvbjo6a1JlZ3VsYXJseVJlcXVlc3RGSVIpOworCisgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtUlRQQ29ubik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1EZXNjLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgQVN0cmluZyBjb25uZWN0aW9uOworICAgICAgICBpZiAoIW1EZXNjLT5maW5kQXR0cmlidXRlKGksICJjPSIsICZjb25uZWN0aW9uKSkgeworICAgICAgICAgICAgLy8gTm8gcGVyLXN0cmVhbSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLCB0cnkgZ2xvYmFsIGZhbGxiYWNrLgorICAgICAgICAgICAgaWYgKCFtRGVzYy0+ZmluZEF0dHJpYnV0ZSgwLCAiYz0iLCAmY29ubmVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gZmluZCBjb25uZWN0aW9uIGF0dHJpYnV0ZS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIShjb25uZWN0aW9uID09ICJJTiBJUDQgMTI3LjAuMC4xIikpIHsKKyAgICAgICAgICAgIExPR0UoIldlIG9ubHkgc3VwcG9ydCBsb2NhbGhvc3QgY29ubmVjdGlvbnMgZm9yIG5vdy4iKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgcG9ydDsKKyAgICAgICAgaWYgKCF2YWxpZGF0ZU1lZGlhRm9ybWF0KGksICZwb3J0KSB8fCAocG9ydCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgbWVkaWEgZm9ybWF0LiIpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKworICAgICAgICBzcDxBUGFja2V0U291cmNlPiBzb3VyY2UgPSBuZXcgQVBhY2tldFNvdXJjZShtRGVzYywgaSk7CisgICAgICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBmb3JtYXQuIik7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydHBTb2NrZXQgPSBNYWtlVURQU29ja2V0KHBvcnQpOworICAgICAgICBpbnQgcnRjcFNvY2tldCA9IE1ha2VVRFBTb2NrZXQocG9ydCArIDEpOworCisgICAgICAgIG1UcmFja3MucHVzaChUcmFja0luZm8oKSk7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgaW5mby0+bVJUUFNvY2tldCA9IHJ0cFNvY2tldDsKKyAgICAgICAgaW5mby0+bVJUQ1BTb2NrZXQgPSBydGNwU29ja2V0OworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY2Nlc3NVbml0Q29tcGxldGUsIGlkKCkpOworICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKKworICAgICAgICBtUlRQQ29ubi0+YWRkU3RyZWFtKAorICAgICAgICAgICAgICAgIHJ0cFNvY2tldCwgcnRjcFNvY2tldCwgbURlc2MsIGksIG5vdGlmeSwgZmFsc2UgLyogaW5qZWN0ZWQgKi8pOworCisgICAgICAgIGluZm8tPm1QYWNrZXRTb3VyY2UgPSBzb3VyY2U7CisgICAgfQorCisgICAgbUluaXRDaGVjayA9IE9LOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK2ludCBBUlRQU2Vzc2lvbjo6TWFrZVVEUFNvY2tldCh1bnNpZ25lZCBwb3J0KSB7CisgICAgaW50IHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UocywgMCk7CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBtZW1zZXQoYWRkci5zaW5femVybywgMCwgc2l6ZW9mKGFkZHIuc2luX3plcm8pKTsKKyAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgICBDSEVDS19FUSgwLCBiaW5kKHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSk7CisKKyAgICByZXR1cm4gczsKK30KKworQVJUUFNlc3Npb246On5BUlRQU2Vzc2lvbigpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlLT5zaWduYWxFT1MoVU5LTk9XTl9FUlJPUik7CisKKyAgICAgICAgY2xvc2UoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgIGNsb3NlKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFNlc3Npb246Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWNjZXNzVW5pdENvbXBsZXRlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGZpcnN0UlRDUDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmlyc3QtcnRjcCIsICZmaXJzdFJUQ1ApKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgd29uJ3QgYmUgYW4gYWNjZXNzIHVuaXQgaGVyZSwgaXQncyBqdXN0IGEgbm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZGF0YSBjb21tdW5pY2F0aW9uIHdvcmtlZCBzaW5jZSB3ZSBnb3QgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcnRjcCBwYWNrZXQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2staW5kZXgiLCAmdHJhY2tJbmRleCkpOworCisgICAgICAgICAgICBpbnQzMl90IGVvczsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CisgICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYWNjZXNzLXVuaXQiLCAmb2JqKSk7CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IG50cFRpbWU7CisgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJudHAtdGltZSIsIChpbnQ2NF90ICopJm50cFRpbWUpKTsKKworI2lmIDAKKyNpZiAwCisgICAgICAgICAgICBwcmludGYoImFjY2VzcyB1bml0IGNvbXBsZXRlIHNpemU9JWRcdG50cC10aW1lPTB4JTAxNmxseFxuIiwKKyAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zaXplKCksIG50cFRpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIExPR0koImFjY2VzcyB1bml0IGNvbXBsZXRlLCBzaXplPSVkLCBudHAtdGltZT0lbGx1IiwKKyAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2l6ZSgpLCBudHBUaW1lKTsKKyAgICAgICAgICAgIGhleGR1bXAoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIDAKKyAgICAgICAgICAgIENIRUNLX0dFKGFjY2Vzc1VuaXQtPnNpemUoKSwgNXUpOworICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgNCkpOworICAgICAgICAgICAgdW5zaWduZWQgeCA9IGFjY2Vzc1VuaXQtPmRhdGEoKVs0XTsKKworICAgICAgICAgICAgTE9HSSgiYWNjZXNzIHVuaXQgY29tcGxldGU6IG5hbFR5cGU9MHglMDJ4LCBuYWxSZWZJZGM9MHglMDJ4IiwKKyAgICAgICAgICAgICAgICAgeCAmIDB4MWYsICh4ICYgMHg2MCkgPj4gNSk7CisjZW5kaWYKKworICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBudHBUaW1lKTsKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworCisjaWYgMAorICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkYW1hZ2VkIiwgJmRhbWFnZWQpCisgICAgICAgICAgICAgICAgICAgICYmIGRhbWFnZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0koImlnbm9yaW5nIGRhbWFnZWQgQVUiKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitib29sIEFSVFBTZXNzaW9uOjp2YWxpZGF0ZU1lZGlhRm9ybWF0KHNpemVfdCBpbmRleCwgdW5zaWduZWQgKnBvcnQpIGNvbnN0IHsKKyAgICBBU3RyaW5nIGZvcm1hdDsKKyAgICBtRGVzYy0+Z2V0Rm9ybWF0KGluZGV4LCAmZm9ybWF0KTsKKworICAgIHNzaXplX3QgaSA9IGZvcm1hdC5maW5kKCIgIik7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICArK2k7CisgICAgc2l6ZV90IGogPSBpOworICAgIHdoaWxlIChpc2RpZ2l0KGZvcm1hdC5jX3N0cigpW2pdKSkgeworICAgICAgICArK2o7CisgICAgfQorICAgIGlmIChmb3JtYXQuY19zdHIoKVtqXSAhPSAnICcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFTdHJpbmcgcG9ydFN0cmluZyhmb3JtYXQsIGksIGogLSBpKTsKKworICAgIGNoYXIgKmVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKHBvcnRTdHJpbmcuY19zdHIoKSwgJmVuZCwgMTApOworICAgIGlmIChlbmQgPT0gcG9ydFN0cmluZy5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHggPT0gMCB8fCB4ID4gNjU1MzUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpwb3J0ID0geDsKKworICAgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgQVJUUFNlc3Npb246OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IEFSVFBTZXNzaW9uOjp0cmFja0F0KHNpemVfdCBpbmRleCkgeworICAgIENIRUNLX0xUKGluZGV4LCBtVHJhY2tzLnNpemUoKSk7CisgICAgcmV0dXJuIG1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubVBhY2tldFNvdXJjZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZmNzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX1NFU1NJT05fSF8KKworI2RlZmluZSBBX1JUUF9TRVNTSU9OX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFQYWNrZXRTb3VyY2U7CitzdHJ1Y3QgQVJUUENvbm5lY3Rpb247CitzdHJ1Y3QgQVNlc3Npb25EZXNjcmlwdGlvbjsKK3N0cnVjdCBNZWRpYVNvdXJjZTsKKworc3RydWN0IEFSVFBTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBBUlRQU2Vzc2lvbigpOworCisgICAgc3RhdHVzX3Qgc2V0dXAoY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJmRlc2MpOworCisgICAgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgc3A8TWVkaWFTb3VyY2U+IHRyYWNrQXQoc2l6ZV90IGluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIH5BUlRQU2Vzc2lvbigpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdEFjY2Vzc1VuaXRDb21wbGV0ZSA9ICdhY2N1JworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgaW50IG1SVFBTb2NrZXQ7CisgICAgICAgIGludCBtUlRDUFNvY2tldDsKKworICAgICAgICBzcDxBUGFja2V0U291cmNlPiBtUGFja2V0U291cmNlOworICAgIH07CisKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IG1EZXNjOworICAgIHNwPEFSVFBDb25uZWN0aW9uPiBtUlRQQ29ubjsKKworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisKKyAgICBib29sIHZhbGlkYXRlTWVkaWFGb3JtYXQoc2l6ZV90IGluZGV4LCB1bnNpZ25lZCAqcG9ydCkgY29uc3Q7CisgICAgc3RhdGljIGludCBNYWtlVURQU29ja2V0KHVuc2lnbmVkIHBvcnQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUUFNlc3Npb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1JUUF9TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE4MjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVJUUFNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFBTVJBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJBQVZDQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJBTVBFRzRBdWRpb0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgdWludDMyX3Qga1NvdXJjZUlEID0gMHhkZWFkYmVlZjsKKworQVJUUFNvdXJjZTo6QVJUUFNvdXJjZSgKKyAgICAgICAgdWludDMyX3QgaWQsCisgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IG1JRChpZCksCisgICAgICBtSGlnaGVzdFNlcU51bWJlcigwKSwKKyAgICAgIG1OdW1CdWZmZXJzUmVjZWl2ZWQoMCksCisgICAgICBtTnVtVGltZXMoMCksCisgICAgICBtTGFzdE5UUFRpbWUoMCksCisgICAgICBtTGFzdE5UUFRpbWVVcGRhdGVVcygwKSwKKyAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzKGZhbHNlKSwKKyAgICAgIG1MYXN0RklSUmVxdWVzdFVzKC0xKSwKKyAgICAgIG1OZXh0RklSU2VxTm8oKHJhbmQoKSAqIDI1Ni4wKSAvIFJBTkRfTUFYKSB7CisgICAgdW5zaWduZWQgbG9uZyBQVDsKKyAgICBBU3RyaW5nIGRlc2M7CisgICAgQVN0cmluZyBwYXJhbXM7CisgICAgc2Vzc2lvbkRlc2MtPmdldEZvcm1hdFR5cGUoaW5kZXgsICZQVCwgJmRlc2MsICZwYXJhbXMpOworCisgICAgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjQvIiwgNSkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBQVZDQXNzZW1ibGVyKG5vdGlmeSk7CisgICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIk1QNEEtTEFUTS8iLCAxMCkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBTVBFRzRBdWRpb0Fzc2VtYmxlcihub3RpZnkpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0xOTk4LyIsIDEwKQorICAgICAgICAgICAgfHwgIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0yMDAwLyIsIDEwKSkgeworICAgICAgICBtQXNzZW1ibGVyID0gbmV3IEFIMjYzQXNzZW1ibGVyKG5vdGlmeSk7CisgICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkFNUi8iLCA0KSkgeworICAgICAgICBtQXNzZW1ibGVyID0gbmV3IEFBTVJBc3NlbWJsZXIobm90aWZ5LCBmYWxzZSAvKiBpc1dpZGUgKi8sIHBhcmFtcyk7CisgICAgfSBlbHNlICBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiQU1SLVdCLyIsIDcpKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUFNUkFzc2VtYmxlcihub3RpZnksIHRydWUgLyogaXNXaWRlICovLCBwYXJhbXMpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiTVA0Vi1FUy8iLCA4KQorICAgICAgICAgICAgfHwgIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAibXBlZzQtZ2VuZXJpYy8iLCAxNCkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyKG5vdGlmeSwgZGVzYywgcGFyYW1zKTsKKyAgICAgICAgbUlzc3VlRklSUmVxdWVzdHMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3QgQWJzRGlmZih1aW50MzJfdCBzZXExLCB1aW50MzJfdCBzZXEyKSB7CisgICAgcmV0dXJuIHNlcTEgPiBzZXEyID8gc2VxMSAtIHNlcTIgOiBzZXEyIC0gc2VxMTsKK30KKwordm9pZCBBUlRQU291cmNlOjpwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAocXVldWVQYWNrZXQoYnVmZmVyKQorICAgICAgICAgICAgJiYgbU51bVRpbWVzID09IDIKKyAgICAgICAgICAgICYmIG1Bc3NlbWJsZXIgIT0gTlVMTCkgeworICAgICAgICBtQXNzZW1ibGVyLT5vblBhY2tldFJlY2VpdmVkKHRoaXMpOworICAgIH0KK30KKwordm9pZCBBUlRQU291cmNlOjp0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKKyAgICBMT0dWKCJ0aW1lVXBkYXRlIik7CisKKyAgICBtTGFzdE5UUFRpbWUgPSBudHBUaW1lOworICAgIG1MYXN0TlRQVGltZVVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIGlmIChtTnVtVGltZXMgPT0gMikgeworICAgICAgICBtTlRQVGltZVswXSA9IG1OVFBUaW1lWzFdOworICAgICAgICBtUlRQVGltZVswXSA9IG1SVFBUaW1lWzFdOworICAgICAgICBtTnVtVGltZXMgPSAxOworICAgIH0KKyAgICBtTlRQVGltZVttTnVtVGltZXNdID0gbnRwVGltZTsKKyAgICBtUlRQVGltZVttTnVtVGltZXMrK10gPSBydHBUaW1lOworCisgICAgaWYgKHRpbWVFc3RhYmxpc2hlZCgpKSB7CisgICAgICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IG1RdWV1ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSAoKml0KS0+bWV0YSgpOworCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoIm50cC10aW1lIiwgUlRQMk5UUChydHBUaW1lKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQVJUUFNvdXJjZTo6cXVldWVQYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHVpbnQzMl90IHNlcU51bSA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpOworCisgICAgaWYgKG1OdW1UaW1lcyA9PSAyKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYnVmZmVyLT5tZXRhKCk7CisKKyAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICBtZXRhLT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBSVFAyTlRQKHJ0cFRpbWUpKTsKKyAgICB9CisKKyAgICBpZiAobU51bUJ1ZmZlcnNSZWNlaXZlZCsrID09IDApIHsKKyAgICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIgPSBzZXFOdW07CisgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT25seSB0aGUgbG93ZXIgMTYtYml0IG9mIHRoZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSB0cmFuc21pdHRlZCwKKyAgICAvLyBkZXJpdmUgdGhlIGhpZ2gtb3JkZXIgYml0cyBieSBjaG9vc2luZyB0aGUgY2FuZGlkYXRlIGNsb3Nlc3QKKyAgICAvLyB0byB0aGUgaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgKGV4dGVuZGVkIHRvIDMyIGJpdHMpIHJlY2VpdmVkIHNvIGZhci4KKworICAgIHVpbnQzMl90IHNlcTEgPSBzZXFOdW0gfCAobUhpZ2hlc3RTZXFOdW1iZXIgJiAweGZmZmYwMDAwKTsKKyAgICB1aW50MzJfdCBzZXEyID0gc2VxTnVtIHwgKChtSGlnaGVzdFNlcU51bWJlciAmIDB4ZmZmZjAwMDApICsgMHgxMDAwMCk7CisgICAgdWludDMyX3Qgc2VxMyA9IHNlcU51bSB8ICgobUhpZ2hlc3RTZXFOdW1iZXIgJiAweGZmZmYwMDAwKSAtIDB4MTAwMDApOworICAgIHVpbnQzMl90IGRpZmYxID0gQWJzRGlmZihzZXExLCBtSGlnaGVzdFNlcU51bWJlcik7CisgICAgdWludDMyX3QgZGlmZjIgPSBBYnNEaWZmKHNlcTIsIG1IaWdoZXN0U2VxTnVtYmVyKTsKKyAgICB1aW50MzJfdCBkaWZmMyA9IEFic0RpZmYoc2VxMywgbUhpZ2hlc3RTZXFOdW1iZXIpOworCisgICAgaWYgKGRpZmYxIDwgZGlmZjIpIHsKKyAgICAgICAgaWYgKGRpZmYxIDwgZGlmZjMpIHsKKyAgICAgICAgICAgIC8vIGRpZmYxIDwgZGlmZjIgXiBkaWZmMSA8IGRpZmYzCisgICAgICAgICAgICBzZXFOdW0gPSBzZXExOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZGlmZjMgPD0gZGlmZjEgPCBkaWZmMgorICAgICAgICAgICAgc2VxTnVtID0gc2VxMzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGlmZjIgPCBkaWZmMykgeworICAgICAgICAvLyBkaWZmMiA8PSBkaWZmMSBeIGRpZmYyIDwgZGlmZjMKKyAgICAgICAgc2VxTnVtID0gc2VxMjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkaWZmMyA8PSBkaWZmMiA8PSBkaWZmMQorICAgICAgICBzZXFOdW0gPSBzZXEzOworICAgIH0KKworICAgIGlmIChzZXFOdW0gPiBtSGlnaGVzdFNlcU51bWJlcikgeworICAgICAgICBtSGlnaGVzdFNlcU51bWJlciA9IHNlcU51bTsKKyAgICB9CisKKyAgICBidWZmZXItPnNldEludDMyRGF0YShzZXFOdW0pOworCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1RdWV1ZS5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUXVldWUuZW5kKCkgJiYgKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKSA8IHNlcU51bSkgeworICAgICAgICArK2l0OworICAgIH0KKworICAgIGlmIChpdCAhPSBtUXVldWUuZW5kKCkgJiYgKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKSA9PSBzZXFOdW0pIHsKKyAgICAgICAgTE9HVygiRGlzY2FyZGluZyBkdXBsaWNhdGUgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtUXVldWUuaW5zZXJ0KGl0LCBidWZmZXIpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ2NF90IEFSVFBTb3VyY2U6OlJUUDJOVFAodWludDMyX3QgcnRwVGltZSkgY29uc3QgeworICAgIENIRUNLX0VRKG1OdW1UaW1lcywgMnUpOworCisgICAgcmV0dXJuIG1OVFBUaW1lWzBdICsgKGRvdWJsZSkobU5UUFRpbWVbMV0gLSBtTlRQVGltZVswXSkKKyAgICAgICAgICAgICogKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpbVJUUFRpbWVbMF0pCisgICAgICAgICAgICAvIChkb3VibGUpKG1SVFBUaW1lWzFdIC0gbVJUUFRpbWVbMF0pOworfQorCit2b2lkIEFSVFBTb3VyY2U6OmJ5ZVJlY2VpdmVkKCkgeworICAgIG1Bc3NlbWJsZXItPm9uQnllUmVjZWl2ZWQoKTsKK30KKwordm9pZCBBUlRQU291cmNlOjphZGRGSVIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmICghbUlzc3VlRklSUmVxdWVzdHMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA+PSAwICYmIG1MYXN0RklSUmVxdWVzdFVzICsgNTAwMDAwMGxsID4gbm93VXMpIHsKKyAgICAgICAgLy8gU2VuZCBGSVIgcmVxdWVzdHMgYXQgbW9zdCBldmVyeSA1IHNlY3MuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtTGFzdEZJUlJlcXVlc3RVcyA9IG5vd1VzOworCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpICsgMjAgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgTE9HVygiUlRDUCBidWZmZXIgdG9vIHNtYWxsIHRvIGFjY29tb2RhdGUgRklSLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CisKKyAgICBkYXRhWzBdID0gMHg4MCB8IDQ7CisgICAgZGF0YVsxXSA9IDIwNjsgIC8vIFBTRkIKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gNDsKKyAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBrU291cmNlSUQgJiAweGZmOworCisgICAgZGF0YVs4XSA9IDB4MDA7ICAvLyBTU1JDIG9mIG1lZGlhIHNvdXJjZSAodW51c2VkKQorICAgIGRhdGFbOV0gPSAweDAwOworICAgIGRhdGFbMTBdID0gMHgwMDsKKyAgICBkYXRhWzExXSA9IDB4MDA7CisKKyAgICBkYXRhWzEyXSA9IG1JRCA+PiAyNDsKKyAgICBkYXRhWzEzXSA9IChtSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzE0XSA9IChtSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMTVdID0gbUlEICYgMHhmZjsKKworICAgIGRhdGFbMTZdID0gbU5leHRGSVJTZXFObysrOyAgLy8gU2VxIE5yLgorCisgICAgZGF0YVsxN10gPSAweDAwOyAgLy8gUmVzZXJ2ZWQKKyAgICBkYXRhWzE4XSA9IDB4MDA7CisgICAgZGF0YVsxOV0gPSAweDAwOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIDIwKTsKKworICAgIExPR1YoIkFkZGVkIEZJUiByZXF1ZXN0LiIpOworfQorCit2b2lkIEFSVFBTb3VyY2U6OmFkZFJlY2VpdmVyUmVwb3J0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgKyAzMiA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICBMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBSUi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAxOworICAgIGRhdGFbMV0gPSAyMDE7ICAvLyBSUgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA3OworICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzhdID0gbUlEID4+IDI0OworICAgIGRhdGFbOV0gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxMF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IG1JRCAmIDB4ZmY7CisKKyAgICBkYXRhWzEyXSA9IDB4MDA7ICAvLyBmcmFjdGlvbiBsb3N0CisKKyAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBjdW11bGF0aXZlIGxvc3QKKyAgICBkYXRhWzE0XSA9IDB4MDA7CisgICAgZGF0YVsxNV0gPSAweDAwOworCisgICAgZGF0YVsxNl0gPSBtSGlnaGVzdFNlcU51bWJlciA+PiAyNDsKKyAgICBkYXRhWzE3XSA9IChtSGlnaGVzdFNlcU51bWJlciA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMThdID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE5XSA9IG1IaWdoZXN0U2VxTnVtYmVyICYgMHhmZjsKKworICAgIGRhdGFbMjBdID0gMHgwMDsgIC8vIEludGVyYXJyaXZhbCBqaXR0ZXIKKyAgICBkYXRhWzIxXSA9IDB4MDA7CisgICAgZGF0YVsyMl0gPSAweDAwOworICAgIGRhdGFbMjNdID0gMHgwMDsKKworICAgIHVpbnQzMl90IExTUiA9IDA7CisgICAgdWludDMyX3QgRExTUiA9IDA7CisgICAgaWYgKG1MYXN0TlRQVGltZSAhPSAwKSB7CisgICAgICAgIExTUiA9IChtTGFzdE5UUFRpbWUgPj4gMTYpICYgMHhmZmZmZmZmZjsKKworICAgICAgICBETFNSID0gKHVpbnQzMl90KQorICAgICAgICAgICAgKChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3ROVFBUaW1lVXBkYXRlVXMpICogNjU1MzYuMCAvIDFFNik7CisgICAgfQorCisgICAgZGF0YVsyNF0gPSBMU1IgPj4gMjQ7CisgICAgZGF0YVsyNV0gPSAoTFNSID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsyNl0gPSAoTFNSID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzI3XSA9IExTUiAmIDB4ZmY7CisKKyAgICBkYXRhWzI4XSA9IERMU1IgPj4gMjQ7CisgICAgZGF0YVsyOV0gPSAoRExTUiA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMzBdID0gKERMU1IgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMzFdID0gRExTUiAmIDB4ZmY7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMzIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyYzNmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX1NPVVJDRV9IXworCisjZGVmaW5lIEFfUlRQX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBUlRQQXNzZW1ibGVyOworc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb247CisKK3N0cnVjdCBBUlRQU291cmNlIDogcHVibGljIFJlZkJhc2UgeworICAgIEFSVFBTb3VyY2UoCisgICAgICAgICAgICB1aW50MzJfdCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgdGltZVVwZGF0ZSh1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKTsKKyAgICB2b2lkIGJ5ZVJlY2VpdmVkKCk7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKCkgeyByZXR1cm4gJm1RdWV1ZTsgfQorCisgICAgdm9pZCBhZGRSZWNlaXZlclJlcG9ydChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGFkZEZJUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIGJvb2wgdGltZUVzdGFibGlzaGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU51bVRpbWVzID09IDI7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1JRDsKKyAgICB1aW50MzJfdCBtSGlnaGVzdFNlcU51bWJlcjsKKyAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVF1ZXVlOworICAgIHNwPEFSVFBBc3NlbWJsZXI+IG1Bc3NlbWJsZXI7CisKKyAgICBzaXplX3QgbU51bVRpbWVzOworICAgIHVpbnQ2NF90IG1OVFBUaW1lWzJdOworICAgIHVpbnQzMl90IG1SVFBUaW1lWzJdOworCisgICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOworICAgIGludDY0X3QgbUxhc3ROVFBUaW1lVXBkYXRlVXM7CisKKyAgICBib29sIG1Jc3N1ZUZJUlJlcXVlc3RzOworICAgIGludDY0X3QgbUxhc3RGSVJSZXF1ZXN0VXM7CisgICAgdWludDhfdCBtTmV4dEZJUlNlcU5vOworCisgICAgdWludDY0X3QgUlRQMk5UUCh1aW50MzJfdCBydHBUaW1lKSBjb25zdDsKKworICAgIGJvb2wgcXVldWVQYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTVmZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMCwwICsxLDgzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVJUUFdyaXRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9CeXRlT3JkZXIuaD4KKworI2RlZmluZSBQVCAgICAgIDk3CisjZGVmaW5lIFBUX1NUUiAgIjk3IgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBhY2tldFNpemUgPSA2NTUwNzsgIC8vIG1heGltdW0gcGF5bG9hZCBpbiBVRFAgb3ZlciBJUAorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFja2V0U2l6ZSA9IDE1MDA7CisKK3N0YXRpYyBpbnQgVW5pZm9ybVJhbmQoaW50IGxpbWl0KSB7CisgICAgcmV0dXJuICgoZG91YmxlKXJhbmQoKSAqIGxpbWl0KSAvIFJBTkRfTUFYOworfQorCitBUlRQV3JpdGVyOjpBUlRQV3JpdGVyKGludCBmZCkKKyAgICA6IG1GbGFncygwKSwKKyAgICAgIG1GZChmZCksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1SZWZsZWN0b3IobmV3IEFIYW5kbGVyUmVmbGVjdG9yPEFSVFBXcml0ZXI+KHRoaXMpKSB7CisgICAgQ0hFQ0tfR0UoZmQsIDApOworCisgICAgbUxvb3Blci0+c2V0TmFtZSgicnRwIHdyaXRlciIpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKKyAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRShtU29ja2V0LCAwKTsKKworICAgIG1lbXNldChtUlRQQWRkci5zaW5femVybywgMCwgc2l6ZW9mKG1SVFBBZGRyLnNpbl96ZXJvKSk7CisgICAgbVJUUEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKyNpZiAxCisgICAgbVJUUEFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyNlbHNlCisgICAgbVJUUEFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxNzIuMTkuMTguMjQ2Iik7CisjZW5kaWYKKworICAgIG1SVFBBZGRyLnNpbl9wb3J0ID0gaHRvbnMoNTYzNCk7CisgICAgQ0hFQ0tfRVEoMCwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpICYgMSk7CisKKyAgICBtUlRDUEFkZHIgPSBtUlRQQWRkcjsKKyAgICBtUlRDUEFkZHIuc2luX3BvcnQgPSBodG9ucyhudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkgfCAxKTsKKworI2lmIExPR19UT19GSUxFUworICAgIG1SVFBGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydHBvdXQuYmluIiwKKyAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAwNjQ0KTsKKyAgICBDSEVDS19HRShtUlRQRmQsIDApOworCisgICAgbVJUQ1BGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydGNwb3V0LmJpbiIsCisgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAorICAgICAgICAgICAgMDY0NCk7CisgICAgQ0hFQ0tfR0UobVJUQ1BGZCwgMCk7CisjZW5kaWYKK30KKworQVJUUFdyaXRlcjo6fkFSVFBXcml0ZXIoKSB7CisjaWYgTE9HX1RPX0ZJTEVTCisgICAgY2xvc2UobVJUQ1BGZCk7CisgICAgbVJUQ1BGZCA9IC0xOworCisgICAgY2xvc2UobVJUUEZkKTsKKyAgICBtUlRQRmQgPSAtMTsKKyNlbmRpZgorCisgICAgY2xvc2UobVNvY2tldCk7CisgICAgbVNvY2tldCA9IC0xOworCisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKK30KKworc3RhdHVzX3QgQVJUUFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQVJUUFdyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiAobUZsYWdzICYga0ZsYWdFT1MpICE9IDA7Cit9CisKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GbGFncyAmPSB+a0ZsYWdFT1M7CisgICAgbVNvdXJjZUlEID0gcmFuZCgpOworICAgIG1TZXFObyA9IFVuaWZvcm1SYW5kKDY1NTM2KTsKKyAgICBtUlRQVGltZUJhc2UgPSByYW5kKCk7CisgICAgbU51bVJUUFNlbnQgPSAwOworICAgIG1OdW1SVFBPY3RldHNTZW50ID0gMDsKKyAgICBtTGFzdFJUUFRpbWUgPSAwOworICAgIG1MYXN0TlRQVGltZSA9IDA7CisgICAgbU51bVNSc1NlbnQgPSAwOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgbU1vZGUgPSBJTlZBTElEOworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIG1Nb2RlID0gSDI2NDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CisgICAgICAgIG1Nb2RlID0gSDI2MzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKKyAgICAgICAgbU1vZGUgPSBBTVJfTkI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7CisgICAgICAgIG1Nb2RlID0gQU1SX1dCOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKworICAgIHdoaWxlICghKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisKKyAgICB3aGlsZSAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVJUUFdyaXRlcjo6cGF1c2UoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCA0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwdHIgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIGlmICghbWVtY21wKHB0ciwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSkgeworICAgICAgICBidWZmZXItPnNldF9yYW5nZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShtU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOworCisjaWYgMAorICAgICAgICAgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShidWZmZXIpOworICAgICAgICAgICAgICAgIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkdW1wU2Vzc2lvbkRlc2MoKTsKKyNlbmRpZgorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGFydGVkOworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU1IsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICBzZW5kQnllKCk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdTdGFydGVkOworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWFkOgorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb25SZWFkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZW5kU1I6CisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvblNlbmRTUihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWY7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWVkaWFCdWYpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBMT0dJKCJyZWFjaGVkIEVPUy4iKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdFT1M7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICBMT0dWKCJyZWFkIGJ1ZmZlciBvZiBzaXplICVkIiwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgeworICAgICAgICAgICAgU3RyaXBTdGFydGNvZGUobWVkaWFCdWYpOworICAgICAgICAgICAgc2VuZEFWQ0RhdGEobWVkaWFCdWYpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEgyNjMpIHsKKyAgICAgICAgICAgIHNlbmRIMjYzRGF0YShtZWRpYUJ1Zik7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gQU1SX05CIHx8IG1Nb2RlID09IEFNUl9XQikgeworICAgICAgICAgICAgc2VuZEFNUkRhdGEobWVkaWFCdWYpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVkaWFCdWYtPnJlbGVhc2UoKTsKKyAgICBtZWRpYUJ1ZiA9IE5VTEw7CisKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBBUlRQV3JpdGVyOjpvblNlbmRTUihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDY1NTM2KTsKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgYWRkU1IoYnVmZmVyKTsKKyAgICBhZGRTREVTKGJ1ZmZlcik7CisKKyAgICBzZW5kKGJ1ZmZlciwgdHJ1ZSAvKiBpc1JUQ1AgKi8pOworCisgICAgKyttTnVtU1JzU2VudDsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCkgeworICAgIHNzaXplX3QgbiA9IHNlbmR0bygKKyAgICAgICAgICAgIG1Tb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCwKKyAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikoaXNSVENQID8gJm1SVENQQWRkciA6ICZtUlRQQWRkciksCisgICAgICAgICAgICBzaXplb2YobVJUQ1BBZGRyKSk7CisKKyAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyNpZiBMT0dfVE9fRklMRVMKKyAgICBpbnQgZmQgPSBpc1JUQ1AgPyBtUlRDUEZkIDogbVJUUEZkOworCisgICAgdWludDMyX3QgbXMgPSB0b2xlbChBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMGxsKTsKKyAgICB1aW50MzJfdCBsZW5ndGggPSB0b2xlbChidWZmZXItPnNpemUoKSk7CisgICAgd3JpdGUoZmQsICZtcywgc2l6ZW9mKG1zKSk7CisgICAgd3JpdGUoZmQsICZsZW5ndGgsIHNpemVvZihsZW5ndGgpKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyNlbmRpZgorfQorCit2b2lkIEFSVFBXcml0ZXI6OmFkZFNSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKworICAgIGRhdGFbMF0gPSAweDgwIHwgMDsKKyAgICBkYXRhWzFdID0gMjAwOyAgLy8gU1IKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gNjsKKyAgICBkYXRhWzRdID0gbVNvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgZGF0YVs4XSA9IG1MYXN0TlRQVGltZSA+PiAoNjQgLSA4KTsKKyAgICBkYXRhWzldID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAxNikpICYgMHhmZjsKKyAgICBkYXRhWzEwXSA9IChtTGFzdE5UUFRpbWUgPj4gKDY0IC0gMjQpKSAmIDB4ZmY7CisgICAgZGF0YVsxMV0gPSAobUxhc3ROVFBUaW1lID4+IDMyKSAmIDB4ZmY7CisgICAgZGF0YVsxMl0gPSAobUxhc3ROVFBUaW1lID4+IDI0KSAmIDB4ZmY7CisgICAgZGF0YVsxM10gPSAobUxhc3ROVFBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobUxhc3ROVFBUaW1lID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE1XSA9IG1MYXN0TlRQVGltZSAmIDB4ZmY7CisKKyAgICBkYXRhWzE2XSA9IChtTGFzdFJUUFRpbWUgPj4gMjQpICYgMHhmZjsKKyAgICBkYXRhWzE3XSA9IChtTGFzdFJUUFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzE4XSA9IChtTGFzdFJUUFRpbWUgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMTldID0gbUxhc3RSVFBUaW1lICYgMHhmZjsKKworICAgIGRhdGFbMjBdID0gbU51bVJUUFNlbnQgPj4gMjQ7CisgICAgZGF0YVsyMV0gPSAobU51bVJUUFNlbnQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzIyXSA9IChtTnVtUlRQU2VudCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsyM10gPSBtTnVtUlRQU2VudCAmIDB4ZmY7CisKKyAgICBkYXRhWzI0XSA9IG1OdW1SVFBPY3RldHNTZW50ID4+IDI0OworICAgIGRhdGFbMjVdID0gKG1OdW1SVFBPY3RldHNTZW50ID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsyNl0gPSAobU51bVJUUE9jdGV0c1NlbnQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMjddID0gbU51bVJUUE9jdGV0c1NlbnQgJiAweGZmOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIDI4KTsKK30KKwordm9pZCBBUlRQV3JpdGVyOjphZGRTREVTKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKyAgICBkYXRhWzBdID0gMHg4MCB8IDE7CisgICAgZGF0YVsxXSA9IDIwMjsgIC8vIFNERVMKKyAgICBkYXRhWzRdID0gbVNvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgc2l6ZV90IG9mZnNldCA9IDg7CisKKyAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtDTkFNRSA9ICJzb21lb25lQHNvbWV3aGVyZSI7CisgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa0NOQU1FKTsKKworICAgIG1lbWNweSgmZGF0YVtvZmZzZXRdLCBrQ05BTUUsIHN0cmxlbihrQ05BTUUpKTsKKyAgICBvZmZzZXQgKz0gc3RybGVuKGtDTkFNRSk7CisKKyAgICBkYXRhW29mZnNldCsrXSA9IDc7ICAvLyBOT1RFCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa05PVEUgPSAiSGVsbCdzIGZyb3plbiBvdmVyLiI7CisgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa05PVEUpOworCisgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtOT1RFLCBzdHJsZW4oa05PVEUpKTsKKyAgICBvZmZzZXQgKz0gc3RybGVuKGtOT1RFKTsKKworICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKKworICAgIGlmICgob2Zmc2V0ICUgNCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBjb3VudCA9IDQgLSAob2Zmc2V0ICUgNCk7CisgICAgICAgIHN3aXRjaCAoY291bnQpIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBudW1Xb3JkcyA9IChvZmZzZXQgLyA0KSAtIDE7CisgICAgZGF0YVsyXSA9IG51bVdvcmRzID4+IDg7CisgICAgZGF0YVszXSA9IG51bVdvcmRzICYgMHhmZjsKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyBvZmZzZXQpOworfQorCisvLyBzdGF0aWMKK3VpbnQ2NF90IEFSVFBXcml0ZXI6OkdldE5vd05UUCgpIHsKKyAgICB1aW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBub3dVcyArPSAoKDcwbGwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMGxsOworCisgICAgdWludDY0X3QgaGkgPSBub3dVcyAvIDEwMDAwMDBsbDsKKyAgICB1aW50NjRfdCBsbyA9ICgoMWxsIDw8IDMyKSAqIChub3dVcyAlIDEwMDAwMDBsbCkpIC8gMTAwMDAwMGxsOworCisgICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKK30KKwordm9pZCBBUlRQV3JpdGVyOjpkdW1wU2Vzc2lvbkRlc2MoKSB7CisgICAgQVN0cmluZyBzZHA7CisgICAgc2RwID0gInY9MFxyXG4iOworCisgICAgc2RwLmFwcGVuZCgibz0tICIpOworCisgICAgdWludDY0X3QgbnRwID0gR2V0Tm93TlRQKCk7CisgICAgc2RwLmFwcGVuZChudHApOworICAgIHNkcC5hcHBlbmQoIiAiKTsKKyAgICBzZHAuYXBwZW5kKG50cCk7CisgICAgc2RwLmFwcGVuZCgiIElOIElQNCAxMjcuMC4wLjBcclxuIik7CisKKyAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICJzPVNhbXBsZVxyXG4iCisgICAgICAgICAgImk9UGxheWluZyBhcm91bmRcclxuIgorICAgICAgICAgICJjPUlOIElQNCAiKTsKKworICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7CisgICAgYWRkci5zX2FkZHIgPSBudG9obChJTkFERFJfTE9PUEJBQ0spOworCisgICAgc2RwLmFwcGVuZChpbmV0X250b2EoYWRkcikpOworCisgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAgICJhPXJhbmdlOm5wdD1ub3ctXHJcbiIpOworCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGlmIChtTW9kZSA9PSBIMjY0IHx8IG1Nb2RlID09IEgyNjMpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgibT12aWRlbyAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZHAuYXBwZW5kKCJtPWF1ZGlvICIpOworICAgIH0KKworICAgIHNkcC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIlZCIsIG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSkpOworICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgIiBSVFAvQVZQICIgUFRfU1RSICJcclxuIgorICAgICAgICAgICJiPUFTIDMyMDAwMFxyXG4iCisgICAgICAgICAgImE9cnRwbWFwOiIgUFRfU1RSICIgIik7CisKKyAgICBpZiAobU1vZGUgPT0gSDI2NCkgeworICAgICAgICBzZHAuYXBwZW5kKCJIMjY0LzkwMDAwIik7CisgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBIMjYzKSB7CisgICAgICAgIHNkcC5hcHBlbmQoIkgyNjMtMTk5OC85MDAwMCIpOworICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gQU1SX05CIHx8IG1Nb2RlID09IEFNUl9XQikgeworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzOworICAgICAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgICAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworCisgICAgICAgIENIRUNLX0VRKG51bUNoYW5uZWxzLCAxKTsKKyAgICAgICAgQ0hFQ0tfRVEoc2FtcGxlUmF0ZSwgKG1Nb2RlID09IEFNUl9OQikgPyA4MDAwIDogMTYwMDApOworCisgICAgICAgIHNkcC5hcHBlbmQobU1vZGUgPT0gQU1SX05CID8gIkFNUiIgOiAiQU1SLVdCIik7CisgICAgICAgIHNkcC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIvJWQvJWQiLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscykpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgaWYgKG1Nb2RlID09IEgyNjQgfHwgbU1vZGUgPT0gSDI2MykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworCisgICAgICAgIHNkcC5hcHBlbmQoImE9Y2xpcHJlY3QgMCwwLCIpOworICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7CisgICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICAgICAiYT1mcmFtZXNpemU6IiBQVF9TVFIgIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIi0iKTsKKyAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgImE9Zm10cDoiIFBUX1NUUiAiIHByb2ZpbGUtbGV2ZWwtaWQ9Iik7CisgICAgICAgIHNkcC5hcHBlbmQobVByb2ZpbGVMZXZlbCk7CisgICAgICAgIHNkcC5hcHBlbmQoIjtzcHJvcC1wYXJhbWV0ZXItc2V0cz0iKTsKKworICAgICAgICBzZHAuYXBwZW5kKG1TZXFQYXJhbVNldCk7CisgICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKKyAgICAgICAgc2RwLmFwcGVuZChtUGljUGFyYW1TZXQpOworICAgICAgICBzZHAuYXBwZW5kKCI7cGFja2V0aXphdGlvbi1tb2RlPTFcclxuIik7CisgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBBTVJfTkIgfHwgbU1vZGUgPT0gQU1SX1dCKSB7CisgICAgICAgIHNkcC5hcHBlbmQoImE9Zm10cDoiIFBUX1NUUiAiIG9jdGVkLWFsaWduXHJcbiIpOworICAgIH0KKworICAgIExPR0koIiVzIiwgc2RwLmNfc3RyKCkpOworfQorCit2b2lkIEFSVFBXcml0ZXI6Om1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdGFydENvZGVbXSA9ICJceDAwXHgwMFx4MDBceDAxIjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBDSEVDS19HRShzaXplLCAwdSk7CisKKyAgICBzaXplX3Qgc3RhcnRDb2RlUG9zID0gMDsKKyAgICB3aGlsZSAoc3RhcnRDb2RlUG9zICsgMyA8IHNpemUKKyAgICAgICAgICAgICYmIG1lbWNtcChrU3RhcnRDb2RlLCAmZGF0YVtzdGFydENvZGVQb3NdLCA0KSkgeworICAgICAgICArK3N0YXJ0Q29kZVBvczsKKyAgICB9CisKKyAgICBDSEVDS19MVChzdGFydENvZGVQb3MgKyAzLCBzaXplKTsKKworICAgIENIRUNLX0VRKCh1bnNpZ25lZClkYXRhWzBdLCAweDY3dSk7CisKKyAgICBtUHJvZmlsZUxldmVsID0KKyAgICAgICAgU3RyaW5nUHJpbnRmKCIlMDJYJTAyWCUwMlgiLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKKworICAgIGVuY29kZUJhc2U2NChkYXRhLCBzdGFydENvZGVQb3MsICZtU2VxUGFyYW1TZXQpOworCisgICAgZW5jb2RlQmFzZTY0KCZkYXRhW3N0YXJ0Q29kZVBvcyArIDRdLCBzaXplIC0gc3RhcnRDb2RlUG9zIC0gNCwKKyAgICAgICAgICAgICAgICAgJm1QaWNQYXJhbVNldCk7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEJ5ZSgpIHsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig4KTsKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgKmRhdGErKyA9ICgyIDw8IDYpIHwgMTsKKyAgICAqZGF0YSsrID0gMjAzOworICAgICpkYXRhKysgPSAwOworICAgICpkYXRhKysgPSAxOworICAgICpkYXRhKysgPSBtU291cmNlSUQgPj4gMjQ7CisgICAgKmRhdGErKyA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAqZGF0YSsrID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgKmRhdGErKyA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCA4KTsKKworICAgIHNlbmQoYnVmZmVyLCB0cnVlIC8qIGlzUlRDUCAqLyk7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXIgKm1lZGlhQnVmKSB7CisgICAgLy8gMTIgYnl0ZXMgUlRQIGhlYWRlciArIDIgYnl0ZXMgZm9yIHRoZSBGVS1pbmRpY2F0b3IgYW5kIEZVLWhlYWRlci4KKyAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMnUpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMGxsKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhQYWNrZXRTaXplKTsKKyAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgMTIgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIC8vIFRoZSBkYXRhIGZpdHMgaW50byBhIHNpbmdsZSBwYWNrZXQKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgZGF0YVsxXSA9ICgxIDw8IDcpIHwgUFQ7ICAvLyBNLWJpdAorICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKKyAgICAgICAgZGF0YVs4XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMV0gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgICAgIG1lbWNweSgmZGF0YVsxMl0sCisgICAgICAgICAgICAgICBtZWRpYURhdGEsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyAxMik7CisKKyAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICAgICAgKyttU2VxTm87CisgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRlUtQQorCisgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtZWRpYURhdGFbMF07CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAxOworCisgICAgICAgIGJvb2wgZmlyc3RQYWNrZXQgPSB0cnVlOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgbGFzdFBhY2tldCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2l6ZSArIDEyICsgMiA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIGxhc3RQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gMTIgLSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/ICgxIDw8IDcpIDogMHgwMCkgfCBQVDsgIC8vIE0tYml0CisgICAgICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OworICAgICAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOworICAgICAgICAgICAgZGF0YVs4XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVsxMV0gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgICAgICAgICBkYXRhWzEyXSA9IDI4IHwgKG5hbFR5cGUgJiAweGUwKTsKKworICAgICAgICAgICAgQ0hFQ0soIWZpcnN0UGFja2V0IHx8ICFsYXN0UGFja2V0KTsKKworICAgICAgICAgICAgZGF0YVsxM10gPQorICAgICAgICAgICAgICAgIChmaXJzdFBhY2tldCA/IDB4ODAgOiAweDAwKQorICAgICAgICAgICAgICAgIHwgKGxhc3RQYWNrZXQgPyAweDQwIDogMHgwMCkKKyAgICAgICAgICAgICAgICB8IChuYWxUeXBlICYgMHgxZik7CisKKyAgICAgICAgICAgIG1lbWNweSgmZGF0YVsxNF0sICZtZWRpYURhdGFbb2Zmc2V0XSwgc2l6ZSk7CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMTQgKyBzaXplKTsKKworICAgICAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICAgICAgICAgICsrbVNlcU5vOworICAgICAgICAgICAgKyttTnVtUlRQU2VudDsKKyAgICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7CisKKyAgICAgICAgICAgIGZpcnN0UGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7Cit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1ZikgeworICAgIENIRUNLX0dFKGtNYXhQYWNrZXRTaXplLCAxMnUgKyAydSk7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOworCisgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgLy8gaGV4ZHVtcChtZWRpYURhdGEsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBDSEVDS19FUSgodW5zaWduZWQpbWVkaWFEYXRhWzBdLCAwdSk7CisgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1lZGlhRGF0YVsxXSwgMHUpOworCisgICAgc2l6ZV90IG9mZnNldCA9IDI7CisgICAgc2l6ZV90IHNpemUgPSBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4UGFja2V0U2l6ZSk7CisgICAgICAgIC8vIENIRUNLX0xFKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtMiArIDE0LCBidWZmZXItPmNhcGFjaXR5KCkpOworCisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzaXplIC0gb2Zmc2V0OworICAgICAgICBib29sIGxhc3RQYWNrZXQgPSAocmVtYWluaW5nICsgMTQgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgaWYgKCFsYXN0UGFja2V0KSB7CisgICAgICAgICAgICByZW1haW5pbmcgPSBidWZmZXItPmNhcGFjaXR5KCkgLSAxNDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgZGF0YVswXSA9IDB4ODA7CisgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/IDB4ODAgOiAweDAwKSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBkYXRhWzEyXSA9IChvZmZzZXQgPT0gMikgPyAweDA0IDogMHgwMDsgIC8vIFA9PywgVj0wCisgICAgICAgIGRhdGFbMTNdID0gMHgwMDsgIC8vIFBMRU4gPSBQRUJJVCA9IDAKKworICAgICAgICBtZW1jcHkoJmRhdGFbMTRdLCAmbWVkaWFEYXRhW29mZnNldF0sIHJlbWFpbmluZyk7CisgICAgICAgIG9mZnNldCArPSByZW1haW5pbmc7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCByZW1haW5pbmcgKyAxNCk7CisKKyAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICAgICAgKyttU2VxTm87CisgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7CisgICAgfQorCisgICAgbUxhc3RSVFBUaW1lID0gcnRwVGltZTsKKyAgICBtTGFzdE5UUFRpbWUgPSBHZXROb3dOVFAoKTsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZUKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbOF0gPSB7CisgICAgICAgIDk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzldID0geworICAgICAgICAxMzIsIDE3NywgMjUzLCAyODUsIDMxNywgMzY1LCAzOTcsIDQ2MSwgNDc3CisgICAgfTsKKworICAgIHNpemVfdCBmcmFtZVNpemUgPSBpc1dpZGUgPyBrRnJhbWVTaXplV0JbRlRdIDoga0ZyYW1lU2l6ZU5CW0ZUXTsKKworICAgIC8vIFJvdW5kIHVwIGJpdHMgdG8gYnl0ZXMgYW5kIGFkZCAxIGZvciB0aGUgaGVhZGVyIGJ5dGUuCisgICAgZnJhbWVTaXplID0gKGZyYW1lU2l6ZSArIDcpIC8gOCArIDE7CisKKyAgICByZXR1cm4gZnJhbWVTaXplOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnNlbmRBTVJEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1ZikgeworICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBtZWRpYUxlbmd0aCA9IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIENIRUNLX0dFKGtNYXhQYWNrZXRTaXplLCAxMnUgKyAxdSArIG1lZGlhTGVuZ3RoKTsKKworICAgIGNvbnN0IGJvb2wgaXNXaWRlID0gKG1Nb2RlID09IEFNUl9XQik7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzIC8gKGlzV2lkZSA/IDI1MCA6IDEyNSkpOworCisgICAgLy8gaGV4ZHVtcChtZWRpYURhdGEsIG1lZGlhTGVuZ3RoKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiB0YWJsZU9mQ29udGVudHM7CisgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgd2hpbGUgKHNyY09mZnNldCA8IG1lZGlhTGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgdG9jID0gbWVkaWFEYXRhW3NyY09mZnNldF07CisKKyAgICAgICAgdW5zaWduZWQgRlQgPSAodG9jID4+IDMpICYgMHgwZjsKKyAgICAgICAgQ0hFQ0soKGlzV2lkZSAmJiBGVCA8PSA4KSB8fCAoIWlzV2lkZSAmJiBGVCA8PSA3KSk7CisKKyAgICAgICAgdGFibGVPZkNvbnRlbnRzLnB1c2godG9jKTsKKyAgICAgICAgc3JjT2Zmc2V0ICs9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKKyAgICB9CisgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBtZWRpYUxlbmd0aCk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4UGFja2V0U2l6ZSk7CisgICAgQ0hFQ0tfTEUobWVkaWFMZW5ndGggKyAxMiArIDEsIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisKKyAgICAvLyBUaGUgZGF0YSBmaXRzIGludG8gYSBzaW5nbGUgcGFja2V0CisgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIGRhdGFbMF0gPSAweDgwOworICAgIGRhdGFbMV0gPSBQVDsKKyAgICBpZiAobU51bVJUUFNlbnQgPT0gMCkgeworICAgICAgICAvLyBTaWduYWwgc3RhcnQgb2YgdGFsay1zcHVydC4KKyAgICAgICAgZGF0YVsxXSB8PSAweDgwOyAgLy8gTS1iaXQKKyAgICB9CisgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OworICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgIGRhdGFbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOworICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgIGRhdGFbMTJdID0gMHhmMDsgIC8vIENNUj0xNSwgUlI9MAorCisgICAgc2l6ZV90IGRzdE9mZnNldCA9IDEzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWJsZU9mQ29udGVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdWludDhfdCB0b2MgPSB0YWJsZU9mQ29udGVudHNbaV07CisKKyAgICAgICAgaWYgKGkgKyAxIDwgdGFibGVPZkNvbnRlbnRzLnNpemUoKSkgeworICAgICAgICAgICAgdG9jIHw9IDB4ODA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b2MgJj0gfjB4ODA7CisgICAgICAgIH0KKworICAgICAgICBkYXRhW2RzdE9mZnNldCsrXSA9IHRvYzsKKyAgICB9CisKKyAgICBzcmNPZmZzZXQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFibGVPZkNvbnRlbnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgdG9jID0gdGFibGVPZkNvbnRlbnRzW2ldOworICAgICAgICB1bnNpZ25lZCBGVCA9ICh0b2MgPj4gMykgJiAweDBmOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRlQpOworCisgICAgICAgICsrc3JjT2Zmc2V0OyAgLy8gc2tpcCB0b2MKKyAgICAgICAgbWVtY3B5KCZkYXRhW2RzdE9mZnNldF0sICZtZWRpYURhdGFbc3JjT2Zmc2V0XSwgZnJhbWVTaXplIC0gMSk7CisgICAgICAgIHNyY09mZnNldCArPSBmcmFtZVNpemUgLSAxOworICAgICAgICBkc3RPZmZzZXQgKz0gZnJhbWVTaXplIC0gMTsKKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIGRzdE9mZnNldCk7CisKKyAgICBzZW5kKGJ1ZmZlciwgZmFsc2UgLyogaXNSVENQICovKTsKKworICAgICsrbVNlcU5vOworICAgICsrbU51bVJUUFNlbnQ7CisgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAxMjsKKworICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjOGQyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1JUUF9XUklURVJfSF8KKworI2RlZmluZSBBX1JUUF9XUklURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjZGVmaW5lIExPR19UT19GSUxFUyAgICAwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFCdWZmZXI7CisKK3N0cnVjdCBBUlRQV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBBUlRQV3JpdGVyKGludCBmZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BUlRQV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U3RhcnQgID0gJ3N0cnQnLAorICAgICAgICBrV2hhdFN0b3AgICA9ICdzdG9wJywKKyAgICAgICAga1doYXRSZWFkICAgPSAncmVhZCcsCisgICAgICAgIGtXaGF0U2VuZFNSID0gJ3NyICAnLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga0ZsYWdTdGFydGVkICA9IDEsCisgICAgICAgIGtGbGFnRU9TICAgICAgPSAyLAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisKKyAgICBpbnQgbUZkOworCisjaWYgTE9HX1RPX0ZJTEVTCisgICAgaW50IG1SVFBGZDsKKyAgICBpbnQgbVJUQ1BGZDsKKyNlbmRpZgorCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPiA+IG1SZWZsZWN0b3I7CisKKyAgICBpbnQgbVNvY2tldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJUUEFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIG1SVENQQWRkcjsKKworICAgIEFTdHJpbmcgbVByb2ZpbGVMZXZlbDsKKyAgICBBU3RyaW5nIG1TZXFQYXJhbVNldDsKKyAgICBBU3RyaW5nIG1QaWNQYXJhbVNldDsKKworICAgIHVpbnQzMl90IG1Tb3VyY2VJRDsKKyAgICB1aW50MzJfdCBtU2VxTm87CisgICAgdWludDMyX3QgbVJUUFRpbWVCYXNlOworICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OworICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OworICAgIHVpbnQzMl90IG1MYXN0UlRQVGltZTsKKyAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7CisKKyAgICBpbnQzMl90IG1OdW1TUnNTZW50OworCisgICAgZW51bSB7CisgICAgICAgIElOVkFMSUQsCisgICAgICAgIEgyNjQsCisgICAgICAgIEgyNjMsCisgICAgICAgIEFNUl9OQiwKKyAgICAgICAgQU1SX1dCLAorICAgIH0gbU1vZGU7CisKKyAgICBzdGF0aWMgdWludDY0X3QgR2V0Tm93TlRQKCk7CisKKyAgICB2b2lkIG9uUmVhZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNlbmRTUihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIGFkZFNSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgYWRkU0RFUyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHZvaWQgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2b2lkIGR1bXBTZXNzaW9uRGVzYygpOworCisgICAgdm9pZCBzZW5kQnllKCk7CisgICAgdm9pZCBzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOworICAgIHZvaWQgc2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1Zik7CisgICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOworCisgICAgdm9pZCBzZW5kKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgaXNSVENQKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFSVFBXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1JUUF9XUklURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI4YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsNjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBUlRTUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworY29uc3QgaW50NjRfdCBBUlRTUENvbm5lY3Rpb246OmtTZWxlY3RUaW1lb3V0VXMgPSAxMDAwbGw7CisKK0FSVFNQQ29ubmVjdGlvbjo6QVJUU1BDb25uZWN0aW9uKCkKKyAgICA6IG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbVNvY2tldCgtMSksCisgICAgICBtQ29ubmVjdGlvbklEKDApLAorICAgICAgbU5leHRDU2VxKDApLAorICAgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyhmYWxzZSkgeworfQorCitBUlRTUENvbm5lY3Rpb246On5BUlRTUENvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Tb2NrZXQgPj0gMCkgeworICAgICAgICBMT0dFKCJDb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4sIGNsb3NpbmcgdGhlIHNvY2tldC4iKTsKKyAgICAgICAgY2xvc2UobVNvY2tldCk7CisgICAgICAgIG1Tb2NrZXQgPSAtMTsKKyAgICB9Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpjb25uZWN0KGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCBpZCgpKTsKKyAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6ZGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpzZW5kUmVxdWVzdCgKKyAgICAgICAgY29uc3QgY2hhciAqcmVxdWVzdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgaWQoKSk7CisgICAgbXNnLT5zZXRTdHJpbmcoInJlcXVlc3QiLCByZXF1ZXN0KTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b2JzZXJ2ZUJpbmFyeURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPYnNlcnZlQmluYXJ5RGF0YSwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBBUlRTUENvbm5lY3Rpb246Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29ubmVjdDoKKyAgICAgICAgICAgIG9uQ29ubmVjdChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrV2hhdERpc2Nvbm5lY3Q6CisgICAgICAgICAgICBvbkRpc2Nvbm5lY3QobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga1doYXRDb21wbGV0ZUNvbm5lY3Rpb246CisgICAgICAgICAgICBvbkNvbXBsZXRlQ29ubmVjdGlvbihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRSZXF1ZXN0OgorICAgICAgICAgICAgb25TZW5kUmVxdWVzdChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrV2hhdFJlY2VpdmVSZXNwb25zZToKKyAgICAgICAgICAgIG9uUmVjZWl2ZVJlc3BvbnNlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtXaGF0T2JzZXJ2ZUJpbmFyeURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJm1PYnNlcnZlQmluYXJ5TWVzc2FnZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gc3RhdGljCitib29sIEFSVFNQQ29ubmVjdGlvbjo6UGFyc2VVUkwoCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgQVN0cmluZyAqaG9zdCwgdW5zaWduZWQgKnBvcnQsIEFTdHJpbmcgKnBhdGgpIHsKKyAgICBob3N0LT5jbGVhcigpOworICAgICpwb3J0ID0gMDsKKyAgICBwYXRoLT5jbGVhcigpOworCisgICAgaWYgKHN0cm5jYXNlY21wKCJydHNwOi8vIiwgdXJsLCA3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJjaHIoJnVybFs3XSwgJy8nKTsKKworICAgIGlmIChzbGFzaFBvcyA9PSBOVUxMKSB7CisgICAgICAgIGhvc3QtPnNldFRvKCZ1cmxbN10pOworICAgICAgICBwYXRoLT5zZXRUbygiLyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhvc3QtPnNldFRvKCZ1cmxbN10sIHNsYXNoUG9zIC0gJnVybFs3XSk7CisgICAgICAgIHBhdGgtPnNldFRvKHNsYXNoUG9zKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOworCisgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB4OworICAgICAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKGNvbG9uUG9zICsgMSwgJngpIHx8IHggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICpwb3J0ID0geDsKKworICAgICAgICBzaXplX3QgY29sb25PZmZzZXQgPSBjb2xvblBvcyAtIGhvc3QtPmNfc3RyKCk7CisgICAgICAgIHNpemVfdCB0cmFpbGluZyA9IGhvc3QtPnNpemUoKSAtIGNvbG9uT2Zmc2V0OworICAgICAgICBob3N0LT5lcmFzZShjb2xvbk9mZnNldCwgdHJhaWxpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgICpwb3J0ID0gNTU0OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBNYWtlU29ja2V0QmxvY2tpbmcoaW50IHMsIGJvb2wgYmxvY2tpbmcpIHsKKyAgICAvLyBNYWtlIHNvY2tldCBub24tYmxvY2tpbmcuCisgICAgaW50IGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCk7CisgICAgQ0hFQ0tfTkUoZmxhZ3MsIC0xKTsKKworICAgIGlmIChibG9ja2luZykgeworICAgICAgICBmbGFncyAmPSB+T19OT05CTE9DSzsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyB8PSBPX05PTkJMT0NLOworICAgIH0KKworICAgIENIRUNLX05FKGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzKSwgLTEpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgKyttQ29ubmVjdGlvbklEOworCisgICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgY2xvc2UobVNvY2tldCk7CisgICAgICAgIG1Tb2NrZXQgPSAtMTsKKworICAgICAgICBmbHVzaFBlbmRpbmdSZXF1ZXN0cygpOworICAgIH0KKworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CisKKyAgICBBU3RyaW5nIHVybDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVybCIsICZ1cmwpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOworCisgICAgQVN0cmluZyBob3N0LCBwYXRoOworICAgIHVuc2lnbmVkIHBvcnQ7CisgICAgaWYgKCFQYXJzZVVSTCh1cmwuY19zdHIoKSwgJmhvc3QsICZwb3J0LCAmcGF0aCkpIHsKKyAgICAgICAgTE9HRSgiTWFsZm9ybWVkIHJ0c3AgdXJsICVzIiwgdXJsLmNfc3RyKCkpOworCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgcmVwbHktPnBvc3QoKTsKKworICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShob3N0LmNfc3RyKCkpOworICAgIGlmIChlbnQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJVbmtub3duIGhvc3QgJXMiLCBob3N0LmNfc3RyKCkpOworCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLUVOT0VOVCk7CisgICAgICAgIHJlcGx5LT5wb3N0KCk7CisKKyAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisKKyAgICBNYWtlU29ja2V0QmxvY2tpbmcobVNvY2tldCwgZmFsc2UpOworCisgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZTsKKyAgICBtZW1zZXQocmVtb3RlLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlLnNpbl96ZXJvKSk7CisgICAgcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHJlbW90ZS5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOworICAgIHJlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisgICAgaW50IGVyciA9IDo6Y29ubmVjdCgKKyAgICAgICAgICAgIG1Tb2NrZXQsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlLCBzaXplb2YocmVtb3RlKSk7CisKKyAgICByZXBseS0+c2V0SW50MzIoInNlcnZlci1pcCIsIG50b2hsKHJlbW90ZS5zaW5fYWRkci5zX2FkZHIpKTsKKworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbXBsZXRlQ29ubmVjdGlvbiwgaWQoKSk7CisgICAgICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29ubmVjdGlvbi1pZCIsIG1Db25uZWN0aW9uSUQpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1lcnJubyk7CisgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKworICAgICAgICBjbG9zZShtU29ja2V0KTsKKyAgICAgICAgbVNvY2tldCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgT0spOworICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7CisgICAgICAgIG1OZXh0Q1NlcSA9IDE7CisKKyAgICAgICAgcG9zdFJlY2VpdmVSZXBvbnNlRXZlbnQoKTsKKyAgICB9CisKKyAgICByZXBseS0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25EaXNjb25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgfHwgbVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgY2xvc2UobVNvY2tldCk7CisgICAgICAgIG1Tb2NrZXQgPSAtMTsKKworICAgICAgICBmbHVzaFBlbmRpbmdSZXF1ZXN0cygpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOworCisgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBPSyk7CisgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworCisgICAgcmVwbHktPnBvc3QoKTsKK30KKwordm9pZCBBUlRTUENvbm5lY3Rpb246Om9uQ29tcGxldGVDb25uZWN0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CisKKyAgICBpbnQzMl90IGNvbm5lY3Rpb25JRDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY29ubmVjdGlvbi1pZCIsICZjb25uZWN0aW9uSUQpKTsKKworICAgIGlmICgoY29ubmVjdGlvbklEICE9IG1Db25uZWN0aW9uSUQpIHx8IG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7CisgICAgICAgIC8vIFdoaWxlIHdlIHdlcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0LCB0aGUgYXR0ZW1wdCB3YXMKKyAgICAgICAgLy8gY2FuY2VsbGVkLgorICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FQ09OTkFCT1JURUQpOworICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdHYudHZfc2VjID0gMDsKKyAgICB0di50dl91c2VjID0ga1NlbGVjdFRpbWVvdXRVczsKKworICAgIGZkX3NldCB3czsKKyAgICBGRF9aRVJPKCZ3cyk7CisgICAgRkRfU0VUKG1Tb2NrZXQsICZ3cyk7CisKKyAgICBpbnQgcmVzID0gc2VsZWN0KG1Tb2NrZXQgKyAxLCBOVUxMLCAmd3MsIE5VTEwsICZ0dik7CisgICAgQ0hFQ0tfR0UocmVzLCAwKTsKKworICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAvLyBUaW1lZCBvdXQuIE5vdCB5ZXQgY29ubmVjdGVkLgorCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGVycjsKKyAgICBzb2NrbGVuX3Qgb3B0aW9uTGVuID0gc2l6ZW9mKGVycik7CisgICAgQ0hFQ0tfRVEoZ2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJm9wdGlvbkxlbiksIDApOworICAgIENIRUNLX0VRKG9wdGlvbkxlbiwgKHNvY2tsZW5fdClzaXplb2YoZXJyKSk7CisKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgTE9HRSgiZXJyID0gJWQgKCVzKSIsIGVyciwgc3RyZXJyb3IoZXJyKSk7CisKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCAtZXJyKTsKKworICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgICAgIGNsb3NlKG1Tb2NrZXQpOworICAgICAgICBtU29ja2V0ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBPSyk7CisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKyAgICAgICAgbU5leHRDU2VxID0gMTsKKworICAgICAgICBwb3N0UmVjZWl2ZVJlcG9uc2VFdmVudCgpOworICAgIH0KKworICAgIHJlcGx5LT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpvblNlbmRSZXF1ZXN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CisKKyAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FTk9UQ09OTik7CisgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJyZXF1ZXN0IiwgJnJlcXVlc3QpKTsKKworICAgIC8vIEZpbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gaGVhZGVycyBhbmQgdGhlIGJvZHkuCisgICAgc3NpemVfdCBpID0gcmVxdWVzdC5maW5kKCJcclxuXHJcbiIpOworICAgIENIRUNLX0dFKGksIDApOworCisgICAgaW50MzJfdCBjc2VxID0gbU5leHRDU2VxKys7CisKKyAgICBBU3RyaW5nIGNzZXFIZWFkZXIgPSAiQ1NlcTogIjsKKyAgICBjc2VxSGVhZGVyLmFwcGVuZChjc2VxKTsKKyAgICBjc2VxSGVhZGVyLmFwcGVuZCgiXHJcbiIpOworCisgICAgcmVxdWVzdC5pbnNlcnQoY3NlcUhlYWRlciwgaSArIDIpOworCisgICAgTE9HVigiJXMiLCByZXF1ZXN0LmNfc3RyKCkpOworCisgICAgc2l6ZV90IG51bUJ5dGVzU2VudCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzU2VudCA8IHJlcXVlc3Quc2l6ZSgpKSB7CisgICAgICAgIHNzaXplX3QgbiA9CisgICAgICAgICAgICBzZW5kKG1Tb2NrZXQsIHJlcXVlc3QuY19zdHIoKSArIG51bUJ5dGVzU2VudCwKKyAgICAgICAgICAgICAgICAgcmVxdWVzdC5zaXplKCkgLSBudW1CeXRlc1NlbnQsIDApOworCisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIC8vIFNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICBMT0dFKCJTZXJ2ZXIgdW5leHBlY3RlZGx5IGNsb3NlZCB0aGUgY29ubmVjdGlvbi4iKTsKKworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBFUlJPUl9JTyk7CisgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HRSgiRXJyb3Igc2VuZGluZyBydHNwIHJlcXVlc3QuIik7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1lcnJubyk7CisgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNTZW50ICs9IChzaXplX3QpbjsKKyAgICB9CisKKyAgICBtUGVuZGluZ1JlcXVlc3RzLmFkZChjc2VxLCByZXBseSk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpvblJlY2VpdmVSZXNwb25zZSgpIHsKKyAgICBtUmVjZWl2ZVJlc3BvbnNlRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdHYudHZfc2VjID0gMDsKKyAgICB0di50dl91c2VjID0ga1NlbGVjdFRpbWVvdXRVczsKKworICAgIGZkX3NldCByczsKKyAgICBGRF9aRVJPKCZycyk7CisgICAgRkRfU0VUKG1Tb2NrZXQsICZycyk7CisKKyAgICBpbnQgcmVzID0gc2VsZWN0KG1Tb2NrZXQgKyAxLCAmcnMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgQ0hFQ0tfR0UocmVzLCAwKTsKKworICAgIGlmIChyZXMgPT0gMSkgeworICAgICAgICBNYWtlU29ja2V0QmxvY2tpbmcobVNvY2tldCwgdHJ1ZSk7CisKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVjZWl2ZVJUU1BSZXBvbnNlKCk7CisKKyAgICAgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIGZhbHNlKTsKKworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBob3JyaWJsZSwgaXJyZXBhcmFibGUgaGFzIGhhcHBlbmVkLgorICAgICAgICAgICAgZmx1c2hQZW5kaW5nUmVxdWVzdHMoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvc3RSZWNlaXZlUmVwb25zZUV2ZW50KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpmbHVzaFBlbmRpbmdSZXF1ZXN0cygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nUmVxdWVzdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbVBlbmRpbmdSZXF1ZXN0cy52YWx1ZUF0KGkpOworCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLUVDT05OQUJPUlRFRCk7CisgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgfQorCisgICAgbVBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cG9zdFJlY2VpdmVSZXBvbnNlRXZlbnQoKSB7CisgICAgaWYgKG1SZWNlaXZlUmVzcG9uc2VFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWNlaXZlUmVzcG9uc2UsIGlkKCkpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyA9IHRydWU7Cit9CisKK3N0YXR1c190IEFSVFNQQ29ubmVjdGlvbjo6cmVjZWl2ZSh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIHNzaXplX3QgbiA9IHJlY3YobVNvY2tldCwgKHVpbnQ4X3QgKilkYXRhICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0LCAwKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgLy8gU2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgIExPR0UoIlNlcnZlciB1bmV4cGVjdGVkbHkgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HRSgiRXJyb3IgcmVhZGluZyBydHNwIHJlc3BvbnNlLiIpOworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoc2l6ZV90KW47CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEFSVFNQQ29ubmVjdGlvbjo6cmVjZWl2ZUxpbmUoQVN0cmluZyAqbGluZSkgeworICAgIGxpbmUtPmNsZWFyKCk7CisKKyAgICBib29sIHNhd0NSID0gZmFsc2U7CisgICAgZm9yICg7OykgeworICAgICAgICBjaGFyIGM7CisgICAgICAgIGlmIChyZWNlaXZlKCZjLCAxKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhd0NSICYmIGMgPT0gJ1xuJykgeworICAgICAgICAgICAgbGluZS0+ZXJhc2UobGluZS0+c2l6ZSgpIC0gMSwgMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUtPmFwcGVuZCgmYywgMSk7CisKKyAgICAgICAgaWYgKGMgPT0gJyQnICYmIGxpbmUtPnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsLWNhc2UgZm9yIGludGVybGVhdmVkIGJpbmFyeSBkYXRhLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzYXdDUiA9IChjID09ICdccicpOworICAgIH0KK30KKworc3A8QUJ1ZmZlcj4gQVJUU1BDb25uZWN0aW9uOjpyZWNlaXZlQmluYXJ5RGF0YSgpIHsKKyAgICB1aW50OF90IHhbM107CisgICAgaWYgKHJlY2VpdmUoeCwgMykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoKHhbMV0gPDwgOCkgfCB4WzJdKTsKKyAgICBpZiAocmVjZWl2ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiaW5kZXgiLCAoaW50MzJfdCl4WzBdKTsKKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK2Jvb2wgQVJUU1BDb25uZWN0aW9uOjpyZWNlaXZlUlRTUFJlcG9uc2UoKSB7CisgICAgQVN0cmluZyBzdGF0dXNMaW5lOworCisgICAgaWYgKCFyZWNlaXZlTGluZSgmc3RhdHVzTGluZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0dXNMaW5lID09ICIkIikgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSByZWNlaXZlQmluYXJ5RGF0YSgpOworCisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PYnNlcnZlQmluYXJ5TWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU9ic2VydmVCaW5hcnlNZXNzYWdlLT5kdXAoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJyZWNlaXZlZCBiaW5hcnkgZGF0YSwgYnV0IG5vIG9uZSBjYXJlcy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0gbmV3IEFSVFNQUmVzcG9uc2U7CisgICAgcmVzcG9uc2UtPm1TdGF0dXNMaW5lID0gc3RhdHVzTGluZTsKKworICAgIExPR0koInN0YXR1czogJXMiLCByZXNwb25zZS0+bVN0YXR1c0xpbmUuY19zdHIoKSk7CisKKyAgICBzc2l6ZV90IHNwYWNlMSA9IHJlc3BvbnNlLT5tU3RhdHVzTGluZS5maW5kKCIgIik7CisgICAgaWYgKHNwYWNlMSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzc2l6ZV90IHNwYWNlMiA9IHJlc3BvbnNlLT5tU3RhdHVzTGluZS5maW5kKCIgIiwgc3BhY2UxICsgMSk7CisgICAgaWYgKHNwYWNlMiA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFTdHJpbmcgc3RhdHVzQ29kZVN0cigKKyAgICAgICAgICAgIHJlc3BvbnNlLT5tU3RhdHVzTGluZSwgc3BhY2UxICsgMSwgc3BhY2UyIC0gc3BhY2UxIC0gMSk7CisKKyAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKAorICAgICAgICAgICAgICAgIHN0YXR1c0NvZGVTdHIuY19zdHIoKSwgJnJlc3BvbnNlLT5tU3RhdHVzQ29kZSkKKyAgICAgICAgICAgIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA8IDEwMCB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgPiA5OTkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFTdHJpbmcgbGluZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghcmVjZWl2ZUxpbmUoJmxpbmUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsaW5lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTE9HVigibGluZTogJXMiLCBsaW5lLmNfc3RyKCkpOworCisgICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKyAgICAgICAgaWYgKGNvbG9uUG9zIDwgMCkgeworICAgICAgICAgICAgLy8gTWFsZm9ybWVkIGhlYWRlciBsaW5lLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyBrZXkobGluZSwgMCwgY29sb25Qb3MpOworICAgICAgICBrZXkudHJpbSgpOworICAgICAgICBrZXkudG9sb3dlcigpOworCisgICAgICAgIGxpbmUuZXJhc2UoMCwgY29sb25Qb3MgKyAxKTsKKyAgICAgICAgbGluZS50cmltKCk7CisKKyAgICAgICAgcmVzcG9uc2UtPm1IZWFkZXJzLmFkZChrZXksIGxpbmUpOworICAgIH0KKworICAgIHVuc2lnbmVkIGxvbmcgY29udGVudExlbmd0aCA9IDA7CisKKyAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgiY29udGVudC1sZW5ndGgiKTsKKworICAgIGlmIChpID49IDApIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZSA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKHZhbHVlLmNfc3RyKCksICZjb250ZW50TGVuZ3RoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnRlbnRMZW5ndGggPiAwKSB7CisgICAgICAgIHJlc3BvbnNlLT5tQ29udGVudCA9IG5ldyBBQnVmZmVyKGNvbnRlbnRMZW5ndGgpOworCisgICAgICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgICAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgY29udGVudExlbmd0aCkgeworICAgICAgICAgICAgc3NpemVfdCBuID0gcmVjdigKKyAgICAgICAgICAgICAgICAgICAgbVNvY2tldCwgcmVzcG9uc2UtPm1Db250ZW50LT5kYXRhKCkgKyBudW1CeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLSBudW1CeXRlc1JlYWQsIDApOworCisgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1CeXRlc1JlYWQgKz0gKHNpemVfdCluOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5vdGlmeVJlc3BvbnNlTGlzdGVuZXIocmVzcG9uc2UpOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQVJUU1BDb25uZWN0aW9uOjpQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKKyAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgbG9uZyAqeCkgeworICAgIGNoYXIgKmVuZDsKKyAgICAqeCA9IHN0cnRvdWwoZnJvbSwgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBmcm9tIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVJUU1BDb25uZWN0aW9uOjpub3RpZnlSZXNwb25zZUxpc3RlbmVyKAorICAgICAgICBjb25zdCBzcDxBUlRTUFJlc3BvbnNlPiAmcmVzcG9uc2UpIHsKKyAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgiY3NlcSIpOworCisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEFTdHJpbmcgdmFsdWUgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKworICAgIHVuc2lnbmVkIGxvbmcgY3NlcTsKKyAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKHZhbHVlLmNfc3RyKCksICZjc2VxKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaSA9IG1QZW5kaW5nUmVxdWVzdHMuaW5kZXhPZktleShjc2VxKTsKKworICAgIGlmIChpIDwgMCkgeworICAgICAgICAvLyBVbnNvbGljaXRlZCByZXNwb25zZT8KKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBtUGVuZGluZ1JlcXVlc3RzLnZhbHVlQXQoaSk7CisgICAgbVBlbmRpbmdSZXF1ZXN0cy5yZW1vdmVJdGVtc0F0KGkpOworCisgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBPSyk7CisgICAgcmVwbHktPnNldE9iamVjdCgicmVzcG9uc2UiLCByZXNwb25zZSk7CisgICAgcmVwbHktPnBvc3QoKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlMGQ1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRTUF9DT05ORUNUSU9OX0hfCisKKyNkZWZpbmUgQV9SVFNQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IEFSVFNQUmVzcG9uc2UgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdW5zaWduZWQgbG9uZyBtU3RhdHVzQ29kZTsKKyAgICBBU3RyaW5nIG1TdGF0dXNMaW5lOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsQVN0cmluZz4gbUhlYWRlcnM7CisgICAgc3A8QUJ1ZmZlcj4gbUNvbnRlbnQ7Cit9OworCitzdHJ1Y3QgQVJUU1BDb25uZWN0aW9uIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBBUlRTUENvbm5lY3Rpb24oKTsKKworICAgIHZvaWQgY29ubmVjdChjb25zdCBjaGFyICp1cmwsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIHZvaWQgZGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKworICAgIHZvaWQgc2VuZFJlcXVlc3QoY29uc3QgY2hhciAqcmVxdWVzdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisKKyAgICB2b2lkIG9ic2VydmVCaW5hcnlEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVJUU1BDb25uZWN0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgRElTQ09OTkVDVEVELAorICAgICAgICBDT05ORUNUSU5HLAorICAgICAgICBDT05ORUNURUQsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdENvbm5lY3QgICAgICAgICAgICA9ICdjb25uJywKKyAgICAgICAga1doYXREaXNjb25uZWN0ICAgICAgICAgPSAnZGlzYycsCisgICAgICAgIGtXaGF0Q29tcGxldGVDb25uZWN0aW9uID0gJ2NvbWMnLAorICAgICAgICBrV2hhdFNlbmRSZXF1ZXN0ICAgICAgICA9ICdzcmVxJywKKyAgICAgICAga1doYXRSZWNlaXZlUmVzcG9uc2UgICAgPSAncnJlcycsCisgICAgICAgIGtXaGF0T2JzZXJ2ZUJpbmFyeURhdGEgID0gJ29iaW4nLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU2VsZWN0VGltZW91dFVzOworCisgICAgU3RhdGUgbVN0YXRlOworICAgIGludCBtU29ja2V0OworICAgIGludDMyX3QgbUNvbm5lY3Rpb25JRDsKKyAgICBpbnQzMl90IG1OZXh0Q1NlcTsKKyAgICBib29sIG1SZWNlaXZlUmVzcG9uc2VFdmVudFBlbmRpbmc7CisKKyAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxBTWVzc2FnZT4gPiBtUGVuZGluZ1JlcXVlc3RzOworCisgICAgc3A8QU1lc3NhZ2U+IG1PYnNlcnZlQmluYXJ5TWVzc2FnZTsKKworICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNvbXBsZXRlQ29ubmVjdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNlbmRSZXF1ZXN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUmVjZWl2ZVJlc3BvbnNlKCk7CisKKyAgICB2b2lkIGZsdXNoUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgdm9pZCBwb3N0UmVjZWl2ZVJlcG9uc2VFdmVudCgpOworCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmZiBzb21ldGhpbmcgd2VudCB1bnJlY292ZXJhYmx5IHdyb25nLgorICAgIGJvb2wgcmVjZWl2ZVJUU1BSZXBvbnNlKCk7CisgICAgc3RhdHVzX3QgcmVjZWl2ZSh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCByZWNlaXZlTGluZShBU3RyaW5nICpsaW5lKTsKKyAgICBzcDxBQnVmZmVyPiByZWNlaXZlQmluYXJ5RGF0YSgpOworICAgIGJvb2wgbm90aWZ5UmVzcG9uc2VMaXN0ZW5lcihjb25zdCBzcDxBUlRTUFJlc3BvbnNlPiAmcmVzcG9uc2UpOworCisgICAgc3RhdGljIGJvb2wgUGFyc2VVUkwoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIEFTdHJpbmcgKmhvc3QsIHVuc2lnbmVkICpwb3J0LCBBU3RyaW5nICpwYXRoKTsKKworICAgIHN0YXRpYyBib29sIFBhcnNlU2luZ2xlVW5zaWduZWRMb25nKAorICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgbG9uZyAqeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRTUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1JUU1BfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbnRyb2xsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTYzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQVJUU1BDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlICJNeUhhbmRsZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQVJUU1BDb250cm9sbGVyOjpBUlRTUENvbnRyb2xsZXIoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICA6IG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgbVNlZWtEb25lQ2IoTlVMTCksCisgICAgICBtU2Vla0RvbmVDb29raWUoTlVMTCksCisgICAgICBtTGFzdFNlZWtDb21wbGV0ZWRUaW1lVXMoLTEpIHsKKyAgICBtUmVmbGVjdG9yID0gbmV3IEFIYW5kbGVyUmVmbGVjdG9yPEFSVFNQQ29udHJvbGxlcj4odGhpcyk7CisgICAgbG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7Cit9CisKK0FSVFNQQ29udHJvbGxlcjo6fkFSVFNQQ29udHJvbGxlcigpIHsKKyAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOworfQorCitzdGF0dXNfdCBBUlRTUENvbnRyb2xsZXI6OmNvbm5lY3QoY29uc3QgY2hhciAqdXJsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9BTFJFQURZX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29ubmVjdERvbmUsIG1SZWZsZWN0b3ItPmlkKCkpOworCisgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHVybCwgbUxvb3Blcik7CisKKyAgICBtU3RhdGUgPSBDT05ORUNUSU5HOworCisgICAgbUhhbmRsZXItPmNvbm5lY3QobXNnKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CisgICAgICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1Db25uZWN0aW9uUmVzdWx0OworfQorCit2b2lkIEFSVFNQQ29udHJvbGxlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0RG9uZSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgbUhhbmRsZXItPmRpc2Nvbm5lY3QobXNnKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKwordm9pZCBBUlRTUENvbnRyb2xsZXI6OnNlZWtBc3luYygKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgIHZvaWQgKCpzZWVrRG9uZUNiKSh2b2lkICopLCB2b2lkICpjb29raWUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0soc2Vla0RvbmVDYiAhPSBOVUxMKTsKKyAgICBDSEVDSyhtU2Vla0RvbmVDYiA9PSBOVUxMKTsKKworICAgIC8vIElnbm9yZSBzZWVrIHJlcXVlc3RzIHRoYXQgYXJlIHRvbyBzb29uIGFmdGVyIHRoZSBwcmV2aW91cyBvbmUgaGFzCisgICAgLy8gY29tcGxldGVkLCB3ZSBkb24ndCB3YW50IHRvIHN3YW1wIHRoZSBzZXJ2ZXIuCisKKyAgICBib29sIHRvb0Vhcmx5ID0KKyAgICAgICAgbUxhc3RTZWVrQ29tcGxldGVkVGltZVVzID49IDAKKyAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgPCBtTGFzdFNlZWtDb21wbGV0ZWRUaW1lVXMgKyA1MDAwMDBsbDsKKworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEIHx8IHRvb0Vhcmx5KSB7CisgICAgICAgICgqc2Vla0RvbmVDYikoY29va2llKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TZWVrRG9uZUNiID0gc2Vla0RvbmVDYjsKKyAgICBtU2Vla0RvbmVDb29raWUgPSBjb29raWU7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vla0RvbmUsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1IYW5kbGVyLT5zZWVrKHRpbWVVcywgbXNnKTsKK30KKworc2l6ZV90IEFSVFNQQ29udHJvbGxlcjo6Y291bnRUcmFja3MoKSB7CisgICAgaWYgKG1IYW5kbGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIG1IYW5kbGVyLT5jb3VudFRyYWNrcygpOworfQorCitzcDxNZWRpYVNvdXJjZT4gQVJUU1BDb250cm9sbGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBDSEVDSyhtSGFuZGxlciAhPSBOVUxMKTsKKworICAgIHJldHVybiBtSGFuZGxlci0+Z2V0UGFja2V0U291cmNlKGluZGV4KTsKK30KKworc3A8TWV0YURhdGE+IEFSVFNQQ29udHJvbGxlcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIENIRUNLKG1IYW5kbGVyICE9IE5VTEwpOworCisgICAgcmV0dXJuIG1IYW5kbGVyLT5nZXRQYWNrZXRTb3VyY2UoaW5kZXgpLT5nZXRGb3JtYXQoKTsKK30KKwordm9pZCBBUlRTUENvbnRyb2xsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29ubmVjdERvbmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmbUNvbm5lY3Rpb25SZXN1bHQpKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IChtQ29ubmVjdGlvblJlc3VsdCA9PSBPSykgPyBDT05ORUNURUQgOiBESVNDT05ORUNURUQ7CisKKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXREaXNjb25uZWN0RG9uZToKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZWVrRG9uZToKKyAgICAgICAgeworICAgICAgICAgICAgTE9HSSgic2VlayBkb25lIik7CisKKyAgICAgICAgICAgIG1MYXN0U2Vla0NvbXBsZXRlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICAgICAgICAgIHZvaWQgKCpzZWVrRG9uZUNiKSh2b2lkICopID0gbVNlZWtEb25lQ2I7CisgICAgICAgICAgICBtU2Vla0RvbmVDYiA9IE5VTEw7CisKKyAgICAgICAgICAgICgqc2Vla0RvbmVDYikobVNlZWtEb25lQ29va2llKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludDY0X3QgQVJUU1BDb250cm9sbGVyOjpnZXROb3JtYWxQbGF5VGltZVVzKCkgeworICAgIENIRUNLKG1IYW5kbGVyICE9IE5VTEwpOworICAgIHJldHVybiBtSGFuZGxlci0+Z2V0Tm9ybWFsUGxheVRpbWVVcygpOworfQorCitpbnQ2NF90IEFSVFNQQ29udHJvbGxlcjo6Z2V0UXVldWVEdXJhdGlvblVzKGJvb2wgKmVvcykgeworICAgICplb3MgPSB0cnVlOworCisgICAgaW50NjRfdCBtaW5RdWV1ZWREdXJhdGlvblVzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVyLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gc291cmNlID0gbUhhbmRsZXItPmdldFBhY2tldFNvdXJjZShpKTsKKworICAgICAgICBib29sIG5ld0VPUzsKKyAgICAgICAgaW50NjRfdCBxdWV1ZWREdXJhdGlvblVzID0gc291cmNlLT5nZXRRdWV1ZUR1cmF0aW9uVXMoJm5ld0VPUyk7CisKKyAgICAgICAgaWYgKCFuZXdFT1MpIHsKKyAgICAgICAgICAgICplb3MgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID09IDAgfHwgcXVldWVkRHVyYXRpb25VcyA8IG1pblF1ZXVlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1pblF1ZXVlZER1cmF0aW9uVXMgPSBxdWV1ZWREdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pblF1ZXVlZER1cmF0aW9uVXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJjYWZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQVNlc3Npb25EZXNjcmlwdGlvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU2Vzc2lvbkRlc2NyaXB0aW9uOjpBU2Vzc2lvbkRlc2NyaXB0aW9uKCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSB7Cit9CisKK0FTZXNzaW9uRGVzY3JpcHRpb246On5BU2Vzc2lvbkRlc2NyaXB0aW9uKCkgeworfQorCitib29sIEFTZXNzaW9uRGVzY3JpcHRpb246OnNldFRvKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgbUlzVmFsaWQgPSBwYXJzZShkYXRhLCBzaXplKTsKKworICAgIGlmICghbUlzVmFsaWQpIHsKKyAgICAgICAgbVRyYWNrcy5jbGVhcigpOworICAgICAgICBtRm9ybWF0cy5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBtSXNWYWxpZDsKK30KKworYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpwYXJzZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1UcmFja3MuY2xlYXIoKTsKKyAgICBtRm9ybWF0cy5jbGVhcigpOworCisgICAgbVRyYWNrcy5wdXNoKEF0dHJpYnMoKSk7CisgICAgbUZvcm1hdHMucHVzaChBU3RyaW5nKCJbcm9vdF0iKSk7CisKKyAgICBBU3RyaW5nIGRlc2MoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICBMT0dJKCIlcyIsIGRlc2MuY19zdHIoKSk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBzc2l6ZV90IGVvbFBvcyA9IGRlc2MuZmluZCgiXHJcbiIsIGkpOworICAgICAgICBpZiAoZW9sUG9zIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGxpbmUoZGVzYywgaSwgZW9sUG9zIC0gaSk7CisKKyAgICAgICAgaWYgKGxpbmUuc2l6ZSgpIDwgMiB8fCBsaW5lLmNfc3RyKClbMV0gIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGxpbmUuY19zdHIoKVswXSkgeworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChsaW5lLmNfc3RyKCksICJ2PTAiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5LCB2YWx1ZTsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnNldFRvKGxpbmUsIDAsIGNvbG9uUG9zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICJhPWZtdHAiIHx8IGtleSA9PSAiYT1ydHBtYXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwga2V5ID09ICJhPWZyYW1lc2l6ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBjb2xvblBvcyArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNldFRvKGxpbmUsIDAsIHNwYWNlUG9zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29sb25Qb3MgPSBzcGFjZVBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldFRvKGxpbmUsIGNvbG9uUG9zICsgMSwgbGluZS5zaXplKCkgLSBjb2xvblBvcyAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleS50cmltKCk7CisgICAgICAgICAgICAgICAgdmFsdWUudHJpbSgpOworCisgICAgICAgICAgICAgICAgTE9HVigiYWRkaW5nICclcycgPT4gJyVzJyIsIGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HVigibmV3IHNlY3Rpb24gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nKGxpbmUsIDIsIGxpbmUuc2l6ZSgpIC0gMikuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBtVHJhY2tzLnB1c2goQXR0cmlicygpKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0cy5wdXNoKEFTdHJpbmcobGluZSwgMiwgbGluZS5zaXplKCkgLSAyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVN0cmluZyBrZXksIHZhbHVlOworCisgICAgICAgICAgICAgICAgc3NpemVfdCBlcXVhbFBvcyA9IGxpbmUuZmluZCgiPSIpOworCisgICAgICAgICAgICAgICAga2V5ID0gQVN0cmluZyhsaW5lLCAwLCBlcXVhbFBvcyArIDEpOworICAgICAgICAgICAgICAgIHZhbHVlID0gQVN0cmluZyhsaW5lLCBlcXVhbFBvcyArIDEsIGxpbmUuc2l6ZSgpIC0gZXF1YWxQb3MgLSAxKTsKKworICAgICAgICAgICAgICAgIGtleS50cmltKCk7CisgICAgICAgICAgICAgICAgdmFsdWUudHJpbSgpOworCisgICAgICAgICAgICAgICAgTE9HVigiYWRkaW5nICclcycgPT4gJyVzJyIsIGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkgPSBlb2xQb3MgKyAyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFTZXNzaW9uRGVzY3JpcHRpb246OmlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc1ZhbGlkOworfQorCitzaXplX3QgQVNlc3Npb25EZXNjcmlwdGlvbjo6Y291bnRUcmFja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOworfQorCit2b2lkIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldEZvcm1hdChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKnZhbHVlKSBjb25zdCB7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDB1KTsKKyAgICBDSEVDS19MVChpbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgKnZhbHVlID0gbUZvcm1hdHMuaXRlbUF0KGluZGV4KTsKK30KKworYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpmaW5kQXR0cmlidXRlKAorICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKKyAgICBDSEVDS19HRShpbmRleCwgMHUpOworICAgIENIRUNLX0xUKGluZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKworICAgIGNvbnN0IEF0dHJpYnMgJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpOworICAgIHNzaXplX3QgaSA9IHRyYWNrLmluZGV4T2ZLZXkoQVN0cmluZyhrZXkpKTsKKworICAgIGlmIChpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnZhbHVlID0gdHJhY2sudmFsdWVBdChpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldEZvcm1hdFR5cGUoCisgICAgICAgIHNpemVfdCBpbmRleCwgdW5zaWduZWQgbG9uZyAqUFQsCisgICAgICAgIEFTdHJpbmcgKmRlc2MsIEFTdHJpbmcgKnBhcmFtcykgY29uc3QgeworICAgIEFTdHJpbmcgZm9ybWF0OworICAgIGdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CisKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOworICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKKworICAgIGNoYXIgKmVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKGxhc3RTcGFjZVBvcyArIDEsICZlbmQsIDEwKTsKKyAgICBDSEVDS19HVChlbmQsIGxhc3RTcGFjZVBvcyArIDEpOworICAgIENIRUNLX0VRKCplbmQsICdcMCcpOworCisgICAgKlBUID0geDsKKworICAgIGNoYXIga2V5WzIwXTsKKyAgICBzcHJpbnRmKGtleSwgImE9cnRwbWFwOiVsdSIsIHgpOworCisgICAgQ0hFQ0soZmluZEF0dHJpYnV0ZShpbmRleCwga2V5LCBkZXNjKSk7CisKKyAgICBzcHJpbnRmKGtleSwgImE9Zm10cDolbHUiLCB4KTsKKyAgICBpZiAoIWZpbmRBdHRyaWJ1dGUoaW5kZXgsIGtleSwgcGFyYW1zKSkgeworICAgICAgICBwYXJhbXMtPmNsZWFyKCk7CisgICAgfQorfQorCitib29sIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldERpbWVuc2lvbnMoCisgICAgICAgIHNpemVfdCBpbmRleCwgdW5zaWduZWQgbG9uZyBQVCwKKyAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3QgeworICAgICp3aWR0aCA9IDA7CisgICAgKmhlaWdodCA9IDA7CisKKyAgICBjaGFyIGtleVsyMF07CisgICAgc3ByaW50ZihrZXksICJhPWZyYW1lc2l6ZTolbHUiLCBQVCk7CisgICAgQVN0cmluZyB2YWx1ZTsKKyAgICBpZiAoIWZpbmRBdHRyaWJ1dGUoaW5kZXgsIGtleSwgJnZhbHVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqcyA9IHZhbHVlLmNfc3RyKCk7CisgICAgY2hhciAqZW5kOworICAgICp3aWR0aCA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgIENIRUNLX0dUKGVuZCwgcyk7CisgICAgQ0hFQ0tfRVEoKmVuZCwgJy0nKTsKKworICAgIHMgPSBlbmQgKyAxOworICAgICpoZWlnaHQgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICBDSEVDS19HVChlbmQsIHMpOworICAgIENIRUNLX0VRKCplbmQsICdcMCcpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQVNlc3Npb25EZXNjcmlwdGlvbjo6Z2V0RHVyYXRpb25VcyhpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdCB7CisgICAgKmR1cmF0aW9uVXMgPSAwOworCisgICAgQ0hFQ0sobUlzVmFsaWQpOworCisgICAgQVN0cmluZyB2YWx1ZTsKKyAgICBpZiAoIWZpbmRBdHRyaWJ1dGUoMCwgImE9cmFuZ2UiLCAmdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gIm5wdD1ub3ctIikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdD0iLCA0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqcyA9IHZhbHVlLmNfc3RyKCkgKyA0OworICAgIGNoYXIgKmVuZDsKKyAgICBkb3VibGUgZnJvbSA9IHN0cnRvZChzLCAmZW5kKTsKKyAgICBDSEVDS19HVChlbmQsIHMpOworICAgIENIRUNLX0VRKCplbmQsICctJyk7CisKKyAgICBzID0gZW5kICsgMTsKKyAgICBkb3VibGUgdG8gPSBzdHJ0b2QocywgJmVuZCk7CisgICAgQ0hFQ0tfR1QoZW5kLCBzKTsKKyAgICBDSEVDS19FUSgqZW5kLCAnXDAnKTsKKworICAgIENIRUNLX0dFKHRvLCBmcm9tKTsKKworICAgICpkdXJhdGlvblVzID0gKGludDY0X3QpKCh0byAtIGZyb20pICogMUU2KTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQVNlc3Npb25EZXNjcmlwdGlvbjo6UGFyc2VGb3JtYXREZXNjKAorICAgICAgICBjb25zdCBjaGFyICpkZXNjLCBpbnQzMl90ICp0aW1lc2NhbGUsIGludDMyX3QgKm51bUNoYW5uZWxzKSB7CisgICAgY29uc3QgY2hhciAqc2xhc2gxID0gc3RyY2hyKGRlc2MsICcvJyk7CisgICAgQ0hFQ0soc2xhc2gxICE9IE5VTEwpOworCisgICAgY29uc3QgY2hhciAqcyA9IHNsYXNoMSArIDE7CisgICAgY2hhciAqZW5kOworICAgIHVuc2lnbmVkIGxvbmcgeCA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgIENIRUNLX0dUKGVuZCwgcyk7CisgICAgQ0hFQ0soKmVuZCA9PSAnXDAnIHx8ICplbmQgPT0gJy8nKTsKKworICAgICp0aW1lc2NhbGUgPSB4OworICAgICpudW1DaGFubmVscyA9IDE7CisKKyAgICBpZiAoKmVuZCA9PSAnLycpIHsKKyAgICAgICAgcyA9IGVuZCArIDE7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgeCA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgICAgICBDSEVDS19HVChlbmQsIHMpOworICAgICAgICBDSEVDS19FUSgqZW5kLCAnXDAnKTsKKworICAgICAgICAqbnVtQ2hhbm5lbHMgPSB4OworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZhNzllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9TRVNTSU9OX0RFU0NSSVBUSU9OX0hfCisKKyNkZWZpbmUgQV9TRVNTSU9OX0RFU0NSSVBUSU9OX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQVN0cmluZzsKKworc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQVNlc3Npb25EZXNjcmlwdGlvbigpOworCisgICAgYm9vbCBzZXRUbyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgICAvLyBBY3R1YWxseSwgMSArIG51bWJlciBvZiB0cmFja3MsIGFzIGluZGV4IDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZQorICAgIC8vIHNlc3Npb24gZGVzY3JpcHRpb24gcm9vdC1sZXZlbCBhdHRyaWJ1dGVzLgorICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OworICAgIHZvaWQgZ2V0Rm9ybWF0KHNpemVfdCBpbmRleCwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OworCisgICAgdm9pZCBnZXRGb3JtYXRUeXBlKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1bnNpZ25lZCBsb25nICpQVCwKKyAgICAgICAgICAgIEFTdHJpbmcgKmRlc2MsIEFTdHJpbmcgKnBhcmFtcykgY29uc3Q7CisKKyAgICBib29sIGdldERpbWVuc2lvbnMoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGxvbmcgUFQsCisgICAgICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSBjb25zdDsKKworICAgIGJvb2wgZ2V0RHVyYXRpb25VcyhpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIFBhcnNlRm9ybWF0RGVzYygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2MsIGludDMyX3QgKnRpbWVzY2FsZSwgaW50MzJfdCAqbnVtQ2hhbm5lbHMpOworCisgICAgYm9vbCBmaW5kQXR0cmlidXRlKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BU2Vzc2lvbkRlc2NyaXB0aW9uKCk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxBU3RyaW5nLEFTdHJpbmc+IEF0dHJpYnM7CisKKyAgICBib29sIG1Jc1ZhbGlkOworICAgIFZlY3RvcjxBdHRyaWJzPiBtVHJhY2tzOworICAgIFZlY3RvcjxBU3RyaW5nPiBtRm9ybWF0czsKKworICAgIGJvb2wgcGFyc2UoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVNlc3Npb25EZXNjcmlwdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfU0VTU0lPTl9ERVNDUklQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWFlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1OSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCisgICAgICAgIEFBTVJBc3NlbWJsZXIuY3BwICAgICAgICAgICBcCisgICAgICAgIEFBVkNBc3NlbWJsZXIuY3BwICAgICAgICAgICBcCisgICAgICAgIEFIMjYzQXNzZW1ibGVyLmNwcCAgICAgICAgICBcCisgICAgICAgIEFNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcCAgICBcCisgICAgICAgIEFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIFwKKyAgICAgICAgQVBhY2tldFNvdXJjZS5jcHAgICAgICAgICAgIFwKKyAgICAgICAgQVJUUEFzc2VtYmxlci5jcHAgICAgICAgICAgIFwKKyAgICAgICAgQVJUUENvbm5lY3Rpb24uY3BwICAgICAgICAgIFwKKyAgICAgICAgQVJUUFNlc3Npb24uY3BwICAgICAgICAgICAgIFwKKyAgICAgICAgQVJUUFNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVJUUFdyaXRlci5jcHAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVJUU1BDb25uZWN0aW9uLmNwcCAgICAgICAgIFwKKyAgICAgICAgQVJUU1BDb250cm9sbGVyLmNwcCAgICAgICAgIFwKKyAgICAgICAgQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgICAgIFwKKyAgICAgICAgVURQUHVzaGVyLmNwcCAgICAgICAgICAgICAgIFwKKworTE9DQUxfQ19JTkNMVURFUzo9IFwKKwkkKEpOSV9IX0lOQ0xVREUpIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3J0c3AKKworaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKKyAgICAgICAgcnRwX3Rlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoSk5JX0hfSU5DTFVERSkgXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRTo9IHJ0cF90ZXN0CisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0MzYwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTAsMCArMSwxMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNWV9IQU5ETEVSX0hfCisKKyNkZWZpbmUgTVlfSEFORExFUl9IXworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk15SGFuZGxlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKy8vIElmIG5vIGFjY2VzcyB1bml0cyBhcmUgcmVjZWl2ZWQgd2l0aGluIDMgc2VjcywgYXNzdW1lIHRoYXQgdGhlIHJ0cAorLy8gc3RyZWFtIGhhcyBlbmRlZCBhbmQgc2lnbmFsIGVuZCBvZiBzdHJlYW0uCitzdGF0aWMgaW50NjRfdCBrQWNjZXNzVW5pdFRpbWVvdXRVcyA9IDMwMDAwMDBsbDsKKworLy8gSWYgbm8gYWNjZXNzIHVuaXRzIGFycml2ZSBmb3IgdGhlIGZpcnN0IDEwIHNlY3MgYWZ0ZXIgc3RhcnRpbmcgdGhlCisvLyBzdHJlYW0sIGFzc3VtZSBub25lIGV2ZXIgd2lsbCBhbmQgc2lnbmFsIEVPUyBvciBzd2l0Y2ggdHJhbnNwb3J0cy4KK3N0YXRpYyBpbnQ2NF90IGtTdGFydHVwVGltZW91dFVzID0gMTAwMDAwMDBsbDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgdm9pZCBNYWtlVXNlckFnZW50U3RyaW5nKEFTdHJpbmcgKnMpIHsKKyAgICBzLT5zZXRUbygic3RhZ2VmcmlnaHQvMS4xIChMaW51eDtBbmRyb2lkICIpOworCisjaWYgKFBST1BFUlRZX1ZBTFVFX01BWCA8IDgpCisjZXJyb3IgIlBST1BFUlRZX1ZBTFVFX01BWCBtdXN0IGJlIGF0IGxlYXN0IDgiCisjZW5kaWYKKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSIsIHZhbHVlLCAiVW5rbm93biIpOworICAgIHMtPmFwcGVuZCh2YWx1ZSk7CisgICAgcy0+YXBwZW5kKCIpIik7Cit9CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgeworICAgICAgICAgICAgKytzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKKworICAgICAgICBzaXplX3QgbGVuID0KKyAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKKworICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworc3RydWN0IE15SGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgTXlIYW5kbGVyKGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICAgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCisgICAgICAgICAgbUNvbm4obmV3IEFSVFNQQ29ubmVjdGlvbiksCisgICAgICAgICAgbVJUUENvbm4obmV3IEFSVFBDb25uZWN0aW9uKSwKKyAgICAgICAgICBtU2Vzc2lvblVSTCh1cmwpLAorICAgICAgICAgIG1TZXR1cFRyYWNrc1N1Y2Nlc3NmdWwoZmFsc2UpLAorICAgICAgICAgIG1TZWVrUGVuZGluZyhmYWxzZSksCisgICAgICAgICAgbUZpcnN0QWNjZXNzVW5pdCh0cnVlKSwKKyAgICAgICAgICBtRmlyc3RBY2Nlc3NVbml0TlRQKDApLAorICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkKDApLAorICAgICAgICAgIG1DaGVja1BlbmRpbmcoZmFsc2UpLAorICAgICAgICAgIG1DaGVja0dlbmVyYXRpb24oMCksCisgICAgICAgICAgbVRyeVRDUEludGVybGVhdmluZyhmYWxzZSksCisgICAgICAgICAgbVRyeUZha2VSVENQKGZhbHNlKSwKKyAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQoZmFsc2UpLAorICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0KGZhbHNlKSwKKyAgICAgICAgICBtU2Vla2FibGUoZmFsc2UpIHsKKyAgICAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgicnRzcCBuZXQiKTsKKyAgICAgICAgbU5ldExvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfSElHSEVTVCk7CisgICAgfQorCisgICAgdm9pZCBjb25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZG9uZU1zZykgeworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvbm4pOworICAgICAgICAoMSA/IG1OZXRMb29wZXIgOiBtTG9vcGVyKS0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCdiaW55JywgaWQoKSk7CisgICAgICAgIG1Db25uLT5vYnNlcnZlQmluYXJ5RGF0YShub3RpZnkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZG9uZU1zZykgeworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisKKyAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgIH0KKworICAgIHZvaWQgc2VlayhpbnQ2NF90IHRpbWVVcywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZkb25lTXNnKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3NlZWsnLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgiZG9uZU1zZyIsIGRvbmVNc2cpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGdldE5vcm1hbFBsYXlUaW1lVXMoKSB7CisgICAgICAgIGludDY0X3QgbWF4VGltZVVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1UcmFja3MuZWRpdEl0ZW1BdChpKS5tUGFja2V0U291cmNlCisgICAgICAgICAgICAgICAgLT5nZXROb3JtYWxQbGF5VGltZVVzKCk7CisKKyAgICAgICAgICAgIGlmIChpID09IDAgfHwgdGltZVVzID4gbWF4VGltZVVzKSB7CisgICAgICAgICAgICAgICAgbWF4VGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1heFRpbWVVczsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRSUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmKSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGJ1Zi0+ZGF0YSgpICsgYnVmLT5zaXplKCk7CisgICAgICAgIHB0clswXSA9IDB4ODAgfCAwOworICAgICAgICBwdHJbMV0gPSAyMDE7ICAvLyBSUgorICAgICAgICBwdHJbMl0gPSAwOworICAgICAgICBwdHJbM10gPSAxOworICAgICAgICBwdHJbNF0gPSAweGRlOyAgLy8gU1NSQworICAgICAgICBwdHJbNV0gPSAweGFkOworICAgICAgICBwdHJbNl0gPSAweGJlOworICAgICAgICBwdHJbN10gPSAweGVmOworCisgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgYnVmLT5zaXplKCkgKyA4KTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRTREVTKGludCBzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICAgICAgICBzb2NrbGVuX3QgYWRkclNpemUgPSBzaXplb2YoYWRkcik7CisgICAgICAgIENIRUNLX0VRKDAsIGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpKTsKKworICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKyAgICAgICAgZGF0YVswXSA9IDB4ODAgfCAxOworICAgICAgICBkYXRhWzFdID0gMjAyOyAgLy8gU0RFUworICAgICAgICBkYXRhWzRdID0gMHhkZTsgIC8vIFNTUkMKKyAgICAgICAgZGF0YVs1XSA9IDB4YWQ7CisgICAgICAgIGRhdGFbNl0gPSAweGJlOworICAgICAgICBkYXRhWzddID0gMHhlZjsKKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gODsKKworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQorCisgICAgICAgIEFTdHJpbmcgY25hbWUgPSAic3RhZ2VmcmlnaHRAIjsKKyAgICAgICAgY25hbWUuYXBwZW5kKGluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7CisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gY25hbWUuc2l6ZSgpOworCisgICAgICAgIG1lbWNweSgmZGF0YVtvZmZzZXRdLCBjbmFtZS5jX3N0cigpLCBjbmFtZS5zaXplKCkpOworICAgICAgICBvZmZzZXQgKz0gY25hbWUuc2l6ZSgpOworCisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gNjsgIC8vIFRPT0wKKworICAgICAgICBBU3RyaW5nIHRvb2w7CisgICAgICAgIE1ha2VVc2VyQWdlbnRTdHJpbmcoJnRvb2wpOworCisgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gdG9vbC5zaXplKCk7CisKKyAgICAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIHRvb2wuY19zdHIoKSwgdG9vbC5zaXplKCkpOworICAgICAgICBvZmZzZXQgKz0gdG9vbC5zaXplKCk7CisKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworCisgICAgICAgIGlmICgob2Zmc2V0ICUgNCkgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSA0IC0gKG9mZnNldCAlIDQpOworICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVdvcmRzID0gKG9mZnNldCAvIDQpIC0gMTsKKyAgICAgICAgZGF0YVsyXSA9IG51bVdvcmRzID4+IDg7CisgICAgICAgIGRhdGFbM10gPSBudW1Xb3JkcyAmIDB4ZmY7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7CisgICAgfQorCisgICAgLy8gSW4gY2FzZSB3ZSdyZSBiZWhpbmQgTkFULCBmaXJlIG9mZiB0d28gVURQIHBhY2tldHMgdG8gdGhlIHJlbW90ZQorICAgIC8vIHJ0cC9ydGNwIHBvcnRzIHRvIHBva2UgYSBob2xlIGludG8gdGhlIGZpcmV3YWxsIGZvciBmdXR1cmUgaW5jb21pbmcKKyAgICAvLyBwYWNrZXRzLiBXZSdyZSBnb2luZyB0byBzZW5kIGFuIFJSL1NERVMgUlRDUCBwYWNrZXQgdG8gYm90aCBvZiB0aGVtLgorICAgIHZvaWQgcG9rZUFIb2xlKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0LCBjb25zdCBBU3RyaW5nICZ0cmFuc3BvcnQpIHsKKyAgICAgICAgQVN0cmluZyBzb3VyY2U7CisgICAgICAgIEFTdHJpbmcgc2VydmVyX3BvcnQ7CisgICAgICAgIGlmICghR2V0QXR0cmlidXRlKHRyYW5zcG9ydC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSkKKyAgICAgICAgICAgICAgICB8fCAhR2V0QXR0cmlidXRlKHRyYW5zcG9ydC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfcG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydHBQb3J0LCBydGNwUG9ydDsKKyAgICAgICAgaWYgKHNzY2FuZihzZXJ2ZXJfcG9ydC5jX3N0cigpLCAiJWQtJWQiLCAmcnRwUG9ydCwgJnJ0Y3BQb3J0KSAhPSAyCisgICAgICAgICAgICAgICAgfHwgcnRwUG9ydCA8PSAwIHx8IHJ0cFBvcnQgPiA2NTUzNQorICAgICAgICAgICAgICAgIHx8IHJ0Y3BQb3J0IDw9MCB8fCBydGNwUG9ydCA+IDY1NTM1CisgICAgICAgICAgICAgICAgfHwgcnRjcFBvcnQgIT0gcnRwUG9ydCArIDEKKyAgICAgICAgICAgICAgICB8fCAocnRwUG9ydCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICAgICAgICBtZW1zZXQoYWRkci5zaW5femVybywgMCwgc2l6ZW9mKGFkZHIuc2luX3plcm8pKTsKKyAgICAgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoc291cmNlLmNfc3RyKCkpOworCisgICAgICAgIGlmIChhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSB1cCBhbiBSUi9TREVTIFJUQ1AgcGFja2V0LgorICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcig2NTUzNik7CisgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIGFkZFJSKGJ1Zik7CisgICAgICAgIGFkZFNERVMocnRwU29ja2V0LCBidWYpOworCisgICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhydHBQb3J0KTsKKworICAgICAgICBzc2l6ZV90IG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgcnRwU29ja2V0LCBidWYtPmRhdGEoKSwgYnVmLT5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgKGNvbnN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocnRjcFBvcnQpOworCisgICAgICAgIG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgcnRjcFNvY2tldCwgYnVmLT5kYXRhKCksIGJ1Zi0+c2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgIChjb25zdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOworICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWYtPnNpemUoKSk7CisKKyAgICAgICAgTE9HVigic3VjY2Vzc2Z1bGx5IHBva2VkIGhvbGVzLiIpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICBjYXNlICdjb25uJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HSSgiY29ubmVjdGlvbiByZXF1ZXN0IGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgc3RyZXJyb3IoLXJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSAiREVTQ1JJQkUgIjsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQWNjZXB0OiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkZXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdkaXNjJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlY29ubmVjdDsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJlY29ubmVjdCIsICZyZWNvbm5lY3QpICYmIHJlY29ubmVjdCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobVNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0dJKCJERVNDUklCRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHN0cmVycm9yKC1yZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA9PSAzMDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJsb2NhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSAiREVTQ1JJQkUgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQWNjZXB0OiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rlc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSAhPSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25EZXNjLT5zZXRUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPm1Db250ZW50LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5tQ29udGVudC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Vzc2lvbkRlc2MtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImNvbnRlbnQtYmFzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhc2VVUkwgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImNvbnRlbnQtbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhc2VVUkwgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXNlVVJMID0gbVNlc3Npb25VUkw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HVChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCksIDF1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cFRyYWNrKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnc2V0dSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU2l6ZSgidHJhY2staW5kZXgiLCAmdHJhY2tJbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0dJKCJTRVRVUCglZCkgY29tcGxldGVkIHdpdGggcmVzdWx0ICVkICglcykiLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHJlc3VsdCwgc3RyZXJyb3IoLXJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFjayAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJzZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JRCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG1TZXNzaW9uSUQuZmluZCgiOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvcHRpb25zLCBpLmUuICI7dGltZW91dD05MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2staW5kZXgiLCB0cmFja0luZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHJhbnNwb3J0ID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2tlQUhvbGUodHJhY2stPm1SVFBTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUlRDUFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbVJUUENvbm4tPmFkZFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SVFBTb2NrZXQsIHRyYWNrLT5tUlRDUFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25EZXNjLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LCB0cmFjay0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1ApOworCisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dXBUcmFja3NTdWNjZXNzZnVsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZUl0ZW1zQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2luZGV4OworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IG1TZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKSkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cFRyYWNrKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TZXR1cFRyYWNrc1N1Y2Nlc3NmdWwpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlBMQVkgIjsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BsYXknLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChyZXBseSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdwbGF5JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HSSgiUExBWSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHN0cmVycm9yKC1yZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSAhPSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVBsYXlSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LT5wb3N0KGtTdGFydHVwVGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnYWJvcic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaW5mby0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SVFBDb25uLT5yZW1vdmVTdHJlYW0oaW5mby0+bVJUUFNvY2tldCwgaW5mby0+bVJUQ1BTb2NrZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVNldHVwVHJhY2tzU3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TZWVrUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXROVFAgPSAwOworICAgICAgICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUUFBhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TZWVrYWJsZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCd0ZWFyJywgaWQoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlY29ubmVjdDsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJlY29ubmVjdCIsICZyZWNvbm5lY3QpICYmIHJlY29ubmVjdCkgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoInJlY29ubmVjdCIsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ID0gIlRFQVJET1dOICI7CisKKyAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIHVzZSBhZ2dyZWdhdGUgdXJsIGZyb20gU0RQIGhlcmUuLi4KKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndGVhcic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPR0koIlRFQVJET1dOIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgc3RyZXJyb3IoLXJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlY29ubmVjdDsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJlY29ubmVjdCIsICZyZWNvbm5lY3QpICYmIHJlY29ubmVjdCkgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoInJlY29ubmVjdCIsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAncXVpdCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Eb25lTXNnICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2ctPnNldEludDMyKCJyZXN1bHQiLCBVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2ctPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2cgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnY2hlayc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQ2hlY2tHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gb3V0ZGF0ZWQgbWVzc2FnZS4gSWdub3JlLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJzdHJlYW0gZW5kZWQ/IGFib3J0aW5nLiIpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3Qoa0FjY2Vzc1VuaXRUaW1lb3V0VXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdhY2N1JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZpcnN0OworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmlyc3QtcnRjcCIsICZmaXJzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVkRmlyc3RSVENQUGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJmaXJzdC1ydHAiLCAmZmlyc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKyttTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKKyAgICAgICAgICAgICAgICBwb3N0QWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOworCisgICAgICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2staW5kZXgiLCAmdHJhY2tJbmRleCkpOworCisgICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigibGF0ZSBwYWNrZXRzIGlnbm9yZWQuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlb3M7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJyZWNlaXZlZCBCWUUgb24gdHJhY2sgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0U291cmNlLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImFjY2Vzcy11bml0IiwgJm9iaikpOworCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IHN0YXRpY19jYXN0PEFCdWZmZXIgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlcU51bSA9ICh1aW50MzJfdClhY2Nlc3NVbml0LT5pbnQzMkRhdGEoKTsKKworICAgICAgICAgICAgICAgIGlmIChtU2Vla1BlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigid2UncmUgc2Vla2luZywgZHJvcHBpbmcgc3RhbGUgcGFja2V0LiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2VxTnVtIDwgdHJhY2stPm1GaXJzdFNlcU51bUluU2VnbWVudCkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJkcm9wcGluZyBzdGFsZSBhY2Nlc3MtdW5pdCAoJWQgPCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlcU51bSwgdHJhY2stPm1GaXJzdFNlcU51bUluU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQ2NF90IG50cFRpbWU7CisgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm50cC10aW1lIiwgKGludDY0X3QgKikmbnRwVGltZSkpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1OZXdTZWdtZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tTmV3U2VnbWVudCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIExPR1YoImZpcnN0IHNlZ21lbnQgdW5pdCBudHBUaW1lPTB4JTAxNmxseCBydHBUaW1lPSV1IHNlcT0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnRwVGltZSwgcnRwVGltZSwgc2VxTnVtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUZpcnN0QWNjZXNzVW5pdCkgeworICAgICAgICAgICAgICAgICAgICBtRG9uZU1zZy0+c2V0SW50MzIoInJlc3VsdCIsIE9LKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2ctPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2cgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0QWNjZXNzVW5pdE5UUCA9IG50cFRpbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG50cFRpbWUgPj0gbUZpcnN0QWNjZXNzVW5pdE5UUCkgeworICAgICAgICAgICAgICAgICAgICBudHBUaW1lIC09IG1GaXJzdEFjY2Vzc1VuaXROVFA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnRwVGltZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAoaW50NjRfdCkobnRwVGltZSAqIDFFNiAvICgxbGwgPDwgMzIpKTsKKworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyNpZiAwCisgICAgICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGFtYWdlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0koImlnbm9yaW5nIGRhbWFnZWQgQVUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdzZWVrJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZG9uZU1zZzsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJkb25lTXNnIiwgJmRvbmVNc2cpKTsKKworICAgICAgICAgICAgICAgIGlmIChtU2Vla1BlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9uZU1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW1TZWVrYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJUaGlzIGlzIGEgbGl2ZSBzdHJlYW0sIGlnbm9yaW5nIHNlZWsgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZU1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgICAgIG1TZWVrUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBhY2Nlc3MgdW5pdCB0aW1lb3V0IHVudGlsIHdlIHJlc3VtZWQKKyAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBtQ2hlY2tQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICArK21DaGVja0dlbmVyYXRpb247CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiUEFVU0UgIjsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2VlMScsIGlkKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldE1lc3NhZ2UoImRvbmVNc2ciLCBkb25lTXNnKTsKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3NlZTEnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFNlc3Npb24gaXMgcGF1c2VkIG5vdy4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRyYWNrcy5lZGl0SXRlbUF0KGkpLm1QYWNrZXRTb3VyY2UtPmZsdXNoUXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdCA9ICJQTEFZICI7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5nZTogbnB0PSVsbGQtXHJcbiIsIHRpbWVVcyAvIDEwMDAwMDBsbCkpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBkb25lTXNnOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImRvbmVNc2ciLCAmZG9uZU1zZykpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZWUyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldE1lc3NhZ2UoImRvbmVNc2ciLCBkb25lTXNnKTsKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3NlZTInOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENIRUNLKG1TZWVrUGVuZGluZyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HSSgiUExBWSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHN0cmVycm9yKC1yZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIG1DaGVja1BlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3N0QWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGxheVJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTE9HSSgic2VlayBjb21wbGV0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInNlZWsgZmFpbGVkLCBhYm9ydGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TZWVrUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGRvbmVNc2c7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZG9uZU1zZyIsICZkb25lTXNnKSk7CisKKyAgICAgICAgICAgICAgICBkb25lTXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2JpbnknOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICAgICAgICAgICAgICBtUlRQQ29ubi0+aW5qZWN0UGFja2V0KGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICd0aW91JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVRyeUZha2VSVENQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJOZXZlciByZWNlaXZlZCBhbnkgZGF0YSwgZGlzY29ubmVjdGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVHJ5VENQSW50ZXJsZWF2aW5nICYmIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJXZSByZWNlaXZlZCBSVFAgcGFja2V0cyBidXQgbm8gUlRDUCBwYWNrZXRzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBmYWtlIHRpbWVzdGFtcHMuIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcnlGYWtlUlRDUCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtUlRQQ29ubi0+ZmFrZVRpbWVzdGFtcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1coIk5ldmVyIHJlY2VpdmVkIGFueSBkYXRhLCBzd2l0Y2hpbmcgdHJhbnNwb3J0cy4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVRyeVRDUEludGVybGVhdmluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlY29ubmVjdCIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcG9zdEFjY2Vzc1VuaXRUaW1lb3V0Q2hlY2soKSB7CisgICAgICAgIGlmIChtQ2hlY2tQZW5kaW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ2hlY2tQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGNoZWNrID0gbmV3IEFNZXNzYWdlKCdjaGVrJywgaWQoKSk7CisgICAgICAgIGNoZWNrLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1DaGVja0dlbmVyYXRpb24pOworICAgICAgICBjaGVjay0+cG9zdChrQWNjZXNzVW5pdFRpbWVvdXRVcyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgU3BsaXRTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZzLCBjb25zdCBjaGFyICpzZXBhcmF0b3IsIExpc3Q8QVN0cmluZz4gKml0ZW1zKSB7CisgICAgICAgIGl0ZW1zLT5jbGVhcigpOworICAgICAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgICAgICB3aGlsZSAoc3RhcnQgPCBzLnNpemUoKSkgeworICAgICAgICAgICAgc3NpemVfdCBvZmZzZXQgPSBzLmZpbmQoc2VwYXJhdG9yLCBzdGFydCk7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgaXRlbXMtPnB1c2hfYmFjayhBU3RyaW5nKHMsIHN0YXJ0LCBzLnNpemUoKSAtIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZW1zLT5wdXNoX2JhY2soQVN0cmluZyhzLCBzdGFydCwgb2Zmc2V0IC0gc3RhcnQpKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0ICsgc3RybGVuKHNlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBhcnNlUGxheVJlc3BvbnNlKGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSkgeworICAgICAgICBtU2Vla2FibGUgPSBmYWxzZTsKKworICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgicmFuZ2UiKTsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAvLyBTZXJ2ZXIgZG9lc24ndCBldmVuIHRlbGwgdXNlIHdoYXQgcmFuZ2UgaXQgaXMgZ29pbmcgdG8KKyAgICAgICAgICAgIC8vIHBsYXksIHRoZXJlZm9yZSB3ZSB3b24ndCBzdXBwb3J0IHNlZWtpbmcuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIHJhbmdlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgIExPR1YoIlJhbmdlOiAlcyIsIHJhbmdlLmNfc3RyKCkpOworCisgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUocmFuZ2UuY19zdHIoKSwgIm5wdCIsICZ2YWwpKTsKKyAgICAgICAgZmxvYXQgbnB0MSwgbnB0MjsKKworICAgICAgICBpZiAodmFsID09ICJub3ctIikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxpdmUgc3RyZWFtIGFuZCB0aGVyZWZvcmUgbm90IHNlZWthYmxlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfRVEoc3NjYW5mKHZhbC5jX3N0cigpLCAiJWYtJWYiLCAmbnB0MSwgJm5wdDIpLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgicnRwLWluZm8iKTsKKyAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7CisKKyAgICAgICAgQVN0cmluZyBydHBJbmZvID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgIExpc3Q8QVN0cmluZz4gc3RyZWFtSW5mb3M7CisgICAgICAgIFNwbGl0U3RyaW5nKHJ0cEluZm8sICIsIiwgJnN0cmVhbUluZm9zKTsKKworICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgIGZvciAoTGlzdDxBU3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBzdHJlYW1JbmZvcy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IHN0cmVhbUluZm9zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAoKml0KS50cmltKCk7CisgICAgICAgICAgICBMT0dWKCJzdHJlYW1JbmZvWyVkXSA9ICVzIiwgbiwgKCppdCkuY19zdHIoKSk7CisKKyAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSgoKml0KS5jX3N0cigpLCAidXJsIiwgJnZhbCkpOworCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJhY2tJbmRleCA8IG1UcmFja3Muc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICYmICEodmFsID09IG1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KS5tVVJMKSkgeworICAgICAgICAgICAgICAgICsrdHJhY2tJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0xUKHRyYWNrSW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICAgICAgICAgQ0hFQ0soR2V0QXR0cmlidXRlKCgqaXQpLmNfc3RyKCksICJzZXEiLCAmdmFsKSk7CisKKyAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2VxID0gc3RydG91bCh2YWwuY19zdHIoKSwgJmVuZCwgMTApOworCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgaW5mby0+bUZpcnN0U2VxTnVtSW5TZWdtZW50ID0gc2VxOworICAgICAgICAgICAgaW5mby0+bU5ld1NlZ21lbnQgPSB0cnVlOworCisgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUoKCppdCkuY19zdHIoKSwgInJ0cHRpbWUiLCAmdmFsKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBzdHJ0b3VsKHZhbC5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyAgICAgICAgICAgIExPR1YoInRyYWNrICMlZDogcnRwVGltZT0ldSA8PT4gbnRwPSUuMmYiLCBuLCBydHBUaW1lLCBucHQxKTsKKworICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2V0Tm9ybWFsUGxheVRpbWVNYXBwaW5nKAorICAgICAgICAgICAgICAgICAgICBydHBUaW1lLCAoaW50NjRfdCkobnB0MSAqIDFFNikpOworCisgICAgICAgICAgICArK247CisgICAgICAgIH0KKworICAgICAgICBtU2Vla2FibGUgPSB0cnVlOworICAgIH0KKworICAgIHNwPEFQYWNrZXRTb3VyY2U+IGdldFBhY2tldFNvdXJjZShzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgQ0hFQ0tfR0UoaW5kZXgsIDB1KTsKKyAgICAgICAgQ0hFQ0tfTFQoaW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICAgICByZXR1cm4gbVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tUGFja2V0U291cmNlOworICAgIH0KKworICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1OZXRMb29wZXI7CisgICAgc3A8QVJUU1BDb25uZWN0aW9uPiBtQ29ubjsKKyAgICBzcDxBUlRQQ29ubmVjdGlvbj4gbVJUUENvbm47CisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gbVNlc3Npb25EZXNjOworICAgIEFTdHJpbmcgbVNlc3Npb25VUkw7CisgICAgQVN0cmluZyBtQmFzZVVSTDsKKyAgICBBU3RyaW5nIG1TZXNzaW9uSUQ7CisgICAgYm9vbCBtU2V0dXBUcmFja3NTdWNjZXNzZnVsOworICAgIGJvb2wgbVNlZWtQZW5kaW5nOworICAgIGJvb2wgbUZpcnN0QWNjZXNzVW5pdDsKKyAgICB1aW50NjRfdCBtRmlyc3RBY2Nlc3NVbml0TlRQOworICAgIGludDY0X3QgbU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQ7CisgICAgYm9vbCBtQ2hlY2tQZW5kaW5nOworICAgIGludDMyX3QgbUNoZWNrR2VuZXJhdGlvbjsKKyAgICBib29sIG1UcnlUQ1BJbnRlcmxlYXZpbmc7CisgICAgYm9vbCBtVHJ5RmFrZVJUQ1A7CisgICAgYm9vbCBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQ7CisgICAgYm9vbCBtUmVjZWl2ZWRGaXJzdFJUUFBhY2tldDsKKyAgICBib29sIG1TZWVrYWJsZTsKKworICAgIHN0cnVjdCBUcmFja0luZm8geworICAgICAgICBBU3RyaW5nIG1VUkw7CisgICAgICAgIGludCBtUlRQU29ja2V0OworICAgICAgICBpbnQgbVJUQ1BTb2NrZXQ7CisgICAgICAgIGJvb2wgbVVzaW5nSW50ZXJsZWF2ZWRUQ1A7CisgICAgICAgIHVpbnQzMl90IG1GaXJzdFNlcU51bUluU2VnbWVudDsKKyAgICAgICAgYm9vbCBtTmV3U2VnbWVudDsKKworICAgICAgICBzcDxBUGFja2V0U291cmNlPiBtUGFja2V0U291cmNlOworICAgIH07CisgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKKworICAgIHNwPEFNZXNzYWdlPiBtRG9uZU1zZzsKKworICAgIHZvaWQgc2V0dXBUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gc291cmNlID0KKyAgICAgICAgICAgIG5ldyBBUGFja2V0U291cmNlKG1TZXNzaW9uRGVzYywgaW5kZXgpOworCisgICAgICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgICAgICBMT0dXKCJVbnN1cHBvcnRlZCBmb3JtYXQuIElnbm9yaW5nIHRyYWNrICMlZC4iLCBpbmRleCk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2V0dScsIGlkKCkpOworICAgICAgICAgICAgcmVwbHktPnNldFNpemUoImluZGV4IiwgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBFUlJPUl9VTlNVUFBPUlRFRCk7CisgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyB1cmw7CisgICAgICAgIENIRUNLKG1TZXNzaW9uRGVzYy0+ZmluZEF0dHJpYnV0ZShpbmRleCwgImE9Y29udHJvbCIsICZ1cmwpKTsKKworICAgICAgICBBU3RyaW5nIHRyYWNrVVJMOworICAgICAgICBDSEVDSyhNYWtlVVJMKG1CYXNlVVJMLmNfc3RyKCksIHVybC5jX3N0cigpLCAmdHJhY2tVUkwpKTsKKworICAgICAgICBtVHJhY2tzLnB1c2goVHJhY2tJbmZvKCkpOworICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CisgICAgICAgIGluZm8tPm1VUkwgPSB0cmFja1VSTDsKKyAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgaW5mby0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1AgPSBmYWxzZTsKKyAgICAgICAgaW5mby0+bUZpcnN0U2VxTnVtSW5TZWdtZW50ID0gMDsKKyAgICAgICAgaW5mby0+bU5ld1NlZ21lbnQgPSB0cnVlOworCisgICAgICAgIExPR1YoInRyYWNrICMlZCBVUkw9JXMiLCBtVHJhY2tzLnNpemUoKSwgdHJhY2tVUkwuY19zdHIoKSk7CisKKyAgICAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVFVQICI7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHRyYWNrVVJMKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICBpZiAobVRyeVRDUEludGVybGVhdmluZykgeworICAgICAgICAgICAgc2l6ZV90IGludGVybGVhdmVJbmRleCA9IDIgKiAobVRyYWNrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGluZm8tPm1Vc2luZ0ludGVybGVhdmVkVENQID0gdHJ1ZTsKKyAgICAgICAgICAgIGluZm8tPm1SVFBTb2NrZXQgPSBpbnRlcmxlYXZlSW5kZXg7CisgICAgICAgICAgICBpbmZvLT5tUlRDUFNvY2tldCA9IGludGVybGVhdmVJbmRleCArIDE7CisKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVENQO2ludGVybGVhdmVkPSIpOworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoaW50ZXJsZWF2ZUluZGV4KTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCItIik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChpbnRlcmxlYXZlSW5kZXggKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQ7CisgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVBvcnRQYWlyKAorICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CisKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0KTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCItIik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGlmIChpbmRleCA+IDEpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgcmVwbHktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIE1ha2VVUkwoY29uc3QgY2hhciAqYmFzZVVSTCwgY29uc3QgY2hhciAqdXJsLCBBU3RyaW5nICpvdXQpIHsKKyAgICAgICAgb3V0LT5jbGVhcigpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcCgicnRzcDovLyIsIGJhc2VVUkwsIDcpKSB7CisgICAgICAgICAgICAvLyBCYXNlIFVSTCBtdXN0IGJlIGFic29sdXRlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgdXJsLCA3KSkgeworICAgICAgICAgICAgLy8gInVybCIgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIGlnbm9yZSBiYXNlIFVSTC4KKyAgICAgICAgICAgIG91dC0+c2V0VG8odXJsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG4gPSBzdHJsZW4oYmFzZVVSTCk7CisgICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSA9PSAnLycpIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisKKyAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CisgICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQtPmFwcGVuZCgiLyIpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE15SGFuZGxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1ZX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5YTNiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oCkBAIC0wLDAgKzEsOTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNWV9UUkFOU01JVFRFUl9IXworCisjZGVmaW5lIE1ZX1RSQU5TTUlUVEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2lmZGVmIEFORFJPSUQKKyNpbmNsdWRlICJWaWRlb1NvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgVFJBQ0tfU1VGRklYICAgICJ0cmFja2lkPTEiCisjZGVmaW5lIFBUICAgICAgICAgICAgICA5NgorI2RlZmluZSBQVF9TVFIgICAgICAgICAgIjk2IgorCisjZGVmaW5lIFVTRVJOQU1FICAgICAgICAiYmNhc3QiCisjZGVmaW5lIFBBU1NXT1JEICAgICAgICAidGVzdCIKKworc3RhdGljIGludCB1bmlmb3JtUmFuZChpbnQgbGltaXQpIHsKKyAgICByZXR1cm4gKChkb3VibGUpcmFuZCgpICogbGltaXQpIC8gUkFORF9NQVg7Cit9CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7CisKKyAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7CisKKyAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7CisgICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKKyAgICB9Cit9CisKK3N0cnVjdCBNeVRyYW5zbWl0dGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBNeVRyYW5zbWl0dGVyKGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICAgICAgOiBtU2VydmVyVVJMKHVybCksCisgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICAgIG1Db25uKG5ldyBBUlRTUENvbm5lY3Rpb24pLAorICAgICAgICAgIG1Db25uZWN0ZWQoZmFsc2UpLAorICAgICAgICAgIG1BdXRoVHlwZShOT05FKSwKKyAgICAgICAgICBtUlRQU29ja2V0KC0xKSwKKyAgICAgICAgICBtUlRDUFNvY2tldCgtMSksCisgICAgICAgICAgbVNvdXJjZUlEKHJhbmQoKSksCisgICAgICAgICAgbVNlcU5vKHVuaWZvcm1SYW5kKDY1NTM2KSksCisgICAgICAgICAgbVJUUFRpbWVCYXNlKHJhbmQoKSksCisgICAgICAgICAgbU51bVNhbXBsZXNTZW50KDApLAorICAgICAgICAgIG1OdW1SVFBTZW50KDApLAorICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50KDApLAorICAgICAgICAgIG1MYXN0UlRQVGltZSgwKSwKKyAgICAgICAgICBtTGFzdE5UUFRpbWUoMCkgeworICAgICAgICBtU3RyZWFtVVJMID0gbVNlcnZlclVSTDsKKyAgICAgICAgbVN0cmVhbVVSTC5hcHBlbmQoIi9iYXpvbmcuc2RwIik7CisKKyAgICAgICAgbVRyYWNrVVJMID0gbVN0cmVhbVVSTDsKKyAgICAgICAgbVRyYWNrVVJMLmFwcGVuZCgiLyIpOworICAgICAgICBtVHJhY2tVUkwuYXBwZW5kKFRSQUNLX1NVRkZJWCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvbm4pOworCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2VydmVyVVJMLmNfc3RyKCksIHJlcGx5KTsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgaW50IHdpZHRoID0gNjQwOworICAgICAgICBpbnQgaGVpZ2h0ID0gNDgwOworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBuZXcgVmlkZW9Tb3VyY2Uod2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIGVuY01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICBPTVhDbGllbnQgY2xpZW50OworICAgICAgICBjbGllbnQuY29ubmVjdCgpOworCisgICAgICAgIG1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY01ldGEsCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBzb3VyY2UpOworCisgICAgICAgIG1FbmNvZGVyLT5zdGFydCgpOworCisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIENIRUNLX0VRKG1FbmNvZGVyLT5yZWFkKCZidWZmZXIpLCAoc3RhdHVzX3QpT0spOworICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKKyAgICAgICAgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhidWZmZXIpOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgdWludDY0X3QgbnRwVGltZSgpIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgICAgIHVpbnQ2NF90IG5vd1VzID0gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfdXNlYzsKKworICAgICAgICBub3dVcyArPSAoKDcwbGwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMGxsOworCisgICAgICAgIHVpbnQ2NF90IGhpID0gbm93VXMgLyAxMDAwMDAwbGw7CisgICAgICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7CisKKyAgICAgICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKKyAgICB9CisKKyAgICB2b2lkIGlzc3VlQW5ub3VuY2UoKSB7CisgICAgICAgIEFTdHJpbmcgc2RwOworICAgICAgICBzZHAgPSAidj0wXHJcbiI7CisKKyAgICAgICAgc2RwLmFwcGVuZCgibz0tICIpOworCisgICAgICAgIHVpbnQ2NF90IG50cCA9IG50cFRpbWUoKTsKKyAgICAgICAgc2RwLmFwcGVuZChudHApOworICAgICAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgICAgIHNkcC5hcHBlbmQobnRwKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiIElOIElQNCAxMjcuMC4wLjBcclxuIik7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgInM9U2FtcGxlXHJcbiIKKyAgICAgICAgICAgICAgImk9UGxheWluZyBhcm91bmQgd2l0aCBBTk5PVU5DRVxyXG4iCisgICAgICAgICAgICAgICJjPUlOIElQNCAiKTsKKworICAgICAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOworICAgICAgICBhZGRyLnNfYWRkciA9IGh0b25sKG1TZXJ2ZXJJUCk7CisKKyAgICAgICAgc2RwLmFwcGVuZChpbmV0X250b2EoYWRkcikpOworCisgICAgICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAgICAgICAiYT1yYW5nZTpucHQ9bm93LVxyXG4iKTsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRW5jb2Rlci0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgIm09dmlkZW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgorICAgICAgICAgICAgICAiYj1BUyAzMjAwMDBcclxuIgorICAgICAgICAgICAgICAiYT1ydHBtYXA6IiBQVF9TVFIgIiBIMjY0LzkwMDAwXHJcbiIpOworCisgICAgICAgIHNkcC5hcHBlbmQoImE9Y2xpcHJlY3QgMCwwLCIpOworICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7CisgICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICAgICAiYT1mcmFtZXNpemU6IiBQVF9TVFIgIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIi0iKTsKKyAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgImE9Zm10cDoiIFBUX1NUUiAiIHByb2ZpbGUtbGV2ZWwtaWQ9NDJDMDE1O3Nwcm9wLXBhcmFtZXRlci1zZXRzPSIpOworCisgICAgICAgIHNkcC5hcHBlbmQobVNlcVBhcmFtU2V0KTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLCIpOworICAgICAgICBzZHAuYXBwZW5kKG1QaWNQYXJhbVNldCk7CisgICAgICAgIHNkcC5hcHBlbmQoIjtwYWNrZXRpemF0aW9uLW1vZGU9MVxyXG4iKTsKKyNlbHNlCisgICAgICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgICAgICAgIm09YXVkaW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgorICAgICAgICAgICAgICAgICJhPXJ0cG1hcDoiIFBUX1NUUiAiIEw4LzgwMDAvMVxyXG4iKTsKKyNlbmRpZgorCisgICAgICAgIHNkcC5hcHBlbmQoImE9Y29udHJvbDoiIFRSQUNLX1NVRkZJWCAiXHJcbiIpOworCisgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFOTk9VTkNFICIpOworICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIkFOTk9VTkNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LUxlbmd0aDogIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcC5zaXplKCkpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdhbm5vJywgaWQoKSk7CisgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICB9CisKKyAgICB2b2lkIEgoY29uc3QgQVN0cmluZyAmcywgQVN0cmluZyAqb3V0KSB7CisgICAgICAgIG91dC0+Y2xlYXIoKTsKKworICAgICAgICBNRDVfQ1RYIG07CisgICAgICAgIE1ENV9Jbml0KCZtKTsKKyAgICAgICAgTUQ1X1VwZGF0ZSgmbSwgcy5jX3N0cigpLCBzLnNpemUoKSk7CisKKyAgICAgICAgdWludDhfdCBrZXlbMTZdOworICAgICAgICBNRDVfRmluYWwoa2V5LCAmbSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBjaGFyIG5pYmJsZSA9IGtleVtpXSA+PiA0OworICAgICAgICAgICAgaWYgKG5pYmJsZSA8PSA5KSB7CisgICAgICAgICAgICAgICAgbmliYmxlICs9ICcwJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmliYmxlICs9ICdhJyAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LT5hcHBlbmQoJm5pYmJsZSwgMSk7CisKKyAgICAgICAgICAgIG5pYmJsZSA9IGtleVtpXSAmIDB4MGY7CisgICAgICAgICAgICBpZiAobmliYmxlIDw9IDkpIHsKKyAgICAgICAgICAgICAgICBuaWJibGUgKz0gJzAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuaWJibGUgKz0gJ2EnIC0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgmbmliYmxlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXV0aGVudGljYXRlKGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSkgeworICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgid3d3LWF1dGhlbnRpY2F0ZSIpOworICAgICAgICBDSEVDS19HRShpLCAwKTsKKworICAgICAgICBBU3RyaW5nIHZhbHVlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJCYXNpYyIsIDUpKSB7CisgICAgICAgICAgICBtQXV0aFR5cGUgPSBCQVNJQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJEaWdlc3QiLCA2KSk7CisgICAgICAgICAgICBtQXV0aFR5cGUgPSBESUdFU1Q7CisKKyAgICAgICAgICAgIGkgPSB2YWx1ZS5maW5kKCJub25jZT0iKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGksIDApOworICAgICAgICAgICAgQ0hFQ0tfRVEodmFsdWUuY19zdHIoKVtpICsgNl0sICdcIicpOworICAgICAgICAgICAgc3NpemVfdCBqID0gdmFsdWUuZmluZCgiXCIiLCBpICsgNyk7CisgICAgICAgICAgICBDSEVDS19HRShqLCAwKTsKKworICAgICAgICAgICAgbU5vbmNlLnNldFRvKHZhbHVlLCBpICsgNywgaiAtIGkgLSA3KTsKKyAgICAgICAgfQorCisgICAgICAgIGlzc3VlQW5ub3VuY2UoKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uKAorICAgICAgICAgICAgQVN0cmluZyAqcmVxdWVzdCwgY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBjaGFyICp1cmwpIHsKKyAgICAgICAgaWYgKG1BdXRoVHlwZSA9PSBOT05FKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF1dGhUeXBlID09IEJBU0lDKSB7CisgICAgICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIkF1dGhvcml6YXRpb246IEJhc2ljIFltTmhjM1E2ZEdWemRBbz1cclxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDSEVDS19FUSgoaW50KW1BdXRoVHlwZSwgKGludClESUdFU1QpOworCisgICAgICAgIEFTdHJpbmcgQTE7CisgICAgICAgIEExLmFwcGVuZChVU0VSTkFNRSk7CisgICAgICAgIEExLmFwcGVuZCgiOiIpOworICAgICAgICBBMS5hcHBlbmQoIlN0cmVhbWluZyBTZXJ2ZXIiKTsKKyAgICAgICAgQTEuYXBwZW5kKCI6Iik7CisgICAgICAgIEExLmFwcGVuZChQQVNTV09SRCk7CisKKyAgICAgICAgQVN0cmluZyBBMjsKKyAgICAgICAgQTIuYXBwZW5kKG1ldGhvZCk7CisgICAgICAgIEEyLmFwcGVuZCgiOiIpOworICAgICAgICBBMi5hcHBlbmQodXJsKTsKKworICAgICAgICBBU3RyaW5nIEhBMSwgSEEyOworICAgICAgICBIKEExLCAmSEExKTsKKyAgICAgICAgSChBMiwgJkhBMik7CisKKyAgICAgICAgQVN0cmluZyB0bXA7CisgICAgICAgIHRtcC5hcHBlbmQoSEExKTsKKyAgICAgICAgdG1wLmFwcGVuZCgiOiIpOworICAgICAgICB0bXAuYXBwZW5kKG1Ob25jZSk7CisgICAgICAgIHRtcC5hcHBlbmQoIjoiKTsKKyAgICAgICAgdG1wLmFwcGVuZChIQTIpOworCisgICAgICAgIEFTdHJpbmcgZGlnZXN0OworICAgICAgICBIKHRtcCwgJmRpZ2VzdCk7CisKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJBdXRob3JpemF0aW9uOiBEaWdlc3QgIik7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgibm9uY2U9XCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKG1Ob25jZSk7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIsICIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVzZXJuYW1lPVwiIiBVU0VSTkFNRSAiXCIsICIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVyaT1cIiIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQodXJsKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcIiwgIik7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgicmVzcG9uc2U9XCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKGRpZ2VzdCk7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgJ2Nvbm4nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImNvbm5lY3Rpb24gcmVxdWVzdCBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlcnZlci1pcCIsIChpbnQzMl90ICopJm1TZXJ2ZXJJUCkpOworCisgICAgICAgICAgICAgICAgaXNzdWVBbm5vdW5jZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdhbm5vJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJBTk5PVU5DRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdXRoVHlwZSAhPSBOT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGQUlMRUQgdG8gYXV0aGVudGljYXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZShyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQ7CisgICAgICAgICAgICAgICAgQVJUUENvbm5lY3Rpb246Ok1ha2VQb3J0UGFpcigmbVJUUFNvY2tldCwgJm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CisKKyAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKCdwb2xsJywgaWQoKSkpLT5wb3N0KCk7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNFVFVQICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1UcmFja1VSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiU0VUVVAiLCBtVHJhY2tVUkwuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVHJhbnNwb3J0OiBSVFAvQVZQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocnRwUG9ydCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0ICsgMSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIjttb2RlPXJlY29yZFxyXG4iKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisjaWYgMAorICAgICAgICAgICAgY2FzZSAncG9sbCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmRfc2V0IHJzOworICAgICAgICAgICAgICAgIEZEX1pFUk8oJnJzKTsKKyAgICAgICAgICAgICAgICBGRF9TRVQobVJUQ1BTb2NrZXQsICZycyk7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgICAgICAgICB0di50dl9zZWMgPSAwOworICAgICAgICAgICAgICAgIHR2LnR2X3VzZWMgPSAwOworCisgICAgICAgICAgICAgICAgaW50IHJlcyA9IHNlbGVjdChtUlRDUFNvY2tldCArIDEsICZycywgTlVMTCwgTlVMTCwgJnR2KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHJlY3YobVJUQ1BTb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVjdiByZXR1cm5lZCAiIDw8IG47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInJlY3YgcmV0dXJuZWQgIiA8PCBuIDw8ICIgYnl0ZXMgb2YgZGF0YS4iOworCisgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgY2FzZSAnc2V0dSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU0VUVVAgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklEID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaSA9IG1TZXNzaW9uSUQuZmluZCgiOyIpOworICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9wdGlvbnMsIGkuZS4gIjt0aW1lb3V0PTkwIgorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRyYW5zcG9ydCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJ0cmFuc3BvcnQgPSAnIiA8PCB0cmFuc3BvcnQgPDwgIiciOworCisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUodHJhbnNwb3J0LmNfc3RyKCksICJzZXJ2ZXJfcG9ydCIsICZ2YWx1ZSkpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydCwgcnRjcFBvcnQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoc3NjYW5mKHZhbHVlLmNfc3RyKCksICIldS0ldSIsICZydHBQb3J0LCAmcnRjcFBvcnQpLCAyKTsKKworICAgICAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSh0cmFuc3BvcnQuY19zdHIoKSwgInNvdXJjZSIsICZ2YWx1ZSkpOworCisgICAgICAgICAgICAgICAgbWVtc2V0KG1SZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YobVJlbW90ZUFkZHIuc2luX3plcm8pKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbVJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhydHBQb3J0KTsKKworICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkciA9IG1SZW1vdGVBZGRyOworICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKHJ0cFBvcnQgKyAxKTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGNvbm5lY3QobVJUUFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbVJlbW90ZUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZUFkZHIpKSk7CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBjb25uZWN0KG1SVENQU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZtUmVtb3RlUlRDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZVJUQ1BBZGRyKSkpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgeCA9IG50b2hsKG1SZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJzZW5kaW5nIGRhdGEgdG8gIgorICAgICAgICAgICAgICAgICAgICAgPDwgKHggPj4gMjQpCisgICAgICAgICAgICAgICAgICAgICA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICgoeCA+PiAxNikgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAoKHggPj4gOCkgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAoeCAmIDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJ0cFBvcnQ7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlJFQ09SRCAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOworCisgICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJSRUNPUkQiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIGlkKCkpOworICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAncmVjbyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUkVDT1JEIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdtb3JlJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnc3IgICcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKSktPnBvc3QoMzAwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2FsaXYnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIk9QVElPTlMgIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiUkVDT1JEIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ29wdHMnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ29wdHMnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk9QVElPTlMgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgaWQoKSkpLT5wb3N0KDMwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdtb3JlJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBQVDsgIC8vIE0tYml0CisgICAgICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgICAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUVuY29kZXItPnJlYWQoJm1lZGlhQnVmKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOworCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIG1lZGlhRGF0YSwgNCkpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTJdLAorICAgICAgICAgICAgICAgICAgICAgICBtZWRpYURhdGEgKyA0LCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyKTsKKworICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFCdWYgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgbU51bVJUUFNlbnQgKiAxMjg7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZkYXRhWzEyXSwgMCwgMTI4KTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDEyICsgMTI4KTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgICAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCwgZGF0YSwgYnVmZmVyLT5zaXplKCksIDApOworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZW5kIGZhaWxlZCAoIiA8PCBzdHJlcnJvcihlcnJubykgPDwgIikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICArK21TZXFObzsKKworICAgICAgICAgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAxMjsKKworICAgICAgICAgICAgICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgICAgICAgICAgICAgbUxhc3ROVFBUaW1lID0gbnRwVGltZSgpOworCisjaWZkZWYgQU5EUk9JRAorICAgICAgICAgICAgICAgIGlmIChtTnVtUlRQU2VudCA8IDYwICogMjUpIHsgIC8vIDYwIHNlY3Mgd29ydGgKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDQwMDAwKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKG1OdW1SVFBPY3RldHNTZW50IDwgODAwMCAqIDYwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwgKiAxMjggLyA4MDAwKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVGhhdCdzIGVub3VnaCwgcGF1c2luZy4iOworCisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlBBVVNFICIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlBBVVNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1cycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdzciAgJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgICAgICBhZGRTUihidWZmZXIpOworICAgICAgICAgICAgICAgIGFkZFNERVMoYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQsIGRhdGEsIGJ1ZmZlci0+c2l6ZSgpLCAwKTsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3BhdXMnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBBVVNFIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKKworICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVEVBUkRPV04gIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiVEVBUkRPV04iLCBtU3RyZWFtVVJMLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIGlkKCkpOworICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndGVhcic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVEVBUkRPV04gY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdkaXNjJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImRpc2Nvbm5lY3QgY29tcGxldGVkIjsKKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3F1aXQnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1SVFBTb2NrZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShtUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtUlRDUFNvY2tldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKG1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBBTkRST0lECisgICAgICAgICAgICAgICAgbUVuY29kZXItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci5jbGVhcigpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk15VHJhbnNtaXR0ZXIoKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIGVudW0gQXV0aFR5cGUgeworICAgICAgICBOT05FLAorICAgICAgICBCQVNJQywKKyAgICAgICAgRElHRVNUCisgICAgfTsKKworICAgIEFTdHJpbmcgbVNlcnZlclVSTDsKKyAgICBBU3RyaW5nIG1UcmFja1VSTDsKKyAgICBBU3RyaW5nIG1TdHJlYW1VUkw7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFSVFNQQ29ubmVjdGlvbj4gbUNvbm47CisgICAgYm9vbCBtQ29ubmVjdGVkOworICAgIHVpbnQzMl90IG1TZXJ2ZXJJUDsKKyAgICBBdXRoVHlwZSBtQXV0aFR5cGU7CisgICAgQVN0cmluZyBtTm9uY2U7CisgICAgQVN0cmluZyBtU2Vzc2lvbklEOworICAgIGludCBtUlRQU29ja2V0LCBtUlRDUFNvY2tldDsKKyAgICB1aW50MzJfdCBtU291cmNlSUQ7CisgICAgdWludDMyX3QgbVNlcU5vOworICAgIHVpbnQzMl90IG1SVFBUaW1lQmFzZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZUFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVSVENQQWRkcjsKKyAgICBzaXplX3QgbU51bVNhbXBsZXNTZW50OworICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OworICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OworICAgIHVpbnQzMl90IG1MYXN0UlRQVGltZTsKKyAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7CisKKyNpZmRlZiBBTkRST0lECisgICAgc3A8TWVkaWFTb3VyY2U+IG1FbmNvZGVyOworICAgIEFTdHJpbmcgbVNlcVBhcmFtU2V0OworICAgIEFTdHJpbmcgbVBpY1BhcmFtU2V0OworCisgICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0YXJ0Q29kZVtdID0gIlx4MDBceDAwXHgwMFx4MDEiOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgICAgICBDSEVDS19HRShzaXplLCAwdSk7CisgICAgICAgIENIRUNLKCFtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgNCkpOworCisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworCisgICAgICAgIHNpemVfdCBzdGFydENvZGVQb3MgPSAwOworICAgICAgICB3aGlsZSAoc3RhcnRDb2RlUG9zICsgMyA8IHNpemUKKyAgICAgICAgICAgICAgICAmJiBtZW1jbXAoa1N0YXJ0Q29kZSwgJmRhdGFbc3RhcnRDb2RlUG9zXSwgNCkpIHsKKyAgICAgICAgICAgICsrc3RhcnRDb2RlUG9zOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfTFQoc3RhcnRDb2RlUG9zICsgMywgc2l6ZSk7CisKKyAgICAgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHN0YXJ0Q29kZVBvcywgJm1TZXFQYXJhbVNldCk7CisKKyAgICAgICAgZW5jb2RlQmFzZTY0KCZkYXRhW3N0YXJ0Q29kZVBvcyArIDRdLCBzaXplIC0gc3RhcnRDb2RlUG9zIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICZtUGljUGFyYW1TZXQpOworICAgIH0KKyNlbmRpZgorCisgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMDsKKyAgICAgICAgZGF0YVsxXSA9IDIwMDsgIC8vIFNSCisgICAgICAgIGRhdGFbMl0gPSAwOworICAgICAgICBkYXRhWzNdID0gNjsKKyAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBkYXRhWzhdID0gbUxhc3ROVFBUaW1lID4+ICg2NCAtIDgpOworICAgICAgICBkYXRhWzldID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAxNikpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMF0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDI0KSkgJiAweGZmOworICAgICAgICBkYXRhWzExXSA9IChtTGFzdE5UUFRpbWUgPj4gMzIpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMl0gPSAobUxhc3ROVFBUaW1lID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTNdID0gKG1MYXN0TlRQVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzE0XSA9IChtTGFzdE5UUFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzE1XSA9IG1MYXN0TlRQVGltZSAmIDB4ZmY7CisKKyAgICAgICAgZGF0YVsxNl0gPSAobUxhc3RSVFBUaW1lID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTddID0gKG1MYXN0UlRQVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzE4XSA9IChtTGFzdFJUUFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzE5XSA9IG1MYXN0UlRQVGltZSAmIDB4ZmY7CisKKyAgICAgICAgZGF0YVsyMF0gPSBtTnVtUlRQU2VudCA+PiAyNDsKKyAgICAgICAgZGF0YVsyMV0gPSAobU51bVJUUFNlbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVsyMl0gPSAobU51bVJUUFNlbnQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzIzXSA9IG1OdW1SVFBTZW50ICYgMHhmZjsKKworICAgICAgICBkYXRhWzI0XSA9IG1OdW1SVFBPY3RldHNTZW50ID4+IDI0OworICAgICAgICBkYXRhWzI1XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzI2XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMjddID0gbU51bVJUUE9jdGV0c1NlbnQgJiAweGZmOworCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyOCk7CisgICAgfQorCisgICAgdm9pZCBhZGRTREVTKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CisgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKKyAgICAgICAgZGF0YVsxXSA9IDIwMjsgIC8vIFNERVMKKyAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gODsKKworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprQ05BTUUgPSAiYW5kaWhAbGFwdG9wIjsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa0NOQU1FKTsKKworICAgICAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga0NOQU1FLCBzdHJsZW4oa0NOQU1FKSk7CisgICAgICAgIG9mZnNldCArPSBzdHJsZW4oa0NOQU1FKTsKKworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDc7ICAvLyBOT1RFCisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtOT1RFID0gIkhlbGwncyBmcm96ZW4gb3Zlci4iOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrTk9URSk7CisKKyAgICAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtOT1RFLCBzdHJsZW4oa05PVEUpKTsKKyAgICAgICAgb2Zmc2V0ICs9IHN0cmxlbihrTk9URSk7CisKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworCisgICAgICAgIGlmICgob2Zmc2V0ICUgNCkgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSA0IC0gKG9mZnNldCAlIDQpOworICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVdvcmRzID0gKG9mZnNldCAvIDQpIC0gMTsKKyAgICAgICAgZGF0YVsyXSA9IG51bVdvcmRzID4+IDg7CisgICAgICAgIGRhdGFbM10gPSBudW1Xb3JkcyAmIDB4ZmY7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXlUcmFuc21pdHRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1ZX1RSQU5TTUlUVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2YjNjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVURQUHVzaGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiVURQUHVzaGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9CeXRlT3JkZXIuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitVRFBQdXNoZXI6OlVEUFB1c2hlcihjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgcG9ydCkKKyAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAicmIiKSksCisgICAgICBtRmlyc3RUaW1lTXMoMCksCisgICAgICBtRmlyc3RUaW1lVXMoMCkgeworICAgIENIRUNLKG1GaWxlICE9IE5VTEwpOworCisgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgIGFkZHIuc2luX3BvcnQgPSAwOworCisgICAgQ0hFQ0tfRVEoMCwgYmluZChtU29ja2V0LCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkpOworCisgICAgbWVtc2V0KG1SZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YobVJlbW90ZUFkZHIuc2luX3plcm8pKTsKKyAgICBtUmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBtUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgIG1SZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Cit9CisKK1VEUFB1c2hlcjo6flVEUFB1c2hlcigpIHsKKyAgICBjbG9zZShtU29ja2V0KTsKKyAgICBtU29ja2V0ID0gLTE7CisKKyAgICBmY2xvc2UobUZpbGUpOworICAgIG1GaWxlID0gTlVMTDsKK30KKwordm9pZCBVRFBQdXNoZXI6OnN0YXJ0KCkgeworICAgIHVpbnQzMl90IHRpbWVNczsKKyAgICBDSEVDS19FUShmcmVhZCgmdGltZU1zLCAxLCBzaXplb2YodGltZU1zKSwgbUZpbGUpLCBzaXplb2YodGltZU1zKSk7CisgICAgbUZpcnN0VGltZU1zID0gZnJvbWxlbCh0aW1lTXMpOworICAgIG1GaXJzdFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHVzaCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK2Jvb2wgVURQUHVzaGVyOjpvblB1c2goKSB7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIGlmIChmcmVhZCgmbGVuZ3RoLCAxLCBzaXplb2YobGVuZ3RoKSwgbUZpbGUpIDwgc2l6ZW9mKGxlbmd0aCkpIHsKKyAgICAgICAgTE9HSSgiTm8gbW9yZSBkYXRhIHRvIHB1c2guIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsZW5ndGggPSBmcm9tbGVsKGxlbmd0aCk7CisKKyAgICBDSEVDS19HVChsZW5ndGgsIDB1KTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGxlbmd0aCk7CisgICAgaWYgKGZyZWFkKGJ1ZmZlci0+ZGF0YSgpLCAxLCBsZW5ndGgsIG1GaWxlKSA8IGxlbmd0aCkgeworICAgICAgICBMT0dFKCJGaWxlIHRydW5jYXRlZD8uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IG4gPSBzZW5kdG8oCisgICAgICAgICAgICBtU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCisgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJm1SZW1vdGVBZGRyLCBzaXplb2YobVJlbW90ZUFkZHIpKTsKKworICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIHVpbnQzMl90IHRpbWVNczsKKyAgICBpZiAoZnJlYWQoJnRpbWVNcywgMSwgc2l6ZW9mKHRpbWVNcyksIG1GaWxlKSA8IHNpemVvZih0aW1lTXMpKSB7CisgICAgICAgIExPR0koIk5vIG1vcmUgZGF0YSB0byBwdXNoLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGltZU1zID0gZnJvbWxlbCh0aW1lTXMpOworICAgIENIRUNLX0dFKHRpbWVNcywgbUZpcnN0VGltZU1zKTsKKworICAgIHRpbWVNcyAtPSBtRmlyc3RUaW1lTXM7CisgICAgaW50NjRfdCB3aGVuVXMgPSBtRmlyc3RUaW1lVXMgKyB0aW1lTXMgKiAxMDAwbGw7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFB1c2gsIGlkKCkpKS0+cG9zdCh3aGVuVXMgLSBub3dVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBVRFBQdXNoZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFvblB1c2goKSAmJiAhKG50b2hzKG1SZW1vdGVBZGRyLnNpbl9wb3J0KSAmIDEpKSB7CisgICAgICAgICAgICAgICAgTE9HSSgiZW11bGF0aW5nIEJZRSBwYWNrZXQiKTsKKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDgpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICAqZGF0YSsrID0gKDIgPDwgNikgfCAxOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAyMDM7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDA7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDE7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDB4OGY7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDB4NDk7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDB4YzA7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IDB4ZDA7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCA4KTsKKworICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiB0bXAgPSBtUmVtb3RlQWRkcjsKKyAgICAgICAgICAgICAgICB0bXAuc2luX3BvcnQgPSBodG9ucyhudG9ocyhtUmVtb3RlQWRkci5zaW5fcG9ydCkgfCAxKTsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmR0bygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRtcCkpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkZTUzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVURQX1BVU0hFUl9IXworCisjZGVmaW5lIFVEUF9QVVNIRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFVEUFB1c2hlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgVURQUHVzaGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBwb3J0KTsKKworICAgIHZvaWQgc3RhcnQoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflVEUFB1c2hlcigpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHVzaCA9ICdwdXNoJworICAgIH07CisKKyAgICBGSUxFICptRmlsZTsKKyAgICBpbnQgbVNvY2tldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZUFkZHI7CisKKyAgICB1aW50MzJfdCBtRmlyc3RUaW1lTXM7CisgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7CisKKyAgICBib29sIG9uUHVzaCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVURQUHVzaGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVURQX1BVU0hFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGM4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fU09VUkNFX0hfCisKKyNkZWZpbmUgVklERU9fU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFZpZGVvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRnJhbWVyYXRlID0gMjQ7ICAvLyBmcHMKKworcHVibGljOgorICAgIFZpZGVvU291cmNlKGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICAgICAgOiBtV2lkdGgod2lkdGgpLAorICAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgICBtU2l6ZSgod2lkdGggKiBoZWlnaHQgKiAzKSAvIDIpIHsKKyAgICAgICAgbUdyb3VwLmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1TaXplKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICBpZiAobU51bUZyYW1lc091dHB1dCA9PSBrRnJhbWVyYXRlICogMTAwKSB7CisgICAgICAgICAgICAvLyBTdG9wIHJldHVybmluZyBkYXRhIGFmdGVyIDEwIHNlY3MuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW50ZigiVmlkZW9Tb3VyY2U6OnJlYWRcbiIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAuYWNxdWlyZV9idWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgeCA9IChjaGFyKSgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYICogMjU1KTsKKyAgICAgICAgbWVtc2V0KCgqYnVmZmVyKS0+ZGF0YSgpLCB4LCBtU2l6ZSk7CisgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleVRpbWUsIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMCkgLyBrRnJhbWVyYXRlKTsKKyAgICAgICAgKyttTnVtRnJhbWVzT3V0cHV0OworCisgICAgICAgIC8vIHByaW50ZigiVmlkZW9Tb3VyY2U6OnJlYWQgLSByZXR1cm5pbmcgYnVmZmVyXG4iKTsKKyAgICAgICAgLy8gTE9HKElORk8pKCJWaWRlb1NvdXJjZTo6cmVhZCAtIHJldHVybmluZyBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvU291cmNlKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlckdyb3VwIG1Hcm91cDsKKyAgICBpbnQgbVdpZHRoLCBtSGVpZ2h0OworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7OworCisgICAgVmlkZW9Tb3VyY2UoY29uc3QgVmlkZW9Tb3VyY2UgJik7CisgICAgVmlkZW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBWaWRlb1NvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2I1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAicnRwX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCisjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIlVEUFB1c2hlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKKworICAgIGNvbnN0IGNoYXIgKnJ0cEZpbGVuYW1lID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpydGNwRmlsZW5hbWUgPSBOVUxMOworCisgICAgaWYgKGFyZ2MgPT0gMykgeworICAgICAgICBydHBGaWxlbmFtZSA9IGFyZ3ZbMV07CisgICAgICAgIHJ0Y3BGaWxlbmFtZSA9IGFyZ3ZbMl07CisgICAgfSBlbHNlIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWyBydHBGaWxlbmFtZSBydGNwRmlsZW5hbWUgXVxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworI2lmIDAKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU1BTW10gPSB7CisgICAgICAgIDB4NjcsIDB4NDIsIDB4ODAsIDB4MGEsIDB4ZTksIDB4MDIsIDB4ODMsIDB4ZTQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4N2QsIDB4MDAsIDB4MDAsIDB4MGUsIDB4YTYsIDB4MDAsIDB4ODAKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtQUFNbXSA9IHsKKyAgICAgICAgMHg2OCwgMHhjZSwgMHgzYywgMHg4MAorICAgIH07CisgICAgQVN0cmluZyBvdXQxLCBvdXQyOworICAgIGVuY29kZUJhc2U2NChrU1BTLCBzaXplb2Yoa1NQUyksICZvdXQxKTsKKyAgICBlbmNvZGVCYXNlNjQoa1BQUywgc2l6ZW9mKGtQUFMpLCAmb3V0Mik7CisgICAgcHJpbnRmKCJwYXJhbXM9JXMsJXNcbiIsIG91dDEuY19zdHIoKSwgb3V0Mi5jX3N0cigpKTsKKyNlbmRpZgorCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisKKyAgICBzcDxVRFBQdXNoZXI+IHJ0cF9wdXNoZXI7CisgICAgc3A8VURQUHVzaGVyPiBydGNwX3B1c2hlcjsKKworICAgIGlmIChydHBGaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIHJ0cF9wdXNoZXIgPSBuZXcgVURQUHVzaGVyKHJ0cEZpbGVuYW1lLCA1NDM0KTsKKyAgICAgICAgbG9vcGVyLT5yZWdpc3RlckhhbmRsZXIocnRwX3B1c2hlcik7CisKKyAgICAgICAgcnRjcF9wdXNoZXIgPSBuZXcgVURQUHVzaGVyKHJ0Y3BGaWxlbmFtZSwgNTQzNSk7CisgICAgICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHJ0Y3BfcHVzaGVyKTsKKyAgICB9CisKKyAgICBzcDxBUlRQU2Vzc2lvbj4gc2Vzc2lvbiA9IG5ldyBBUlRQU2Vzc2lvbjsKKyAgICBsb29wZXItPnJlZ2lzdGVySGFuZGxlcihzZXNzaW9uKTsKKworI2lmIDAKKyAgICAvLyBNeSBIMjY0IFNEUAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpyYXcgPQorICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgIm89LSA2NCAyMzM1NzI5NDQgSU4gSVA0IDEyNy4wLjAuMFxyXG4iCisgICAgICAgICJzPVF1aWNrVGltZVxyXG4iCisgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICJhPXJhbmdlOm5wdD0wLTMxNVxyXG4iCisgICAgICAgICJhPWlzbWEtY29tcGxpYW5jZToyLDIuMCwyXHJcbiIKKyAgICAgICAgIm09dmlkZW8gNTQzNCBSVFAvQVZQIDk3XHJcbiIKKyAgICAgICAgImM9SU4gSVA0IDEyNy4wLjAuMVxyXG4iCisgICAgICAgICJiPUFTOjMwXHJcbiIKKyAgICAgICAgImE9cnRwbWFwOjk3IEgyNjQvOTAwMDBcclxuIgorICAgICAgICAiYT1mbXRwOjk3IHBhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDIwMDBDOyIKKyAgICAgICAgICAic3Byb3AtcGFyYW1ldGVyLXNldHM9WjBJQURKWlVDZytJLGFNNDRnQT09XHJcbiIKKyAgICAgICAgImE9bXBlZzQtZXNpZDoyMDFcclxuIgorICAgICAgICAiYT1jbGlwcmVjdDowLDAsMjQwLDMyMFxyXG4iCisgICAgICAgICJhPWZyYW1lc2l6ZTo5NyAzMjAtMjQwXHJcbiI7CisjZWxpZiAwCisgICAgLy8gTXkgSDI2MyBTRFAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcmF3ID0KKyAgICAgICAgInY9MFxyXG4iCisgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAiYT1yYW5nZTpucHQ9MC0zMTVcclxuIgorICAgICAgICAiYT1pc21hLWNvbXBsaWFuY2U6MiwyLjAsMlxyXG4iCisgICAgICAgICJtPXZpZGVvIDU0MzQgUlRQL0FWUCA5N1xyXG4iCisgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAiYj1BUzozMFxyXG4iCisgICAgICAgICJhPXJ0cG1hcDo5NyBIMjYzLTE5OTgvOTAwMDBcclxuIgorICAgICAgICAiYT1jbGlwcmVjdDowLDAsMjQwLDMyMFxyXG4iCisgICAgICAgICJhPWZyYW1lc2l6ZTo5NyAzMjAtMjQwXHJcbiI7CisjZWxpZiAwCisgICAgLy8gTXkgQU1SIFNEUAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpyYXcgPQorICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgIm89LSA2NCAyMzM1NzI5NDQgSU4gSVA0IDEyNy4wLjAuMFxyXG4iCisgICAgICAgICJzPVF1aWNrVGltZVxyXG4iCisgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICJhPXJhbmdlOm5wdD0wLTMxNVxyXG4iCisgICAgICAgICJhPWlzbWEtY29tcGxpYW5jZToyLDIuMCwyXHJcbiIKKyAgICAgICAgIm09YXVkaW8gNTQzNCBSVFAvQVZQIDk3XHJcbiIKKyAgICAgICAgImM9SU4gSVA0IDEyNy4wLjAuMVxyXG4iCisgICAgICAgICJiPUFTOjMwXHJcbiIKKyAgICAgICAgImE9cnRwbWFwOjk3IEFNUi84MDAwLzFcclxuIgorICAgICAgICAiYT1mbXRwOjk3IG9jdGV0LWFsaWduXHJcbiI7CisjZWxpZiAxCisgICAgLy8gR1RhbGsncyBIMjY0IFNEUAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpyYXcgPQorICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgIm89LSA2NCAyMzM1NzI5NDQgSU4gSVA0IDEyNy4wLjAuMFxyXG4iCisgICAgICAgICJzPVF1aWNrVGltZVxyXG4iCisgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICJhPXJhbmdlOm5wdD1ub3ctXHJcbiIKKyAgICAgICAgIm09dmlkZW8gNTQzNCBSVFAvQVZQIDk2XHJcbiIKKyAgICAgICAgImM9SU4gSVA0IDEyNy4wLjAuMVxyXG4iCisgICAgICAgICJiPUFTOjMyMDAwMFxyXG4iCisgICAgICAgICJhPXJ0cG1hcDo5NiBIMjY0LzkwMDAwXHJcbiIKKyAgICAgICAgImE9Zm10cDo5NiBwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyMDAxRTsiCisgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzPVowSUFIcFpVQmFIb2dBPT0sYU00NGdBPT1cclxuIgorICAgICAgICAiYT1jbGlwcmVjdDowLDAsNDgwLDI3MFxyXG4iCisgICAgICAgICJhPWZyYW1lc2l6ZTo5NiA3MjAtNDgwXHJcbiI7CisjZWxzZQorICAgIC8vIHNob2xlcyBIMjY0IFNEUAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpyYXcgPQorICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgIm89LSA2NCAyMzM1NzI5NDQgSU4gSVA0IDEyNy4wLjAuMFxyXG4iCisgICAgICAgICJzPVF1aWNrVGltZVxyXG4iCisgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICJhPXJhbmdlOm5wdD1ub3ctXHJcbiIKKyAgICAgICAgIm09dmlkZW8gNTQzNCBSVFAvQVZQIDk2XHJcbiIKKyAgICAgICAgImM9SU4gSVA0IDEyNy4wLjAuMVxyXG4iCisgICAgICAgICJiPUFTOjMyMDAwMFxyXG4iCisgICAgICAgICJhPXJ0cG1hcDo5NiBIMjY0LzkwMDAwXHJcbiIKKyAgICAgICAgImE9Zm10cDo5NiBwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyMDAxRTsiCisgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzPVowS0FDdWtDZytRZ0FBQjlBQUFPcGdDQSxhTTQ4Z0E9PVxyXG4iCisgICAgICAgICJhPWNsaXByZWN0OjAsMCwyNDAsMzIwXHJcbiIKKyAgICAgICAgImE9ZnJhbWVzaXplOjk2IDMyMC0yNDBcclxuIjsKKyNlbmRpZgorCisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYyA9IG5ldyBBU2Vzc2lvbkRlc2NyaXB0aW9uOworICAgIENIRUNLKGRlc2MtPnNldFRvKHJhdywgc3RybGVuKHJhdykpKTsKKworICAgIENIRUNLX0VRKHNlc3Npb24tPnNldHVwKGRlc2MpLCAoc3RhdHVzX3QpT0spOworCisgICAgaWYgKHJ0cF9wdXNoZXIgIT0gTlVMTCkgeworICAgICAgICBydHBfcHVzaGVyLT5zdGFydCgpOworICAgIH0KKworICAgIGlmIChydGNwX3B1c2hlciAhPSBOVUxMKSB7CisgICAgICAgIHJ0Y3BfcHVzaGVyLT5zdGFydCgpOworICAgIH0KKworICAgIGxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovKTsKKworICAgIENIRUNLX0VRKHNlc3Npb24tPmNvdW50VHJhY2tzKCksIDF1KTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gc2Vzc2lvbi0+dHJhY2tBdCgwKTsKKworICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKKworICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwKKyAgICAgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCksIGZhbHNlIC8qIGNyZWF0ZUVuY29kZXIgKi8sCisgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgMCk7ICAvLyBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzKTsKKyAgICBDSEVDSyhkZWNvZGVyICE9IE5VTEwpOworCisgICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjb2Rlci0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0soZGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICAgICAgICAgIENIRUNLKGRlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiSU5GT19GT1JNQVRfQ0hBTkdFRCAlZCB4ICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HRSgiZGVjb2RlciByZXR1cm5lZCBlcnJvciAweCUwOHgiLCBlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkZWNvZGVyIHJldHVybmVkIGZyYW1lIG9mIHNpemUgJWQgYXQgdGltZSAlLjJmIHNlY3NcbiIsCisgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgdGltZVVzIC8gMUU2KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOworCisgICAgbG9vcGVyLT5zdG9wKCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggODcwYzBiOC4uMjJlY2M1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTg3LDcgKzg3LDggQEAKICAgICBsaWJ1dGlscyBcCiAgICAgbGliYmluZGVyIFwKICAgICBsaWJtZWRpYSBcCi0gICAgbGliaGFyZHdhcmVfbGVnYWN5CisgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKKyAgICBsaWJlZmZlY3RzCiAKIGlmZXEgKCQoc3RyaXAgJChCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8pKSx0cnVlKQogICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmF1ZGlvaW50ZXJmYWNlIGxpYmF1ZGlvcG9saWN5YmFzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAppbmRleCBhMDE4YjRjLi42YzExMTE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcApAQCAtMzIsNyArMzIsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0R1bXBJbnRlcmZhY2U6OkF1ZGlvRHVtcEludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykKLSAgICA6IG1GaXJzdEh3T3V0cHV0KHRydWUpLCBtUG9saWN5Q29tbWFuZHMoU3RyaW5nOCgiIikpLCBtRmlsZU5hbWUoU3RyaW5nOCgiIikpCisgICAgOiBtUG9saWN5Q29tbWFuZHMoU3RyaW5nOCgiIikpLCBtRmlsZU5hbWUoU3RyaW5nOCgiIikpCiB7CiAgICAgaWYoaHcgPT0gMCkgewogICAgICAgICBMT0dFKCJEdW1wIGNvbnN0cnVjdCBodyA9IDAiKTsKQEAgLTQ3LDYgKzQ3LDExIEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBjbG9zZU91dHB1dFN0cmVhbSgoQXVkaW9TdHJlYW1PdXQgKiltT3V0cHV0c1tpXSk7CiAgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsb3NlSW5wdXRTdHJlYW0oKEF1ZGlvU3RyZWFtSW4gKiltSW5wdXRzW2ldKTsKKyAgICB9CisKICAgICBpZihtRmluYWxJbnRlcmZhY2UpIGRlbGV0ZSBtRmluYWxJbnRlcmZhY2U7CiB9CiAKQEAgLTYwLDMxICs2NSwzMiBAQAogICAgIHVpbnQzMl90IGxSYXRlID0gNDQxMDA7CiAKIAotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcylkZXZpY2VzKSB8fCBtRmlyc3RId091dHB1dCkgewotICAgICAgICBvdXRGaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3Blbk91dHB1dFN0cmVhbShkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzdGF0dXMpOwotICAgICAgICBpZiAob3V0RmluYWwgIT0gMCkgewotICAgICAgICAgICAgbEZvcm1hdCA9IG91dEZpbmFsLT5mb3JtYXQoKTsKLSAgICAgICAgICAgIGxDaGFubmVscyA9IG91dEZpbmFsLT5jaGFubmVscygpOwotICAgICAgICAgICAgbFJhdGUgPSBvdXRGaW5hbC0+c2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcylkZXZpY2VzKSkgewotICAgICAgICAgICAgICAgIG1GaXJzdEh3T3V0cHV0ID0gZmFsc2U7CisgICAgb3V0RmluYWwgPSBtRmluYWxJbnRlcmZhY2UtPm9wZW5PdXRwdXRTdHJlYW0oZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSwgc3RhdHVzKTsKKyAgICBpZiAob3V0RmluYWwgIT0gMCkgeworICAgICAgICBsRm9ybWF0ID0gb3V0RmluYWwtPmZvcm1hdCgpOworICAgICAgICBsQ2hhbm5lbHMgPSBvdXRGaW5hbC0+Y2hhbm5lbHMoKTsKKyAgICAgICAgbFJhdGUgPSBvdXRGaW5hbC0+c2FtcGxlUmF0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxGb3JtYXQgPSAqZm9ybWF0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZm9ybWF0ID0gbEZvcm1hdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gMCAmJiAqZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgIGxGb3JtYXQgPSAqZm9ybWF0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbEZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbENoYW5uZWxzID0gKmNoYW5uZWxzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqY2hhbm5lbHMgPSBsQ2hhbm5lbHM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxzICE9IDAgJiYgKmNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgIGxDaGFubmVscyA9ICpjaGFubmVsczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxDaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gMCAmJiAqc2FtcGxlUmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICBsUmF0ZSA9ICpzYW1wbGVSYXRlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbFJhdGUgPSA0NDEwMDsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpzYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICBsUmF0ZSA9ICpzYW1wbGVSYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IGxSYXRlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMpICpzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9CkBAIC0xMTEsNyArMTE3LDYgQEAKICAgICBkdW1wT3V0LT5zdGFuZGJ5KCk7CiAgICAgaWYgKGR1bXBPdXQtPmZpbmFsU3RyZWFtKCkgIT0gTlVMTCkgewogICAgICAgICBtRmluYWxJbnRlcmZhY2UtPmNsb3NlT3V0cHV0U3RyZWFtKGR1bXBPdXQtPmZpbmFsU3RyZWFtKCkpOwotICAgICAgICBtRmlyc3RId091dHB1dCA9IHRydWU7CiAgICAgfQogCiAgICAgbU91dHB1dHMucmVtb3ZlKGR1bXBPdXQpOwpAQCAtMTI2LDE4ICsxMzEsMzMgQEAKICAgICB1aW50MzJfdCBsQ2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05POwogICAgIHVpbnQzMl90IGxSYXRlID0gODAwMDsKIAotCi0gICAgaWYgKG1JbnB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgaW5GaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3BlbklucHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cywgYWNvdXN0aWNzKTsKLSAgICAgICAgaWYgKGluRmluYWwgPT0gMCkgcmV0dXJuIDA7Ci0KKyAgICBpbkZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuSW5wdXRTdHJlYW0oZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSwgc3RhdHVzLCBhY291c3RpY3MpOworICAgIGlmIChpbkZpbmFsICE9IDApIHsKICAgICAgICAgbEZvcm1hdCA9IGluRmluYWwtPmZvcm1hdCgpOwogICAgICAgICBsQ2hhbm5lbHMgPSBpbkZpbmFsLT5jaGFubmVscygpOwogICAgICAgICBsUmF0ZSA9IGluRmluYWwtPnNhbXBsZVJhdGUoKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZm9ybWF0ICE9IDAgJiYgKmZvcm1hdCAhPSAwKSBsRm9ybWF0ID0gKmZvcm1hdDsKLSAgICAgICAgaWYgKGNoYW5uZWxzICE9IDAgJiYgKmNoYW5uZWxzICE9IDApIGxDaGFubmVscyA9ICpjaGFubmVsczsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gMCAmJiAqc2FtcGxlUmF0ZSAhPSAwKSBsUmF0ZSA9ICpzYW1wbGVSYXRlOworICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgIGlmICgqZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBsRm9ybWF0ID0gKmZvcm1hdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmZvcm1hdCA9IGxGb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKKyAgICAgICAgICAgIGlmICgqY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIGxDaGFubmVscyA9ICpjaGFubmVsczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmNoYW5uZWxzID0gbENoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgIGlmICgqc2FtcGxlUmF0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbFJhdGUgPSAqc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBsUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzKSAqc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogICAgIExPR1YoIm9wZW5JbnB1dFN0cmVhbSgpLCBpbkZpbmFsICVwIiwgaW5GaW5hbCk7CkBAIC0yMjMsNiArMjQzLDE1IEBACiAgICAgcmV0dXJuIGtleVZhbHVlUGFpcnM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRHVtcEludGVyZmFjZTo6c2V0TW9kZShpbnQgbW9kZSkKK3sKKyAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNb2RlKG1vZGUpOworfQorCitzaXplX3QgQXVkaW9EdW1wSW50ZXJmYWNlOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKK3sKKyAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQpOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIzNSw3ICsyNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgOiBtSW50ZXJmYWNlKGludGVyZmFjZSksIG1JZChpZCksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbHMoY2hhbm5lbHMpLCBtTGF0ZW5jeSgwKSwgbURldmljZShkZXZpY2VzKSwKLSAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtT3V0RmlsZSgwKSwgbUZpbGVDb3VudCgwKQorICAgICAgbUJ1ZmZlclNpemUoMTAyNCksIG1GaW5hbFN0cmVhbShmaW5hbFN0cmVhbSksIG1GaWxlKDApLCBtRmlsZUNvdW50KDApCiB7CiAgICAgTE9HVigiQXVkaW9TdHJlYW1PdXREdW1wIENvbnN0cnVjdG9yICVwLCBtSW50ZXJmYWNlICVwLCBtRmluYWxTdHJlYW0gJXAiLCB0aGlzLCBtSW50ZXJmYWNlLCBtRmluYWxTdHJlYW0pOwogfQpAQCAtMjU0LDI2ICsyODMsMjYgQEAKICAgICBpZiAobUZpbmFsU3RyZWFtKSB7CiAgICAgICAgIHJldCA9IG1GaW5hbFN0cmVhbS0+d3JpdGUoYnVmZmVyLCBieXRlcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdXNsZWVwKChieXRlcyAqIDEwMDAwMDApIC8gZnJhbWVTaXplKCkgLyBzYW1wbGVSYXRlKCkpOworICAgICAgICB1c2xlZXAoKCgoYnl0ZXMgKiAxMDAwKSAvIGZyYW1lU2l6ZSgpKSAvIHNhbXBsZVJhdGUoKSkgKiAxMDAwKTsKICAgICAgICAgcmV0ID0gYnl0ZXM7CiAgICAgfQotICAgIGlmKCFtT3V0RmlsZSkgeworICAgIGlmKCFtRmlsZSkgewogICAgICAgICBpZiAobUludGVyZmFjZS0+ZmlsZU5hbWUoKSAhPSAiIikgewogICAgICAgICAgICAgY2hhciBuYW1lWzI1NV07Ci0gICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIlc18lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7Ci0gICAgICAgICAgICBtT3V0RmlsZSA9IGZvcGVuKG5hbWUsICJ3YiIpOwotICAgICAgICAgICAgTE9HVigiT3BlbmluZyBkdW1wIGZpbGUgJXMsIGZoICVwIiwgbmFtZSwgbU91dEZpbGUpOworICAgICAgICAgICAgc3ByaW50ZihuYW1lLCAiJXNfb3V0XyVkXyVkLnBjbSIsIG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkuc3RyaW5nKCksIG1JZCwgKyttRmlsZUNvdW50KTsKKyAgICAgICAgICAgIG1GaWxlID0gZm9wZW4obmFtZSwgIndiIik7CisgICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtRmlsZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1PdXRGaWxlKSB7Ci0gICAgICAgIGZ3cml0ZShidWZmZXIsIGJ5dGVzLCAxLCBtT3V0RmlsZSk7CisgICAgaWYgKG1GaWxlKSB7CisgICAgICAgIGZ3cml0ZShidWZmZXIsIGJ5dGVzLCAxLCBtRmlsZSk7CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6c3RhbmRieSgpCiB7Ci0gICAgTE9HVigiQXVkaW9TdHJlYW1PdXREdW1wIHN0YW5kYnkoKSwgbU91dEZpbGUgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIG1PdXRGaWxlLCBtRmluYWxTdHJlYW0pOworICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBzdGFuZGJ5KCksIG1GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtRmlsZSwgbUZpbmFsU3RyZWFtKTsKIAogICAgIENsb3NlKCk7CiAgICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c3RhbmRieSgpOwpAQCAtMzMwLDcgKzM1OSw3IEBACiAgICAgfQogCiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJmb3JtYXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChtT3V0RmlsZSA9PSAwKSB7CisgICAgICAgIGlmIChtRmlsZSA9PSAwKSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gdmFsdWVJbnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKQEAgLTM0NSw3ICszNzQsNyBAQAogICAgIH0KICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInNhbXBsaW5nX3JhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmICh2YWx1ZUludCA+IDAgJiYgdmFsdWVJbnQgPD0gNDgwMDApIHsKLSAgICAgICAgICAgIGlmIChtT3V0RmlsZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobUZpbGUgPT0gMCkgewogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gdmFsdWVJbnQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzczLDkgKzQwMiw5IEBACiAKIHZvaWQgQXVkaW9TdHJlYW1PdXREdW1wOjpDbG9zZSgpCiB7Ci0gICAgaWYobU91dEZpbGUpIHsKLSAgICAgICAgZmNsb3NlKG1PdXRGaWxlKTsKLSAgICAgICAgbU91dEZpbGUgPSAwOworICAgIGlmKG1GaWxlKSB7CisgICAgICAgIGZjbG9zZShtRmlsZSk7CisgICAgICAgIG1GaWxlID0gMDsKICAgICB9CiB9CiAKQEAgLTM5Niw3ICs0MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgOiBtSW50ZXJmYWNlKGludGVyZmFjZSksIG1JZChpZCksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbHMoY2hhbm5lbHMpLCBtRGV2aWNlKGRldmljZXMpLAotICAgICAgbUJ1ZmZlclNpemUoMTAyNCksIG1GaW5hbFN0cmVhbShmaW5hbFN0cmVhbSksIG1JbkZpbGUoMCkKKyAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtRmlsZSgwKSwgbUZpbGVDb3VudCgwKQogewogICAgIExPR1YoIkF1ZGlvU3RyZWFtSW5EdW1wIENvbnN0cnVjdG9yICVwLCBtSW50ZXJmYWNlICVwLCBtRmluYWxTdHJlYW0gJXAiLCB0aGlzLCBtSW50ZXJmYWNlLCBtRmluYWxTdHJlYW0pOwogfQpAQCAtNDA5LDU1ICs0MzgsNjggQEAKIAogc3NpemVfdCBBdWRpb1N0cmVhbUluRHVtcDo6cmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpCiB7CisgICAgc3NpemVfdCByZXQ7CisKICAgICBpZiAobUZpbmFsU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBtRmluYWxTdHJlYW0tPnJlYWQoYnVmZmVyLCBieXRlcyk7Ci0gICAgfQotCi0gICAgdXNsZWVwKChieXRlcyAqIDEwMDAwMDApIC8gZnJhbWVTaXplKCkgLyBzYW1wbGVSYXRlKCkpOwotCi0gICAgaWYoIW1JbkZpbGUpIHsKLSAgICAgICAgY2hhciBuYW1lWzI1NV07Ci0gICAgICAgIHN0cmNweShuYW1lLCAiL3NkY2FyZC9tdXNpYy9zaW5lNDQwIik7Ci0gICAgICAgIGlmIChjaGFubmVscygpID09IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8pIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiX21vIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9zdCIpOworICAgICAgICByZXQgPSBtRmluYWxTdHJlYW0tPnJlYWQoYnVmZmVyLCBieXRlcyk7CisgICAgICAgIGlmKCFtRmlsZSkgeworICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIlc19pbl8lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7CisgICAgICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAid2IiKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGlucHV0IGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtRmlsZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZvcm1hdCgpID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICBzdHJjYXQobmFtZSwgIl8xNmIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzhiIik7CisgICAgICAgIGlmIChtRmlsZSkgeworICAgICAgICAgICAgZndyaXRlKGJ1ZmZlciwgYnl0ZXMsIDEsIG1GaWxlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoc2FtcGxlUmF0ZSgpIDwgMTYwMDApIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzhrIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlUmF0ZSgpIDwgMzIwMDApIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzIyayIpOwotICAgICAgICB9IGVsc2UgaWYgKHNhbXBsZVJhdGUoKSA8IDQ4MDAwKSB7Ci0gICAgICAgICAgICBzdHJjYXQobmFtZSwgIl80NGsiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzQ4ayIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVzbGVlcCgoKChieXRlcyAqIDEwMDApIC8gZnJhbWVTaXplKCkpIC8gc2FtcGxlUmF0ZSgpKSAqIDEwMDApOworICAgICAgICByZXQgPSBieXRlczsKKyAgICAgICAgaWYoIW1GaWxlKSB7CisgICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKKyAgICAgICAgICAgIHN0cmNweShuYW1lLCAiL3NkY2FyZC9tdXNpYy9zaW5lNDQwIik7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMoKSA9PSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PKSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfbW8iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3JtYXQoKSA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgeworICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzE2YiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl84YiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUoKSA8IDE2MDAwKSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfOGsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlUmF0ZSgpIDwgMzIwMDApIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl8yMmsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlUmF0ZSgpIDwgNDgwMDApIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl80NGsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfNDhrIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJjYXQobmFtZSwgIi53YXYiKTsKKyAgICAgICAgICAgIG1GaWxlID0gZm9wZW4obmFtZSwgInJiIik7CisgICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGlucHV0IHJlYWQgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtRmlsZSk7CisgICAgICAgICAgICBpZiAobUZpbGUpIHsKKyAgICAgICAgICAgICAgICBmc2VlayhtRmlsZSwgQVVESU9fRFVNUF9XQVZFX0hEUl9TSVpFLCBTRUVLX1NFVCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc3RyY2F0KG5hbWUsICIud2F2Iik7Ci0gICAgICAgIG1JbkZpbGUgPSBmb3BlbihuYW1lLCAicmIiKTsKLSAgICAgICAgTE9HVigiT3BlbmluZyBkdW1wIGZpbGUgJXMsIGZoICVwIiwgbmFtZSwgbUluRmlsZSk7Ci0gICAgICAgIGlmIChtSW5GaWxlKSB7Ci0gICAgICAgICAgICBmc2VlayhtSW5GaWxlLCBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUsIFNFRUtfU0VUKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGlmIChtSW5GaWxlKSB7Ci0gICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gZnJlYWQoYnVmZmVyLCBieXRlcywgMSwgbUluRmlsZSk7Ci0gICAgICAgIGlmIChieXRlc1JlYWQgIT0gYnl0ZXMpIHsKLSAgICAgICAgICAgIGZzZWVrKG1JbkZpbGUsIEFVRElPX0RVTVBfV0FWRV9IRFJfU0laRSwgU0VFS19TRVQpOwotICAgICAgICAgICAgZnJlYWQoKHVpbnQ4X3QgKilidWZmZXIrYnl0ZXNSZWFkLCBieXRlcy1ieXRlc1JlYWQsIDEsIG1JbkZpbGUpOworICAgICAgICBpZiAobUZpbGUpIHsKKyAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gZnJlYWQoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PTAgJiYgYnl0ZXNSZWFkIDwgYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBmc2VlayhtRmlsZSwgQVVESU9fRFVNUF9XQVZFX0hEUl9TSVpFLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgZnJlYWQoKHVpbnQ4X3QgKilidWZmZXIrYnl0ZXNSZWFkLCBieXRlcy1ieXRlc1JlYWQsIDEsIG1GaWxlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gYnl0ZXM7CisKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0dXNfdCBBdWRpb1N0cmVhbUluRHVtcDo6c3RhbmRieSgpCiB7Ci0gICAgTE9HVigiQXVkaW9TdHJlYW1JbkR1bXAgc3RhbmRieSgpLCBtSW5GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtSW5GaWxlLCBtRmluYWxTdHJlYW0pOworICAgIExPR1YoIkF1ZGlvU3RyZWFtSW5EdW1wIHN0YW5kYnkoKSwgbUZpbGUgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIG1GaWxlLCBtRmluYWxTdHJlYW0pOwogCiAgICAgQ2xvc2UoKTsKICAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC01MjMsOSArNTY1LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUluRHVtcDo6Q2xvc2UoKQogewotICAgIGlmKG1JbkZpbGUpIHsKLSAgICAgICAgZmNsb3NlKG1JbkZpbGUpOwotICAgICAgICBtSW5GaWxlID0gMDsKKyAgICBpZihtRmlsZSkgeworICAgICAgICBmY2xvc2UobUZpbGUpOworICAgICAgICBtRmlsZSA9IDA7CiAgICAgfQogfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaAppbmRleCA0YzYyYjNlLi44MTRjZTVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgdWludDMyX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCiAgICAgc2l6ZV90ICBtQnVmZmVyU2l6ZTsKICAgICBBdWRpb1N0cmVhbU91dCAgICAgICptRmluYWxTdHJlYW07Ci0gICAgRklMRSAgICAgICAgICAgICAgICAqbU91dEZpbGU7ICAgICAgLy8gb3V0cHV0IGZpbGUKKyAgICBGSUxFICAgICAgICAgICAgICAgICptRmlsZTsgICAgICAvLyBvdXRwdXQgZmlsZQogICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVDb3VudDsKIH07CiAKQEAgLTEwOSw3ICsxMDksOCBAQAogICAgIHVpbnQzMl90IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwogICAgIHNpemVfdCAgbUJ1ZmZlclNpemU7CiAgICAgQXVkaW9TdHJlYW1JbiAgICAgICptRmluYWxTdHJlYW07Ci0gICAgRklMRSAgICAgICAgICAgICAgICAqbUluRmlsZTsgICAgICAvLyBvdXRwdXQgZmlsZQorICAgIEZJTEUgICAgICAgICAgICAgICAgKm1GaWxlOyAgICAgIC8vIG91dHB1dCBmaWxlCisgICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZUNvdW50OwogfTsKIAogY2xhc3MgQXVkaW9EdW1wSW50ZXJmYWNlIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCkBAIC0xMzQsNiArMTM1LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpO30KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TW9kZShpbnQgbW9kZSk7CisKICAgICAvLyBtaWMgbXV0ZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNaWNNdXRlKHN0YXRlKTt9CkBAIC0xNDMsNiArMTQ2LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwogCisgICAgdmlydHVhbCBzaXplX3QgICAgICBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCk7CisKICAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSh1aW50MzJfdCBkZXZpY2VzLCBpbnQgKmZvcm1hdCwgdWludDMyX3QgKmNoYW5uZWxzLAogICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMsIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKTsKICAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pOwpAQCAtMTUzLDggKzE1OCw3IEBACiBwcm90ZWN0ZWQ6CiAKICAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlICAgICAgICAgICptRmluYWxJbnRlcmZhY2U7Ci0gICAgU29ydGVkVmVjdG9yPEF1ZGlvU3RyZWFtT3V0RHVtcCAqPiAgICBtT3V0cHV0czsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEh3T3V0cHV0OworICAgIFNvcnRlZFZlY3RvcjxBdWRpb1N0cmVhbU91dER1bXAgKj4gICBtT3V0cHV0czsKICAgICBTb3J0ZWRWZWN0b3I8QXVkaW9TdHJlYW1JbkR1bXAgKj4gICAgbUlucHV0czsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeUNvbW1hbmRzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAyNDE0ZThkLi5jZDliMDdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KLQorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgpAQCAtNTEsNiArNTEsOSBAQAogI2luY2x1ZGUgImxpZmV2aWJlcy5oIgogI2VuZGlmCiAKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCiAKQEAgLTYwLDYgKzYzLDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGdFZmZlY3RMaWJQYXRoOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrRGVhZGxvY2tlZFN0cmluZyA9ICJBdWRpb0ZsaW5nZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC02Nyw2ICs3Miw3IEBACiAKIC8vc3RhdGljIGNvbnN0IG5zZWNzX3Qga1N0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CiBzdGF0aWMgY29uc3QgZmxvYXQgTUFYX0dBSU4gPSA0MDk2LjBmOworc3RhdGljIGNvbnN0IGZsb2F0IE1BWF9HQUlOX0lOVCA9IDB4MTAwMDsKIAogLy8gcmV0cnkgY291bnRzIGZvciBidWZmZXIgZmlsbCB0aW1lb3V0CiAvLyA1MCAqIH4yMG1zZWNzID0gMSBzZWNvbmQKQEAgLTEyMyw3ICsxMjksNyBAQAogCiBBdWRpb0ZsaW5nZXI6OkF1ZGlvRmxpbmdlcigpCiAgICAgOiBCbkF1ZGlvRmxpbmdlcigpLAotICAgICAgICBtQXVkaW9IYXJkd2FyZSgwKSwgbU1hc3RlclZvbHVtZSgxLjBmKSwgbU1hc3Rlck11dGUoZmFsc2UpLCBtTmV4dFRocmVhZElkKDApCisgICAgICAgIG1BdWRpb0hhcmR3YXJlKDApLCBtTWFzdGVyVm9sdW1lKDEuMGYpLCBtTWFzdGVyTXV0ZShmYWxzZSksIG1OZXh0VW5pcXVlSWQoMSkKIHsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogCkBAIC0xMzIsOCArMTM4LDggQEAKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JTklUOwogICAgIGlmIChtQXVkaW9IYXJkd2FyZS0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gb3BlbiAxNi1iaXQgb3V0cHV0IHN0cmVhbSBmb3Igcy93IG1peGVyCi0KLSAgICAgICAgc2V0TW9kZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpOworICAgICAgICBtTW9kZSA9IEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTDsKKyAgICAgICAgc2V0TW9kZShtTW9kZSk7CiAKICAgICAgICAgc2V0TWFzdGVyVm9sdW1lKDEuMGYpOwogICAgICAgICBzZXRNYXN0ZXJNdXRlKGZhbHNlKTsKQEAgLTE0Miw2ICsxNDgsNyBAQAogICAgIH0KICNpZmRlZiBMVk1YCiAgICAgTGlmZVZpYmVzOjppbml0KCk7CisgICAgbUxpZmVWaWJlc0NsaWVudFBpZCA9IC0xOwogI2VuZGlmCiB9CiAKQEAgLTI4MSw2ICsyODgsNyBAQAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjazsKQEAgLTI4OCw2ICsyOTYsNyBAQAogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHdwPENsaWVudD4gd2NsaWVudDsKICAgICBzdGF0dXNfdCBsU3RhdHVzOworICAgIGludCBsU2Vzc2lvbklkOwogCiAgICAgaWYgKHN0cmVhbVR5cGUgPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKICAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSIpOwpAQCAtMjk4LDYgKzMwNyw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIExPR0UoInVua25vd24gb3V0cHV0IHRocmVhZCIpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTMxMiw4ICszMjIsNDQgQEAKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDbGllbnQodGhpcywgcGlkKTsKICAgICAgICAgICAgIG1DbGllbnRzLmFkZChwaWQsIGNsaWVudCk7CiAgICAgICAgIH0KKworICAgICAgICBMT0dWKCJjcmVhdGVUcmFjaygpIHNlc3Npb25JZDogJWQiLCAoc2Vzc2lvbklkID09IE5VTEwpID8gLTIgOiAqc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc2FtZSBhdWRpbyBzZXNzaW9uIG9uIGRpZmZlcmVudCBvdXRwdXQgdGhyZWFkcworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9ucyA9IHQtPmhhc0F1ZGlvU2Vzc2lvbigqc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25zICYgUGxheWJhY2tUaHJlYWQ6OlRSQUNLX1NFU1NJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW4gZWZmZWN0IHdpdGggc2FtZSBzZXNzaW9uIElEIGlzIHdhaXRpbmcgZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBQbGF5YmFja1RocmVhZDo6RUZGRUNUX1NFU1NJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFRocmVhZCA9IHQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQorICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiY3JlYXRlVHJhY2soKSBsU2Vzc2lvbklkOiAlZCIsIGxTZXNzaW9uSWQpOworCiAgICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCAmbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsICZsU3RhdHVzKTsKKworICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZworICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCisgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdFRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGxTZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CkBAIC00MTAsNiArNDU2LDggQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNb2RlKGludCBtb2RlKQogeworICAgIHN0YXR1c190IHJldDsKKwogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKQEAgLTQxOSwxNSArNDY3LDIzIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7Ci0gICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldE1vZGUobW9kZSk7Ci0jaWZkZWYgTFZNWAotICAgIGlmIChOT19FUlJPUiA9PSByZXQpIHsKLSAgICAgICAgTGlmZVZpYmVzOjpzZXRNb2RlKG1vZGUpOworICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOworICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTU9ERTsKKyAgICAgICAgcmV0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldE1vZGUobW9kZSk7CisgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQorCisgICAgaWYgKE5PX0VSUk9SID09IHJldCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtTW9kZSA9IG1vZGU7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1vZGUobW9kZSk7CisjaWZkZWYgTFZNWAorICAgICAgICBMaWZlVmliZXM6OnNldE1vZGUobW9kZSk7CiAjZW5kaWYKLSAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworICAgIH0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTU5Niw4ICs2NTIsMTAgQEAKICAgICBpbnQgbXVzaWNFbmFibGVkID0gLTE7CiAgICAgaWYgKE5PX0VSUk9SID09IHBhcmFtLmdldChrZXksIHZhbHVlKSkgewogICAgICAgICBpZiAodmFsdWUgPT0gTGlmZXZpYmVzRW5hYmxlKSB7CisgICAgICAgICAgICBtTGlmZVZpYmVzQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICAgICAgbXVzaWNFbmFibGVkID0gMTsKICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBMaWZldmliZXNEaXNhYmxlKSB7CisgICAgICAgICAgICBtTGlmZVZpYmVzQ2xpZW50UGlkID0gLTE7CiAgICAgICAgICAgICBtdXNpY0VuYWJsZWQgPSAwOwogICAgICAgICB9CiAgICAgfQpAQCAtNjA5LDcgKzY2Nyw3IEBACiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX1NFVF9QQVJBTUVURVI7CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb0hhcmR3YXJlLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogI2lmZGVmIExWTVgKLSAgICAgICAgaWYgKChOT19FUlJPUiA9PSByZXN1bHQpICYmIChtdXNpY0VuYWJsZWQgIT0gLTEpKSB7CisgICAgICAgIGlmIChtdXNpY0VuYWJsZWQgIT0gLTEpIHsKICAgICAgICAgICAgIExpZmVWaWJlczo6ZW5hYmxlTXVzaWMoKGJvb2wpIG11c2ljRW5hYmxlZCk7CiAgICAgICAgIH0KICNlbmRpZgpAQCAtNzEzLDUxICs3NzEsNTcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQogewogCi0gICAgTE9HVigicmVnaXN0ZXJDbGllbnQoKSAlcCwgdGlkICVkLCBjYWxsaW5nIHRpZCAlZCIsIGNsaWVudC5nZXQoKSwgZ2V0dGlkKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZihiaW5kZXIpIDwgMCkgewotICAgICAgICBMT0dWKCJBZGRpbmcgbm90aWZpY2F0aW9uIGNsaWVudCAlcCIsIGJpbmRlci5nZXQoKSk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChiaW5kZXIpOwotICAgIH0KKyAgICBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCkgPCAwKSB7CisgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICBMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgcGlkICVkIiwgbm90aWZpY2F0aW9uQ2xpZW50LmdldCgpLCBwaWQpOwogCi0gICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jawotICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2VuZENvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKLSAgICB9CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChwaWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRDb25maWdFdmVudChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKLSAgICB9Ci19CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwogCi12b2lkIEF1ZGlvRmxpbmdlcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgICAgIC8vIHRoZSBjb25maWcgY2hhbmdlIGlzIGFsd2F5cyBzZW50IGZyb20gcGxheWJhY2sgb3IgcmVjb3JkIHRocmVhZHMgdG8gYXZvaWQgZGVhZGxvY2sKKyAgICAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRDb25maWdFdmVudChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgICAgIH0KIAotICAgIExPR1YoImJpbmRlckRpZWQoKSAlcCwgdGlkICVkLCBjYWxsaW5nIHRpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksIGdldHRpZCgpLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBJQmluZGVyICpiaW5kZXIgPSB3aG8udW5zYWZlX2dldCgpOwotCi0gICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpbmRleCA9IG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2YoYmluZGVyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIExPR1YoIlJlbW92aW5nIG5vdGlmaWNhdGlvbiBjbGllbnQgJXAiLCBiaW5kZXIpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlQXQoaW5kZXgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBpbnQgaW5kZXggPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3AgPE5vdGlmaWNhdGlvbkNsaWVudD4gY2xpZW50ID0gbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IocGlkKTsKKyAgICAgICAgTE9HVigicmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgJXAsIHBpZCAlZCIsIGNsaWVudC5nZXQoKSwgcGlkKTsKKyNpZmRlZiBMVk1YCisgICAgICAgIGlmIChwaWQgPT0gbUxpZmVWaWJlc0NsaWVudFBpZCkgeworICAgICAgICAgICAgTE9HVigiRGlzYWJsaW5nIGxpZmV2aWJlcyIpOworICAgICAgICAgICAgTGlmZVZpYmVzOjplbmFibGVNdXNpYyhmYWxzZSk7CisgICAgICAgICAgICBtTGlmZVZpYmVzQ2xpZW50UGlkID0gLTE7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgfQorfQorCiAvLyBhdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgaW9IYW5kbGUsIHZvaWQgKnBhcmFtMikgewordm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IGlvSGFuZGxlLCB2b2lkICpwYXJhbTIpCit7CiAgICAgc2l6ZV90IHNpemUgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuaXRlbUF0KGkpOwotICAgICAgICBMT0dWKCJhdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIE5vdGlmeWluZyBjaGFuZ2UgdG8gY2xpZW50ICVwIiwgYmluZGVyLmdldCgpKTsKLSAgICAgICAgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvRmxpbmdlckNsaWVudD4gKGJpbmRlcik7Ci0gICAgICAgIGNsaWVudC0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0hhbmRsZSwgcGFyYW0yKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+Y2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgaW9IYW5kbGUsIHBhcmFtMik7CiAgICAgfQogfQogCkBAIC03NjgsMTIgKzgzMiwxMyBAQAogICAgIG1DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKIH0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGludCBpZCkKICAgICA6ICAgVGhyZWFkKGZhbHNlKSwKICAgICAgICAgbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpLCBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksIG1DaGFubmVsQ291bnQoMCksCi0gICAgICAgIG1Gb3JtYXQoMCksIG1GcmFtZVNpemUoMSksIG1TdGFuZGJ5KGZhbHNlKSwgbUlkKGlkKSwgbUV4aXRpbmcoZmFsc2UpCisgICAgICAgIG1GcmFtZVNpemUoMSksIG1Gb3JtYXQoMCksIG1TdGFuZGJ5KGZhbHNlKSwgbUlkKGlkKSwgbUV4aXRpbmcoZmFsc2UpCiB7CiB9CiAKQEAgLTgwNiw3ICs4NzEsNyBAQAogCiBpbnQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpjaGFubmVsQ291bnQoKSBjb25zdAogewotICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgIHJldHVybiAoaW50KW1DaGFubmVsQ291bnQ7CiB9CiAKIGludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0CkBAIC04NjMsMTEgKzkyOCwxMiBAQAogICAgICAgICBMT0dWKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKICAgICAgICAgQ29uZmlnRXZlbnQgKmNvbmZpZ0V2ZW50ID0gbUNvbmZpZ0V2ZW50c1swXTsKICAgICAgICAgbUNvbmZpZ0V2ZW50cy5yZW1vdmVBdCgwKTsKLSAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWNhdXNlIGF1ZGlvQ29uZmlnQ2hhbmdlZCgpIHdpbGwgbG9jayBBdWRpb0ZsaW5nZXIgbUxvY2sKLSAgICAgICAgLy8gYmVmb3JlIGNhbGxpbmcgQXVkaW9mbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIHRodXMgY3JlYXRpbmcKLSAgICAgICAgLy8gcG90ZW50aWFsIGNyb3NzIGRlYWRsb2NrIGJldHdlZW4gQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgbUxvY2sKKyAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgbG9ja2luZyBBdWRpb0ZsaW5nZXIgbUxvY2s6IGxvY2sgb3JkZXIgaXMgYWx3YXlzCisgICAgICAgIC8vIEF1ZGlvRmxpbmdlciB0aGVuIFRocmVhZEJhc2UgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2sKICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChjb25maWdFdmVudC0+bUV2ZW50LCBjb25maWdFdmVudC0+bVBhcmFtKTsKKyAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2subG9jaygpOworICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChjb25maWdFdmVudC0+bUV2ZW50LCBjb25maWdFdmVudC0+bVBhcmFtKTsKKyAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2sudW5sb2NrKCk7CiAgICAgICAgIGRlbGV0ZSBjb25maWdFdmVudDsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgIH0KQEAgLTkyOSwxMCArOTk1LDExIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGxheWJhY2tUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBpbnQgaWQpCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQbGF5YmFja1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKQogICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQpLAogICAgICAgICBtTWl4QnVmZmVyKDApLCBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLCBtT3V0cHV0KG91dHB1dCksCi0gICAgICAgIG1MYXN0V3JpdGVUaW1lKDApLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpCisgICAgICAgIG1MYXN0V3JpdGVUaW1lKDApLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAorICAgICAgICBtRGV2aWNlKGRldmljZSkKIHsKICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwogCkBAIC05NDMsOCArMTAxMCw2IEBACiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbVZvbHVtZUludGVybmFsKHN0cmVhbSk7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1NdXRlKHN0cmVhbSk7CiAgICAgfQotICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIHRoYXQgYSBuZXcgaW5wdXQgaGFzIGJlZW4gb3BlbmVkCi0gICAgc2VuZENvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6flBsYXliYWNrVGhyZWFkKCkKQEAgLTk1Niw2ICsxMDIxLDcgQEAKIHsKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKKyAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTk2Nyw3ICsxMDMzLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSBDbGllbiBUeXAgRm10IENobiBCdWYgIFMgTSBGIFNSYXRlICBMZWZ0ViBSaWdoViBTZXJ2ICAgICBVc2VyXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtOTc4LDcgKzEwNDQsNyBAQAogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSBDbGllbiBUeXAgRm10IENobiBCdWYgIFMgTSBGIFNSYXRlICBMZWZ0ViBSaWdoViBTZXJ2ICAgICBVc2VyXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICB3cDxUcmFjaz4gd1RyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHdUcmFjayAhPSAwKSB7CkBAIC05OTMsNiArMTA1OSwyNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEVmZmVjdENoYWlucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbi0gJWQgRWZmZWN0IENoYWluczpcbiIsIG1FZmZlY3RDaGFpbnMuc2l6ZSgpKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUVmZmVjdENoYWluc1tpXTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIGNoYWluLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTAxMSw2ICsxMDk1LDggQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic3VzcGVuZCBjb3VudDogJWRcbiIsIG1TdXNwZW5kZWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtaXggYnVmZmVyIDogJXBcbiIsIG1NaXhCdWZmZXIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKQEAgLTEwNDgsMTMgKzExMzQsMTQgQEAKICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8VHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKICAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxDb3VudCAhPSBtQ2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxDb3VudCAhPSAoaW50KW1DaGFubmVsQ291bnQpIHsKICAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiAgc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxDb3VudCAlZCBmb3Igb3V0cHV0ICVwIiwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIG1PdXRwdXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTEwNzcsMTMgKzExNjQsMzcgQEAKIAogICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgLy8gYWxsIHRyYWNrcyBpbiBzYW1lIGF1ZGlvIHNlc3Npb24gbXVzdCBzaGFyZSB0aGUgc2FtZSByb3V0aW5nIHN0cmF0ZWd5IG90aGVyd2lzZQorICAgICAgICAvLyBjb25mbGljdHMgd2lsbCBoYXBwZW4gd2hlbiB0cmFja3MgYXJlIG1vdmVkIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyIGJ5IGF1ZGlvIHBvbGljeQorICAgICAgICAvLyBtYW5hZ2VyCisgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0KKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW1UeXBlKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0LT5zZXNzaW9uSWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgIT0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpdC0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIpOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOwogICAgICAgICBpZiAodHJhY2stPmdldENibGsoKSA9PSBOVUxMIHx8IHRyYWNrLT5uYW1lKCkgPCAwKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKKworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBMT0dWKCJjcmVhdGVUcmFja19sKCkgc2V0dGluZyBtYWluIGJ1ZmZlciAlcCIsIGNoYWluLT5pbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKGNoYWluLT5pbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGNoYWluLT5zZXRTdHJhdGVneShBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSl0cmFjay0+dHlwZSgpKSk7CisgICAgICAgIH0KICAgICB9CiAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCkBAIC0xMjAwLDYgKzEzMTEsMTQgQEAKICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfRklMTElORzsKICAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyKSB7CisgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIExPR1YoImFkZFRyYWNrX2woKSBzdGFydGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIGNoYWluLT5zdGFydFRyYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9CiAKQEAgLTEyMjQsMTYgKzEzNDMsMTcgQEAKICAgICByZXR1cm4gbU91dHB1dC0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKKy8vIGRlc3Ryb3lUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgIHZvaWQgKnBhcmFtMiA9IDA7CiAKLSAgICBMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LCBwYXJhbSk7CisgICAgTE9HVigiUGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LCBwYXJhbSk7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbENvdW50OworICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxzOwogICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwpAQCAtMTI0NywyNCArMTM2NywzNCBAQAogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUF1ZGlvRmxpbmdlci0+bUxvY2spOwogICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKQogewogICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+c2FtcGxlUmF0ZSgpOwotICAgIG1DaGFubmVsQ291bnQgPSBBdWRpb1N5c3RlbTo6cG9wQ291bnQobU91dHB1dC0+Y2hhbm5lbHMoKSk7Ci0KKyAgICBtQ2hhbm5lbHMgPSBtT3V0cHV0LT5jaGFubmVscygpOworICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpQXVkaW9TeXN0ZW06OnBvcENvdW50KG1DaGFubmVscyk7CiAgICAgbUZvcm1hdCA9IG1PdXRwdXQtPmZvcm1hdCgpOwotICAgIG1GcmFtZVNpemUgPSBtT3V0cHV0LT5mcmFtZVNpemUoKTsKKyAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KW1PdXRwdXQtPmZyYW1lU2l6ZSgpOwogICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+YnVmZmVyU2l6ZSgpIC8gbUZyYW1lU2l6ZTsKIAogICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQ6IEFsd2F5cwogICAgIC8vIEFsbG9jYXRlIGEgc3RlcmVvIGJ1ZmZlciBldmVuIGlmIEhXIG91dHB1dCBpcyBtb25vLgotICAgIGlmIChtTWl4QnVmZmVyICE9IE5VTEwpIGRlbGV0ZSBtTWl4QnVmZmVyOworICAgIGlmIChtTWl4QnVmZmVyICE9IE5VTEwpIGRlbGV0ZVtdIG1NaXhCdWZmZXI7CiAgICAgbU1peEJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogMl07CiAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1GcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAvLyBmb3JjZSByZWNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0IGNoYWlucyBhbmQgZW5naW5lcyB0byB0YWtlIG5ldyBidWZmZXIgc2l6ZSBhbmQgYXVkaW8KKyAgICAvLyBwYXJhbWV0ZXJzIGludG8gYWNjb3VudAorICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCisgICAgLy8gYnV0IGluIHRoaXMgY2FzZSBub3RoaW5nIGlzIGRvbmUgYmVsb3cgYXMgbm8gYXVkaW8gc2Vzc2lvbnMgaGF2ZSBlZmZlY3QgeWV0IHNvIGl0IGRvZXNuJ3QKKyAgICAvLyBtYXR0ZXIuCisgICAgLy8gY3JlYXRlIGEgY29weSBvZiBtRWZmZWN0Q2hhaW5zIGFzIGNhbGxpbmcgbW92ZUVmZmVjdENoYWluX2woKSBjYW4gcmVvcmRlciBzb21lIGVmZmVjdCBjaGFpbnMKKyAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1vdmVFZmZlY3RDaGFpbl9sKGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCksIHRoaXMsIHRoaXMsIGZhbHNlKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpCkBAIC0xMjgwLDEwICsxNDEwLDc2IEBACiAgICAgcmV0dXJuIG1PdXRwdXQtPmdldFJlbmRlclBvc2l0aW9uKGRzcEZyYW1lcyk7CiB9CiAKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbihpbnQgc2Vzc2lvbklkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKKyAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmCisgICAgICAgICAgICAgICAgISh0cmFjay0+bUNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKQoreworICAgIC8vIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdAorICAgIC8vIGl0IGlzIG1vdmVkIHRvIGNvcnJlY3Qgb3V0cHV0IGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdoZW4gQTJEUCBpcyBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkCisgICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06Ok1VU0lDKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmCisgICAgICAgICAgICAgICAgISh0cmFjay0+bUNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgdHJhY2stPnR5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6TVVTSUMpOworfQorCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRFZmZlY3RDaGFpbihpbnQgc2Vzc2lvbklkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKK30KKworc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0RWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbklkKQoreworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdENoYWlucy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKG1FZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpID09IHNlc3Npb25JZCkgeworICAgICAgICAgICAgY2hhaW4gPSBtRWZmZWN0Q2hhaW5zW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoYWluOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1vZGUodWludDMyX3QgbW9kZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdENoYWlucy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0TW9kZV9sKG1vZGUpOworICAgIH0KK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkKSwKK0F1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6Ok1peGVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkLCB1aW50MzJfdCBkZXZpY2UpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlKSwKICAgICAgICAgbUF1ZGlvTWl4ZXIoMCkKIHsKICAgICBtVHlwZSA9IFBsYXliYWNrVGhyZWFkOjpNSVhFUjsKQEAgLTEzMDIsNyArMTQ5OCw2IEBACiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcCgpCiB7Ci0gICAgaW50MTZfdCogY3VyQnVmID0gbU1peEJ1ZmZlcjsKICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+IHRyYWNrc1RvUmVtb3ZlOwogICAgIHVpbnQzMl90IG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICBuc2Vjc190IHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpOwpAQCAtMTMxNSw2ICsxNTEwLDcgQEAKICAgICB1aW50MzJfdCBhY3RpdmVTbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWVVcygpOwogICAgIHVpbnQzMl90IGlkbGVTbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lVXMoKTsKICAgICB1aW50MzJfdCBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKQEAgLTEzNzMsMTMgKzE1NjksMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBwcmVwYXJlVHJhY2tzX2woYWN0aXZlVHJhY2tzLCAmdHJhY2tzVG9SZW1vdmUpOworCisgICAgICAgICAgICAvLyBwcmV2ZW50IGFueSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbiBsaXN0IGFuZCBpbiBlYWNoIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgLy8gZHVyaW5nIG1peGluZyBhbmQgZWZmZWN0IHByb2Nlc3MgYXMgdGhlIGF1ZGlvIGJ1ZmZlcnMgY291bGQgYmUgZGVsZXRlZAorICAgICAgICAgICAgLy8gb3IgbW9kaWZpZWQgaWYgYW4gZWZmZWN0IGlzIGNyZWF0ZWQgb3IgZGVsZXRlZAorICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgfQogCiAgICAgICAgIGlmIChMSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewogICAgICAgICAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKGN1ckJ1Zik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+cHJvY2VzcygpOwogICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsga1N0YW5kYnlUaW1lSW5Oc2VjczsKKyAgICAgICAgICAgIC8vVE9ETzogZGVsYXkgc3RhbmRieSB3aGVuIGVmZmVjdHMgaGF2ZSBhIHRhaWwKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIElmIG5vIHRyYWNrcyBhcmUgcmVhZHksIHNsZWVwIG9uY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiBhbiBvdXRwdXQKICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplLCB0aGVuIHdyaXRlIDBzIHRvIHRoZSBvdXRwdXQKQEAgLTEzOTEsMjcgKzE1OTMsMzQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQgJiYgbG9uZ1N0YW5kYnlFeGl0KSkgewotICAgICAgICAgICAgICAgIG1lbXNldCAoY3VyQnVmLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQgKG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgICAgICAgICAgICAgTE9HVl9JRigobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCAmJiBsb25nU3RhbmRieUV4aXQpKSwgImFudGljaXBhdGVkIHN0YXJ0Iik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIGFkZCBzdGFuZGJ5IHRpbWUgZXh0ZW5zaW9uIGZjdCBvZiBlZmZlY3QgdGFpbAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgfQogICAgICAgICAvLyBzbGVlcFRpbWUgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwogI2lmZGVmIExWTVgKICAgICAgICAgICAgIGludCBhdWRpb091dHB1dFR5cGUgPSBMaWZlVmliZXM6OmdldE1peGVyVHlwZShtSWQsIG1UeXBlKTsKICAgICAgICAgICAgIGlmIChMaWZlVmliZXM6OmF1ZGlvT3V0cHV0VHlwZUlzTGlmZVZpYmVzKGF1ZGlvT3V0cHV0VHlwZSkpIHsKLSAgICAgICAgICAgICAgIExpZmVWaWJlczo6cHJvY2VzcyhhdWRpb091dHB1dFR5cGUsIGN1ckJ1ZiwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICBMaWZlVmliZXM6OnByb2Nlc3MoYXVkaW9PdXRwdXRUeXBlLCBtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKICAgICAgICAgICAgIH0KICNlbmRpZgotICAgICAgICAgICAgaW50IGJ5dGVzV3JpdHRlbiA9IChpbnQpbU91dHB1dC0+d3JpdGUoY3VyQnVmLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgbUluV3JpdGUgPSB0cnVlOworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtaXhCdWZmZXJTaXplOworCisgICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gKGludCltT3V0cHV0LT53cml0ZShtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKICAgICAgICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPCAwKSBtQnl0ZXNXcml0dGVuIC09IG1peEJ1ZmZlclNpemU7CiAgICAgICAgICAgICBtTnVtV3JpdGVzKys7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IGZhbHNlOwpAQCAtMTQzMCw2ICsxNjM5LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KKyAgICAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwogICAgICAgICAgICAgdXNsZWVwKHNsZWVwVGltZSk7CiAgICAgICAgIH0KIApAQCAtMTQzNyw2ICsxNjQ4LDEwIEBACiAgICAgICAgIC8vIHNpbmNlIHdlIGNhbid0IGd1YXJhbnRlZSB0aGUgZGVzdHJ1Y3RvcnMgd29uJ3QgYWNxdWlyZSB0aGF0CiAgICAgICAgIC8vIHNhbWUgbG9jay4KICAgICAgICAgdHJhY2tzVG9SZW1vdmUuY2xlYXIoKTsKKworICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpbGwgYmUgYWN0dWFsbHkgZGVsZXRlZCBoZXJlIGlmIHRoZXkgd2VyZSByZW1vdmVkIGZyb20KKyAgICAgICAgLy8gbUVmZmVjdENoYWlucyBsaXN0IGR1cmluZyBtaXhpbmcgb3IgZWZmZWN0cyBwcm9jZXNzaW5nCisgICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOwogICAgIH0KIAogICAgIGlmICghbVN0YW5kYnkpIHsKQEAgLTE0NTQsMTAgKzE2NjksMTUgQEAKICAgICB1aW50MzJfdCBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCiAgICAgc2l6ZV90IGNvdW50ID0gYWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbWl4ZWRUcmFja3MgPSAwOworICAgIHNpemVfdCB0cmFja3NXaXRoRWZmZWN0ID0gMDsKIAogICAgIGZsb2F0IG1hc3RlclZvbHVtZSA9IG1NYXN0ZXJWb2x1bWU7CiAgICAgYm9vbCAgbWFzdGVyTXV0ZSA9IG1NYXN0ZXJNdXRlOwogCisgICAgaWYgKG1hc3Rlck11dGUpIHsKKyAgICAgICAgbWFzdGVyVm9sdW1lID0gMDsKKyAgICB9CiAjaWZkZWYgTFZNWAogICAgIGJvb2wgdHJhY2tzQ29ubmVjdGVkQ2hhbmdlZCA9IGZhbHNlOwogICAgIGJvb2wgc3RhdGVDaGFuZ2VkID0gZmFsc2U7CkBAIC0xNDc2LDYgKzE2OTYsMTQgQEAKICAgICAgICAgTGlmZVZpYmVzOjpjb21wdXRlVm9sdW1lcyhhdWRpb091dHB1dFR5cGUsIGFjdGl2ZVR5cGVzLCB0cmFja3NDb25uZWN0ZWRDaGFuZ2VkLCBzdGF0ZUNoYW5nZWQsIG1hc3RlclZvbHVtZSwgbWFzdGVyTXV0ZSk7CiAgICAgfQogI2VuZGlmCisgICAgLy8gRGVsZWdhdGUgbWFzdGVyIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiBvdXRwdXQgbWl4IGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIHVpbnQzMl90IHYgPSAodWludDMyX3QpKG1hc3RlclZvbHVtZSAqICgxIDw8IDI0KSk7CisgICAgICAgIGNoYWluLT5zZXRWb2x1bWVfbCgmdiwgJnYpOworICAgICAgICBtYXN0ZXJWb2x1bWUgPSAoZmxvYXQpKCh2ICsgKDEgPDwgMjMpKSA+PiAyNCk7CisgICAgICAgIGNoYWluLmNsZWFyKCk7CisgICAgfQogCiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBzcDxUcmFjaz4gdCA9IGFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CkBAIC0xNDg3LDQ1ICsxNzE1LDI3IEBACiAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAogICAgICAgICBtQXVkaW9NaXhlci0+c2V0QWN0aXZlVHJhY2sodHJhY2stPm5hbWUoKSk7Ci0gICAgICAgIGlmIChjYmxrLT5mcmFtZXNSZWFkeSgpICYmICh0cmFjay0+aXNSZWFkeSgpIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSkgJiYKKyAgICAgICAgaWYgKGNibGstPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQogICAgICAgICB7CiAgICAgICAgICAgICAvL0xPR1YoInRyYWNrICVkIHU9JTA4eCwgcz0lMDh4IFtPS10gb24gdGhyZWFkICVwIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+dXNlciwgY2Jsay0+c2VydmVyLCB0aGlzKTsKIAotICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKLSAgICAgICAgICAgIGludDE2X3QgbGVmdCwgcmlnaHQ7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzTXV0ZWQoKSB8fCBtYXN0ZXJNdXRlIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlc1t0cmFjay0+dHlwZSgpXS5tdXRlKSB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKKyAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CisKKyAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlciBtZWFucyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4KKyAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKKyAgICAgICAgICAgIGNoYWluLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0cmFja3NXaXRoRWZmZWN0Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICUwOHggYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bmFtZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCBvcmlnaW5hbCB2b2x1bWVzIHdpdGggdm9sdW1lIGNvbnRyb2wKLSAgICAgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT50eXBlKCldLnZvbHVtZTsKLSNpZmRlZiBMVk1YCi0gICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlPWZhbHNlOwotICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIHZvbHVtZSBmcm9tIHRoZSBMaXZlc1ZpYmVzIGF1ZGlvIGVuZ2luZS4KLSAgICAgICAgICAgICAgICBpZiAoTGlmZVZpYmVzOjphdWRpb091dHB1dFR5cGVJc0xpZmVWaWJlcyhhdWRpb091dHB1dFR5cGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTGlmZVZpYmVzOjpnZXRTdHJlYW1Wb2x1bWVzKGF1ZGlvT3V0cHV0VHlwZSwgdHJhY2stPnR5cGUoKSwgJnR5cGVWb2x1bWUsICZzdHJlYW1NdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU11dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVWb2x1bWUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdl9jbGFtcGVkID0gdiAqIGNibGstPnZvbHVtZVswXTsKLSAgICAgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICAgICAgICAgIGxlZnQgPSBpbnQxNl90KHZfY2xhbXBlZCk7Ci0gICAgICAgICAgICAgICAgdl9jbGFtcGVkID0gdiAqIGNibGstPnZvbHVtZVsxXTsKLSAgICAgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICAgICAgICAgIHJpZ2h0ID0gaW50MTZfdCh2X2NsYW1wZWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2spOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOwogCiAgICAgICAgICAgICBpbnQgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewpAQCAtMTU0MCw2ICsxNzUwLDYyIEBACiAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGFwcGx5IHJhbXAKICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjaworICAgICAgICAgICAgdWludDMyX3QgdmwsIHZyLCB2YTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNNdXRlZCgpIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fAorICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlc1t0cmFjay0+dHlwZSgpXS5tdXRlKSB7CisgICAgICAgICAgICAgICAgdmwgPSB2ciA9IHZhID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gcmVhZCBvcmlnaW5hbCB2b2x1bWVzIHdpdGggdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT50eXBlKCldLnZvbHVtZTsKKyNpZmRlZiBMVk1YCisgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlPWZhbHNlOworICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIHZvbHVtZSBmcm9tIHRoZSBMaXZlc1ZpYmVzIGF1ZGlvIGVuZ2luZS4KKyAgICAgICAgICAgICAgICBpZiAoTGlmZVZpYmVzOjphdWRpb091dHB1dFR5cGVJc0xpZmVWaWJlcyhhdWRpb091dHB1dFR5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlmZVZpYmVzOjpnZXRTdHJlYW1Wb2x1bWVzKGF1ZGlvT3V0cHV0VHlwZSwgdHJhY2stPnR5cGUoKSwgJnR5cGVWb2x1bWUsICZzdHJlYW1NdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU11dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVWb2x1bWUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CisgICAgICAgICAgICAgICAgdmwgPSAodWludDMyX3QpKHYgKiBjYmxrLT52b2x1bWVbMF0pIDw8IDEyOworICAgICAgICAgICAgICAgIHZyID0gKHVpbnQzMl90KSh2ICogY2Jsay0+dm9sdW1lWzFdKSA8PCAxMjsKKworICAgICAgICAgICAgICAgIHZhID0gKHVpbnQzMl90KSh2ICogY2Jsay0+c2VuZExldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCAmJiBjaGFpbi0+c2V0Vm9sdW1lX2woJnZsLCAmdnIpKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJhbXAgdm9sdW1lIGlmIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IGVmZmVjdAorICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZvcmNlIG5vIHZvbHVtZSByYW1wIHdoZW4gdm9sdW1lIGNvbnRyb2xsZXIgd2FzIGp1c3QgZGlzYWJsZWQgb3IgcmVtb3ZlZAorICAgICAgICAgICAgICAgIC8vIGZyb20gZWZmZWN0IGNoYWluIHRvIGF2b2lkIHZvbHVtZSBzcGlrZQorICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlciA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZXMgZnJvbSA4LjI0IHRvIDQuMTIgZm9ybWF0CisgICAgICAgICAgICBpbnQxNl90IGxlZnQsIHJpZ2h0LCBhdXg7CisgICAgICAgICAgICB1aW50MzJfdCB2X2NsYW1wZWQgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgbGVmdCA9IGludDE2X3Qodl9jbGFtcGVkKTsKKyAgICAgICAgICAgIHZfY2xhbXBlZCA9ICh2ciArICgxIDw8IDExKSkgPj4gMTI7CisgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU5fSU5UKSB2X2NsYW1wZWQgPSBNQVhfR0FJTl9JTlQ7CisgICAgICAgICAgICByaWdodCA9IGludDE2X3Qodl9jbGFtcGVkKTsKKworICAgICAgICAgICAgaWYgKHZhID4gTUFYX0dBSU5fSU5UKSB2YSA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgIGF1eCA9IGludDE2X3QodmEpOworCiAjaWZkZWYgTFZNWAogICAgICAgICAgICAgaWYgKCB0cmFja3NDb25uZWN0ZWRDaGFuZ2VkIHx8IHN0YXRlQ2hhbmdlZCApCiAgICAgICAgICAgICB7CkBAIC0xNTQ3LDE4ICsxODEzLDMwIEBACiAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCBsZWZ0KTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsIHJpZ2h0KTsKKworICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKKworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgKHZvaWQgKilsZWZ0KTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICh2b2lkICopcmlnaHQpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICh2b2lkICopYXV4KTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCB0cmFjay0+Zm9ybWF0KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCB0cmFjay0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfQ09VTlQsICh2b2lkICopdHJhY2stPmNoYW5uZWxDb3VudCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgaW50KGNibGstPnNhbXBsZVJhdGUpKTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKShjYmxrLT5zYW1wbGVSYXRlKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzOwpAQCAtMTU3MiwxOSArMTg1MCwxOSBAQAogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRyYWNrcy4KICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLCB0cmFjay0+bmFtZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuCisgICAgICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfRElTQUJMRURfT047CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXhlclN0YXR1cyAhPSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5NCw2ICsxODcyLDEzIEBACiAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS0+aXRlbUF0KGkpOwogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGNoYWluLmdldCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFpbi0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bU5hbWUpOwpAQCAtMTYwMSw3MCArMTg4NiwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gbWl4IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaWYgYWxsIHRyYWNrcyBhcmUgY29ubmVjdGVkIHRvIGFuCisgICAgLy8gZWZmZWN0IGNoYWluIGFzIGluIHRoaXMgY2FzZSB0aGUgbWl4ZXIgd2lsbCBub3Qgd3JpdGUgdG8KKyAgICAvLyBtaXggYnVmZmVyIGFuZCB0cmFjayBlZmZlY3RzIHdpbGwgYWNjdW11bGF0ZSBpbnRvIGl0CisgICAgaWYgKG1peGVkVHJhY2tzICE9IDAgJiYgbWl4ZWRUcmFja3MgPT0gdHJhY2tzV2l0aEVmZmVjdCkgeworICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisKICAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tzKAotICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAotICAgICAgICBpbnQgc3RyZWFtVHlwZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aW52YWxpZGF0ZVRyYWNrcyhpbnQgc3RyZWFtVHlwZSkKIHsKLSAgICBMT0dWICgiTWl4ZXJUaHJlYWQ6OmdldFRyYWNrcygpIG1peGVyICVwLCBtVHJhY2tzLnNpemUgJWQsIG1BY3RpdmVUcmFja3Muc2l6ZSAlZCIsIHRoaXMsICBtVHJhY2tzLnNpemUoKSwgbUFjdGl2ZVRyYWNrcy5zaXplKCkpOworICAgIExPR1YgKCJNaXhlclRocmVhZDo6aW52YWxpZGF0ZVRyYWNrcygpIG1peGVyICVwLCBzdHJlYW1UeXBlICVkLCBtVHJhY2tzLnNpemUgJWQiLAorICAgICAgICAgICAgdGhpcywgIHN0cmVhbVR5cGUsIG1UcmFja3Muc2l6ZSgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgc2l6ZV90IHNpemUgPSBtVHJhY2tzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmICh0LT50eXBlKCkgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgdHJhY2tzLmFkZCh0KTsKLSAgICAgICAgICAgIGludCBqID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHQpOwotICAgICAgICAgICAgaWYgKGogPj0gMCkgewotICAgICAgICAgICAgICAgIHQgPSBtQWN0aXZlVHJhY2tzW2pdLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2tzW2ldKTsKLSAgICB9Ci0KLSAgICBzaXplID0gdHJhY2tzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBzcDxUcmFjaz4gdCA9IHRyYWNrc1tpXTsKLSAgICAgICAgbVRyYWNrcy5yZW1vdmUodCk7Ci0gICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHQtPm5hbWUoKSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnB1dFRyYWNrcygKLSAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8VHJhY2s+ID4mIHRyYWNrcywKLSAgICAgICAgU29ydGVkVmVjdG9yIDwgd3A8VHJhY2s+ID4mIGFjdGl2ZVRyYWNrcykKLXsKLSAgICBMT0dWICgiTWl4ZXJUaHJlYWQ6OnB1dFRyYWNrcygpIG1peGVyICVwLCB0cmFja3Muc2l6ZSAlZCwgYWN0aXZlVHJhY2tzLnNpemUgJWQiLCB0aGlzLCAgdHJhY2tzLnNpemUoKSwgYWN0aXZlVHJhY2tzLnNpemUoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzaXplX3Qgc2l6ZSA9IHRyYWNrcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplIDsgaSsrKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0ID0gdHJhY2tzW2ldOwotICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKCk7Ci0KLSAgICAgICAgaWYgKG5hbWUgPCAwKSByZXR1cm47Ci0KLSAgICAgICAgdC0+bU5hbWUgPSBuYW1lOwotICAgICAgICB0LT5tVGhyZWFkID0gdGhpczsKLSAgICAgICAgbVRyYWNrcy5hZGQodCk7Ci0KLSAgICAgICAgaW50IGogPSBhY3RpdmVUcmFja3MuaW5kZXhPZih0KTsKLSAgICAgICAgaWYgKGogPj0gMCkgewotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodCk7Ci0gICAgICAgICAgICAvLyBmb3JjZSBidWZmZXIgcmVmaWxsaW5nIGFuZCBubyByYW1wIHZvbHVtZSB3aGVuIHRoZSB0cmFjayBpcyBtaXhlZCBmb3IgdGhlIGZpcnN0IHRpbWUKLSAgICAgICAgICAgIHQtPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfRklMTElORzsKKyAgICAgICAgICAgIHQtPm1DYmxrLT5sb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHQtPm1DYmxrLT5mbGFncyB8PSBDQkxLX0lOVkFMSURfT047CisgICAgICAgICAgICB0LT5tQ2Jsay0+Y3Yuc2lnbmFsKCk7CisgICAgICAgICAgICB0LT5tQ2Jsay0+bG9jay51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIH0KIAorCiAvLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogaW50IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKCkKIHsKQEAgLTE3MTYsNiArMTk2NiwxNSBAQAogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgICAgIG1EZXZpY2UgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtRGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CkBAIC0xNzcxLDEzICsyMDMwLDE3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpCiB7Ci0gICAgcmV0dXJuICh1aW50MzJfdCkoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwOworICAgIHJldHVybiAodWludDMyX3QpKCgobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlKSAqIDEwMDApIC8gMjsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6c3VzcGVuZFNsZWVwVGltZVVzKCkKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkKSwKLSAgICBtTGVmdFZvbHVtZSAoMS4wKSwgbVJpZ2h0Vm9sdW1lKDEuMCkKK0F1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBpbnQgaWQsIHVpbnQzMl90IGRldmljZSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UpCiB7CiAgICAgbVR5cGUgPSBQbGF5YmFja1RocmVhZDo6RElSRUNUOwogfQpAQCAtMTc4Nyw2ICsyMDUwLDEwMiBAQAogfQogCiAKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bChpbnQxNl90IGluLCBpbnQxNl90IHYpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic211bGJiICVbb3V0XSwgJVtpbl0sICVbdl0gXG4iCisgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpCisgICAgICAgICA6ICk7CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgcmV0dXJuIGluICogaW50MzJfdCh2KTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjphcHBseVZvbHVtZSh1aW50MTZfdCBsZWZ0Vm9sLCB1aW50MTZfdCByaWdodFZvbCwgYm9vbCByYW1wKQoreworICAgIC8vIERvIG5vdCBhcHBseSB2b2x1bWUgb24gY29tcHJlc3NlZCBhdWRpbworICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHRvIHNpZ25lZCAxNiBiaXQgYmVmb3JlIHZvbHVtZSBjYWxjdWxhdGlvbgorICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKW1NaXhCdWZmZXIgKyBjb3VudC0xOworICAgICAgICBpbnQxNl90ICpkc3QgPSBtTWl4QnVmZmVyICsgY291bnQtMTsKKyAgICAgICAgd2hpbGUoY291bnQtLSkgeworICAgICAgICAgICAgKmRzdC0tID0gKGludDE2X3QpKCpzcmMtLV4weDgwKSA8PCA4OworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICBpbnQxNl90ICpvdXQgPSBtTWl4QnVmZmVyOworICAgIGlmIChyYW1wKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZCA9ICgoaW50MzJfdClsZWZ0Vm9sIC0gKGludDMyX3QpbUxlZnRWb2xTaG9ydCkgPDwgMTY7CisgICAgICAgICAgICBpbnQzMl90IHZsSW5jID0gZCAvIChpbnQzMl90KWZyYW1lQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gKChpbnQzMl90KW1MZWZ0Vm9sU2hvcnQgPDwgMTYpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgdmwgPj4gMTYpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3QgZCA9ICgoaW50MzJfdClsZWZ0Vm9sIC0gKGludDMyX3QpbUxlZnRWb2xTaG9ydCkgPDwgMTY7CisgICAgICAgICAgICBpbnQzMl90IHZsSW5jID0gZCAvIChpbnQzMl90KWZyYW1lQ291bnQ7CisgICAgICAgICAgICBkID0gKChpbnQzMl90KXJpZ2h0Vm9sIC0gKGludDMyX3QpbVJpZ2h0Vm9sU2hvcnQpIDw8IDE2OworICAgICAgICAgICAgaW50MzJfdCB2ckluYyA9IGQgLyAoaW50MzJfdClmcmFtZUNvdW50OworICAgICAgICAgICAgaW50MzJfdCB2bCA9ICgoaW50MzJfdCltTGVmdFZvbFNob3J0IDw8IDE2KTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSAoKGludDMyX3QpbVJpZ2h0Vm9sU2hvcnQgPDwgMTYpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgdmwgPj4gMTYpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBjbGFtcDE2KG11bChvdXRbMV0sIHZyID4+IDE2KSA+PiAxMik7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgbGVmdFZvbCkgPj4gMTIpOworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBjbGFtcDE2KG11bChvdXRbMF0sIGxlZnRWb2wpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBjbGFtcDE2KG11bChvdXRbMV0sIHJpZ2h0Vm9sKSA+PiAxMik7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY29udmVydCBiYWNrIHRvIHVuc2lnbmVkIDggYml0IGFmdGVyIHZvbHVtZSBjYWxjdWxhdGlvbgorICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICBpbnQxNl90ICpzcmMgPSBtTWl4QnVmZmVyOworICAgICAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW1NaXhCdWZmZXI7CisgICAgICAgIHdoaWxlKGNvdW50LS0pIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICh1aW50OF90KSgoKGludDMyX3QpKnNyYysrICsgKDE8PDcpKSA+PiA4KV4weDgwOworICAgICAgICB9CisgICAgfQorCisgICAgbUxlZnRWb2xTaG9ydCA9IGxlZnRWb2w7CisgICAgbVJpZ2h0Vm9sU2hvcnQgPSByaWdodFZvbDsKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6dGhyZWFkTG9vcCgpCiB7CiAgICAgdWludDMyX3QgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwpAQCAtMTgwMiw5ICsyMTYxLDEzIEBACiAgICAgLy8gaGFyZHdhcmUgcmVzb3VyY2VzIGFzIHNvb24gYXMgcG9zc2libGUKICAgICBuc2Vjc190IHN0YW5kYnlEZWxheSA9IG1pY3Jvc2Vjb25kcyhhY3RpdmVTbGVlcFRpbWUqMik7CiAKLQogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CisgICAgICAgIGJvb2wgcmFtcFZvbHVtZTsKKyAgICAgICAgdWludDE2X3QgbGVmdFZvbDsKKyAgICAgICAgdWludDE2X3QgcmlnaHRWb2w7CisgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOworCiAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKIAogICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CkBAIC0xODU2LDYgKzIyMTksOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKKwogICAgICAgICAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCiAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1swXS5wcm9tb3RlKCk7CkBAIC0xODY2LDExICsyMjMxLDI0IEBACiAKICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAotICAgICAgICAgICAgICAgIGlmIChjYmxrLT5mcmFtZXNSZWFkeSgpICYmICh0cmFjay0+aXNSZWFkeSgpIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSkgJiYKKyAgICAgICAgICAgICAgICBpZiAoY2Jsay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vTE9HVigidHJhY2sgJWQgdT0lMDh4LCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPnVzZXIsIGNibGstPnNlcnZlcik7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBtUmlnaHRWb2xGbG9hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbFNob3J0ID0gbVJpZ2h0Vm9sU2hvcnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1wVm9sdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5zZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRyYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZSB3YXMgbWl4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYXBwbHkgcmFtcAorICAgICAgICAgICAgICAgICAgICAgICAgcmFtcFZvbHVtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwgcmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNNdXRlZCgpIHx8IG1NYXN0ZXJNdXRlIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fApAQCAtMTg5MCwxNyArMjI2OCw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB2X2NsYW1wZWQvTUFYX0dBSU47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPSBtTGVmdFZvbHVtZSB8fCByaWdodCAhPSBtUmlnaHRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbUxlZnRWb2x1bWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG1SaWdodFZvbHVtZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPSBtTGVmdFZvbEZsb2F0IHx8IHJpZ2h0ICE9IG1SaWdodFZvbEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbEZsb2F0ID0gcmlnaHQ7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdWRpbyBIQUwgaW1wbGVtZW50cyB2b2x1bWUgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHNvZnR3YXJlIHZvbHVtZSB0byBub21pbmFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dC0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAxLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMS4wZjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gZmxvYXQgdG8gOC4yNAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmwgPSAodWludDMyX3QpKGxlZnQgKiAoMSA8PCAyNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdnIgPSAodWludDMyX3QpKHJpZ2h0ICogKDEgPDwgMjQpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBvbiBEaXJlY3RPdXRwdXRUaHJlYWQsIHNvIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBvbmUsIHRoZSB0cmFjayBpcyBjb25uZWN0ZWQgdG8gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWZmZWN0Q2hhaW5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByYW1wIHZvbHVtZSBpZiB2b2x1bWUgaXMgY29udHJvbGxlZCBieSBlZmZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlZmZlY3RDaGFpbnNbMF0tPnNldFZvbHVtZV9sKCZ2bCwgJnZyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1wVm9sdW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZXMgZnJvbSA4LjI0IHRvIDQuMTIgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2X2NsYW1wZWQgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZvbCA9ICh1aW50MTZfdCl2X2NsYW1wZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2X2NsYW1wZWQgPSAodnIgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRWb2wgPSAodWludDE2X3Qpdl9jbGFtcGVkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZvbCA9IG1MZWZ0Vm9sU2hvcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByaWdodFZvbCA9IG1SaWdodFZvbFNob3J0OworICAgICAgICAgICAgICAgICAgICAgICAgcmFtcFZvbHVtZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKQEAgLTE5MzIsMTEgKzIzMzUsMTggQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIHRyYWNrcyB0aGF0IG5lZWQgdG8gYmUuLi4KICAgICAgICAgICAgIGlmIChVTkxJS0VMWSh0cmFja1RvUmVtb3ZlICE9IDApKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2tUb1JlbW92ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFlZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGVmZmVjdENoYWluc1swXS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RvUmVtb3ZlLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh0cmFja1RvUmVtb3ZlLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZSh0cmFja1RvUmVtb3ZlKTsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2wodHJhY2tUb1JlbW92ZS0+bU5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgfQogCiAgICAgICAgIGlmIChMSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewpAQCAtMTk0NCw3ICsyMzU0LDcgQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBjdXJCdWYgPSAoaW50OF90ICopbU1peEJ1ZmZlcjsKICAgICAgICAgICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQotICAgICAgICAgICAgd2hpbGUoZnJhbWVDb3VudCkgeworICAgICAgICAgICAgd2hpbGUgKGZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZKGJ1ZmZlci5yYXcgPT0gMCkpIHsKQEAgLTE5NzIsMTAgKzIzODIsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgc2xlZXBUaW1lID0gc3VzcGVuZFNsZWVwVGltZVVzKCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gc2xlZXBUaW1lID09IDAgbWVhbnMgd2UgbXVzdCB3cml0ZSB0byBhdWRpbyBoYXJkd2FyZQogICAgICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICAgICAgICAgIGlmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBhcHBseVZvbHVtZShsZWZ0Vm9sLCByaWdodFZvbCwgcmFtcFZvbHVtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CisKICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgbUluV3JpdGUgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtaXhCdWZmZXJTaXplOwpAQCAtMTk4NSw2ICsyNDAzLDcgQEAKICAgICAgICAgICAgIG1JbldyaXRlID0gZmFsc2U7CiAgICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKICAgICAgICAgfQogCkBAIC0xOTkzLDYgKzI0MTIsMTAgQEAKICAgICAgICAgLy8gc2FtZSBsb2NrLgogICAgICAgICB0cmFja1RvUmVtb3ZlLmNsZWFyKCk7CiAgICAgICAgIGFjdGl2ZVRyYWNrLmNsZWFyKCk7CisKKyAgICAgICAgLy8gRWZmZWN0IGNoYWlucyB3aWxsIGJlIGFjdHVhbGx5IGRlbGV0ZWQgaGVyZSBpZiB0aGV5IHdlcmUgcmVtb3ZlZCBmcm9tCisgICAgICAgIC8vIG1FZmZlY3RDaGFpbnMgbGlzdCBkdXJpbmcgbWl4aW5nIG9yIGVmZmVjdHMgcHJvY2Vzc2luZworICAgICAgICBlZmZlY3RDaGFpbnMuY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7CkBAIC0yMDczLDE3ICsyNDk2LDI5IEBACiB7CiAgICAgdWludDMyX3QgdGltZTsKICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHRpbWUgPSAodWludDMyX3QpKChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUpICogMTAwMDsKKyAgICAgICAgdGltZSA9ICh1aW50MzJfdCkoKChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUpICogMTAwMCkgLyAyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRpbWUgPSAxMDAwMDsKICAgICB9CiAgICAgcmV0dXJuIHRpbWU7CiB9CiAKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzdXNwZW5kU2xlZXBUaW1lVXMoKQoreworICAgIHVpbnQzMl90IHRpbWU7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgeworICAgICAgICB0aW1lID0gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lID0gMTAwMDA7CisgICAgfQorICAgIHJldHVybiB0aW1lOworfQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6RHVwbGljYXRpbmdUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkKiBtYWluVGhyZWFkLCBpbnQgaWQpCi0gICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkKSwgbVdhaXRUaW1lTXMoVUlOVF9NQVgpCisgICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkLCBtYWluVGhyZWFkLT5kZXZpY2UoKSksIG1XYWl0VGltZU1zKFVJTlRfTUFYKQogewogICAgIG1UeXBlID0gUGxheWJhY2tUaHJlYWQ6OkRVUExJQ0FUSU5HOwogICAgIGFkZE91dHB1dFRyYWNrKG1haW5UaHJlYWQpOwpAQCAtMjA5OSw3ICsyNTM0LDYgQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wKCkKIHsKLSAgICBpbnQxNl90KiBjdXJCdWYgPSBtTWl4QnVmZmVyOwogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAgICAgdWludDMyX3QgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIG5zZWNzX3Qgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCk7CkBAIC0yMTA5LDYgKzI1NDMsNyBAQAogICAgIHVpbnQzMl90IGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgdWludDMyX3QgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogICAgIHVpbnQzMl90IHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCiAgICAgewpAQCAtMjE2OSwxNCArMjYwNCwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IHByZXBhcmVUcmFja3NfbChhY3RpdmVUcmFja3MsICZ0cmFja3NUb1JlbW92ZSk7CisKKyAgICAgICAgICAgIC8vIHByZXZlbnQgYW55IGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluIGxpc3QgYW5kIGluIGVhY2ggZWZmZWN0IGNoYWluCisgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCisgICAgICAgICAgICAvLyBvciBtb2RpZmllZCBpZiBhbiBlZmZlY3QgaXMgY3JlYXRlZCBvciBkZWxldGVkCisgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChMSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewogICAgICAgICAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KICAgICAgICAgICAgIGlmIChvdXRwdXRzUmVhZHkob3V0cHV0VHJhY2tzKSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKGN1ckJ1Zik7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGN1ckJ1ZiwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgICAgIHdyaXRlRnJhbWVzID0gbUZyYW1lQ291bnQ7CkBAIC0yMTkzLDYgKzI2MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhY2tzW2ldLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yMjAwLDE3ICsyNjQxLDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVN1c3BlbmRlZCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICB9CiAgICAgICAgIC8vIHNsZWVwVGltZSA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisgICAgICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKKwogICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBrU3RhbmRieVRpbWVJbk5zZWNzOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKGN1ckJ1Ziwgd3JpdGVGcmFtZXMpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobU1peEJ1ZmZlciwgd3JpdGVGcmFtZXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKICAgICAgICAgfQogCkBAIC0yMjE5LDYgKzI2NjgsMTAgQEAKICAgICAgICAgLy8gc2FtZSBsb2NrLgogICAgICAgICB0cmFja3NUb1JlbW92ZS5jbGVhcigpOwogICAgICAgICBvdXRwdXRUcmFja3MuY2xlYXIoKTsKKworICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpbGwgYmUgYWN0dWFsbHkgZGVsZXRlZCBoZXJlIGlmIHRoZXkgd2VyZSByZW1vdmVkIGZyb20KKyAgICAgICAgLy8gbUVmZmVjdENoYWlucyBsaXN0IGR1cmluZyBtaXhpbmcgb3IgZWZmZWN0cyBwcm9jZXNzaW5nCisgICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKQEAgLTIzMDMsNyArMjc1Niw4IEBACiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIpCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6ICAgUmVmQmFzZSgpLAogICAgICAgICBtVGhyZWFkKHRocmVhZCksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKQEAgLTIzMTIsNyArMjc2Niw4IEBACiAgICAgICAgIG1TdGF0ZShJRExFKSwKICAgICAgICAgbUNsaWVudFRpZCgtMSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUZsYWdzKGZsYWdzICYgflNZU1RFTV9GTEFHU19NQVNLKQorICAgICAgICBtRmxhZ3MoZmxhZ3MgJiB+U1lTVEVNX0ZMQUdTX01BU0spLAorICAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCkKIHsKICAgICBMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCkBAIC0yMzMyLDEzICsyNzg3LDEzIEBACiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKICAgICAgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIG1DYmxrLT5jaGFubmVscyA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwotICAgICAgICAgICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBidWZmZXIgKG90aGVyIGZsYWdzIGFyZSBjbGVhcmVkKQorICAgICAgICAgICAgICAgICAgICBtQ2Jsay0+ZmxhZ3MgPSBDQkxLX1VOREVSUlVOX09OOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMzU2LDEyICsyODExLDEyIEBACiAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCiAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMgPSAodWludDhfdCljaGFubmVsQ291bnQ7CisgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7CiAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgIC8vIEZvcmNlIHVuZGVycnVuIGNvbmRpdGlvbiB0byBhdm9pZCBmYWxzZSB1bmRlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCi0gICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gYnVmZmVyCi0gICAgICAgICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOworICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlciAob3RoZXIgZmxhZ3MgYXJlIGNsZWFyZWQpCisgICAgICAgICAgIG1DYmxrLT5mbGFncyA9IENCTEtfVU5ERVJSVU5fT047CiAgICAgICAgICAgIG1CdWZmZXJFbmQgPSAodWludDhfdCAqKW1CdWZmZXIgKyBidWZmZXJTaXplOwogICAgICAgIH0KICAgIH0KQEAgLTI0MjMsNyArMjg3OCw3IEBACiB9CiAKIGludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbENvdW50KCkgY29uc3QgewotICAgIHJldHVybiAoaW50KW1DYmxrLT5jaGFubmVsczsKKyAgICByZXR1cm4gKGludCltQ2Jsay0+Y2hhbm5lbENvdW50OwogfQogCiB2b2lkKiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Z2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdCB7CkBAIC0yNDM1LDkgKzI4OTAsOSBAQAogICAgIGlmIChidWZmZXJTdGFydCA8IG1CdWZmZXIgfHwgYnVmZmVyU3RhcnQgPiBidWZmZXJFbmQgfHwgYnVmZmVyRW5kID4gbUJ1ZmZlckVuZCB8fAogICAgICAgICAoKHVuc2lnbmVkIGxvbmcpYnVmZmVyU3RhcnQgJiAodW5zaWduZWQgbG9uZykoY2Jsay0+ZnJhbWVTaXplIC0gMSkpKSB7CiAgICAgICAgIExPR0UoIlRyYWNrQmFzZTo6Z2V0QnVmZmVyIGJ1ZmZlciBvdXQgb2YgcmFuZ2U6XG4gICAgc3RhcnQ6ICVwLCBlbmQgJXAgLCBtQnVmZmVyICVwIG1CdWZmZXJFbmQgJXBcbiAgICBcCi0gICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCwgY2hhbm5lbHMgJWQiLAorICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQsIGNoYW5uZWxDb3VudCAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyU3RhcnQsIGJ1ZmZlckVuZCwgbUJ1ZmZlciwgbUJ1ZmZlckVuZCwKLSAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlLCBjYmxrLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgY2Jsay0+c2VydmVyLCBjYmxrLT5zZXJ2ZXJCYXNlLCBjYmxrLT51c2VyLCBjYmxrLT51c2VyQmFzZSwgY2Jsay0+Y2hhbm5lbENvdW50KTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yNDU1LDE1ICsyOTEwLDE4IEBACiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlcikKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyKSwKLSAgICBtTXV0ZShmYWxzZSksIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwgbU5hbWUoLTEpCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAorICAgIG1NdXRlKGZhbHNlKSwgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLCBtTmFtZSgtMSksIG1NYWluQnVmZmVyKE5VTEwpLCBtQXV4QnVmZmVyKE5VTEwpLAorICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpCiB7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gYmFzZVRocmVhZCA9IHRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChiYXNlVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKWJhc2VUaHJlYWQuZ2V0KCk7CiAgICAgICAgICAgICBtTmFtZSA9IHBsYXliYWNrVGhyZWFkLT5nZXRUcmFja05hbWVfbCgpOworICAgICAgICAgICAgbU1haW5CdWZmZXIgPSBwbGF5YmFja1RocmVhZC0+bWl4QnVmZmVyKCk7CiAgICAgICAgIH0KICAgICAgICAgTE9HVigiVHJhY2sgY29uc3RydWN0b3IgbmFtZSAlZCwgY2FsbGluZyB0aHJlYWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgaWYgKG1OYW1lIDwgMCkgewpAQCAtMjUwNCw3ICsyOTYyLDkgQEAKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSkgewogICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0aHJlYWQtPmlkKCksIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0aHJlYWQtPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0aHJlYWQtPmlkKCkpOwogICAgICAgICAgICAgfQpAQCAtMjUxNywxMiArMjk3NywxMyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAlNWQgJTVkICUzdSAlM3UgJTN1ICUwNHUgJTFkICUxZCAlMWQgJTV1ICU1dSAlNXUgICUwOHggJTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwNWQgJTAzdSAlMDN1ICUwM3UgJTA1dSAgICUwNHUgJTFkICUxZCAlMWQgJTA1dSAlMDV1ICUwNXUgIDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKICAgICAgICAgICAgIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gTlVMTCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgbUNibGstPmNoYW5uZWxzLAorICAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1TdGF0ZSwKICAgICAgICAgICAgIG1NdXRlLApAQCAtMjUzMSw3ICsyOTkyLDkgQEAKICAgICAgICAgICAgIG1DYmxrLT52b2x1bWVbMF0sCiAgICAgICAgICAgICBtQ2Jsay0+dm9sdW1lWzFdLAogICAgICAgICAgICAgbUNibGstPnNlcnZlciwKLSAgICAgICAgICAgIG1DYmxrLT51c2VyKTsKKyAgICAgICAgICAgIG1DYmxrLT51c2VyLAorICAgICAgICAgICAgKGludCltTWFpbkJ1ZmZlciwKKyAgICAgICAgICAgIChpbnQpbUF1eEJ1ZmZlcik7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQpAQCAtMjU3NiwxMiArMzAzOSwxMiBAQAogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1JlYWR5KCkgY29uc3QgewotICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcpIHJldHVybiB0cnVlOworICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkpIHJldHVybiB0cnVlOwogCiAgICAgaWYgKG1DYmxrLT5mcmFtZXNSZWFkeSgpID49IG1DYmxrLT5mcmFtZUNvdW50IHx8Ci0gICAgICAgIG1DYmxrLT5mb3JjZVJlYWR5KSB7CisgICAgICAgICAgICAobUNibGstPmZsYWdzICYgQ0JMS19GT1JDRVJFQURZX01TSykpIHsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKLSAgICAgICAgbUNibGstPmZvcmNlUmVhZHkgPSAwOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRk9SQ0VSRUFEWV9NU0s7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNTkwLDcgKzMwNTMsOCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgdGhyZWFkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HVigic3RhcnQoJWQpLCBjYWxsaW5nIHRocmVhZCAlZCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC0yNjA3LDcgKzMwNzEsOSBAQAogCiAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpICYmIHN0YXRlICE9IEFDVElWRSAmJiBzdGF0ZSAhPSBSRVNVTUlORykgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0aHJlYWQtPmlkKCksIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRocmVhZC0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMjY0MCw3ICszMTA2LDkgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiAoc3RhdGUgPT0gQUNUSVZFIHx8IHN0YXRlID09IFJFU1VNSU5HKSkgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0aHJlYWQtPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLmxvY2soKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2NTcsNyArMzEyNSw5IEBACiAgICAgICAgICAgICBMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2OTYsOCArMzE2Niw4IEBACiAgICAgICAgIFRyYWNrQmFzZTo6cmVzZXQoKTsKICAgICAgICAgLy8gRm9yY2UgdW5kZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIHVuZGVycnVuIGNhbGxiYWNrIHVudGlsIGZpcnN0IGRhdGEgaXMKICAgICAgICAgLy8gd3JpdHRlbiB0byBidWZmZXIKLSAgICAgICAgbUNibGstPmZsb3dDb250cm9sRmxhZyA9IDE7Ci0gICAgICAgIG1DYmxrLT5mb3JjZVJlYWR5ID0gMDsKKyAgICAgICAgbUNibGstPmZsYWdzIHw9IENCTEtfVU5ERVJSVU5fT047CisgICAgICAgIG1DYmxrLT5mbGFncyAmPSB+Q0JMS19GT1JDRVJFQURZX01TSzsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7CiAgICAgICAgIG1SZXNldERvbmUgPSB0cnVlOwogICAgIH0KQEAgLTI3MTQsNiArMzE4NCwyMyBAQAogICAgIG1Wb2x1bWVbMV0gPSByaWdodDsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgIHN0YXR1cyA9IHBsYXliYWNrVGhyZWFkLT5hdHRhY2hBdXhFZmZlY3QodGhpcywgRWZmZWN0SWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpCit7CisgICAgbUF1eEVmZmVjdElkID0gRWZmZWN0SWQ7CisgICAgbUF1eEJ1ZmZlciA9IGJ1ZmZlcjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZApAQCAtMjcyNCw5ICszMjExLDEwIEBACiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgMCksCisgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAogICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCiB7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI4MDgsMTYgKzMyOTYsMTcgQEAKICAgICAgICAgVHJhY2tCYXNlOjpyZXNldCgpOwogICAgICAgICAvLyBGb3JjZSBvdmVyZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIG92ZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAvLyByZWFkIGZyb20gYnVmZmVyCi0gICAgICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTA1ZCAlMDN1ICUwM3UgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgJTAzdSAlMDVkICAgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMsCisgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsCkBAIC0yODM1LDE5ICszMzI0LDE5IEBACiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KQotICAgIDogICBUcmFjayh0aHJlYWQsIE5VTEwsIEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgTlVMTCksCisgICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBOVUxMLCAwKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CiAKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQudW5zYWZlX2dldCgpOwogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYmxrLT5vdXQgPSAxOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19ESVJFQ1RJT05fT1VUOwogICAgICAgICBtQ2Jsay0+YnVmZmVycyA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgICAgICBtQ2Jsay0+dm9sdW1lWzBdID0gbUNibGstPnZvbHVtZVsxXSA9IDB4MTAwMDsKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwotICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsIG1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNibGstPmNoYW5uZWxzICVkIG1CdWZmZXJFbmQgJXAiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLCBtQ2Jsay0+YnVmZmVycywgbUNibGstPmZyYW1lQ291bnQsIG1DYmxrLT5zYW1wbGVSYXRlLCBtQ2Jsay0+Y2hhbm5lbHMsIG1CdWZmZXJFbmQpOworICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsIG1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNibGstPmNoYW5uZWxDb3VudCAlZCBtQnVmZmVyRW5kICVwIiwKKyAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwgbUNibGstPmJ1ZmZlcnMsIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNibGstPmNoYW5uZWxDb3VudCwgbUJ1ZmZlckVuZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKICAgICB9CkBAIC0yODgyLDcgKzMzNzEsNyBAQAogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKLSAgICB1aW50MzJfdCBjaGFubmVscyA9IG1DYmxrLT5jaGFubmVsczsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtQ2Jsay0+Y2hhbm5lbENvdW50OwogICAgIGJvb2wgb3V0cHV0QnVmZmVyRnVsbCA9IGZhbHNlOwogICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CiAgICAgaW5CdWZmZXIuaTE2ID0gZGF0YTsKQEAgLTI4OTgsMTAgKzMzODcsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRGcmFtZXMgPSAobUNibGstPmZyYW1lQ291bnQgLSBmcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtzdGFydEZyYW1lcyAqIGNoYW5uZWxzXTsKKyAgICAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5tQnVmZmVyID0gbmV3IGludDE2X3Rbc3RhcnRGcmFtZXMgKiBjaGFubmVsQ291bnRdOwogICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBzdGFydEZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgc3RhcnRGcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgc3RhcnRGcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVyAoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIG5vIG1vcmUgYnVmZmVycyBpbiBxdWV1ZSIsIHRoaXMpOwpAQCAtMjkzOSwxMiArMzQyOCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3Qgb3V0RnJhbWVzID0gcEluQnVmZmVyLT5mcmFtZUNvdW50ID4gbU91dEJ1ZmZlci5mcmFtZUNvdW50ID8gbU91dEJ1ZmZlci5mcmFtZUNvdW50IDogcEluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIG1lbWNweShtT3V0QnVmZmVyLnJhdywgcEluQnVmZmVyLT5yYXcsIG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIG1DYmxrLT5zdGVwVXNlcihvdXRGcmFtZXMpOwogICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBwSW5CdWZmZXItPmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgcEluQnVmZmVyLT5pMTYgKz0gb3V0RnJhbWVzICogY2hhbm5lbENvdW50OwogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBtT3V0QnVmZmVyLmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgbU91dEJ1ZmZlci5pMTYgKz0gb3V0RnJhbWVzICogY2hhbm5lbENvdW50OwogCiAgICAgICAgIGlmIChwSW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKQEAgLTI5NjQsMTAgKzM0NTMsMTAgQEAKICAgICAgICAgaWYgKHRocmVhZCAhPSAwICYmICF0aHJlYWQtPnN0YW5kYnkoKSkgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkgPCBrTWF4T3ZlckZsb3dCdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyID0gbmV3IEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtpbkJ1ZmZlci5mcmFtZUNvdW50ICogY2hhbm5lbHNdOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2luQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOwogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IGluQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKICAgICAgICAgICAgICAgICBMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlZCIsIHRoaXMsIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTgzLDEwICszNDcyLDEwIEBACiAgICAgICAgIGlmIChtQ2Jsay0+dXNlciA8IG1DYmxrLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBmcmFtZXMgPSBtQ2Jsay0+ZnJhbWVDb3VudCAtIG1DYmxrLT51c2VyOwogICAgICAgICAgICAgcEluQnVmZmVyID0gbmV3IEJ1ZmZlcjsKLSAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2ZyYW1lcyAqIGNoYW5uZWxzXTsKKyAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2ZyYW1lcyAqIGNoYW5uZWxDb3VudF07CiAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXM7CiAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtc2V0KHBJbkJ1ZmZlci0+cmF3LCAwLCBmcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwogICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIHN0b3AoKTsKQEAgLTMwODYsNiArMzU3NSwyOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK0F1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksIG1QaWQocGlkKSwgbUNsaWVudChjbGllbnQpCit7Cit9CisKK0F1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkKK3sKKyAgICBtQ2xpZW50LmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3sKKyAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CisgICAgeworICAgICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVBpZCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKICAgICAgIG1UcmFjayh0cmFjaykKQEAgLTMxMjgsNiArMzYzOSwxMSBAQAogICAgIHJldHVybiBtVHJhY2stPmdldENibGsoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCkKK3sKKyAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoRWZmZWN0SWQpOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CkBAIC0zMTQ0LDYgKzM2NjAsNyBAQAogICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwpAQCAtMzE1Myw2ICszNjcwLDcgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIFJlY29yZFRocmVhZCAqdGhyZWFkOwogICAgIHNpemVfdCBpbkZyYW1lQ291bnQ7CisgICAgaW50IGxTZXNzaW9uSWQ7CiAKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCiAgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKQEAgLTMxNzcsOSArMzY5NSwxOCBAQAogICAgICAgICAgICAgbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQorICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrLiBUaGUgcmVjb3JkIHRyYWNrIHVzZXMgb25lIHRyYWNrIGluIG1IYXJkd2FyZU1peGVyVGhyZWFkIGJ5IGNvbnZlbnRpb24uCiAgICAgICAgIHJlY29yZFRyYWNrID0gbmV3IFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCBsU2Vzc2lvbklkKTsKICAgICB9CiAgICAgaWYgKHJlY29yZFRyYWNrLT5nZXRDYmxrKCkgPT0gTlVMTCkgewogICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWNvcmRUcmFjayBzbyB0aGF0IHRoZSBDbGllbnQKQEAgLTMyNDIsNyArMzc2OSw2IEBACiAgICAgbVJlcUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjaGFubmVscyk7CiAgICAgbVJlcVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKLSAgICBzZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CiB9CiAKIApAQCAtMzI3MCw2ICszNzk2LDggQEAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwogICAgIHNwPFJlY29yZFRyYWNrPiBhY3RpdmVUcmFjazsKIAorICAgIG5zZWNzX3QgbGFzdFdhcm5pbmcgPSAwOworCiAgICAgLy8gc3RhcnQgcmVjb3JkaW5nCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CiAKQEAgLTMzMzksNyArMzg2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzT3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCArPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgLT0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KW1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgZnJhbWVzSW4gKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzM2MCw3ICszODg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8IG1Gb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KW1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCB8fCBtRm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5yZWFkKGJ1ZmZlci5yYXcsIG1JbnB1dEJ5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzQxMSw4ICszOTM5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjbGllbnQgaXNuJ3QgcmV0cmlldmluZyBidWZmZXJzIGZhc3QgZW5vdWdoCiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkKLSAgICAgICAgICAgICAgICAgICAgTE9HVygiUmVjb3JkVGhyZWFkOiBidWZmZXIgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkgeworICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJSZWNvcmRUaHJlYWQ6IGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZvciBhIHdoaWxlIGJlZm9yZSBhc2tpbmcgZm9yIGEgbmV3IGJ1ZmZlci4KICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ2l2ZSB0aGUgYXBwbGljYXRpb24gbW9yZSBjaGFuY2UgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIgYW5kCiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJmbG93LgpAQCAtMzUxOCw3ICs0MDUxLDcgQEAKIAogICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewogICAgICAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgVHJhY2s6XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBCdWYgIFMgU1JhdGUgIFNlcnYgICAgIFVzZXJcbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICBDbGllbiBGbXQgQ2huIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIApAQCAtMzY1NywxNCArNDE5MCwxNCBAQAogICAgIHJldHVybiBtSW5wdXQtPmdldFBhcmFtZXRlcnMoa2V5cyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgIHZvaWQgKnBhcmFtMiA9IDA7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTM2NzYsNyArNDIwOSw2IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQXVkaW9GbGluZ2VyLT5tTG9jayk7CiAgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIApAQCAtMzY4OCw5ICs0MjIwLDEwIEBACiAgICAgbVJlc2FtcGxlciA9IDA7CiAKICAgICBtU2FtcGxlUmF0ZSA9IG1JbnB1dC0+c2FtcGxlUmF0ZSgpOwotICAgIG1DaGFubmVsQ291bnQgPSBBdWRpb1N5c3RlbTo6cG9wQ291bnQobUlucHV0LT5jaGFubmVscygpKTsKKyAgICBtQ2hhbm5lbHMgPSBtSW5wdXQtPmNoYW5uZWxzKCk7CisgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdClBdWRpb1N5c3RlbTo6cG9wQ291bnQobUNoYW5uZWxzKTsKICAgICBtRm9ybWF0ID0gbUlucHV0LT5mb3JtYXQoKTsKLSAgICBtRnJhbWVTaXplID0gbUlucHV0LT5mcmFtZVNpemUoKTsKKyAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KW1JbnB1dC0+ZnJhbWVTaXplKCk7CiAgICAgbUlucHV0Qnl0ZXMgPSBtSW5wdXQtPmJ1ZmZlclNpemUoKTsKICAgICBtRnJhbWVDb3VudCA9IG1JbnB1dEJ5dGVzIC8gbUZyYW1lU2l6ZTsKICAgICBtUnNtcEluQnVmZmVyID0gbmV3IGludDE2X3RbbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50XTsKQEAgLTM3NjcsMTQgKzQzMDAsMTUgQEAKIAogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgaWYgKG91dHB1dCAhPSAwKSB7CisgICAgICAgIGludCBpZCA9IG5leHRVbmlxdWVJZCgpOwogICAgICAgICBpZiAoKGZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkgfHwKICAgICAgICAgICAgIChmb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHx8CiAgICAgICAgICAgICAoY2hhbm5lbHMgIT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTykpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0LCArK21OZXh0VGhyZWFkSWQpOwotICAgICAgICAgICAgTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgbU5leHRUaHJlYWRJZCwgdGhyZWFkKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKKyAgICAgICAgICAgIExPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dCwgKyttTmV4dFRocmVhZElkKTsKLSAgICAgICAgICAgIExPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgbU5leHRUaHJlYWRJZCwgdGhyZWFkKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOworICAgICAgICAgICAgTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKIAogI2lmZGVmIExWTVgKICAgICAgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPQpAQCAtMzc4OCwxNCArNDMyMiwxNiBAQAogI2VuZGlmCiAKICAgICAgICAgfQotICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChtTmV4dFRocmVhZElkLCB0aHJlYWQpOworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKIAogICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CiAgICAgICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGNoYW5uZWxzOwogICAgICAgICBpZiAocExhdGVuY3lNcykgKnBMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKIAotICAgICAgICByZXR1cm4gbU5leHRUaHJlYWRJZDsKKyAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgICAgIHJldHVybiBpZDsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTM4MTIsMTEgKzQzNDgsMTMgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0KLSAgICBEdXBsaWNhdGluZ1RocmVhZCAqdGhyZWFkID0gbmV3IER1cGxpY2F0aW5nVGhyZWFkKHRoaXMsIHRocmVhZDEsICsrbU5leHRUaHJlYWRJZCk7CisgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgRHVwbGljYXRpbmdUaHJlYWQgKnRocmVhZCA9IG5ldyBEdXBsaWNhdGluZ1RocmVhZCh0aGlzLCB0aHJlYWQxLCBpZCk7CiAgICAgdGhyZWFkLT5hZGRPdXRwdXRUcmFjayh0aHJlYWQyKTsKLSAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChtTmV4dFRocmVhZElkLCB0aHJlYWQpOwotICAgIHJldHVybiBtTmV4dFRocmVhZElkOworICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOworICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCisgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgcmV0dXJuIGlkOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0KGludCBvdXRwdXQpCkBAIC0zOTM1LDE3ICs0NDczLDIwIEBACiAgICAgfQogCiAgICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICAgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCi0gICAgICAgIHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywgaW5wdXQsIHJlcVNhbXBsaW5nUmF0ZSwgcmVxQ2hhbm5lbHMsICsrbU5leHRUaHJlYWRJZCk7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZChtTmV4dFRocmVhZElkLCB0aHJlYWQpOwotICAgICAgICBMT0dWKCJvcGVuSW5wdXQoKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsIG1OZXh0VGhyZWFkSWQsIHRocmVhZCk7CisgICAgICAgIHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywgaW5wdXQsIHJlcVNhbXBsaW5nUmF0ZSwgcmVxQ2hhbm5lbHMsIGlkKTsKKyAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKGlkLCB0aHJlYWQpOworICAgICAgICBMT0dWKCJvcGVuSW5wdXQoKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwogICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSkgKnBTYW1wbGluZ1JhdGUgPSByZXFTYW1wbGluZ1JhdGU7CiAgICAgICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IHJlcUNoYW5uZWxzOwogCiAgICAgICAgIGlucHV0LT5zdGFuZGJ5KCk7CiAKLSAgICAgICAgcmV0dXJuIG1OZXh0VGhyZWFkSWQ7CisgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKKyAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzk4NSwyNiArNDUyNiwyNiBAQAogICAgIH0KIAogICAgIExPR1YoInNldFN0cmVhbU91dHB1dCgpIHN0cmVhbSAlZCB0byBvdXRwdXQgJWQiLCBzdHJlYW0sIG91dHB1dCk7CisgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRCwgb3V0cHV0LCAmc3RyZWFtKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOwogICAgICAgICBpZiAodGhyZWFkICE9IGRzdFRocmVhZCAmJgogICAgICAgICAgICAgdGhyZWFkLT50eXBlKCkgIT0gUGxheWJhY2tUaHJlYWQ6OkRJUkVDVCkgewogICAgICAgICAgICAgTWl4ZXJUaHJlYWQgKnNyY1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZDsKLSAgICAgICAgICAgIFNvcnRlZFZlY3RvciA8IHNwPE1peGVyVGhyZWFkOjpUcmFjaz4gPiB0cmFja3M7Ci0gICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxNaXhlclRocmVhZDo6VHJhY2s+ID4gYWN0aXZlVHJhY2tzOwotICAgICAgICAgICAgc3JjVGhyZWFkLT5nZXRUcmFja3ModHJhY2tzLCBhY3RpdmVUcmFja3MsIHN0cmVhbSk7Ci0gICAgICAgICAgICBpZiAodHJhY2tzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGRzdFRocmVhZC0+cHV0VHJhY2tzKHRyYWNrcywgYWN0aXZlVHJhY2tzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyY1RocmVhZC0+aW52YWxpZGF0ZVRyYWNrcyhzdHJlYW0pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZHN0VGhyZWFkLT5zZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRCwgc3RyZWFtKTsKLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorCitpbnQgQXVkaW9GbGluZ2VyOjpuZXdBdWRpb1Nlc3Npb25JZCgpCit7CisgICAgcmV0dXJuIG5leHRVbmlxdWVJZCgpOworfQorCiAvLyBjaGVja1BsYXliYWNrVGhyZWFkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqQXVkaW9GbGluZ2VyOjpjaGVja1BsYXliYWNrVGhyZWFkX2woaW50IG91dHB1dCkgY29uc3QKIHsKQEAgLTQwMzcsNiArNDU3OCwxODgyIEBACiAgICAgcmV0dXJuIHRocmVhZDsKIH0KIAoraW50IEF1ZGlvRmxpbmdlcjo6bmV4dFVuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVmZmVjdCBtYW5hZ2VtZW50CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKK3sKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIC8vIG9ubHkgYWxsb3cgbGlicmFyaWVzIGxvYWRlZCBmcm9tIC9zeXN0ZW0vbGliL3NvdW5kZnggZm9yIG5vdworICAgIGlmIChzdHJuY21wKGdFZmZlY3RMaWJQYXRoLCBsaWJQYXRoLCBzdHJsZW4oZ0VmZmVjdExpYlBhdGgpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBFZmZlY3RMb2FkTGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKK3sKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gRWZmZWN0VW5sb2FkTGlicmFyeShoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMobnVtRWZmZWN0cyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gRWZmZWN0UXVlcnlFZmZlY3QoaW5kZXgsIGRlc2NyaXB0b3IpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAqcFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gRWZmZWN0R2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7Cit9CisKKworLy8gdGhpcyBVVUlEIG11c3QgbWF0Y2ggdGhlIG9uZSBkZWZpbmVkIGluIG1lZGlhL2xpYmVmZmVjdHMvRWZmZWN0VmlzdWFsaXplci5jcHAKK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFZJU1VBTElaQVRJT05fVVVJRF8gPQorICAgIHsweGQwNjlkOWUwLCAweDgzMjksIDB4MTFkZiwgMHg5MTY4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworCitzcDxJRWZmZWN0PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdChwaWRfdCBwaWQsCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAorICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAorICAgICAgICBpbnQgKmlkLAorICAgICAgICBpbnQgKmVuYWJsZWQpCit7CisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IE5PX0VSUk9SOworICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOworICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBpdGZlOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICBzcDxDbGllbnQ+IGNsaWVudDsKKyAgICB3cDxDbGllbnQ+IHdjbGllbnQ7CisKKyAgICBMT0dWKCJjcmVhdGVFZmZlY3QgcGlkICVkLCBjbGllbnQgJXAsIHByaW9yaXR5ICVkLCBzZXNzaW9uSWQgJWQsIG91dHB1dCAlZCIsCisgICAgICAgICAgICBwaWQsIGVmZmVjdENsaWVudC5nZXQoKSwgcHJpb3JpdHksIHNlc3Npb25JZCwgb3V0cHV0KTsKKworICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBhdWRpbyBzZXR0aW5ncyBwZXJtaXNzaW9uIGZvciBnbG9iYWwgZWZmZWN0cworICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCAmJiAhc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gU2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgcmVzZXJ2ZWQgZm9yIG91dHB1dCBzdGFnZSBlZmZlY3RzCisgICAgLy8gdGhhdCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIChydW5uaW5nIGluIHNhbWUgcHJvY2VzcykKKyAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSAmJiBnZXRwaWQoKSAhPSBwaWQpIHsKKyAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgcmVjb3JkaW5nIHBlcm1pc3Npb24gZm9yIHZpc3VhbGl6ZXIKKyAgICBpZiAoKG1lbWNtcCgmcERlc2MtPnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDAgfHwKKyAgICAgICAgIG1lbWNtcCgmcERlc2MtPnV1aWQsICZWSVNVQUxJWkFUSU9OX1VVSURfLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgICFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgICAgICAgICAvLyBvdXRwdXQgbXVzdCBiZSBzcGVjaWZpZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyIHdoZW4gdXNpbmcgc2Vzc2lvbgorICAgICAgICAgICAgLy8gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFCisgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgb3V0cHV0IHJldHVybmVkIGJ5IGdldE91dHB1dEZvckVmZmVjdCgpIGlzIHJlbW92ZWQgYmVmb3JlIHdlIGxvY2sgdGhlCisgICAgICAgICAgICAvLyBtdXRleCBiZWxvdywgdGhlIGNhbGwgdG8gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCkgYmVsb3cgd2lsbCBkZXRlY3QgaXQKKyAgICAgICAgICAgIC8vIGFuZCB3ZSB3aWxsIGV4aXQgc2FmZWx5CisgICAgICAgICAgICBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworCisgICAgICAgIGlmICghRWZmZWN0SXNOdWxsVXVpZCgmcERlc2MtPnV1aWQpKSB7CisgICAgICAgICAgICAvLyBpZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvcgorICAgICAgICAgICAgbFN0YXR1cyA9IEVmZmVjdEdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdEdldERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW4gZWZmZWN0IGZhY3RvcnkKKyAgICAgICAgICAgIGlmIChFZmZlY3RJc051bGxVdWlkKCZwRGVzYy0+dHlwZSkpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3QoKSBubyBlZmZlY3QgdHlwZSIpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7CisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQ7CisgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgICAgIGxTdGF0dXMgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZkZXNjKTsKKyAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeUVmZmVjdCIsIGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCAmcERlc2MtPnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuIElmIHRoZSBzZXNzaW9uIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIDAgYW5kIHRoZSBlZmZlY3QgaXMgbm90IGF1eGlsaWFyeSwgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZQorICAgICAgICAgICAgICAgICAgICAvLyBhbiBhdXhpbGlhcnkgdmVyc2lvbiBvZiB0aGlzIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZCwgJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKKyAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgICAgICAgICAgKGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkZXNjLCAmZCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0cyBvbiBhIHNlc3Npb24gZGlmZmVyZW50IGZyb20gMCAob3V0cHV0IG1peCkKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYICYmCisgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICBsU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgICAgbWVtY3B5KHBEZXNjLCAmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgICAgICAvLyBJZiBvdXRwdXQgaXMgbm90IHNwZWNpZmllZCB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIGF1ZGlvIHNlc3Npb24gSUQgaW4gb25lIG9mIHRoZQorICAgICAgICAvLyBvdXRwdXQgdGhyZWFkcy4KKyAgICAgICAgLy8gSWYgb3V0cHV0IGlzIDAgaGVyZSwgc2Vzc2lvbklkIGlzIG5laXRoZXIgU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm9yIFNFU1NJT05fT1VUUFVUX01JWAorICAgICAgICAvLyBiZWNhdXNlIG9mIGNvZGUgY2hlY2tpbmcgb3V0cHV0IHdoZW4gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uLgorICAgICAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCisgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKKyAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gMCAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiY3JlYXRlRWZmZWN0KCkgZ290IG91dHB1dCAlZCBmb3IgZWZmZWN0ICVzIiwgb3V0cHV0LCBkZXNjLm5hbWUpOworICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CisgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiY3JlYXRlRWZmZWN0KCkgdW5rbm93biBvdXRwdXQgdGhyZWFkIik7CisgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogYWxsb3cgYXR0YWNobWVudCBvZiBlZmZlY3QgdG8gaW5wdXRzCisKKyAgICAgICAgd2NsaWVudCA9IG1DbGllbnRzLnZhbHVlRm9yKHBpZCk7CisKKyAgICAgICAgaWYgKHdjbGllbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xpZW50ID0gd2NsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCk7CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQocGlkLCBjbGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBvbiBzZWxlY3RlZCBvdXRwdXQgdHJoZWFkCisgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgJmRlc2MsIGVuYWJsZWQsICZsU3RhdHVzKTsKKyAgICAgICAgaWYgKGhhbmRsZSAhPSAwICYmIGlkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICppZCA9IGhhbmRsZS0+aWQoKTsKKyAgICAgICAgfQorICAgIH0KKworRXhpdDoKKyAgICBpZihzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpCit7CisgICAgTE9HVigibW92ZUVmZmVjdHMoKSBzZXNzaW9uICVkLCBzcmNPdXRwdXQgJWQsIGRzdE91dHB1dCAlZCIsCisgICAgICAgICAgICBzZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoc3JjT3V0cHV0ID09IGRzdE91dHB1dCkgeworICAgICAgICBMT0dXKCJtb3ZlRWZmZWN0cygpIHNhbWUgZHN0IGFuZCBzcmMgb3V0cHV0cyAlZCIsIGRzdE91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQgKnNyY1RocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzcmNPdXRwdXQpOworICAgIGlmIChzcmNUaHJlYWQgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJtb3ZlRWZmZWN0cygpIGJhZCBzcmNPdXRwdXQgJWQiLCBzcmNPdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKGRzdE91dHB1dCk7CisgICAgaWYgKGRzdFRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIm1vdmVFZmZlY3RzKCkgYmFkIGRzdE91dHB1dCAlZCIsIGRzdE91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChkc3RUaHJlYWQtPm1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNyY1RocmVhZC0+bUxvY2spOworICAgIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb24sIHNyY1RocmVhZCwgZHN0VGhyZWFkLCBmYWxzZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIG1vdmVFZmZlY3RDaGFpbl9sIG11c3RiZSBjYWxsZWQgd2l0aCBib3RoIHNyY1RocmVhZCBhbmQgZHN0VGhyZWFkIG1Mb2NrcyBoZWxkCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZVJlZ2lzdGVyKQoreworICAgIExPR1YoIm1vdmVFZmZlY3RDaGFpbl9sKCkgc2Vzc2lvbiAlZCBmcm9tIHRocmVhZCAlcCB0byB0aHJlYWQgJXAiLAorICAgICAgICAgICAgc2Vzc2lvbiwgc3JjVGhyZWFkLCBkc3RUaHJlYWQpOworCisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gc3JjVGhyZWFkLT5nZXRFZmZlY3RDaGFpbl9sKHNlc3Npb24pOworICAgIGlmIChjaGFpbiA9PSAwKSB7CisgICAgICAgIExPR1coIm1vdmVFZmZlY3RDaGFpbl9sKCkgZWZmZWN0IGNoYWluIGZvciBzZXNzaW9uICVkIG5vdCBvbiBzb3VyY2UgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uLCBzcmNUaHJlYWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGNoYWluIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBvbmx5IGlmIHJlY29uZmlndXJpbmcgZWZmZWN0IGNoYWluIG9uIHNhbWUgb3V0cHV0IHRocmVhZCwKKyAgICAvLyBzbyB0aGF0IGEgbmV3IGNoYWluIGlzIGNyZWF0ZWQgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMgd2hlbiBmaXJzdCBlZmZlY3QgaXMgYWRkZWQuIFRoaXMgaXMKKyAgICAvLyBvdGhlcndpc2UgdW5lY2Vzc2FyeSBhcyByZW1vdmVFZmZlY3RfbCgpIHdpbGwgcmVtb3ZlIHRoZSBjaGFpbiB3aGVuIGxhc3QgZWZmZWN0IGlzCisgICAgLy8gcmVtb3ZlZC4KKyAgICBzcmNUaHJlYWQtPnJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOworCisgICAgLy8gdHJhbnNmZXIgYWxsIGVmZmVjdHMgb25lIGJ5IG9uZSBzbyB0aGF0IG5ldyBlZmZlY3QgY2hhaW4gaXMgY3JlYXRlZCBvbiBuZXcgdGhyZWFkIHdpdGgKKyAgICAvLyBjb3JyZWN0IGJ1ZmZlciBzaXplcyBhbmQgYXVkaW8gcGFyYW1ldGVycyBhbmQgZWZmZWN0IGVuZ2luZXMgcmVjb25maWd1cmVkIGFjY29yZGluZ2x5CisgICAgaW50IGRzdE91dHB1dCA9IGRzdFRocmVhZC0+aWQoKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gZHN0Q2hhaW47CisgICAgdWludDMyX3Qgc3RyYXRlZ3k7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woMCk7CisgICAgd2hpbGUgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgIHNyY1RocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgZHN0VGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAvLyBpZiB0aGUgbW92ZSByZXF1ZXN0IGlzIG5vdCByZWNlaXZlZCBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLCB0aGUgZWZmZWN0IG11c3QgYmUKKyAgICAgICAgLy8gcmUtcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXcgc3RyYXRlZ3kgYW5kIG91dHB1dAorICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgeworICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmNoYWluKCkucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRzdENoYWluID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbm5vdCBnZXQgY2hhaW4gZnJvbSBlZmZlY3QgJXAiLCBlZmZlY3QuZ2V0KCkpOworICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gZHN0Q2hhaW4tPnN0cmF0ZWd5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlUmVnaXN0ZXIpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoJmVmZmVjdC0+ZGVzYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gUGxheWJhY2tUaHJlYWQ6OmNyZWF0ZUVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVFZmZlY3RfbCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgIGludCAqZW5hYmxlZCwKKyAgICAgICAgc3RhdHVzX3QgKnN0YXR1cworICAgICAgICApCit7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CisgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CisgICAgc3RhdHVzX3QgbFN0YXR1czsKKyAgICBzcDxUcmFjaz4gdHJhY2s7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworICAgIGJvb2wgY2hhaW5DcmVhdGVkID0gZmFsc2U7CisgICAgYm9vbCBlZmZlY3RDcmVhdGVkID0gZmFsc2U7CisgICAgYm9vbCBlZmZlY3RSZWdpc3RlcmVkID0gZmFsc2U7CisKKyAgICBpZiAobU91dHB1dCA9PSAwKSB7CisgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdF9sKCkgQXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgbFN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdCBvbiBzZXNzaW9uIG90aGVyIHRoYW4gMAorICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZICYmCisgICAgICAgIHNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBhdXhpbGlhcnkgZWZmZWN0ICVzIHRvIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIHNlc3Npb25JZCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgZWZmZWN0cyB3aXRoIHNlc3Npb24gSUQgMCBvbiBkaXJlY3Qgb3V0cHV0IG9yIGR1cGxpY2F0aW5nIHRocmVhZHMKKyAgICAvLyBUT0RPOiBhZGQgcnVsZSBmb3IgaHcgYWNjZWxlcmF0ZWQgZWZmZWN0cyBvbiBkaXJlY3Qgb3V0cHV0cyB3aXRoIG5vbiBQQ00gZm9ybWF0CisgICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYICYmIG1UeXBlICE9IE1JWEVSKSB7CisgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBhdXhpbGlhcnkgZWZmZWN0ICVzIHRvIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIHNlc3Npb25JZCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBMT0dWKCJjcmVhdGVFZmZlY3RfbCgpIHRocmVhZCAlcCBlZmZlY3QgJXMgb24gc2Vzc2lvbiAlZCIsIHRoaXMsIGRlc2MtPm5hbWUsIHNlc3Npb25JZCk7CisKKyAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIC8vIGNoZWNrIGZvciBleGlzdGluZyBlZmZlY3QgY2hhaW4gd2l0aCB0aGUgcmVxdWVzdGVkIGF1ZGlvIHNlc3Npb24KKyAgICAgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChjaGFpbiA9PSAwKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY2hhaW4gZm9yIHRoaXMgc2Vzc2lvbgorICAgICAgICAgICAgTE9HVigiY3JlYXRlRWZmZWN0X2woKSBuZXcgZWZmZWN0IGNoYWluIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGNoYWluID0gbmV3IEVmZmVjdENoYWluKHRoaXMsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBhZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgIGNoYWluLT5zZXRTdHJhdGVneShnZXRTdHJhdGVneUZvclNlc3Npb25fbChzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIGNoYWluQ3JlYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbURlc2NfbChkZXNjKTsKKyAgICAgICAgfQorCisgICAgICAgIExPR1YoImNyZWF0ZUVmZmVjdF9sKCkgZ290IGVmZmVjdCAlcCBvbiBjaGFpbiAlcCIsIGVmZmVjdCA9PSAwID8gMCA6IGVmZmVjdC5nZXQoKSwgY2hhaW4uZ2V0KCkpOworCisgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgeworICAgICAgICAgICAgaW50IGlkID0gbUF1ZGlvRmxpbmdlci0+bmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAvLyBDaGVjayBDUFUgYW5kIG1lbW9yeSB1c2FnZQorICAgICAgICAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdChkZXNjLCBtSWQsIGNoYWluLT5zdHJhdGVneSgpLCBzZXNzaW9uSWQsIGlkKTsKKyAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0UmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgZWZmZWN0IG1vZHVsZSBpZiBub25lIHByZXNlbnQgaW4gdGhlIGNoYWluCisgICAgICAgICAgICBlZmZlY3QgPSBuZXcgRWZmZWN0TW9kdWxlKHRoaXMsIGNoYWluLCBkZXNjLCBpZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBlZmZlY3QtPnN0YXR1cygpOworICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsU3RhdHVzID0gY2hhaW4tPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdENyZWF0ZWQgPSB0cnVlOworCisgICAgICAgICAgICBlZmZlY3QtPnNldERldmljZShtRGV2aWNlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2V0TW9kZShtQXVkaW9GbGluZ2VyLT5nZXRNb2RlKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3QgaGFuZGxlIGFuZCBjb25uZWN0IGl0IHRvIGVmZmVjdCBtb2R1bGUKKyAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSk7CisgICAgICAgIGxTdGF0dXMgPSBlZmZlY3QtPmFkZEhhbmRsZShoYW5kbGUpOworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgKmVuYWJsZWQgPSAoaW50KWVmZmVjdC0+aXNFbmFibGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKK0V4aXQ6CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAoZWZmZWN0Q3JlYXRlZCkgeworICAgICAgICAgICAgY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVmZmVjdFJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYWluQ3JlYXRlZCkgeworICAgICAgICAgICAgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYoc3RhdHVzKSB7CisgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCisvLyBQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kCisvLyBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0X2woY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KQoreworICAgIC8vIGNoZWNrIGZvciBleGlzdGluZyBlZmZlY3QgY2hhaW4gd2l0aCB0aGUgcmVxdWVzdGVkIGF1ZGlvIHNlc3Npb24KKyAgICBpbnQgc2Vzc2lvbklkID0gZWZmZWN0LT5zZXNzaW9uSWQoKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgYm9vbCBjaGFpbkNyZWF0ZWQgPSBmYWxzZTsKKworICAgIGlmIChjaGFpbiA9PSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjaGFpbiBmb3IgdGhpcyBzZXNzaW9uCisgICAgICAgIExPR1YoImFkZEVmZmVjdF9sKCkgbmV3IGVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CisgICAgICAgIGNoYWluID0gbmV3IEVmZmVjdENoYWluKHRoaXMsIHNlc3Npb25JZCk7CisgICAgICAgIGFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woc2Vzc2lvbklkKSk7CisgICAgICAgIGNoYWluQ3JlYXRlZCA9IHRydWU7CisgICAgfQorICAgIExPR1YoImFkZEVmZmVjdF9sKCkgJXAgY2hhaW4gJXAgZWZmZWN0ICVwIiwgdGhpcywgY2hhaW4uZ2V0KCksIGVmZmVjdC5nZXQoKSk7CisKKyAgICBpZiAoY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKGVmZmVjdC0+aWQoKSkgIT0gMCkgeworICAgICAgICBMT0dXKCJhZGRFZmZlY3RfbCgpICVwIGVmZmVjdCAlcyBhbHJlYWR5IHByZXNlbnQgaW4gY2hhaW4gJXAiLAorICAgICAgICAgICAgICAgIHRoaXMsIGVmZmVjdC0+ZGVzYygpLm5hbWUsIGNoYWluLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjaGFpbi0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChjaGFpbkNyZWF0ZWQpIHsKKyAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgZWZmZWN0LT5zZXREZXZpY2UobURldmljZSk7CisgICAgZWZmZWN0LT5zZXRNb2RlKG1BdWRpb0ZsaW5nZXItPmdldE1vZGUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkgeworCisgICAgTE9HVigicmVtb3ZlRWZmZWN0X2woKSAlcCBlZmZlY3QgJXAiLCB0aGlzLCBlZmZlY3QuZ2V0KCkpOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdC0+ZGVzYygpOworICAgIGlmICgoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgZGV0YWNoQXV4RWZmZWN0X2woZWZmZWN0LT5pZCgpKTsKKyAgICB9CisKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBlZmZlY3QtPmNoYWluKCkucHJvbW90ZSgpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIC8vIHJlbW92ZSBlZmZlY3QgY2hhaW4gaWYgcmVtb3ZpbmcgbGFzdCBlZmZlY3QKKyAgICAgICAgaWYgKGNoYWluLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpID09IDApIHsKKyAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygicmVtb3ZlRWZmZWN0X2woKSAlcCBjYW5ub3QgcHJvbW90ZSBjaGFpbiBmb3IgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBMT0dWKCJkaXNjb25uZWN0RWZmZWN0KCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKKyAgICAvLyBkZWxldGUgdGhlIGVmZmVjdCBtb2R1bGUgaWYgcmVtb3ZpbmcgbGFzdCBoYW5kbGUgb24gaXQKKyAgICBpZiAoZWZmZWN0LT5yZW1vdmVIYW5kbGUoaGFuZGxlKSA9PSAwKSB7CisgICAgICAgIHJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgaW50IHNlc3Npb24gPSBjaGFpbi0+c2Vzc2lvbklkKCk7CisgICAgaW50MTZfdCAqYnVmZmVyID0gbU1peEJ1ZmZlcjsKKyAgICBib29sIG93bnNCdWZmZXIgPSBmYWxzZTsKKworICAgIExPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAgZm9yIHNlc3Npb24gJWQiLCBjaGFpbi5nZXQoKSwgdGhpcywgc2Vzc2lvbik7CisgICAgaWYgKHNlc3Npb24gPiAwKSB7CisgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcworICAgICAgICAvLyB0aGUgbWl4IGJ1ZmZlciBhcyBpbnB1dAorICAgICAgICBpZiAobVR5cGUgIT0gRElSRUNUKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBpbnQxNl90W251bVNhbXBsZXNdOworICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgY3JlYXRpbmcgbmV3IGlucHV0IGJ1ZmZlciAlcCBzZXNzaW9uICVkIiwgYnVmZmVyLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIG93bnNCdWZmZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXR0YWNoIGFsbCB0cmFja3Mgd2l0aCBzYW1lIHNlc3Npb24gSUQgdG8gdGhpcyBjaGFpbi4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIHRyYWNrLT5zZXRNYWluQnVmZmVyIHRyYWNrICVwIGJ1ZmZlciAlcCIsIHRyYWNrLmdldCgpLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbmRpY2F0ZSBhbGwgYWN0aXZlIHRyYWNrcyBpbiB0aGUgY2hhaW4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCkgOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGFjdGl2YXRpbmcgdHJhY2sgJXAgb24gc2Vzc2lvbiAlZCIsIHRyYWNrLmdldCgpLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+c3RhcnRUcmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2hhaW4tPnNldEluQnVmZmVyKGJ1ZmZlciwgb3duc0J1ZmZlcik7CisgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFIGlzIGluc2VydGVkIGF0IGVuZCBvZiBlZmZlY3QKKyAgICAvLyBjaGFpbnMgbGlzdCBpbiBvcmRlciB0byBiZSBwcm9jZXNzZWQgbGFzdCBhcyBpdCBjb250YWlucyBvdXRwdXQgc3RhZ2UgZWZmZWN0cworICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQorICAgIC8vIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFIHRvIGJlIHByb2Nlc3NlZAorICAgIC8vIGFmdGVyIHRyYWNrIHNwZWNpZmljIGVmZmVjdHMgYW5kIGJlZm9yZSBvdXRwdXQgc3RhZ2UKKyAgICAvLyBJdCBpcyB0aGVyZWZvcmUgbWFuZGF0b3J5IHRoYXQgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCA9PSAwIGFuZAorICAgIC8vIHRoYXQgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFIDwgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWAorICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igb3RoZXIgc2Vzc2lvbnMgYXJlIGluc2VydGVkIGF0IGJlZ2lubmluZyBvZiBlZmZlY3QKKyAgICAvLyBjaGFpbnMgbGlzdCB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIG91dHB1dCBtaXggZWZmZWN0cy4gUmVsYXRpdmUgb3JkZXIgYmV0d2VlbiBvdGhlcgorICAgIC8vIHNlc3Npb25zIGlzIG5vdCBpbXBvcnRhbnQKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChtRWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSA8IHNlc3Npb24pIGJyZWFrOworICAgIH0KKyAgICBtRWZmZWN0Q2hhaW5zLmluc2VydEF0KGNoYWluLCBpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKK3sKKyAgICBpbnQgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKKworICAgIExPR1YoInJlbW92ZUVmZmVjdENoYWluX2woKSAlcCBmcm9tIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoY2hhaW4gPT0gbUVmZmVjdENoYWluc1tpXSkgeworICAgICAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIGRldGFjaCBhbGwgdHJhY2tzIHdpdGggc2FtZSBzZXNzaW9uIElEIGZyb20gdGhpcyBjaGFpbgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIobU1peEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1FZmZlY3RDaGFpbnMuc2l6ZSgpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmxvY2tFZmZlY3RDaGFpbnNfbCgKKyAgICAgICAgVmVjdG9yPHNwIDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpCit7CisgICAgZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+bG9jaygpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp1bmxvY2tFZmZlY3RDaGFpbnMoCisgICAgICAgIFZlY3RvcjxzcCA8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdENoYWluc1tpXS0+dW5sb2NrKCk7CisgICAgfQorfQorCisKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRFZmZlY3RfbChpbnQgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpCit7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CisKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKGVmZmVjdElkKTsKKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdDsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXR0YWNoQXV4RWZmZWN0KAorICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4gdHJhY2ssIGludCBFZmZlY3RJZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBhdHRhY2hBdXhFZmZlY3RfbCh0cmFjaywgRWZmZWN0SWQpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdHRhY2hBdXhFZmZlY3RfbCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLCBpbnQgRWZmZWN0SWQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBpZiAoRWZmZWN0SWQgPT0gMCkgeworICAgICAgICB0cmFjay0+c2V0QXV4QnVmZmVyKDAsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEF1eGlsaWFyeSBlZmZlY3RzIGFyZSBhbHdheXMgaW4gYXVkaW8gc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZ2V0RWZmZWN0X2woQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpOworICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoZWZmZWN0LT5kZXNjKCkuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPnNldEF1eEJ1ZmZlcihFZmZlY3RJZCwgKGludDMyX3QgKillZmZlY3QtPmluQnVmZmVyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkKK3sKKyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgIGlmICh0cmFjay0+YXV4RWZmZWN0SWQoKSA9PSBlZmZlY3RJZCkgeworICAgICAgICAgICAgYXR0YWNoQXV4RWZmZWN0X2wodHJhY2ssIDApOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRWZmZWN0TW9kdWxlIGltcGxlbWVudGF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlIgorCitBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6RWZmZWN0TW9kdWxlKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+JiBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQorICAgIDogbVRocmVhZCh3VGhyZWFkKSwgbUNoYWluKGNoYWluKSwgbUlkKGlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtRWZmZWN0SW50ZXJmYWNlKE5VTEwpLAorICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpCit7CisgICAgTE9HVigiQ29uc3RydWN0b3IgJXAiLCB0aGlzKTsKKyAgICBpbnQgbFN0YXR1czsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQbGF5YmFja1RocmVhZCAqcCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKworICAgIG1lbWNweSgmbURlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICAvLyBjcmVhdGUgZWZmZWN0IGVuZ2luZSBmcm9tIGVmZmVjdCBmYWN0b3J5CisgICAgbVN0YXR1cyA9IEVmZmVjdENyZWF0ZSgmZGVzYy0+dXVpZCwgc2Vzc2lvbklkLCBwLT5pZCgpLCAmbUVmZmVjdEludGVyZmFjZSk7CisKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxTdGF0dXMgPSBpbml0KCk7CisgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgIG1TdGF0dXMgPSBsU3RhdHVzOworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIExPR1YoIkNvbnN0cnVjdG9yIHN1Y2Nlc3MgbmFtZSAlcywgSW50ZXJmYWNlICVwIiwgbURlc2NyaXB0b3IubmFtZSwgbUVmZmVjdEludGVyZmFjZSk7CisgICAgcmV0dXJuOworRXJyb3I6CisgICAgRWZmZWN0UmVsZWFzZShtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICBtRWZmZWN0SW50ZXJmYWNlID0gTlVMTDsKKyAgICBMT0dWKCJDb25zdHJ1Y3RvciBFcnJvciAlZCIsIG1TdGF0dXMpOworfQorCitBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6fkVmZmVjdE1vZHVsZSgpCit7CisgICAgTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gcmVsZWFzZSBlZmZlY3QgZW5naW5lCisgICAgICAgIEVmZmVjdFJlbGVhc2UobUVmZmVjdEludGVyZmFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6YWRkSGFuZGxlKHNwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIEZpcnN0IGhhbmRsZSBpbiBtSGFuZGxlcyBoYXMgaGlnaGVzdCBwcmlvcml0eSBhbmQgY29udHJvbHMgdGhlIGVmZmVjdCBtb2R1bGUKKyAgICBpbnQgcHJpb3JpdHkgPSBoYW5kbGUtPnByaW9yaXR5KCk7CisgICAgc2l6ZV90IHNpemUgPSBtSGFuZGxlcy5zaXplKCk7CisgICAgc3A8RWZmZWN0SGFuZGxlPiBoOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaCA9IG1IYW5kbGVzW2ldLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGggPT0gMCkgY29udGludWU7CisgICAgICAgIGlmIChoLT5wcmlvcml0eSgpIDw9IHByaW9yaXR5KSBicmVhazsKKyAgICB9CisgICAgLy8gaWYgaW5zZXJ0ZWQgaW4gZmlyc3QgcGxhY2UsIG1vdmUgZWZmZWN0IGNvbnRyb2wgZnJvbSBwcmV2aW91cyBvd25lciB0byB0aGlzIGhhbmRsZQorICAgIGlmIChpID09IDApIHsKKyAgICAgICAgaWYgKGggIT0gMCkgeworICAgICAgICAgICAgaC0+c2V0Q29udHJvbChmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5zZXRDb250cm9sKHRydWUsIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIG1IYW5kbGVzLmluc2VydEF0KGhhbmRsZSwgaSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVIYW5kbGUoY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IHNpemUgPSBtSGFuZGxlcy5zaXplKCk7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAobUhhbmRsZXNbaV0gPT0gaGFuZGxlKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gc2l6ZSkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisgICAgbUhhbmRsZXMucmVtb3ZlQXQoaSk7CisgICAgc2l6ZSA9IG1IYW5kbGVzLnNpemUoKTsKKyAgICAvLyBpZiByZW1vdmVkIGZyb20gZmlyc3QgcGxhY2UsIG1vdmUgZWZmZWN0IGNvbnRyb2wgZnJvbSB0aGlzIGhhbmRsZSB0byBuZXh0IGluIGxpbmUKKyAgICBpZiAoaSA9PSAwICYmIHNpemUgIT0gMCkgeworICAgICAgICBzcDxFZmZlY3RIYW5kbGU+IGggPSBtSGFuZGxlc1swXS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChoICE9IDApIHsKKyAgICAgICAgICAgIGgtPnNldENvbnRyb2wodHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWxlYXNlIGVmZmVjdCBlbmdpbmUgaGVyZSBzbyB0aGF0IGl0IGlzIGRvbmUgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlbGVhc2VkCisgICAgLy8gYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4KKyAgICAvLyBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZCBvbiB0aGlzIGVmZmVjdC4KKyAgICBpZiAoc2l6ZSA9PSAwICYmIG1FZmZlY3RJbnRlcmZhY2UgIT0gTlVMTCkgeworICAgICAgICAvLyByZWxlYXNlIGVmZmVjdCBlbmdpbmUKKyAgICAgICAgRWZmZWN0UmVsZWFzZShtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICAgICAgbUVmZmVjdEludGVyZmFjZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRpc2Nvbm5lY3QoY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKQoreworICAgIC8vIGtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoaXMgRWZmZWN0TW9kdWxlIHRvIGF2b2lkIGNhbGxpbmcgdGhlCisgICAgLy8gZGVzdHJ1Y3RvciBiZWZvcmUgd2UgZXhpdAorICAgIHNwPEVmZmVjdE1vZHVsZT4ga2VlcCh0aGlzKTsKKyAgICB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0KGtlZXAsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnVwZGF0ZVN0YXRlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgUkVTVEFSVDoKKyAgICAgICAgcmVzZXRfbCgpOworICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RBUlRJTkc6CisgICAgICAgIC8vIGNsZWFyIGF1eGlsaWFyeSBlZmZlY3QgaW5wdXQgYnVmZmVyIGZvciBuZXh0IGFjY3VtdWxhdGlvbgorICAgICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgeworICAgICAgICAgICAgbWVtc2V0KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQqc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydF9sKCk7CisgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUElORzoKKyAgICAgICAgc3RvcF9sKCk7CisgICAgICAgIG1EaXNhYmxlV2FpdENudCA9IG1NYXhEaXNhYmxlV2FpdENudDsKKyAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAvLyBtRGlzYWJsZVdhaXRDbnQgaXMgZm9yY2VkIHRvIDEgYnkgcHJvY2VzcygpIHdoZW4gdGhlIGVuZ2luZSBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgLy8gdHVybiBvZmYgc2VxdWVuY2UuCisgICAgICAgIGlmICgtLW1EaXNhYmxlV2FpdENudCA9PSAwKSB7CisgICAgICAgICAgICByZXNldF9sKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8vSURMRSAsIEFDVElWRQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnByb2Nlc3MoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIGRvIDMyIGJpdCB0byAxNiBiaXQgY29udmVyc2lvbiBmb3IgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIKKyAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmRpdGhlckFuZENsYW1wKG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudC8yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQorICAgICAgICBpbnQgcmV0ID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+cHJvY2VzcyhtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZy5pbnB1dENmZy5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLm91dHB1dENmZy5idWZmZXIpOworCisgICAgICAgIC8vIGZvcmNlIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZSB3aGVuIGVuZ2luZSBpcyByZWFkeQorICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQRUQgJiYgcmV0ID09IC1FTk9EQVRBKSB7CisgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCisgICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCAwLCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KnNpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgJiYKKyAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyl7CisgICAgICAgIC8vIElmIGFuIGluc2VydCBlZmZlY3QgaXMgaWRsZSBhbmQgaW5wdXQgYnVmZmVyIGlzIGRpZmZlcmVudCBmcm9tIG91dHB1dCBidWZmZXIsIGNvcHkgaW5wdXQgdG8KKyAgICAgICAgLy8gb3V0cHV0CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja3MoKSAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTykgeworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsIHNpemUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZXNldF9sKCkKK3sKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLCBFRkZFQ1RfQ01EX1JFU0VULCAwLCBOVUxMLCAwLCBOVUxMKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbmZpZ3VyZSgpCit7CisgICAgdWludDMyX3QgY2hhbm5lbHM7CisgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKKyAgICBpZiAodGhyZWFkLT5jaGFubmVsQ291bnQoKSA9PSAxKSB7CisgICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgfQorCisgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgfQorICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CisgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIC8vIEluc2VydCBlZmZlY3Q6CisgICAgLy8gLSBpbiBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggb3IgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgIC8vIGFsd2F5cyBvdmVyd3JpdGVzIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciA9PSBvdXRwdXQgYnVmZmVyCisgICAgLy8gLSBpbiBvdGhlciBzZXNzaW9uczoKKyAgICAvLyAgICAgIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiBhY2N1bXVsYXRlcyBpbiBvdXRwdXQgYnVmZmVyOiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgorICAgIC8vICAgICAgb3RoZXIgZWZmZWN0OiBvdmVyd3JpdGVzIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciA9PSBvdXRwdXQgYnVmZmVyCisgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdDoKKyAgICAvLyAgICAgIGFjY3VtdWxhdGVzIGluIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciAhPSBvdXRwdXQgYnVmZmVyCisgICAgLy8gVGhlcmVmb3JlOiBhY2N1bXVsYXRlIDw9PiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgorICAgIGlmIChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgeworICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgfQorICAgIG1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIG1Db25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50OworCisgICAgTE9HVigiY29uZmlndXJlKCkgJXAgdGhyZWFkICVwIGJ1ZmZlciAlcCBmcmFtZWNvdW50ICVkIiwKKyAgICAgICAgICAgIHRoaXMsIHRocmVhZC5nZXQoKSwgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKworICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKGludCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9DT05GSUdVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgIH0KKworICAgIG1NYXhEaXNhYmxlV2FpdENudCA9IChNQVhfRElTQUJMRV9USU1FX01TICogbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSAvCisgICAgICAgICAgICAoMTAwMCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppbml0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN0YXJ0X2woKQoreworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c3RvcF9sKCkKK3sKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCBjbWRTdGF0dXM7CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9ESVNBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworLy8gICAgTE9HVigiY29tbWFuZCgpLCBjbWRDb2RlOiAlZCwgbUVmZmVjdEludGVyZmFjZTogJXAiLCBjbWRDb2RlLCBtRWZmZWN0SW50ZXJmYWNlKTsKKworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhKTsKKyAgICBpZiAoY21kQ29kZSAhPSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJiBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IChyZXBseVNpemUgPT0gTlVMTCkgPyAwIDogKnJlcGx5U2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBoID0gbUhhbmRsZXNbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGggIT0gMCkgeworICAgICAgICAgICAgICAgIGgtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgc2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgTE9HVigic2V0RW5hYmxlZCAlcCBlbmFibGVkICVkIiwgdGhpcywgZW5hYmxlZCk7CisKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICAvLyBnb2luZyBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgbVN0YXRlID0gUkVTVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1BQSU5HOgorICAgICAgICAgICAgbVN0YXRlID0gQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZ29pbmcgZnJvbSBlbmFibGVkIHRvIGRpc2FibGVkCisgICAgICAgIGNhc2UgUkVTVEFSVDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzoKKyAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaCA9IG1IYW5kbGVzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChoICE9IDApIHsKKyAgICAgICAgICAgICAgICBoLT5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNFbmFibGVkKCkKK3sKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgUkVTVEFSVDoKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgIGNhc2UgQUNUSVZFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIElETEU6CisgICAgY2FzZSBTVE9QUElORzoKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNQcm9jZXNzRW5hYmxlZCgpCit7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFJFU1RBUlQ6CisgICAgY2FzZSBBQ1RJVkU6CisgICAgY2FzZSBTVE9QUElORzoKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgSURMRToKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRWb2x1bWUodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBjb250cm9sbGVyKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICAvLyBTZW5kIHZvbHVtZSBpbmRpY2F0aW9uIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgaXMgc2V0IGFuZCByZWFkIGJhY2sgYWx0ZXJlZCB2b2x1bWUKKyAgICAvLyBpZiBjb250cm9sbGVyIGZsYWcgaXMgc2V0IChOb3RlIHRoYXQgY29udHJvbGxlciA9PSBUUlVFID0+IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHNldCkKKyAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpICYmCisgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHx8CisgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCkpIHsKKyAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOworICAgICAgICB1aW50MzJfdCB2b2x1bWVbMl07CisgICAgICAgIHVpbnQzMl90ICpwVm9sdW1lID0gTlVMTDsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZih2b2x1bWUpOworICAgICAgICB2b2x1bWVbMF0gPSAqbGVmdDsKKyAgICAgICAgdm9sdW1lWzFdID0gKnJpZ2h0OworICAgICAgICBpZiAoY29udHJvbGxlcikgeworICAgICAgICAgICAgcFZvbHVtZSA9IHZvbHVtZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWb2x1bWUpOworICAgICAgICBpZiAoY29udHJvbGxlciAmJiBzdGF0dXMgPT0gTk9fRVJST1IgJiYgc2l6ZSA9PSBzaXplb2Yodm9sdW1lKSkgeworICAgICAgICAgICAgKmxlZnQgPSB2b2x1bWVbMF07CisgICAgICAgICAgICAqcmlnaHQgPSB2b2x1bWVbMV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldERldmljZSh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKKyAgICAgICAgLy8gY29udmVydCBkZXZpY2UgYml0IGZpZWxkIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KKyAgICAgICAgZGV2aWNlID0gZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShkZXZpY2UpOworICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOworICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICAgICAgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0TW9kZSh1aW50MzJfdCBtb2RlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQpIHsKKyAgICAgICAgLy8gY29udmVydCBhdWRpbyBtb2RlIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KKyAgICAgICAgaW50IGVmZmVjdE1vZGUgPSBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShtb2RlKTsKKyAgICAgICAgaWYgKGVmZmVjdE1vZGUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CisgICAgICAgIHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZmZlY3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gdXBkYXRlIHRoaXMgdGFibGUgd2hlbiBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBvciBhdWRpb19kZXZpY2VfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAorY29uc3QgdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNEZXZpY2VDb252VGFibGVbXSA9IHsKKyAgICBERVZJQ0VfRUFSUElFQ0UsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0VBUlBJRUNFCisgICAgREVWSUNFX1NQRUFLRVIsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVIKKyAgICBERVZJQ0VfV0lSRURfSEVBRFNFVCwgLy8gY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEU0VUCisgICAgREVWSUNFX1dJUkVEX0hFQURQSE9ORSwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FCisgICAgREVWSUNFX0JMVUVUT09USF9TQ08sIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08KKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VULCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQKKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQsIC8vICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVAorICAgIERFVklDRV9CTFVFVE9PVEhfQTJEUCwgLy8gIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMKKyAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUgorICAgIERFVklDRV9BVVhfRElHSVRBTCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BVVhfRElHSVRBTAorfTsKKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKQoreworICAgIHVpbnQzMl90IGRldmljZU91dCA9IDA7CisgICAgd2hpbGUgKGRldmljZSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGRldmljZSk7CisgICAgICAgIGRldmljZSAmPSB+KDEgPDwgaSk7CisgICAgICAgIGlmIChpID49IHNpemVvZihzRGV2aWNlQ29udlRhYmxlKS9zaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBMT0dFKCJkZXZpY2UgY29udmVydGlvbiBlcnJvciBmb3IgQXVkaW9TeXN0ZW0gZGV2aWNlIDB4JTA4eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2VPdXQgfD0gKHVpbnQzMl90KXNEZXZpY2VDb252VGFibGVbaV07CisgICAgfQorICAgIHJldHVybiBkZXZpY2VPdXQ7Cit9CisKKy8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUgb3IgYXVkaW9fbW9kZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCitjb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c01vZGVDb252VGFibGVbXSA9IHsKKyAgICBBVURJT19NT0RFX05PUk1BTCwgICAvLyBBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwKKyAgICBBVURJT19NT0RFX1JJTkdUT05FLCAvLyBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORQorICAgIEFVRElPX01PREVfSU5fQ0FMTCAgIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwKK307CisKK2ludCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6bW9kZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgbW9kZSkKK3sKKyAgICBpbnQgbW9kZU91dCA9IC0xOworICAgIGlmIChtb2RlIDwgc2l6ZW9mKHNNb2RlQ29udlRhYmxlKSAvIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgbW9kZU91dCA9IChpbnQpc01vZGVDb252VGFibGVbbW9kZV07CisgICAgfQorICAgIHJldHVybiBtb2RlT3V0OworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdEVmZmVjdCBJRCAlZDpcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKKyAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdENvdWxkIG5vdCBsb2NrIEZ4IG11dGV4OlxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFNlc3Npb24gU3RhdHVzIFN0YXRlIEVuZ2luZTpcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgMHglMDh4XG4iLAorICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCAodWludDMyX3QpbUVmZmVjdEludGVyZmFjZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQudGltZUxvdywgbURlc2NyaXB0b3IudXVpZC50aW1lTWlkLCBtRGVzY3JpcHRvci51dWlkLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLmNsb2NrU2VxLCBtRGVzY3JpcHRvci51dWlkLm5vZGVbMF0sIG1EZXNjcmlwdG9yLnV1aWQubm9kZVsxXSxtRGVzY3JpcHRvci51dWlkLm5vZGVbMl0sCisgICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLm5vZGVbM10sbURlc2NyaXB0b3IudXVpZC5ub2RlWzRdLG1EZXNjcmlwdG9yLnV1aWQubm9kZVs1XSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUudGltZUxvdywgbURlc2NyaXB0b3IudHlwZS50aW1lTWlkLCBtRGVzY3JpcHRvci50eXBlLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5jbG9ja1NlcSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzBdLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMV0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzJdLAorICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVszXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNF0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzVdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA0WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCisgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAorICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBuYW1lOiAlc1xuIiwKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLm5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCisgICAgICAgICAgICBtRGVzY3JpcHRvci5pbXBsZW1lbnRvcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdDB4JTA4eCAlMDVkICAgJTA1ZCAgICAlMDh4ICVkXG4iLAorICAgICAgICAgICAgKHVpbnQzMl90KW1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMsCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQweCUwOHggJTA1ZCAgICUwNWQgICAgJTA4eCAlZFxuIiwKKyAgICAgICAgICAgICh1aW50MzJfdCltQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCVkIENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRQaWQgICBQcmlvcml0eSBDdHJsIExvY2tlZCBjbGllbnQgc2VydmVyXG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlID0gbUhhbmRsZXNbaV0ucHJvbW90ZSgpOworICAgICAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgIGhhbmRsZS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVmZmVjdEhhbmRsZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZSIKKworQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OkVmZmVjdEhhbmRsZShjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KQorICAgIDogQm5FZmZlY3QoKSwKKyAgICBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RDbGllbnQoZWZmZWN0Q2xpZW50KSwgbUNsaWVudChjbGllbnQpLCBtUHJpb3JpdHkocHJpb3JpdHkpLCBtSGFzQ29udHJvbChmYWxzZSkKK3sKKyAgICBMT0dWKCJjb25zdHJ1Y3RvciAlcCIsIHRoaXMpOworCisgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsgYnVmT2Zmc2V0KTsKKyAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgeworICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7CisKKyAgICAgICAgaWYgKG1DYmxrKSB7CisgICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OworICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBFZmZlY3Qgc2l6ZT0ldSIsIEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjp+RWZmZWN0SGFuZGxlKCkKK3sKKyAgICBMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CisgICAgZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKK3sKKyAgICBpZiAoIW1IYXNDb250cm9sKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1FZmZlY3QtPnNldEVuYWJsZWQodHJ1ZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNhYmxlKCkKK3sKKyAgICBpZiAoIW1IYXNDb250cm9sKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1FZmZlY3QgPT0gTlVMTCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1FZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNjb25uZWN0KCkKK3sKKyAgICBpZiAobUVmZmVjdCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUVmZmVjdC0+ZGlzY29ubmVjdCh0aGlzKTsKKyAgICAvLyByZWxlYXNlIHNwIG9uIG1vZHVsZSA9PiBtb2R1bGUgZGVzdHJ1Y3RvciBjYW4gYmUgY2FsbGVkIG5vdworICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICBpZiAobUNibGspIHsKKyAgICAgICAgbUNibGstPn5lZmZlY3RfcGFyYW1fY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KKyAgICB9CisgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsgICAgICAgICAgICAvLyBhbmQgZnJlZSB0aGUgc2hhcmVkIG1lbW9yeQorICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK3sKKy8vICAgIExPR1YoImNvbW1hbmQoKSwgY21kQ29kZTogJWQsIG1IYXNDb250cm9sOiAlZCwgbUVmZmVjdDogJXAiLAorLy8gICAgICAgICAgICAgIGNtZENvZGUsIG1IYXNDb250cm9sLCAobUVmZmVjdCA9PSAwKSA/IDAgOiBtRWZmZWN0LmdldCgpKTsKKworICAgIC8vIG9ubHkgZ2V0IHBhcmFtZXRlciBjb21tYW5kIGlzIHBlcm1pdHRlZCBmb3IgYXBwbGljYXRpb25zIG5vdCBjb250cm9sbGluZyB0aGUgZWZmZWN0CisgICAgaWYgKCFtSGFzQ29udHJvbCAmJiBjbWRDb2RlICE9IEVGRkVDVF9DTURfR0VUX1BBUkFNKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgLy8gaGFuZGxlIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBmb3J3YXJkZWQgdHJhbnNwYXJlbnRseSB0byBlZmZlY3QgZW5naW5lCisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJ5bG9jaygpIGhlcmUgYXMgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgYmluZGVyIHRocmVhZCBzZXJ2aW5nIGEgcGFydGljdWxhciBjbGllbnQgcHJvY2VzczoKKyAgICAgICAgLy8gbm8gcmlzayB0byBibG9jayB0aGUgd2hvbGUgbWVkaWEgc2VydmVyIHByb2Nlc3Mgb3IgbWl4ZXIgdGhyZWFkcyBpcyB3ZSBhcmUgc3R1Y2sgaGVyZQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNibGstPmxvY2spOworICAgICAgICBpZiAobUNibGstPmNsaWVudEluZGV4ID4gRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFIHx8CisgICAgICAgICAgICBtQ2Jsay0+c2VydmVySW5kZXggPiBFRkZFQ1RfUEFSQU1fQlVGRkVSX1NJWkUpIHsKKyAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXJJbmRleCA9IDA7CisgICAgICAgICAgICBtQ2Jsay0+Y2xpZW50SW5kZXggPSAwOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgd2hpbGUgKG1DYmxrLT5zZXJ2ZXJJbmRleCA8IG1DYmxrLT5jbGllbnRJbmRleCkgeworICAgICAgICAgICAgaW50IHJlcGx5OworICAgICAgICAgICAgdWludDMyX3QgcnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIGludCAqcCA9IChpbnQgKikobUJ1ZmZlciArIG1DYmxrLT5zZXJ2ZXJJbmRleCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9ICpwKys7CisgICAgICAgICAgICBpZiAoKCh1aW50OF90ICopcCArIHNpemUpID4gbUJ1ZmZlciArIG1DYmxrLT5jbGllbnRJbmRleCkgeworICAgICAgICAgICAgICAgIExPR1coImNvbW1hbmQoKTogaW52YWxpZCBwYXJhbWV0ZXIgYmxvY2sgc2l6ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopcDsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+cHNpemUgPT0gMCB8fCBwYXJhbS0+dnNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR1coImNvbW1hbmQoKTogbnVsbCBwYXJhbWV0ZXIgb3IgdmFsdWUgc2l6ZSIpOworICAgICAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXJJbmRleCArPSBzaXplOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcHNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwYXJhbS0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52c2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgICAgICAgICAvLyBzdG9wIGF0IGZpcnN0IGVycm9yIGVuY291bnRlcmVkCisgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcmV0OworICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNibGstPnNlcnZlckluZGV4ICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUNibGstPnNlcnZlckluZGV4ID0gMDsKKyAgICAgICAgbUNibGstPmNsaWVudEluZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9FTkFCTEUpIHsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gTk9fRVJST1I7CisgICAgICAgIHJldHVybiBlbmFibGUoKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9ESVNBQkxFKSB7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IE5PX0VSUk9SOworICAgICAgICByZXR1cm4gZGlzYWJsZSgpOworICAgIH0KKworICAgIHJldHVybiBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworfQorCitzcDxJTWVtb3J5PiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6Z2V0Q2JsaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNibGtNZW1vcnk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OnNldENvbnRyb2woYm9vbCBoYXNDb250cm9sLCBib29sIHNpZ25hbCkKK3sKKyAgICBMT0dWKCJzZXRDb250cm9sICVwIGNvbnRyb2wgJWQiLCB0aGlzLCBoYXNDb250cm9sKTsKKworICAgIG1IYXNDb250cm9sID0gaGFzQ29udHJvbDsKKyAgICBpZiAoc2lnbmFsICYmIG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5jb250cm9sU3RhdHVzQ2hhbmdlZChoYXNDb250cm9sKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCit7CisgICAgaWYgKG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5jb21tYW5kRXhlY3V0ZWQoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfQorfQorCisKKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5lbmFibGVTdGF0dXNDaGFuZ2VkKGVuYWJsZWQpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gQm5FZmZlY3Q6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1DYmxrLT5sb2NrKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCUwNWQgJTA1ZCAgICAlMDF1ICAgICUwMXUgICAgICAlMDV1ICAlMDV1XG4iLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gTlVMTCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbVByaW9yaXR5LAorICAgICAgICAgICAgbUhhc0NvbnRyb2wsCisgICAgICAgICAgICAhbG9ja2VkLAorICAgICAgICAgICAgbUNibGstPmNsaWVudEluZGV4LAorICAgICAgICAgICAgbUNibGstPnNlcnZlckluZGV4CisgICAgICAgICAgICApOworCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtQ2Jsay0+bG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4iCisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENoYWluKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgOiBtVGhyZWFkKHdUaHJlYWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1BY3RpdmVUcmFja0NudCgwKSwgbU93bkluQnVmZmVyKGZhbHNlKSwKKyAgICAgICAgICAgIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAorICAgICAgICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCit7CisgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46On5FZmZlY3RDaGFpbigpCit7CisgICAgaWYgKG1Pd25JbkJ1ZmZlcikgeworICAgICAgICBkZWxldGUgbUluQnVmZmVyOworICAgIH0KKworfQorCisvLyBnZXRFZmZlY3RGcm9tRGVzY19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAorc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKK3sKKyAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChtZW1jbXAoJm1FZmZlY3RzW2ldLT5kZXNjKCkudXVpZCwgJmRlc2NyaXB0b3ItPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgZWZmZWN0ID0gbUVmZmVjdHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZWZmZWN0OworfQorCisvLyBnZXRFZmZlY3RGcm9tSWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpnZXRFZmZlY3RGcm9tSWRfbChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAvLyBieSBjb252ZW50aW9uLCByZXR1cm4gZmlyc3QgZWZmZWN0IGlmIGlkIHByb3ZpZGVkIGlzIDAgKDAgaXMgbmV2ZXIgYSB2YWxpZCBpZCkKKyAgICAgICAgaWYgKGlkID09IDAgfHwgbUVmZmVjdHNbaV0tPmlkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG1FZmZlY3RzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdDsKK30KKworLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnByb2Nlc3NfbCgpCit7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIExPR1coInByb2Nlc3NfbCgpOiBjYW5ub3QgcHJvbW90ZSBtaXhlciB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgYm9vbCBpc0dsb2JhbFNlc3Npb24gPSAobVNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB8fAorICAgICAgICAgICAgKG1TZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFKTsKKyAgICBib29sIHRyYWNrc09uU2Vzc2lvbiA9IGZhbHNlOworICAgIGlmICghaXNHbG9iYWxTZXNzaW9uKSB7CisgICAgICAgIHRyYWNrc09uU2Vzc2lvbiA9CisgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmhhc0F1ZGlvU2Vzc2lvbihtU2Vzc2lvbklkKSAmIFBsYXliYWNrVGhyZWFkOjpUUkFDS19TRVNTSU9OOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOworICAgIC8vIGRvIG5vdCBwcm9jZXNzIGVmZmVjdCBpZiBubyB0cmFjayBpcyBwcmVzZW50IGluIHNhbWUgYXVkaW8gc2Vzc2lvbgorICAgIGlmIChpc0dsb2JhbFNlc3Npb24gfHwgdHJhY2tzT25TZXNzaW9uKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+cHJvY2VzcygpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RzW2ldLT51cGRhdGVTdGF0ZSgpOworICAgIH0KKyAgICAvLyBpZiBubyB0cmFjayBpcyBhY3RpdmUsIGlucHV0IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaGVyZSBhcyB0aGUgbWl4ZXIgcHJvY2VzcworICAgIC8vIHdpbGwgbm90IGRvIGl0CisgICAgaWYgKHRyYWNrc09uU2Vzc2lvbiAmJgorICAgICAgICBhY3RpdmVUcmFja3MoKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIHBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICAgICAgbWVtc2V0KG1JbkJ1ZmZlciwgMCwgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorfQorCisvLyBhZGRFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKK3sKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKKyAgICB1aW50MzJfdCBpbnNlcnRQcmVmID0gZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBlZmZlY3QtPnNldENoYWluKHRoaXMpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgZWZmZWN0LT5zZXRUaHJlYWQodGhyZWFkKTsKKworICAgIGlmICgoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgbUVmZmVjdHMgdmVjdG9yIGFzCisgICAgICAgIC8vIHRoZXkgYXJlIHByb2Nlc3NlZCBmaXJzdCBhbmQgYWNjdW11bGF0ZWQgaW4gY2hhaW4gaW5wdXQgYnVmZmVyCisgICAgICAgIG1FZmZlY3RzLmluc2VydEF0KGVmZmVjdCwgMCk7CisKKyAgICAgICAgLy8gdGhlIGlucHV0IGJ1ZmZlciBmb3IgYXV4aWxpYXJ5IGVmZmVjdCBjb250YWlucyBtb25vIHNhbXBsZXMgaW4KKyAgICAgICAgLy8gMzIgYml0IGZvcm1hdC4gVGhpcyBpcyB0byBhdm9pZCBzYXR1cmF0aW9uIGluIEF1ZG9NaXhlcgorICAgICAgICAvLyBhY2N1bXVsYXRpb24gc3RhZ2UuIFNhdHVyYXRpb24gaXMgZG9uZSBpbiBFZmZlY3RNb2R1bGU6OnByb2Nlc3MoKSBiZWZvcmUKKyAgICAgICAgLy8gY2FsbGluZyB0aGUgcHJvY2VzcyBpbiBlZmZlY3QgZW5naW5lCisgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgICAgIGludDMyX3QgKmJ1ZmZlciA9IG5ldyBpbnQzMl90W251bVNhbXBsZXNdOworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcigoaW50MTZfdCAqKWJ1ZmZlcik7CisgICAgICAgIC8vIGF1eGlsaWFyeSBlZmZlY3RzIG91dHB1dCBzYW1wbGVzIHRvIGNoYWluIGlucHV0IGJ1ZmZlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nCisgICAgICAgIC8vIGJ5IGluc2VydCBlZmZlY3RzCisgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW5zZXJ0IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgbUVmZmVjdHMgdmVjdG9yIGFzIHRoZXkgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyAgYWZ0ZXIgdHJhY2sgYW5kIGF1eGlsaWFyeSBlZmZlY3RzLgorICAgICAgICAvLyBJbnNlcnQgZWZmZWN0IG9yZGVyIGFzIGEgZnVuY3Rpb24gb2YgaW5kaWNhdGVkIHByZWZlcmVuY2U6CisgICAgICAgIC8vICBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFLCBpbnNlcnQgaW4gZmlyc3QgcG9zaXRpb24gb3IgcmVqZWN0IGlmCisgICAgICAgIC8vICBhbm90aGVyIGVmZmVjdCBpcyBwcmVzZW50CisgICAgICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwgaW5zZXJ0IGluIGZpcnN0IHBvc2l0aW9uIG9yIGFmdGVyIHRoZQorICAgICAgICAvLyAgbGFzdCBlZmZlY3QgY2xhaW1pbmcgZmlyc3QgcG9zaXRpb24KKyAgICAgICAgLy8gIGVsc2UgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QsIGluc2VydCBpbiBsYXN0IHBvc2l0aW9uIG9yIGJlZm9yZSB0aGUKKyAgICAgICAgLy8gIGZpcnN0IGVmZmVjdCBjbGFpbWluZyBsYXN0IHBvc2l0aW9uCisgICAgICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlkgaW5zZXJ0IGFmdGVyIGZpcnN0IG9yIGJlZm9yZSBsYXN0CisgICAgICAgIC8vIFJlamVjdCBpbnNlcnRpb24gaWYgYW4gZWZmZWN0IHdpdGggRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSBpcworICAgICAgICAvLyBhbHJlYWR5IHByZXNlbnQKKworICAgICAgICBpbnQgc2l6ZSA9IChpbnQpbUVmZmVjdHMuc2l6ZSgpOworICAgICAgICBpbnQgaWR4X2luc2VydCA9IHNpemU7CisgICAgICAgIGludCBpZHhfaW5zZXJ0X2ZpcnN0ID0gLTE7CisgICAgICAgIGludCBpZHhfaW5zZXJ0X2xhc3QgPSAtMTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkID0gbUVmZmVjdHNbaV0tPmRlc2MoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGlNb2RlID0gZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSzsKKyAgICAgICAgICAgIHVpbnQzMl90IGlQcmVmID0gZC5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworICAgICAgICAgICAgaWYgKGlNb2RlID09IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW52YWxpZCBlZmZlY3QgY2hhaW5pbmcgY29tYmluYXRpb25zCisgICAgICAgICAgICAgICAgaWYgKGluc2VydFByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSB8fAorICAgICAgICAgICAgICAgICAgICBpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coImFkZEVmZmVjdF9sKCkgY291bGQgbm90IGluc2VydCBlZmZlY3QgJXM6IGV4Y2x1c2l2ZSBjb25mbGljdCB3aXRoICVzIiwgZGVzYy5uYW1lLCBkLm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGZpcnN0IGluc2VydCBlZmZlY3QgYW5kIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhpcyBhcyBpbnNlcnQgcG9zaXRpb24gZm9yIG5ldyBlZmZlY3QKKyAgICAgICAgICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBsYXN0IGluc2VydCBlZmZlY3QgY2xhaW1pbmcKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgIGlmIChpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4X2luc2VydF9maXJzdCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGZpcnN0IGluc2VydCBlZmZlY3QgY2xhaW1pbmcKKyAgICAgICAgICAgICAgICAvLyBsYXN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgaWYgKGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICYmCisgICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnRfbGFzdCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2xhc3QgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1vZGlmeSBpZHhfaW5zZXJ0IGZyb20gZmlyc3QgcG9zaXRpb24gaWYgbmVlZGVkCisgICAgICAgIGlmIChpbnNlcnRQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydF9sYXN0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IGlkeF9pbnNlcnRfbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydF9maXJzdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpZHhfaW5zZXJ0X2ZpcnN0ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyByZWFkIHNhbXBsZXMgZnJvbSBjaGFpbiBpbnB1dCBidWZmZXIKKyAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOworCisgICAgICAgIC8vIGlmIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiwgb3V0cHV0IHNhbXBsZXMgdG8gY2hhaW4KKyAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIHRvIGNoYWluIGlucHV0IGJ1ZmZlcgorICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+Y29uZmlndXJlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUVmZmVjdHMuaW5zZXJ0QXQoZWZmZWN0LCBpZHhfaW5zZXJ0KTsKKworICAgICAgICBMT0dWKCJhZGRFZmZlY3RfbCgpIGVmZmVjdCAlcCwgYWRkZWQgaW4gY2hhaW4gJXAgYXQgcmFuayAlZCIsIGVmZmVjdC5nZXQoKSwgdGhpcywgaWR4X2luc2VydCk7CisgICAgfQorICAgIGVmZmVjdC0+Y29uZmlndXJlKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyByZW1vdmVFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpbUVmZmVjdHMuc2l6ZSgpOworICAgIGludCBpOworICAgIHVpbnQzMl90IHR5cGUgPSBlZmZlY3QtPmRlc2MoKS5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBtRWZmZWN0c1tpXSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBlZmZlY3QtPmluQnVmZmVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpID09IHNpemUgLSAxICYmIGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpIC0gMV0tPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaSAtIDFdLT5jb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWZmZWN0cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIExPR1YoInJlbW92ZUVmZmVjdF9sKCkgZWZmZWN0ICVwLCByZW1vdmVkIGZyb20gY2hhaW4gJXAgYXQgcmFuayAlZCIsIGVmZmVjdC5nZXQoKSwgdGhpcywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtRWZmZWN0cy5zaXplKCk7Cit9CisKKy8vIHNldERldmljZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXREZXZpY2VfbCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldERldmljZShkZXZpY2UpOworICAgIH0KK30KKworLy8gc2V0TW9kZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRNb2RlX2wodWludDMyX3QgbW9kZSkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0TW9kZShtb2RlKTsKKyAgICB9Cit9CisKKy8vIHNldFZvbHVtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRWb2x1bWVfbCh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0KQoreworICAgIHVpbnQzMl90IG5ld0xlZnQgPSAqbGVmdDsKKyAgICB1aW50MzJfdCBuZXdSaWdodCA9ICpyaWdodDsKKyAgICBib29sIGhhc0NvbnRyb2wgPSBmYWxzZTsKKyAgICBpbnQgY3RybElkeCA9IC0xOworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOworCisgICAgLy8gZmlyc3QgdXBkYXRlIHZvbHVtZSBjb250cm9sbGVyCisgICAgZm9yIChzaXplX3QgaSA9IHNpemU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgaWYgKG1FZmZlY3RzW2kgLSAxXS0+aXNQcm9jZXNzRW5hYmxlZCgpICYmCisgICAgICAgICAgICAobUVmZmVjdHNbaSAtIDFdLT5kZXNjKCkuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpIHsKKyAgICAgICAgICAgIGN0cmxJZHggPSBpIC0gMTsKKyAgICAgICAgICAgIGhhc0NvbnRyb2wgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3RybElkeCA9PSBtVm9sdW1lQ3RybElkeCAmJiAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CisgICAgICAgIGlmIChoYXNDb250cm9sKSB7CisgICAgICAgICAgICAqbGVmdCA9IG1OZXdMZWZ0Vm9sdW1lOworICAgICAgICAgICAgKnJpZ2h0ID0gbU5ld1JpZ2h0Vm9sdW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNDb250cm9sOworICAgIH0KKworICAgIG1Wb2x1bWVDdHJsSWR4ID0gY3RybElkeDsKKyAgICBtTGVmdFZvbHVtZSA9IG5ld0xlZnQ7CisgICAgbVJpZ2h0Vm9sdW1lID0gbmV3UmlnaHQ7CisKKyAgICAvLyBzZWNvbmQgZ2V0IHZvbHVtZSB1cGRhdGUgZnJvbSB2b2x1bWUgY29udHJvbGxlcgorICAgIGlmIChjdHJsSWR4ID49IDApIHsKKyAgICAgICAgbUVmZmVjdHNbY3RybElkeF0tPnNldFZvbHVtZSgmbmV3TGVmdCwgJm5ld1JpZ2h0LCB0cnVlKTsKKyAgICAgICAgbU5ld0xlZnRWb2x1bWUgPSBuZXdMZWZ0OworICAgICAgICBtTmV3UmlnaHRWb2x1bWUgPSBuZXdSaWdodDsKKyAgICB9CisgICAgLy8gdGhlbiBpbmRpY2F0ZSB2b2x1bWUgdG8gYWxsIG90aGVyIGVmZmVjdHMgaW4gY2hhaW4uCisgICAgLy8gUGFzcyBhbHRlcmVkIHZvbHVtZSB0byBlZmZlY3RzIGJlZm9yZSB2b2x1bWUgY29udHJvbGxlcgorICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlcgorICAgIHVpbnQzMl90IGxWb2wgPSBuZXdMZWZ0OworICAgIHVpbnQzMl90IHJWb2wgPSBuZXdSaWdodDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICgoaW50KWkgPT0gY3RybElkeCkgY29udGludWU7CisgICAgICAgIC8vIHRoaXMgYWxzbyB3b3JrcyBmb3IgY3RybElkeCA9PSAtMSB3aGVuIHRoZXJlIGlzIG5vIHZvbHVtZSBjb250cm9sbGVyCisgICAgICAgIGlmICgoaW50KWkgPiBjdHJsSWR4KSB7CisgICAgICAgICAgICBsVm9sID0gKmxlZnQ7CisgICAgICAgICAgICByVm9sID0gKnJpZ2h0OworICAgICAgICB9CisgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgfQorICAgICpsZWZ0ID0gbmV3TGVmdDsKKyAgICAqcmlnaHQgPSBuZXdSaWdodDsKKworICAgIHJldHVybiBoYXNDb250cm9sOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVmZmVjdHMgZm9yIHNlc3Npb24gJWQ6XG4iLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXHROdW0gZnggSW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCUwMmQgICAgIDB4JTA4eCAgMHglMDh4ICAgJWRcbiIsCisgICAgICAgICAgICBtRWZmZWN0cy5zaXplKCksCisgICAgICAgICAgICAodWludDMyX3QpbUluQnVmZmVyLAorICAgICAgICAgICAgKHVpbnQzMl90KW1PdXRCdWZmZXIsCisgICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKKyAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCkBAIC00MDQ1LDExICs2NDYyLDQgQEAKICAgICByZXR1cm4gQm5BdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKSB7Ci0gICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCi0gICAgICAgICAgICBTdHJpbmcxNigibWVkaWEuYXVkaW9fZmxpbmdlciIpLCBuZXcgQXVkaW9GbGluZ2VyKCkpOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDczOWVjMzMuLjU5MTc2MzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTMxLDEwICszMSwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKwogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJBdWRpb0J1ZmZlclByb3ZpZGVyLmgiCkBAIC00Miw2ICs0NCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK2NsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CiBjbGFzcyBBdWRpb01peGVyOwogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKQEAgLTU3LDEwICs2MCwxMyBAQAogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrU3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIAotY2xhc3MgQXVkaW9GbGluZ2VyIDogcHVibGljIEJuQXVkaW9GbGluZ2VyLCBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK2NsYXNzIEF1ZGlvRmxpbmdlciA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9GbGluZ2VyPiwKKyAgICBwdWJsaWMgQm5BdWRpb0ZsaW5nZXIKIHsKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb0ZsaW5nZXI+OwogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOyB9CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTc1LDYgKzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3Q7CkBAIC0xMzksOCArMTQ2LDI5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsIGludCBvdXRwdXQpOwogCi0gICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnBVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpOwogCiAgICAgZW51bSBoYXJkd2FyZV9jYWxsX3N0YXRlIHsKICAgICAgICAgQVVESU9fSFdfSURMRSA9IDAsCkBAIC0xNzAsNiArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KApAQCAtMTc4LDYgKzIwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldE1vZGUoKSB7IHJldHVybiBtTW9kZTsgfQorCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcigpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb0ZsaW5nZXIoKTsKQEAgLTIwNSw2ICsyMzYsMjcgQEAKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICBtUGlkOwogICAgIH07CiAKKyAgICAvLyAtLS0gTm90aWZpY2F0aW9uIENsaWVudCAtLS0KKyAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOworCisgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gICAgY2xpZW50KCkgeyByZXR1cm4gbUNsaWVudDsgfQorCisgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50JiBvcGVyYXRvciA9IChjb25zdCBOb3RpZmljYXRpb25DbGllbnQmKTsKKworICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICBtQXVkaW9GbGluZ2VyOworICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiBtQ2xpZW50OworICAgIH07CiAKICAgICBjbGFzcyBUcmFja0hhbmRsZTsKICAgICBjbGFzcyBSZWNvcmRIYW5kbGU7CkBAIC0yMTUsNiArMjY3LDkgQEAKICAgICBjbGFzcyBEdXBsaWNhdGluZ1RocmVhZDsKICAgICBjbGFzcyBUcmFjazsKICAgICBjbGFzcyBSZWNvcmRUcmFjazsKKyAgICBjbGFzcyBFZmZlY3RNb2R1bGU7CisgICAgY2xhc3MgRWZmZWN0SGFuZGxlOworICAgIGNsYXNzIEVmZmVjdENoYWluOwogCiAgICAgY2xhc3MgVGhyZWFkQmFzZSA6IHB1YmxpYyBUaHJlYWQgewogICAgIHB1YmxpYzoKQEAgLTI1MCwxMyArMzA1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2tCYXNlKCk7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrKCkgY29uc3QgeyByZXR1cm4gbUNibGs7IH0KKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc2Vzc2lvbklkKCkgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBUaHJlYWRCYXNlOwpAQCAtMzA1LDYgKzM2Miw3IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1DbGllbnRUaWQ7CiAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDb25maWdFdmVudCB7CkBAIC0zMjQsNyArMzgyLDcgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZENvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwpAQCAtMzQ4LDkgKzQwNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICBtQXVkaW9GbGluZ2VyOwogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVBhcmFtQ29uZDsKICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1QYXJhbVN0YXR1czsKQEAgLTM4Niw3ICs0NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2soKTsKIAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwpAQCAtNDA1LDYgKzQ2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgKmF1eEJ1ZmZlcigpIHsgcmV0dXJuIG1BdXhCdWZmZXI7IH0KKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFpbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsgbU1haW5CdWZmZXIgPSBidWZmZXI7IH0KKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1haW5CdWZmZXIoKSB7IHJldHVybiBtTWFpbkJ1ZmZlcjsgfQorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhdXhFZmZlY3RJZCgpIHsgcmV0dXJuIG1BdXhFZmZlY3RJZDsgfQogCiAKICAgICAgICAgcHJvdGVjdGVkOgpAQCAtNDQ1LDYgKzUxMSwxMCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CisgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICptTWFpbkJ1ZmZlcjsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhc1ZvbHVtZUNvbnRyb2xsZXI7CiAgICAgICAgIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC00ODYsNyArNTU2LDcgQEAKICAgICAgICAgICAgIER1cGxpY2F0aW5nVGhyZWFkKiAgICAgICAgICBtU291cmNlVGhyZWFkOwogICAgICAgICB9OyAgLy8gZW5kIG9mIE91dHB1dFRyYWNrCiAKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkKTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkLCB1aW50MzJfdCBkZXZpY2UpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTUxOSw2ICs1ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgeyByZXR1cm4gbU91dHB1dDsgfQpAQCAtNTI4LDggKzU5OSw0OSBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZXN0b3JlKCkgeyBpZiAobVN1c3BlbmRlZCkgbVN1c3BlbmRlZC0tOyB9CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU3VzcGVuZGVkKCkgeyByZXR1cm4gKG1TdXNwZW5kZWQgIT0gMCk7IH0KICAgICAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgeyByZXR1cm4gbU1peEJ1ZmZlcjsgfTsKKworICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RIYW5kbGU+IGNyZWF0ZUVmZmVjdF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB2b2lkIGRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlcyBmb3IgaGFzQXVkaW9TZXNzaW9uIChiaXQgZmllbGQpCisgICAgICAgICAgICAgICAgICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9TRVNTSU9OID0gMHgxLCAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDS19TRVNTSU9OID0gMHgyICAgICAvLyB0aGUgYXVkaW8gc2Vzc2lvbiBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0RWZmZWN0Q2hhaW4oaW50IHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBsb2NrRWZmZWN0Q2hhaW5zX2woVmVjdG9yPHNwIDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCB1bmxvY2tFZmZlY3RDaGFpbnMoVmVjdG9yPHNwIDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0X2woaW50IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBFZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdF9sKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRWZmZWN0SWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkIHNldE1vZGUodWludDMyX3QgbW9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgYWRkRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woaW50IHNlc3Npb25JZCk7CiAKICAgICAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgICAgIHN0cmVhbV90eXBlX3QoKQpAQCAtNTUzLDYgKzY2NSw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBpZGxlU2xlZXBUaW1lVXMoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpID0gMDsKIAogICAgIHByaXZhdGU6CiAKQEAgLTU3Miw4ICs2ODUsMTEgQEAKIAogICAgICAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwogCisgICAgICAgIHVpbnQzMl90ICAgIGRldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KKwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgc3RhdHVzX3QgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICBzdGF0dXNfdCAgICBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxUcmFjaz4gPiAgICAgICBtVHJhY2tzOwogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSB1c2VzIDEgYWRkaXRpb25uYWwgc3RyZWFtIHR5cGUgaW50ZXJuYWxseSBmb3IgdGhlIE91dHB1dFRyYWNrIHVzZWQgYnkgRHVwbGljYXRpbmdUaHJlYWQKQEAgLTU4NCwzMCArNzAwLDMzIEBACiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVdyaXRlczsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlczsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5Xcml0ZTsKKyAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiAgICAgICBtRWZmZWN0Q2hhaW5zOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2U7CiAgICAgfTsKIAogICAgIGNsYXNzIE1peGVyVGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIE1peGVyVGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCk7CisgICAgICAgIE1peGVyVGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCisgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWl4ZXJUaHJlYWQoKTsKIAogICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGdldFRyYWNrcyhTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHB1dFRyYWNrcyhTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW52YWxpZGF0ZVRyYWNrcyhpbnQgc3RyZWFtVHlwZSk7CiAgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgcHJlcGFyZVRyYWNrc19sKGNvbnN0IFNvcnRlZFZlY3Rvcjwgd3A8VHJhY2s+ID4mIGFjdGl2ZVRyYWNrcywgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBwcmVwYXJlVHJhY2tzX2woY29uc3QgU29ydGVkVmVjdG9yPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOwogICAgICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbCgpOwogICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpOworICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKIAogICAgICAgICBBdWRpb01peGVyKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyOwogICAgIH07CkBAIC02MTUsNyArNzM0LDcgQEAKICAgICBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewogICAgIHB1YmxpYzoKIAotICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkKTsKKyAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCiAgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtNjI4LDEwICs3NDcsMTUgQEAKICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpOwogICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKTsKKyAgICAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCk7CiAKICAgICBwcml2YXRlOgotICAgICAgICBmbG9hdCBtTGVmdFZvbHVtZTsKLSAgICAgICAgZmxvYXQgbVJpZ2h0Vm9sdW1lOworICAgICAgICB2b2lkIGFwcGx5Vm9sdW1lKHVpbnQxNl90IGxlZnRWb2wsIHVpbnQxNl90IHJpZ2h0Vm9sLCBib29sIHJhbXApOworCisgICAgICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7CisgICAgICAgIGZsb2F0IG1SaWdodFZvbEZsb2F0OworICAgICAgICB1aW50MTZfdCBtTGVmdFZvbFNob3J0OworICAgICAgICB1aW50MTZfdCBtUmlnaHRWb2xTaG9ydDsKICAgICB9OwogCiAgICAgY2xhc3MgRHVwbGljYXRpbmdUaHJlYWQgOiBwdWJsaWMgTWl4ZXJUaHJlYWQgewpAQCAtNjYxLDYgKzc4NSwxMiBAQAogICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVJbnRlcm5hbChpbnQgc3RyZWFtKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWU7IH0KICAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKTsKIAorICAgICAgICAgICAgICBpbnQgIG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3Rlcik7CisKICAgICBmcmllbmQgY2xhc3MgQXVkaW9CdWZmZXI7CiAKICAgICBjbGFzcyBUcmFja0hhbmRsZSA6IHB1YmxpYyBhbmRyb2lkOjpCbkF1ZGlvVHJhY2sgewpAQCAtNjc0LDYgKzgwNCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAogICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CiAgICAgcHJpdmF0ZToKQEAgLTY4NSw2ICs4MTYsNyBAQAogCiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpOwogCiAKICAgICAvLyByZWNvcmQgdGhyZWFkCkBAIC03MDEsNyArODMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpAQCAtNzQ0LDcgKzg3Nyw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKICAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwogICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKQEAgLTc3Niw2ICs5MDksMjYwIEBACiAgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKICAgICB9OwogCisgICAgLy8tLS0gQXVkaW8gRWZmZWN0IE1hbmFnZW1lbnQKKworICAgIC8vIEVmZmVjdE1vZHVsZSBhbmQgRWZmZWN0Q2hhaW4gY2xhc3NlcyBib3RoIGhhdmUgdGhlaXIgb3duIG11dGV4IHRvIHByb3RlY3QKKyAgICAvLyBzdGF0ZSBjaGFuZ2VzIG9yIHJlc291cmNlIG1vZGlmaWNhdGlvbnMuIEFsd2F5cyByZXNwZWN0IHRoZSBmb2xsb3dpbmcgb3JkZXIKKyAgICAvLyBpZiBtdWx0aXBsZSBtdXRleGVzIG11c3QgYmUgYWNxdWlyZWQgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2s6CisgICAgLy8gQXVkaW9GbGluZ2VyIC0+IFRocmVhZEJhc2UgLT4gRWZmZWN0Q2hhaW4gLT4gRWZmZWN0TW9kdWxlCisKKyAgICAvLyBUaGUgRWZmZWN0TW9kdWxlIGNsYXNzIGlzIGEgd3JhcHBlciBvYmplY3QgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24KKyAgICAvLyBpbiB0aGUgZWZmZWN0IGxpYnJhcnkuIEl0IHByZXZlbnRzIGNvbmN1cnJlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBjb21tYW5kKCkgZnVuY3Rpb25zCisgICAgLy8gZnJvbSBkaWZmZXJlbnQgY2xpZW50IHRocmVhZHMuIEl0IGtlZXBzIGEgbGlzdCBvZiBFZmZlY3RIYW5kbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gYWxsIGNsaWVudCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBlZmZlY3QgYW5kIG5vdGlmaWVzIGFwcGxpY2F0aW9ucyBvZiBlZmZlY3Qgc3RhdGUsCisgICAgLy8gY29udHJvbCBvciBwYXJhbWV0ZXIgY2hhbmdlcy4gSXQgbWFuYWdlcyB0aGUgYWN0aXZhdGlvbiBzdGF0ZSBtYWNoaW5lIHRvIHNlbmQgYXBwcm9wcmlhdGUKKyAgICAvLyByZXNldCwgZW5hYmxlLCBkaXNhYmxlIGNvbW1hbmRzIHRvIGVmZmVjdCBlbmdpbmUgYW5kIHByb3ZpZGUgdm9sdW1lCisgICAgLy8gcmFtcGluZyB3aGVuIGVmZmVjdHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZC4KKyAgICAvLyBXaGVuIGNvbnRyb2xsaW5nIGFuIGF1eGlsaWFyeSBlZmZlY3QsIHRoZSBFZmZlY3RNb2R1bGUgYWxzbyBwcm92aWRlcyBhbiBpbnB1dCBidWZmZXIgdXNlZCBieQorICAgIC8vIHRoZSBhdHRhY2hlZCB0cmFjayhzKSB0byBhY2N1bXVsYXRlIHRoZWlyIGF1eGlsaWFyeSBjaGFubmVsLgorICAgIGNsYXNzIEVmZmVjdE1vZHVsZTogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0TW9kdWxlKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4mIGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOworICAgICAgICB+RWZmZWN0TW9kdWxlKCk7CisKKyAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgeworICAgICAgICAgICAgSURMRSwKKyAgICAgICAgICAgIFJFU1RBUlQsCisgICAgICAgICAgICBTVEFSVElORywKKyAgICAgICAgICAgIEFDVElWRSwKKyAgICAgICAgICAgIFNUT1BQSU5HLAorICAgICAgICAgICAgU1RPUFBFRAorICAgICAgICB9OworCisgICAgICAgIGludCAgICAgICAgIGlkKCkgeyByZXR1cm4gbUlkOyB9CisgICAgICAgIHZvaWQgcHJvY2VzcygpOworICAgICAgICB2b2lkIHVwZGF0ZVN0YXRlKCk7CisgICAgICAgIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisKKyAgICAgICAgdm9pZCByZXNldF9sKCk7CisgICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgICAgIHVpbnQzMl90IHN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzdGF0dXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2Vzc2lvbklkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworICAgICAgICBib29sIGlzRW5hYmxlZCgpOworICAgICAgICBib29sIGlzUHJvY2Vzc0VuYWJsZWQoKTsKKworICAgICAgICB2b2lkICAgICAgICBzZXRJbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2ID0gYnVmZmVyOyB9CisgICAgICAgIGludDE2X3QgICAgICppbkJ1ZmZlcigpIHsgcmV0dXJuIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsgfQorICAgICAgICB2b2lkICAgICAgICBzZXRPdXRCdWZmZXIoaW50MTZfdCAqYnVmZmVyKSB7IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTYgPSBidWZmZXI7IH0KKyAgICAgICAgaW50MTZfdCAgICAgKm91dEJ1ZmZlcigpIHsgcmV0dXJuIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTY7IH0KKyAgICAgICAgdm9pZCAgICAgICAgc2V0Q2hhaW4oY29uc3Qgd3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikgeyBtQ2hhaW4gPSBjaGFpbjsgfQorICAgICAgICB2b2lkICAgICAgICBzZXRUaHJlYWQoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCkgeyBtVGhyZWFkID0gdGhyZWFkOyB9CisKKyAgICAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKHNwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSk7CisgICAgICAgIHZvaWQgZGlzY29ubmVjdChjb25zdCB3cDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpOworICAgICAgICBzaXplX3QgcmVtb3ZlSGFuZGxlIChjb25zdCB3cDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpOworCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQorICAgICAgICB3cDxFZmZlY3RDaGFpbj4mICAgICBjaGFpbigpIHsgcmV0dXJuIG1DaGFpbjsgfQorCisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0RGV2aWNlKHVpbnQzMl90IGRldmljZSk7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcik7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0TW9kZSh1aW50MzJfdCBtb2RlKTsKKworICAgICAgICBzdGF0dXNfdCAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgICAvLyBNYXhpbXVtIHRpbWUgYWxsb2NhdGVkIHRvIGVmZmVjdCBlbmdpbmVzIHRvIGNvbXBsZXRlIHRoZSB0dXJuIG9mZiBzZXF1ZW5jZQorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0RJU0FCTEVfVElNRV9NUyA9IDEwMDAwOworCisgICAgICAgIEVmZmVjdE1vZHVsZShjb25zdCBFZmZlY3RNb2R1bGUmKTsKKyAgICAgICAgRWZmZWN0TW9kdWxlJiBvcGVyYXRvciA9IChjb25zdCBFZmZlY3RNb2R1bGUmKTsKKworICAgICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CisgICAgICAgIHN0YXR1c190IHN0b3BfbCgpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgb3IgYXVkaW9fZGV2aWNlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNEZXZpY2VDb252VGFibGVbXTsKKyAgICAgICAgc3RhdGljIHVpbnQzMl90IGRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19tb2RlIG9yIGF1ZGlvX21vZGVfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qgc01vZGVDb252VGFibGVbXTsKKyAgICAgICAgc3RhdGljIGludCBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBtb2RlKTsKKworICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgIC8vIG11dGV4IGZvciBwcm9jZXNzLCBjb21tYW5kcyBhbmQgaGFuZGxlcyBsaXN0IHByb3RlY3Rpb24KKyAgICAgICAgd3A8VGhyZWFkQmFzZT4gICAgICBtVGhyZWFkOyAgICAvLyBwYXJlbnQgdGhyZWFkCisgICAgICAgIHdwPEVmZmVjdENoYWluPiAgICAgbUNoYWluOyAgICAgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgorICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgIC8vIHRoaXMgaW5zdGFuY2UgdW5pcXVlIElECisgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjcmlwdG9yOy8vIGVmZmVjdCBkZXNjcmlwdG9yIHJlY2VpdmVkIGZyb20gZWZmZWN0IGVuZ2luZQorICAgICAgICBlZmZlY3RfY29uZmlnX3QgICAgIG1Db25maWc7ICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbgorICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgIG1FZmZlY3RJbnRlcmZhY2U7IC8vIEVmZmVjdCBtb2R1bGUgQyBBUEkKKyAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAgICAgICAgdWludDMyX3QgbVN0YXRlOyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2YXRpb24gc3RhdGUgKGVmZmVjdF9zdGF0ZSkKKyAgICAgICAgVmVjdG9yPCB3cDxFZmZlY3RIYW5kbGU+ID4gbUhhbmRsZXM7ICAgIC8vIGxpc3Qgb2YgY2xpZW50IGhhbmRsZXMKKyAgICAgICAgdWludDMyX3QgbU1heERpc2FibGVXYWl0Q250OyAgICAvLyBtYXhpbXVtIGdyYWNlIHBlcmlvZCBiZWZvcmUgZm9yY2luZyBhbiBlZmZlY3Qgb2ZmIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZGluZyBkaXNhYmxlIGNvbW1hbmQuCisgICAgICAgIHVpbnQzMl90IG1EaXNhYmxlV2FpdENudDsgICAgICAgLy8gY3VycmVudCBwcm9jZXNzKCkgY2FsbHMgY291bnQgZHVyaW5nIGRpc2FibGUgcGVyaW9kLgorICAgIH07CisKKyAgICAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKKyAgICAvLyB0byByZWNlaXZlIHBhcmFtZXRlciB1cGRhdGVzLCBrZWVwcyB0cmFjayBvZiBlZmZlY3QgY29udHJvbAorICAgIC8vIG93bmVyc2hpcCBhbmQgc3RhdGUgYW5kIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEVmZmVjdE1vZHVsZSBvYmplY3QgaXQgaXMgY29udHJvbGxpbmcuCisgICAgLy8gVGhlcmUgaXMgb25lIEVmZmVjdEhhbmRsZSBvYmplY3QgZm9yIGVhY2ggYXBwbGljYXRpb24gY29udHJvbGxpbmcgKG9yIHVzaW5nKQorICAgIC8vIGFuIGVmZmVjdCBtb2R1bGUuCisgICAgLy8gVGhlIEVmZmVjdEhhbmRsZSBpcyBvYnRhaW5lZCBieSBjYWxsaW5nIEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KCkuCisgICAgY2xhc3MgRWZmZWN0SGFuZGxlOiBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3QgeworICAgIHB1YmxpYzoKKworICAgICAgICBFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSk7CisgICAgICAgIHZpcnR1YWwgfkVmZmVjdEhhbmRsZSgpOworCisgICAgICAgIC8vIElFZmZlY3QKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGUoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNhYmxlKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisKKworICAgICAgICAvLyBHaXZlIG9yIHRha2UgY29udHJvbCBvZiBlZmZlY3QgbW9kdWxlCisgICAgICAgIHZvaWQgc2V0Q29udHJvbChib29sIGhhc0NvbnRyb2wsIGJvb2wgc2lnbmFsKTsKKyAgICAgICAgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIC8vIEdldHRlcnMKKyAgICAgICAgaW50IGlkKCkgeyByZXR1cm4gbUVmZmVjdC0+aWQoKTsgfQorICAgICAgICBpbnQgcHJpb3JpdHkoKSB7IHJldHVybiBtUHJpb3JpdHk7IH0KKyAgICAgICAgYm9vbCBoYXNDb250cm9sKCkgeyByZXR1cm4gbUhhc0NvbnRyb2w7IH0KKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QoKSB7IHJldHVybiBtRWZmZWN0OyB9CisKKyAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICAgIEVmZmVjdEhhbmRsZShjb25zdCBFZmZlY3RIYW5kbGUmKTsKKyAgICAgICAgRWZmZWN0SGFuZGxlJiBvcGVyYXRvciA9KGNvbnN0IEVmZmVjdEhhbmRsZSYpOworCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gbUVmZmVjdDsgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gY29udHJvbGxlZCBFZmZlY3RNb2R1bGUKKyAgICAgICAgc3A8SUVmZmVjdENsaWVudD4gbUVmZmVjdENsaWVudDsgICAgLy8gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBjbGllbnQgbm90aWZpY2F0aW9ucworICAgICAgICBzcDxDbGllbnQ+ICAgICAgICAgIG1DbGllbnQ7ICAgICAgICAvLyBjbGllbnQgZm9yIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgICAgICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqIG1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nIHZpYSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHVpbnQ4X3QqICAgICAgICAgICAgbUJ1ZmZlcjsgICAgICAgIC8vIHBvaW50ZXIgdG8gcGFyYW1ldGVyIGFyZWEgaW4gc2hhcmVkIG1lbW9yeQorICAgICAgICBpbnQgbVByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYXBwbGljYXRpb24gcHJpb3JpdHkgdG8gY29udHJvbCB0aGUgZWZmZWN0CisgICAgICAgIGJvb2wgbUhhc0NvbnRyb2w7ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgdGhpcyBoYW5kbGUgaXMgY29udHJvbGxpbmcgdGhlIGVmZmVjdAorICAgIH07CisKKyAgICAvLyB0aGUgRWZmZWN0Q2hhaW4gY2xhc3MgcmVwcmVzZW50cyBhIGdyb3VwIG9mIGVmZmVjdHMgYXNzb2NpYXRlZCB0byBvbmUgYXVkaW8gc2Vzc2lvbi4KKyAgICAvLyBUaGVyZSBjYW4gYmUgYW55IG51bWJlciBvZiBFZmZlY3RDaGFpbiBvYmplY3RzIHBlciBvdXRwdXQgbWl4ZXIgdGhyZWFkIChQbGF5YmFja1RocmVhZCkuCisgICAgLy8gVGhlIEVmZmVjQ2hhaW4gd2l0aCBzZXNzaW9uIElEIDAgY29udGFpbnMgZ2xvYmFsIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgb3V0cHV0IG1peC4KKyAgICAvLyBFZmZlY3RzIGluIHRoaXMgY2hhaW4gY2FuIGJlIGluc2VydCBvciBhdXhpbGlhcnkuIEVmZmVjdHMgaW4gb3RoZXIgY2hhaW5zIChhdHRhY2hlZCB0byB0cmFja3MpCisgICAgLy8gYXJlIGluc2VydCBvbmx5LiBUaGUgRWZmZWN0Q2hhaW4gbWFpbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiBlZmZlY3QgbW9kdWxlLCB0aGUgb3JkZXIgY29ycmVzcG9uZGluZworICAgIC8vIGluIHRoZSBlZmZlY3QgcHJvY2VzcyBvcmRlci4gV2hlbiBhdHRhY2hlZCB0byBhIHRyYWNrIChzZXNzaW9uIElEICE9IDApLCBpdCBhbHNvIHByb3ZpZGUgaXQncyBvd24KKyAgICAvLyBpbnB1dCBidWZmZXIgdXNlZCBieSB0aGUgdHJhY2sgYXMgYWNjdW11bGF0aW9uIGJ1ZmZlci4KKyAgICBjbGFzcyBFZmZlY3RDaGFpbjogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0Q2hhaW4oY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHdUaHJlYWQsIGludCBzZXNzaW9uSWQpOworICAgICAgICB+RWZmZWN0Q2hhaW4oKTsKKworICAgICAgICB2b2lkIHByb2Nlc3NfbCgpOworCisgICAgICAgIHZvaWQgbG9jaygpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgYWRkRWZmZWN0X2woY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgaGFuZGxlKTsKKyAgICAgICAgc2l6ZV90IHJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGhhbmRsZSk7CisKKyAgICAgICAgaW50IHNlc3Npb25JZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOworICAgICAgICB9CisKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tRGVzY19sKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOworICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21JZF9sKGludCBpZCk7CisgICAgICAgIGJvb2wgc2V0Vm9sdW1lX2wodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCk7CisgICAgICAgIHZvaWQgc2V0RGV2aWNlX2wodWludDMyX3QgZGV2aWNlKTsKKyAgICAgICAgdm9pZCBzZXRNb2RlX2wodWludDMyX3QgbW9kZSk7CisKKyAgICAgICAgdm9pZCBzZXRJbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIsIGJvb2wgb3duc0J1ZmZlciA9IGZhbHNlKSB7CisgICAgICAgICAgICBtSW5CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBtT3duSW5CdWZmZXIgPSBvd25zQnVmZmVyOworICAgICAgICB9CisgICAgICAgIGludDE2X3QgKmluQnVmZmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbkJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldE91dEJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsKKyAgICAgICAgICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0VHJhY2soKSB7bUFjdGl2ZVRyYWNrQ250Kys7fQorICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHttQWN0aXZlVHJhY2tDbnQtLTt9CisgICAgICAgIGludCBhY3RpdmVUcmFja3MoKSB7IHJldHVybiBtQWN0aXZlVHJhY2tDbnQ7fQorCisgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5KCkgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CisgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3kodWludDMyX3Qgc3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgIHsgbVN0cmF0ZWd5ID0gc3RyYXRlZ3k7IH0KKworICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgICAgRWZmZWN0Q2hhaW4oY29uc3QgRWZmZWN0Q2hhaW4mKTsKKyAgICAgICAgRWZmZWN0Q2hhaW4mIG9wZXJhdG9yID0oY29uc3QgRWZmZWN0Q2hhaW4mKTsKKworICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAorICAgICAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAorICAgICAgICBWZWN0b3I8c3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGludCBtU2Vzc2lvbklkOyAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgICAgIGludDE2X3QgKm1JbkJ1ZmZlcjsgICAgICAgICAvLyBjaGFpbiBpbnB1dCBidWZmZXIKKyAgICAgICAgaW50MTZfdCAqbU91dEJ1ZmZlcjsgICAgICAgIC8vIGNoYWluIG91dHB1dCBidWZmZXIKKyAgICAgICAgaW50IG1BY3RpdmVUcmFja0NudDsgICAgICAgIC8vIG51bWJlciBvZiBhY3RpdmUgdHJhY2tzIGNvbm5lY3RlZAorICAgICAgICBib29sIG1Pd25JbkJ1ZmZlcjsgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGUgY2hhaW4gb3ducyBpdHMgaW5wdXQgYnVmZmVyCisgICAgICAgIGludCBtVm9sdW1lQ3RybElkeDsgICAgICAgICAvLyBpbmRleCBvZiBpbnNlcnQgZWZmZWN0IGhhdmluZyBjb250cm9sIG92ZXIgdm9sdW1lCisgICAgICAgIHVpbnQzMl90IG1MZWZ0Vm9sdW1lOyAgICAgICAvLyBwcmV2aW91cyB2b2x1bWUgb24gbGVmdCBjaGFubmVsCisgICAgICAgIHVpbnQzMl90IG1SaWdodFZvbHVtZTsgICAgICAvLyBwcmV2aW91cyB2b2x1bWUgb24gcmlnaHQgY2hhbm5lbAorICAgICAgICB1aW50MzJfdCBtTmV3TGVmdFZvbHVtZTsgICAgICAgLy8gbmV3IHZvbHVtZSBvbiBsZWZ0IGNoYW5uZWwKKyAgICAgICAgdWludDMyX3QgbU5ld1JpZ2h0Vm9sdW1lOyAgICAgIC8vIG5ldyB2b2x1bWUgb24gcmlnaHQgY2hhbm5lbAorICAgICAgICB1aW50MzJfdCBtU3RyYXRlZ3k7IC8vIHN0cmF0ZWd5IGZvciB0aGlzIGVmZmVjdCBjaGFpbgorICAgIH07CisKICAgICBmcmllbmQgY2xhc3MgUmVjb3JkVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKIApAQCAtNzk2LDggKzExODMsMTMgQEAKIAogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CiAKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElCaW5kZXI+ID4gICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFRocmVhZElkOworICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcGlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dFVuaXF1ZUlkOworI2lmZGVmIExWTVgKKyAgICAgICAgICAgICAgICBpbnQgbUxpZmVWaWJlc0NsaWVudFBpZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHVpbnQzMl90IG1Nb2RlOworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggMTlhNDQyYS4uOGFhYTMyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtNTYsNiArNTYsOCBAQAogICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOOwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOworICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CisgICAgICAgIHQtPmF1eEluYyA9IDA7CiAgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CiAgICAgICAgIHQtPmVuYWJsZWQgPSAwOwogICAgICAgICB0LT5mb3JtYXQgPSAxNjsKQEAgLTY1LDYgKzY3LDggQEAKICAgICAgICAgdC0+cmVzYW1wbGVyID0gMDsKICAgICAgICAgdC0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICB0LT5pbiA9IDA7CisgICAgICAgIHQtPm1haW5CdWZmZXIgPSBOVUxMOworICAgICAgICB0LT5hdXhCdWZmZXIgPSBOVUxMOwogICAgICAgICB0Kys7CiAgICAgfQogfQpAQCAtMTY5LDI4ICsxNzMsNDggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnNldFBhcmFtZXRlcihpbnQgdGFyZ2V0LCBpbnQgbmFtZSwgaW50IHZhbHVlKQorc3RhdHVzX3QgQXVkaW9NaXhlcjo6c2V0UGFyYW1ldGVyKGludCB0YXJnZXQsIGludCBuYW1lLCB2b2lkICp2YWx1ZSkKIHsKKyAgICBpbnQgdmFsdWVJbnQgPSAoaW50KXZhbHVlOworICAgIGludDMyX3QgKnZhbHVlQnVmID0gKGludDMyX3QgKil2YWx1ZTsKKwogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBUUkFDSzoKICAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZSkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWUpOworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZUludCkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlSW50KSkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWVJbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWVJbnQpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bUFjdGl2ZVRyYWNrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IE1BSU5fQlVGRkVSKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0ubWFpbkJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKKyAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gQVVYX0JVRkZFUikgeworICAgICAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmF1eEJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmF1eEJ1ZmZlciA9IHZhbHVlQnVmOworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQVVYX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBSRVNBTVBMRToKICAgICAgICAgaWYgKG5hbWUgPT0gU0FNUExFX1JBVEUpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZUludCA+IDApIHsKICAgICAgICAgICAgICAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay5zZXRSZXNhbXBsZXIodWludDMyX3QodmFsdWUpLCBtU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2suc2V0UmVzYW1wbGVyKHVpbnQzMl90KHZhbHVlSW50KSwgbVNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihSRVNBTVBMRSwgU0FNUExFX1JBVEUsICV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCh2YWx1ZUludCkpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bUFjdGl2ZVRyYWNrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMjAxLDE4ICsyMjUsMzkgQEAKICAgICBjYXNlIFZPTFVNRToKICAgICAgICAgaWYgKCh1aW50MzJfdChuYW1lLVZPTFVNRTApIDwgTUFYX05VTV9DSEFOTkVMUykpIHsKICAgICAgICAgICAgIHRyYWNrX3QmIHRyYWNrID0gbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF07Ci0gICAgICAgICAgICBpZiAodHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay52b2x1bWVbbmFtZS1WT0xVTUUwXSAhPSB2YWx1ZUludCkgeworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIFZPTFVNRTAvMTogJTA0eCkiLCB2YWx1ZUludCk7CiAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdID0gdHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlSW50OwogICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlIDw8IDE2OworICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW25hbWUtVk9MVU1FMF0gPSB2YWx1ZUludCA8PCAxNjsKICAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lSW5jW25hbWUtVk9MVU1FMF0gPSAwOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZTw8MTYpIC0gdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXTsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZUluY1tuYW1lLVZPTFVNRTBdID0gdm9sSW5jOwogICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdID0gdmFsdWVJbnQgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBBVVhMRVZFTCkgeworICAgICAgICAgICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXTsKKyAgICAgICAgICAgIGlmICh0cmFjay5hdXhMZXZlbCAhPSB2YWx1ZUludCkgeworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIEFVWExFVkVMOiAlMDR4KSIsIHZhbHVlSW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB0cmFjay5hdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgICAgICB0cmFjay5hdXhMZXZlbCA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OworICAgICAgICAgICAgICAgICAgICB0cmFjay5hdXhJbmMgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldkF1eExldmVsOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbEluYyA9IGQgLyBpbnQzMl90KG1TdGF0ZS5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gdm9sSW5jOworICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOwpAQCAtMjQ1LDcgKzI5MCw3IEBACiB9CiAKIGlubGluZQotdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCkKIHsKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKICAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8CkBAIC0yNTQsNiArMjk5LDEzIEBACiAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldPDwxNjsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoYXV4KSB7CisgICAgICAgIGlmICgoKGF1eEluYz4wKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpID49IGF1eExldmVsKSkgfHwKKyAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgeworICAgICAgICAgICAgYXV4SW5jID0gMDsKKyAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsPDwxNjsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0yNjUsMTMgKzMxNywxMyBAQAogCiAKIAotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzKHZvaWQqIG91dHB1dCkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2VzcygpCiB7Ci0gICAgbVN0YXRlLmhvb2soJm1TdGF0ZSwgb3V0cHV0KTsKKyAgICBtU3RhdGUuaG9vaygmbVN0YXRlKTsKIH0KIAogCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlKQogewogICAgIExPR1dfSUYoIXN0YXRlLT5uZWVkc0NoYW5nZWQsCiAgICAgICAgICJpbiBwcm9jZXNzX192YWxpZGF0ZSgpIGJ1dCBub3RoaW5nJ3MgaW52YWxpZCIpOwpAQCAtMzA4LDcgKzM2MCwxMCBAQAogICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQuY2hhbm5lbENvdW50IC0gMTsKICAgICAgICAgbiB8PSBORUVEU19GT1JNQVRfMTY7CiAgICAgICAgIG4gfD0gdC5kb2VzUmVzYW1wbGUoKSA/IE5FRURTX1JFU0FNUExFX0VOQUJMRUQgOiBORUVEU19SRVNBTVBMRV9ESVNBQkxFRDsKLSAgICAgICAKKyAgICAgICAgaWYgKHQuYXV4TGV2ZWwgIT0gMCAmJiB0LmF1eEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX0FVWF9FTkFCTEVEOworICAgICAgICB9CisKICAgICAgICAgaWYgKHQudm9sdW1lSW5jWzBdfHQudm9sdW1lSW5jWzFdKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wID0gMTsKICAgICAgICAgfSBlbHNlIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKQEAgLTMxOSw2ICszNzQsOSBAQAogICAgICAgICBpZiAoKG4gJiBORUVEU19NVVRFX19NQVNLKSA9PSBORUVEU19NVVRFX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSAwOwogICAgICAgICAgICAgICAgIHJlc2FtcGxpbmcgPSAxOwpAQCAtMzY5LDcgKzQyNyw3IEBACiAgICAgICAgIGNvdW50QWN0aXZlVHJhY2tzLCBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywKICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSwgcmVzYW1wbGluZywgdm9sdW1lUmFtcCk7CiAKLSAgIHN0YXRlLT5ob29rKHN0YXRlLCBvdXRwdXQpOworICAgc3RhdGUtPmhvb2soc3RhdGUpOwogCiAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCkBAIC0zOTAsNyArNDQ4LDcgQEAKICAgICAgICB9CiAgICAgICAgaWYgKGFsbE11dGVkKSB7CiAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgICAgIH0gZWxzZSBpZiAoIXJlc2FtcGxpbmcgJiYgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgeworICAgICAgIH0gZWxzZSBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgewogICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewogICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOwogICAgICAgICAgICB9CkBAIC00ODEsMzAgKzUzOSw0NCBAQAogfQogCiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQordm9pZCBBdWRpb01peGVyOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKICAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CiAKICAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCi0gICAgaWYgVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkgeworICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICAvLyBhbHdheXMgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHdoZW4gc2VuZGluZyB0byBhdXhpbGlhcnkgYnVmZmVyIHRvIGJlIGFibGUKKyAgICAgICAgLy8gdG8gYXBwbHkgc2VuZCBsZXZlbCBhZnRlciByZXNhbXBsaW5nCisgICAgICAgIC8vIFRPRE86IG1vZGlmeSBlYWNoIHJlc2FtcGxlciB0byBzdXBwb3J0IGF1eCBjaGFubmVsPwogICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKICAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBNQVhfTlVNX0NIQU5ORUxTICogc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wKTsKLSAgICB9CisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZVN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKKyAgICAgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOworICAgICAgICB9CiAKLSAgICAvLyBjb25zdGFudCBnYWluCi0gICAgZWxzZSB7Ci0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQordm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp2b2x1bWVSYW1wU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXApCit2b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQogewogICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwogICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOwpAQCAtNTE0LDk4ICs1ODYsMjM4IEBACiAgICAgLy9MT0dEKCJbMF0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAogICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKICAgICAvLyAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0gICAKKwogICAgIC8vIHJhbXAgdm9sdW1lCi0gICAgZG8gewotICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqICgqdGVtcCsrID4+IDEyKTsKLSAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7Ci0gICAgICAgIHZsICs9IHZsSW5jOwotICAgICAgICB2ciArPSB2ckluYzsKLSAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotCi0gICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKCk7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQotewotICAgIGludDE2X3QgY29uc3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPih0LT5pbik7Ci0KLSAgICAvLyByYW1wIGdhaW4KLSAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7Ci0gICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKLQotICAgICAgICAvLyBMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCi0gICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKKyAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKKyAgICAgICAgaW50MzJfdCBsOworICAgICAgICBpbnQzMl90IHI7CiAKICAgICAgICAgZG8gewotICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgIGwgPSAoKnRlbXArKyA+PiAxMik7CisgICAgICAgICAgICByID0gKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiByOworICAgICAgICAgICAgKmF1eCsrICs9ICh2YSA+PiAxNykgKiAobCArIHIpOworICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICB2ciArPSB2ckluYzsKKyAgICAgICAgICAgIHZhICs9IHZhSW5jOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqICgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogKCp0ZW1wKysgPj4gMTIpOwogICAgICAgICAgICAgdmwgKz0gdmxJbmM7CiAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLSAgICAgICAKLSAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoKTsKICAgICB9CisgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOworICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKChhdXggIT0gTlVMTCkpOworfQogCi0gICAgLy8gY29uc3RhbnQgZ2FpbgotICAgIGVsc2UgewotICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LT52b2x1bWVSTDsKK3ZvaWQgQXVkaW9NaXhlcjo6dm9sdW1lU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3sKKyAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOworICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisKKyAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOwotICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7Ci0gICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGRSTCgwLCBybCwgdnJsLCBvdXRbMV0pOworICAgICAgICAgICAgaW50MTZfdCBsID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgaW50MTZfdCByID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOworICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClsICsgcikgPj4gMSk7CisgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQociwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgIGF1eFswXSA9IG11bEFkZChhLCB2YSwgYXV4WzBdKTsKKyAgICAgICAgICAgIGF1eCsrOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludDE2X3QgbCA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIGludDE2X3QgciA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZChyLCB2ciwgb3V0WzFdKTsKICAgICAgICAgICAgIG91dCArPSAyOwogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgIH0KK30KKwordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3sKKyAgICBpbnQxNl90IGNvbnN0ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOworCisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBsOworICAgICAgICBpbnQzMl90IHI7CisgICAgICAgIC8vIHJhbXAgZ2FpbgorICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdfHQtPmF1eEluYykgeworICAgICAgICAgICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07CisgICAgICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKKyAgICAgICAgICAgIGludDMyX3QgdmEgPSB0LT5wcmV2QXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSB0LT5hdXhJbmM7CisgICAgICAgICAgICAvLyBMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAorICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGwgPSAoaW50MzJfdCkqaW4rKzsKKyAgICAgICAgICAgICAgICByID0gKGludDMyX3QpKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogcjsKKyAgICAgICAgICAgICAgICAqYXV4KysgKz0gKHZhID4+IDE3KSAqIChsICsgcik7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICAgICAgdmEgKz0gdmFJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworCisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdGFudCBnYWluCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCBjb25zdCAqPihpbik7CisgICAgICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClpblswXSArIGluWzFdKSA+PiAxKTsKKyAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7CisgICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkUkwoMCwgcmwsIHZybCwgb3V0WzFdKTsKKyAgICAgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgICAgICBhdXhbMF0gPSBtdWxBZGQoYSwgdmEsIGF1eFswXSk7CisgICAgICAgICAgICAgICAgYXV4Kys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmFtcCBnYWluCisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKworICAgICAgICAgICAgLy8gTE9HRCgiWzFdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKKyAgICAgICAgICAgICAgICB2ciArPSB2ckluYzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHQtPnZvbHVtZVJMOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOworICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkUkwoMSwgcmwsIHZybCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGRSTCgwLCBybCwgdnJsLCBvdXRbMV0pOworICAgICAgICAgICAgICAgIG91dCArPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0KICAgICB0LT5pbiA9IGluOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXApCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKICAgICBpbnQxNl90IGNvbnN0ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOwogCi0gICAgLy8gcmFtcCBnYWluCi0gICAgaWYgVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkgewotICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKLSAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07CisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gcmFtcCBnYWluCisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdC0+dm9sdW1lSW5jWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKIAotICAgICAgICAvLyBMT0dEKCJbMl0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAotICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIC8vIExPR0QoIlsyXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CiAKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaW50MzJfdCBsID0gKmluKys7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICB2bCArPSB2bEluYzsKLSAgICAgICAgICAgIHZyICs9IHZySW5jOwotICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgIAotICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcCgpOwotICAgIH0KLSAgICAvLyBjb25zdGFudCBnYWluCi0gICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07Ci0gICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOwotICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwotICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkKGwsIHZyLCBvdXRbMV0pOwotICAgICAgICAgICAgb3V0ICs9IDI7Ci0gICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogbDsKKyAgICAgICAgICAgICAgICAqYXV4KysgKz0gKHZhID4+IDE2KSAqIGw7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICAgICAgdmEgKz0gdmFJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworCisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KXQtPmF1eExldmVsOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQobCwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgYXV4WzBdID0gbXVsQWRkKGwsIHZhLCBhdXhbMF0pOworICAgICAgICAgICAgICAgIGF1eCsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJhbXAgZ2FpbgorICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07CisKKyAgICAgICAgICAgIC8vIExPR0QoIlsyXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKworICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQobCwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CiAgICAgfQogICAgIHQtPmluID0gaW47CiB9CkBAIC02MjQsMzcgKzgzNiw1NiBAQAogfQogCiAvLyBuby1vcCBjYXNlCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUpCiB7Ci0gICAgLy8gdGhpcyBhc3N1bWVzIG91dHB1dCAxNiBiaXRzIHN0ZXJlbywgbm8gcmVzYW1wbGluZwotICAgIG1lbXNldChvdXRwdXQsIDAsIHN0YXRlLT5mcmFtZUNvdW50KjQpOwotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgewotICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKLSAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgIGlmICghdC5idWZmZXIucmF3KSBicmVhazsKLSAgICAgICAgICAgIG91dEZyYW1lcyAtPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CisgICAgc2l6ZV90IGJ1ZlNpemUgPSBzdGF0ZS0+ZnJhbWVDb3VudCAqIHNpemVvZihpbnQxNl90KSAqIE1BWF9OVU1fQ0hBTk5FTFM7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCisgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCisgICAgICAgIHVpbnQzMl90IGUxID0gZTAsIGUyID0gZTA7CisgICAgICAgIGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKKyAgICAgICAgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICBlMiAmPSB+KDE8PGkpOworICAgICAgICB3aGlsZSAoZTIpIHsKKyAgICAgICAgICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTIpOworICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKKyAgICAgICAgICAgIHRyYWNrX3QmIHQyID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIFVOTElLRUxZKHQyLm1haW5CdWZmZXIgIT0gdDEubWFpbkJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZTAgJj0gfihlMSk7CisKKyAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIGJ1ZlNpemUpOworCisgICAgICAgIHdoaWxlIChlMSkgeworICAgICAgICAgICAgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOworICAgICAgICAgICAgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgeworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0MS5idWZmZXIpOworICAgICAgICAgICAgICAgIGlmICghdDEuYnVmZmVyLnJhdykgYnJlYWs7CisgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQxLmJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0MS5idWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiAvLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIHZvaWQqIG91dHB1dCkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKIHsKICAgICBpbnQzMl90IG91dFRlbXBbQkxPQ0tTSVpFICogTUFYX05VTV9DSEFOTkVMU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAogICAgIC8vIGFjcXVpcmUgZWFjaCB0cmFjaydzIGJ1ZmZlcgogICAgIHVpbnQzMl90IGVuYWJsZWRUcmFja3MgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICB1aW50MzJfdCBlbiA9IGVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICB1aW50MzJfdCBlMCA9IGVuYWJsZWRUcmFja3M7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUwKTsKKyAgICAgICAgZTAgJj0gfigxPDxpKTsKICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwpAQCAtNjY2LDExMCArODk3LDE1NiBAQAogICAgICAgICAgICAgZW5hYmxlZFRyYWNrcyAmPSB+KDE8PGkpOwogICAgIH0KIAotICAgIC8vIHRoaXMgYXNzdW1lcyBvdXRwdXQgMTYgYml0cyBzdGVyZW8sIG5vIHJlc2FtcGxpbmcKLSAgICBpbnQzMl90KiBvdXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4ob3V0cHV0KTsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7Ci0gICAgZG8gewotICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKG91dFRlbXApKTsKLQotICAgICAgICBlbiA9IGVuYWJsZWRUcmFja3M7Ci0gICAgICAgIHdoaWxlIChlbikgewotICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IEJMT0NLU0laRTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGluRnJhbWVzID0gKHQuZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHQuZnJhbWVDb3VudCA9PSAwICYmIG91dEZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICB9CisgICAgZTAgPSBlbmFibGVkVHJhY2tzOworICAgIHdoaWxlIChlMCkgeworICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IGJ1ZmZlciB0bworICAgICAgICAvLyBvcHRpbWl6ZSBjYWNoZSB1c2UKKyAgICAgICAgdWludDMyX3QgZTEgPSBlMCwgZTIgPSBlMDsKKyAgICAgICAgaW50IGogPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOworICAgICAgICB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3Nbal07CisgICAgICAgIGUyICY9IH4oMTw8aik7CisgICAgICAgIHdoaWxlIChlMikgeworICAgICAgICAgICAgaiA9IDMxIC0gX19idWlsdGluX2NseihlMik7CisgICAgICAgICAgICBlMiAmPSB+KDE8PGopOworICAgICAgICAgICAgdHJhY2tfdCYgdDIgPSBzdGF0ZS0+dHJhY2tzW2pdOworICAgICAgICAgICAgaWYgVU5MSUtFTFkodDIubWFpbkJ1ZmZlciAhPSB0MS5tYWluQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgQkxPQ0tTSVpFKTsKLSAgICAgICAgb3V0ICs9IEJMT0NLU0laRTsKLSAgICAgICAgbnVtRnJhbWVzIC09IEJMT0NLU0laRTsKLSAgICB9IHdoaWxlIChudW1GcmFtZXMpOwotCisgICAgICAgIGUwICY9IH4oZTEpOworICAgICAgICAvLyB0aGlzIGFzc3VtZXMgb3V0cHV0IDE2IGJpdHMgc3RlcmVvLCBubyByZXNhbXBsaW5nCisgICAgICAgIGludDMyX3QgKm91dCA9IHQxLm1haW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBudW1GcmFtZXMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKG91dFRlbXApKTsKKyAgICAgICAgICAgIGUyID0gZTE7CisgICAgICAgICAgICB3aGlsZSAoZTIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMik7CisgICAgICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOworICAgICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyICsgbnVtRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LmZyYW1lQ291bnQgPiBvdXRGcmFtZXMpP291dEZyYW1lczp0LmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodC5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gKHN0YXRlLT5mcmFtZUNvdW50IC0gbnVtRnJhbWVzKSAtIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCA9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7CisgICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOworICAgICAgICAgICAgbnVtRnJhbWVzICs9IEJMT0NLU0laRTsKKyAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgc3RhdGUtPmZyYW1lQ291bnQpOworICAgIH0KIAogICAgIC8vIHJlbGVhc2UgZWFjaCB0cmFjaydzIGJ1ZmZlcgotICAgIGVuID0gZW5hYmxlZFRyYWNrczsKLSAgICB3aGlsZSAoZW4pIHsKLSAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgICAgICBlbiAmPSB+KDE8PGkpOworICAgIGUwID0gZW5hYmxlZFRyYWNrczsKKyAgICB3aGlsZSAoZTApIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTApOworICAgICAgICBlMCAmPSB+KDE8PGkpOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOwogICAgIH0KIH0KIAotLy8gZ2VuZXJpYyBjb2RlIHdpdGggcmVzYW1wbGluZwotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQorCisgIC8vIGdlbmVyaWMgY29kZSB3aXRoIHJlc2FtcGxpbmcKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpCiB7CiAgICAgaW50MzJfdCogY29uc3Qgb3V0VGVtcCA9IHN0YXRlLT5vdXRwdXRUZW1wOwogICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGludDMyX3QpICogTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50OwogICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplKTsKIAotICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOwogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKIAotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBhIGxpdHRsZSBnb29meSwgb24gdGhlIHJlc2FtcGxpbmcgY2FzZSB3ZSBkb24ndAotICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKLSAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KLSAgICAgICAgaWYgKCh0Lm5lZWRzICYgTkVFRFNfUkVTQU1QTEVfX01BU0spID09IE5FRURTX1JFU0FNUExFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXApOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gbnVtRnJhbWVzOwotICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOwotICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgICAgIC8vIHQuaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwotICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAobnVtRnJhbWVzLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgdC5idWZmZXIuZnJhbWVDb3VudCwgc3RhdGUtPnJlc2FtcGxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQuYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyCisgICAgICAgIC8vIHRvIG9wdGltaXplIGNhY2hlIHVzZQorICAgICAgICB1aW50MzJfdCBlMSA9IGUwLCBlMiA9IGUwOworICAgICAgICBpbnQgaiA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgIHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tqXTsKKyAgICAgICAgZTIgJj0gfigxPDxqKTsKKyAgICAgICAgd2hpbGUgKGUyKSB7CisgICAgICAgICAgICBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKKyAgICAgICAgICAgIGUyICY9IH4oMTw8aik7CisgICAgICAgICAgICB0cmFja190JiB0MiA9IHN0YXRlLT50cmFja3Nbal07CisgICAgICAgICAgICBpZiBVTkxJS0VMWSh0Mi5tYWluQnVmZmVyICE9IHQxLm1haW5CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBlMSAmPSB+KDE8PGopOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQorICAgICAgICBlMCAmPSB+KGUxKTsKKyAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKKyAgICAgICAgd2hpbGUgKGUxKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOworICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOworICAgICAgICAgICAgaWYgVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CisgICAgICAgICAgICB9CiAKLSAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIGdvb2Z5LCBvbiB0aGUgcmVzYW1wbGluZyBjYXNlIHdlIGRvbid0CisgICAgICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKKyAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIuCisgICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IDA7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzIDwgbnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSBvdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCArIG91dEZyYW1lcypNQVhfTlVNX0NIQU5ORUxTLCB0LmJ1ZmZlci5mcmFtZUNvdW50LCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOworICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgfQogfQogCiAvLyBvbmUgdHJhY2ssIDE2IGJpdHMgc3RlcmVvIHdpdGhvdXQgcmVzYW1wbGluZyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZQotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKIHsKICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CiAgICAgY29uc3QgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOwotICAgCi0gICAgaW50MzJfdCogb3V0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KG91dHB1dCk7CisKKyAgICBpbnQzMl90KiBvdXQgPSB0Lm1haW5CdWZmZXI7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwotICAKKwogICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LnZvbHVtZVswXTsKICAgICBjb25zdCBpbnQxNl90IHZyID0gdC52b2x1bWVbMV07CiAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC52b2x1bWVSTDsKQEAgLTc4Nyw3ICsxMDY0LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OwotICAgICAgIAorCiAgICAgICAgIGlmIChVTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU4pKSB7CiAgICAgICAgICAgICAvLyB2b2x1bWUgaXMgYm9vc3RlZCwgc28gd2UgbWlnaHQgbmVlZCB0byBjbGFtcCBldmVuIHRob3VnaAogICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KQEAgLTgxNiw3ICsxMDkzLDkgQEAKIH0KIAogLy8gMiB0cmFja3MgaXMgYWxzbyBhIGNvbW1vbiBjYXNlCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQorLy8gTkVWRVIgdXNlZCBpbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3NfX3ZhbGlkYXRlKCkKKy8vIG9ubHkgdXNlIGlmIHRoZSAyIHRyYWNrcyBoYXZlIHRoZSBzYW1lIG91dHB1dCBidWZmZXIKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fVHdvVHJhY2tzMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKQogewogICAgIGludCBpOwogICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CkBAIC04MjksMjQgKzExMDgsMjUgQEAKICAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICBjb25zdCB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMSh0MS5idWZmZXIpOwotICAgCisKICAgICBpbnQxNl90IGNvbnN0ICppbjA7CiAgICAgY29uc3QgaW50MTZfdCB2bDAgPSB0MC52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2cjAgPSB0MC52b2x1bWVbMV07CiAgICAgc2l6ZV90IGZyYW1lQ291bnQwID0gMDsKLSAgCisKICAgICBpbnQxNl90IGNvbnN0ICppbjE7CiAgICAgY29uc3QgaW50MTZfdCB2bDEgPSB0MS52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2cjEgPSB0MS52b2x1bWVbMV07CiAgICAgc2l6ZV90IGZyYW1lQ291bnQxID0gMDsKLSAgIAotICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOworCisgICAgLy9GSVhNRTogb25seSB3b3JrcyBpZiB0d28gdHJhY2tzIHVzZSBzYW1lIGJ1ZmZlcgorICAgIGludDMyX3QqIG91dCA9IHQwLm1haW5CdWZmZXI7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogICAgIGludDE2X3QgY29uc3QgKmJ1ZmYgPSBOVUxMOwogCi0gIAorCiAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgCisKICAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKICAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CiAgICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjApOwpAQCAtODc1LDEzICsxMTU1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmcmFtZUNvdW50MSA9IGIxLmZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICAgICAKKwogICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gZnJhbWVDb3VudDAgPCBmcmFtZUNvdW50MT9mcmFtZUNvdW50MDpmcmFtZUNvdW50MTsKIAogICAgICAgICBudW1GcmFtZXMgLT0gb3V0RnJhbWVzOwogICAgICAgICBmcmFtZUNvdW50MCAtPSBvdXRGcmFtZXM7CiAgICAgICAgIGZyYW1lQ291bnQxIC09IG91dEZyYW1lczsKLSAgICAgICAKKwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBpbnQzMl90IGwwID0gKmluMCsrOwogICAgICAgICAgICAgaW50MzJfdCByMCA9ICppbjArKzsKQEAgLTg5NiwxNyArMTE3NiwxNyBAQAogICAgICAgICAgICAgciA9IGNsYW1wMTYocik7CiAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwogICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7Ci0gICAgICAgCisKICAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKICAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMSk7CiAgICAgICAgIH0KLSAgICB9ICAgCi0gICAgICAgCisgICAgfQorCiAgICAgaWYgKGJ1ZmYgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgW10gYnVmZjsgICAgICAgCisgICAgICAgIGRlbGV0ZSBbXSBidWZmOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggMTU3NjZjZC4uYWVlM2UxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC02MywxMSArNjMsMTQgQEAKICAgICAgICAgLy8gZm9yIHRhcmdldCBUUkFDSwogICAgICAgICBDSEFOTkVMX0NPVU5UICAgPSAweDQwMDAsCiAgICAgICAgIEZPUk1BVCAgICAgICAgICA9IDB4NDAwMSwKKyAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAorICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCiAgICAgICAgIC8vIGZvciBUQVJHRVQgUkVTQU1QTEUKICAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLAogICAgICAgICAvLyBmb3IgVEFSR0VUIFZPTFVNRSAoOCBjaGFubmVscyBtYXgpCiAgICAgICAgIFZPTFVNRTAgICAgICAgICA9IDB4NDIwMCwKICAgICAgICAgVk9MVU1FMSAgICAgICAgID0gMHg0MjAxLAorICAgICAgICBBVVhMRVZFTCAgICAgICAgPSAweDQyMTAsCiAgICAgfTsKIAogCkBAIC03OCwxMCArODEsMTAgQEAKICAgICBzdGF0dXNfdCAgICBkaXNhYmxlKGludCBuYW1lKTsKIAogICAgIHN0YXR1c190ICAgIHNldEFjdGl2ZVRyYWNrKGludCB0cmFjayk7Ci0gICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCB0YXJnZXQsIGludCBuYW1lLCBpbnQgdmFsdWUpOworICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQgdGFyZ2V0LCBpbnQgbmFtZSwgdm9pZCAqdmFsdWUpOwogCiAgICAgc3RhdHVzX3QgICAgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciogYnVmZmVyUHJvdmlkZXIpOwotICAgIHZvaWQgICAgICAgIHByb2Nlc3Modm9pZCogb3V0cHV0KTsKKyAgICB2b2lkICAgICAgICBwcm9jZXNzKCk7CiAKICAgICB1aW50MzJfdCAgICB0cmFja05hbWVzKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrTmFtZXM7IH0KIApAQCAtOTQsNiArOTcsNyBAQAogICAgICAgICBORUVEU19GT1JNQVRfX01BU0sgICAgICAgICAgPSAweDAwMDAwMEYwLAogICAgICAgICBORUVEU19NVVRFX19NQVNLICAgICAgICAgICAgPSAweDAwMDAwMTAwLAogICAgICAgICBORUVEU19SRVNBTVBMRV9fTUFTSyAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVhfX01BU0sgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTEwNyw2ICsxMTEsOSBAQAogCiAgICAgICAgIE5FRURTX1JFU0FNUExFX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCiAgICAgICAgIE5FRURTX1JFU0FNUExFX0VOQUJMRUQgICAgICA9IDB4MDAwMDEwMDAsCisKKyAgICAgICAgTkVFRFNfQVVYX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgIE5FRURTX0FVWF9FTkFCTEVEICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBzdGF0aWMgaW5saW5lIGludDMyX3QgYXBwbHlWb2x1bWUoaW50MzJfdCBpbiwgaW50MzJfdCB2KSB7CkBAIC0xMTUsOSArMTIyLDEwIEBACiAKIAogICAgIHN0cnVjdCBzdGF0ZV90OworICAgIHN0cnVjdCB0cmFja190OwogCi0gICAgdHlwZWRlZiB2b2lkICgqbWl4X3QpKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotCisgICAgdHlwZWRlZiB2b2lkICgqbWl4X3QpKHN0YXRlX3QqIHN0YXRlKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpob29rX3QpKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKICAgICBzdGF0aWMgY29uc3QgaW50IEJMT0NLU0laRSA9IDE2OyAvLyA0IGNhY2hlIGxpbmVzCiAKICAgICBzdHJ1Y3QgdHJhY2tfdCB7CkBAIC0xMzEsNiArMTM5LDkgQEAKICAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVsyXTsKIAogICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbMl07CisgICAgICAgIGludDMyX3QgICAgIGF1eExldmVsOworICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CisgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKIAogICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OwogCkBAIC0xNDIsMTUgKzE1MywxNyBAQAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgICAgICAgICAgICBidWZmZXJQcm92aWRlcjsKICAgICAgICAgbXV0YWJsZSBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwogCi0gICAgICAgIHZvaWQgKCpob29rKSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXApOworICAgICAgICBob29rX3QgICAgICBob29rOwogICAgICAgICB2b2lkIGNvbnN0KiBpbjsgICAgICAgICAgICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbiBidWZmZXIKIAogICAgICAgICBBdWRpb1Jlc2FtcGxlciogICAgIHJlc2FtcGxlcjsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBzYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90KiAgICAgICAgICAgbWFpbkJ1ZmZlcjsKKyAgICAgICAgaW50MzJfdCogICAgICAgICAgIGF1eEJ1ZmZlcjsKIAogICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKCk7CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgpOwogICAgIH07CiAKICAgICAvLyBwYWQgdG8gMzItYnl0ZXMgdG8gZmlsbCBjYWNoZSBsaW5lCkBAIC0xNzMsMTggKzE4NiwxOSBAQAogCiAgICAgdm9pZCBpbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzayk7CiAKLSAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXApOwotICAgIHN0YXRpYyB2b2lkIHZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXApOwotICAgIHN0YXRpYyB2b2lkIHRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgIHN0YXRpYyB2b2lkIHZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKyAgICBzdGF0aWMgdm9pZCB2b2x1bWVTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKIAotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX192YWxpZGF0ZShzdGF0ZV90KiBzdGF0ZSk7CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpOworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKaW5kZXggYzhiM2Y0OC4uNDI1Y2EzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIC8vIHJlcXVlc3Qgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIHVpbnQzMl90IG5ld0RldmljZSA9IGdldE5ld0RldmljZShtSGFyZHdhcmVPdXRwdXQsIGZhbHNlKTsKICNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKG5ld0RldmljZSk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogICAgICAgICAvLyBBMkRQIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKICAgICAgICAgaWYgKHN0YXRlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUgJiYgQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICBjbG9zZUEyZHBPdXRwdXRzKCk7CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCiAgICAgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwogI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyhuZXdEZXZpY2UpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWYgYSBTQ08gZGV2aWNlIGlzIHByZXNlbnQuCiAgICAgaWYgKG1BMmRwT3V0cHV0ICE9IDAgJiYgbVNjb0RldmljZUFkZHJlc3MgIT0gIiIpIHsKICAgICAgICAgaWYgKG9sZFN0YXRlID09IEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCkgewpAQCAtMzg2LDEzICszODYsMjggQEAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCiAgICAgdWludDMyX3QgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwogI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyhuZXdEZXZpY2UpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogI2VuZGlmCiAgICAgdXBkYXRlRGV2aWNlRm9yU3RyYXRlZ3koKTsKICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCBuZXdEZXZpY2UpOwogICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCkgewogICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMobUhhcmR3YXJlT3V0cHV0LCBuZXdEZXZpY2UpOwogICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7CisgICAgICAgIG5ld0RldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKyAgICAgICAgaWYgKG5ld0RldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHsKKyAgICAgICAgICAgIExPR1YoInNldEZvcmNlVXNlKCkgY2hhbmdpbmcgZGV2aWNlIGZyb20gJXggdG8gJXggZm9yIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBuZXdEZXZpY2UsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IG5ld0RldmljZTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCluZXdEZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoYWN0aXZlSW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCiB9CiAKIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpCkBAIC01MzgsOSArNTUzLDExIEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIExPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQiLCBvdXRwdXQsIHN0cmVhbSk7CisgICAgTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3cgb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTU3NCw5ICs1OTEsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIExPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCIsIG91dHB1dCwgc3RyZWFtKTsKKyAgICBMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiAgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgIExPR1coInN0b3BPdXRwdXQoKSB1bmtub3cgb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTYwMiw4ICs2MjEsMTIgQEAKICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZ2V0TmV3RGV2aWNlKG91dHB1dCkpOwogCiAjaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgIGlmIChtQTJkcE91dHB1dCAhPSAwICYmICFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbUEyZHBPdXRwdXQsIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPm1MYXRlbmN5KjIpOworICAgICAgICBpZiAobUEyZHBPdXRwdXQgIT0gMCAmJiAhYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSAmJgorICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPm1MYXRlbmN5KjIpOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgaWYgKG91dHB1dCAhPSBtSGFyZHdhcmVPdXRwdXQpIHsKQEAgLTgyNiw2ICs4NDksODUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIExPR1YoImdldE91dHB1dEZvckVmZmVjdCgpIik7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisgICAgcmV0dXJuIGdldE91dHB1dChBdWRpb1N5c3RlbTo6TVVTSUMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBMT0dXKCJyZWdpc3RlckVmZmVjdCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCArIGRlc2MtPmNwdUxvYWQgPiBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpKSB7CisgICAgICAgIExPR1coInJlZ2lzdGVyRWZmZWN0KCkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgKGZsb2F0KWRlc2MtPmNwdUxvYWQvMTApOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKKyAgICAgICAgTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBkZXNjLT5jcHVMb2FkOworICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgKz0gZGVzYy0+bWVtb3J5VXNhZ2U7CisgICAgTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIG91dHB1dCAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBvdXRwdXQsIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisKKyAgICBMT0dWKCJyZWdpc3RlckVmZmVjdCgpIENQVSAlZCwgbWVtb3J5ICVkIiwgZGVzYy0+Y3B1TG9hZCwgZGVzYy0+bWVtb3J5VXNhZ2UpOworICAgIExPR1YoIiAgdG90YWwgQ1BVICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBFZmZlY3REZXNjcmlwdG9yICpwRGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7CisgICAgbWVtY3B5ICgmcERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIHBEZXNjLT5tT3V0cHV0ID0gb3V0cHV0OworICAgIHBEZXNjLT5tU3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneTsKKyAgICBwRGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIG1FZmZlY3RzLmFkZChpZCwgcERlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBFZmZlY3REZXNjcmlwdG9yICpwRGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgcERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKKyAgICAgICAgTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgcERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gcERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpIHsKKyAgICAgICAgTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICAgICAgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSAtPSBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIENQVSAlZCwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIHBEZXNjLT5tRGVzYy5uYW1lLCBpZCwgcERlc2MtPm1EZXNjLmNwdUxvYWQsIHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSk7CisgICAgTE9HVigiICB0b3RhbCBDUFUgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIG1FZmZlY3RzLnJlbW92ZUl0ZW0oaWQpOworICAgIGRlbGV0ZSBwRGVzYzsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC04OTAsNiArOTkyLDE5IEBACiAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICB9CiAKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCisgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTkwMiw3ICsxMDE3LDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLAorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtOTM4LDYgKzEwNTQsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGFkZE91dHB1dChtSGFyZHdhcmVPdXRwdXQsIG91dHB1dERlc2MpOwogICAgICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCAodWludDMyX3QpQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUiwgdHJ1ZSk7CisgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQogICAgIH0KIAogICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7CkBAIC0xMTUyLDYgKzEyNjksOSBAQAogICAgIGlmIChtQTJkcE91dHB1dCkgewogICAgICAgICAvLyBhZGQgQTJEUCBvdXRwdXQgZGVzY3JpcHRvcgogICAgICAgICBhZGRPdXRwdXQobUEyZHBPdXRwdXQsIG91dHB1dERlc2MpOworCisgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCiAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIEEyRFAgZGV2aWNlCiAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhtQTJkcE91dHB1dCwgZGV2aWNlKTsKICAgICAgICAgaWYgKGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkpIHsKQEAgLTEyNDksNiArMTM2OSwxNyBAQAogICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNsb3NpbmcgQTJEUCBhbmQgZHVwbGljYXRlZCBvdXRwdXQhIik7CiAKICAgICBpZiAobUR1cGxpY2F0ZWRPdXRwdXQgIT0gMCkgeworICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKKyAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiBoYXJkd2FyZSBvdXRwdXQsIHRoZSByZWZlcmVuY2UKKyAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgLy8gaGFyZHdhcmUgb3V0cHV0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgeworICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2ldOworICAgICAgICAgICAgaHdPdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksLXJlZkNvdW50KTsKKyAgICAgICAgfQorCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtRHVwbGljYXRlZE91dHB1dCk7CiAgICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7CiAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obUR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtMTI1OCw2ICsxMzg5LDcgQEAKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1BMmRwT3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKKwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobUEyZHBPdXRwdXQpOwogICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVGb3IobUEyZHBPdXRwdXQpOwogICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG1BMmRwT3V0cHV0KTsKQEAgLTEyNjUsNzggKzEzOTcsNjUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCAmbmV3RGV2aWNlKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCiB7CiAgICAgdWludDMyX3QgcHJldkRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKICAgICB1aW50MzJfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UpOwogICAgIGJvb2wgYTJkcFdhc1VzZWQgPSBBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcykocHJldkRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7CiAgICAgYm9vbCBhMmRwSXNVc2VkID0gQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZSgoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMpKGN1ckRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqYTJkcE91dHB1dERlc2M7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSAwOwogCiAgICAgaWYgKGEyZHBXYXNVc2VkICYmICFhMmRwSXNVc2VkKSB7CiAgICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcFdhc1VzZWQgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChwcmV2RGV2aWNlKSA9PSAyKTsKLQorICAgICAgICBkc3RPdXRwdXQgPSBtSGFyZHdhcmVPdXRwdXQ7CiAgICAgICAgIGlmIChkdXBVc2VkKSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIHRvIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBkdXBsaWNhdGVkIiwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUR1cGxpY2F0ZWRPdXRwdXQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIHRvIGEyZHAiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1PdXRwdXQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGEyZHBPdXRwdXREZXNjLT5tUmVmQ291bnRbaV07Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgZHVwbGljYXRlZCBvdXRwdXQsIHRoZSByZWYgY291bnQgaXMgZmlyc3QgaW5jcmVtZW50ZWQKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBkZWNyZW1lbnRlZCBvbiBoYXJkd2FyZSBvdXRwdXQgdHVzIGtlZXBpbmcgaXRzIHZhbHVlCi0gICAgICAgICAgICAgICAgaHdPdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksIHJlZkNvdW50KTsKLSAgICAgICAgICAgICAgICBhMmRwT3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLC1yZWZDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG8gbm90IGNoYW5nZSBuZXdEZXZpY2UgaWYgaXQgd2FzIGFscmVhZHkgc2V0IGJlZm9yZSB0aGlzIGNhbGwgYnkgYSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgIC8vIGdldE5ld0RldmljZSgpIG9yIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBmb3IgYSBzdHJhdGVneSB3aXRoIGhpZ2hlciBwcmlvcml0eQotICAgICAgICBpZiAobmV3RGV2aWNlID09IDAgJiYgaHdPdXRwdXREZXNjLT5pc1VzZWRCeVN0cmF0ZWd5KHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlKTsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBhMmRwIiwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUEyZHBPdXRwdXQ7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGEyZHBJc1VzZWQgJiYgIWEyZHBXYXNVc2VkKSB7CiAgICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcElzVXNlZCAmJiAoQXVkaW9TeXN0ZW06OnBvcENvdW50KGN1ckRldmljZSkgPT0gMik7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQ7Ci0KKyAgICAgICAgc3JjT3V0cHV0ID0gbUhhcmR3YXJlT3V0cHV0OwogICAgICAgICBpZiAoZHVwVXNlZCkgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCBmcm9tIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgICAgIGEyZHBPdXRwdXQgPSBtRHVwbGljYXRlZE91dHB1dDsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gZHVwbGljYXRlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRzdE91dHB1dCA9IG1EdXBsaWNhdGVkT3V0cHV0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCBmcm9tIGEyZHAiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIGEyZHBPdXRwdXQgPSBtQTJkcE91dHB1dDsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gYTJkcCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRzdE91dHB1dCA9IG1BMmRwT3V0cHV0OwogICAgICAgICB9CisgICAgfQogCisgICAgaWYgKHNyY091dHB1dCAhPSAwICYmIGRzdE91dHB1dCAhPSAwKSB7CisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBFZmZlY3REZXNjcmlwdG9yICpkZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tU2Vzc2lvbiAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVN0cmF0ZWd5ID09IHN0cmF0ZWd5ICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1PdXRwdXQgPT0gc3JjT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwgbUVmZmVjdHMua2V5QXQoaSksIGRzdE91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKGRlc2MtPm1TZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgICAgICAgICAgZGVzYy0+bU91dHB1dCA9IGRzdE91dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewogICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtT3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwgYTJkcE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gaHdPdXRwdXREZXNjLT5tUmVmQ291bnRbaV07Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgZHVwbGljYXRlZCBvdXRwdXQsIHRoZSByZWYgY291bnQgaXMgZmlyc3QgaW5jcmVtZW50ZWQKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBkZWNyZW1lbnRlZCBvbiBoYXJkd2FyZSBvdXRwdXQgdHVzIGtlZXBpbmcgaXRzIHZhbHVlCi0gICAgICAgICAgICAgICAgYTJkcE91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwgcmVmQ291bnQpOwotICAgICAgICAgICAgICAgIGh3T3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLC1yZWZDb3VudCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbU91dHB1dCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksIGRzdE91dHB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKHVpbnQzMl90ICZuZXdEZXZpY2UpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiB7Ci0gICAgLy8gQ2hlY2sgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eSBzbyB0aGF0IG9uY2UgbmV3RGV2aWNlIGlzIHNldAotICAgIC8vIGZvciBhIGdpdmVuIHN0cmF0ZWd5IGl0IGlzIG5vdCBtb2RpZmllZCBieSBzdWJzZXF1ZW50IGNhbGxzIHRvCi0gICAgLy8gY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpCi0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgbmV3RGV2aWNlKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgbmV3RGV2aWNlKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBuZXdEZXZpY2UpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgbmV3RGV2aWNlKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKIH0KIAogI2VuZGlmCkBAIC0xMzcwLDggKzE0ODksMTIgQEAKICAgICByZXR1cm4gZGV2aWNlOwogfQogCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCi17Cit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7CisgICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldFN0cmF0ZWd5KAorICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7CiAgICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgIGNhc2UgQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEw6CkBAIC0xODM1LDYgKzE5NTgsMTYgQEAKICAgICAgICAgICAoZm9ybWF0ICE9MCAmJiAhQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpKTsKIH0KIAordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c01lbW9yeSgpCit7CisgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKK30KKwogLy8gLS0tIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgogCiBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpCkBAIC0xOTY4LDUgKzIxMDEsMjcgQEAKICAgICAgICAgICAgIG1DYW5CZU11dGVkKTsKIH0KIAorLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6RWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgT3V0cHV0OiAlZFxuIiwgbU91dHB1dCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBiYjM5MDVjLi5mMjRlMDhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTE5LDcgKzExOSw4IEBACiAgICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoZGV2aWNlKSAmJiAhQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYgc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgeworICAgIGlmIChzdGF0ZSAhPSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTI4LDggKzEyOSw5IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKIH0KIAotQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCitBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwpAQCAtMTc1LDcgKzE3Nyw4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZykKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTIyMywyNCArMjI2LDI4IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RhcnRPdXRwdXQoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSk7CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RvcE91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0pOworICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCkBAIC0zMzksOCArMzQ2LDQ2IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CiB9CiAKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3sKKyAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgb3V0cHV0LCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIHRpZCAlZCwgY2FsbGluZyB0aWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLCBnZXR0aWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIHRpZCAlZCwgY2FsbGluZyB0aWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLCBnZXR0aWQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiB9CiAKIHN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQpAQCAtNDQ3LDEwICs0OTIsMTYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCAodWludDMyX3QgKilwRm9ybWF0LCBwQ2hhbm5lbHMsIHBMYXRlbmN5TXMsIGZsYWdzKTsKKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQocERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKXBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6b3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCiB7CiAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgewpAQCAtNTE0LDEyICs1NjUsMTYgQEAKICAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoKGludClzdHJlYW0sIHZvbHVtZSwgKGludClvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogewogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKQEAgLTUyNyw4ICs1ODIsMTggQEAKICAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zKQorICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgKGludClzcmNPdXRwdXQsIChpbnQpZHN0T3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoKGludClpb0hhbmRsZSwga2V5VmFsdWVQYWlycywgZGVsYXlNcyk7CiB9CkBAIC01MzksNyArNjA0LDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdG9uZSwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKIHsKICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKHRvbmUsIHN0cmVhbSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNjIzLDggKzY4OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CkBAIC02MzMsNyArNzAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwpAQCAtNjQzLDcgKzcxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLCBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7CkBAIC03MzQsNyArODA1LDEwIEBACiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGludCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgaW50IG91dHB1dCwgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChpbnQgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCkBAIC03NTIsNyArODI2LDggQEAKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQpOworICAgIExPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CiAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwpAQCAtNzYyLDcgKzgzNyw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnBhcmFtZXRlcnNDb21tYW5kKGludCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cGFyYW1ldGVyc0NvbW1hbmQoaW50IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKQEAgLTc3OSw3ICs4NTYsOCBAQAogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBpb0hhbmRsZSwgZGVsYXlNcyk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CiAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwpAQCAtODQwLDcgKzkxOCw4IEBACiAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07CiAgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwotICAgICAgICAgICAgTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBMT0dWKCJDb21wYXJpbmcgcGFyYW1ldGVyIGNvbW1hbmQgJXMgdG8gbmV3IGNvbW1hbmQgJXMiLAorICAgICAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGF0YS0+bUtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0yID0gQXVkaW9QYXJhbWV0ZXIoZGF0YTItPm1LZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGFyYW0uc2l6ZSgpOyBqKyspIHsKQEAgLTg3Miw3ICs5NTEsOCBAQAogICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YTIgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07CiAgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwogICAgICAgICAgICAgaWYgKGRhdGEtPm1TdHJlYW0gIT0gZGF0YTItPm1TdHJlYW0pIGJyZWFrOwotICAgICAgICAgICAgTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICBMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKICAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVJUX1RPTkU6CkBAIC04OTYsNyArOTc2LDggQEAKICAgICByZW1vdmVkQ29tbWFuZHMuY2xlYXIoKTsKIAogICAgIC8vIGluc2VydCBjb21tYW5kIGF0IHRoZSByaWdodCBwbGFjZSBhY2NvcmRpbmcgdG8gaXRzIHRpbWUgc3RhbXAKLSAgICBMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsIGNvbW1hbmQtPm1Db21tYW5kLCAoaW50KWkrMSwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICBMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsCisgICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgKGludClpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7CiAgICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYTEzZDBiZC4uNTU4ZjQ1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjgsNyArMjgsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvUG9saWN5U2VydmljZTogcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLCBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UsIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlOiBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKKyAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKIHsKIAogcHVibGljOgpAQCAtNDMsOCArNDQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoaW50IHN0YXRlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzayk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlLCBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcpOwpAQCAtNTMsMTUgKzU1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19JTkRJUkVDVCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OkZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPSAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcykwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CkBAIC03MSw2ICs3OSwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpOwogCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtODksNyArMTA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwpAQCAtOTksMTMgKzExOCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjb3VzdGljcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHRvbmUsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBkZjVjMTY2Li44Nzk3NWFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEsMTUgKzEsMTQgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIFNldCBVU0VfQ0FNRVJBX1NUVUIgZm9yIG5vbi1lbXVsYXRvciBhbmQgbm9uLXNpbXVsYXRvciBidWlsZHMsIGlmIHlvdSB3YW50Ci0jIHRoZSBjYW1lcmEgc2VydmljZSB0byB1c2UgdGhlIGZha2UgY2FtZXJhLiAgRm9yIGVtdWxhdG9yIG9yIHNpbXVsYXRvciBidWlsZHMsCi0jIHdlIGFsd2F5cyB1c2UgdGhlIGZha2UgY2FtZXJhLgorIyBTZXQgVVNFX0NBTUVSQV9TVFVCIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgaGFyZHdhcmUgY2FtZXJhLgorCisjIGZvcmNlIHRoZXNlIGJ1aWxkcyB0byB1c2UgY2FtZXJhIHN0dWIgb25seQoraWZuZXEgKCQoZmlsdGVyIHNvb25lciBnZW5lcmljIHNpbSwkKFRBUkdFVF9ERVZJQ0UpKSwpCisgIFVTRV9DQU1FUkFfU1RVQjo9dHJ1ZQorZW5kaWYKIAogaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLCkKLVVTRV9DQU1FUkFfU1RVQjo9ZmFsc2UKLWlmbmVxICgkKGZpbHRlciBzb29uZXIgZ2VuZXJpYyBzaW0sJChUQVJHRVRfREVWSUNFKSksKQotVVNFX0NBTUVSQV9TVFVCOj10cnVlCi1lbmRpZiAjbGliY2FtZXJhc3R1YgorICBVU0VfQ0FNRVJBX1NUVUI6PWZhbHNlCiBlbmRpZgogCiBpZmVxICgkKFVTRV9DQU1FUkFfU1RVQiksdHJ1ZSkKQEAgLTU0LDE4ICs1MywxNCBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCiAKLUxPQ0FMX0NGTEFHUyArPSAtRExPR19UQUc9XCJDYW1lcmFTZXJ2aWNlXCIKLQogaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1BST0NFU1MKIGVuZGlmCiAKIGlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSwgdHJ1ZSkKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliY2FtZXJhc3R1YgotTE9DQUxfQ0ZMQUdTICs9IC1pbmNsdWRlIENhbWVyYUhhcmR3YXJlU3R1Yi5oCiBlbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNhbWVyYSAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKaW5kZXggOGI2NjM4OS4uYjNlMGVlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCkBAIC00NywxNCArNDcsMTQgQEAKIHsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHA7CiAKLSAgICBwLnNldCgicHJldmlldy1zaXplLXZhbHVlcyIsIjMyMHgyNDAiKTsKKyAgICBwLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsICIzMjB4MjQwIik7CiAgICAgcC5zZXRQcmV2aWV3U2l6ZSgzMjAsIDI0MCk7CiAgICAgcC5zZXRQcmV2aWV3RnJhbWVSYXRlKDE1KTsKLSAgICBwLnNldFByZXZpZXdGb3JtYXQoInl1djQyMnNwIik7CisgICAgcC5zZXRQcmV2aWV3Rm9ybWF0KENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCk7CiAKLSAgICBwLnNldCgicGljdHVyZS1zaXplLXZhbHVlcyIsICIzMjB4MjQwIik7CisgICAgcC5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTLCAiMzIweDI0MCIpOwogICAgIHAuc2V0UGljdHVyZVNpemUoMzIwLCAyNDApOwotICAgIHAuc2V0UGljdHVyZUZvcm1hdCgianBlZyIpOworICAgIHAuc2V0UGljdHVyZUZvcm1hdChDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRyk7CiAKICAgICBpZiAoc2V0UGFyYW1ldGVycyhwKSAhPSBOT19FUlJPUikgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGRlZmF1bHQgcGFyYW1ldGVycz8hIik7CkBAIC02NiwxNCArNjYsMTQgQEAKICAgICAvLyBDcmVhdGUgcmF3IGhlYXAuCiAgICAgaW50IHBpY3R1cmVfd2lkdGgsIHBpY3R1cmVfaGVpZ2h0OwogICAgIG1QYXJhbWV0ZXJzLmdldFBpY3R1cmVTaXplKCZwaWN0dXJlX3dpZHRoLCAmcGljdHVyZV9oZWlnaHQpOwotICAgIG1SYXdIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHBpY3R1cmVfd2lkdGggKiAyICogcGljdHVyZV9oZWlnaHQpOworICAgIG1SYXdIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHBpY3R1cmVfd2lkdGggKiBwaWN0dXJlX2hlaWdodCAqIDMgLyAyKTsKIAogICAgIGludCBwcmV2aWV3X3dpZHRoLCBwcmV2aWV3X2hlaWdodDsKICAgICBtUGFyYW1ldGVycy5nZXRQcmV2aWV3U2l6ZSgmcHJldmlld193aWR0aCwgJnByZXZpZXdfaGVpZ2h0KTsKICAgICBMT0dEKCJpbml0SGVhcExvY2tlZDogcHJldmlldyBzaXplPSVkeCVkIiwgcHJldmlld193aWR0aCwgcHJldmlld19oZWlnaHQpOwogCi0gICAgLy8gTm90ZSB0aGF0IHdlIGVuZm9yY2UgeXV2NDIyIGluIHNldFBhcmFtZXRlcnMoKS4KLSAgICBpbnQgaG93X2JpZyA9IHByZXZpZXdfd2lkdGggKiBwcmV2aWV3X2hlaWdodCAqIDI7CisgICAgLy8gTm90ZSB0aGF0IHdlIGVuZm9yY2UgeXV2NDIwc3AgaW4gc2V0UGFyYW1ldGVycygpLgorICAgIGludCBob3dfYmlnID0gcHJldmlld193aWR0aCAqIHByZXZpZXdfaGVpZ2h0ICogMyAvIDI7CiAKICAgICAvLyBJZiB3ZSBhcmUgYmVpbmcgcmVpbml0aWFsaXplZCB0byB0aGUgc2FtZSBzaXplIGFzIGJlZm9yZSwgbm8KICAgICAvLyB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCkBAIC05OSw3ICs5OSw2IEBACiB7CiAgICAgZGVsZXRlIG1GYWtlQ2FtZXJhOwogICAgIG1GYWtlQ2FtZXJhID0gMDsgLy8gcGFyYW5vaWEKLSAgICBzaW5nbGV0b24uY2xlYXIoKTsKIH0KIAogc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UHJldmlld0hlYXAoKSBjb25zdApAQCAtMTc1LDcgKzE3NCw3IEBACiAKICAgICAgICAgLy8gRmlsbCB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHRoZSBmYWtlIGNhbWVyYS4KICAgICAgICAgdWludDhfdCAqZnJhbWUgPSAoKHVpbnQ4X3QgKiliYXNlKSArIG9mZnNldDsKLSAgICAgICAgZmFrZUNhbWVyYS0+Z2V0TmV4dEZyYW1lQXNZdXY0MjIoZnJhbWUpOworICAgICAgICBmYWtlQ2FtZXJhLT5nZXROZXh0RnJhbWVBc1l1djQyMChmcmFtZSk7CiAKICAgICAgICAgLy9MT0dWKCJwcmV2aWV3VGhyZWFkOiBnZW5lcmF0ZWQgZnJhbWUgdG8gYnVmZmVyICVkIiwgbUN1cnJlbnRQcmV2aWV3RnJhbWUpOwogCkBAIC0yODgsOSArMjg3LDkgQEAKICAgICAgICAgLy8gSW4gdGhlIG1lYW50aW1lIGp1c3QgbWFrZSBhbm90aGVyIGZha2UgY2FtZXJhIHBpY3R1cmUuCiAgICAgICAgIGludCB3LCBoOwogICAgICAgICBtUGFyYW1ldGVycy5nZXRQaWN0dXJlU2l6ZSgmdywgJmgpOwotICAgICAgICBzcDxNZW1vcnlCYXNlPiBtZW0gPSBuZXcgTWVtb3J5QmFzZShtUmF3SGVhcCwgMCwgdyAqIDIgKiBoKTsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gbWVtID0gbmV3IE1lbW9yeUJhc2UobVJhd0hlYXAsIDAsIHcgKiBoICogMyAvIDIpOwogICAgICAgICBGYWtlQ2FtZXJhIGNhbSh3LCBoKTsKLSAgICAgICAgY2FtLmdldE5leHRGcmFtZUFzWXV2NDIyKCh1aW50OF90ICopbVJhd0hlYXAtPmJhc2UoKSk7CisgICAgICAgIGNhbS5nZXROZXh0RnJhbWVBc1l1djQyMCgodWludDhfdCAqKW1SYXdIZWFwLT5iYXNlKCkpOwogICAgICAgICBtRGF0YUNiKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0sIG1DYWxsYmFja0Nvb2tpZSk7CiAgICAgfQogCkBAIC0zMDcsNyArMzA2LDcgQEAKIHsKICAgICBzdG9wUHJldmlldygpOwogICAgIGlmIChjcmVhdGVUaHJlYWQoYmVnaW5QaWN0dXJlVGhyZWFkLCB0aGlzKSA9PSBmYWxzZSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTMzOSwxMiArMzM4LDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFhYWCB2ZXJpZnkgcGFyYW1zCiAKLSAgICBpZiAoc3RyY21wKHBhcmFtcy5nZXRQcmV2aWV3Rm9ybWF0KCksICJ5dXY0MjJzcCIpICE9IDApIHsKLSAgICAgICAgTE9HRSgiT25seSB5dXY0MjJzcCBwcmV2aWV3IGlzIHN1cHBvcnRlZCIpOworICAgIGlmIChzdHJjbXAocGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKSwKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQKSAhPSAwKSB7CisgICAgICAgIExPR0UoIk9ubHkgeXV2NDIwc3AgcHJldmlldyBpcyBzdXBwb3J0ZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChzdHJjbXAocGFyYW1zLmdldFBpY3R1cmVGb3JtYXQoKSwgImpwZWciKSAhPSAwKSB7CisgICAgaWYgKHN0cmNtcChwYXJhbXMuZ2V0UGljdHVyZUZvcm1hdCgpLAorICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRykgIT0gMCkgewogICAgICAgICBMT0dFKCJPbmx5IGpwZWcgc3RpbGwgcGljdHVyZXMgYXJlIHN1cHBvcnRlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMzc5LDIyICszODAsMjkgQEAKIHsKIH0KIAotd3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IENhbWVyYUhhcmR3YXJlU3R1Yjo6c2luZ2xldG9uOwotCiBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gQ2FtZXJhSGFyZHdhcmVTdHViOjpjcmVhdGVJbnN0YW5jZSgpCiB7Ci0gICAgaWYgKHNpbmdsZXRvbiAhPSAwKSB7Ci0gICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBoYXJkd2FyZSA9IHNpbmdsZXRvbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChoYXJkd2FyZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlKG5ldyBDYW1lcmFIYXJkd2FyZVN0dWIoKSk7Ci0gICAgc2luZ2xldG9uID0gaGFyZHdhcmU7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOworICAgIHJldHVybiBuZXcgQ2FtZXJhSGFyZHdhcmVTdHViKCk7CiB9CiAKLWV4dGVybiAiQyIgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IG9wZW5DYW1lcmFIYXJkd2FyZSgpCitzdGF0aWMgQ2FtZXJhSW5mbyBzQ2FtZXJhSW5mb1tdID0geworICAgIHsKKyAgICAgICAgQ0FNRVJBX0ZBQ0lOR19CQUNLLAorICAgICAgICA5MCwgIC8qIG9yaWVudGF0aW9uICovCisgICAgfQorfTsKKworZXh0ZXJuICJDIiBpbnQgSEFMX2dldE51bWJlck9mQ2FtZXJhcygpCit7CisgICAgcmV0dXJuIHNpemVvZihzQ2FtZXJhSW5mbykgLyBzaXplb2Yoc0NhbWVyYUluZm9bMF0pOworfQorCitleHRlcm4gIkMiIHZvaWQgSEFMX2dldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbykKK3sKKyAgICBtZW1jcHkoY2FtZXJhSW5mbywgJnNDYW1lcmFJbmZvW2NhbWVyYUlkXSwgc2l6ZW9mKENhbWVyYUluZm8pKTsKK30KKworZXh0ZXJuICJDIiBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gSEFMX29wZW5DYW1lcmFIYXJkd2FyZShpbnQgY2FtZXJhSWQpCiB7CiAgICAgcmV0dXJuIENhbWVyYUhhcmR3YXJlU3R1Yjo6Y3JlYXRlSW5zdGFuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKaW5kZXggOTU3ODEzYS4uZDM0MjdiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKQEAgLTY3LDggKzY3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUhhcmR3YXJlU3R1YigpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgfkNhbWVyYUhhcmR3YXJlU3R1YigpOwogCi0gICAgc3RhdGljIHdwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBzaW5nbGV0b247Ci0KICAgICBzdGF0aWMgY29uc3QgaW50IGtCdWZmZXJDb3VudCA9IDQ7CiAKICAgICBjbGFzcyBQcmV2aWV3VGhyZWFkIDogcHVibGljIFRocmVhZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDVhNTU3MDQuLmE2NGRkY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xNiwzODMgKzE2LDQ0MCBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1aS9PdmVybGF5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWV4dGVybiAiQyIgewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvZ2dpbmcgc3VwcG9ydCAtLSB0aGlzIGlzIGZvciBkZWJ1Z2dpbmcgb25seQorLy8gVXNlICJhZGIgc2hlbGwgZHVtcHN5cyBtZWRpYS5jYW1lcmEgLXYgMSIgdG8gY2hhbmdlIGl0Lgorc3RhdGljIHZvbGF0aWxlIGludDMyX3QgZ0xvZ0xldmVsID0gMDsKKworI2RlZmluZSBMT0cxKC4uLikgTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOworI2RlZmluZSBMT0cyKC4uLikgTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOworCitzdGF0aWMgdm9pZCBzZXRMb2dMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICBhbmRyb2lkX2F0b21pY193cml0ZShsZXZlbCwgJmdMb2dMZXZlbCk7CiB9CiAKLS8vIFdoZW4geW91IGVuYWJsZSB0aGlzLCBhcyB3ZWxsIGFzIERFQlVHX1JFRlM9MSBhbmQKLS8vIERFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUPTAgaW4gbGlidXRpbHMvUmVmQmFzZS5jcHAsIHRoaXMgd2lsbCB0cmFjayBhbGwKLS8vIHJlZmVyZW5jZXMgdG8gdGhlIENhbWVyYVNlcnZpY2U6OkNsaWVudCBpbiBvcmRlciB0byBjYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUKLS8vIGNsaWVudCBpcyBiZWluZyBkZXN0cm95ZWQgd2hpbGUgYSBjYWxsYmFjayBmcm9tIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZQotLy8gaXMgb3V0c3RhbmRpbmcuICBUaGlzIGlzIGEgc2VyaW91cyBidWcgYmVjYXVzZSBpZiB3ZSBtYWtlIGFub3RoZXIgY2FsbCBpbnRvCi0vLyBDYW1lcmFIYXJkd3JlSW50ZXJmYWNlIHRoYXQgaXRzZWxmIHRyaWdnZXJzIGEgY2FsbGJhY2ssIHdlIHdpbGwgZGVhZGxvY2suCi0KLSNkZWZpbmUgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMgMAotCi0jZGVmaW5lIFBJQ1RVUkVfVElNRU9VVCBzZWNvbmRzKDUpCi0KLSNkZWZpbmUgREVCVUdfRFVNUF9QUkVWSUVXX0ZSQU1FX1RPX0ZJTEUgMCAvKiBuLXRoIGZyYW1lIHRvIHdyaXRlICovCi0jZGVmaW5lIERFQlVHX0RVTVBfSlBFR19TTkFQU0hPVF9UT19GSUxFIDAKLSNkZWZpbmUgREVCVUdfRFVNUF9ZVVZfU05BUFNIT1RfVE9fRklMRSAwCi0jZGVmaW5lIERFQlVHX0RVTVBfUE9TVFZJRVdfU05BUFNIT1RfVE9fRklMRSAwCi0KLSNpZiBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRQotc3RhdGljIGludCBkZWJ1Z19mcmFtZV9jbnQ7Ci0jZW5kaWYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewogICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBDYW1lcmFTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKLSAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZSgKLSAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSwgbmV3IENhbWVyYVNlcnZpY2UoKSk7CitzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKSB7CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1DYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkgOgotICAgIEJuQ2FtZXJhU2VydmljZSgpCi17Ci0gICAgTE9HSSgiQ2FtZXJhU2VydmljZSBzdGFydGVkOiBwaWQ9JWQiLCBnZXRwaWQoKSk7Ci0gICAgbVVzZXJzID0gMDsKLX0KKy8vIFRoaXMgaXMgdWdseSBhbmQgb25seSBzYWZlIGlmIHdlIG5ldmVyIHJlLWNyZWF0ZSB0aGUgQ2FtZXJhU2VydmljZSwgYnV0CisvLyBzaG91bGQgYmUgb2sgZm9yIG5vdy4KK3N0YXRpYyBDYW1lcmFTZXJ2aWNlICpnQ2FtZXJhU2VydmljZTsKIAotQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKQorQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpCis6bVNvdW5kUmVmKDApCiB7Ci0gICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICBMT0dFKCJtQ2xpZW50IHdhcyBzdGlsbCBjb25uZWN0ZWQgaW4gZGVzdHJ1Y3RvciEiKTsKKyAgICBMT0dJKCJDYW1lcmFTZXJ2aWNlIHN0YXJ0ZWQgKHBpZD0lZCkiLCBnZXRwaWQoKSk7CisKKyAgICBtTnVtYmVyT2ZDYW1lcmFzID0gSEFMX2dldE51bWJlck9mQ2FtZXJhcygpOworICAgIGlmIChtTnVtYmVyT2ZDYW1lcmFzID4gTUFYX0NBTUVSQVMpIHsKKyAgICAgICAgTE9HRSgiTnVtYmVyIG9mIGNhbWVyYXMoJWQpID4gTUFYX0NBTUVSQVMoJWQpLiIsCisgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOworICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gTUFYX0NBTUVSQVM7CiAgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKyAgICAgICAgc2V0Q2FtZXJhRnJlZShpKTsKKyAgICB9CisKKyAgICBnQ2FtZXJhU2VydmljZSA9IHRoaXM7CiB9CiAKLXNwPElDYW1lcmE+IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCkKLXsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBMT0dWKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IEUgKHBpZCAlZCwgY2xpZW50ICVwKSIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkuZ2V0KCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBzcDxDbGllbnQ+IGNsaWVudDsKLSAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIHNwPENsaWVudD4gY3VycmVudENsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwotICAgICAgICBpZiAoY3VycmVudENsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjdXJyZW50Q2FtZXJhQ2xpZW50KGN1cnJlbnRDbGllbnQtPmdldENhbWVyYUNsaWVudCgpKTsKLSAgICAgICAgICAgIGlmIChjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkgPT0gY3VycmVudENhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgY2xpZW50IHJlY29ubmVjdGluZy4uLgotICAgICAgICAgICAgICAgIExPR1YoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkLCBzYW1lIGNsaWVudCAlcCkgaXMgcmVjb25uZWN0aW5nLi4uIiwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLmdldCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENsaWVudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBhbm90aGVyIGNsaWVudC4uLiByZWplY3QgaXQKLSAgICAgICAgICAgICAgICBMT0dWKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCwgbmV3IGNsaWVudCAlcCkgcmVqZWN0ZWQuICIKLSAgICAgICAgICAgICAgICAgICAgIihvbGQgcGlkICVkLCBvbGQgY2xpZW50ICVwKSIsCi0gICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsaWVudC0+bUNsaWVudFBpZCwgY3VycmVudENhbWVyYUNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbGwoY3VycmVudENsaWVudC0+bUNsaWVudFBpZCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiVGhlIG9sZCBjbGllbnQgaXMgZGVhZCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNhbid0IHByb21vdGUsIHRoZSBwcmV2aW91cyBjbGllbnQgaGFzIGRpZWQuLi4KLSAgICAgICAgICAgIExPR1YoIk5ldyBjbGllbnQgKHBpZCAlZCkgY29ubmVjdGluZywgb2xkIHJlZmVyZW5jZSB3YXMgZGFuZ2xpbmcuLi4iLAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKK0NhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGlmIChtQnVzeVtpXSkgeworICAgICAgICAgICAgTE9HRSgiY2FtZXJhICVkIGlzIHN0aWxsIGluIHVzZSBpbiBkZXN0cnVjdG9yISIsIGkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1Vc2VycyA+IDApIHsKLSAgICAgICAgTE9HVigiU3RpbGwgaGF2ZSBjbGllbnQsIHJlamVjdGVkIik7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgZ0NhbWVyYVNlcnZpY2UgPSBOVUxMOworfQorCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKKyAgICByZXR1cm4gbU51bWJlck9mQ2FtZXJhczsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSB7CisgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gY3JlYXRlIGEgbmV3IENsaWVudCBvYmplY3QKLSAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwgY2FsbGluZ1BpZCk7Ci0gICAgbUNsaWVudCA9IGNsaWVudDsKLSNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIC8vIEVuYWJsZSB0cmFja2luZyBmb3IgdGhpcyBvYmplY3QsIGFuZCB0cmFjayBpbmNyZW1lbnRzIGFuZCBkZWNyZW1lbnRzIG9mCi0gICAgLy8gdGhlIHJlZmNvdW50LgotICAgIGNsaWVudC0+dHJhY2tNZSh0cnVlLCB0cnVlKTsKLSNlbmRpZgotICAgIExPR1YoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCIpOworICAgIEhBTF9nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCBjYW1lcmFJbmZvKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElDYW1lcmE+IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCkgeworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CisKKyAgICBzcDxDbGllbnQ+IGNsaWVudDsKKyAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYUlkICVkKS4iLAorICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSAwKSB7CisgICAgICAgIGNsaWVudCA9IG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpID09IGNsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgKHRoZSBzYW1lIGNsaWVudCkiLAorICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQgKGV4aXN0aW5nIGNsaWVudCkuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudFtjYW1lcmFJZF0uY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUJ1c3lbY2FtZXJhSWRdKSB7CisgICAgICAgIExPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIKKyAgICAgICAgICAgICAiIChjYW1lcmEgJWQgaXMgc3RpbGwgYnVzeSkuIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gaGFyZHdhcmUgPSBIQUxfb3BlbkNhbWVyYUhhcmR3YXJlKGNhbWVyYUlkKTsKKyAgICBpZiAoaGFyZHdhcmUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGYWlsIHRvIG9wZW4gY2FtZXJhIGhhcmR3YXJlIChpZD0lZCkiLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDYW1lcmFJbmZvIGluZm87CisgICAgSEFMX2dldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKTsKKyAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwgaGFyZHdhcmUsIGNhbWVyYUlkLCBpbmZvLmZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOworICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCIpOwogICAgIHJldHVybiBjbGllbnQ7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQpCi17Cit2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKIAotICAgIC8vIERlY2xhcmUgdGhpcyBvdXRzaWRlIHRoZSBsb2NrIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZQotICAgIC8vIGRlc3RydWN0b3Igd29uJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KLSAgICBzcDxDbGllbnQ+IGNsaWVudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgeworICAgICAgICAvLyBEZWNsYXJlIHRoaXMgYmVmb3JlIHRoZSBsb2NrIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZQorICAgICAgICAvLyBkZXN0cnVjdG9yIHdvbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQuCisgICAgICAgIHNwPENsaWVudD4gY2xpZW50OwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKIAotICAgIGlmIChtQ2xpZW50ID09IDApIHsKLSAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgTE9HVigicmVtb3ZlQ2xpZW50IChwaWQgJWQpOiBhbHJlYWR5IGRpc2Nvbm5lY3RlZCIsIGNhbGxpbmdQaWQpOwotICAgICAgICByZXR1cm47CisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKG9yIHRoaXMgaXMKKyAgICAgICAgLy8ganVzdCBhbm90aGVyIHVudXNlZCBjYW1lcmEpLgorICAgICAgICBpZiAobUNsaWVudFtpXSA9PSAwKSBjb250aW51ZTsKKworICAgICAgICAvLyBQcm9tb3RlIG1DbGllbnQuIEl0IGNhbiBmYWlsIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSB0aGlzIHBhdGg6CisgICAgICAgIC8vIENsaWVudDo6fkNsaWVudCgpIC0+IGRpc2Nvbm5lY3QoKSAtPiByZW1vdmVDbGllbnQoKS4KKyAgICAgICAgY2xpZW50ID0gbUNsaWVudFtpXS5wcm9tb3RlKCk7CisKKyAgICAgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgICAgICBtQ2xpZW50W2ldLmNsZWFyKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkgPT0gY2xpZW50LT5nZXRDYW1lcmFDbGllbnQoKS0+YXNCaW5kZXIoKSkgeworICAgICAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYSwgY2xlYXIgYW5kIGxlYXZlLgorICAgICAgICAgICAgTE9HMSgicmVtb3ZlQ2xpZW50OiBjbGVhciBjYW1lcmEgJWQiLCBpKTsKKyAgICAgICAgICAgIG1DbGllbnRbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gUHJvbW90ZSBtQ2xpZW50LiBJdCBjYW4gZmFpbCBpZiB3ZSBhcmUgY2FsbGVkIGZyb20gdGhpcyBwYXRoOgotICAgIC8vIENsaWVudDo6fkNsaWVudCgpIC0+IGRpc2Nvbm5lY3QoKSAtPiByZW1vdmVDbGllbnQoKS4KLSAgICBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgTE9HVigicmVtb3ZlQ2xpZW50IChwaWQgJWQpOiBubyBtb3JlIHN0cm9uZyByZWZlcmVuY2UiLCBjYWxsaW5nUGlkKTsKLSAgICAgICAgbUNsaWVudC5jbGVhcigpOwotICAgICAgICByZXR1cm47CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKK30KKworc3A8Q2FtZXJhU2VydmljZTo6Q2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpnZXRDbGllbnRCeUlkKGludCBjYW1lcmFJZCkgeworICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1Q6CisgICAgICAgICAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHNlbGZfcGlkID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBpZiAocGlkICE9IHNlbGZfcGlkKSB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcywgZG8gdGhlIHJlYWwgY2hlY2sKKyAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIpKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCB1c2UgdGhlIGNhbWVyYSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkgIT0gY2xpZW50LT5nZXRDYW1lcmFDbGllbnQoKS0+YXNCaW5kZXIoKSkgewotICAgICAgICAvLyB1Z2ghIHRoYXQncyBub3Qgb3VyIGNsaWVudCEhCi0gICAgICAgIExPR1coInJlbW92ZUNsaWVudCAocGlkICVkKTogbUNsaWVudCBkb2Vzbid0IG1hdGNoISIsIGNhbGxpbmdQaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG9rYXksIGdvb2QsIGZvcmdldCBhYm91dCBtQ2xpZW50Ci0gICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJyZW1vdmVDbGllbnQgKHBpZCAlZCkgZG9uZSIsIGNhbGxpbmdQaWQpOworICAgIHJldHVybiBCbkNhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAotLy8gVGhlIHJlYXNvbiB3ZSBuZWVkIHRoaXMgY291bnQgaXMgYSBuZXcgQ2FtZXJhU2VydmljZTo6Y29ubmVjdCgpIHJlcXVlc3QgbWF5Ci0vLyBjb21lIGluIHdoaWxlIHRoZSBwcmV2aW91cyBDbGllbnQncyBkZXN0cnVjdG9yIGhhcyBub3QgYmVlbiBydW4gb3IgaXMgc3RpbGwKLS8vIHJ1bm5pbmcuIElmIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb2YgdGhlIHByZXZpb3VzIENsaWVudCBpcyBnb25lIGJ1dAotLy8gZGVzdHJ1Y3RvciBoYXMgbm90IGJlZW4gcnVuLCB3ZSBzaG91bGQgbm90IGFsbG93IHRoZSBuZXcgQ2xpZW50IHRvIGJlIGNyZWF0ZWQKLS8vIGJlY2F1c2Ugd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJldmlvdXMgQ2xpZW50IHRvIHRlYXIgZG93biB0aGUgaGFyZHdhcmUKLS8vIGZpcnN0Lgotdm9pZCBDYW1lcmFTZXJ2aWNlOjppbmNVc2VycygpIHsKLSAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1Vc2Vycyk7CisvLyBUaGUgcmVhc29uIHdlIG5lZWQgdGhpcyBidXN5IGJpdCBpcyBhIG5ldyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KCkgcmVxdWVzdAorLy8gbWF5IGNvbWUgaW4gd2hpbGUgdGhlIHByZXZpb3VzIENsaWVudCdzIGRlc3RydWN0b3IgaGFzIG5vdCBiZWVuIHJ1biBvciBpcworLy8gc3RpbGwgcnVubmluZy4gSWYgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvZiB0aGUgcHJldmlvdXMgQ2xpZW50IGlzIGdvbmUKKy8vIGJ1dCB0aGUgZGVzdHJ1Y3RvciBoYXMgbm90IGJlZW4gZmluaXNoZWQsIHdlIHNob3VsZCBub3QgYWxsb3cgdGhlIG5ldyBDbGllbnQKKy8vIHRvIGJlIGNyZWF0ZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcmV2aW91cyBDbGllbnQgdG8gdGVhciBkb3duCisvLyB0aGUgaGFyZHdhcmUgZmlyc3QuCit2b2lkIENhbWVyYVNlcnZpY2U6OnNldENhbWVyYUJ1c3koaW50IGNhbWVyYUlkKSB7CisgICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoMSwgJm1CdXN5W2NhbWVyYUlkXSk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6ZGVjVXNlcnMoKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfZGVjKCZtVXNlcnMpOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpzZXRDYW1lcmFGcmVlKGludCBjYW1lcmFJZCkgeworICAgIGFuZHJvaWRfYXRvbWljX3dyaXRlKDAsICZtQnVzeVtjYW1lcmFJZF0pOwogfQogCi1zdGF0aWMgc3A8TWVkaWFQbGF5ZXI+IG5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgc3A8TWVkaWFQbGF5ZXI+IG1wID0gbmV3IE1lZGlhUGxheWVyKCk7Ci0gICAgaWYgKG1wLT5zZXREYXRhU291cmNlKGZpbGUsIE5VTEwgLyogaGVhZGVycyAqLykgPT0gTk9fRVJST1IpIHsKKy8vIFdlIHNoYXJlIHRoZSBtZWRpYSBwbGF5ZXJzIGZvciBzaHV0dGVyIGFuZCByZWNvcmRpbmcgc291bmQgZm9yIGFsbCBjbGllbnRzLgorLy8gQSByZWZlcmVuY2UgY291bnQgaXMga2VwdCB0byBkZXRlcm1pbmUgd2hlbiB3ZSB3aWxsIGFjdHVhbGx5IHJlbGVhc2UgdGhlCisvLyBtZWRpYSBwbGF5ZXJzLgorCitzdGF0aWMgTWVkaWFQbGF5ZXIqIG5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpIHsKKyAgICBNZWRpYVBsYXllciogbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICBpZiAobXAtPnNldERhdGFTb3VyY2UoZmlsZSwgTlVMTCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbXAtPnNldEF1ZGlvU3RyZWFtVHlwZShBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRSk7CiAgICAgICAgIG1wLT5wcmVwYXJlKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbXAuY2xlYXIoKTsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGxvYWQgQ2FtZXJhU2VydmljZSBzb3VuZHMuIik7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBsb2FkIENhbWVyYVNlcnZpY2Ugc291bmRzOiAlcyIsIGZpbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG1wOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvYWRTb3VuZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU291bmRMb2NrKTsKKyAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmQgcmVmPSVkIiwgbVNvdW5kUmVmKTsKKyAgICBpZiAobVNvdW5kUmVmKyspIHJldHVybjsKKworICAgIG1Tb3VuZFBsYXllcltTT1VORF9TSFVUVEVSXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKKyAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyIpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OnJlbGVhc2VTb3VuZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU291bmRMb2NrKTsKKyAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpyZWxlYXNlU291bmQgcmVmPSVkIiwgbVNvdW5kUmVmKTsKKyAgICBpZiAoLS1tU291bmRSZWYpIHJldHVybjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NPVU5EUzsgaSsrKSB7CisgICAgICAgIGlmIChtU291bmRQbGF5ZXJbaV0gIT0gMCkgeworICAgICAgICAgICAgbVNvdW5kUGxheWVyW2ldLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtU291bmRQbGF5ZXJbaV0uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpwbGF5U291bmQoc291bmRfa2luZCBraW5kKSB7CisgICAgTE9HMSgicGxheVNvdW5kKCVkKSIsIGtpbmQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOworICAgIHNwPE1lZGlhUGxheWVyPiBwbGF5ZXIgPSBtU291bmRQbGF5ZXJba2luZF07CisgICAgaWYgKHBsYXllciAhPSAwKSB7CisgICAgICAgIC8vIGRvIG5vdCBwbGF5IHRoZSBzb3VuZCBpZiBzdHJlYW0gdm9sdW1lIGlzIDAKKyAgICAgICAgLy8gKHR5cGljYWxseSBiZWNhdXNlIHJpbmdlciBtb2RlIGlzIHNpbGVudCkuCisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFLCAmaW5kZXgpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgcGxheWVyLT5zZWVrVG8oMCk7CisgICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCi0gICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIHBpZF90IGNsaWVudFBpZCkKLXsKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgY29uc3Qgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+JiBoYXJkd2FyZSwKKyAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgY2xpZW50UGlkKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgTE9HVigiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKwogICAgIG1DYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZTsKICAgICBtQ2FtZXJhQ2xpZW50ID0gY2FtZXJhQ2xpZW50OworICAgIG1IYXJkd2FyZSA9IGhhcmR3YXJlOworICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIG1DYW1lcmFGYWNpbmcgPSBjYW1lcmFGYWNpbmc7CiAgICAgbUNsaWVudFBpZCA9IGNsaWVudFBpZDsKLSAgICBtSGFyZHdhcmUgPSBvcGVuQ2FtZXJhSGFyZHdhcmUoKTsKICAgICBtVXNlT3ZlcmxheSA9IG1IYXJkd2FyZS0+dXNlT3ZlcmxheSgpOworICAgIG1Nc2dFbmFibGVkID0gMDsKIAogICAgIG1IYXJkd2FyZS0+c2V0Q2FsbGJhY2tzKG5vdGlmeUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2UuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FtZXJhSWQpOwogCiAgICAgLy8gRW5hYmxlIHpvb20sIGVycm9yLCBhbmQgZm9jdXMgbWVzc2FnZXMgYnkgZGVmYXVsdAotICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX0VSUk9SIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19aT09NIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19GT0NVUyk7Ci0KLSAgICBtTWVkaWFQbGF5ZXJDbGljayA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKLSAgICBtTWVkaWFQbGF5ZXJCZWVwID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7CisgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX0VSUk9SIHwKKyAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfWk9PTSB8CisgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0ZPQ1VTKTsKICAgICBtT3ZlcmxheVcgPSAwOwogICAgIG1PdmVybGF5SCA9IDA7CiAKICAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBGUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7Ci0gICAgbU9yaWVudGF0aW9uID0gMDsKLSAgICBjYW1lcmFTZXJ2aWNlLT5pbmNVc2VycygpOwotICAgIExPR1YoIkNsaWVudDo6Q2xpZW50IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKyAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOworICAgIG1PcmllbnRhdGlvbkNoYW5nZWQgPSBmYWxzZTsKKyAgICBjYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFCdXN5KGNhbWVyYUlkKTsKKyAgICBjYW1lcmFTZXJ2aWNlLT5sb2FkU291bmQoKTsKKyAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2hlY2tQaWQoKQotewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmIChtQ2xpZW50UGlkID09IGNhbGxpbmdQaWQpIHJldHVybiBOT19FUlJPUjsKLSAgICBMT0dXKCJBdHRlbXB0IHRvIHVzZSBsb2NrZWQgY2FtZXJhIChjbGllbnQgJXApIGZyb20gZGlmZmVyZW50IHByb2Nlc3MgIgotICAgICAgICAiIChvbGQgcGlkICVkLCBuZXcgcGlkICVkKSIsCi0gICAgICAgIGdldENhbWVyYUNsaWVudCgpLT5hc0JpbmRlcigpLmdldCgpLCBtQ2xpZW50UGlkLCBjYWxsaW5nUGlkKTsKLSAgICByZXR1cm4gLUVCVVNZOwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmxvY2soKQotewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIExPR1YoImxvY2sgZnJvbSBwaWQgJWQgKG1DbGllbnRQaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNsaWVudFBpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyBsb2NrIGNhbWVyYSB0byB0aGlzIGNsaWVudCBpZiB0aGUgdGhlIGNhbWVyYSBpcyB1bmxvY2tlZAotICAgIGlmIChtQ2xpZW50UGlkID09IDApIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiB0aGUgY2xpZW50IGFscmVhZHkgb3ducyB0aGUgY2FtZXJhLCAtRUJVU1kgb3RoZXJ3aXNlCi0gICAgcmV0dXJuIGNoZWNrUGlkKCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6dW5sb2NrKCkKLXsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBMT0dWKCJ1bmxvY2sgZnJvbSBwaWQgJWQgKG1DbGllbnRQaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNsaWVudFBpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyBhbGxvdyBhbnlvbmUgdG8gdXNlIGNhbWVyYQotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBtQ2xpZW50UGlkID0gMDsKLSAgICAgICAgTE9HVigiY2xlYXIgbUNhbWVyYUNsaWVudCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHNvIHRoYXQgd2hlbiBhcHAgZ29lcwotICAgICAgICAvLyBhd2F5LCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gMC4KLSAgICAgICAgbUNhbWVyYUNsaWVudC5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCkKLXsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLQotICAgIC8vIGNvbm5lY3QgYSBuZXcgcHJvY2VzcyB0byB0aGUgY2FtZXJhCi0gICAgTE9HVigiQ2xpZW50Ojpjb25uZWN0IEUgKHBpZCAlZCwgY2xpZW50ICVwKSIsIGNhbGxpbmdQaWQsIGNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSk7Ci0KLSAgICAvLyBJIGhhdGUgdGhpcyBoYWNrLCBidXQgdGhpbmdzIGdldCByZWFsbHkgdWdseSB3aGVuIHRoZSBtZWRpYSByZWNvcmRlcgotICAgIC8vIHNlcnZpY2UgaXMgaGFuZGluZyBiYWNrIHRoZSBjYW1lcmEgdG8gdGhlIGFwcC4gVGhlIElDYW1lcmFDbGllbnQKLSAgICAvLyBkZXN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgc2FtZSBJUEMsIG1ha2luZyBpdCBsb29rIGxpa2UKLSAgICAvLyB0aGUgcmVtb3RlIGNsaWVudCBpcyB0cnlpbmcgdG8gZGlzY29ubmVjdC4gVGhpcyBoYWNrIHRlbXBvcmFyaWx5Ci0gICAgLy8gc2V0cyB0aGUgbUNsaWVudFBpZCB0byBhbiBpbnZhbGlkIHBpZCB0byBwcmV2ZW50IHRoZSBoYXJkd2FyZSBmcm9tCi0gICAgLy8gYmVpbmcgdG9ybiBkb3duLgotICAgIHsKLQotICAgICAgICAvLyBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgY2xpZW50IG9yIHdlIHdpbGwgZGVhZGxvY2sgaWYgdGhlIGNsaWVudCBpcwotICAgICAgICAvLyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFuZCB3ZSBob2xkIHRoZSBsb2NrIHdoZW4gd2UgcmVtb3ZlIHRoZSByZWZlcmVuY2UKLSAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gb2xkQ2xpZW50OwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBjaGVja1BpZCgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygiVHJpZWQgdG8gY29ubmVjdCB0byBsb2NrZWQgY2FtZXJhIChvbGQgcGlkICVkLCBuZXcgcGlkICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkLCBjYWxsaW5nUGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkQ2xpZW50ID0gbUNhbWVyYUNsaWVudDsKLQotICAgICAgICAgICAgLy8gZGlkIHRoZSBjbGllbnQgYWN0dWFsbHkgY2hhbmdlPwotICAgICAgICAgICAgaWYgKChtQ2FtZXJhQ2xpZW50ICE9IE5VTEwpICYmIChjbGllbnQtPmFzQmluZGVyKCkgPT0gbUNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSkpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJDb25uZWN0IHRvIHRoZSBzYW1lIGNsaWVudCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNhbWVyYUNsaWVudCA9IGNsaWVudDsKLSAgICAgICAgICAgIG1DbGllbnRQaWQgPSAtMTsKLSAgICAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwotICAgICAgICAgICAgTE9HVigiQ29ubmVjdCB0byB0aGUgbmV3IGNsaWVudCAocGlkICVkLCBjbGllbnQgJXApIiwKLSAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBtQ2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLmdldCgpKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIC8vIHRoZSBvbGQgY2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gb2xkQ2xpZW50IGdvZXMgb3V0IG9mIHNjb3BlCi0gICAgLy8gbm93IHdlIHNldCB0aGUgbmV3IFBJRCB0byBsb2NrIHRoZSBpbnRlcmZhY2UgYWdhaW4KLSAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotI2lmIEhBVkVfQU5EUk9JRF9PUwotc3RhdGljIHZvaWQgKnVucmVnaXN0ZXJfc3VyZmFjZSh2b2lkICphcmcpCi17CitzdGF0aWMgdm9pZCAqdW5yZWdpc3Rlcl9zdXJmYWNlKHZvaWQgKmFyZykgewogICAgIElTdXJmYWNlICpzdXJmYWNlID0gKElTdXJmYWNlICopYXJnOwogICAgIHN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIHJldHVybiBOVUxMOwogfQotI2VuZGlmCiAKLUNhbWVyYVNlcnZpY2U6OkNsaWVudDo6fkNsaWVudCgpCi17CisvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAorQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp+Q2xpZW50KCkgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoIkNsaWVudDo6fkNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiAKLSAgICAvLyB0ZWFyIGRvd24gY2xpZW50Ci0gICAgTE9HVigiQ2xpZW50Ojp+Q2xpZW50IEUgKHBpZCAlZCwgY2xpZW50ICVwKSIsCi0gICAgICAgICAgICBjYWxsaW5nUGlkLCBnZXRDYW1lcmFDbGllbnQoKS0+YXNCaW5kZXIoKS5nZXQoKSk7CiAgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0jaWYgSEFWRV9BTkRST0lEX09TCiAgICAgICAgIHB0aHJlYWRfdCB0aHI7CiAgICAgICAgIC8vIFdlIHVucmVnaXN0ZXIgdGhlIGJ1ZmZlcnMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIGJlY2F1c2UgYmluZGVyIGRvZXMKICAgICAgICAgLy8gbm90IGxldCB1cyBtYWtlIHN5Y2hyb25vdXMgdHJhbnNhY3Rpb25zIGluIGEgYmluZGVyIGRlc3RydWN0b3IgKHRoYXQKICAgICAgICAgLy8gaXMsIHVwb24gb3VyIHJlYWNoaW5nIGEgcmVmY291bnQgb2YgemVyby4pCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBhdHRyCiAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCkpOwogICAgICAgICBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKTsKLSNlbHNlCi0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotI2VuZGlmCiAgICAgfQogCi0gICAgaWYgKG1NZWRpYVBsYXllckJlZXAuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFQbGF5ZXJCZWVwLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIG1NZWRpYVBsYXllckJlZXAuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKG1NZWRpYVBsYXllckNsaWNrLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbU1lZGlhUGxheWVyQ2xpY2stPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgbU1lZGlhUGxheWVyQ2xpY2suY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgd2UgdGVhciBkb3duIHRoZSBoYXJkd2FyZQorICAgIC8vIHNldCBtQ2xpZW50UGlkIHRvIGxldCBkaXNjb25uZXQoKSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCiAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgZGlzY29ubmVjdCgpOwotICAgIExPR1YoIkNsaWVudDo6fkNsaWVudCBYIChwaWQgJWQpIiwgbUNsaWVudFBpZCk7CisgICAgbUNhbWVyYVNlcnZpY2UtPnJlbGVhc2VTb3VuZCgpOworICAgIExPRzEoIkNsaWVudDo6fkNsaWVudCBYIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkKLXsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpjaGVja1BpZCgpIGNvbnN0IHsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKLSAgICBMT0dWKCJDbGllbnQ6OmRpc2Nvbm5lY3QoKSBFIChwaWQgJWQgY2xpZW50ICVwKSIsCi0gICAgICAgICAgICBjYWxsaW5nUGlkLCBnZXRDYW1lcmFDbGllbnQoKS0+YXNCaW5kZXIoKS5nZXQoKSk7CisgICAgTE9HVygiYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKKyAgICAgICAgICIgKG9sZCBwaWQgJWQsIG5ldyBwaWQgJWQpIiwgbUNsaWVudFBpZCwgY2FsbGluZ1BpZCk7CisgICAgcmV0dXJuIEVCVVNZOworfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OworICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgeworICAgICAgICBMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpsb2NrKCkgeworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoImxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1DbGllbnRQaWQgPD0gMCkgewotICAgICAgICBMT0dWKCJjYW1lcmEgaXMgdW5sb2NrZWQgKG1DbGllbnRQaWQgPSAlZCksIGRvbid0IHRlYXIgZG93biBoYXJkd2FyZSIsIG1DbGllbnRQaWQpOworCisgICAgLy8gbG9jayBjYW1lcmEgdG8gdGhpcyBjbGllbnQgaWYgdGhlIHRoZSBjYW1lcmEgaXMgdW5sb2NrZWQKKyAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiB0aGUgY2xpZW50IGFscmVhZHkgb3ducyB0aGUgY2FtZXJhLCBFQlVTWSBvdGhlcndpc2UKKyAgICByZXR1cm4gY2hlY2tQaWQoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp1bmxvY2soKSB7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgTE9HMSgidW5sb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgLy8gYWxsb3cgYW55b25lIHRvIHVzZSBjYW1lcmEgKGFmdGVyIHRoZXkgbG9jayB0aGUgY2FtZXJhKQorICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICBtQ2xpZW50UGlkID0gMDsKKyAgICAgICAgTE9HMSgiY2xlYXIgbUNhbWVyYUNsaWVudCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIElDYW1lcmFDbGllbnQgc28gdGhhdCB3aGVuIHRoZSBhcHAKKyAgICAgICAgLy8gZ29lcyBhd2F5LCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gMC4KKyAgICAgICAgbUNhbWVyYUNsaWVudC5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCkgeworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoImNvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgY2hlY2tQaWQoKSAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dXKCJUcmllZCB0byBjb25uZWN0IHRvIGEgbG9ja2VkIGNhbWVyYSAob2xkIHBpZCAlZCwgbmV3IHBpZCAlZCkiLAorICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsIGNhbGxpbmdQaWQpOworICAgICAgICByZXR1cm4gRUJVU1k7CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFDbGllbnQgIT0gMCAmJiAoY2xpZW50LT5hc0JpbmRlcigpID09IG1DYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpKSB7CisgICAgICAgIExPRzEoIkNvbm5lY3QgdG8gdGhlIHNhbWUgY2xpZW50Iik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKKyAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKKyAgICBtQ2FtZXJhQ2xpZW50ID0gY2xpZW50OworCisgICAgTE9HMSgiY29ubmVjdCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpIHsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoY2hlY2tQaWQoKSAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dXKCJkaWZmZXJlbnQgY2xpZW50IC0gZG9uJ3QgZGlzY29ubmVjdCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR1YoIkRpZmZlcmVudCBjbGllbnQgLSBkb24ndCBkaXNjb25uZWN0Iik7CisKKyAgICBpZiAobUNsaWVudFBpZCA8PSAwKSB7CisgICAgICAgIExPRzEoImNhbWVyYSBpcyB1bmxvY2tlZCAobUNsaWVudFBpZCA9ICVkKSwgZG9uJ3QgdGVhciBkb3duIGhhcmR3YXJlIiwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQwMCw2ODYgKzQ1Nyw0NzkgQEAKICAgICAvLyBmcm9tIHRoZSB1c2VyIGRpcmVjdGx5LCBvciBjYWxsZWQgYnkgdGhlIGRlc3RydWN0b3IuCiAgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSByZXR1cm47CiAKLSAgICBMT0dWKCJoYXJkd2FyZSB0ZWFyZG93biIpOworICAgIExPRzEoImhhcmR3YXJlIHRlYXJkb3duIik7CiAgICAgLy8gQmVmb3JlIGRlc3Ryb3lpbmcgbUhhcmR3YXJlLCB3ZSBtdXN0IG1ha2Ugc3VyZSBpdCdzIGluIHRoZQogICAgIC8vIGlkbGUgc3RhdGUuCisgICAgLy8gVHVybiBvZmYgYWxsIG1lc3NhZ2VzLgorICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQUxMX01TR1MpOwogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKLSAgICAvLyBDYW5jZWwgYWxsIHBpY3R1cmUgY2FsbGJhY2tzLgotICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19TSFVUVEVSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19SQVdfSU1BR0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKTsKICAgICBtSGFyZHdhcmUtPmNhbmNlbFBpY3R1cmUoKTsKLSAgICAvLyBUdXJuIG9mZiByZW1haW5pbmcgbWVzc2FnZXMuCi0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX0FMTF9NU0dTKTsKICAgICAvLyBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMuCiAgICAgbUhhcmR3YXJlLT5yZWxlYXNlKCk7CiAgICAgLy8gUmVsZWFzZSB0aGUgaGVsZCBvdmVybGF5IHJlc291cmNlcy4KLSAgICBpZiAobVVzZU92ZXJsYXkpCi0gICAgeworICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICBtT3ZlcmxheVJlZiA9IDA7CiAgICAgfQogICAgIG1IYXJkd2FyZS5jbGVhcigpOwogCiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudChtQ2FtZXJhQ2xpZW50KTsKLSAgICBtQ2FtZXJhU2VydmljZS0+ZGVjVXNlcnMoKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhRnJlZShtQ2FtZXJhSWQpOwogCi0gICAgTE9HVigiQ2xpZW50OjpkaXNjb25uZWN0KCkgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgIExPRzEoImRpc2Nvbm5lY3QgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogfQogCi0vLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQotewotICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5KCVwKSAocGlkICVkKSIsCi0gICAgICAgICAoKHN1cmZhY2UgPT0gTlVMTCkgPyBOVUxMIDogc3VyZmFjZS5nZXQoKSksIGdldENhbGxpbmdQaWQoKSk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHNldCB0aGUgSVN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsKKyAgICBMT0cxKCJzZXRQcmV2aWV3RGlzcGxheSglcCkgKHBpZCAlZCkiLCBzdXJmYWNlLmdldCgpLCBnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIHN1cmZhY2VMb2NrKG1TdXJmYWNlTG9jayk7CiAgICAgcmVzdWx0ID0gTk9fRVJST1I7CisKKyAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCiAgICAgLy8gYXNCaW5kZXIoKSBpcyBzYWZlIG9uIE5VTEwgKHJldHVybnMgTlVMTCkKLSAgICBpZiAoc3VyZmFjZS0+YXNCaW5kZXIoKSAhPSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgewotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgTE9HVigiY2xlYXJpbmcgb2xkIHByZXZpZXcgc3VyZmFjZSAlcCIsIG1TdXJmYWNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmICggIW1Vc2VPdmVybGF5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBkZXN0cnVjdGlvbiBvZiBhbnkgcHJldmlvdXMgb3ZlcmxheQotICAgICAgICAgICAgICAgIHNwPE92ZXJsYXk+IGR1bW15OwotICAgICAgICAgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheSggZHVtbXkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgICAgIG1PdmVybGF5UmVmID0gMDsKLSAgICAgICAgLy8gSWYgcHJldmlldyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQsIHNldCBvdmVybGF5IG9yIHJlZ2lzdGVyIHByZXZpZXcKLSAgICAgICAgLy8gYnVmZmVycyBub3cuCi0gICAgICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldE92ZXJsYXkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoc3VyZmFjZS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CisgICAgICAgIExPRzEoImNsZWFyaW5nIG9sZCBwcmV2aWV3IHN1cmZhY2UgJXAiLCBtU3VyZmFjZS5nZXQoKSk7CisgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgeworICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGRlc3RydWN0aW9uIG9mIGFueSBwcmV2aW91cyBvdmVybGF5CisgICAgICAgICAgICBzcDxPdmVybGF5PiBkdW1teTsKKyAgICAgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheShkdW1teSk7CisgICAgICAgICAgICBtT3ZlcmxheVJlZiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKICAgICAgICAgfQogICAgIH0KKyAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgbU92ZXJsYXlSZWYgPSAwOworICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCBzZXQgb3ZlcmxheSBvciByZWdpc3RlciBwcmV2aWV3CisgICAgLy8gYnVmZmVycyBub3cuCisgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgeworICAgICAgICBpZiAobVVzZU92ZXJsYXkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHNldE92ZXJsYXkoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3VyZmFjZSAhPSAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQotLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBjYWxsYmFja19mbGFnKQotewotICAgIExPR1YoInNldFByZXZpZXdDYWxsYmFja0ZsYWcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWQoKSAhPSBOT19FUlJPUikgcmV0dXJuOwotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gY2FsbGJhY2tfZmxhZzsKLQotICAgIGlmKG1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIGlmKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykKLSAgICAgICAgICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgfQotfQotCi0vLyBzdGFydCBwcmV2aWV3IG1vZGUKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRDYW1lcmFNb2RlKGNhbWVyYV9tb2RlIG1vZGUpCi17Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBMT0dWKCJzdGFydENhbWVyYU1vZGUoJWQpIChwaWQgJWQpIiwgbW9kZSwgY2FsbGluZ1BpZCk7Ci0KLSAgICAvKiB3ZSBjYW5ub3QgY2FsbCBpbnRvIG1IYXJkd2FyZSB3aXRoIG1Mb2NrIGhlbGQgYmVjYXVzZQotICAgICAqIG1IYXJkd2FyZSBoYXMgY2FsbGJhY2tzIG9udG8gdXMgd2hpY2ggYWNxdWlyZSB0aGlzIGxvY2sKLSAgICAgKi8KLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgY2FzZSBDQU1FUkFfUkVDT1JESU5HX01PREU6Ci0gICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJzZXRQcmV2aWV3RGlzcGxheSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGFydFJlY29yZGluZ01vZGUoKTsKLQotICAgIGRlZmF1bHQ6IC8vIENBTUVSQV9QUkVWSUVXX01PREUKLSAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKLSAgICAgICAgICAgIExPR1YoIm1TdXJmYWNlIGlzIG5vdCBzZXQgeWV0LiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGFydFByZXZpZXdNb2RlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nTW9kZSgpCi17Ci0gICAgTE9HVigic3RhcnRSZWNvcmRpbmdNb2RlIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIHN0YXR1c190IHJldCA9IFVOS05PV05fRVJST1I7Ci0KLSAgICAvLyBpZiBwcmV2aWV3IGhhcyBub3QgYmVlbiBzdGFydGVkLCBzdGFydCBwcmV2aWV3IGZpcnN0Ci0gICAgaWYgKCFtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgcmV0ID0gc3RhcnRQcmV2aWV3TW9kZSgpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gaWYgcmVjb3JkaW5nIGhhcyBiZWVuIGVuYWJsZWQsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQotICAgIGlmIChtSGFyZHdhcmUtPnJlY29yZGluZ0VuYWJsZWQoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKLSAgICByZXQgPSBtSGFyZHdhcmUtPnN0YXJ0UmVjb3JkaW5nKCk7Ci0gICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUtPnN0YXJ0UmVjb3JkaW5nKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmV0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRPdmVybGF5KCkKLXsKLSAgICBMT0dWKCJzZXRPdmVybGF5Iik7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKSB7CiAgICAgaW50IHcsIGg7CiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmdywgJmgpOwogCi0gICAgaWYgKCB3ICE9IG1PdmVybGF5VyB8fCBoICE9IG1PdmVybGF5SCApCi0gICAgewotICAgICAgICAvLyBGb3JjZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgYW55IHByZXZpb3VzIG92ZXJsYXkKLSAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7Ci0gICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheSggZHVtbXkgKTsKLSAgICAgICAgbU92ZXJsYXlSZWYgPSAwOwotICAgIH0KLQotICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOwotICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgIGlmIChtT3ZlcmxheVJlZi5nZXQoKSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOgotICAgICAgICAgICAgLy8gU3VyZmFjZWZsaW5nZXIgbWF5IGhvbGQgb250byB0aGUgcHJldmlvdXMgb3ZlcmxheSByZWZlcmVuY2UgZm9yIHNvbWUKLSAgICAgICAgICAgIC8vIHRpbWUgYWZ0ZXIgd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuIHJldHJ5IGEgZmV3IHRpbWVzLiBJbiB0aGUgZnV0dXJlLCB3ZQotICAgICAgICAgICAgLy8gc2hvdWxkIG1ha2UgdGhlIGRlc3Ryb3kgY2FsbCBibG9jaywgb3IgcG9zc2libHkgc3BlY2lmeSB0aGF0IHdlIGNhbgotICAgICAgICAgICAgLy8gd2FpdCBpbiB0aGUgY3JlYXRlT3ZlcmxheSBjYWxsIGlmIHRoZSBwcmV2aW91cyBvdmVybGF5IGlzIGluIHRoZSAKLSAgICAgICAgICAgIC8vIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgZm9yIChpbnQgcmV0cnkgPSAwOyByZXRyeSA8IDUwOyArK3JldHJ5KSB7Ci0gICAgICAgICAgICAgICAgbU92ZXJsYXlSZWYgPSBtU3VyZmFjZS0+Y3JlYXRlT3ZlcmxheSh3LCBoLCBPVkVSTEFZX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJsYXlSZWYgIT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgTE9HVygiT3ZlcmxheSBjcmVhdGUgZmFpbGVkIC0gcmV0cnlpbmciKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMjAwMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCBtT3ZlcmxheVJlZi5nZXQoKSA9PSBOVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJPdmVybGF5IENyZWF0aW9uIEZhaWxlZCEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IG1IYXJkd2FyZS0+c2V0T3ZlcmxheShuZXcgT3ZlcmxheShtT3ZlcmxheVJlZikpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUhhcmR3YXJlLT5zZXRPdmVybGF5KE5VTEwpOwotICAgIH0KLSAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZS0+c2V0T3ZlcmxheSgpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgcmV0KTsKLSAgICB9Ci0KLSAgICBtT3ZlcmxheVcgPSB3OwotICAgIG1PdmVybGF5SCA9IGg7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKQotewotICAgIGludCB3LCBoOwotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJncsICZoKTsKLQotICAgIC8vIGRvbid0IHVzZSBhIGhhcmRjb2RlZCBmb3JtYXQgaGVyZQorICAgIC8vIEZJWE1FOiBkb24ndCB1c2UgYSBoYXJkY29kZWQgZm9ybWF0IGhlcmUuCiAgICAgSVN1cmZhY2U6OkJ1ZmZlckhlYXAgYnVmZmVycyh3LCBoLCB3LCBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRQcmV2aWV3SGVhcCgpKTsKIAotICAgIHN0YXR1c190IHJldCA9IG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7Ci0gICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJyZWdpc3RlckJ1ZmZlcnMgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmV0KTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgicmVnaXN0ZXJCdWZmZXJzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHJlc3VsdCk7CiAgICAgfQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydFByZXZpZXdNb2RlKCkKLXsKLSAgICBMT0dWKCJzdGFydFByZXZpZXdNb2RlIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0T3ZlcmxheSgpIHsKKyAgICBpbnQgdywgaDsKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3LCAmaCk7CisKKyAgICBpZiAodyAhPSBtT3ZlcmxheVcgfHwgaCAhPSBtT3ZlcmxheUggfHwgbU9yaWVudGF0aW9uQ2hhbmdlZCkgeworICAgICAgICAvLyBGb3JjZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgYW55IHByZXZpb3VzIG92ZXJsYXkKKyAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7CisgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheShkdW1teSk7CisgICAgICAgIG1PdmVybGF5UmVmID0gMDsKKyAgICAgICAgbU9yaWVudGF0aW9uQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOworICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7CisgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c2V0T3ZlcmxheShOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobU92ZXJsYXlSZWYgPT0gMCkgeworICAgICAgICAgICAgLy8gRklYTUU6CisgICAgICAgICAgICAvLyBTdXJmYWNlZmxpbmdlciBtYXkgaG9sZCBvbnRvIHRoZSBwcmV2aW91cyBvdmVybGF5IHJlZmVyZW5jZSBmb3Igc29tZQorICAgICAgICAgICAgLy8gdGltZSBhZnRlciB3ZSB0cnkgdG8gZGVzdHJveSBpdC4gcmV0cnkgYSBmZXcgdGltZXMuIEluIHRoZSBmdXR1cmUsIHdlCisgICAgICAgICAgICAvLyBzaG91bGQgbWFrZSB0aGUgZGVzdHJveSBjYWxsIGJsb2NrLCBvciBwb3NzaWJseSBzcGVjaWZ5IHRoYXQgd2UgY2FuCisgICAgICAgICAgICAvLyB3YWl0IGluIHRoZSBjcmVhdGVPdmVybGF5IGNhbGwgaWYgdGhlIHByZXZpb3VzIG92ZXJsYXkgaXMgaW4gdGhlCisgICAgICAgICAgICAvLyBwcm9jZXNzIG9mIGJlaW5nIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIGZvciAoaW50IHJldHJ5ID0gMDsgcmV0cnkgPCA1MDsgKytyZXRyeSkgeworICAgICAgICAgICAgICAgIG1PdmVybGF5UmVmID0gbVN1cmZhY2UtPmNyZWF0ZU92ZXJsYXkodywgaCwgT1ZFUkxBWV9GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKG1PdmVybGF5UmVmICE9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIExPR1coIk92ZXJsYXkgY3JlYXRlIGZhaWxlZCAtIHJldHJ5aW5nIik7CisgICAgICAgICAgICAgICAgdXNsZWVwKDIwMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtT3ZlcmxheVJlZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiT3ZlcmxheSBDcmVhdGlvbiBGYWlsZWQhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldE92ZXJsYXkobmV3IE92ZXJsYXkobU92ZXJsYXlSZWYpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIm1IYXJkd2FyZS0+c2V0T3ZlcmxheSgpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBtT3ZlcmxheVcgPSB3OworICAgIG1PdmVybGF5SCA9IGg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQorLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBjYWxsYmFja19mbGFnKSB7CisgICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CisKKyAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IGNhbGxiYWNrX2ZsYWc7CisKKyAgICAvLyBJZiB3ZSBkb24ndCB1c2Ugb3ZlcmxheSwgd2UgYWx3YXlzIG5lZWQgdGhlIHByZXZpZXcgZnJhbWUgZm9yIGRpc3BsYXkuCisgICAgLy8gSWYgd2UgZG8gdXNlIG92ZXJsYXksIHdlIG9ubHkgbmVlZCB0aGUgcHJldmlldyBmcmFtZSBpZiB0aGUgdXNlcgorICAgIC8vIHdhbnRzIHRoZSBkYXRhLgorICAgIGlmIChtVXNlT3ZlcmxheSkgeworICAgICAgICBpZihtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKKyAgICAgICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXJ0IHByZXZpZXcgbW9kZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydFByZXZpZXcoKSB7CisgICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOworfQorCisvLyBzdGFydCByZWNvcmRpbmcgbW9kZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKKyAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOworfQorCisvLyBzdGFydCBwcmV2aWV3IG9yIHJlY29yZGluZworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydENhbWVyYU1vZGUoY2FtZXJhX21vZGUgbW9kZSkgeworICAgIExPRzEoInN0YXJ0Q2FtZXJhTW9kZSglZCkiLCBtb2RlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CisKKyAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICBjYXNlIENBTUVSQV9QUkVWSUVXX01PREU6CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgeworICAgICAgICAgICAgICAgIExPRzEoIm1TdXJmYWNlIGlzIG5vdCBzZXQgeWV0LiIpOworICAgICAgICAgICAgICAgIC8vIHN0aWxsIGFibGUgdG8gc3RhcnQgcHJldmlldyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhcnRQcmV2aWV3TW9kZSgpOworICAgICAgICBjYXNlIENBTUVSQV9SRUNPUkRJTkdfTU9ERToKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibVN1cmZhY2UgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhcnRSZWNvcmRpbmdNb2RlKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRQcmV2aWV3TW9kZSgpIHsKKyAgICBMT0cxKCJzdGFydFByZXZpZXdNb2RlIik7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gTk9fRVJST1I7CiAKICAgICAvLyBpZiBwcmV2aWV3IGhhcyBiZWVuIGVuYWJsZWQsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQogICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQotI2lmIERFQlVHX0RVTVBfUFJFVklFV19GUkFNRV9UT19GSUxFCi0gICAgZGVidWdfZnJhbWVfY250ID0gMDsKLSNlbmRpZgotICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOwotCiAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHNldCBvdmVybGF5IG5vdy4KICAgICAgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIHJldCA9IHNldE92ZXJsYXkoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHNldE92ZXJsYXkoKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmV0OwotICAgICAgICByZXQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICByZXQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmV0OworICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CisgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAgICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCiAgICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIHJlZ2lzdGVyZWQgd2l0aCByYXcgaGVhcC4KKyAgICAgICAgICAgLy8gVW5yZWdpc3RlciBoZXJlIGJlY2F1c2UgdGhlIHN1cmZhY2UgbWF5IGJlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAorICAgICAgICAgICAvLyB3aXRoIHRoZSByYXcgKHNuYXBzaG90KSBoZWFwLgogICAgICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICAgICAgICAgcmV0ID0gcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOworICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UHJldmlldygpCi17Ci0gICAgTE9HVigic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRSZWNvcmRpbmdNb2RlKCkgeworICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nTW9kZSIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwogCi0gICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUFJFVklFV19NT0RFKTsKLX0KKyAgICAvLyBpZiByZWNvcmRpbmcgaGFzIGJlZW4gZW5hYmxlZCwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lCisgICAgaWYgKG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRSZWNvcmRpbmcoKQotewotICAgIExPR1YoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIGlmIChtTWVkaWFQbGF5ZXJCZWVwLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZG8gbm90IHBsYXkgcmVjb3JkIGppbmdsZSBpZiBzdHJlYW0gdm9sdW1lIGlzIDAKLSAgICAgICAgLy8gKHR5cGljYWxseSBiZWNhdXNlIHJpbmdlciBtb2RlIGlzIHNpbGVudCkuCi0gICAgICAgIGludCBpbmRleDsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFLCAmaW5kZXgpOwotICAgICAgICBpZiAoaW5kZXggIT0gMCkgewotICAgICAgICAgICAgbU1lZGlhUGxheWVyQmVlcC0+c2Vla1RvKDApOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyQmVlcC0+c3RhcnQoKTsKKyAgICAvLyBpZiBwcmV2aWV3IGhhcyBub3QgYmVlbiBzdGFydGVkLCBzdGFydCBwcmV2aWV3IGZpcnN0CisgICAgaWYgKCFtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RhcnRQcmV2aWV3TW9kZSgpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUhhcmR3YXJlLT5lbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpOwotCi0gICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOworICAgIC8vIHN0YXJ0IHJlY29yZGluZyBtb2RlCisgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1JFQ09SRElORyk7CisgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zdGFydFJlY29yZGluZygpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgibUhhcmR3YXJlLT5zdGFydFJlY29yZGluZygpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIHN0b3AgcHJldmlldyBtb2RlCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RvcFByZXZpZXcoKQotewotICAgIExPR1YoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdG9wUHJldmlldygpIHsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAotICAgIC8vIGhvbGQgbWFpbiBsb2NrIGR1cmluZyBzdGF0ZSB0cmFuc2l0aW9uCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSByZXR1cm47CisgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7CiAKLSAgICAgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwotICAgICAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgICAgIExPR1YoInN0b3BQcmV2aWV3KCksIGhhcmR3YXJlIHN0b3BwZWQgT0siKTsKLQotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgICAgICB9CisgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7CisgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogICAgIH0KIAotICAgIC8vIGhvbGQgcHJldmlldyBidWZmZXIgbG9jawotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVByZXZpZXdMb2NrKTsKLSAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKLSAgICB9CisgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKIH0KIAogLy8gc3RvcCByZWNvcmRpbmcgbW9kZQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0b3BSZWNvcmRpbmcoKQotewotICAgIExPR1YoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0b3BSZWNvcmRpbmcoKSB7CisgICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAotICAgIC8vIGhvbGQgbWFpbiBsb2NrIGR1cmluZyBzdGF0ZSB0cmFuc2l0aW9uCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSByZXR1cm47CisgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9SRUNPUkRJTkcpOworICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpOworICAgIG1IYXJkd2FyZS0+c3RvcFJlY29yZGluZygpOwogCi0gICAgICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXJCZWVwLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllckJlZXAtPnNlZWtUbygwKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllckJlZXAtPnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSGFyZHdhcmUtPnN0b3BSZWNvcmRpbmcoKTsKLSAgICAgICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKLSAgICAgICAgTE9HVigic3RvcFJlY29yZGluZygpLCBoYXJkd2FyZSBzdG9wcGVkIE9LIik7Ci0gICAgfQotCi0gICAgLy8gaG9sZCBwcmV2aWV3IGJ1ZmZlciBsb2NrCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUHJldmlld0xvY2spOwotICAgICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwotICAgIH0KKyAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCiAvLyByZWxlYXNlIGEgcmVjb3JkaW5nIGZyYW1lCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCi17Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkKCkgIT0gTk9fRVJST1IpIHJldHVybjsKLQotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCisgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKG1lbSk7CiB9CiAKLWJvb2wgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpwcmV2aWV3RW5hYmxlZCgpCi17Citib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7CisgICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gbUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpCi17Citib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpIHsKKyAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUhhcmR3YXJlID09IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpOwogfQogCi0vLyBTYWZlbHkgcmV0cmlldmVzIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGNsaWVudCBkdXJpbmcgYSBoYXJkd2FyZSBjYWxsYmFjay4KLXNwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpCi17Ci0gICAgc3A8Q2xpZW50PiBjbGllbnQgPSAwOwotICAgIENhbWVyYVNlcnZpY2UgKnNlcnZpY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTZXJ2aWNlKj4odXNlcik7Ci0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgb3VyTG9jayhzZXJ2aWNlLT5tU2VydmljZUxvY2spOwotICAgICAgICBpZiAoc2VydmljZS0+bUNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBjbGllbnQgPSBzZXJ2aWNlLT5tQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIExPR0UoImdldENsaWVudEZyb21Db29raWU6IGNsaWVudCBhcHBlYXJzIHRvIGhhdmUgZGllZCIpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UtPm1DbGllbnQuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR0UoImdldENsaWVudEZyb21Db29raWU6IGdvdCBjYWxsYmFjayBidXQgY2xpZW50IHdhcyBOVUxMIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNsaWVudDsKLX0KLQotCi0jaWYgREVCVUdfRFVNUF9KUEVHX1NOQVBTSE9UX1RPX0ZJTEUgfHwgXAotICAgIERFQlVHX0RVTVBfWVVWX1NOQVBTSE9UX1RPX0ZJTEUgfHwgXAotICAgIERFQlVHX0RVTVBfUFJFVklFV19GUkFNRV9UT19GSUxFCi1zdGF0aWMgdm9pZCBkdW1wX3RvX2ZpbGUoY29uc3QgY2hhciAqZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKQotewotICAgIGludCBudywgY250ID0gMDsKLSAgICB1aW50MzJfdCB3cml0dGVuID0gMDsKLQotICAgIExPR1YoIm9wZW5pbmcgZmlsZSBbJXNdXG4iLCBmbmFtZSk7Ci0gICAgaW50IGZkID0gb3BlbihmbmFtZSwgT19SRFdSIHwgT19DUkVBVCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIGZpbGUgWyVzXTogJXMiLCBmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPR1YoIndyaXRpbmcgJWQgYnl0ZXMgdG8gZmlsZSBbJXNdXG4iLCBzaXplLCBmbmFtZSk7Ci0gICAgd2hpbGUgKHdyaXR0ZW4gPCBzaXplKSB7Ci0gICAgICAgIG53ID0gOjp3cml0ZShmZCwKLSAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIHdyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICBzaXplIC0gd3JpdHRlbik7Ci0gICAgICAgIGlmIChudyA8IDApIHsKLSAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byB3cml0ZSB0byBmaWxlIFslc106ICVzIiwKLSAgICAgICAgICAgICAgICAgZm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB3cml0dGVuICs9IG53OwotICAgICAgICBjbnQrKzsKLSAgICB9Ci0gICAgTE9HVigiZG9uZSB3cml0aW5nICVkIGJ5dGVzIHRvIGZpbGUgWyVzXSBpbiAlZCBwYXNzZXNcbiIsCi0gICAgICAgICBzaXplLCBmbmFtZSwgY250KTsKLSAgICA6OmNsb3NlKGZkKTsKLX0KLSNlbmRpZgotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmF1dG9Gb2N1cygpCi17Ci0gICAgTE9HVigiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6YXV0b0ZvY3VzKCkgeworICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+YXV0b0ZvY3VzKCk7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkKLXsKLSAgICBMT0dWKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7CisgICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCi0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICByZXR1cm4gbUhhcmR3YXJlLT5jYW5jZWxBdXRvRm9jdXMoKTsKIH0KIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp0YWtlUGljdHVyZSgpCi17Ci0gICAgTE9HVigidGFrZVBpY3R1cmUgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp0YWtlUGljdHVyZSgpIHsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUhhcmR3YXJlLT5lbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfU0hVVFRFUiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSk7CisgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1NIVVRURVIgfAorICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSB8CisgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSB8CisgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOwogCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+dGFrZVBpY3R1cmUoKTsKIH0KIAotLy8gc25hcHNob3QgdGFrZW4KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVTaHV0dGVyKAotICAgIGltYWdlX3JlY3RfdHlwZSAqc2l6ZSAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB5dXYgcGljdHVyZSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJCdWZmZXIuIElmIHRoaXMgaXMgTlVMTCwgdXNlIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgZnJvbSBwYXJhbWV0ZXJzLgotKQotewotICAgIC8vIFBsYXkgc2h1dHRlciBzb3VuZC4KLSAgICBpZiAobU1lZGlhUGxheWVyQ2xpY2suZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAvLyBkbyBub3QgcGxheSBzaHV0dGVyIHNvdW5kIGlmIHN0cmVhbSB2b2x1bWUgaXMgMAotICAgICAgICAvLyAodHlwaWNhbGx5IGJlY2F1c2UgcmluZ2VyIG1vZGUgaXMgc2lsZW50KS4KLSAgICAgICAgaW50IGluZGV4OwotICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OkVORk9SQ0VEX0FVRElCTEUsICZpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXJDbGljay0+c2Vla1RvKDApOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyQ2xpY2stPnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9CisvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKKyAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAKLSAgICAvLyBTY3JlZW4gZ29lcyBibGFjayBhZnRlciB0aGUgYnVmZmVyIGlzIHVucmVnaXN0ZXJlZC4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAotICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwotICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19TSFVUVEVSLCAwLCAwKTsKLSAgICB9Ci0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1NIVVRURVIpOwotCi0gICAgLy8gSXQgdGFrZXMgc29tZSB0aW1lIGJlZm9yZSB5dXZQaWN0dXJlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZC4KLSAgICAvLyBSZWdpc3RlciB0aGUgYnVmZmVyIGZvciByYXcgaW1hZ2UgaGVyZSB0byByZWR1Y2UgbGF0ZW5jeS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgaW50IHcsIGg7Ci0gICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgaWYgKHNpemUgPT0gTlVMTCkgewotICAgICAgICAgICAgcGFyYW1zLmdldFBpY3R1cmVTaXplKCZ3LCAmaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3ID0gc2l6ZS0+d2lkdGg7Ci0gICAgICAgICAgICBoID0gc2l6ZS0+aGVpZ2h0OwotICAgICAgICAgICAgdyAmPSB+MTsKLSAgICAgICAgICAgIGggJj0gfjE7Ci0gICAgICAgICAgICBMT0dWKCJTbmFwc2hvdCBpbWFnZSB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgdywgaCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRklYTUU6IGRvbid0IHVzZSBoYXJkY29kZWQgZm9ybWF0IGNvbnN0YW50cyBoZXJlCi0gICAgICAgIElTdXJmYWNlOjpCdWZmZXJIZWFwIGJ1ZmZlcnModywgaCwgdywgaCwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLCBtT3JpZW50YXRpb24sIDAsCi0gICAgICAgICAgICBtSGFyZHdhcmUtPmdldFJhd0hlYXAoKSk7Ci0KLSAgICAgICAgbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKLSAgICB9CisgICAgQ2FtZXJhUGFyYW1ldGVycyBwKHBhcmFtcyk7CisgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2V0UGFyYW1ldGVycyhwKTsKIH0KIAotLy8gcHJldmlldyBjYWxsYmFjayAtIGZyYW1lIGJ1ZmZlciB1cGRhdGUKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVQcmV2aWV3RGF0YShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewotICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKIAotI2lmIERFQlVHX0hFQVBfTEVBS1MgJiYgMCAvLyBkZWJ1Z2dpbmcKLSAgICBpZiAoZ1dlYWtIZWFwID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGdXZWFrSGVhcCAhPSBoZWFwKSB7Ci0gICAgICAgICAgICBMT0dWKCJTRVRUSU5HIFBSRVZJRVcgSEVBUCIpOwotICAgICAgICAgICAgaGVhcC0+dHJhY2tNZSh0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGdXZWFrSGVhcCA9IGhlYXA7CisgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgcmV0dXJuIHBhcmFtczsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpIHsKKyAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgaW50IG9yaWVudGF0aW9uOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTikgeworICAgICAgICAvLyBUaGUgb3JpZW50YXRpb24gY2Fubm90IGJlIHNldCBkdXJpbmcgcHJldmlldy4KKyAgICAgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0jaWYgREVCVUdfRFVNUF9QUkVWSUVXX0ZSQU1FX1RPX0ZJTEUKLSAgICB7Ci0gICAgICAgIGlmIChkZWJ1Z19mcmFtZV9jbnQrKyA9PSBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRSkgewotICAgICAgICAgICAgZHVtcF90b19maWxlKCIvZGF0YS9wcmV2aWV3Lnl1diIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOworICAgICAgICAvLyBNaXJyb3IgdGhlIHByZXZpZXcgaWYgdGhlIGNhbWVyYSBpcyBmcm9udC1mYWNpbmcuCisgICAgICAgIG9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oYXJnMSwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IC0xKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgICAgIGlmIChtT3JpZW50YXRpb24gIT0gb3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOworICAgICAgICAgICAgaWYgKG1PdmVybGF5UmVmICE9IDApIG1PcmllbnRhdGlvbkNoYW5nZWQgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKICAgICB9Ci0jZW5kaWYKIAotICAgIGlmICghbVVzZU92ZXJsYXkpCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgc3VyZmFjZUxvY2sobVN1cmZhY2VMb2NrKTsKLSAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7CisgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2VuZENvbW1hbmQoY21kLCBhcmcxLCBhcmcyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpIHsKKyAgICBhbmRyb2lkX2F0b21pY19vcihtc2dUeXBlLCAmbU1zZ0VuYWJsZWQpOworICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShtc2dUeXBlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkgeworICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+bXNnVHlwZSwgJm1Nc2dFbmFibGVkKTsKKyAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKG1zZ1R5cGUpOworfQorCisjZGVmaW5lIENIRUNLX01FU1NBR0VfSU5URVJWQUwgMTAgLy8gMTBtcworYm9vbCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmxvY2tJZk1lc3NhZ2VXYW50ZWQoaW50MzJfdCBtc2dUeXBlKSB7CisgICAgaW50IHNsZWVwQ291bnQgPSAwOworICAgIHdoaWxlIChtTXNnRW5hYmxlZCAmIG1zZ1R5cGUpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKHNsZWVwQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HMSgibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IHdhaXRlZCBmb3IgJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICBtc2dUeXBlLCBzbGVlcENvdW50ICogQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAoc2xlZXBDb3VudCsrID09IDApIHsKKyAgICAgICAgICAgIExPRzEoImxvY2tJZk1lc3NhZ2VXYW50ZWQoJWQpOiBlbnRlciBzbGVlcCIsIG1zZ1R5cGUpOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChDSEVDS19NRVNTQUdFX0lOVEVSVkFMICogMTAwMCk7CiAgICAgfQotCi0gICAgLy8gbG9jYWwgY29weSBvZiB0aGUgY2FsbGJhY2sgZmxhZ3MKLSAgICBpbnQgZmxhZ3MgPSBtUHJldmlld0NhbGxiYWNrRmxhZzsKLQotICAgIC8vIGlzIGNhbGxiYWNrIGVuYWJsZWQ/Ci0gICAgaWYgKCEoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSkgewotICAgICAgICAvLyBJZiB0aGUgZW5hYmxlIGJpdCBpcyBvZmYsIHRoZSBjb3B5LW91dCBhbmQgb25lLXNob3QgYml0cyBhcmUgaWdub3JlZAotICAgICAgICBMT0dWKCJmcmFtZSBjYWxsYmFjayBpcyBkaWFibGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBob2xkIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGNsaWVudAotICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwotCi0gICAgLy8gY2xlYXIgY2FsbGJhY2sgZmxhZ3MgaWYgbm8gY2xpZW50IG9yIG9uZS1zaG90IG1vZGUKLSAgICBpZiAoKGMgPT0gTlVMTCkgfHwgKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSkgewotICAgICAgICBMT0dWKCJEaXNhYmxlIHByZXZpZXcgY2FsbGJhY2siKTsKLSAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKLSAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHdlIHVzZSB0aGlzIEFQSSBmb3Igbm9uLW92ZXJsYXkgaGFyZHdhcmUgYXMgd2VsbD8KLSAgICAgICAgaWYgKG1Vc2VPdmVybGF5KQotICAgICAgICAgICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgIH0KLQotICAgIC8vIElzIHRoZSByZWNlaXZlZCBmcmFtZSBjb3BpZWQgb3V0IG9yIG5vdD8KLSAgICBpZiAoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKLSAgICAgICAgTE9HVigiZnJhbWUgaXMgY29waWVkIik7Ci0gICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShjLCBoZWFwLCBvZmZzZXQsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR1YoImZyYW1lIGlzIGZvcndhcmRlZCIpOwotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBtZW0pOwotICAgIH0KKyAgICBMT0dXKCJsb2NrSWZNZXNzYWdlV2FudGVkKCVkKTogZHJvcHBlZCB1bndhbnRlZCBtZXNzYWdlIiwgbXNnVHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gcG9zdHZpZXcgaW1hZ2UgcmVhZHkKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewotI2lmIERFQlVHX0RVTVBfUE9TVFZJRVdfU05BUFNIT1RfVE9fRklMRSAvLyBmb3IgdGVzdGluZyBwdXJzcG9zZXMgb25seQotICAgIHsKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgZHVtcF90b19maWxlKCIvZGF0YS9wb3N0dmlldy55dXYiLAotICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSNlbmRpZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSwgbWVtKTsKKy8vIENvbnZlcnRzIGZyb20gYSByYXcgcG9pbnRlciB0byB0aGUgY2xpZW50IHRvIGEgc3Ryb25nIHBvaW50ZXIgZHVyaW5nIGEKKy8vIGhhcmR3YXJlIGNhbGxiYWNrLiBUaGlzIHJlcXVpcmVzIHRoZSBjYWxsYmFja3Mgb25seSBoYXBwZW4gd2hlbiB0aGUgY2xpZW50CisvLyBpcyBzdGlsbCBhbGl2ZS4KK3NwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKKyAgICBzcDxDbGllbnQ+IGNsaWVudCA9IGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRCeUlkKChpbnQpIHVzZXIpOworCisgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlIENsaWVudCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBzaHV0dGluZyBkb3duICh0aGUKKyAgICAvLyBsYXN0IHN0cm9uZyByZWZlcmVuY2UgaXMgZ29uZSwgYnV0IHRoZSBkZXN0cnVjdG9yIGhhc24ndCBmaW5pc2hlZAorICAgIC8vIHN0b3BwaW5nIHRoZSBoYXJkd2FyZSkuCisgICAgaWYgKGNsaWVudCA9PSAwKSByZXR1cm4gTlVMTDsKKworICAgIC8vIFRoZSBjaGVja3MgYmVsb3cgYXJlIG5vdCBuZWNlc3NhcnkgYW5kIGFyZSBmb3IgZGVidWdnaW5nIG9ubHkuCisgICAgaWYgKGNsaWVudC0+bUNhbWVyYVNlcnZpY2UuZ2V0KCkgIT0gZ0NhbWVyYVNlcnZpY2UpIHsKKyAgICAgICAgTE9HRSgibWlzbWF0Y2ggc2VydmljZSEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSk7CisKKyAgICBpZiAoY2xpZW50LT5tSGFyZHdhcmUgPT0gMCkgeworICAgICAgICBMT0dFKCJtSGFyZHdhcmUgPT0gMDogY2FsbGJhY2sgYWZ0ZXIgZGlzY29ubmVjdCgpPyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY2xpZW50OwogfQogCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gcmF3IGltYWdlIHJlYWR5Ci12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlUmF3UGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewotICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotI2lmIERFQlVHX0hFQVBfTEVBS1MgJiYgMCAvLyBkZWJ1Z2dpbmcKLSAgICBnV2Vha0hlYXAgPSBoZWFwOyAvLyBkZWJ1Z2dpbmcKLSNlbmRpZgorLy8gQ2FsbGJhY2sgbWVzc2FnZXMgY2FuIGJlIGRpc3BhdGNoZWQgdG8gaW50ZXJuYWwgaGFuZGxlcnMgb3IgcGFzcyB0byBvdXIKKy8vIGNsaWVudCdzIGNhbGxiYWNrIGZ1bmN0aW9ucywgZGVwZW5kaW5nIG9uIHRoZSBtZXNzYWdlIHR5cGUuCisvLworLy8gbm90aWZ5Q2FsbGJhY2s6CisvLyAgICAgIENBTUVSQV9NU0dfU0hVVFRFUiAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcgorLy8gICAgICAob3RoZXJzKSAgICAgICAgICAgICAgICAgICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrCisvLyBkYXRhQ2FsbGJhY2s6CisvLyAgICAgIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSAgICAgICAgaGFuZGxlUHJldmlld0RhdGEKKy8vICAgICAgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSAgICAgICBoYW5kbGVQb3N0dmlldworLy8gICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSAgICAgICAgICAgIGhhbmRsZVJhd1BpY3R1cmUKKy8vICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFICAgICBoYW5kbGVDb21wcmVzc2VkUGljdHVyZQorLy8gICAgICAob3RoZXJzKSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjaworLy8gZGF0YUNhbGxiYWNrVGltZXN0YW1wCisvLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrVGltZXN0YW1wCisvLworLy8gTk9URTogdGhlICpDYWxsYmFjayBmdW5jdGlvbnMgZ3JhYiBtTG9jayBvZiB0aGUgY2xpZW50IGJlZm9yZSBwYXNzaW5nCisvLyBjb250cm9sIHRvIGhhbmRsZSogZnVuY3Rpb25zLiBTbyB0aGUgaGFuZGxlKiBmdW5jdGlvbnMgbXVzdCByZWxlYXNlIHRoZQorLy8gbG9jayBiZWZvcmUgY2FsbGluZyB0aGUgSUNhbWVyYUNsaWVudCdzIGNhbGxiYWNrcywgc28gdGhvc2UgY2FsbGJhY2tzIGNhbgorLy8gaW52b2tlIG1ldGhvZHMgaW4gdGhlIENsaWVudCBjbGFzcyBhZ2FpbiAoRm9yIGV4YW1wbGUsIHRoZSBwcmV2aWV3IGZyYW1lCisvLyBjYWxsYmFjayBtYXkgd2FudCB0byByZWxlYXNlUmVjb3JkaW5nRnJhbWUpLiBUaGUgaGFuZGxlKiBmdW5jdGlvbnMgbXVzdAorLy8gcmVsZWFzZSB0aGUgbG9jayBhZnRlciBhbGwgYWNjZXNzZXMgdG8gbWVtYmVyIHZhcmlhYmxlcywgc28gaXQgbXVzdCBiZQorLy8gaGFuZGxlZCB2ZXJ5IGNhcmVmdWxseS4KIAotICAgIC8vTE9HVigiaGFuZGxlUmF3UGljdHVyZSglZCwgJWQpIiwgb2Zmc2V0LCBzaXplKTsKLSNpZiBERUJVR19EVU1QX1lVVl9TTkFQU0hPVF9UT19GSUxFIC8vIGZvciB0ZXN0aW5nIHB1cnNwb3NlcyBvbmx5Ci0gICAgZHVtcF90b19maWxlKCIvZGF0YS9waG90by55dXYiLAotICAgICAgICAgICAgICAgICAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7Ci0jZW5kaWYKLQotICAgIC8vIFB1dCB0aGUgWVVWIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IGluIHRoZSBwcmV2aWV3IGRpc3BsYXkuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgfQotCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19SQVdfSU1BR0UsIG1lbSk7Ci0gICAgfQotICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19SQVdfSU1BR0UpOwotfQotCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gY29tcHJlc3NlZCBwaWN0dXJlIHJlYWR5Ci12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLXsKLSNpZiBERUJVR19EVU1QX0pQRUdfU05BUFNIT1RfVE9fRklMRSAvLyBmb3IgdGVzdGluZyBwdXJzcG9zZXMgb25seQotICAgIHsKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgZHVtcF90b19maWxlKCIvZGF0YS9waG90by5qcGciLAotICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLCBtZW0pOwotICAgIH0KLSAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSk7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKQotewotICAgIExPR1YoIm5vdGlmeUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLAorICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQqIHVzZXIpIHsKKyAgICBMT0cyKCJub3RpZnlDYWxsYmFjayglZCkiLCBtc2dUeXBlKTsKIAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBpZiAoY2xpZW50ID09IDApIHJldHVybjsKKyAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwogCiAgICAgc3dpdGNoIChtc2dUeXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX01TR19TSFVUVEVSOgpAQCAtMTA4NywzNyArOTM3LDIyIEBACiAgICAgICAgICAgICBjbGllbnQtPmhhbmRsZVNodXR0ZXIoKGltYWdlX3JlY3RfdHlwZSAqKWV4dDEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gY2xpZW50LT5tQ2FtZXJhQ2xpZW50OwotICAgICAgICAgICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrKG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotCi0jaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICBpZiAoY2xpZW50LT5nZXRTdHJvbmdDb3VudCgpID09IDEpIHsKLSAgICAgICAgTE9HRSgiKysrKysrKysrKysrKysrKyAoTk9USUZZIENBTExCQUNLKSBUSElTIFdJTEwgQ0FVU0UgQSBMT0NLVVAhIik7Ci0gICAgICAgIGNsaWVudC0+cHJpbnRSZWZzKCk7Ci0gICAgfQotI2VuZGlmCiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcikKLXsKLSAgICBMT0dWKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpIHsKKyAgICBMT0cyKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7CiAKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudEZyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgaWYgKGNsaWVudCA9PSAwKSByZXR1cm47CisgICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKIAotICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBjbGllbnQtPm1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGRhdGFQdHIgPT0gTlVMTCkgeworICAgIGlmIChkYXRhUHRyID09IDApIHsKICAgICAgICAgTE9HRSgiTnVsbCBkYXRhIHJldHVybmVkIGluIGRhdGEgY2FsbGJhY2siKTsKLSAgICAgICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgVU5LTk9XTl9FUlJPUiwgMCk7Ci0gICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgTlVMTCk7Ci0gICAgICAgIH0KKyAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMTM1LDE2MSArOTcwLDI1NiBAQAogICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVDb21wcmVzc2VkUGljdHVyZShkYXRhUHRyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY0RhdGEobXNnVHlwZSwgZGF0YVB0cik7CiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0KLSNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewotICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChEQVRBIENBTExCQUNLKSBUSElTIFdJTEwgQ0FVU0UgQSBMT0NLVVAhIik7Ci0gICAgICAgIGNsaWVudC0+cHJpbnRSZWZzKCk7Ci0gICAgfQotI2VuZGlmCiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpCi17Ci0gICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wKCVkKSIsIG1zZ1R5cGUpOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcikgeworICAgIExPRzIoImRhdGFDYWxsYmFja1RpbWVzdGFtcCglZCkiLCBtc2dUeXBlKTsKIAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gY2xpZW50LT5tQ2FtZXJhQ2xpZW50OworICAgIGlmIChjbGllbnQgPT0gMCkgcmV0dXJuOworICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAKLSAgICBpZiAoZGF0YVB0ciA9PSBOVUxMKSB7CisgICAgaWYgKGRhdGFQdHIgPT0gMCkgewogICAgICAgICBMT0dFKCJOdWxsIGRhdGEgcmV0dXJuZWQgaW4gZGF0YSB3aXRoIHRpbWVzdGFtcCBjYWxsYmFjayIpOwotICAgICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKLSAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCgwLCBtc2dUeXBlLCBOVUxMKTsKLSAgICAgICAgfQorICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNOb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwgVU5LTk9XTl9FUlJPUiwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoYyAhPSBOVUxMKSB7CisgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljRGF0YVRpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGRhdGFQdHIpOworfQorCisvLyBzbmFwc2hvdCB0YWtlbiBjYWxsYmFjaworLy8gInNpemUiIGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHl1diBwaWN0dXJlIGZvciByZWdpc3RlckJ1ZmZlci4KKy8vIElmIGl0IGlzIE5VTEwsIHVzZSB0aGUgcGljdHVyZSBzaXplIGZyb20gcGFyYW1ldGVycy4KK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVTaHV0dGVyKGltYWdlX3JlY3RfdHlwZSAqc2l6ZSkgeworICAgIG1DYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoU09VTkRfU0hVVFRFUik7CisKKyAgICAvLyBTY3JlZW4gZ29lcyBibGFjayBhZnRlciB0aGUgYnVmZmVyIGlzIHVucmVnaXN0ZXJlZC4KKyAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKKyAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgfQorCisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19TSFVUVEVSLCAwLCAwKTsKKyAgICAgICAgaWYgKCFsb2NrSWZNZXNzYWdlV2FudGVkKENBTUVSQV9NU0dfU0hVVFRFUikpIHJldHVybjsKKyAgICB9CisgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19TSFVUVEVSKTsKKworICAgIC8vIEl0IHRha2VzIHNvbWUgdGltZSBiZWZvcmUgeXV2UGljdHVyZSBjYWxsYmFjayB0byBiZSBjYWxsZWQuCisgICAgLy8gUmVnaXN0ZXIgdGhlIGJ1ZmZlciBmb3IgcmF3IGltYWdlIGhlcmUgdG8gcmVkdWNlIGxhdGVuY3kuCisgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7CisgICAgICAgIGludCB3LCBoOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgIGlmIChzaXplID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBhcmFtcy5nZXRQaWN0dXJlU2l6ZSgmdywgJmgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdyA9IHNpemUtPndpZHRoOworICAgICAgICAgICAgaCA9IHNpemUtPmhlaWdodDsKKyAgICAgICAgICAgIHcgJj0gfjE7CisgICAgICAgICAgICBoICY9IH4xOworICAgICAgICAgICAgTE9HMSgiU25hcHNob3QgaW1hZ2Ugd2lkdGg9JWQsIGhlaWdodD0lZCIsIHcsIGgpOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBkb24ndCB1c2UgaGFyZGNvZGVkIGZvcm1hdCBjb25zdGFudHMgaGVyZQorICAgICAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJzKHcsIGgsIHcsIGgsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwgbU9yaWVudGF0aW9uLCAwLAorICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRSYXdIZWFwKCkpOworCisgICAgICAgIG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisKKyAgICBtTG9jay51bmxvY2soKTsKK30KKworLy8gcHJldmlldyBjYWxsYmFjayAtIGZyYW1lIGJ1ZmZlciB1cGRhdGUKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVQcmV2aWV3RGF0YShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSB7CisgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisKKyAgICBpZiAoIW1Vc2VPdmVybGF5KSB7CisgICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CisgICAgICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbG9jYWwgY29weSBvZiB0aGUgY2FsbGJhY2sgZmxhZ3MKKyAgICBpbnQgZmxhZ3MgPSBtUHJldmlld0NhbGxiYWNrRmxhZzsKKworICAgIC8vIGlzIGNhbGxiYWNrIGVuYWJsZWQ/CisgICAgaWYgKCEoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSkgeworICAgICAgICAvLyBJZiB0aGUgZW5hYmxlIGJpdCBpcyBvZmYsIHRoZSBjb3B5LW91dCBhbmQgb25lLXNob3QgYml0cyBhcmUgaWdub3JlZAorICAgICAgICBMT0cyKCJmcmFtZSBjYWxsYmFjayBpcyBkaXNhYmxlZCIpOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGhvbGQgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgY2xpZW50CisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisKKyAgICAvLyBjbGVhciBjYWxsYmFjayBmbGFncyBpZiBubyBjbGllbnQgb3Igb25lLXNob3QgbW9kZQorICAgIGlmIChjID09IDAgfHwgKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSkgeworICAgICAgICBMT0cyKCJEaXNhYmxlIHByZXZpZXcgY2FsbGJhY2siKTsKKyAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CisgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgeworICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgLy8gSXMgdGhlIHJlY2VpdmVkIGZyYW1lIGNvcGllZCBvdXQgb3Igbm90PworICAgICAgICBpZiAoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKKyAgICAgICAgICAgIExPRzIoImZyYW1lIGlzIGNvcGllZCIpOworICAgICAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKGMsIGhlYXAsIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0cyKCJmcmFtZSBpcyBmb3J3YXJkZWQiKTsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgbWVtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gcGljdHVyZSBjYWxsYmFjayAtIHBvc3R2aWV3IGltYWdlIHJlYWR5Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlUG9zdHZpZXcoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgeworICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUpOworCisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSwgbWVtKTsKKyAgICB9Cit9CisKKy8vIHBpY3R1cmUgY2FsbGJhY2sgLSByYXcgaW1hZ2UgcmVhZHkKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVSYXdQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKKyAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1JBV19JTUFHRSk7CisKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKworICAgIC8vIFB1dCB0aGUgWVVWIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IGluIHRoZSBwcmV2aWV3IGRpc3BsYXkuCisgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7CisgICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7CisgICAgfQorCisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19SQVdfSU1BR0UsIG1lbSk7CisgICAgfQorfQorCisvLyBwaWN0dXJlIGNhbGxiYWNrIC0gY29tcHJlc3NlZCBwaWN0dXJlIHJlYWR5Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgeworICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSk7CisKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAoYyAhPSAwKSB7CisgICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIG1lbSk7CisgICAgfQorfQorCisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVHZW5lcmljTm90aWZ5KGludDMyX3QgbXNnVHlwZSwKKyAgICBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIG1Mb2NrLnVubG9jaygpOworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2sobXNnVHlwZSwgZXh0MSwgZXh0Mik7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlR2VuZXJpY0RhdGEoaW50MzJfdCBtc2dUeXBlLAorICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKSB7CisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBjLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgZGF0YVB0cik7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgeworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIG1Mb2NrLnVubG9jaygpOworICAgIGlmIChjICE9IDApIHsKICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcCwgbXNnVHlwZSwgZGF0YVB0cik7CiAgICAgfQotCi0jaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICBpZiAoY2xpZW50LT5nZXRTdHJvbmdDb3VudCgpID09IDEpIHsKLSAgICAgICAgTE9HRSgiKysrKysrKysrKysrKysrKyAoREFUQSBDQUxMQkFDSyBUSU1FU1RBTVApIFRISVMgV0lMTCBDQVVTRSBBIExPQ0tVUCEiKTsKLSAgICAgICAgY2xpZW50LT5wcmludFJlZnMoKTsKLSAgICB9Ci0jZW5kaWYKIH0KIAotLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKQotewotICAgIExPR1YoInNldFBhcmFtZXRlcnMoJXMpIiwgcGFyYW1zLnN0cmluZygpKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIENhbWVyYVBhcmFtZXRlcnMgcChwYXJhbXMpOwotCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+c2V0UGFyYW1ldGVycyhwKTsKLX0KLQotLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCi1TdHJpbmc4IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKLSAgICBMT0dWKCJnZXRQYXJhbWV0ZXJzKCVzKSIsIHBhcmFtcy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIHBhcmFtczsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpCi17Ci0gICAgTE9HVigic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAoY21kID09IENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04pIHsKLSAgICAgICAgLy8gVGhlIG9yaWVudGF0aW9uIGNhbm5vdCBiZSBzZXQgZHVyaW5nIHByZXZpZXcuCi0gICAgICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGFyZzEpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24gPSBJU3VyZmFjZTo6QnVmZmVySGVhcDo6Uk9UXzA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfOTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24gPSBJU3VyZmFjZTo6QnVmZmVySGVhcDo6Uk9UXzE4MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMjcwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBtSGFyZHdhcmUtPnNlbmRDb21tYW5kKGNtZCwgYXJnMSwgYXJnMik7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBMT0dWKCJjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUiKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjbGllbnQsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBMT0cyKCJjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUiKTsKICAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gY29weSBvdXQgb2YgcG1lbSBiZWZvcmUgc2VuZGluZyB0aGlzIHRvCiAgICAgLy8gdGhlIGNhbGxiYWNrLiBGb3IgZWZmaWNpZW5jeSwgcmV1c2UgdGhlIHNhbWUgTWVtb3J5SGVhcEJhc2UKICAgICAvLyBwcm92aWRlZCBpdCdzIGJpZyBlbm91Z2guIERvbid0IGFsbG9jYXRlIHRoZSBtZW1vcnkgb3IKICAgICAvLyBwZXJmb3JtIHRoZSBjb3B5IGlmIHRoZXJlJ3Mgbm8gY2FsbGJhY2suCi0KICAgICAvLyBob2xkIHRoZSBwcmV2aWV3IGxvY2sgd2hpbGUgd2UgZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlldyBidWZmZXIKICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gcHJldmlld0J1ZmZlcjsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1QcmV2aWV3TG9jayk7Ci0gICAgICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gbVByZXZpZXdCdWZmZXItPnZpcnR1YWxTaXplKCkpIHsKLSAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJldmlld0J1ZmZlciA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZpZXdCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBwcmV2aWV3IGJ1ZmZlciIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpZXdCdWZmZXIgPSBtUHJldmlld0J1ZmZlcjsKKworICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IG1QcmV2aWV3QnVmZmVyLT52aXJ0dWFsU2l6ZSgpKSB7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOwogICAgIH0KLSAgICBtZW1jcHkocHJldmlld0J1ZmZlci0+YmFzZSgpLAotICAgICAgICAgICAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBwcmV2aWV3IGJ1ZmZlciIpOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmV2aWV3QnVmZmVyID0gbVByZXZpZXdCdWZmZXI7CisKKyAgICBtZW1jcHkocHJldmlld0J1ZmZlci0+YmFzZSgpLCAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7CiAKICAgICBzcDxNZW1vcnlCYXNlPiBmcmFtZSA9IG5ldyBNZW1vcnlCYXNlKHByZXZpZXdCdWZmZXIsIDAsIHNpemUpOwogICAgIGlmIChmcmFtZSA9PSAwKSB7CiAgICAgICAgIExPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgZnJhbWUgY2FsbGJhY2siKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBtTG9jay51bmxvY2soKTsKICAgICBjbGllbnQtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsIGZyYW1lKTsKIH0KIAoraW50IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0T3JpZW50YXRpb24oaW50IGRlZ3JlZXMsIGJvb2wgbWlycm9yKSB7CisgICAgaWYgKCFtaXJyb3IpIHsKKyAgICAgICAgaWYgKGRlZ3JlZXMgPT0gMCkgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKGRlZ3JlZXMgPT0gOTApIHJldHVybiBIQUxfVFJBTlNGT1JNX1JPVF85MDsKKyAgICAgICAgZWxzZSBpZiAoZGVncmVlcyA9PSAxODApIHJldHVybiBIQUxfVFJBTlNGT1JNX1JPVF8xODA7CisgICAgICAgIGVsc2UgaWYgKGRlZ3JlZXMgPT0gMjcwKSByZXR1cm4gSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgIH0gZWxzZSB7ICAvLyBEbyBtaXJyb3IgKGhvcml6b250YWwgZmxpcCkKKyAgICAgICAgaWYgKGRlZ3JlZXMgPT0gMCkgeyAgICAgICAgICAgLy8gRkxJUF9IIGFuZCBST1RfMAorICAgICAgICAgICAgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fRkxJUF9IOworICAgICAgICB9IGVsc2UgaWYgKGRlZ3JlZXMgPT0gOTApIHsgICAvLyBGTElQX0ggYW5kIFJPVF85MAorICAgICAgICAgICAgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgIH0gZWxzZSBpZiAoZGVncmVlcyA9PSAxODApIHsgIC8vIEZMSVBfSCBhbmQgUk9UXzE4MAorICAgICAgICAgICAgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fRkxJUF9WOworICAgICAgICB9IGVsc2UgaWYgKGRlZ3JlZXMgPT0gMjcwKSB7ICAvLyBGTElQX0ggYW5kIFJPVF8yNzAKKyAgICAgICAgICAgIHJldHVybiBIQUxfVFJBTlNGT1JNX0ZMSVBfViB8IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgc2V0RGlzcGxheU9yaWVudGF0aW9uIGRlZ3JlZXM9JWQiLCBkZWdyZWVzKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKIApAQCAtMTMwNiw4ICsxMjM2LDcgQEAKICAgICByZXR1cm4gbG9ja2VkOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtEZWFkbG9ja2VkU3RyaW5nID0gIkNhbWVyYVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTEzMTcsNyArMTI0Niw3IEBACiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTEzMjgsODkgKzEyNTcsMzkgQEAKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAgICAgc3A8Q2xpZW50PiBjdXJyZW50Q2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIkNsaWVudCAoJXApIFBJRDogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGllbnQtPmdldENhbWVyYUNsaWVudCgpLT5hc0JpbmRlcigpLmdldCgpLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xpZW50LT5tQ2xpZW50UGlkKTsKKyAgICAgICAgYm9vbCBoYXNDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gbUNsaWVudFtpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgaGFzQ2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiQ2xpZW50WyVkXSAoJXApIFBJRDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bUNsaWVudFBpZCk7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGN1cnJlbnRDbGllbnQtPm1IYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnQtPm1IYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXNDbGllbnQpIHsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIk5vIGNhbWVyYSBjbGllbnQgeWV0LlxuIik7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgICAgICAvLyBjaGFuZ2UgbG9nZ2luZyBsZXZlbAorICAgICAgICBpbnQgbiA9IGFyZ3Muc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSArIDEgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItdiIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBsZXZlbFN0cihhcmdzW2krMV0pOworICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGF0b2kobGV2ZWxTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiU2V0IExvZyBMZXZlbCB0byAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgc2V0TG9nTGV2ZWwobGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgLy8gcGVybWlzc2lvbiBjaGVja3MuLi4KLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1Q6Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwotICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgewotICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MsIGRvIHRoZSByZWFsIGNoZWNrCi0gICAgICAgICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHVzZSB0aGUgY2FtZXJhIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0KLSNpZiBERUJVR19IRUFQX0xFQUtTCi0gICAgTE9HVigiKysrIG9uVHJhbnNhY3QgZXJyICVkIGNvZGUgJWQiLCBlcnIsIGNvZGUpOwotCi0gICAgaWYgKGVyciA9PSBVTktOT1dOX1RSQU5TQUNUSU9OIHx8IGVyciA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewotICAgICAgICAvLyB0aGUgJ3NlcnZpY2UnIGNvbW1hbmQgaW50ZXJyb2dhdGVzIHRoaXMgYmluZGVyIGZvciBpdHMgbmFtZSwgYW5kIHRoZW4gc3VwcGxpZXMgaXQKLSAgICAgICAgLy8gZXZlbiBmb3IgdGhlIGRlYnVnZ2luZyBjb21tYW5kcy4gIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBjaGVjayBmb3IgaXQgaGVyZSwgdXNpbmcKLSAgICAgICAgLy8gSVN1cmZhY2VDb21wb3NlciAoc2luY2Ugd2UgZGVsZWdhdGVkIHRoZSBJTlRFUkZBQ0VfVFJBTlNBQ1RJT04gaGFuZGxpbmcgdG8KLSAgICAgICAgLy8gQm5TdXJmYWNlQ29tcG9zZXIgYmVmb3JlIGZhbGxpbmcgdGhyb3VnaCB0byB0aGlzIGNvZGUpLgotCi0gICAgICAgIExPR1YoIisrKyBvblRyYW5zYWN0IGNvZGUgJWQiLCBjb2RlKTsKLQotICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIDEwMDA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnV2Vha0hlYXAgIT0gMCkgewotICAgICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoID0gZ1dlYWtIZWFwLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBJTWVtb3J5SGVhcCAqcCA9IGdXZWFrSGVhcC51bnNhZmVfZ2V0KCk7Ci0gICAgICAgICAgICAgICAgTE9HVigiQ0hFQ0tJTkcgV0VBSyBSRUZFUkVOQ0UgJXAgKCVwKSIsIGguZ2V0KCksIHApOwotICAgICAgICAgICAgICAgIGlmIChoICE9IDApCi0gICAgICAgICAgICAgICAgICAgIGgtPnByaW50UmVmcygpOwotICAgICAgICAgICAgICAgIGJvb2wgYXR0ZW1wdF90b19kZWxldGUgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRfdG9fZGVsZXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5PVCBTQUZFIQotICAgICAgICAgICAgICAgICAgICBMT0dWKCJERUxFVElORyBXRUFLIFJFRkVSRU5DRSAlcCAoJXApIiwgaC5nZXQoKSwgcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwKSBkZWxldGUgcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLy8gREVCVUdfSEVBUF9MRUFLUwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA3NWU5NmM2Li5mMDk3NzNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xOCwyMDkgKzE4LDE4OCBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKwogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKworLyogVGhpcyBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaWYgd2UgY2FuIGhhdmUgbW9yZSBjYW1lcmFzICovCisjZGVmaW5lIE1BWF9DQU1FUkFTIDIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBNZW1vcnlIZWFwQmFzZTsKIGNsYXNzIE1lZGlhUGxheWVyOwogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKLSNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKLQotLy8gV2hlbiBlbmFibGVkLCB0aGlzIGZlYXR1cmUgYWxsb3dzIHlvdSB0byBzZW5kIGFuIGV2ZW50IHRvIHRoZSBDYW1lcmFTZXJ2aWNlCi0vLyBzbyB0aGF0IHlvdSBjYW4gY2F1c2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGhlYXAgb2JqZWN0IGdXZWFrSGVhcCwgZGVmaW5lZAotLy8gYmVsb3csIHRvIGJlIHByaW50ZWQuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZXQgREVCVUdfUkVGUz0xIGFuZAotLy8gREVCVUdfUkVGU19FTkFCTEVEX0JZX0RFRkFVTFQ9MCBpbiBsaWJ1dGlscy9SZWZCYXNlLmNwcC4gWW91IGp1c3QgaGF2ZSB0bwotLy8gc2V0IGdXZWFrSGVhcCB0byB0aGUgYXBwcm9wcmlhdGUgaGVhcCB5b3Ugd2FudCB0byB0cmFjay4KLQotI2RlZmluZSBERUJVR19IRUFQX0xFQUtTIDAKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDYW1lcmFTZXJ2aWNlIDogcHVibGljIEJuQ2FtZXJhU2VydmljZQorY2xhc3MgQ2FtZXJhU2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT4sCisgICAgcHVibGljIEJuQ2FtZXJhU2VydmljZQogewogICAgIGNsYXNzIENsaWVudDsKLQorICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPENhbWVyYVNlcnZpY2U+OwogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNhbWVyYSI7IH0KIAotICAgIC8vIElDYW1lcmFTZXJ2aWNlIGludGVyZmFjZQotICAgIHZpcnR1YWwgc3A8SUNhbWVyYT4gICAgIGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlKCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+Q2FtZXJhU2VydmljZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOworICAgIHZpcnR1YWwgc3A8SUNhbWVyYT4gY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LCBpbnQgY2FtZXJhSWQpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVtb3ZlQ2xpZW50KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQpOworICAgIHZpcnR1YWwgc3A8Q2xpZW50PiAgZ2V0Q2xpZW50QnlJZChpbnQgY2FtZXJhSWQpOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcmVtb3ZlQ2xpZW50KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgZW51bSBzb3VuZF9raW5kIHsKKyAgICAgICAgU09VTkRfU0hVVFRFUiA9IDAsCisgICAgICAgIFNPVU5EX1JFQ09SRElORyA9IDEsCisgICAgICAgIE5VTV9TT1VORFMKKyAgICB9OworCisgICAgdm9pZCAgICAgICAgICAgICAgICBsb2FkU291bmQoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHBsYXlTb3VuZChzb3VuZF9raW5kIGtpbmQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVsZWFzZVNvdW5kKCk7CiAKIHByaXZhdGU6CisgICAgTXV0ZXggICAgICAgICAgICAgICBtU2VydmljZUxvY2s7CisgICAgd3A8Q2xpZW50PiAgICAgICAgICBtQ2xpZW50W01BWF9DQU1FUkFTXTsgIC8vIHByb3RlY3RlZCBieSBtU2VydmljZUxvY2sKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXM7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBhdG9taWNzIHRvIHJlY29yZCB3aGV0aGVyIHRoZSBoYXJkd2FyZSBpcyBhbGxvY2F0ZWQgdG8gc29tZSBjbGllbnQuCisgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtQnVzeVtNQVhfQ0FNRVJBU107CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFCdXN5KGludCBjYW1lcmFJZCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGludCBjYW1lcmFJZCk7CiAKLSAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgQm5DYW1lcmEgeworICAgIC8vIHNvdW5kcworICAgIE11dGV4ICAgICAgICAgICAgICAgbVNvdW5kTG9jazsKKyAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCisgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCisgICAgewogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSUNhbWVyYSBpbnRlcmZhY2UgKHNlZSBJQ2FtZXJhIGZvciBkZXRhaWxzKQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgLy8gY29ubmVjdCBuZXcgY2xpZW50IHdpdGggZXhpc3RpbmcgY2FtZXJhIHJlbW90ZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjbGllbnQpOwotCi0gICAgICAgIC8vIHByZXZlbnQgb3RoZXIgcHJvY2Vzc2VzIGZyb20gdXNpbmcgdGhpcyBJQ2FtZXJhIGludGVyZmFjZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBsb2NrKCk7Ci0KLSAgICAgICAgLy8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHVubG9jaygpOwotCi0gICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOwotCi0gICAgICAgIC8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCi0gICAgICAgIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpOwotCi0gICAgICAgIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGZsYWcpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFByZXZpZXcoKTsKLQotICAgICAgICAvLyBzdG9wIHByZXZpZXcgbW9kZQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUHJldmlldygpOwotCi0gICAgICAgIC8vIGdldCBwcmV2aWV3IHN0YXRlCiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHByZXZpZXdFbmFibGVkKCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRSZWNvcmRpbmcoKTsKLQotICAgICAgICAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BSZWNvcmRpbmcoKTsKLQotICAgICAgICAvLyBnZXQgcmVjb3JkaW5nIHN0YXRlCiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlY29yZGluZ0VuYWJsZWQoKTsKLQotICAgICAgICAvLyByZWxlYXNlIGEgcmVjb3JkaW5nIGZyYW1lCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKLQotICAgICAgICAvLyBhdXRvIGZvY3VzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF1dG9Gb2N1cygpOwotCi0gICAgICAgIC8vIGNhbmNlbCBhdXRvIGZvY3VzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbEF1dG9Gb2N1cygpOwotCi0gICAgICAgIC8vIHRha2UgYSBwaWN0dXJlIC0gcmV0dXJucyBhbiBJTWVtb3J5IChyZWYtY291bnRlZCBtbWFwKQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB0YWtlUGljdHVyZSgpOwotCi0gICAgICAgIC8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7Ci0KLSAgICAgICAgLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgICAgIGdldFBhcmFtZXRlcnMoKSBjb25zdDsKLQotICAgICAgICAvLyBzZW5kIGNvbW1hbmQgdG8gY2FtZXJhIGRyaXZlcgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOwotCi0gICAgICAgIC8vIG91ciBjbGllbnQuLi4KLSAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mICAgIGdldENhbWVyYUNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFDbGllbnQ7IH0KLQogICAgIHByaXZhdGU6CiAgICAgICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRQaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQoKTsKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkNsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgaGFyZHdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5DbGllbnQoKTsKIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjaGVja1BpZCgpOworICAgICAgICAvLyByZXR1cm4gb3VyIGNhbWVyYSBjbGllbnQKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mICAgIGdldENhbWVyYUNsaWVudCgpIHsgcmV0dXJuIG1DYW1lcmFDbGllbnQ7IH0KIAotICAgICAgICBzdGF0aWMgICAgICB2b2lkICAgICAgICBub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKTsKLSAgICAgICAgc3RhdGljICAgICAgdm9pZCAgICAgICAgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOwotICAgICAgICBzdGF0aWMgICAgICB2b2lkICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKTsKKyAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgY2FsbGluZyBwcm9jZXNzIG1hdGNoZXMgbUNsaWVudFBpZC4KKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgY2hlY2tQaWQoKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgY2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0OyAgLy8gYWxzbyBjaGVjayBtSGFyZHdhcmUgIT0gMAogCi0gICAgICAgIHN0YXRpYyAgICAgIHNwPENsaWVudD4gIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUHJldmlld0RhdGEoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKmltYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUG9zdHZpZXcoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUmF3UGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVDb21wcmVzc2VkUGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgICAgIC8vIHRoZXNlIGFyZSBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byBzZXQgdXAgcHJldmlldyBidWZmZXJzCisgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0T3ZlcmxheSgpOwogCiAgICAgICAgIC8vIGNhbWVyYSBvcGVyYXRpb24gbW9kZQogICAgICAgICBlbnVtIGNhbWVyYV9tb2RlIHsKICAgICAgICAgICAgIENBTUVSQV9QUkVWSUVXX01PREUgICA9IDAsICAvLyBmcmFtZSBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkCiAgICAgICAgICAgICBDQU1FUkFfUkVDT1JESU5HX01PREUgPSAxLCAgLy8gZnJhbWUgaGFzIHRvIGJlIGV4cGxpY2l0bHkgcmVsZWFzZWQgYnkgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkKICAgICAgICAgfTsKKyAgICAgICAgLy8gdGhlc2UgYXJlIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGZvciBwcmV2aWV3L3JlY29yZGluZwogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydENhbWVyYU1vZGUoY2FtZXJhX21vZGUgbW9kZSk7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0UHJldmlld01vZGUoKTsKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRSZWNvcmRpbmdNb2RlKCk7Ci0gICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldE92ZXJsYXkoKTsKLSAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOworCisgICAgICAgIC8vIHRoZXNlIGFyZSBzdGF0aWMgY2FsbGJhY2sgZnVuY3Rpb25zCisgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIsIHZvaWQqIHVzZXIpOworICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcik7CisgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcik7CisgICAgICAgIC8vIGNvbnZlcnQgY2xpZW50IGZyb20gY29va2llCisgICAgICAgIHN0YXRpYyBzcDxDbGllbnQ+ICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CisgICAgICAgIC8vIGhhbmRsZXJzIGZvciBtZXNzYWdlcworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaHV0dGVyKGltYWdlX3JlY3RfdHlwZSAqc2l6ZSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVByZXZpZXdEYXRhKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmF3UGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdlbmVyaWNOb3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdlbmVyaWNEYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7CisKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24sIGJvb2wgbWlycm9yKTsKKworICAgICAgICAvLyB0aGVzZSBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiAgICAgICAgICAgICAgIG1DYW1lcmFTZXJ2aWNlOyAgLy8gaW1tdXRhYmxlIGFmdGVyIGNvbnN0cnVjdG9yCisgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+ICAgICAgICAgICAgICAgbUNhbWVyYUNsaWVudDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQ7ICAgICAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgorICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFGYWNpbmc7ICAgLy8gaW1tdXRhYmxlIGFmdGVyIGNvbnN0cnVjdG9yCisgICAgICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKKyAgICAgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+ICAgICBtSGFyZHdhcmU7ICAgICAgIC8vIGNsZWFyZWQgYWZ0ZXIgZGlzY29ubmVjdCgpCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVzZU92ZXJsYXk7ICAgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICAgICAgc3A8T3ZlcmxheVJlZj4gICAgICAgICAgICAgICAgICBtT3ZlcmxheVJlZjsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheVc7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU92ZXJsYXlIOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsgICAgIC8vIEN1cnJlbnQgZGlzcGxheSBvcmllbnRhdGlvbgorICAgICAgICAvLyBUcnVlIGlmIGRpc3BsYXkgb3JpZW50YXRpb24gaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBpcyBvbmx5IHVzZWQgaW4gb3ZlcmxheS4KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb25DaGFuZ2VkOwogCiAgICAgICAgIC8vIEVuc3VyZXMgYXRvbWljaXR5IGFtb25nIHRoZSBwdWJsaWMgbWV0aG9kcwotICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAKLSAgICAgICAgLy8gbVN1cmZhY2VMb2NrIHN5bmNocm9uaXplcyBhY2Nlc3MgdG8gbVN1cmZhY2UgYmV0d2VlbgotICAgICAgICAvLyBzZXRQcmV2aWV3U3VyZmFjZSgpIGFuZCBwb3N0UHJldmlld0ZyYW1lKCkuICBOb3RlIHRoYXQgYW1vbmcKLSAgICAgICAgLy8gdGhlIHB1YmxpYyBtZXRob2RzLCBhbGwgYWNjZXNzZXMgdG8gbVN1cmZhY2UgYXJlCi0gICAgICAgIC8vIHN5bmNyaG9uaXplZCBieSBtTG9jay4gIEhvd2V2ZXIsIHBvc3RQcmV2aWV3RnJhbWUoKSBpcyBjYWxsZWQKLSAgICAgICAgLy8gYnkgdGhlIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIGNhbGxiYWNrLCBhbmQgbmVlZHMgdG8KLSAgICAgICAgLy8gYWNjZXNzIG1TdXJmYWNlLiAgSXQgY2Fubm90IGhvbGQgbUxvY2ssIGhvd2V2ZXIsIGJlY2F1c2UKLSAgICAgICAgLy8gc3RvcFByZXZpZXcoKSBtYXkgYmUgaG9sZGluZyB0aGF0IGxvY2sgd2hpbGUgYXR0ZW1wdGluZwotICAgICAgICAvLyB0byBzdG9wIHByZXZpZXcsIGFuZCBzdG9wUHJldmlldyBpdHNlbGYgd2lsbCBibG9jayB3YWl0aW5nCi0gICAgICAgIC8vIGZvciBhIGNhbGxiYWNrIGZyb20gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuICBJZiB0aGlzCi0gICAgICAgIC8vIGhhcHBlbnMsIGl0IHdpbGwgY2F1c2UgYSBkZWFkbG9jay4KLSAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlTG9jazsKLSAgICAgICAgbXV0YWJsZSAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgIG1SZWFkeTsKLSAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gICAgICAgICAgIG1DYW1lcmFTZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICBzcDxJU3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZzsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKKyAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCisgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiAgICAgICAgICAgICAgbVByZXZpZXdCdWZmZXI7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICAgICAgICAgIG1NZWRpYVBsYXllckNsaWNrOwotICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllcj4gICAgICAgICAgICAgbU1lZGlhUGxheWVyQmVlcDsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2hlbiB0aGUgaW5jb21pbmcgY29tbWFuZCB0aHJlYWQgYW5kCisgICAgICAgIC8vIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjayB0aHJlYWQgYm90aCB3YW50IHRvIGdyYWIgbUxvY2suCisgICAgICAgIC8vIEFuIGV4dHJhIGZsYWcgaXMgdXNlZCB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcAorICAgICAgICAvLyB0cnlpbmcgdG8gZGVsaXZlciB0aGUgY2FsbGJhY2sgbWVzc2FnZXMgaWYgdGhlIGNsaWVudCBpcyBub3QKKyAgICAgICAgLy8gaW50ZXJlc3RlZCBpbiBpdCBhbnltb3JlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNsaWVudCBpcyBjYWxsaW5nCisgICAgICAgIC8vIHN0b3BQcmV2aWV3KCksIHRoZSBwcmV2aWV3IGZyYW1lIG1lc3NhZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIGRlbGl2ZXJlZAorICAgICAgICAvLyBhbnltb3JlLgogCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBpbW11dGFibGUgb25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrCi0gICAgICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+ICAgICAgICAgICBtQ2FtZXJhQ2xpZW50OwotICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gbUhhcmR3YXJlOwotICAgICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VPdmVybGF5OworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzYW1lIHBhcmFtZXRlciBhcyB0aGUgZW5hYmxlTXNnVHlwZSgpIGFuZAorICAgICAgICAvLyBkaXNhYmxlTXNnVHlwZSgpIGZ1bmN0aW9ucyBpbiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS4KKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNhYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOworICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtTXNnRW5hYmxlZDsKIAotICAgICAgICAgICAgICAgICAgICBzcDxPdmVybGF5UmVmPiAgICAgICAgICAgICAgbU92ZXJsYXlSZWY7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheVc7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheUg7Ci0KLSAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3TG9jazsKLSAgICAgICAgICAgICAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyeWluZyB0byBncmFiIG1Mb2NrLCBvciBnaXZlIHVwIGlmIHRoZSBtZXNzYWdlCisgICAgICAgIC8vIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkLiBJdCByZXR1cm5zIHRydWUgaWYgbUxvY2sgaXMgZ3JhYmJlZC4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbG9ja0lmTWVzc2FnZVdhbnRlZChpbnQzMl90IG1zZ1R5cGUpOwogICAgIH07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVNlcnZpY2UoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+Q2FtZXJhU2VydmljZSgpOwotCi0gICAgLy8gV2UgdXNlIGEgY291bnQgZm9yIG51bWJlciBvZiBjbGllbnRzIChzaG91bGUgb25seSBiZSAwIG9yIDEpLgotICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtVXNlcnM7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGluY1VzZXJzKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGRlY1VzZXJzKCk7Ci0KLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwotICAgICAgICAgICAgICAgIHdwPENsaWVudD4gICAgICAgICAgICAgICAgICBtQ2xpZW50OwotCi0jaWYgREVCVUdfSEVBUF9MRUFLUwotICAgICAgICAgICAgICAgIHdwPElNZW1vcnlIZWFwPiAgICAgICAgICAgICBnV2Vha0hlYXA7Ci0jZW5kaWYKIH07CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9GYWtlQ2FtZXJhLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCmluZGV4IDY3NDk4OTkuLmYzYTZhNjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCkBAIC0xOTgsMTAgKzE5OCwxMSBAQAogc3RhdGljIGNvbnN0IGludCAgREVMVEEgID0ga1liKigxIDw8IFNISUZUMik7CiBzdGF0aWMgY29uc3QgaW50ICBHQU1NQSAgPSBrWXIqKDEgPDwgU0hJRlQyKTsKIAotaW50MzJfdCBjY3JnYjE2dG95dXZfd29fY29sb3JrZXkodWludDhfdCAqcmdiMTYsdWludDhfdCAqeXV2NDIyLHVpbnQzMl90ICpwYXJhbSx1aW50OF90ICp0YWJsZVtdKQoraW50MzJfdCBjY3JnYjE2dG95dXZfd29fY29sb3JrZXkodWludDhfdCAqcmdiMTYsIHVpbnQ4X3QgKnl1djQyMCwKKyAgICAgICAgdWludDMyX3QgKnBhcmFtLCB1aW50OF90ICp0YWJsZVtdKQogewogICAgIHVpbnQxNl90ICppbnB1dFJHQiA9ICh1aW50MTZfdCopcmdiMTY7Ci0gICAgdWludDhfdCAqb3V0WVVWID0gIHl1djQyMjsKKyAgICB1aW50OF90ICpvdXRZVVYgPSB5dXY0MjA7CiAgICAgaW50MzJfdCB3aWR0aF9kc3QgPSBwYXJhbVswXTsKICAgICBpbnQzMl90IGhlaWdodF9kc3QgPSBwYXJhbVsxXTsKICAgICBpbnQzMl90IHBpdGNoX2RzdCA9IHBhcmFtWzJdOwpAQCAtMjYwLDEyICsyNjEsMTQgQEAKIAogICAgICAgICAgICAgdGVtcFlbMF0gPSB5MDsKICAgICAgICAgICAgIHRlbXBZWzFdID0geTE7Ci0gICAgICAgICAgICB0ZW1wVVswXSA9IHU7Ci0gICAgICAgICAgICB0ZW1wVlswXSA9IHY7Ci0KICAgICAgICAgICAgIHRlbXBZICs9IDI7Ci0gICAgICAgICAgICB0ZW1wVSArPSAyOwotICAgICAgICAgICAgdGVtcFYgKz0gMjsKKworICAgICAgICAgICAgaWYgKChqJjEpID09IDApIHsKKyAgICAgICAgICAgICAgICB0ZW1wVVswXSA9IHU7CisgICAgICAgICAgICAgICAgdGVtcFZbMF0gPSB2OworICAgICAgICAgICAgICAgIHRlbXBVICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcFYgKz0gMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlucHV0UkdCICs9IHBpdGNoX3NyYzsKQEAgLTI3Nyw3ICsyODAsNyBAQAogI2RlZmluZSBtaW4oYSxiKSAoKGEpPChiKT8oYSk6KGIpKQogI2RlZmluZSBtYXgoYSxiKSAoKGEpPihiKT8oYSk6KGIpKQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjE2X3RvX3l1djQyMih1aW50OF90ICpyZ2IsIHVpbnQ4X3QgKnl1diwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorc3RhdGljIHZvaWQgY29udmVydF9yZ2IxNl90b195dXY0MjAodWludDhfdCAqcmdiLCB1aW50OF90ICp5dXYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBpZiAoIXRhYmxlc19pbml0aWFsaXplZCkgewogICAgICAgICBpbml0WXRhYigpOwpAQCAtMzI2LDcgKzMyOSw3IEBACiAgICAgbUNoZWNrWSA9IDA7CiAKICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gYmUgcmVhbGxvY2F0ZWQgb24gdGhlIG5leHQgY2FsbAotICAgIC8vIHRvIGdldE5leHRGcmFtZUFzWXV2NDIyKCkuCisgICAgLy8gdG8gZ2V0TmV4dEZyYW1lQXNZdXY0MjAoKS4KICAgICBkZWxldGVbXSBtVG1wUmdiMTZCdWZmZXI7CiAgICAgbVRtcFJnYjE2QnVmZmVyID0gMDsKIH0KQEAgLTM0NywxMyArMzUwLDEzIEBACiAgICAgbUNvdW50ZXIrKzsKIH0KIAotdm9pZCBGYWtlQ2FtZXJhOjpnZXROZXh0RnJhbWVBc1l1djQyMih1aW50OF90ICpidWZmZXIpCit2b2lkIEZha2VDYW1lcmE6OmdldE5leHRGcmFtZUFzWXV2NDIwKHVpbnQ4X3QgKmJ1ZmZlcikKIHsKICAgICBpZiAobVRtcFJnYjE2QnVmZmVyID09IDApCiAgICAgICAgIG1UbXBSZ2IxNkJ1ZmZlciA9IG5ldyB1aW50MTZfdFttV2lkdGggKiBtSGVpZ2h0XTsKIAogICAgIGdldE5leHRGcmFtZUFzUmdiNTY1KG1UbXBSZ2IxNkJ1ZmZlcik7Ci0gICAgY29udmVydF9yZ2IxNl90b195dXY0MjIoKHVpbnQ4X3QqKW1UbXBSZ2IxNkJ1ZmZlciwgYnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIGNvbnZlcnRfcmdiMTZfdG9feXV2NDIwKCh1aW50OF90KiltVG1wUmdiMTZCdWZmZXIsIGJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0KTsKIH0KIAogdm9pZCBGYWtlQ2FtZXJhOjpkcmF3U3F1YXJlKHVpbnQxNl90ICpkc3QsIGludCB4LCBpbnQgeSwgaW50IHNpemUsIGludCBjb2xvciwgaW50IHNoYWRvdykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuaAppbmRleCBmN2Y4ODAzLi43MjRkZTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9GYWtlQ2FtZXJhLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvRmFrZUNhbWVyYS5oCkBAIC00MCw3ICs0MCw3IEBACiAgICAgfkZha2VDYW1lcmEoKTsKIAogICAgIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIHZvaWQgZ2V0TmV4dEZyYW1lQXNZdXY0MjIodWludDhfdCAqYnVmZmVyKTsKKyAgICB2b2lkIGdldE5leHRGcmFtZUFzWXV2NDIwKHVpbnQ4X3QgKmJ1ZmZlcik7CiAgICAgLy8gV3JpdGUgdG8gdGhlIGZkIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZS4KICAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tawppbmRleCA5YmIxOTBhLi5jZjRlNDJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tawpAQCAtMjEsNCArMjEsNiBAQAogICAgICAgICAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgICAgICAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudAogCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKyMgRGlzYWJsZSBpdCBiZWNhdXNlIHRoZSBJU3VyZmFjZSBpbnRlcmZhY2UgbWF5IGNoYW5nZSwgYW5kIGJlZm9yZSB3ZSBoYXZlIGEKKyMgY2hhbmNlIHRvIGZpeCB0aGlzIHRlc3QsIHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgbm9ybWFsIGJ1aWxkcy4KKyNpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQ2FtZXJhU2VydmljZVRlc3QuY3BwCmluZGV4IDlmYzc5NWIuLjNjOGQ1NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcApAQCAtMzgsNyArMzgsNyBAQAogICAgIElORk8oImFzc2VydGlvbiBmYWlsZWQgYXQgZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXM6IiwKICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGZ1bmMpOwogICAgIElORk8oIiVzIiwgZXhwcik7Ci0gICAgZXhpdCgxKTsKKyAgICBhYm9ydCgpOwogfQogCiB2b2lkIGFzc2VydF9lcV9mYWlsKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jLApAQCAtNDYsNyArNDYsNyBAQAogICAgIElORk8oImFzc2VydGlvbiBmYWlsZWQgYXQgZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXM6IiwKICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGZ1bmMpOwogICAgIElORk8oIihleHBlY3RlZCkgJXMgIT0gKGFjdHVhbCkgJWQiLCBleHByLCBhY3R1YWwpOwotICAgIGV4aXQoMSk7CisgICAgYWJvcnQoKTsKIH0KIAogI2RlZmluZSBBU1NFUlQoZSkgXApAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpOwogICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSk7CiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGEpIHt9CisgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhKTsKIAogICAgIC8vIG5ldyBmdW5jdGlvbnMKICAgICB2b2lkIGNsZWFyU3RhdCgpOwpAQCAtMTc2LDYgKzE3Niw3IEBACiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIGludD4gbURhdGFDb3VudDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgaW50PiBtRGF0YVNpemU7CiAgICAgYm9vbCB0ZXN0KE9QIG9wLCBpbnQgdjEsIGludCB2Mik7CisgICAgdm9pZCBhc3NlcnRUZXN0KE9QIG9wLCBpbnQgdjEsIGludCB2Mik7CiAKICAgICBJQ2FtZXJhICptUmVsZWFzZXI7CiB9OwpAQCAtMTk5LDI2ICsyMDAsMzMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0VGVzdChPUCBvcCwgaW50IHYxLCBpbnQgdjIpIHsKKyAgICBpZiAoIXRlc3Qob3AsIHYxLCB2MikpIHsKKyAgICAgICAgTE9HRSgiYXNzZXJ0VGVzdCBmYWlsZWQ6IG9wPSVkLCB2MT0lZCwgdjI9JWQiLCBvcCwgdjEsIHYyKTsKKyAgICAgICAgQVNTRVJUKDApOworICAgIH0KK30KKwogdm9pZCBNQ2FtZXJhQ2xpZW50Ojphc3NlcnROb3RpZnkoaW50MzJfdCBtc2dUeXBlLCBPUCBvcCwgaW50IGNvdW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnQgdiA9IG1Ob3RpZnlDb3VudC52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgY291bnQpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBjb3VudCk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0RGF0YShpbnQzMl90IG1zZ1R5cGUsIE9QIG9wLCBpbnQgY291bnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGludCB2ID0gbURhdGFDb3VudC52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgY291bnQpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBjb3VudCk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0RGF0YVNpemUoaW50MzJfdCBtc2dUeXBlLCBPUCBvcCwgaW50IGRhdGFTaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnQgdiA9IG1EYXRhU2l6ZS52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgZGF0YVNpemUpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBkYXRhU2l6ZSk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3NpemVfdCBpID0gbU5vdGlmeUNvdW50LmluZGV4T2ZLZXkobXNnVHlwZSk7CiAgICAgaWYgKGkgPCAwKSB7CkBAIC0yMzAsNyArMjM4LDcgQEAKIH0KIAogdm9pZCBNQ2FtZXJhQ2xpZW50OjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSkgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIGludCBkYXRhU2l6ZSA9IGRhdGEtPnNpemUoKTsKICAgICBJTkZPKCJkYXRhIHR5cGUgPSAlZCwgc2l6ZSA9ICVkIiwgbXNnVHlwZSwgZGF0YVNpemUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yNTAsNiArMjU4LDExIEBACiAgICAgfQogfQogCit2b2lkIE1DYW1lcmFDbGllbnQ6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSkgeworICAgIGRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhKTsKK30KKwogdm9pZCBNQ2FtZXJhQ2xpZW50Ojp3YWl0Tm90aWZ5KGludDMyX3QgbXNnVHlwZSwgT1Agb3AsIGludCBjb3VudCkgewogICAgIElORk8oIndhaXROb3RpZnk6ICVkLCAlZCwgJWQiLCBtc2dUeXBlLCBvcCwgY291bnQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yODUsNiArMjk4LDcgQEAKICAgICB2aXJ0dWFsIHNwPE92ZXJsYXlSZWY+IGNyZWF0ZU92ZXJsYXkoCiAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBvcmllbnRhdGlvbik7CiAgICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiByZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsIGludCB1c2FnZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOwogCiAgICAgLy8gbmV3IGZ1bmN0aW9ucwogICAgIHZvaWQgY2xlYXJTdGF0KCk7CkBAIC0zMDAsNyArMzE0LDcgQEAKIH07CiAKIHN0YXR1c190IE1TdXJmYWNlOjpyZWdpc3RlckJ1ZmZlcnMoY29uc3QgQnVmZmVySGVhcCYgYnVmZmVycykgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgKytyZWdpc3RlckJ1ZmZlcnNDb3VudDsKICAgICBtQ29uZC5zaWduYWwoKTsKQEAgLTMwOCwyMSArMzIyLDI2IEBACiB9CiAKIHZvaWQgTVN1cmZhY2U6OnBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpIHsKLSAgICAvLyBJTkZPKF9fZnVuY19fKTsKKyAgICAvLyBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICsrcG9zdEJ1ZmZlckNvdW50OwogICAgIG1Db25kLnNpZ25hbCgpOwogfQogCiB2b2lkIE1TdXJmYWNlOjp1bnJlZ2lzdGVyQnVmZmVycygpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICsrdW5yZWdpc3RlckJ1ZmZlcnNDb3VudDsKICAgICBtQ29uZC5zaWduYWwoKTsKIH0KIAogc3A8R3JhcGhpY0J1ZmZlcj4gTVN1cmZhY2U6OnJlcXVlc3RCdWZmZXIoaW50IGJ1ZmZlcklkeCwgaW50IHVzYWdlKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IE1TdXJmYWNlOjpzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQ4LDEwICszNjcsOSBAQAogCiBzcDxPdmVybGF5UmVmPiBNU3VyZmFjZTo6Y3JlYXRlT3ZlcmxheSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCwKICAgICAgICAgaW50MzJfdCBvcmllbnRhdGlvbikgewotICAgIC8vIFdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGJlIGNhbGxlZCBpbiBjdXJyZW50IGhhcmR3YXJlLgorICAgIC8vIE5vdCBpbXBsZW1lbnRlZC4KICAgICBBU1NFUlQoMCk7Ci0gICAgc3A8T3ZlcmxheVJlZj4gZHVtbXk7Ci0gICAgcmV0dXJuIGR1bW15OworICAgIHJldHVybiBOVUxMOwogfQogCiAvLwpAQCAtMzY4LDE3ICszODYsMTcgQEAKIH0KIAogdm9pZCBwdXRUZW1wT2JqZWN0KHNwPElCaW5kZXI+IG9iaikgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIGdldEhvbGRlcigpLT5wdXQob2JqKTsKIH0KIAogc3A8SUJpbmRlcj4gZ2V0VGVtcE9iamVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gZ2V0SG9sZGVyKCktPmdldCgpOwogfQogCiB2b2lkIGNsZWFyVGVtcE9iamVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBnZXRIb2xkZXIoKS0+Y2xlYXIoKTsKIH0KIApAQCAtMzk1LDY0ICs0MTMsNzEgQEAKICAgICByZXR1cm4gY3M7CiB9CiAKK2ludCBnZXROdW1iZXJPZkNhbWVyYXMoKSB7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIHJldHVybiBjcy0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7Cit9CisKIC8vCiAvLyBWYXJpb3VzIENvbm5lY3QgVGVzdHMKIC8vCi12b2lkIHRlc3RDb25uZWN0KCkgewotICAgIElORk8oX19mdW5jX18pOwordm9pZCB0ZXN0Q29ubmVjdChpbnQgY2FtZXJhSWQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgYy0+ZGlzY29ubmVjdCgpOwogfQogCi12b2lkIHRlc3RBbGxvd0Nvbm5lY3RPbmNlT25seSgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKK3ZvaWQgdGVzdEFsbG93Q29ubmVjdE9uY2VPbmx5KGludCBjYW1lcmFJZCkgeworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICAvLyBDb25uZWN0IHRoZSBmaXJzdCBjbGllbnQuCiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gU2FtZSBjbGllbnQgLS0gb2suCi0gICAgQVNTRVJUKGNzLT5jb25uZWN0KGNjKSAhPSAwKTsKKyAgICBBU1NFUlQoY3MtPmNvbm5lY3QoY2MsIGNhbWVyYUlkKSAhPSAwKTsKICAgICAvLyBEaWZmZXJlbnQgY2xpZW50IC0tIG5vdCBvay4KICAgICBzcDxNQ2FtZXJhQ2xpZW50PiBjYzIgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIEFTU0VSVChjcy0+Y29ubmVjdChjYzIpID09IDApOworICAgIEFTU0VSVChjcy0+Y29ubmVjdChjYzIsIGNhbWVyYUlkKSA9PSAwKTsKICAgICBjLT5kaXNjb25uZWN0KCk7CiB9CiAKIHZvaWQgdGVzdFJlY29ubmVjdEZhaWxlZCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhPiBjID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4oZ2V0VGVtcE9iamVjdCgpKTsKLSAgICBzcDxNQ2FtZXJhQ2xpZW50PiBjYzIgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIEFTU0VSVChjLT5jb25uZWN0KGNjMikgIT0gTk9fRVJST1IpOworICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKKyAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgIT0gTk9fRVJST1IpOwogfQogCiB2b2lkIHRlc3RSZWNvbm5lY3RTdWNjZXNzKCkgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIHNwPElDYW1lcmE+IGMgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihnZXRUZW1wT2JqZWN0KCkpOwogICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKICAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgPT0gTk9fRVJST1IpOworICAgIGMtPmRpc2Nvbm5lY3QoKTsKIH0KIAogdm9pZCB0ZXN0TG9ja0ZhaWxlZCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhPiBjID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4oZ2V0VGVtcE9iamVjdCgpKTsKICAgICBBU1NFUlQoYy0+bG9jaygpICE9IE5PX0VSUk9SKTsKIH0KIAogdm9pZCB0ZXN0TG9ja1VubG9ja1N1Y2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAgICAgc3A8SUNhbWVyYT4gYyA9IGludGVyZmFjZV9jYXN0PElDYW1lcmE+KGdldFRlbXBPYmplY3QoKSk7CiAgICAgQVNTRVJUKGMtPmxvY2soKSA9PSBOT19FUlJPUik7CiAgICAgQVNTRVJUKGMtPnVubG9jaygpID09IE5PX0VSUk9SKTsKIH0KIAogdm9pZCB0ZXN0TG9ja1N1Y2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAgICAgc3A8SUNhbWVyYT4gYyA9IGludGVyZmFjZV9jYXN0PElDYW1lcmE+KGdldFRlbXBPYmplY3QoKSk7CiAgICAgQVNTRVJUKGMtPmxvY2soKSA9PSBOT19FUlJPUik7CisgICAgYy0+ZGlzY29ubmVjdCgpOwogfQogCiAvLwpAQCAtNDk5LDExICs1MjQsMTEgQEAKICAgICB9CiB9CiAKLXZvaWQgdGVzdFJlY29ubmVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKK3ZvaWQgdGVzdFJlY29ubmVjdChpbnQgY2FtZXJhSWQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gUmVjb25uZWN0IHRvIHRoZSBzYW1lIGNsaWVudCAtLSBvay4KICAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgPT0gTk9fRVJST1IpOwpAQCAtNTE0LDEwICs1MzksMTAgQEAKICAgICBjYy0+YXNzZXJ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIE1DYW1lcmFDbGllbnQ6OkVRLCAwKTsKIH0KIAotdm9pZCB0ZXN0TG9ja1VubG9jaygpIHsKK3ZvaWQgdGVzdExvY2tVbmxvY2soaW50IGNhbWVyYUlkKSB7CiAgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKLSAgICBzcDxJQ2FtZXJhPiBjID0gY3MtPmNvbm5lY3QoY2MpOworICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYywgY2FtZXJhSWQpOwogICAgIEFTU0VSVChjICE9IDApOwogICAgIC8vIFdlIGNhbiBsb2NrIGFzIG1hbnkgdGltZXMgYXMgd2Ugd2FudC4KICAgICBBU1NFUlQoYy0+bG9jaygpID09IE5PX0VSUk9SKTsKQEAgLTUzMCwxNiArNTU1LDE1IEBACiAgICAgcnVuSW5Bbm90aGVyUHJvY2VzcygidGVzdExvY2tVbmxvY2tTdWNjZXNzIik7CiAgICAgLy8gVW5sb2NrIHRoZW4gbG9jayBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MgLS0gb2suCiAgICAgcnVuSW5Bbm90aGVyUHJvY2VzcygidGVzdExvY2tTdWNjZXNzIik7Ci0gICAgYy0+ZGlzY29ubmVjdCgpOwogICAgIGNsZWFyVGVtcE9iamVjdCgpOwogfQogCi12b2lkIHRlc3RSZWNvbm5lY3RGcm9tQW5vdGhlclByb2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7Cit2b2lkIHRlc3RSZWNvbm5lY3RGcm9tQW5vdGhlclByb2Nlc3MoaW50IGNhbWVyYUlkKSB7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gUmVjb25uZWN0IGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyAtLSBub3Qgb2suCiAgICAgcHV0VGVtcE9iamVjdChjLT5hc0JpbmRlcigpKTsKQEAgLTU0Nyw3ICs1NzEsNiBAQAogICAgIC8vIFVubG9jayB0aGVuIHJlY29ubmVjdCBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MgLS0gb2suCiAgICAgQVNTRVJUKGMtPnVubG9jaygpID09IE5PX0VSUk9SKTsKICAgICBydW5JbkFub3RoZXJQcm9jZXNzKCJ0ZXN0UmVjb25uZWN0U3VjY2VzcyIpOwotICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICBjbGVhclRlbXBPYmplY3QoKTsKIH0KIApAQCAtNTYwLDEwICs1ODMsMTEgQEAKIH0KIAogLy8gUnVuIGEgdGVzdCBjYXNlCi0jZGVmaW5lIFJVTihjbGFzc19uYW1lKSBkbyB7IFwKKyNkZWZpbmUgUlVOKGNsYXNzX25hbWUsIGNhbWVyYUlkKSBkbyB7IFwKICAgICB7IFwKICAgICAgICAgSU5GTygjY2xhc3NfbmFtZSk7IFwKICAgICAgICAgY2xhc3NfbmFtZSBpbnN0YW5jZTsgXAorICAgICAgICBpbnN0YW5jZS5pbml0KGNhbWVyYUlkKTsgXAogICAgICAgICBpbnN0YW5jZS5ydW4oKTsgXAogICAgIH0gXAogICAgIGZsdXNoQ29tbWFuZHMoKTsgXApAQCAtNTcxLDE5ICs1OTUsMjEgQEAKIAogLy8gQmFzZSB0ZXN0IGNhc2UgYWZ0ZXIgdGhlIHRoZSBjYW1lcmEgaXMgY29ubmVjdGVkLgogY2xhc3MgQWZ0ZXJDb25uZWN0IHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoaW50IGNhbWVyYUlkKSB7CisgICAgICAgIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgICAgICBjYyA9IG5ldyBNQ2FtZXJhQ2xpZW50KCk7CisgICAgICAgIGMgPSBjcy0+Y29ubmVjdChjYywgY2FtZXJhSWQpOworICAgICAgICBBU1NFUlQoYyAhPSAwKTsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3M7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2M7CiAgICAgc3A8SUNhbWVyYT4gYzsKIAotICAgIEFmdGVyQ29ubmVjdCgpIHsKLSAgICAgICAgY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7Ci0gICAgICAgIGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKLSAgICAgICAgYyA9IGNzLT5jb25uZWN0KGNjKTsKLSAgICAgICAgQVNTRVJUKGMgIT0gMCk7Ci0gICAgfQotCiAgICAgfkFmdGVyQ29ubmVjdCgpIHsKKyAgICAgICAgYy0+ZGlzY29ubmVjdCgpOwogICAgICAgICBjLmNsZWFyKCk7CiAgICAgICAgIGNjLmNsZWFyKCk7CiAgICAgICAgIGNzLmNsZWFyKCk7CkBAIC02MTIsMTkgKzYzOCwxNiBAQAogICAgICAgICBzdXJmYWNlLT53YWl0VW50aWwoMSwgMTAsIDApOyAvLyBuZWVkcyAxIHJlZ2lzdGVyQnVmZmVycyBhbmQgMTAgcG9zdEJ1ZmZlcgogICAgICAgICBzdXJmYWNlLT5jbGVhclN0YXQoKTsKIAotICAgICAgICBjLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIC8vIFRPRE86IENhbWVyYVNlcnZpY2UgY3Jhc2hlcyBmb3IgdGhpcy4gRml4IGl0LgotI2lmIDAKICAgICAgICAgc3A8TVN1cmZhY2U+IGFub3RoZXJfc3VyZmFjZSA9IG5ldyBNU3VyZmFjZSgpOwogICAgICAgICBjLT5zZXRQcmV2aWV3RGlzcGxheShhbm90aGVyX3N1cmZhY2UpOyAgLy8ganVzdCB0byBtYWtlIHN1cmUgdW5yZWdpc3RlckJ1ZmZlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNhbGxlZC4KICAgICAgICAgc3VyZmFjZS0+d2FpdFVudGlsKDAsIDAsIDEpOyAgLy8gbmVlZHMgdW5yZWdpc3RlckJ1ZmZlcnMKLSNlbmRpZgorCiAgICAgICAgIGNjLT5hc3NlcnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwgTUNhbWVyYUNsaWVudDo6RVEsIDApOwogICAgIH0KIH07CiAKLWNsYXNzIFRlc3RTdGFydFByZXZpZXdXaXRob3V0RGlzcGxheSA6IEFmdGVyQ29ubmVjdCB7CitjbGFzcyBUZXN0U3RhcnRQcmV2aWV3V2l0aG91dERpc3BsYXkgOiBwdWJsaWMgQWZ0ZXJDb25uZWN0IHsKIHB1YmxpYzoKICAgICB2b2lkIHJ1bigpIHsKICAgICAgICAgQVNTRVJUKGMtPnN0YXJ0UHJldmlldygpID09IE5PX0VSUk9SKTsKQEAgLTYzNiwxNSArNjU5LDE3IEBACiAKIC8vIEJhc2UgdGVzdCBjYXNlIGFmdGVyIHRoZSB0aGUgY2FtZXJhIGlzIGNvbm5lY3RlZCBhbmQgdGhlIHByZXZpZXcgaXMgc3RhcnRlZC4KIGNsYXNzIEFmdGVyU3RhcnRQcmV2aWV3IDogcHVibGljIEFmdGVyQ29ubmVjdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgc3A8TVN1cmZhY2U+IHN1cmZhY2U7Ci0KLSAgICBBZnRlclN0YXJ0UHJldmlldygpIHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoaW50IGNhbWVyYUlkKSB7CisgICAgICAgIEFmdGVyQ29ubmVjdDo6aW5pdChjYW1lcmFJZCk7CiAgICAgICAgIHN1cmZhY2UgPSBuZXcgTVN1cmZhY2UoKTsKICAgICAgICAgQVNTRVJUKGMtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpID09IE5PX0VSUk9SKTsKICAgICAgICAgQVNTRVJUKGMtPnN0YXJ0UHJldmlldygpID09IE5PX0VSUk9SKTsKICAgICB9CiAKK3Byb3RlY3RlZDoKKyAgICBzcDxNU3VyZmFjZT4gc3VyZmFjZTsKKwogICAgIH5BZnRlclN0YXJ0UHJldmlldygpIHsKICAgICAgICAgc3VyZmFjZS5jbGVhcigpOwogICAgIH0KQEAgLTY4MCw5ICs3MDUsNiBAQAogICAgICAgICBjYy0+d2FpdERhdGEoQ0FNRVJBX01TR19SQVdfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgY2MtPndhaXREYXRhKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwogICAgICAgICBjLT5zdG9wUHJldmlldygpOwotI2lmIDEgIC8vIFRPRE86IEl0IGNyYXNoZXMgaWYgd2UgZG9uJ3QgaGF2ZSB0aGlzLiBGaXggaXQuCi0gICAgICAgIHVzbGVlcCgxMDAwMDApOwotI2VuZGlmCiAgICAgICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgY2MtPmFzc2VydE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBNQ2FtZXJhQ2xpZW50OjpFUSwgMCk7CiAgICAgfQpAQCAtNjk3LDcgKzcxOSw2IEBACiAgICAgICAgICAgICBjYy0+d2FpdE5vdGlmeShDQU1FUkFfTVNHX1NIVVRURVIsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgICAgIGNjLT53YWl0RGF0YShDQU1FUkFfTVNHX1JBV19JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwogICAgICAgICAgICAgY2MtPndhaXREYXRhKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7ICAvLyAxMDBtcwogICAgICAgICB9CiAgICAgICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgY2MtPmFzc2VydE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBNQ2FtZXJhQ2xpZW50OjpFUSwgMCk7CkBAIC03MDgsMzYgKzcyOSw3MSBAQAogcHVibGljOgogICAgIHZvaWQgcnVuKCkgewogICAgICAgICBTdHJpbmc4IHBhcmFtX3N0ciA9IGMtPmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSU5GTyhwYXJhbV9zdHIpOworICAgICAgICBJTkZPKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwYXJhbV9zdHIpKTsKICAgICB9CiB9OwogCitzdGF0aWMgYm9vbCBnZXROZXh0U2l6ZShjb25zdCBjaGFyICoqcHRyUywgaW50ICp3LCBpbnQgKmgpIHsKKyAgICBjb25zdCBjaGFyICpzID0gKnB0clM7CisKKyAgICAvLyBza2lwIG92ZXIgJywnCisgICAgaWYgKCpzID09ICcsJykgcysrOworCisgICAgLy8gcmVtZW1iZXIgc3RhcnQgcG9zaXRpb24gaW4gcAorICAgIGNvbnN0IGNoYXIgKnAgPSBzOworICAgIHdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9ICd4JykgeworICAgICAgICBzKys7CisgICAgfQorICAgIGlmICgqcyA9PSAnXDAnKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBnZXQgdGhlIHdpZHRoCisgICAgKncgPSBhdG9pKHApOworCisgICAgLy8gc2tpcCBvdmVyICd4JworICAgIEFTU0VSVCgqcyA9PSAneCcpOworICAgIHAgPSBzICsgMTsKKyAgICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLCcpIHsKKyAgICAgICAgcysrOworICAgIH0KKworICAgIC8vIGdldCB0aGUgaGVpZ2h0CisgICAgKmggPSBhdG9pKHApOworICAgICpwdHJTID0gczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogY2xhc3MgVGVzdFBpY3R1cmVTaXplIDogcHVibGljIEFmdGVyU3RhcnRQcmV2aWV3IHsKIHB1YmxpYzoKICAgICB2b2lkIGNoZWNrT25lUGljdHVyZShpbnQgdywgaW50IGgpIHsKLSAgICAgICAgY29uc3QgZmxvYXQgcmF0ZSA9IDAuNTsgIC8vIGJ5dGUgcGVyIHBpeGVsIGxpbWl0CisgICAgICAgIGNvbnN0IGZsb2F0IHJhdGUgPSAwLjk7ICAvLyBieXRlIHBlciBwaXhlbCBsaW1pdAogICAgICAgICBpbnQgcGl4ZWxzID0gdyAqIGg7CiAKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbShjLT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICBwYXJhbS5zZXRQaWN0dXJlU2l6ZSh3LCBoKTsKKyAgICAgICAgLy8gZGlzYWJsZSB0aHVtYm5haWwgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgc2l6ZS4KKyAgICAgICAgcGFyYW0uc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9KUEVHX1RIVU1CTkFJTF9XSURUSCwgMCk7CisgICAgICAgIHBhcmFtLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfSlBFR19USFVNQk5BSUxfSEVJR0hULCAwKTsKICAgICAgICAgYy0+c2V0UGFyYW1ldGVycyhwYXJhbS5mbGF0dGVuKCkpOwogCiAgICAgICAgIGNjLT5jbGVhclN0YXQoKTsKICAgICAgICAgQVNTRVJUKGMtPnRha2VQaWN0dXJlKCkgPT0gTk9fRVJST1IpOwogICAgICAgICBjYy0+d2FpdERhdGEoQ0FNRVJBX01TR19SQVdfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKLSAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBNQ2FtZXJhQ2xpZW50OjpFUSwgcGl4ZWxzKjMvMik7CisgICAgICAgIC8vY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBNQ2FtZXJhQ2xpZW50OjpFUSwgcGl4ZWxzKjMvMik7CiAgICAgICAgIGNjLT53YWl0RGF0YShDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6TFQsCiAgICAgICAgICAgICAgICAgaW50KHBpeGVscyAqIHJhdGUpKTsKICAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6R1QsIDApOwogICAgICAgICBjYy0+YXNzZXJ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIE1DYW1lcmFDbGllbnQ6OkVRLCAwKTsKLSAgICAgICAgdXNsZWVwKDEwMDAwMCk7ICAvLyAxMDBtcwogICAgIH0KIAogICAgIHZvaWQgcnVuKCkgewotICAgICAgICBjaGVja09uZVBpY3R1cmUoMjA0OCwgMTUzNik7Ci0gICAgICAgIGNoZWNrT25lUGljdHVyZSgxNjAwLCAxMjAwKTsKLSAgICAgICAgY2hlY2tPbmVQaWN0dXJlKDEwMjQsIDc2OCk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW0oYy0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgaW50IHcsIGg7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBwYXJhbS5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTKTsKKyAgICAgICAgd2hpbGUgKGdldE5leHRTaXplKCZzLCAmdywgJmgpKSB7CisgICAgICAgICAgICBMT0dEKCJjaGVja2luZyBwaWN0dXJlIHNpemUgJWR4JWQiLCB3LCBoKTsKKyAgICAgICAgICAgIGNoZWNrT25lUGljdHVyZSh3LCBoKTsKKyAgICAgICAgfQogICAgIH0KIH07CiAKQEAgLTc0OSw2ICs4MDUsOCBAQAogCiAgICAgICAgIC8vIFRyeSBhbGwgZmxhZyBjb21iaW5hdGlvbnMuCiAgICAgICAgIGZvciAoaW50IHYgPSAwOyB2IDwgODsgdisrKSB7CisgICAgICAgICAgICBMT0dEKCJUZXN0UHJldmlld0NhbGxiYWNrRmxhZzogZmxhZz0lZCIsIHYpOworICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7IC8vIHNsZWVwIGEgd2hpbGUgdG8gY2xlYXIgdGhlIGluLWZsaWdodCBjYWxsYmFja3MuCiAgICAgICAgICAgICBjYy0+Y2xlYXJTdGF0KCk7CiAgICAgICAgICAgICBjLT5zZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKHYpOwogICAgICAgICAgICAgQVNTRVJUKGMtPnByZXZpZXdFbmFibGVkKCkgPT0gZmFsc2UpOwpAQCAtNzgxLDYgKzgzOSw3IEBACiAgICAgICAgIEFTU0VSVChjLT5yZWNvcmRpbmdFbmFibGVkKCkgPT0gdHJ1ZSk7CiAgICAgICAgIHNsZWVwKDIpOwogICAgICAgICBjLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgICAgIHVzbGVlcCgxMDAwMDApOyAvLyBzbGVlcCBhIHdoaWxlIHRvIGNsZWFyIHRoZSBpbi1mbGlnaHQgY2FsbGJhY2tzLgogICAgICAgICBjYy0+c2V0UmVsZWFzZXIoTlVMTCk7CiAgICAgICAgIGNjLT5hc3NlcnREYXRhKENBTUVSQV9NU0dfVklERU9fRlJBTUUsIE1DYW1lcmFDbGllbnQ6OkdFLCAxMCk7CiAgICAgfQpAQCAtODA2LDkgKzg2NSwxMyBAQAogICAgIH0KIAogICAgIHZvaWQgcnVuKCkgewotICAgICAgICBjaGVja09uZVBpY3R1cmUoNDgwLCAzMjApOwotICAgICAgICBjaGVja09uZVBpY3R1cmUoMzUyLCAyODgpOwotICAgICAgICBjaGVja09uZVBpY3R1cmUoMTc2LCAxNDQpOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtKGMtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgIGludCB3LCBoOworICAgICAgICBjb25zdCBjaGFyICpzID0gcGFyYW0uZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19TSVpFUyk7CisgICAgICAgIHdoaWxlIChnZXROZXh0U2l6ZSgmcywgJncsICZoKSkgeworICAgICAgICAgICAgTE9HRCgiY2hlY2tpbmcgcHJldmlldyBzaXplICVkeCVkIiwgdywgaCk7CisgICAgICAgICAgICBjaGVja09uZVBpY3R1cmUodywgaCk7CisgICAgICAgIH0KICAgICB9CiB9OwogCkBAIC04MjcsMjMgKzg5MCwzMCBAQAogICAgIElORk8oIkNhbWVyYVNlcnZpY2VUZXN0IHN0YXJ0Iik7CiAgICAgZ0V4ZWN1dGFibGUgPSBhcmd2WzBdOwogICAgIHJ1bkhvbGRlclNlcnZpY2UoKTsKKyAgICBpbnQgbiA9IGdldE51bWJlck9mQ2FtZXJhcygpOworICAgIElORk8oIiVkIENhbWVyYXMgYXZhaWxhYmxlIiwgbik7CiAKLSAgICB0ZXN0Q29ubmVjdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0QWxsb3dDb25uZWN0T25jZU9ubHkoKTsgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0UmVjb25uZWN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0TG9ja1VubG9jaygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0UmVjb25uZWN0RnJvbUFub3RoZXJQcm9jZXNzKCk7ICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgbjsgaWQrKykgeworICAgICAgICBJTkZPKCJUZXN0aW5nIGNhbWVyYSAlZCIsIGlkKTsKKyAgICAgICAgdGVzdENvbm5lY3QoaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdEFsbG93Q29ubmVjdE9uY2VPbmx5KGlkKTsgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdFJlY29ubmVjdChpZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdExvY2tVbmxvY2soaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdFJlY29ubmVjdEZyb21Bbm90aGVyUHJvY2VzcyhpZCk7ICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKIAotICAgIFJVTihUZXN0U2V0UHJldmlld0Rpc3BsYXkpOwotICAgIFJVTihUZXN0U3RhcnRQcmV2aWV3KTsKLSAgICBSVU4oVGVzdFN0YXJ0UHJldmlld1dpdGhvdXREaXNwbGF5KTsKLSAgICBSVU4oVGVzdEF1dG9Gb2N1cyk7Ci0gICAgUlVOKFRlc3RTdG9wUHJldmlldyk7Ci0gICAgUlVOKFRlc3RUYWtlUGljdHVyZSk7Ci0gICAgUlVOKFRlc3RUYWtlTXVsdGlwbGVQaWN0dXJlcyk7Ci0gICAgUlVOKFRlc3RHZXRQYXJhbWV0ZXJzKTsKLSAgICBSVU4oVGVzdFBpY3R1cmVTaXplKTsKLSAgICBSVU4oVGVzdFByZXZpZXdDYWxsYmFja0ZsYWcpOwotICAgIFJVTihUZXN0UmVjb3JkaW5nKTsKLSAgICBSVU4oVGVzdFByZXZpZXdTaXplKTsKKyAgICAgICAgUlVOKFRlc3RTZXRQcmV2aWV3RGlzcGxheSwgaWQpOworICAgICAgICBSVU4oVGVzdFN0YXJ0UHJldmlldywgaWQpOworICAgICAgICBSVU4oVGVzdFN0YXJ0UHJldmlld1dpdGhvdXREaXNwbGF5LCBpZCk7CisgICAgICAgIFJVTihUZXN0QXV0b0ZvY3VzLCBpZCk7CisgICAgICAgIFJVTihUZXN0U3RvcFByZXZpZXcsIGlkKTsKKyAgICAgICAgUlVOKFRlc3RUYWtlUGljdHVyZSwgaWQpOworICAgICAgICBSVU4oVGVzdFRha2VNdWx0aXBsZVBpY3R1cmVzLCBpZCk7CisgICAgICAgIFJVTihUZXN0R2V0UGFyYW1ldGVycywgaWQpOworICAgICAgICBSVU4oVGVzdFBpY3R1cmVTaXplLCBpZCk7CisgICAgICAgIFJVTihUZXN0UHJldmlld0NhbGxiYWNrRmxhZywgaWQpOworICAgICAgICBSVU4oVGVzdFJlY29yZGluZywgaWQpOworICAgICAgICBSVU4oVGVzdFByZXZpZXdTaXplLCBpZCk7CisgICAgfQorCisgICAgSU5GTygiQ2FtZXJhU2VydmljZVRlc3QgZmluaXNoZWQiKTsKIH0K